Skip to content

Commit

Permalink
better registerLuaEvent code
Browse files Browse the repository at this point in the history
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
  • Loading branch information
yamaken93 authored and ArturKnopik committed Feb 15, 2022
1 parent b61accf commit c1420c1
Show file tree
Hide file tree
Showing 5 changed files with 104 additions and 155 deletions.
60 changes: 34 additions & 26 deletions src/actions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
21 changes: 6 additions & 15 deletions src/actions.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,31 +61,22 @@ class Action : public Event
checkFloor = v;
}

void clearItemIdRange() {
return ids.clear();
}
const std::vector<uint16_t>& getItemIdRange() const {
return ids;
std::vector<uint16_t> borrowItemIdRange() {
return std::move(ids);
}
void addItemId(uint16_t id) {
ids.emplace_back(id);
}

void clearUniqueIdRange() {
return uids.clear();
}
const std::vector<uint16_t>& getUniqueIdRange() const {
return uids;
std::vector<uint16_t> borrowUniqueIdRange() {
return std::move(uids);
}
void addUniqueId(uint16_t id) {
uids.emplace_back(id);
}

void clearActionIdRange() {
return aids.clear();
}
const std::vector<uint16_t>& getActionIdRange() const {
return aids;
std::vector<uint16_t> borrowActionIdRange() {
return std::move(aids);
}
void addActionId(uint16_t id) {
aids.emplace_back(id);
Expand Down
12 changes: 0 additions & 12 deletions src/luascript.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -16539,20 +16536,11 @@ int LuaScriptInterface::luaMoveEventRegister(lua_State* L)
// moveevent:register()
MoveEvent* moveevent = getUserdata<MoveEvent>(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);
}
Expand Down
138 changes: 56 additions & 82 deletions src/movement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand Down
28 changes: 8 additions & 20 deletions src/movement.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,38 +160,26 @@ class MoveEvent final : public Event
void setTileItem(bool b) {
tileItem = b;
}
void clearItemIdRange() {
return itemIdRange.clear();
}
const std::vector<uint32_t>& getItemIdRange() const {
return itemIdRange;
std::vector<uint32_t> borrowItemIdRange() {
return std::move(itemIdRange);
}
void addItemId(uint32_t id) {
itemIdRange.emplace_back(id);
}
void clearActionIdRange() {
return actionIdRange.clear();
}
const std::vector<uint32_t>& getActionIdRange() const {
return actionIdRange;
std::vector<uint32_t> borrowActionIdRange() {
return std::move(actionIdRange);
}
void addActionId(uint32_t id) {
actionIdRange.emplace_back(id);
}
void clearUniqueIdRange() {
return uniqueIdRange.clear();
}
const std::vector<uint32_t>& getUniqueIdRange() const {
return uniqueIdRange;
std::vector<uint32_t> borrowUniqueIdRange() {
return std::move(uniqueIdRange);
}
void addUniqueId(uint32_t id) {
uniqueIdRange.emplace_back(id);
}
void clearPosList() {
return posList.clear();
}
const std::vector<Position>& getPosList() const {
return posList;
std::vector<Position> borrowPosList() {
return std::move(posList);
}
void addPosList(Position pos) {
posList.emplace_back(pos);
Expand Down

0 comments on commit c1420c1

Please sign in to comment.