From 90705929b29445a4569ff5c9ad13b7efcb304e0a Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Wed, 9 Aug 2017 21:31:02 +0300 Subject: Add different use actions for items. Can be used from chat or from custom item menu from items.xml --- src/net/eathena/inventoryhandler.cpp | 23 +++++++++++++++++++++++ src/net/eathena/inventoryhandler.h | 3 +++ src/net/eathena/packetsout.inc | 2 ++ src/net/inventoryhandler.h | 3 +++ src/net/tmwa/inventoryhandler.cpp | 12 ++++++++++++ src/net/tmwa/inventoryhandler.h | 3 +++ 6 files changed, 46 insertions(+) (limited to 'src/net') diff --git a/src/net/eathena/inventoryhandler.cpp b/src/net/eathena/inventoryhandler.cpp index f59dc4c6c..40ae67d5d 100644 --- a/src/net/eathena/inventoryhandler.cpp +++ b/src/net/eathena/inventoryhandler.cpp @@ -38,6 +38,7 @@ #include "debug.h" extern int packetVersion; +extern int serverVersion; // this conversion from bit corrupted LOOK_* to EquipSlot // for how it corrupted, see BeingRecv::processBeingChangeLookContinue @@ -117,6 +118,28 @@ void InventoryHandler::useItem(const Item *const item) const outMsg.writeInt32(item->getId(), "unused"); } +void InventoryHandler::useItem(const Item *const item, + const int16_t useType) const +{ + if (item == nullptr) + return; + + if (serverVersion >= 19) + { + createOutPacket(CMSG_PLAYER_INVENTORY_USE2); + outMsg.writeInt16(CAST_S16( + item->getInvIndex() + INVENTORY_OFFSET), "index"); + outMsg.writeInt16(useType, "use type"); + } + else + { + createOutPacket(CMSG_PLAYER_INVENTORY_USE); + outMsg.writeInt16(CAST_S16( + item->getInvIndex() + INVENTORY_OFFSET), "index"); + outMsg.writeInt32(item->getId(), "unused"); + } +} + void InventoryHandler::dropItem(const Item *const item, const int amount) const { if (item == nullptr) diff --git a/src/net/eathena/inventoryhandler.h b/src/net/eathena/inventoryhandler.h index 3a804fb3d..79155ddaa 100644 --- a/src/net/eathena/inventoryhandler.h +++ b/src/net/eathena/inventoryhandler.h @@ -43,6 +43,9 @@ class InventoryHandler final : public Ea::InventoryHandler void useItem(const Item *const item) const override final; + void useItem(const Item *const item, + const int16_t useType) const override final; + void dropItem(const Item *const item, const int amount) const override final; diff --git a/src/net/eathena/packetsout.inc b/src/net/eathena/packetsout.inc index c1ad6ac4f..92c986755 100644 --- a/src/net/eathena/packetsout.inc +++ b/src/net/eathena/packetsout.inc @@ -259,6 +259,8 @@ packet(CMSG_SET_STATUS, 0x0b0e, 0, nullptr); packet(CMSG_ONLINE_LIST, 0x0b0f, 0, nullptr); +packet(CMSG_PLAYER_INVENTORY_USE2, 0x0b26, 6, nullptr); + #ifndef PACKETS_UPDATE // 0 packet(CMSG_ALCHEMIST_RANKS, 0x0000, 0, nullptr); diff --git a/src/net/inventoryhandler.h b/src/net/inventoryhandler.h index a93837939..aaa4d6f67 100644 --- a/src/net/inventoryhandler.h +++ b/src/net/inventoryhandler.h @@ -51,6 +51,9 @@ class InventoryHandler notfinal virtual void useItem(const Item *const item) const = 0; + virtual void useItem(const Item *const item, + const int16_t useType) const = 0; + virtual void dropItem(const Item *const item, const int amount) const = 0; diff --git a/src/net/tmwa/inventoryhandler.cpp b/src/net/tmwa/inventoryhandler.cpp index e87b748c7..7afbf746e 100644 --- a/src/net/tmwa/inventoryhandler.cpp +++ b/src/net/tmwa/inventoryhandler.cpp @@ -98,6 +98,18 @@ void InventoryHandler::useItem(const Item *const item) const outMsg.writeInt32(item->getId(), "item id"); } +void InventoryHandler::useItem(const Item *const item, + const int16_t useType A_UNUSED) const +{ + if (item == nullptr) + return; + + createOutPacket(CMSG_PLAYER_INVENTORY_USE); + outMsg.writeInt16(CAST_S16( + item->getInvIndex() + INVENTORY_OFFSET), "index"); + outMsg.writeInt32(item->getId(), "item id"); +} + void InventoryHandler::dropItem(const Item *const item, const int amount) const { if (item == nullptr) diff --git a/src/net/tmwa/inventoryhandler.h b/src/net/tmwa/inventoryhandler.h index 302c52ca0..5bf67f9f1 100644 --- a/src/net/tmwa/inventoryhandler.h +++ b/src/net/tmwa/inventoryhandler.h @@ -43,6 +43,9 @@ class InventoryHandler final : public Ea::InventoryHandler void useItem(const Item *const item) const override final; + void useItem(const Item *const item, + const int16_t useType) const override final; + void dropItem(const Item *const item, const int amount) const override final; -- cgit v1.2.3-60-g2f50