From c1420c19f4f55f4803791fea7b091cd8fe59d9b3 Mon Sep 17 00:00:00 2001 From: yamaken93 Date: Sun, 26 Sep 2021 20:56:23 -0300 Subject: [PATCH 1/3] better registerLuaEvent code no use after delete anymore in action:register and moveevent:register no memory leak/waste of memory since we borrow/steal the vector from the original event making the future copies copy empty vector --- src/actions.cpp | 60 +++++++++++--------- src/actions.h | 21 ++----- src/luascript.cpp | 12 ---- src/movement.cpp | 138 +++++++++++++++++++--------------------------- src/movement.h | 28 +++------- 5 files changed, 104 insertions(+), 155 deletions(-) diff --git a/src/actions.cpp b/src/actions.cpp index e5d45c90d7..0bab1364a9 100644 --- a/src/actions.cpp +++ b/src/actions.cpp @@ -211,37 +211,45 @@ bool Actions::registerEvent(Event_ptr event, const pugi::xml_node& node) bool Actions::registerLuaEvent(Action* event) { Action_ptr action{ event }; - if (!action->getItemIdRange().empty()) { - const auto& range = action->getItemIdRange(); - for (auto id : range) { - auto result = useItemMap.emplace(id, *action); - if (!result.second) { - std::cout << "[Warning - Actions::registerLuaEvent] Duplicate registered item with id: " << id << " in range from id: " << range.front() << ", to id: " << range.back() << std::endl; - } + + auto itemIdRange = action->borrowItemIdRange(); + auto uniqueIdRange = action->borrowUniqueIdRange(); + auto actionIdRange = action->borrowActionIdRange(); + + bool success = false; + + for (auto itemId : itemIdRange) { + auto result = useItemMap.emplace(itemId, std::move(*action)); + if (!result.second) { + std::cout << "[Warning - Actions::registerLuaEvent] Duplicate registered item with id: " << itemId << " in range from id: " << itemIdRange.at(0) << ", to id: " << itemIdRange.at(itemIdRange.size() - 1) << std::endl; + continue; } - return true; - } else if (!action->getUniqueIdRange().empty()) { - const auto& range = action->getUniqueIdRange(); - for (auto id : range) { - auto result = uniqueItemMap.emplace(id, *action); - if (!result.second) { - std::cout << "[Warning - Actions::registerLuaEvent] Duplicate registered item with uid: " << id << " in range from uid: " << range.front() << ", to uid: " << range.back() << std::endl; - } + success = true; + } + + for (auto uniqueId : uniqueIdRange) { + auto result = uniqueItemMap.emplace(uniqueId, std::move(*action)); + if (!result.second) { + std::cout << "[Warning - Actions::registerLuaEvent] Duplicate registered item with uid: " << uniqueId << " in range from uid: " << uniqueIdRange.at(0) << ", to uid: " << uniqueIdRange.at(uniqueIdRange.size() - 1) << std::endl; + continue; } - return true; - } else if (!action->getActionIdRange().empty()) { - const auto& range = action->getActionIdRange(); - for (auto id : range) { - auto result = actionItemMap.emplace(id, *action); - if (!result.second) { - std::cout << "[Warning - Actions::registerLuaEvent] Duplicate registered item with aid: " << id << " in range from aid: " << range.front() << ", to aid: " << range.back() << std::endl; - } + success = true; + } + + for (auto actionId : actionIdRange) { + auto result = actionItemMap.emplace(actionId, std::move(*action)); + if (!result.second) { + std::cout << "[Warning - Actions::registerLuaEvent] Duplicate registered item with aid: " << actionId << " in range from aid: " << actionIdRange.at(0) << ", to aid: " << actionIdRange.at(actionIdRange.size() - 1) << std::endl; + continue; } - return true; + success = true; } - std::cout << "[Warning - Actions::registerLuaEvent] There is no id / aid / uid set for this event" << std::endl; - return false; + if (!success) { + std::cout << "[Warning - Actions::registerLuaEvent] There is no id / aid / uid set for this event" << std::endl; + } + + return success; } ReturnValue Actions::canUse(const Player* player, const Position& pos) diff --git a/src/actions.h b/src/actions.h index 618a7ea8eb..4012338caa 100644 --- a/src/actions.h +++ b/src/actions.h @@ -61,31 +61,22 @@ class Action : public Event checkFloor = v; } - void clearItemIdRange() { - return ids.clear(); - } - const std::vector& getItemIdRange() const { - return ids; + std::vector borrowItemIdRange() { + return std::move(ids); } void addItemId(uint16_t id) { ids.emplace_back(id); } - void clearUniqueIdRange() { - return uids.clear(); - } - const std::vector& getUniqueIdRange() const { - return uids; + std::vector borrowUniqueIdRange() { + return std::move(uids); } void addUniqueId(uint16_t id) { uids.emplace_back(id); } - void clearActionIdRange() { - return aids.clear(); - } - const std::vector& getActionIdRange() const { - return aids; + std::vector borrowActionIdRange() { + return std::move(aids); } void addActionId(uint16_t id) { aids.emplace_back(id); diff --git a/src/luascript.cpp b/src/luascript.cpp index 184015d2b5..9b52781278 100644 --- a/src/luascript.cpp +++ b/src/luascript.cpp @@ -16180,9 +16180,6 @@ int LuaScriptInterface::luaActionRegister(lua_State* L) return 1; } pushBoolean(L, g_actions->registerLuaEvent(action)); - action->clearActionIdRange(); - action->clearItemIdRange(); - action->clearUniqueIdRange(); } else { lua_pushnil(L); } @@ -16539,20 +16536,11 @@ int LuaScriptInterface::luaMoveEventRegister(lua_State* L) // moveevent:register() MoveEvent* moveevent = getUserdata(L, 1); if (moveevent) { - if ((moveevent->getEventType() == MOVE_EVENT_EQUIP || moveevent->getEventType() == MOVE_EVENT_DEEQUIP) && moveevent->getSlot() == SLOTP_WHEREEVER) { - uint32_t id = moveevent->getItemIdRange().at(0); - ItemType& it = Item::items.getItemType(id); - moveevent->setSlot(it.slotPosition); - } if (!moveevent->isScripted()) { pushBoolean(L, g_moveEvents->registerLuaFunction(moveevent)); return 1; } pushBoolean(L, g_moveEvents->registerLuaEvent(moveevent)); - moveevent->clearItemIdRange(); - moveevent->clearActionIdRange(); - moveevent->clearUniqueIdRange(); - moveevent->clearPosList(); } else { lua_pushnil(L); } diff --git a/src/movement.cpp b/src/movement.cpp index 1181d019a0..78562b977d 100644 --- a/src/movement.cpp +++ b/src/movement.cpp @@ -221,34 +221,28 @@ bool MoveEvents::registerLuaFunction(MoveEvent* event) } } - if (moveEvent->getItemIdRange().size() > 0) { - if (moveEvent->getItemIdRange().size() == 1) { - uint32_t id = moveEvent->getItemIdRange().at(0); - addEvent(*moveEvent, id, itemIdMap); - if (moveEvent->getEventType() == MOVE_EVENT_EQUIP) { - ItemType& it = Item::items.getItemType(id); - it.wieldInfo = moveEvent->getWieldInfo(); - it.minReqLevel = moveEvent->getReqLevel(); - it.minReqMagicLevel = moveEvent->getReqMagLv(); - it.vocationString = moveEvent->getVocationString(); - } - } else { - uint32_t iterId = 0; - while (++iterId < moveEvent->getItemIdRange().size()) { - if (moveEvent->getEventType() == MOVE_EVENT_EQUIP) { - ItemType& it = Item::items.getItemType(moveEvent->getItemIdRange().at(iterId)); - it.wieldInfo = moveEvent->getWieldInfo(); - it.minReqLevel = moveEvent->getReqLevel(); - it.minReqMagicLevel = moveEvent->getReqMagLv(); - it.vocationString = moveEvent->getVocationString(); - } - addEvent(*moveEvent, moveEvent->getItemIdRange().at(iterId), itemIdMap); - } + bool success = false; + auto itemIdRange = moveEvent->borrowItemIdRange(); + + if ((eventType == MOVE_EVENT_EQUIP || eventType == MOVE_EVENT_DEEQUIP) && moveEvent->getSlot() == SLOTP_WHEREEVER) { + uint32_t id = itemIdRange.at(0); + ItemType& it = Item::items.getItemType(id); + moveEvent->setSlot(it.slotPosition); + } + + for (auto itemId : itemIdRange) { + success = true; + if (moveEvent->getEventType() == MOVE_EVENT_EQUIP) { + ItemType& it = Item::items.getItemType(itemId); + it.wieldInfo = moveEvent->getWieldInfo(); + it.minReqLevel = moveEvent->getReqLevel(); + it.minReqMagicLevel = moveEvent->getReqMagLv(); + it.vocationString = moveEvent->getVocationString(); } - } else { - return false; + addEvent(std::move(*moveEvent), itemId, itemIdMap); } - return true; + + return success; } bool MoveEvents::registerLuaEvent(MoveEvent* event) @@ -270,66 +264,46 @@ bool MoveEvents::registerLuaEvent(MoveEvent* event) } } } + auto itemIdRange = moveEvent->borrowItemIdRange(); + auto actionIdRange = moveEvent->borrowActionIdRange(); + auto uniqueIdRange = moveEvent->borrowUniqueIdRange(); + auto posList = moveEvent->borrowPosList(); + bool success = false; - if (moveEvent->getItemIdRange().size() > 0) { - if (moveEvent->getItemIdRange().size() == 1) { - uint32_t id = moveEvent->getItemIdRange().at(0); - addEvent(*moveEvent, id, itemIdMap); - if (moveEvent->getEventType() == MOVE_EVENT_EQUIP) { - ItemType& it = Item::items.getItemType(id); - it.wieldInfo = moveEvent->getWieldInfo(); - it.minReqLevel = moveEvent->getReqLevel(); - it.minReqMagicLevel = moveEvent->getReqMagLv(); - it.vocationString = moveEvent->getVocationString(); - } - } else { - auto v = moveEvent->getItemIdRange(); - for (auto i = v.begin(); i != v.end(); i++) { - if (moveEvent->getEventType() == MOVE_EVENT_EQUIP) { - ItemType& it = Item::items.getItemType(*i); - it.wieldInfo = moveEvent->getWieldInfo(); - it.minReqLevel = moveEvent->getReqLevel(); - it.minReqMagicLevel = moveEvent->getReqMagLv(); - it.vocationString = moveEvent->getVocationString(); - } - addEvent(*moveEvent, *i, itemIdMap); - } - } - } else if (moveEvent->getActionIdRange().size() > 0) { - if (moveEvent->getActionIdRange().size() == 1) { - int32_t id = moveEvent->getActionIdRange().at(0); - addEvent(*moveEvent, id, actionIdMap); - } else { - auto v = moveEvent->getActionIdRange(); - for (auto i = v.begin(); i != v.end(); i++) { - addEvent(*moveEvent, *i, actionIdMap); - } - } - } else if (moveEvent->getUniqueIdRange().size() > 0) { - if (moveEvent->getUniqueIdRange().size() == 1) { - int32_t id = moveEvent->getUniqueIdRange().at(0); - addEvent(*moveEvent, id, uniqueIdMap); - } else { - auto v = moveEvent->getUniqueIdRange(); - for (auto i = v.begin(); i != v.end(); i++) { - addEvent(*moveEvent, *i, uniqueIdMap); - } - } - } else if (moveEvent->getPosList().size() > 0) { - if (moveEvent->getPosList().size() == 1) { - Position pos = moveEvent->getPosList().at(0); - addEvent(*moveEvent, pos, positionMap); - } else { - auto v = moveEvent->getPosList(); - for (auto i = v.begin(); i != v.end(); i++) { - addEvent(*moveEvent, *i, positionMap); - } + if ((eventType == MOVE_EVENT_EQUIP || eventType == MOVE_EVENT_DEEQUIP) && moveEvent->getSlot() == SLOTP_WHEREEVER) { + uint32_t id = itemIdRange.at(0); + ItemType& it = Item::items.getItemType(id); + moveEvent->setSlot(it.slotPosition); + } + + for (auto itemId : itemIdRange) { + success = true; + if (moveEvent->getEventType() == MOVE_EVENT_EQUIP) { + ItemType& it = Item::items.getItemType(itemId); + it.wieldInfo = moveEvent->getWieldInfo(); + it.minReqLevel = moveEvent->getReqLevel(); + it.minReqMagicLevel = moveEvent->getReqMagLv(); + it.vocationString = moveEvent->getVocationString(); } - } else { - return false; + addEvent(std::move(*moveEvent), itemId, itemIdMap); } - return true; + for (auto actionId : actionIdRange) { + success = true; + addEvent(std::move(*moveEvent), actionId, actionIdMap); + } + + for (auto uniqueId : uniqueIdRange) { + success = true; + addEvent(std::move(*moveEvent), uniqueId, uniqueIdMap); + } + + for (auto pos : posList) { + success = true; + addEvent(std::move(*moveEvent), pos, positionMap); + } + + return success; } void MoveEvents::addEvent(MoveEvent moveEvent, int32_t id, MoveListMap& map) diff --git a/src/movement.h b/src/movement.h index 551d238422..981cde0d74 100644 --- a/src/movement.h +++ b/src/movement.h @@ -160,38 +160,26 @@ class MoveEvent final : public Event void setTileItem(bool b) { tileItem = b; } - void clearItemIdRange() { - return itemIdRange.clear(); - } - const std::vector& getItemIdRange() const { - return itemIdRange; + std::vector borrowItemIdRange() { + return std::move(itemIdRange); } void addItemId(uint32_t id) { itemIdRange.emplace_back(id); } - void clearActionIdRange() { - return actionIdRange.clear(); - } - const std::vector& getActionIdRange() const { - return actionIdRange; + std::vector borrowActionIdRange() { + return std::move(actionIdRange); } void addActionId(uint32_t id) { actionIdRange.emplace_back(id); } - void clearUniqueIdRange() { - return uniqueIdRange.clear(); - } - const std::vector& getUniqueIdRange() const { - return uniqueIdRange; + std::vector borrowUniqueIdRange() { + return std::move(uniqueIdRange); } void addUniqueId(uint32_t id) { uniqueIdRange.emplace_back(id); } - void clearPosList() { - return posList.clear(); - } - const std::vector& getPosList() const { - return posList; + std::vector borrowPosList() { + return std::move(posList); } void addPosList(Position pos) { posList.emplace_back(pos); From e5ee0900f1d572f684b49fcd79041fd77e189ec4 Mon Sep 17 00:00:00 2001 From: Artur Knopik Date: Tue, 15 Feb 2022 18:25:43 +0100 Subject: [PATCH 2/3] fix mlvl update after wearing items --- src/movement.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/movement.cpp b/src/movement.cpp index 78562b977d..e35e00f3c5 100644 --- a/src/movement.cpp +++ b/src/movement.cpp @@ -804,6 +804,7 @@ ReturnValue MoveEvent::EquipItem(MoveEvent* moveEvent, Player* player, Item* ite if (needUpdateStats) { player->sendStats(); + player->sendSkills(); } return RETURNVALUE_NOERROR; @@ -892,6 +893,7 @@ ReturnValue MoveEvent::DeEquipItem(MoveEvent*, Player* player, Item* item, slots if (needUpdateStats) { player->sendStats(); + player->sendSkills(); } return RETURNVALUE_NOERROR; From 6e7d156f7ddf7336a260b0d109a9a0945d9519f3 Mon Sep 17 00:00:00 2001 From: Artur Knopik Date: Tue, 15 Feb 2022 18:28:23 +0100 Subject: [PATCH 3/3] Revert "better registerLuaEvent code" This reverts commit c1420c19f4f55f4803791fea7b091cd8fe59d9b3. --- src/actions.cpp | 60 +++++++++----------- src/actions.h | 21 +++++-- src/luascript.cpp | 12 ++++ src/movement.cpp | 138 +++++++++++++++++++++++++++------------------- src/movement.h | 28 +++++++--- 5 files changed, 155 insertions(+), 104 deletions(-) diff --git a/src/actions.cpp b/src/actions.cpp index 0bab1364a9..e5d45c90d7 100644 --- a/src/actions.cpp +++ b/src/actions.cpp @@ -211,45 +211,37 @@ bool Actions::registerEvent(Event_ptr event, const pugi::xml_node& node) bool Actions::registerLuaEvent(Action* event) { Action_ptr action{ event }; - - auto itemIdRange = action->borrowItemIdRange(); - auto uniqueIdRange = action->borrowUniqueIdRange(); - auto actionIdRange = action->borrowActionIdRange(); - - bool success = false; - - for (auto itemId : itemIdRange) { - auto result = useItemMap.emplace(itemId, std::move(*action)); - if (!result.second) { - std::cout << "[Warning - Actions::registerLuaEvent] Duplicate registered item with id: " << itemId << " in range from id: " << itemIdRange.at(0) << ", to id: " << itemIdRange.at(itemIdRange.size() - 1) << std::endl; - continue; + if (!action->getItemIdRange().empty()) { + const auto& range = action->getItemIdRange(); + for (auto id : range) { + auto result = useItemMap.emplace(id, *action); + if (!result.second) { + std::cout << "[Warning - Actions::registerLuaEvent] Duplicate registered item with id: " << id << " in range from id: " << range.front() << ", to id: " << range.back() << std::endl; + } } - success = true; - } - - for (auto uniqueId : uniqueIdRange) { - auto result = uniqueItemMap.emplace(uniqueId, std::move(*action)); - if (!result.second) { - std::cout << "[Warning - Actions::registerLuaEvent] Duplicate registered item with uid: " << uniqueId << " in range from uid: " << uniqueIdRange.at(0) << ", to uid: " << uniqueIdRange.at(uniqueIdRange.size() - 1) << std::endl; - continue; + return true; + } else if (!action->getUniqueIdRange().empty()) { + const auto& range = action->getUniqueIdRange(); + for (auto id : range) { + auto result = uniqueItemMap.emplace(id, *action); + if (!result.second) { + std::cout << "[Warning - Actions::registerLuaEvent] Duplicate registered item with uid: " << id << " in range from uid: " << range.front() << ", to uid: " << range.back() << std::endl; + } } - success = true; - } - - for (auto actionId : actionIdRange) { - auto result = actionItemMap.emplace(actionId, std::move(*action)); - if (!result.second) { - std::cout << "[Warning - Actions::registerLuaEvent] Duplicate registered item with aid: " << actionId << " in range from aid: " << actionIdRange.at(0) << ", to aid: " << actionIdRange.at(actionIdRange.size() - 1) << std::endl; - continue; + return true; + } else if (!action->getActionIdRange().empty()) { + const auto& range = action->getActionIdRange(); + for (auto id : range) { + auto result = actionItemMap.emplace(id, *action); + if (!result.second) { + std::cout << "[Warning - Actions::registerLuaEvent] Duplicate registered item with aid: " << id << " in range from aid: " << range.front() << ", to aid: " << range.back() << std::endl; + } } - success = true; - } - - if (!success) { - std::cout << "[Warning - Actions::registerLuaEvent] There is no id / aid / uid set for this event" << std::endl; + return true; } - return success; + std::cout << "[Warning - Actions::registerLuaEvent] There is no id / aid / uid set for this event" << std::endl; + return false; } ReturnValue Actions::canUse(const Player* player, const Position& pos) diff --git a/src/actions.h b/src/actions.h index 4012338caa..618a7ea8eb 100644 --- a/src/actions.h +++ b/src/actions.h @@ -61,22 +61,31 @@ class Action : public Event checkFloor = v; } - std::vector borrowItemIdRange() { - return std::move(ids); + void clearItemIdRange() { + return ids.clear(); + } + const std::vector& getItemIdRange() const { + return ids; } void addItemId(uint16_t id) { ids.emplace_back(id); } - std::vector borrowUniqueIdRange() { - return std::move(uids); + void clearUniqueIdRange() { + return uids.clear(); + } + const std::vector& getUniqueIdRange() const { + return uids; } void addUniqueId(uint16_t id) { uids.emplace_back(id); } - std::vector borrowActionIdRange() { - return std::move(aids); + void clearActionIdRange() { + return aids.clear(); + } + const std::vector& getActionIdRange() const { + return aids; } void addActionId(uint16_t id) { aids.emplace_back(id); diff --git a/src/luascript.cpp b/src/luascript.cpp index 9b52781278..184015d2b5 100644 --- a/src/luascript.cpp +++ b/src/luascript.cpp @@ -16180,6 +16180,9 @@ int LuaScriptInterface::luaActionRegister(lua_State* L) return 1; } pushBoolean(L, g_actions->registerLuaEvent(action)); + action->clearActionIdRange(); + action->clearItemIdRange(); + action->clearUniqueIdRange(); } else { lua_pushnil(L); } @@ -16536,11 +16539,20 @@ int LuaScriptInterface::luaMoveEventRegister(lua_State* L) // moveevent:register() MoveEvent* moveevent = getUserdata(L, 1); if (moveevent) { + if ((moveevent->getEventType() == MOVE_EVENT_EQUIP || moveevent->getEventType() == MOVE_EVENT_DEEQUIP) && moveevent->getSlot() == SLOTP_WHEREEVER) { + uint32_t id = moveevent->getItemIdRange().at(0); + ItemType& it = Item::items.getItemType(id); + moveevent->setSlot(it.slotPosition); + } if (!moveevent->isScripted()) { pushBoolean(L, g_moveEvents->registerLuaFunction(moveevent)); return 1; } pushBoolean(L, g_moveEvents->registerLuaEvent(moveevent)); + moveevent->clearItemIdRange(); + moveevent->clearActionIdRange(); + moveevent->clearUniqueIdRange(); + moveevent->clearPosList(); } else { lua_pushnil(L); } diff --git a/src/movement.cpp b/src/movement.cpp index e35e00f3c5..cc82f95116 100644 --- a/src/movement.cpp +++ b/src/movement.cpp @@ -221,28 +221,34 @@ bool MoveEvents::registerLuaFunction(MoveEvent* event) } } - bool success = false; - auto itemIdRange = moveEvent->borrowItemIdRange(); - - if ((eventType == MOVE_EVENT_EQUIP || eventType == MOVE_EVENT_DEEQUIP) && moveEvent->getSlot() == SLOTP_WHEREEVER) { - uint32_t id = itemIdRange.at(0); - ItemType& it = Item::items.getItemType(id); - moveEvent->setSlot(it.slotPosition); - } - - for (auto itemId : itemIdRange) { - success = true; - if (moveEvent->getEventType() == MOVE_EVENT_EQUIP) { - ItemType& it = Item::items.getItemType(itemId); - it.wieldInfo = moveEvent->getWieldInfo(); - it.minReqLevel = moveEvent->getReqLevel(); - it.minReqMagicLevel = moveEvent->getReqMagLv(); - it.vocationString = moveEvent->getVocationString(); + if (moveEvent->getItemIdRange().size() > 0) { + if (moveEvent->getItemIdRange().size() == 1) { + uint32_t id = moveEvent->getItemIdRange().at(0); + addEvent(*moveEvent, id, itemIdMap); + if (moveEvent->getEventType() == MOVE_EVENT_EQUIP) { + ItemType& it = Item::items.getItemType(id); + it.wieldInfo = moveEvent->getWieldInfo(); + it.minReqLevel = moveEvent->getReqLevel(); + it.minReqMagicLevel = moveEvent->getReqMagLv(); + it.vocationString = moveEvent->getVocationString(); + } + } else { + uint32_t iterId = 0; + while (++iterId < moveEvent->getItemIdRange().size()) { + if (moveEvent->getEventType() == MOVE_EVENT_EQUIP) { + ItemType& it = Item::items.getItemType(moveEvent->getItemIdRange().at(iterId)); + it.wieldInfo = moveEvent->getWieldInfo(); + it.minReqLevel = moveEvent->getReqLevel(); + it.minReqMagicLevel = moveEvent->getReqMagLv(); + it.vocationString = moveEvent->getVocationString(); + } + addEvent(*moveEvent, moveEvent->getItemIdRange().at(iterId), itemIdMap); + } } - addEvent(std::move(*moveEvent), itemId, itemIdMap); + } else { + return false; } - - return success; + return true; } bool MoveEvents::registerLuaEvent(MoveEvent* event) @@ -264,46 +270,66 @@ bool MoveEvents::registerLuaEvent(MoveEvent* event) } } } - auto itemIdRange = moveEvent->borrowItemIdRange(); - auto actionIdRange = moveEvent->borrowActionIdRange(); - auto uniqueIdRange = moveEvent->borrowUniqueIdRange(); - auto posList = moveEvent->borrowPosList(); - bool success = false; - if ((eventType == MOVE_EVENT_EQUIP || eventType == MOVE_EVENT_DEEQUIP) && moveEvent->getSlot() == SLOTP_WHEREEVER) { - uint32_t id = itemIdRange.at(0); - ItemType& it = Item::items.getItemType(id); - moveEvent->setSlot(it.slotPosition); - } - - for (auto itemId : itemIdRange) { - success = true; - if (moveEvent->getEventType() == MOVE_EVENT_EQUIP) { - ItemType& it = Item::items.getItemType(itemId); - it.wieldInfo = moveEvent->getWieldInfo(); - it.minReqLevel = moveEvent->getReqLevel(); - it.minReqMagicLevel = moveEvent->getReqMagLv(); - it.vocationString = moveEvent->getVocationString(); + if (moveEvent->getItemIdRange().size() > 0) { + if (moveEvent->getItemIdRange().size() == 1) { + uint32_t id = moveEvent->getItemIdRange().at(0); + addEvent(*moveEvent, id, itemIdMap); + if (moveEvent->getEventType() == MOVE_EVENT_EQUIP) { + ItemType& it = Item::items.getItemType(id); + it.wieldInfo = moveEvent->getWieldInfo(); + it.minReqLevel = moveEvent->getReqLevel(); + it.minReqMagicLevel = moveEvent->getReqMagLv(); + it.vocationString = moveEvent->getVocationString(); + } + } else { + auto v = moveEvent->getItemIdRange(); + for (auto i = v.begin(); i != v.end(); i++) { + if (moveEvent->getEventType() == MOVE_EVENT_EQUIP) { + ItemType& it = Item::items.getItemType(*i); + it.wieldInfo = moveEvent->getWieldInfo(); + it.minReqLevel = moveEvent->getReqLevel(); + it.minReqMagicLevel = moveEvent->getReqMagLv(); + it.vocationString = moveEvent->getVocationString(); + } + addEvent(*moveEvent, *i, itemIdMap); + } } - addEvent(std::move(*moveEvent), itemId, itemIdMap); - } - - for (auto actionId : actionIdRange) { - success = true; - addEvent(std::move(*moveEvent), actionId, actionIdMap); - } - - for (auto uniqueId : uniqueIdRange) { - success = true; - addEvent(std::move(*moveEvent), uniqueId, uniqueIdMap); - } - - for (auto pos : posList) { - success = true; - addEvent(std::move(*moveEvent), pos, positionMap); + } else if (moveEvent->getActionIdRange().size() > 0) { + if (moveEvent->getActionIdRange().size() == 1) { + int32_t id = moveEvent->getActionIdRange().at(0); + addEvent(*moveEvent, id, actionIdMap); + } else { + auto v = moveEvent->getActionIdRange(); + for (auto i = v.begin(); i != v.end(); i++) { + addEvent(*moveEvent, *i, actionIdMap); + } + } + } else if (moveEvent->getUniqueIdRange().size() > 0) { + if (moveEvent->getUniqueIdRange().size() == 1) { + int32_t id = moveEvent->getUniqueIdRange().at(0); + addEvent(*moveEvent, id, uniqueIdMap); + } else { + auto v = moveEvent->getUniqueIdRange(); + for (auto i = v.begin(); i != v.end(); i++) { + addEvent(*moveEvent, *i, uniqueIdMap); + } + } + } else if (moveEvent->getPosList().size() > 0) { + if (moveEvent->getPosList().size() == 1) { + Position pos = moveEvent->getPosList().at(0); + addEvent(*moveEvent, pos, positionMap); + } else { + auto v = moveEvent->getPosList(); + for (auto i = v.begin(); i != v.end(); i++) { + addEvent(*moveEvent, *i, positionMap); + } + } + } else { + return false; } - return success; + return true; } void MoveEvents::addEvent(MoveEvent moveEvent, int32_t id, MoveListMap& map) diff --git a/src/movement.h b/src/movement.h index 981cde0d74..551d238422 100644 --- a/src/movement.h +++ b/src/movement.h @@ -160,26 +160,38 @@ class MoveEvent final : public Event void setTileItem(bool b) { tileItem = b; } - std::vector borrowItemIdRange() { - return std::move(itemIdRange); + void clearItemIdRange() { + return itemIdRange.clear(); + } + const std::vector& getItemIdRange() const { + return itemIdRange; } void addItemId(uint32_t id) { itemIdRange.emplace_back(id); } - std::vector borrowActionIdRange() { - return std::move(actionIdRange); + void clearActionIdRange() { + return actionIdRange.clear(); + } + const std::vector& getActionIdRange() const { + return actionIdRange; } void addActionId(uint32_t id) { actionIdRange.emplace_back(id); } - std::vector borrowUniqueIdRange() { - return std::move(uniqueIdRange); + void clearUniqueIdRange() { + return uniqueIdRange.clear(); + } + const std::vector& getUniqueIdRange() const { + return uniqueIdRange; } void addUniqueId(uint32_t id) { uniqueIdRange.emplace_back(id); } - std::vector borrowPosList() { - return std::move(posList); + void clearPosList() { + return posList.clear(); + } + const std::vector& getPosList() const { + return posList; } void addPosList(Position pos) { posList.emplace_back(pos);