From c332163b2f465f51b6a15648125f655a19ec1021 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sat, 26 Jan 2019 04:22:02 +0300 Subject: Add icomplete packet CMSG_NPC_BARTER_BUY 0x0b0f --- src/net/barterhandler.h | 4 ++ src/net/eathena/barterhandler.cpp | 80 +++++++++++++++++++++++++++++++++++++++ src/net/eathena/barterhandler.h | 2 + src/net/eathena/packetsout.inc | 4 ++ src/net/tmwa/barterhandler.cpp | 4 ++ src/net/tmwa/barterhandler.h | 2 + 6 files changed, 96 insertions(+) diff --git a/src/net/barterhandler.h b/src/net/barterhandler.h index d15e68377..b3a40ba1a 100644 --- a/src/net/barterhandler.h +++ b/src/net/barterhandler.h @@ -23,6 +23,8 @@ #include "localconsts.h" +#include "utils/vector.h" + class ShopItem; namespace Net @@ -40,6 +42,8 @@ class BarterHandler notfinal { } virtual void close() const = 0; + + virtual void buyItems(const STD_VECTOR &items) const = 0; }; } // namespace Net diff --git a/src/net/eathena/barterhandler.cpp b/src/net/eathena/barterhandler.cpp index 7ce0c959f..d647df019 100644 --- a/src/net/eathena/barterhandler.cpp +++ b/src/net/eathena/barterhandler.cpp @@ -24,11 +24,16 @@ #include "net/eathena/messageout.h" #include "net/eathena/protocolout.h" +#include "utils/foreach.h" + +#include "resources/item/shopitem.h" + #include "debug.h" extern int packetVersionMain; extern int packetVersionRe; extern int packetVersionZero; +extern int itemIdLen; namespace EAthena { @@ -57,4 +62,79 @@ void BarterHandler::close() const createOutPacket(CMSG_NPC_BARTER_CLOSE); } +void BarterHandler::buyItems(const STD_VECTOR &items) const +{ + if (packetVersionMain < 20190116 && + packetVersionRe < 20190116 && + packetVersionZero < 20181226) + { + return; + } + int cnt = 0; + const int pairSize = 10 + itemIdLen; + + FOR_EACH (STD_VECTOR::const_iterator, it, items) + { + const ShopItem *const item = *it; + const int usedQuantity = item->getUsedQuantity(); + const ItemTypeT type = item->getType(); + if (usedQuantity == 0) + continue; + if (type == ItemType::Weapon || + type == ItemType::Armor || + type == ItemType::PetEgg || + type == ItemType::PetArmor) + { + cnt += item->getUsedQuantity(); + } + else + { + cnt ++; + } + } + + if (cnt > 100) + return; + + createOutPacket(CMSG_NPC_MARKET_BUY); + outMsg.writeInt16(CAST_S16(4 + pairSize * cnt), "len"); + FOR_EACH (STD_VECTOR::const_iterator, it, items) + { + ShopItem *const item = *it; + const int usedQuantity = item->getUsedQuantity(); + if (usedQuantity == 0) + continue; + item->increaseQuantity(usedQuantity); + item->increaseUsedQuantity(-usedQuantity); + item->update(); + const ItemTypeT type = item->getType(); + if (type == ItemType::Weapon || + type == ItemType::Armor || + type == ItemType::PetEgg || + type == ItemType::PetArmor) + { + for (int f = 0; f < usedQuantity; f ++) + { + outMsg.writeItemId(item->getId(), + "item id"); + outMsg.writeInt32(CAST_S16(1), "amount"); + // +++ need use player inventory index + outMsg.writeInt16(0, "inv index"); + outMsg.writeInt32(item->getCurrentInvIndex(), + "inv index"); + } + } + else + { + outMsg.writeItemId(item->getId(), + "item id"); + outMsg.writeInt32(CAST_S16(usedQuantity), "amount"); + // +++ need use player inventory index + outMsg.writeInt16(0, "inv index"); + outMsg.writeInt32(item->getCurrentInvIndex(), + "inv index"); + } + } +} + } // namespace EAthena diff --git a/src/net/eathena/barterhandler.h b/src/net/eathena/barterhandler.h index 5ee29101a..6d0253af0 100644 --- a/src/net/eathena/barterhandler.h +++ b/src/net/eathena/barterhandler.h @@ -36,6 +36,8 @@ class BarterHandler final : public Net::BarterHandler ~BarterHandler() override final; void close() const override final; + + void buyItems(const STD_VECTOR &items) const override final; }; } // namespace EAthena diff --git a/src/net/eathena/packetsout.inc b/src/net/eathena/packetsout.inc index 7bb87d36d..e18283736 100644 --- a/src/net/eathena/packetsout.inc +++ b/src/net/eathena/packetsout.inc @@ -353,6 +353,7 @@ packet(CMSG_SKILL_USE_BEING_START, 0x0000, 0, nullptr); packet(CMSG_SKILL_USE_BEING_STOP, 0x0000, 0, nullptr); packet(CMSG_NPC_BARTER_CLOSE, 0x0000, 0, nullptr); packet(CMSG_CAMERA_INFO, 0x0000, 0, nullptr); +packet(CMSG_NPC_BARTER_BUY, 0x0000, 0, nullptr); #else // 20040713 if (packetVersion >= 20040713) @@ -1556,18 +1557,21 @@ if (packetVersionMain >= 20181121) if (packetVersionZero >= 20181226) { packet(CMSG_NPC_BARTER_CLOSE, 0x0b12, 2, clif->pNPCBarterClosed); + packet(CMSG_NPC_BARTER_BUY, 0x0b0f, -1, clif->pNPCBarterPurchase); } // 20190116 main if (packetVersionMain >= 20190116) { packet(CMSG_NPC_BARTER_CLOSE, 0x0b12, 2, clif->pNPCBarterClosed); + packet(CMSG_NPC_BARTER_BUY, 0x0b0f, -1, clif->pNPCBarterPurchase); } // 20190116 re if (packetVersionRe >= 20190116) { packet(CMSG_NPC_BARTER_CLOSE, 0x0b12, 2, clif->pNPCBarterClosed); + packet(CMSG_NPC_BARTER_BUY, 0x0b0f, -1, clif->pNPCBarterPurchase); } #endif diff --git a/src/net/tmwa/barterhandler.cpp b/src/net/tmwa/barterhandler.cpp index 04fb20de3..1b6fec40c 100644 --- a/src/net/tmwa/barterhandler.cpp +++ b/src/net/tmwa/barterhandler.cpp @@ -40,4 +40,8 @@ void BarterHandler::close() const { } +void BarterHandler::buyItems(const STD_VECTOR &items A_UNUSED) const +{ +} + } // namespace TmwAthena diff --git a/src/net/tmwa/barterhandler.h b/src/net/tmwa/barterhandler.h index 359e4ec72..342eefa8b 100644 --- a/src/net/tmwa/barterhandler.h +++ b/src/net/tmwa/barterhandler.h @@ -35,6 +35,8 @@ class BarterHandler final : public Net::BarterHandler ~BarterHandler() override final; void close() const override final; + + void buyItems(const STD_VECTOR &items) const override final; }; } // namespace TmwAthena -- cgit v1.2.3-60-g2f50