From a976fef2b4fae53ff419b5b0bb4e06e3b400366c Mon Sep 17 00:00:00 2001 From: Gent Date: Mon, 14 Sep 2020 01:52:15 -0400 Subject: [PATCH] Implement vendor stack logic --- src/NPCManager.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/NPCManager.cpp b/src/NPCManager.cpp index 9d421e2..3ca649a 100644 --- a/src/NPCManager.cpp +++ b/src/NPCManager.cpp @@ -41,7 +41,7 @@ void NPCManager::npcVendorBuy(CNSocket* sock, CNPacketData* data) { return; } - int itemCost = ItemManager::getItemData(req->Item.iID, req->Item.iType).buyPrice; + int itemCost = ItemManager::getItemData(req->Item.iID, req->Item.iType).buyPrice * req->Item.iOpt; int slot = ItemManager::findFreeSlot(plr); if (itemCost > plr->money || slot == -1) { // NOTE: VENDOR_ITEM_BUY_FAIL is not actually handled client-side. @@ -103,11 +103,17 @@ void NPCManager::npcVendorSell(CNSocket* sock, CNPacketData* data) { // increment taros plr->money = plr->money + sellValue; - // empty the slot; probably needs to be changed for stacks - item->iID = 0; - item->iOpt = 0; - item->iType = 0; - item->iTimeLimit = 0; + // modify item + if (plr->Inven[req->iInvenSlotNum].iOpt - req->iItemCnt > 0) { // selling part of a stack + item->iOpt -= req->iItemCnt; + original.iOpt = req->iItemCnt; + } + else { // selling entire slot + item->iID = 0; + item->iOpt = 0; + item->iType = 0; + item->iTimeLimit = 0; + } // response parameters resp.iInvenSlotNum = req->iInvenSlotNum; @@ -134,7 +140,7 @@ void NPCManager::npcVendorRestore(CNSocket* sock, CNPacketData* data) { return; } - int itemCost = ItemManager::getItemData(req->Item.iID, req->Item.iType).sellPrice; // sell price is used on rebuy + int itemCost = ItemManager::getItemData(req->Item.iID, req->Item.iType).sellPrice * req->Item.iOpt; // sell price is used on rebuy int slot = ItemManager::findFreeSlot(plr); if (itemCost > plr->money || slot == -1) { // NOTE: VENDOR_ITEM_BUY_FAIL is not actually handled client-side.