diff options
author | Andrei Karas <akaras@inbox.ru> | 2014-09-10 13:12:47 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2014-09-10 13:12:47 +0300 |
commit | dfe0fc16bfbe2f2c36d2adad884c28f89625c285 (patch) | |
tree | d4c7420f490198f51344201f5eced24f0f8cf513 /src/net/tmwa/beinghandler.cpp | |
parent | 173c48498dc55e9b86bee009427fb5ae58cd9821 (diff) | |
download | manaplus-dfe0fc16bfbe2f2c36d2adad884c28f89625c285.tar.gz manaplus-dfe0fc16bfbe2f2c36d2adad884c28f89625c285.tar.bz2 manaplus-dfe0fc16bfbe2f2c36d2adad884c28f89625c285.tar.xz manaplus-dfe0fc16bfbe2f2c36d2adad884c28f89625c285.zip |
Split processBeingChangeLook for each packet type.
Diffstat (limited to 'src/net/tmwa/beinghandler.cpp')
-rw-r--r-- | src/net/tmwa/beinghandler.cpp | 62 |
1 files changed, 61 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, |