diff options
Diffstat (limited to 'src/net/tmwa')
-rw-r--r-- | src/net/tmwa/beinghandler.cpp | 62 | ||||
-rw-r--r-- | src/net/tmwa/beinghandler.h | 2 |
2 files changed, 63 insertions, 1 deletions
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); |