diff options
-rw-r--r-- | src/net/eathena/beinghandler.cpp | 48 | ||||
-rw-r--r-- | src/net/eathena/beinghandler.h | 2 | ||||
-rw-r--r-- | src/net/tmwa/beinghandler.cpp | 62 | ||||
-rw-r--r-- | src/net/tmwa/beinghandler.h | 2 |
4 files changed, 112 insertions, 2 deletions
diff --git a/src/net/eathena/beinghandler.cpp b/src/net/eathena/beinghandler.cpp index 91a467bbf..315d3a47b 100644 --- a/src/net/eathena/beinghandler.cpp +++ b/src/net/eathena/beinghandler.cpp @@ -163,10 +163,13 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) break; case SMSG_BEING_CHANGE_LOOKS: - case SMSG_BEING_CHANGE_LOOKS2: processBeingChangeLook(msg); break; + case SMSG_BEING_CHANGE_LOOKS2: + processBeingChangeLook2(msg); + break; + case SMSG_BEING_NAME_RESPONSE: processNameResponse(msg); break; @@ -310,6 +313,49 @@ void BeingHandler::processBeingChangeLook(Net::MessageIn &msg) const processBeingChangeLookContinue(dstBeing, type, id, id2); } +void BeingHandler::processBeingChangeLook2(Net::MessageIn &msg) const +{ + if (!actorManager) + return; + + /* + * SMSG_BEING_CHANGE_LOOKS (0x00c3) and + * SMSG_BEING_CHANGE_LOOKS2 (0x01d7) do basically the same + * thing. The difference is that ...LOOKS carries a single + * 8 bit value, where ...LOOKS2 carries two 16 bit values. + * + * If type = 2, then the first 16 bit value is the weapon ID, + * and the second 16 bit value is the shield ID. If no + * shield is equipped, or type is not 2, then the second + * 16 bit value will be 0. + */ + + Being *const dstBeing = actorManager->findBeing( + msg.readInt32("being id")); + const uint8_t type = msg.readUInt8("type"); + int id = 0; + unsigned int id2 = 0U; + const bool look2 = msg.getId() == SMSG_BEING_CHANGE_LOOKS2; + + if (!look2) + { + id = static_cast<int>(msg.readUInt8("id")); + id2 = 1U; // default color + } + else + { // SMSG_BEING_CHANGE_LOOKS2 + id = msg.readInt16("id1"); + id2 = msg.readInt16("id2"); + if (type != 2) + id2 = 1; + } + + if (!localPlayer || !dstBeing) + return; + + processBeingChangeLookContinue(dstBeing, type, id, id2); +} + void BeingHandler::processBeingChangeLookContinue(Being *const dstBeing, const uint8_t type, const int id, diff --git a/src/net/eathena/beinghandler.h b/src/net/eathena/beinghandler.h index 0d4c71a77..2ddd60d6a 100644 --- a/src/net/eathena/beinghandler.h +++ b/src/net/eathena/beinghandler.h @@ -48,6 +48,8 @@ class BeingHandler final : public MessageHandler, public Ea::BeingHandler protected: void processBeingChangeLook(Net::MessageIn &msg) const; + void processBeingChangeLook2(Net::MessageIn &msg) const; + void processBeingVisible(Net::MessageIn &msg); void processBeingMove(Net::MessageIn &msg); diff --git a/src/net/tmwa/beinghandler.cpp b/src/net/tmwa/beinghandler.cpp index 5338cd4c3..c592c7bf0 100644 --- a/src/net/tmwa/beinghandler.cpp +++ b/src/net/tmwa/beinghandler.cpp @@ -156,10 +156,13 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) break; case SMSG_BEING_CHANGE_LOOKS: - case SMSG_BEING_CHANGE_LOOKS2: processBeingChangeLook(msg); break; + case SMSG_BEING_CHANGE_LOOKS2: + processBeingChangeLook2(msg); + break; + case SMSG_BEING_NAME_RESPONSE: processNameResponse(msg); break; @@ -302,6 +305,63 @@ void BeingHandler::processBeingChangeLook(Net::MessageIn &msg) const BLOCK_END("BeingHandler::processBeingChangeLook") } +void BeingHandler::processBeingChangeLook2(Net::MessageIn &msg) const +{ + BLOCK_START("BeingHandler::processBeingChangeLook") + if (!actorManager) + { + BLOCK_END("BeingHandler::processBeingChangeLook") + return; + } + + /* + * SMSG_BEING_CHANGE_LOOKS (0x00c3) and + * SMSG_BEING_CHANGE_LOOKS2 (0x01d7) do basically the same + * thing. The difference is that ...LOOKS carries a single + * 8 bit value, where ...LOOKS2 carries two 16 bit values. + * + * If type = 2, then the first 16 bit value is the weapon ID, + * and the second 16 bit value is the shield ID. If no + * shield is equipped, or type is not 2, then the second + * 16 bit value will be 0. + */ + + Being *const dstBeing = actorManager->findBeing( + msg.readInt32("being id")); + + const uint8_t type = msg.readUInt8("type"); + int16_t id = 0; + int id2 = 0; + const bool look2 = msg.getId() == SMSG_BEING_CHANGE_LOOKS2; + + if (!look2) + { + id = static_cast<int16_t>(msg.readUInt8("id")); + id2 = 1; // default color + } + else + { // SMSG_BEING_CHANGE_LOOKS2 + id = msg.readInt16("id1"); + if (type == 2 || serverVersion > 0) + { + id2 = msg.readInt16("id2"); + } + else + { + msg.readInt16("id2"); + id2 = 1; + } + } + + if (!localPlayer || !dstBeing) + { + BLOCK_END("BeingHandler::processBeingChangeLook") + return; + } + processBeingChangeLookContinue(dstBeing, type, id, id2); + BLOCK_END("BeingHandler::processBeingChangeLook") +} + void BeingHandler::processBeingChangeLookContinue(Being *const dstBeing, const uint8_t type, const int id, diff --git a/src/net/tmwa/beinghandler.h b/src/net/tmwa/beinghandler.h index 4f2d75f0c..996b054ba 100644 --- a/src/net/tmwa/beinghandler.h +++ b/src/net/tmwa/beinghandler.h @@ -48,6 +48,8 @@ class BeingHandler final : public MessageHandler, public Ea::BeingHandler protected: void processBeingChangeLook(Net::MessageIn &msg) const; + void processBeingChangeLook2(Net::MessageIn &msg) const; + void processBeingVisible(Net::MessageIn &msg); void processBeingMove(Net::MessageIn &msg); |