summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/net/barterhandler.h4
-rw-r--r--src/net/eathena/barterhandler.cpp80
-rw-r--r--src/net/eathena/barterhandler.h2
-rw-r--r--src/net/eathena/packetsout.inc4
-rw-r--r--src/net/tmwa/barterhandler.cpp4
-rw-r--r--src/net/tmwa/barterhandler.h2
6 files changed, 96 insertions, 0 deletions
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<ShopItem*> &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<ShopItem*> &items) const
+{
+ if (packetVersionMain < 20190116 &&
+ packetVersionRe < 20190116 &&
+ packetVersionZero < 20181226)
+ {
+ return;
+ }
+ int cnt = 0;
+ const int pairSize = 10 + itemIdLen;
+
+ FOR_EACH (STD_VECTOR<ShopItem*>::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<ShopItem*>::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<ShopItem*> &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<ShopItem*> &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<ShopItem*> &items) const override final;
};
} // namespace TmwAthena