diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 32 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MiscPackets.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MiscPackets.h | 13 |
3 files changed, 43 insertions, 16 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 3f9a18b7523..42dfc34c6de 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2593,23 +2593,23 @@ void Player::GiveLevel(uint8 level) PlayerClassLevelInfo classInfo; sObjectMgr->GetPlayerClassLevelInfo(GetClass(), level, &classInfo); - // send levelup info to client - WorldPacket data(SMSG_LEVELUP_INFO, (4+4+MAX_POWERS*4+MAX_STATS*4)); - data << uint32(level); - data << uint32(int32(classInfo.basehealth) - int32(GetCreateHealth())); - // for (int i = 0; i < MAX_POWERS; ++i) // Powers loop (0-6) - data << uint32(int32(classInfo.basemana) - int32(GetCreateMana())); - data << uint32(0); - data << uint32(0); - 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(classInfo.basehealth) - int32(GetCreateHealth()); + + /// @todo find some better solution + // for (int i = 0; i < MAX_POWERS; ++i) + packet.PowerDelta[0] = int32(classInfo.basemana) - int32(GetCreateMana()); + packet.PowerDelta[1] = 0; + packet.PowerDelta[2] = 0; + packet.PowerDelta[3] = 0; + packet.PowerDelta[4] = 0; + packet.PowerDelta[5] = 0; - SendDirectMessage(&data); + for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) + packet.StatDelta[i] = int32(info.stats[i]) - GetCreateStat(Stats(i)); + + SendDirectMessage(packet.Write()); SetUInt32Value(PLAYER_NEXT_LEVEL_XP, sObjectMgr->GetXPForLevel(level)); diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index 63c90f0f934..1c83e7ac109 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -84,6 +84,20 @@ WorldPacket const* WorldPackets::Misc::Weather::Write() return &_worldPacket; } +WorldPacket const* WorldPackets::Misc::LevelUpInfo::Write() +{ + _worldPacket << uint32(Level); + _worldPacket << uint32(HealthDelta); + + for (uint32 power : PowerDelta) + _worldPacket << power; + + for (uint32 stat : StatDelta) + _worldPacket << stat; + + return &_worldPacket; +} + WorldPacket const* WorldPackets::Misc::PlayMusic::Write() { _worldPacket << SoundKitID; diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index 717740b55be..8c7e1957c04 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -128,6 +128,19 @@ namespace WorldPackets WeatherState WeatherID = WeatherState(0); }; + class LevelUpInfo final : public ServerPacket + { + public: + LevelUpInfo() : ServerPacket(SMSG_LEVELUP_INFO, 56) { } + + WorldPacket const* Write() override; + + uint32 Level = 0; + uint32 HealthDelta = 0; + std::array<uint32, MAX_POWERS> PowerDelta = { }; + std::array<uint32, MAX_STATS> StatDelta = { }; + }; + class TC_GAME_API PlayMusic final : public ServerPacket { public: |