From 1eb806af58a5b36c17ccbeebc6a7fd943d98ed45 Mon Sep 17 00:00:00 2001 From: Gent Date: Wed, 30 Sep 2020 13:29:56 -0400 Subject: [PATCH 1/3] Add item stacking logic --- src/ItemManager.cpp | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/ItemManager.cpp b/src/ItemManager.cpp index 96cd8e6..bec937e 100644 --- a/src/ItemManager.cpp +++ b/src/ItemManager.cpp @@ -98,10 +98,38 @@ void ItemManager::itemMoveHandler(CNSocket* sock, CNPacketData* data) { resp.ToSlotItem = *toItem; resp.FromSlotItem = *fromItem; - // swap items in session - sItemBase temp = *toItem; - *toItem = *fromItem; - *fromItem = temp; + // swap/stack items in session + Item* itemDat = getItemData(toItem->iID, toItem->iType); + if (itemDat->stackSize > 1 && itemDat == getItemData(fromItem->iID, fromItem->iType)) { + // items are stackable and identical, so run stacking logic + + toItem->iOpt += fromItem->iOpt; // sum counts + fromItem->iOpt = 0; // deplete from item + if (toItem->iOpt > itemDat->stackSize) { + // handle overflow + fromItem->iOpt += (toItem->iOpt - itemDat->stackSize); // add overflow to fromItem + toItem->iOpt = itemDat->stackSize; // set toItem count to max + } + + if (fromItem->iOpt == 0) { // from item count depleted + // delete item + fromItem->iID = 0; + fromItem->iType = 0; + fromItem->iTimeLimit = 0; + } + + resp.iFromSlotNum = itemmove->iFromSlotNum; + resp.iToSlotNum = itemmove->iToSlotNum; + resp.FromSlotItem = *fromItem; + resp.ToSlotItem = *toItem; + } else { + // items not stackable; just swap them + sItemBase temp = *toItem; + *toItem = *fromItem; + *fromItem = temp; + resp.iFromSlotNum = itemmove->iToSlotNum; + resp.iToSlotNum = itemmove->iFromSlotNum; + } // send equip change to viewable players if (itemmove->eFrom == (int)SlotType::EQUIP || itemmove->eTo == (int)SlotType::EQUIP) { @@ -130,9 +158,8 @@ void ItemManager::itemMoveHandler(CNSocket* sock, CNPacketData* data) { // send response resp.eTo = itemmove->eFrom; - resp.iToSlotNum = itemmove->iFromSlotNum; resp.eFrom = itemmove->eTo; - resp.iFromSlotNum = itemmove->iToSlotNum; + sock->sendPacket((void*)&resp, P_FE2CL_PC_ITEM_MOVE_SUCC, sizeof(sP_FE2CL_PC_ITEM_MOVE_SUCC)); } From 941e986ee11ce977fe25a9d49313f692b806076a Mon Sep 17 00:00:00 2001 From: Gent Date: Wed, 30 Sep 2020 13:30:19 -0400 Subject: [PATCH 2/3] Fix incorrectly set item cost --- src/NPCManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NPCManager.cpp b/src/NPCManager.cpp index e766f0d..b78ea49 100644 --- a/src/NPCManager.cpp +++ b/src/NPCManager.cpp @@ -193,7 +193,7 @@ void NPCManager::npcVendorBuy(CNSocket* sock, CNPacketData* data) { return; } - int itemCost = item->sellPrice * (item->stackSize > 1 ? req->Item.iOpt : 1); + int itemCost = item->buyPrice * (item->stackSize > 1 ? req->Item.iOpt : 1); int slot = ItemManager::findFreeSlot(plr); if (itemCost > plr->money || slot == -1) { // NOTE: VENDOR_ITEM_BUY_FAIL is not actually handled client-side. From 2c831ee1155f7d4e34592f1535d3402e2e0b5e9a Mon Sep 17 00:00:00 2001 From: Gent Date: Wed, 30 Sep 2020 16:23:46 -0400 Subject: [PATCH 3/3] Match maxed stack behavior to OG --- src/ItemManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ItemManager.cpp b/src/ItemManager.cpp index bec937e..3a8ffc5 100644 --- a/src/ItemManager.cpp +++ b/src/ItemManager.cpp @@ -100,8 +100,8 @@ void ItemManager::itemMoveHandler(CNSocket* sock, CNPacketData* data) { // swap/stack items in session Item* itemDat = getItemData(toItem->iID, toItem->iType); - if (itemDat->stackSize > 1 && itemDat == getItemData(fromItem->iID, fromItem->iType)) { - // items are stackable and identical, so run stacking logic + if (itemDat->stackSize > 1 && itemDat == getItemData(fromItem->iID, fromItem->iType) && fromItem->iOpt < itemDat->stackSize && toItem->iOpt < itemDat->stackSize) { + // items are stackable, identical, and not maxed, so run stacking logic toItem->iOpt += fromItem->iOpt; // sum counts fromItem->iOpt = 0; // deplete from item