diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 37 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 3 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MiscPackets.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MiscPackets.h | 14 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 2 |
6 files changed, 55 insertions, 19 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 3c63350b605..3d4e7ad02cb 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2904,21 +2904,27 @@ void Player::GiveLevel(uint8 level) uint32 basehp = 0, basemana = 0; sObjectMgr->GetPlayerClassLevelInfo(getClass(), level, basehp, basemana); - // send levelup info to client - WorldPacket data(SMSG_LEVELUP_INFO, (4+4+MAX_POWERS_PER_CLASS*4+MAX_STATS*4)); - data << uint32(level); - data << uint32(int32(basehp) - int32(GetCreateHealth())); - // for (int i = 0; i < MAX_STORED_POWERS; ++i) // Powers loop (0-10) - data << uint32(int32(basemana) - int32(GetCreateMana())); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - // end for - for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) // Stats loop (0-4) - data << uint32(int32(info.stats[i]) - GetCreateStat(Stats(i))); + WorldPackets::Misc::LevelUpInfo packet; + packet.Level = level; + packet.HealthDelta = int32(basehp) - int32(GetCreateHealth()); + + /// @todo find some better solution + // for (int i = 0; i < MAX_STORED_POWERS; ++i) + packet.PowerDelta[0] = int32(basemana) - int32(GetCreateMana()); + packet.PowerDelta[1] = 0; + packet.PowerDelta[2] = 0; + packet.PowerDelta[3] = 0; + packet.PowerDelta[4] = 0; + packet.PowerDelta[5] = 0; - GetSession()->SendPacket(&data); + for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) + packet.StatDelta[i] = int32(info.stats[i]) - GetCreateStat(Stats(i)); + + uint32 const* rowLevels = (getClass() != CLASS_DEATH_KNIGHT) ? DefaultTalentRowLevels : DKTalentRowLevels; + + packet.Cp = std::find(rowLevels, rowLevels + MAX_TALENT_TIERS, level) != (rowLevels + MAX_TALENT_TIERS); + + GetSession()->SendPacket(packet.Write()); SetUInt32Value(PLAYER_NEXT_LEVEL_XP, sObjectMgr->GetXPForLevel(level)); @@ -26637,9 +26643,6 @@ void Player::SendSupercededSpell(uint32 oldSpell, uint32 newSpell) uint32 Player::CalculateTalentsTiers() const { - static uint32 const DefaultTalentRowLevels[MAX_TALENT_TIERS] = { 15, 30, 45, 60, 75, 90, 100 }; - static uint32 const DKTalentRowLevels[MAX_TALENT_TIERS] = { 57, 58, 59, 60, 75, 90, 100 }; - uint32 const* rowLevels = (getClass() != CLASS_DEATH_KNIGHT) ? DefaultTalentRowLevels : DKTalentRowLevels; for (uint32 i = MAX_TALENT_TIERS; i; --i) if (getLevel() >= rowLevels[i - 1]) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index a2d5ed72bd8..9d05aad8304 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1285,6 +1285,9 @@ private: bool _isPvP; }; +static uint32 const DefaultTalentRowLevels[MAX_TALENT_TIERS] = { 15, 30, 45, 60, 75, 90, 100 }; +static uint32 const DKTalentRowLevels[MAX_TALENT_TIERS] = { 57, 58, 59, 60, 75, 90, 100 }; + struct PlayerTalentInfo { PlayerTalentInfo() : diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index e273de90b7f..b597e6e5de2 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -338,3 +338,19 @@ WorldPacket const* WorldPackets::Misc::ExplorationExperience::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Misc::LevelUpInfo::Write() +{ + _worldPacket << int32(Level); + _worldPacket << int32(HealthDelta); + + for (int32 power : PowerDelta) + _worldPacket << power; + + for (int32 stat : StatDelta) + _worldPacket << stat; + + _worldPacket << int32(Cp); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index 08917034933..5511660eced 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -479,6 +479,20 @@ namespace WorldPackets int32 Experience = 0; int32 AreaID = 0; }; + + class LevelUpInfo final : public ServerPacket + { + public: + LevelUpInfo() : ServerPacket(SMSG_LEVELUP_INFO, 56) { } + + WorldPacket const* Write() override; + + int32 Level = 0; + int32 HealthDelta = 0; + std::array<int32, 6> PowerDelta; + std::array<int32, MAX_STATS> StatDelta; + int32 Cp = 0; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 0240f67dbab..b45d2abe6a4 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1361,7 +1361,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARNED_DANCE_MOVES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARNED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARN_TALENT_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEVELUP_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEVELUP_INFO, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_BOOT_PLAYER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_BOOT_PROPOSAL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_DISABLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index ade04c51721..04c3c6238e9 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -1295,7 +1295,7 @@ enum OpcodeServer : uint32 SMSG_LEARNED_DANCE_MOVES = 0xBADD, SMSG_LEARNED_SPELLS = 0x08E9, SMSG_LEARN_TALENT_FAILED = 0xBADD, - SMSG_LEVELUP_INFO = 0xBADD, + SMSG_LEVELUP_INFO = 0x092C, SMSG_LFG_BOOT_PLAYER = 0xBADD, SMSG_LFG_BOOT_PROPOSAL_UPDATE = 0xBADD, SMSG_LFG_DISABLED = 0xBADD, |