aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp37
-rw-r--r--src/server/game/Entities/Player/Player.h3
-rw-r--r--src/server/game/Server/Packets/MiscPackets.cpp16
-rw-r--r--src/server/game/Server/Packets/MiscPackets.h14
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h2
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,