summaryrefslogtreecommitdiff
path: root/src/net/manaserv/npchandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/manaserv/npchandler.cpp')
-rw-r--r--src/net/manaserv/npchandler.cpp246
1 files changed, 133 insertions, 113 deletions
diff --git a/src/net/manaserv/npchandler.cpp b/src/net/manaserv/npchandler.cpp
index 392ec4fd..ca7d7415 100644
--- a/src/net/manaserv/npchandler.cpp
+++ b/src/net/manaserv/npchandler.cpp
@@ -21,16 +21,15 @@
#include "net/manaserv/npchandler.h"
-#include "beingmanager.h"
-#include "npc.h"
-
-#include "gui/npcdialog.h"
-#include "gui/npcpostdialog.h"
+#include "actorspritemanager.h"
+#include "event.h"
#include "net/manaserv/connection.h"
#include "net/manaserv/messagein.h"
#include "net/manaserv/messageout.h"
-#include "net/manaserv/protocol.h"
+#include "net/manaserv/manaserv_protocol.h"
+
+#include "utils/stringutils.h"
extern Net::NpcHandler *npcHandler;
@@ -56,76 +55,112 @@ NpcHandler::NpcHandler()
void NpcHandler::handleMessage(Net::MessageIn &msg)
{
- Being *being = beingManager->findBeing(msg.readInt16());
- if (!being || being->getType() != Being::NPC)
+ Being *being = actorSpriteManager->findBeing(msg.readInt16());
+ if (!being || being->getType() != ActorSprite::NPC)
{
return;
}
- int npcId = being->getId();
- NpcDialogs::iterator diag = mNpcDialogs.find(npcId);
- NpcDialog *dialog;
-
- if (diag == mNpcDialogs.end())
- {
- if (msg.getId() == GPMSG_NPC_ERROR || msg.getId() == GPMSG_NPC_CLOSE)
- return; // Dialog is pointless in these cases
-
- dialog = new NpcDialog(npcId);
- Wrapper wrap;
- wrap.dialog = dialog;
- mNpcDialogs[npcId] = wrap;
- }
- else
- {
- dialog = diag->second.dialog;
- }
+ int npcId = being->getId(), count = 0;
+ Mana::Event *event = 0;
switch (msg.getId())
{
- case GPMSG_NPC_CHOICE:
- dialog->choiceRequest();
- while (msg.getUnreadLength())
- {
- dialog->addChoice(msg.readString());
- }
- break;
-
- case GPMSG_NPC_NUMBER:
+ case GPMSG_NPC_CHOICE:
+ event = new Mana::Event(EVENT_MENU);
+ event->setInt("id", npcId);
+ while (msg.getUnreadLength())
{
- int min_num = msg.readInt32();
- int max_num = msg.readInt32();
- dialog->integerRequest(msg.readInt32(), min_num, max_num);
- break;
+ count++;
+ event->setString("choice" + toString(count), msg.readString());
}
+ event->setInt("choiceCount", count);
+ event->trigger(CHANNEL_NPC);
+ break;
+
+ case GPMSG_NPC_NUMBER:
+ event = new Mana::Event(EVENT_INTEGERINPUT);
+ event->setInt("id", npcId);
+ event->setInt("min", msg.readInt32());
+ event->setInt("max", msg.readInt32());
+ event->setInt("default", msg.readInt32());
+ event->trigger(CHANNEL_NPC);
+ break;
+
+ case GPMSG_NPC_STRING:
+ event = new Mana::Event(EVENT_STRINGINPUT);
+ event->setInt("id", npcId);
+ event->trigger(CHANNEL_NPC);
+ break;
+
+ case GPMSG_NPC_POST:
+ event = new Mana::Event(EVENT_POST);
+ event->setInt("id", npcId);
+ event->trigger(CHANNEL_NPC);
+ break;
+
+ case GPMSG_NPC_ERROR:
+ event = new Mana::Event(EVENT_END);
+ event->setInt("id", npcId);
+ event->trigger(CHANNEL_NPC);
+ break;
+
+ case GPMSG_NPC_MESSAGE:
+ event = new Mana::Event(EVENT_MESSAGE);
+ event->setInt("id", npcId);
+ event->setString("text", msg.readString(msg.getUnreadLength()));
+ event->trigger(CHANNEL_NPC);
+ delete event;
+
+ event = new Mana::Event(EVENT_NEXT);
+ event->setInt("id", npcId);
+ event->trigger(CHANNEL_NPC);
+ break;
+
+ case GPMSG_NPC_CLOSE:
+ event = new Mana::Event(EVENT_CLOSE);
+ event->setInt("id", npcId);
+ event->trigger(CHANNEL_NPC);
+ break;
+ }
- case GPMSG_NPC_STRING:
- dialog->textRequest("");
- break;
+ delete event;
+}
- case GPMSG_NPC_POST:
- {
- new NpcPostDialog(npcId);
- break;
- }
+void NpcHandler::startShopping(int beingId)
+{
+ // TODO
+}
- case GPMSG_NPC_ERROR:
- dialog->close();
- if (diag != mNpcDialogs.end())
- {
- mNpcDialogs.erase(diag);
- }
- break;
-
- case GPMSG_NPC_MESSAGE:
- dialog->addText(msg.readString(msg.getUnreadLength()));
- dialog->showNextButton();
- break;
-
- case GPMSG_NPC_CLOSE:
- dialog->showCloseButton();
- break;
- }
+void NpcHandler::buy(int beingId)
+{
+ // TODO
+}
+
+void NpcHandler::sell(int beingId)
+{
+ // TODO
+}
+
+void NpcHandler::buyItem(int beingId, int itemId, int amount)
+{
+ MessageOut msg(PGMSG_NPC_BUYSELL);
+ msg.writeInt16(itemId);
+ msg.writeInt16(amount);
+ gameServerConnection->send(msg);
+}
+
+void NpcHandler::sellItem(int beingId, int itemId, int amount)
+{
+ MessageOut msg(PGMSG_NPC_BUYSELL);
+ msg.writeInt16(itemId);
+ msg.writeInt16(amount);
+ gameServerConnection->send(msg);
+}
+
+void NpcHandler::endShopping(int beingId)
+{
+ // TODO
}
void NpcHandler::talk(int npcId)
@@ -133,6 +168,10 @@ void NpcHandler::talk(int npcId)
MessageOut msg(PGMSG_NPC_TALK);
msg.writeInt16(npcId);
gameServerConnection->send(msg);
+
+ Mana::Event event(EVENT_TALKSENT);
+ event.setInt("npcId", npcId);
+ event.trigger(CHANNEL_NPC);
}
void NpcHandler::nextDialog(int npcId)
@@ -140,6 +179,10 @@ void NpcHandler::nextDialog(int npcId)
MessageOut msg(PGMSG_NPC_TALK_NEXT);
msg.writeInt16(npcId);
gameServerConnection->send(msg);
+
+ Mana::Event event(EVENT_NEXTSENT);
+ event.setInt("npcId", npcId);
+ event.trigger(CHANNEL_NPC);
}
void NpcHandler::closeDialog(int npcId)
@@ -148,20 +191,22 @@ void NpcHandler::closeDialog(int npcId)
msg.writeInt16(npcId);
gameServerConnection->send(msg);
- NpcDialogs::iterator it = mNpcDialogs.find(npcId);
- if (it != mNpcDialogs.end())
- {
- (*it).second.dialog->close();
- mNpcDialogs.erase(it);
- }
+ Mana::Event event(EVENT_CLOSESENT);
+ event.setInt("npcId", npcId);
+ event.trigger(CHANNEL_NPC);
}
-void NpcHandler::listInput(int npcId, int value)
+void NpcHandler::menuSelect(int npcId, int choice)
{
MessageOut msg(PGMSG_NPC_SELECT);
msg.writeInt16(npcId);
- msg.writeInt8(value);
+ msg.writeInt8(choice);
gameServerConnection->send(msg);
+
+ Mana::Event event(EVENT_MENUSENT);
+ event.setInt("npcId", npcId);
+ event.setInt("choice", choice);
+ event.trigger(CHANNEL_NPC);
}
void NpcHandler::integerInput(int npcId, int value)
@@ -170,6 +215,11 @@ void NpcHandler::integerInput(int npcId, int value)
msg.writeInt16(npcId);
msg.writeInt32(value);
gameServerConnection->send(msg);
+
+ Mana::Event event(EVENT_INTEGERINPUTSENT);
+ event.setInt("npcId", npcId);
+ event.setInt("value", value);
+ event.trigger(CHANNEL_NPC);
}
void NpcHandler::stringInput(int npcId, const std::string &value)
@@ -178,56 +228,26 @@ void NpcHandler::stringInput(int npcId, const std::string &value)
msg.writeInt16(npcId);
msg.writeString(value);
gameServerConnection->send(msg);
+
+ Mana::Event event(EVENT_STRINGINPUTSENT);
+ event.setInt("npcId", npcId);
+ event.setString("value", value);
+ event.trigger(CHANNEL_NPC);
}
void NpcHandler::sendLetter(int npcId, const std::string &recipient,
- const std::string &text)
+ const std::string &text)
{
MessageOut msg(PGMSG_NPC_POST_SEND);
msg.writeString(recipient);
msg.writeString(text);
gameServerConnection->send(msg);
-}
-
-void NpcHandler::startShopping(int beingId)
-{
- // TODO
-}
-
-void NpcHandler::buy(int beingId)
-{
- // TODO
-}
-
-void NpcHandler::sell(int beingId)
-{
- // TODO
-}
-void NpcHandler::buyItem(int beingId, int itemId, int amount)
-{
- MessageOut msg(PGMSG_NPC_BUYSELL);
- msg.writeInt16(itemId);
- msg.writeInt16(amount);
- gameServerConnection->send(msg);
-}
-
-void NpcHandler::sellItem(int beingId, int itemId, int amount)
-{
- MessageOut msg(PGMSG_NPC_BUYSELL);
- msg.writeInt16(itemId);
- msg.writeInt16(amount);
- gameServerConnection->send(msg);
-}
-
-void NpcHandler::endShopping(int beingId)
-{
- // TODO
-}
-
-void NpcHandler::clearDialogs()
-{
- mNpcDialogs.clear();
+ Mana::Event event(EVENT_SENDLETTERSENT);
+ event.setInt("npcId", npcId);
+ event.setString("recipient", recipient);
+ event.setString("text", text);
+ event.trigger(CHANNEL_NPC);
}
} // namespace ManaServ