diff options
Diffstat (limited to 'src/net/beinghandler.cpp')
-rw-r--r-- | src/net/beinghandler.cpp | 92 |
1 files changed, 61 insertions, 31 deletions
diff --git a/src/net/beinghandler.cpp b/src/net/beinghandler.cpp index 69f462ec..0db8fcbf 100644 --- a/src/net/beinghandler.cpp +++ b/src/net/beinghandler.cpp @@ -59,6 +59,7 @@ BeingHandler::BeingHandler(bool enableSync): SMSG_PLAYER_STOP, SMSG_PLAYER_MOVE_TO_ATTACK, 0x0119, + 0x0196, 0 }; handledMessages = _messages; @@ -69,13 +70,16 @@ void BeingHandler::handleMessage(MessageIn *msg) Uint32 id; Uint16 job, speed; Uint16 headTop, headMid, headBottom; - Uint16 shoes, gloves, cape, misc1, misc2; + Uint16 shoes, gloves; Uint16 weapon, shield; Uint16 gmstatus; Sint16 param1; + int stunMode; + Uint32 statusEffects; Sint8 type; + Uint16 status; Being *srcBeing, *dstBeing; - int hairStyle, hairColor; + int hairStyle, hairColor, flag; switch (msg->getId()) { @@ -84,9 +88,9 @@ void BeingHandler::handleMessage(MessageIn *msg) // Information about a being in range id = msg->readInt32(); speed = msg->readInt16(); - msg->readInt16(); // opt1 - msg->readInt16(); // opt2 - msg->readInt16(); // option + stunMode = msg->readInt16(); // opt1 + statusEffects = msg->readInt16(); // opt2 + statusEffects |= ((Uint32)msg->readInt16()) << 16; // option job = msg->readInt16(); // class dstBeing = beingManager->findBeing(id); @@ -110,6 +114,7 @@ void BeingHandler::handleMessage(MessageIn *msg) dstBeing->setAction(Being::STAND); } + // Prevent division by 0 when calculating frame if (speed == 0) { speed = 150; } @@ -128,14 +133,14 @@ void BeingHandler::handleMessage(MessageIn *msg) headTop = msg->readInt16(); headMid = msg->readInt16(); hairColor = msg->readInt16(); - shoes = msg->readInt16(); - gloves = msg->readInt16(); + shoes = msg->readInt16(); // clothes color - "abused" as shoes + gloves = msg->readInt16(); // head dir - "abused" as gloves msg->readInt16(); // guild msg->readInt16(); // unknown msg->readInt16(); // unknown msg->readInt16(); // manner - msg->readInt16(); // karma - msg->readInt8(); // unknown + dstBeing->setStatusEffectBlock(32, msg->readInt16()); // opt3 + msg->readInt8(); // karma dstBeing->setGender( (msg->readInt8() == 0) ? GENDER_FEMALE : GENDER_MALE); @@ -166,6 +171,10 @@ void BeingHandler::handleMessage(MessageIn *msg) msg->readInt8(); // unknown msg->readInt8(); // unknown msg->readInt8(); // unknown / sit + + dstBeing->setStunMode(stunMode); + dstBeing->setStatusEffectBlock(0, (statusEffects >> 16) & 0xffff); + dstBeing->setStatusEffectBlock(16, statusEffects & 0xffff); break; case SMSG_BEING_MOVE2: @@ -230,7 +239,7 @@ void BeingHandler::handleMessage(MessageIn *msg) switch (type) { case 0x0a: // Critical Damage - if (dstBeing) + if (dstBeing) dstBeing->showCrit(); case 0x00: // Damage if (dstBeing) @@ -240,7 +249,7 @@ void BeingHandler::handleMessage(MessageIn *msg) break; case 0x02: // Sit - if (srcBeing) + if (srcBeing) { srcBeing->mFrame = 0; srcBeing->setAction(Being::SIT); @@ -248,7 +257,7 @@ void BeingHandler::handleMessage(MessageIn *msg) break; case 0x03: // Stand up - if (srcBeing) + if (srcBeing) { srcBeing->mFrame = 0; srcBeing->setAction(Being::STAND); @@ -371,9 +380,10 @@ void BeingHandler::handleMessage(MessageIn *msg) // An update about a player, potentially including movement. id = msg->readInt32(); speed = msg->readInt16(); - cape = msg->readInt16(); - misc1 = msg->readInt16(); - misc2 = msg->readInt16(); + stunMode = msg->readInt16(); // opt1; Aethyra use this as cape + statusEffects = msg->readInt16(); // opt2; Aethyra use this as misc1 + statusEffects |= ((Uint32) msg->readInt16()) + << 16; // status.options; Aethyra uses this as misc2 job = msg->readInt16(); dstBeing = beingManager->findBeing(id); @@ -398,11 +408,12 @@ void BeingHandler::handleMessage(MessageIn *msg) headTop = msg->readInt16(); headMid = msg->readInt16(); hairColor = msg->readInt16(); - shoes = msg->readInt16(); - gloves = msg->readInt16(); + msg->readInt16(); // clothes color - Aethyra-"abused" as shoes, we ignore it + msg->readInt16(); // head dir - Aethyra-"abused" as gloves, we ignore it msg->readInt32(); // guild - msg->readInt32(); // emblem + msg->readInt16(); // emblem msg->readInt16(); // manner + dstBeing->setStatusEffectBlock(32, msg->readInt16()); // opt3 msg->readInt8(); // karma dstBeing->setGender( (msg->readInt8() == 0) ? GENDER_FEMALE : GENDER_MALE); @@ -413,13 +424,9 @@ void BeingHandler::handleMessage(MessageIn *msg) dstBeing->setSprite(Being::BOTTOMCLOTHES_SPRITE, headBottom); dstBeing->setSprite(Being::TOPCLOTHES_SPRITE, headMid); dstBeing->setSprite(Being::HAT_SPRITE, headTop); - dstBeing->setSprite(Being::SHOE_SPRITE, shoes); - // Compensation for the unpatched TMW server - if (gloves > 10) - dstBeing->setSprite(Being::GLOVES_SPRITE, gloves); - dstBeing->setSprite(Being::CAPE_SPRITE, cape); - dstBeing->setSprite(Being::MISC1_SPRITE, misc1); - dstBeing->setSprite(Being::MISC2_SPRITE, misc2); + //dstBeing->setSprite(Being::CAPE_SPRITE, cape); + //dstBeing->setSprite(Being::MISC1_SPRITE, misc1); + //dstBeing->setSprite(Being::MISC2_SPRITE, misc2); dstBeing->setHairStyle(hairStyle, hairColor); if (msg->getId() == SMSG_PLAYER_MOVE) @@ -446,7 +453,7 @@ void BeingHandler::handleMessage(MessageIn *msg) switch (msg->readInt8()) { case 1: - if (dstBeing->getType() != Being::NPC) + if (dstBeing->getType() != Being::NPC) dstBeing->setAction(Being::DEAD); break; @@ -465,6 +472,10 @@ void BeingHandler::handleMessage(MessageIn *msg) dstBeing->mWalkTime = tick_time; dstBeing->mFrame = 0; + + dstBeing->setStunMode(stunMode); + dstBeing->setStatusEffectBlock(0, (statusEffects >> 16) & 0xffff); + dstBeing->setStatusEffectBlock(16, statusEffects & 0xffff); break; case SMSG_PLAYER_STOP: @@ -504,11 +515,30 @@ void BeingHandler::handleMessage(MessageIn *msg) break; case 0x0119: - // Change in players look - logger->log("0x0119 %i %i %i %x %i", msg->readInt32(), - msg->readInt16(), msg->readInt16(), msg->readInt16(), - msg->readInt8()); + // Change in players' flags + id = msg->readInt32(); + dstBeing = beingManager->findBeing(id); + stunMode = msg->readInt16(); + statusEffects = msg->readInt16(); + statusEffects |= ((Uint32) msg->readInt16()) << 16; + msg->readInt8(); + + if (dstBeing) { + dstBeing->setStunMode(stunMode); + dstBeing->setStatusEffectBlock(0, (statusEffects >> 16) & 0xffff); + dstBeing->setStatusEffectBlock(16, statusEffects & 0xffff); + } + break; + + case 0x0196: + // Status change + status = msg->readInt16(); + id = msg->readInt32(); + flag = msg->readInt8(); // 0: stop, 1: start + + dstBeing = beingManager->findBeing(id); + if (dstBeing) + dstBeing->setStatusEffect(status, flag); break; } } - |