From 5f82658c8da4f687320b98e79e8508c17c07d543 Mon Sep 17 00:00:00 2001 From: Kamil Date: Mon, 21 Dec 2020 23:01:21 +0100 Subject: [PATCH] adjusted item codes logic to handle multiple items per code --- src/ChatManager.cpp | 56 ++++++++++++++++++++++++++------------------- src/ItemManager.cpp | 2 +- src/ItemManager.hpp | 2 +- src/TableData.cpp | 9 ++++++-- 4 files changed, 41 insertions(+), 28 deletions(-) diff --git a/src/ChatManager.cpp b/src/ChatManager.cpp index 71aaf54..e7388fd 100644 --- a/src/ChatManager.cpp +++ b/src/ChatManager.cpp @@ -719,7 +719,7 @@ void unhideCommand(std::string full, std::vector& args, CNSocket* s void redeemCommand(std::string full, std::vector& args, CNSocket* sock) { if (args.size() < 2) { - ChatManager::sendServerMessage(sock, "/redeem: no code specified"); + ChatManager::sendServerMessage(sock, "/redeem: No code specified"); return; } @@ -730,34 +730,42 @@ void redeemCommand(std::string full, std::vector& args, CNSocket* s } Player* plr = PlayerManager::getPlayer(sock); - int slotNum = ItemManager::findFreeSlot(plr); + int itemCount = ItemManager::CodeItems[code].size(); + int slots[4]; - // no space - if (slotNum == -1) { - ChatManager::sendServerMessage(sock, "/redeem: Inventory full"); - return; + for (int i = 0; i < itemCount; i++) { + slots[i] = ItemManager::findFreeSlot(plr); + if (slots[i] == -1) { + ChatManager::sendServerMessage(sock, "/redeem: Not enough space in inventory"); + + // delete any temp items we might have set + for (int j = 0; j < i; j++) { + plr->Inven[slots[j]] = { 0, 0, 0, 0 }; // empty + } + return; + } + + plr->Inven[slots[i]] = { 999, 999, 999, 0 }; // temp item; overwritten later } + + for (int i = 0; i < itemCount; i++) { + std::pair item = ItemManager::CodeItems[code][i]; + INITSTRUCT(sP_FE2CL_REP_PC_GIVE_ITEM_SUCC, resp); - std::pair item = ItemManager::CodeItems[code]; - INITSTRUCT(sP_FE2CL_REP_PC_GIVE_ITEM_SUCC, resp); + resp.eIL = 1; + resp.iSlotNum = slots[i]; + resp.Item.iID = item.first; + resp.Item.iType = item.second; + // I think it is safe? :eyes + resp.Item.iOpt = 1; - resp.eIL = 1; - resp.iSlotNum = slotNum; - // just in case it's a vehicle - if (item.second == 10) { - // set time limit: current time + 7days - resp.Item.iTimeLimit = getTimestamp() + 604800; + // save serverside + plr->Inven[resp.iSlotNum] = resp.Item; + + sock->sendPacket((void*)&resp, P_FE2CL_REP_PC_GIVE_ITEM_SUCC, sizeof(sP_FE2CL_REP_PC_GIVE_ITEM_SUCC)); } - resp.Item.iID = item.first; - resp.Item.iType = item.second; - // I think it is safe? :eyes - resp.Item.iOpt = 1; - - // save serverside - plr->Inven[resp.iSlotNum] = resp.Item; - - sock->sendPacket((void*)&resp, P_FE2CL_REP_PC_GIVE_ITEM_SUCC, sizeof(sP_FE2CL_REP_PC_GIVE_ITEM_SUCC)); - ChatManager::sendServerMessage(sock, "You have redeemed a code item"); + std::string msg = itemCount == 1 ? "You have redeemed a code item" : "You have redeemed code items"; + ChatManager::sendServerMessage(sock, msg); } void ChatManager::init() { diff --git a/src/ItemManager.cpp b/src/ItemManager.cpp index 7c89dfc..dd12d18 100644 --- a/src/ItemManager.cpp +++ b/src/ItemManager.cpp @@ -16,7 +16,7 @@ std::map> ItemManager::RarityRatios; std::map ItemManager::Crates; // pair Itemset, Rarity -> vector of pointers (map iterators) to records in ItemData std::map, std::vector, ItemManager::Item>::iterator>> ItemManager::CrateItems; -std::map> ItemManager::CodeItems; +std::map>> ItemManager::CodeItems; #ifdef ACADEMY std::map ItemManager::NanoCapsules; // crate id -> nano id diff --git a/src/ItemManager.hpp b/src/ItemManager.hpp index 90a2dff..a5a4588 100644 --- a/src/ItemManager.hpp +++ b/src/ItemManager.hpp @@ -34,7 +34,7 @@ namespace ItemManager { // pair -> vector of pointers (map iterators) to records in ItemData (it looks a lot scarier than it is) extern std::map, std::vector, Item>::iterator>> CrateItems; - extern std::map> CodeItems; // code -> + extern std::map>> CodeItems; // code -> vector of void init(); diff --git a/src/TableData.cpp b/src/TableData.cpp index 88c3751..d4449de 100644 --- a/src/TableData.cpp +++ b/src/TableData.cpp @@ -578,11 +578,16 @@ void TableData::loadDrops() { ItemManager::NanoCapsules[(int)capsule["Crate"]] = (int)capsule["Nano"]; } #endif - nlohmann::json codes = dropData["Codes"]; + nlohmann::json codes = dropData["CodeItems"]; for (nlohmann::json::iterator _code = codes.begin(); _code != codes.end(); _code++) { auto code = _code.value(); + std::string codeStr = code["Code"]; std::pair item = std::make_pair((int)code["Id"], (int)code["Type"]); - ItemManager::CodeItems[code["Code"]] = item; + + if (ItemManager::CodeItems.find(codeStr) == ItemManager::CodeItems.end()) + ItemManager::CodeItems[codeStr] = std::vector>(); + + ItemManager::CodeItems[codeStr].push_back(item); } std::cout << "[INFO] Loaded " << ItemManager::Crates.size() << " Crates containing "