diff options
-rw-r--r-- | src/net/ea/npchandler.cpp | 87 | ||||
-rw-r--r-- | src/net/ea/npchandler.h | 2 | ||||
-rw-r--r-- | src/net/eathena/npchandler.cpp | 5 | ||||
-rw-r--r-- | src/net/eathena/packets.h | 21 | ||||
-rw-r--r-- | src/net/eathena/protocol.h | 2 | ||||
-rw-r--r-- | src/net/tmwa/npchandler.cpp | 85 | ||||
-rw-r--r-- | src/net/tmwa/npchandler.h | 2 |
7 files changed, 116 insertions, 88 deletions
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<uint16_t>( + msg.readInt32("avatar id"))); + } + break; + case 7: // set avatar direction + if (mDialog) + { + mDialog->setAvatarDirection( + Net::MessageIn::fromServerDirection( + static_cast<uint8_t>(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(); diff --git a/src/net/eathena/npchandler.cpp b/src/net/eathena/npchandler.cpp index 503dc642e..1dd6f1906 100644 --- a/src/net/eathena/npchandler.cpp +++ b/src/net/eathena/npchandler.cpp @@ -54,6 +54,7 @@ NpcHandler::NpcHandler() : SMSG_NPC_VIEWPOINT, SMSG_NPC_SHOW_PROGRESS_BAR, SMSG_NPC_CLOSE_TIMEOUT, + SMSG_NPC_COMMAND, 0 }; handledMessages = _messages; @@ -104,6 +105,10 @@ void NpcHandler::handleMessage(Net::MessageIn &msg) processNpcCloseTimeout(msg); break; + case SMSG_NPC_COMMAND: + processNpcCommand(msg); + break; + default: break; } diff --git a/src/net/eathena/packets.h b/src/net/eathena/packets.h index 6d7a99762..cdc21e72a 100644 --- a/src/net/eathena/packets.h +++ b/src/net/eathena/packets.h @@ -263,6 +263,27 @@ int16_t packet_lengths[] = 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +// #0x0A40 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +// #0x0A80 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +// #0x0AC0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +// #0x0B00 + 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +// #0x0B40 }; } // namespace EAthena diff --git a/src/net/eathena/protocol.h b/src/net/eathena/protocol.h index 09e615cfd..bdf254d04 100644 --- a/src/net/eathena/protocol.h +++ b/src/net/eathena/protocol.h @@ -279,7 +279,7 @@ #define SMSG_MAP_TYPE 0x01d6 #define SMSG_IGNORE_ALL_RESPONSE 0x00d2 #define SMSG_ONLINE_LIST 0x0211 -#define SMSG_NPC_COMMAND 0x0212 +#define SMSG_NPC_COMMAND 0x0B00 #define SMSG_MAP_ACCOUNT_ID 0x0283 #define SMSG_PLAYER_SHORTCUTS 0x0a00 diff --git a/src/net/tmwa/npchandler.cpp b/src/net/tmwa/npchandler.cpp index 812416948..74cb9d78f 100644 --- a/src/net/tmwa/npchandler.cpp +++ b/src/net/tmwa/npchandler.cpp @@ -291,91 +291,6 @@ int NpcHandler::getNpc(Net::MessageIn &msg) return npcId; } -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<uint16_t>( - msg.readInt32("avatar id"))); - } - break; - case 7: // set avatar direction - if (mDialog) - { - mDialog->setAvatarDirection( - Net::MessageIn::fromServerDirection( - static_cast<uint8_t>(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; - } -} - void NpcHandler::processChangeTitle(Net::MessageIn &msg) { npcHandler->getNpc(msg); diff --git a/src/net/tmwa/npchandler.h b/src/net/tmwa/npchandler.h index 476e62a64..f399a98d9 100644 --- a/src/net/tmwa/npchandler.h +++ b/src/net/tmwa/npchandler.h @@ -69,8 +69,6 @@ class NpcHandler final : public MessageHandler, public Ea::NpcHandler int getNpc(Net::MessageIn &msg) override final; - static void processNpcCommand(Net::MessageIn &msg); - static void processChangeTitle(Net::MessageIn &msg); void produceMix(const int nameId, |