diff options
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 45 | ||||
-rw-r--r-- | src/server/game/Server/Packets/CombatLogPackets.cpp | 18 | ||||
-rw-r--r-- | src/server/game/Server/Packets/CombatLogPackets.h | 17 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 |
4 files changed, 64 insertions, 18 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 8a2fc56eeff..65827ede11b 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1988,8 +1988,7 @@ void Unit::HandleEmoteCommand(Emote emoteId, Player* target /*=nullptr*/, Trinit AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(healInfo.GetTarget()->GetGUID()); if (!aurApp) continue; - - if (!(absorbAurEff->GetMiscValue() & healInfo.GetSpellInfo()->GetSchoolMask())) + if (!(absorbAurEff->GetMiscValue() & healInfo.GetSchoolMask())) continue; // get amount which can be still absorbed by the aura @@ -2005,26 +2004,38 @@ void Unit::HandleEmoteCommand(Emote emoteId, Player* target /*=nullptr*/, Trinit absorbAurEff->GetBase()->CallScriptEffectAbsorbHandlers(absorbAurEff, aurApp, healInfo, tempAbsorb, defaultPrevented); currentAbsorb = tempAbsorb; - if (defaultPrevented) - continue; + if (!defaultPrevented) + { + // absorb must be smaller than the heal itself + currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(healInfo.GetHeal())); - // currentAbsorb - damage can be absorbed by shield - // If need absorb less damage - currentAbsorb = std::min<int32>(healInfo.GetHeal(), currentAbsorb); + healInfo.AbsorbHeal(currentAbsorb); - healInfo.AbsorbHeal(currentAbsorb); + tempAbsorb = currentAbsorb; + absorbAurEff->GetBase()->CallScriptEffectAfterAbsorbHandlers(absorbAurEff, aurApp, healInfo, tempAbsorb); - tempAbsorb = currentAbsorb; - absorbAurEff->GetBase()->CallScriptEffectAfterAbsorbHandlers(absorbAurEff, aurApp, healInfo, tempAbsorb); + // Check if our aura is using amount to count damage + if (absorbAurEff->GetAmount() >= 0) + { + // Reduce shield amount + absorbAurEff->ChangeAmount(absorbAurEff->GetAmount() - currentAbsorb); + // Aura cannot absorb anything more - remove it + if (absorbAurEff->GetAmount() <= 0) + absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL); + } + } - // Check if our aura is using amount to count heal - if (absorbAurEff->GetAmount() >= 0) + if (currentAbsorb) { - // Reduce shield amount - absorbAurEff->ChangeAmount(absorbAurEff->GetAmount() - currentAbsorb); - // Aura cannot absorb anything more - remove it - if (absorbAurEff->GetAmount() <= 0) - existExpired = true; + WorldPackets::CombatLog::SpellHealAbsorbLog absorbLog; + absorbLog.Healer = healInfo.GetHealer() ? healInfo.GetHealer()->GetGUID() : ObjectGuid::Empty; + absorbLog.Target = healInfo.GetTarget()->GetGUID(); + absorbLog.AbsorbCaster = absorbAurEff->GetBase()->GetCasterGUID(); + absorbLog.AbsorbedSpellID = healInfo.GetSpellInfo() ? healInfo.GetSpellInfo()->Id : 0; + absorbLog.AbsorbSpellID = absorbAurEff->GetId(); + absorbLog.Absorbed = currentAbsorb; + absorbLog.OriginalHeal = healInfo.GetOriginalHeal(); + healInfo.GetTarget()->SendMessageToSet(absorbLog.Write(), true); } } diff --git a/src/server/game/Server/Packets/CombatLogPackets.cpp b/src/server/game/Server/Packets/CombatLogPackets.cpp index 839581a6bf1..938c77b40b3 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.cpp +++ b/src/server/game/Server/Packets/CombatLogPackets.cpp @@ -424,3 +424,21 @@ WorldPacket const* WorldPackets::CombatLog::SpellAbsorbLog::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::CombatLog::SpellHealAbsorbLog::Write() +{ + _worldPacket << Target; + _worldPacket << AbsorbCaster; + _worldPacket << Healer; + _worldPacket << int32(AbsorbSpellID); + _worldPacket << int32(AbsorbedSpellID); + _worldPacket << int32(Absorbed); + _worldPacket << int32(OriginalHeal); + _worldPacket.WriteBit(ContentTuning.has_value()); + _worldPacket.FlushBits(); + + if (ContentTuning) + _worldPacket << *ContentTuning; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/CombatLogPackets.h b/src/server/game/Server/Packets/CombatLogPackets.h index 1da43fef7e1..67e064a9315 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.h +++ b/src/server/game/Server/Packets/CombatLogPackets.h @@ -329,6 +329,23 @@ namespace WorldPackets int32 OriginalDamage = 0; bool Unk = false; }; + + class SpellHealAbsorbLog final : public ServerPacket + { + public: + SpellHealAbsorbLog() : ServerPacket(SMSG_SPELL_HEAL_ABSORB_LOG, 100) { } + + WorldPacket const* Write() override; + + ObjectGuid Healer; + ObjectGuid Target; + ObjectGuid AbsorbCaster; + int32 AbsorbSpellID = 0; + int32 AbsorbedSpellID = 0; + int32 Absorbed = 0; + int32 OriginalHeal = 0; + Optional<Spells::ContentTuningParams> ContentTuning; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 2765803348a..c9e1bb8b16a 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1943,7 +1943,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILURE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILURE_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_GO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_HEAL_ABSORB_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_HEAL_ABSORB_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_HEAL_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_INSTAKILL_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_INTERRUPT_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); |