diff options
-rw-r--r-- | src/being/localplayer.cpp | 48 | ||||
-rw-r--r-- | src/being/localplayer.h | 4 | ||||
-rw-r--r-- | src/net/eathena/playerhandler.cpp | 21 |
3 files changed, 51 insertions, 22 deletions
diff --git a/src/being/localplayer.cpp b/src/being/localplayer.cpp index db37992f6..9da05d898 100644 --- a/src/being/localplayer.cpp +++ b/src/being/localplayer.cpp @@ -1055,18 +1055,8 @@ void LocalPlayer::optionChanged(const std::string &value) mShowServerPos = config.getBoolValue("showserverpos"); } -void LocalPlayer::statChanged(const int id, - const int oldVal1, - const int oldVal2) +void LocalPlayer::addJobMessage(const int change) { - if (!mShowJobExp || id != Attributes::JOB) - return; - - const std::pair<int, int> exp = PlayerInfo::getStatExperience(id); - if (oldVal1 > exp.first || !oldVal2) - return; - - const int change = exp.first - oldVal1; if (change != 0 && mMessages.size() < 20) { if (!mMessages.empty()) @@ -1095,6 +1085,34 @@ void LocalPlayer::statChanged(const int id, } } +void LocalPlayer::addXpMessage(const int change) +{ + if (change != 0 && mMessages.size() < 20) + { + // TRANSLATORS: get xp message + addMessageToQueue(strprintf("%d %s", change, _("xp"))); + } +} + +void LocalPlayer::statChanged(const int id, + const int oldVal1, + const int oldVal2) +{ + if (!mShowJobExp || + id != Attributes::JOB || + serverFeatures->haveExpPacket()) + { + return; + } + + const std::pair<int, int> exp = PlayerInfo::getStatExperience(id); + if (oldVal1 > exp.first || !oldVal2) + return; + + const int change = exp.first - oldVal1; + addJobMessage(change); +} + void LocalPlayer::attributeChanged(const int id, const int oldVal, const int newVal) @@ -1103,15 +1121,13 @@ void LocalPlayer::attributeChanged(const int id, { case Attributes::EXP: { + if (serverFeatures->haveExpPacket()) + break; if (oldVal > newVal) break; const int change = newVal - oldVal; - if (change != 0) - { - // TRANSLATORS: get xp message - addMessageToQueue(strprintf("%d %s", change, _("xp"))); - } + addXpMessage(change); break; } case Attributes::LEVEL: diff --git a/src/being/localplayer.h b/src/being/localplayer.h index d63e5a7e6..a0865baa9 100644 --- a/src/being/localplayer.h +++ b/src/being/localplayer.h @@ -366,6 +366,10 @@ class LocalPlayer final : public Being, void stopAdvert(); + void addXpMessage(const int change); + + void addJobMessage(const int change); + static bool checAttackPermissions(const Being *const target) A_WARN_UNUSED; diff --git a/src/net/eathena/playerhandler.cpp b/src/net/eathena/playerhandler.cpp index 9edb50e01..c2f3e7ee1 100644 --- a/src/net/eathena/playerhandler.cpp +++ b/src/net/eathena/playerhandler.cpp @@ -469,12 +469,21 @@ void PlayerHandler::processPlayerStatUpdate5(Net::MessageIn &msg) void PlayerHandler::processPlayerGetExp(Net::MessageIn &msg) { - UNIMPLIMENTEDPACKET; - msg.readInt32("player id"); - msg.readInt32("exp amount"); - msg.readInt16("exp type"); - msg.readInt16("is from quest"); -// Being *dstBeing = actorManager->findBeing(id); + if (!localPlayer) + return; + const int id = msg.readInt32("player id"); + const int exp = msg.readInt32("exp amount"); + const int stat = msg.readInt16("exp type"); + const bool fromQuest = msg.readInt16("is from quest"); + if (!fromQuest && id == localPlayer->getId()) + { + if (stat == 1) + localPlayer->addXpMessage(exp); + else if (stat == 2) + localPlayer->addJobMessage(exp); + else + logger->log("unknown exp type"); + } // need show particle depend on isQuest flag, for now ignored } |