diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 44e39f006f..3c8b090e54 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6559,13 +6559,14 @@ int32 Unit::HealBySpell(HealInfo& healInfo, bool critical /*= false*/) void Unit::SendEnergizeSpellLog(Unit* victim, uint32 spellId, int32 damage, Powers powerType) { - WorldPacket data(SMSG_SPELLENERGIZELOG, (8+8+4+4+4+1)); - data << victim->GetPackGUID(); - data << GetPackGUID(); - data << uint32(spellId); - data << uint32(powerType); - data << int32(damage); - SendMessageToSet(&data, true); + WorldPackets::CombatLog::SpellEnergizeLog packet; + packet.TargetGUID = victim->GetGUID(); + packet.CasterGUID = GetGUID(); + packet.SpellID = spellId; + packet.Amount = damage; + packet.Type = powerType; + + SendMessageToSet(packet.Write(), true); } void Unit::EnergizeBySpell(Unit* victim, uint32 spellId, int32 damage, Powers powerType) @@ -6576,10 +6577,9 @@ void Unit::EnergizeBySpell(Unit* victim, uint32 spellId, int32 damage, Powers po void Unit::EnergizeBySpell(Unit* victim, SpellInfo const* spellInfo, int32 damage, Powers powerType) { - SendEnergizeSpellLog(victim, spellInfo->Id, damage, powerType); - // needs to be called after sending spell log - victim->ModifyPower(powerType, damage); + victim->ModifyPower(powerType, damage, false); victim->GetThreatManager().ForwardThreatForAssistingMe(this, float(damage) / 2, spellInfo, true); + SendEnergizeSpellLog(victim, spellInfo->Id, damage, powerType); } uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, uint8 effIndex, uint32 stack) const @@ -8706,7 +8706,7 @@ int32 Unit::GetHealthGain(int32 dVal) } // returns negative amount on power reduction -int32 Unit::ModifyPower(Powers power, int32 dVal) +int32 Unit::ModifyPower(Powers power, int32 dVal, bool withPowerUpdate /*= true*/) { int32 gain = 0; @@ -8718,7 +8718,7 @@ int32 Unit::ModifyPower(Powers power, int32 dVal) int32 val = dVal + curPower; if (val <= GetMinPower(power)) { - SetPower(power, GetMinPower(power)); + SetPower(power, GetMinPower(power), withPowerUpdate); return -curPower; } @@ -8726,12 +8726,12 @@ int32 Unit::ModifyPower(Powers power, int32 dVal) if (val < maxPower) { - SetPower(power, val); + SetPower(power, val, withPowerUpdate); gain = val - curPower; } else if (curPower != maxPower) { - SetPower(power, maxPower); + SetPower(power, maxPower, withPowerUpdate); gain = maxPower - curPower; } @@ -9894,7 +9894,7 @@ int32 Unit::GetMaxPower(Powers power) const return GetInt32Value(UNIT_FIELD_MAXPOWER1 + powerIndex); } -void Unit::SetPower(Powers power, int32 val) +void Unit::SetPower(Powers power, int32 val, bool withPowerUpdate /*= true*/) { uint32 powerIndex = GetPowerIndex(power); if (powerIndex == MAX_POWERS) @@ -9906,7 +9906,7 @@ void Unit::SetPower(Powers power, int32 val) SetInt32Value(UNIT_FIELD_POWER1 + powerIndex, val); - if (IsInWorld()) + if (IsInWorld() && withPowerUpdate) { WorldPackets::Combat::PowerUpdate packet; packet.Guid = GetGUID(); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 47ce137fd1..0bddd5c67e 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1087,7 +1087,7 @@ class TC_GAME_API Unit : public WorldObject int32 GetMinPower(Powers power) const { return power == POWER_ECLIPSE ? -100 : 0; } int32 GetMaxPower(Powers power) const; int32 CountPctFromMaxPower(Powers power, int32 pct) const { return CalculatePct(GetMaxPower(power), pct); } - void SetPower(Powers power, int32 val); + void SetPower(Powers power, int32 val, bool withPowerUpdate = true); void SetMaxPower(Powers power, int32 val); void SetPowerBarID(uint32 id) { _powerBarId = id; } void Regenerate(Powers powerType, uint32 diff); @@ -1095,7 +1095,7 @@ class TC_GAME_API Unit : public WorldObject inline void SetFullPower(Powers power) { SetPower(power, GetMaxPower(power)); } // returns the change in power - int32 ModifyPower(Powers power, int32 val); + int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate = true); int32 ModifyPowerPct(Powers power, float pct, bool apply = true); float GetPowerRegen(Powers powerType, bool isInCombat) const; diff --git a/src/server/game/Server/Packets/CombatLogPackets.cpp b/src/server/game/Server/Packets/CombatLogPackets.cpp index 3809e49d59..8bbd147bf0 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.cpp +++ b/src/server/game/Server/Packets/CombatLogPackets.cpp @@ -68,3 +68,14 @@ WorldPacket const* WorldPackets::CombatLog::AttackerStateUpdate::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::CombatLog::SpellEnergizeLog::Write() +{ + _worldPacket << TargetGUID.WriteAsPacked(); + _worldPacket << CasterGUID.WriteAsPacked(); + _worldPacket << int32(SpellID); + _worldPacket << int32(Type); + _worldPacket << int32(Amount); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/CombatLogPackets.h b/src/server/game/Server/Packets/CombatLogPackets.h index 60c0b60df2..9495a5bb1e 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.h +++ b/src/server/game/Server/Packets/CombatLogPackets.h @@ -73,6 +73,20 @@ namespace WorldPackets UnkAttackerState UnkState; float Unk = 0.0f; }; + + class SpellEnergizeLog final : public ServerPacket + { + public: + SpellEnergizeLog() : ServerPacket(SMSG_SPELL_ENERGIZE_LOG, 8 + 8 + 4 + 4 + 4) { } + + WorldPacket const* Write() override; + + ObjectGuid CasterGUID; + ObjectGuid TargetGUID; + int32 SpellID = 0; + int32 Type = 0; + int32 Amount = 0; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index be2e6c27fd..8d85096461 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1221,7 +1221,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLBREAKLOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLDAMAGESHIELD, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLDISPELLOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLENERGIZELOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_ENERGIZE_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLHEALLOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLINSTAKILLLOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLINTERRUPTLOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 070343b281..c6c8c207b1 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -1180,7 +1180,7 @@ enum OpcodeServer SMSG_SPELLBREAKLOG = 0x6B17, SMSG_SPELLDAMAGESHIELD = 0x2927, SMSG_SPELLDISPELLOG = 0x4516, - SMSG_SPELLENERGIZELOG = 0x0414, + SMSG_SPELL_ENERGIZE_LOG = 0x0414, SMSG_SPELLHEALLOG = 0x2816, SMSG_SPELLINSTAKILLLOG = 0x6216, SMSG_SPELLINTERRUPTLOG = 0x1DA7,