summaryrefslogtreecommitdiff
path: root/src/net/eathena/beinghandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/eathena/beinghandler.cpp')
-rw-r--r--src/net/eathena/beinghandler.cpp48
1 files changed, 47 insertions, 1 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,