Core/Auras: Implemented SPELL_AURA_TRIGGER_SPELL_ON_HEALTH_PCT

Port From (https://github.com/TrinityCore/TrinityCore/commit/b221f4b37251db2206dd14d46c00f1b6f1f16480)
This commit is contained in:
hondacrx
2022-01-07 13:46:21 -05:00
parent 49f32780dc
commit 5bb553b0e3
3 changed files with 68 additions and 9 deletions
@@ -545,6 +545,18 @@ namespace Framework.Constants
RealOrReapplyMask = (Reapply | Real)
}
public enum AuraTriggerOnPowerChangeDirection
{
Gain = 0,
Loss = 1
}
public enum AuraTriggerOnHealthChangeDirection
{
Above = 0,
Below = 1,
}
// Diminishing Returns Types
public enum DiminishingReturnsType
{
@@ -578,10 +590,4 @@ namespace Framework.Constants
Level4 = 3,
TauntImmune = 4
}
public enum AuraTriggerOnPowerChangeDirection
{
Gain = 0,
Loss = 1
}
}
+29 -3
View File
@@ -242,13 +242,13 @@ namespace Game.Entities
_spellHistory.Update();
}
public void HandleEmoteCommand(Emote animId, Player target = null, uint[] spellVisualKitIds = null)
public void HandleEmoteCommand(Emote emoteId, Player target = null, uint[] spellVisualKitIds = null)
{
EmoteMessage packet = new();
packet.Guid = GetGUID();
packet.EmoteID = (uint)animId;
packet.EmoteID = (uint)emoteId;
var emotesEntry = CliDB.EmotesStorage.LookupByKey(animId);
var emotesEntry = CliDB.EmotesStorage.LookupByKey(emoteId);
if (emotesEntry != null && spellVisualKitIds != null)
if (emotesEntry.AnimId == (uint)Anim.MountSpecial || emotesEntry.AnimId == (uint)Anim.MountSelfSpecial)
packet.SpellVisualKitIDs.AddRange(spellVisualKitIds);
@@ -2880,6 +2880,32 @@ namespace Game.Entities
return gain;
}
void TriggerOnHealthChangeAuras(ulong oldVal, ulong newVal)
{
foreach (AuraEffect effect in GetAuraEffectsByType(AuraType.TriggerSpellOnHealthPct))
{
int triggerHealthPct = effect.GetAmount();
uint triggerSpell = effect.GetSpellEffectInfo().TriggerSpell;
ulong threshold = CountPctFromMaxHealth(triggerHealthPct);
switch ((AuraTriggerOnHealthChangeDirection)effect.GetMiscValue())
{
case AuraTriggerOnHealthChangeDirection.Above:
if (newVal < threshold || oldVal > threshold)
continue;
break;
case AuraTriggerOnHealthChangeDirection.Below:
if (newVal > threshold || oldVal < threshold)
continue;
break;
default:
break;
}
CastSpell(this, triggerSpell, new CastSpellExtraArgs(effect));
}
}
public bool IsImmuneToAll() { return IsImmuneToPC() && IsImmuneToNPC(); }
public void SetImmuneToAll(bool apply, bool keepCombat)
+27
View File
@@ -3538,6 +3538,33 @@ namespace Game.Spells
target.ModifyPower(powerType, change);
}
[AuraEffectHandler(AuraType.TriggerSpellOnHealthPct)]
void HandleTriggerSpellOnHealthPercent(AuraApplication aurApp, AuraEffectHandleModes mode, bool apply)
{
if (!mode.HasFlag(AuraEffectHandleModes.Real) || !apply)
return;
Unit target = aurApp.GetTarget();
int thresholdPct = GetAmount();
uint triggerSpell = GetSpellEffectInfo().TriggerSpell;
switch ((AuraTriggerOnHealthChangeDirection)GetMiscValue())
{
case AuraTriggerOnHealthChangeDirection.Above:
if (!target.HealthAbovePct(thresholdPct))
return;
break;
case AuraTriggerOnHealthChangeDirection.Below:
if (!target.HealthBelowPct(thresholdPct))
return;
break;
default:
break;
}
target.CastSpell(target, triggerSpell, new CastSpellExtraArgs(this));
}
/********************************/
/*** FIGHT ***/
/********************************/