diff options
Diffstat (limited to 'src/net')
-rw-r--r-- | src/net/beinghandler.cpp | 92 | ||||
-rw-r--r-- | src/net/loginhandler.cpp | 2 | ||||
-rw-r--r-- | src/net/npchandler.cpp | 2 | ||||
-rw-r--r-- | src/net/partyhandler.cpp | 150 | ||||
-rw-r--r-- | src/net/partyhandler.h | 6 | ||||
-rw-r--r-- | src/net/playerhandler.cpp | 2 | ||||
-rw-r--r-- | src/net/tradehandler.cpp | 4 |
7 files changed, 144 insertions, 114 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; } } - diff --git a/src/net/loginhandler.cpp b/src/net/loginhandler.cpp index 4f5f2acc..41314d16 100644 --- a/src/net/loginhandler.cpp +++ b/src/net/loginhandler.cpp @@ -113,7 +113,7 @@ void LoginHandler::handleMessage(MessageIn *msg) iptostring(server_info[i]->address), server_info[i]->port); } - state = CHAR_SERVER_STATE; + state = CHAR_SERVER_STATE; break; case 0x006a: diff --git a/src/net/npchandler.cpp b/src/net/npchandler.cpp index 4e17a27e..ea03537f 100644 --- a/src/net/npchandler.cpp +++ b/src/net/npchandler.cpp @@ -79,7 +79,7 @@ void NPCHandler::handleMessage(MessageIn *msg) case SMSG_NPC_CLOSE: id = msg->readInt32(); if (current_npc == dynamic_cast<NPC*>(beingManager->findBeing(id))) - current_npc = NULL; + current_npc = NULL; break; case SMSG_NPC_NEXT: diff --git a/src/net/partyhandler.cpp b/src/net/partyhandler.cpp index 2437d0a0..03aca66d 100644 --- a/src/net/partyhandler.cpp +++ b/src/net/partyhandler.cpp @@ -34,17 +34,17 @@ PartyHandler::PartyHandler(Party *party) : mParty(party) { static const Uint16 _messages[] = { - SMSG_PARTY_CREATE, - SMSG_PARTY_INFO, - SMSG_PARTY_INVITE, - SMSG_PARTY_INVITED, - SMSG_PARTY_SETTINGS, - SMSG_PARTY_MEMBER_INFO, - SMSG_PARTY_LEAVE, - SMSG_PARTY_UPDATE_HP, - SMSG_PARTY_UPDATE_COORDS, - SMSG_PARTY_MESSAGE, - 0 + SMSG_PARTY_CREATE, + SMSG_PARTY_INFO, + SMSG_PARTY_INVITE, + SMSG_PARTY_INVITED, + SMSG_PARTY_SETTINGS, + SMSG_PARTY_MEMBER_INFO, + SMSG_PARTY_LEAVE, + SMSG_PARTY_UPDATE_HP, + SMSG_PARTY_UPDATE_COORDS, + SMSG_PARTY_MESSAGE, + 0 }; handledMessages = _messages; } @@ -53,70 +53,70 @@ void PartyHandler::handleMessage(MessageIn *msg) { switch (msg->getId()) { - case SMSG_PARTY_CREATE: - mParty->createResponse(msg->readInt8()); - break; - case SMSG_PARTY_INFO: - break; - case SMSG_PARTY_INVITE: - { - std::string nick = msg->readString(24); - int status = msg->readInt8(); - mParty->inviteResponse(nick, status); - break; - } - case SMSG_PARTY_INVITED: - { - int id = msg->readInt32(); - Being *being = beingManager->findBeing(id); - if (being == NULL) - { - break; - } - std::string nick; + case SMSG_PARTY_CREATE: + mParty->createResponse(msg->readInt8()); + break; + case SMSG_PARTY_INFO: + break; + case SMSG_PARTY_INVITE: + { + std::string nick = msg->readString(24); + int status = msg->readInt8(); + mParty->inviteResponse(nick, status); + break; + } + case SMSG_PARTY_INVITED: + { + int id = msg->readInt32(); + Being *being = beingManager->findBeing(id); + if (being == NULL) + { + break; + } + std::string nick; int gender = 0; - std::string partyName = ""; - if (being->getType() != Being::PLAYER) - { - nick = ""; - } - else - { - nick = being->getName(); - gender = being->getGender(); - partyName = msg->readString(24); - } - mParty->invitedAsk(nick, gender, partyName); - break; - } - case SMSG_PARTY_SETTINGS: - break; - case SMSG_PARTY_MEMBER_INFO: - break; - case SMSG_PARTY_LEAVE: - { - /*int id = */msg->readInt32(); - std::string nick = msg->readString(24); - /*int fail = */msg->readInt8(); - mParty->leftResponse(nick); - break; - } - case SMSG_PARTY_UPDATE_HP: - break; - case SMSG_PARTY_UPDATE_COORDS: - break; - case SMSG_PARTY_MESSAGE: - { // new block to enable local variables - int msgLength = msg->readInt16() - 8; - if (msgLength <= 0) - { - return; - } - int id = msg->readInt32(); - Being *being = beingManager->findBeing(id); - std::string chatMsg = msg->readString(msgLength); - mParty->receiveChat(being, chatMsg); - } - break; + std::string partyName = ""; + if (being->getType() != Being::PLAYER) + { + nick = ""; + } + else + { + nick = being->getName(); + gender = being->getGender(); + partyName = msg->readString(24); + } + mParty->invitedAsk(nick, gender, partyName); + break; + } + case SMSG_PARTY_SETTINGS: + break; + case SMSG_PARTY_MEMBER_INFO: + break; + case SMSG_PARTY_LEAVE: + { + /*int id = */msg->readInt32(); + std::string nick = msg->readString(24); + /*int fail = */msg->readInt8(); + mParty->leftResponse(nick); + break; + } + case SMSG_PARTY_UPDATE_HP: + break; + case SMSG_PARTY_UPDATE_COORDS: + break; + case SMSG_PARTY_MESSAGE: + { // new block to enable local variables + int msgLength = msg->readInt16() - 8; + if (msgLength <= 0) + { + return; + } + int id = msg->readInt32(); + Being *being = beingManager->findBeing(id); + std::string chatMsg = msg->readString(msgLength); + mParty->receiveChat(being, chatMsg); + } + break; } } diff --git a/src/net/partyhandler.h b/src/net/partyhandler.h index 08d85ad0..048da9b1 100644 --- a/src/net/partyhandler.h +++ b/src/net/partyhandler.h @@ -29,11 +29,11 @@ class Party; class PartyHandler : public MessageHandler { public: - PartyHandler(Party *party); + PartyHandler(Party *party); - void handleMessage(MessageIn *msg); + void handleMessage(MessageIn *msg); private: - Party *mParty; + Party *mParty; }; #endif diff --git a/src/net/playerhandler.cpp b/src/net/playerhandler.cpp index d06f1108..46ded32e 100644 --- a/src/net/playerhandler.cpp +++ b/src/net/playerhandler.cpp @@ -146,7 +146,7 @@ void PlayerHandler::handleMessage(MessageIn *msg) /* Scroll if neccessary */ if (!nearby || (abs(x - player_node->mX) > MAP_TELEPORT_SCROLL_DISTANCE) - || (abs(y - player_node->mY) > MAP_TELEPORT_SCROLL_DISTANCE)) + || (abs(y - player_node->mY) > MAP_TELEPORT_SCROLL_DISTANCE)) { scrollOffsetX = (x - player_node->mX) * 32; scrollOffsetY = (y - player_node->mY) * 32; diff --git a/src/net/tradehandler.cpp b/src/net/tradehandler.cpp index 0c7c9205..c5465835 100644 --- a/src/net/tradehandler.cpp +++ b/src/net/tradehandler.cpp @@ -112,7 +112,7 @@ void TradeHandler::handleMessage(MessageIn *msg) BY_SERVER); break; case 2: // Invite request check failed... - chatWindow->chatLog(_("Trade cancelled due to an unknown reason."), + chatWindow->chatLog(_("Trade cancelled due to an unknown reason."), BY_SERVER); break; case 3: // Trade accepted @@ -191,7 +191,7 @@ void TradeHandler::handleMessage(MessageIn *msg) BY_SERVER); break; default: - chatWindow->chatLog(_("Failed adding item for unknown reason."), + chatWindow->chatLog(_("Failed adding item for unknown reason."), BY_SERVER); break; } |