summaryrefslogtreecommitdiff
path: root/src/net
diff options
context:
space:
mode:
authorJared Adams <jaxad0127@gmail.com>2010-08-15 21:28:10 -0600
committerJared Adams <jaxad0127@gmail.com>2010-08-16 13:19:09 -0600
commitd8d9232a67a03548b827bdb0515fe7a620a488f8 (patch)
treed6e0644f99e0ff89f9b320c0b479ba5a4e398125 /src/net
parenta6c2b90c2dabac18ad8052d948bc540406b3a613 (diff)
downloadMana-d8d9232a67a03548b827bdb0515fe7a620a488f8.tar.gz
Mana-d8d9232a67a03548b827bdb0515fe7a620a488f8.tar.bz2
Mana-d8d9232a67a03548b827bdb0515fe7a620a488f8.tar.xz
Mana-d8d9232a67a03548b827bdb0515fe7a620a488f8.zip
Move more to the event system
Most of Net::InventoryHandler is now done through events. The ActorSpriteManager was also replaced by events. A few odds and ends were taken care of too. Reviewed-by: Bertram
Diffstat (limited to 'src/net')
-rw-r--r--src/net/inventoryhandler.h21
-rw-r--r--src/net/manaserv/inventoryhandler.cpp152
-rw-r--r--src/net/manaserv/inventoryhandler.h23
-rw-r--r--src/net/tmwa/inventoryhandler.cpp141
-rw-r--r--src/net/tmwa/inventoryhandler.h23
-rw-r--r--src/net/tmwa/tradehandler.cpp2
6 files changed, 165 insertions, 197 deletions
diff --git a/src/net/inventoryhandler.h b/src/net/inventoryhandler.h
index 91257d3b..93b56a40 100644
--- a/src/net/inventoryhandler.h
+++ b/src/net/inventoryhandler.h
@@ -34,29 +34,8 @@ class InventoryHandler
public:
virtual ~InventoryHandler() {}
- virtual void equipItem(const Item *item) = 0;
-
- virtual void unequipItem(const Item *item) = 0;
-
- virtual void useItem(const Item *item) = 0;
-
- virtual void dropItem(const Item *item, int amount) = 0;
-
virtual bool canSplit(const Item *item) = 0;
- virtual void splitItem(const Item *item, int amount) = 0;
-
- virtual void moveItem(int oldIndex, int newIndex) = 0;
-
- virtual void openStorage(int type) = 0;
-
- virtual void closeStorage(int type) = 0;
-
- //void changeCart() = 0;
-
- virtual void moveItem(int source, int slot, int amount,
- int destination) = 0;
-
// TODO: fix/remove me
virtual size_t getSize(int type) const = 0;
};
diff --git a/src/net/manaserv/inventoryhandler.cpp b/src/net/manaserv/inventoryhandler.cpp
index 8622627e..28de9c1e 100644
--- a/src/net/manaserv/inventoryhandler.cpp
+++ b/src/net/manaserv/inventoryhandler.cpp
@@ -50,6 +50,8 @@ InventoryHandler::InventoryHandler()
};
handledMessages = _messages;
inventoryHandler = this;
+
+ listen("Item");
}
void InventoryHandler::handleMessage(Net::MessageIn &msg)
@@ -86,37 +88,87 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg)
}
}
-void InventoryHandler::equipItem(const Item *item)
-{
- MessageOut msg(PGMSG_EQUIP);
- msg.writeInt8(item->getInvIndex());
- gameServerConnection->send(msg);
-}
-
-void InventoryHandler::unequipItem(const Item *item)
-{
- MessageOut msg(PGMSG_UNEQUIP);
- msg.writeInt8(item->getInvIndex());
- gameServerConnection->send(msg);
-
- // Tidy equipment directly to avoid weapon still shown bug, for instance
- int equipSlot = item->getInvIndex();
- mEquips.setEquipment(equipSlot, 0);
-}
-
-void InventoryHandler::useItem(const Item *item)
+void InventoryHandler::event(const std::string &channel,
+ const Mana::Event &event)
{
- MessageOut msg(PGMSG_USE_ITEM);
- msg.writeInt8(item->getInvIndex());
- gameServerConnection->send(msg);
-}
+ if (channel == "Item")
+ {
+ Item *item = event.getItem("item");
+
+ if (!item)
+ return;
+
+ int index = item->getInvIndex();
+
+ if (event.getName() == "doEquip")
+ {
+ MessageOut msg(PGMSG_EQUIP);
+ msg.writeInt8(index);
+ gameServerConnection->send(msg);
+ }
+ else if (event.getName() == "doUnequip")
+ {
+ MessageOut msg(PGMSG_UNEQUIP);
+ msg.writeInt8(index);
+ gameServerConnection->send(msg);
+
+ // Tidy equipment directly to avoid weapon still shown bug, for instance
+ mEquips.setEquipment(index, 0);
+ }
+ else if (event.getName() == "doUse")
+ {
+ MessageOut msg(PGMSG_USE_ITEM);
+ msg.writeInt8(index);
+ gameServerConnection->send(msg);
+ }
+ else if (event.getName() == "doDrop")
+ {
+ int amount = event.getInt("amount", 1);
+
+ MessageOut msg(PGMSG_DROP);
+ msg.writeInt8(index);
+ msg.writeInt8(amount);
+ gameServerConnection->send(msg);
+ }
+ else if (event.getName() == "doSplit")
+ {
+ int amount = event.getInt("amount", 1);
+
+ int newIndex = PlayerInfo::getInventory()->getFreeSlot();
+ if (newIndex > Inventory::NO_SLOT_INDEX)
+ {
+ MessageOut msg(PGMSG_MOVE_ITEM);
+ msg.writeInt8(index);
+ msg.writeInt8(newIndex);
+ msg.writeInt8(amount);
+ gameServerConnection->send(msg);
+ }
+ }
+ else if (event.getName() == "doMove")
+ {
+ int newIndex = event.getInt("newIndex", -1);
+
+ if (newIndex >= 0)
+ {
+ if (index == newIndex)
+ return;
+
+ MessageOut msg(PGMSG_MOVE_ITEM);
+ msg.writeInt8(index);
+ msg.writeInt8(newIndex);
+ msg.writeInt8(item->getQuantity());
+ gameServerConnection->send(msg);
+ }
+ else
+ {
+ /*int source = event.getInt("source");
+ int destination = event.getInt("destination");
+ int amount = event.getInt("amount", 1);*/
-void InventoryHandler::dropItem(const Item *item, int amount)
-{
- MessageOut msg(PGMSG_DROP);
- msg.writeInt8(item->getInvIndex());
- msg.writeInt8(amount);
- gameServerConnection->send(msg);
+ // TODO
+ }
+ }
+ }
}
bool InventoryHandler::canSplit(const Item *item)
@@ -124,48 +176,6 @@ bool InventoryHandler::canSplit(const Item *item)
return item && !item->isEquipment() && item->getQuantity() > 1;
}
-void InventoryHandler::splitItem(const Item *item, int amount)
-{
- int newIndex = PlayerInfo::getInventory()->getFreeSlot();
- if (newIndex > Inventory::NO_SLOT_INDEX)
- {
- MessageOut msg(PGMSG_MOVE_ITEM);
- msg.writeInt8(item->getInvIndex());
- msg.writeInt8(newIndex);
- msg.writeInt8(amount);
- gameServerConnection->send(msg);
- }
-}
-
-void InventoryHandler::moveItem(int oldIndex, int newIndex)
-{
- if (oldIndex == newIndex)
- return;
-
- MessageOut msg(PGMSG_MOVE_ITEM);
- msg.writeInt8(oldIndex);
- msg.writeInt8(newIndex);
- msg.writeInt8(PlayerInfo::getInventory()->getItem(oldIndex)
- ->getQuantity());
- gameServerConnection->send(msg);
-}
-
-void InventoryHandler::openStorage(int type)
-{
- // TODO
-}
-
-void InventoryHandler::closeStorage(int type)
-{
- // TODO
-}
-
-void InventoryHandler::moveItem(int source, int slot, int amount,
- int destination)
-{
- // TODO
-}
-
size_t InventoryHandler::getSize(int type) const
{
switch (type)
diff --git a/src/net/manaserv/inventoryhandler.h b/src/net/manaserv/inventoryhandler.h
index fd08b95e..a1673e99 100644
--- a/src/net/manaserv/inventoryhandler.h
+++ b/src/net/manaserv/inventoryhandler.h
@@ -23,6 +23,7 @@
#define NET_MANASERV_INVENTORYHANDLER_H
#include "equipment.h"
+#include "listener.h"
#include "net/inventoryhandler.h"
@@ -67,34 +68,18 @@ class EquipBackend : public Equipment::Backend
Item *mEquipment[EQUIPMENT_SIZE];
};
-class InventoryHandler : public MessageHandler, Net::InventoryHandler
+class InventoryHandler : public MessageHandler, Net::InventoryHandler,
+ public Mana::Listener
{
public:
InventoryHandler();
void handleMessage(Net::MessageIn &msg);
- void equipItem(const Item *item);
-
- void unequipItem(const Item *item);
-
- void useItem(const Item *item);
-
- void dropItem(const Item *item, int amount);
+ void event(const std::string &channel, const Mana::Event &event);
bool canSplit(const Item *item);
- void splitItem(const Item *item, int amount);
-
- void moveItem(int oldIndex, int newIndex);
-
- void openStorage(int type);
-
- void closeStorage(int type);
-
- void moveItem(int source, int slot, int amount,
- int destination);
-
size_t getSize(int type) const;
private:
diff --git a/src/net/tmwa/inventoryhandler.cpp b/src/net/tmwa/inventoryhandler.cpp
index c1a96788..46eb6258 100644
--- a/src/net/tmwa/inventoryhandler.cpp
+++ b/src/net/tmwa/inventoryhandler.cpp
@@ -109,6 +109,8 @@ InventoryHandler::InventoryHandler()
mStorage = 0;
mStorageWindow = 0;
+
+ listen("Item");
}
InventoryHandler::~InventoryHandler()
@@ -421,41 +423,85 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg)
}
}
-void InventoryHandler::equipItem(const Item *item)
+void InventoryHandler::event(const std::string &channel,
+ const Mana::Event &event)
{
- if (!item)
- return;
-
- MessageOut outMsg(CMSG_PLAYER_EQUIP);
- outMsg.writeInt16(item->getInvIndex() + INVENTORY_OFFSET);
- outMsg.writeInt16(0);
-}
+ if (channel == "Item")
+ {
+ if (event.getName() == "doCloseInventory")
+ {
+ // No need to worry about type
+ MessageOut outMsg(CMSG_CLOSE_STORAGE);
+ }
+ else
+ {
+ Item *item = event.getItem("item");
-void InventoryHandler::unequipItem(const Item *item)
-{
- if (!item)
- return;
+ if (!item)
+ return;
- MessageOut outMsg(CMSG_PLAYER_UNEQUIP);
- outMsg.writeInt16(item->getInvIndex() + INVENTORY_OFFSET);
-}
+ int index = item->getInvIndex() + INVENTORY_OFFSET;
-void InventoryHandler::useItem(const Item *item)
-{
- if (!item)
- return;
+ if (event.getName() == "doEquip")
+ {
+ MessageOut outMsg(CMSG_PLAYER_EQUIP);
+ outMsg.writeInt16(index);
+ outMsg.writeInt16(0);
+ }
+ else if (event.getName() == "doUnequip")
+ {
+ MessageOut outMsg(CMSG_PLAYER_UNEQUIP);
+ outMsg.writeInt16(index);
+ }
+ else if (event.getName() == "doUse")
+ {
+ MessageOut outMsg(CMSG_PLAYER_INVENTORY_USE);
+ outMsg.writeInt16(index);
+ outMsg.writeInt32(item->getId()); // unused
+ }
+ else if (event.getName() == "doDrop")
+ {
+ int amount = event.getInt("amount", 1);
- MessageOut outMsg(CMSG_PLAYER_INVENTORY_USE);
- outMsg.writeInt16(item->getInvIndex() + INVENTORY_OFFSET);
- outMsg.writeInt32(item->getId()); // unused
-}
+ // TODO: Fix wrong coordinates of drops, serverside?
+ // (what's wrong here?)
+ MessageOut outMsg(CMSG_PLAYER_INVENTORY_DROP);
+ outMsg.writeInt16(index);
+ outMsg.writeInt16(amount);
+ }
+ else if (event.getName() == "doMove")
+ {
+ int newIndex = event.getInt("newIndex", -1);
-void InventoryHandler::dropItem(const Item *item, int amount)
-{
- // TODO: Fix wrong coordinates of drops, serverside? (what's wrong here?)
- MessageOut outMsg(CMSG_PLAYER_INVENTORY_DROP);
- outMsg.writeInt16(item->getInvIndex() + INVENTORY_OFFSET);
- outMsg.writeInt16(amount);
+ if (newIndex >= 0)
+ {
+ // Not implemented for tmwAthena (possible?)
+ }
+ else
+ {
+ int source = event.getInt("source");
+ int destination = event.getInt("destination");
+ int amount = event.getInt("amount", 1);
+
+ if (source == Inventory::INVENTORY
+ && destination == Inventory::STORAGE)
+ {
+ MessageOut outMsg(CMSG_MOVE_TO_STORAGE);
+ outMsg.writeInt16(index);
+ outMsg.writeInt32(amount);
+ }
+ else if (source == Inventory::STORAGE
+ && destination == Inventory::INVENTORY)
+ {
+ MessageOut outMsg(CSMG_MOVE_FROM_STORAGE);
+ outMsg.writeInt16(index - INVENTORY_OFFSET
+ + STORAGE_OFFSET);
+ outMsg.writeInt32(amount);
+ }
+ }
+ }
+ }
+ }
}
bool InventoryHandler::canSplit(const Item *item)
@@ -463,43 +509,6 @@ bool InventoryHandler::canSplit(const Item *item)
return false;
}
-void InventoryHandler::splitItem(const Item *item, int amount)
-{
- // Not implemented for eAthena (possible?)
-}
-
-void InventoryHandler::moveItem(int oldIndex, int newIndex)
-{
- // Not implemented for eAthena (possible?)
-}
-
-void InventoryHandler::openStorage(int type)
-{
- // Doesn't apply to eAthena, since opening happens through NPCs?
-}
-
-void InventoryHandler::closeStorage(int type)
-{
- MessageOut outMsg(CMSG_CLOSE_STORAGE);
-}
-
-void InventoryHandler::moveItem(int source, int slot, int amount,
- int destination)
-{
- if (source == Inventory::INVENTORY && destination == Inventory::STORAGE)
- {
- MessageOut outMsg(CMSG_MOVE_TO_STORAGE);
- outMsg.writeInt16(slot + INVENTORY_OFFSET);
- outMsg.writeInt32(amount);
- }
- else if (source == Inventory::STORAGE && destination == Inventory::INVENTORY)
- {
- MessageOut outMsg(CSMG_MOVE_FROM_STORAGE);
- outMsg.writeInt16(slot + STORAGE_OFFSET);
- outMsg.writeInt32(amount);
- }
-}
-
size_t InventoryHandler::getSize(int type) const
{
switch (type)
diff --git a/src/net/tmwa/inventoryhandler.h b/src/net/tmwa/inventoryhandler.h
index 8e6e12ca..18d73517 100644
--- a/src/net/tmwa/inventoryhandler.h
+++ b/src/net/tmwa/inventoryhandler.h
@@ -24,6 +24,7 @@
#include "equipment.h"
#include "inventory.h"
+#include "listener.h"
#include "playerinfo.h"
#include "gui/inventorywindow.h"
@@ -115,7 +116,8 @@ class InventoryItem
typedef std::list<InventoryItem> InventoryItems;
-class InventoryHandler : public MessageHandler, public Net::InventoryHandler
+class InventoryHandler : public MessageHandler, public Net::InventoryHandler,
+ public Mana::Listener
{
public:
enum {
@@ -129,27 +131,10 @@ class InventoryHandler : public MessageHandler, public Net::InventoryHandler
void handleMessage(Net::MessageIn &msg);
- void equipItem(const Item *item);
-
- void unequipItem(const Item *item);
-
- void useItem(const Item *item);
-
- void dropItem(const Item *item, int amount);
+ void event(const std::string &channel, const Mana::Event &event);
bool canSplit(const Item *item);
- void splitItem(const Item *item, int amount);
-
- void moveItem(int oldIndex, int newIndex);
-
- void openStorage(int type);
-
- void closeStorage(int type);
-
- void moveItem(int source, int slot, int amount,
- int destination);
-
size_t getSize(int type) const;
private:
diff --git a/src/net/tmwa/tradehandler.cpp b/src/net/tmwa/tradehandler.cpp
index ee7931bd..05ca3f87 100644
--- a/src/net/tmwa/tradehandler.cpp
+++ b/src/net/tmwa/tradehandler.cpp
@@ -189,7 +189,7 @@ void TradeHandler::handleMessage(Net::MessageIn &msg)
// Successfully added item
if (item->isEquipment() && item->isEquipped())
{
- Net::getInventoryHandler()->unequipItem(item);
+ item->doEvent("doUnequip");
}
tradeWindow->addItem(item->getId(), true, quantity,
item->isEquipment());