From d08bd96a8358ad9e399e9f7770d5265c81ff0b4e Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sat, 15 Nov 2014 00:30:36 +0300 Subject: eathena: add packet SMSG_NPC_COMMAND 0x0B00. --- src/net/ea/npchandler.cpp | 87 +++++++++++++++++++++++++++++++++++++++++++++++ src/net/ea/npchandler.h | 2 ++ 2 files changed, 89 insertions(+) (limited to 'src/net/ea') diff --git a/src/net/ea/npchandler.cpp b/src/net/ea/npchandler.cpp index 553209f59..a436b6cbe 100644 --- a/src/net/ea/npchandler.cpp +++ b/src/net/ea/npchandler.cpp @@ -22,6 +22,8 @@ #include "net/ea/npchandler.h" +#include "gui/viewport.h" + #include "gui/windows/npcdialog.h" #include "net/messagein.h" @@ -114,4 +116,89 @@ void NpcHandler::processNpcStrInput(Net::MessageIn &msg) } } +void NpcHandler::processNpcCommand(Net::MessageIn &msg) +{ + const int npcId = npcHandler->getNpc(msg); + mRequestLang = false; + + const int cmd = msg.readInt16("cmd"); + switch (cmd) + { + case 0: + mRequestLang = true; + break; + + case 1: + if (viewport) + viewport->moveCameraToActor(npcId); + break; + + case 2: + if (viewport) + { + const int id = msg.readInt32("id"); + const int x = msg.readInt16("x"); + const int y = msg.readInt16("y"); + if (!id) + viewport->moveCameraToPosition(x, y); + else + viewport->moveCameraToActor(id, x, y); + } + break; + + case 3: + if (viewport) + viewport->returnCamera(); + break; + + case 4: + if (viewport) + { + msg.readInt32("id"); + const int x = msg.readInt16("x"); + const int y = msg.readInt16("y"); + viewport->moveCameraRelative(x, y); + } + break; + case 5: // close dialog + npcHandler->closeDialog(npcId); + break; + case 6: // show avatar + if (mDialog) + { + mDialog->showAvatar(static_cast( + msg.readInt32("avatar id"))); + } + break; + case 7: // set avatar direction + if (mDialog) + { + mDialog->setAvatarDirection( + Net::MessageIn::fromServerDirection( + static_cast(msg.readInt32("avatar direction")))); + } + break; + case 8: // set avatar action + if (mDialog) + mDialog->setAvatarAction(msg.readInt32("avatar action")); + break; + case 9: // clear npc dialog + if (mDialog) + mDialog->clearRows(); + break; + case 10: // send selected item id + { + int invSize = msg.readInt32("npc inventory size"); + if (!invSize) + invSize = 1; + if (mDialog) + mDialog->itemRequest(invSize); + break; + } + default: + logger->log("unknown npc command: %d", cmd); + break; + } +} + } // namespace Ea diff --git a/src/net/ea/npchandler.h b/src/net/ea/npchandler.h index 08c5727f2..d518c6416 100644 --- a/src/net/ea/npchandler.h +++ b/src/net/ea/npchandler.h @@ -54,6 +54,8 @@ class NpcHandler notfinal : public Net::NpcHandler static void processNpcStrInput(Net::MessageIn &msg); + static void processNpcCommand(Net::MessageIn &msg); + protected: NpcHandler(); -- cgit v1.2.3-70-g09d2