aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp45
-rw-r--r--src/server/game/Server/Packets/CombatLogPackets.cpp18
-rw-r--r--src/server/game/Server/Packets/CombatLogPackets.h17
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
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);