summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/net/eathena/beinghandler.cpp48
-rw-r--r--src/net/eathena/beinghandler.h2
-rw-r--r--src/net/tmwa/beinghandler.cpp62
-rw-r--r--src/net/tmwa/beinghandler.h2
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);