diff --git a/Source/Game/AI/CoreAI/CombatAI.cs b/Source/Game/AI/CoreAI/CombatAI.cs
index 234010653..d15f9a306 100644
--- a/Source/Game/AI/CoreAI/CombatAI.cs
+++ b/Source/Game/AI/CoreAI/CombatAI.cs
@@ -51,7 +51,7 @@ namespace Game.AI
}
}
- public override void EnterCombat(Unit victim)
+ public override void JustEngagedWith(Unit victim)
{
foreach (var id in Spells)
{
@@ -134,7 +134,7 @@ namespace Game.AI
AttackStartCaster(victim, _attackDist);
}
- public override void EnterCombat(Unit victim)
+ public override void JustEngagedWith(Unit victim)
{
if (Spells.Empty())
return;
diff --git a/Source/Game/AI/CoreAI/CreatureAI.cs b/Source/Game/AI/CoreAI/CreatureAI.cs
index ec45c9214..7f6c73417 100644
--- a/Source/Game/AI/CoreAI/CreatureAI.cs
+++ b/Source/Game/AI/CoreAI/CreatureAI.cs
@@ -408,11 +408,8 @@ namespace Game.AI
me.DoImmediateBoundaryCheck();
}
- ///
- /// Called for reaction when initially engaged
- ///
- ///
- public virtual void EnterCombat(Unit victim) { }
+ // Called for reaction when initially engaged - this will always happen _after_ JustEnteredCombat
+ public virtual void JustEngagedWith(Unit who) { }
// Called when the creature is killed
public virtual void JustDied(Unit killer) { }
diff --git a/Source/Game/AI/CoreAI/UnitAI.cs b/Source/Game/AI/CoreAI/UnitAI.cs
index 0b6a0c689..3efecdd8f 100644
--- a/Source/Game/AI/CoreAI/UnitAI.cs
+++ b/Source/Game/AI/CoreAI/UnitAI.cs
@@ -478,6 +478,13 @@ namespace Game.AI
public virtual void SetGUID(ObjectGuid guid, int id = 0) { }
public virtual ObjectGuid GetGUID(int id = 0) { return ObjectGuid.Empty; }
+ // Called when the unit enters combat
+ // (NOTE: Creature engage logic should NOT be here, but in JustEngagedWith, which happens once threat is established!)
+ public virtual void JustEnteredCombat(Unit who) { }
+
+ // Called when the unit leaves combat
+ public virtual void JustExitedCombat() { }
+
public virtual void DamageDealt(Unit victim, ref uint damage, DamageEffectType damageType) { }
public virtual void DamageTaken(Unit attacker, ref uint damage) { }
public virtual void HealReceived(Unit by, uint addhealth) { }
diff --git a/Source/Game/AI/ScriptedAI/ScriptedAI.cs b/Source/Game/AI/ScriptedAI/ScriptedAI.cs
index 0bc9e3094..470f9f7c1 100644
--- a/Source/Game/AI/ScriptedAI/ScriptedAI.cs
+++ b/Source/Game/AI/ScriptedAI/ScriptedAI.cs
@@ -48,7 +48,7 @@ namespace Game.AI
DoStartNoMovement(target);
}
- // Called before EnterCombat even before the creature is in combat.
+ // Called before JustEngagedWith even before the creature is in combat.
public override void AttackStart(Unit target)
{
if (IsCombatMovementAllowed())
@@ -411,7 +411,7 @@ namespace Game.AI
public override void Reset() { }
//Called at creature aggro either by MoveInLOS or Attack Start
- public override void EnterCombat(Unit victim) { }
+ public override void JustEngagedWith(Unit victim) { }
public bool HealthBelowPct(int pct) { return me.HealthBelowPct(pct); }
public bool HealthAbovePct(int pct) { return me.HealthAbovePct(pct); }
@@ -502,7 +502,7 @@ namespace Game.AI
instance.SetBossState(_bossId, EncounterState.Done);
}
- public void _EnterCombat()
+ public void _JustEngagedWith()
{
if (instance != null)
{
@@ -602,7 +602,7 @@ namespace Game.AI
public virtual void ScheduleTasks() { }
public override void Reset() { _Reset(); }
- public override void EnterCombat(Unit who) { _EnterCombat(); }
+ public override void JustEngagedWith(Unit who) { _JustEngagedWith(); }
public override void JustDied(Unit killer) { _JustDied(); }
public override void JustReachedHome() { _JustReachedHome(); }
@@ -635,7 +635,7 @@ namespace Game.AI
summons.DespawnAll();
}
- void _EnterCombat()
+ void _JustEngagedWith()
{
Unit target = SelectTarget(SelectAggroTarget.Random, 0, 0.0f, true);
if (target)
@@ -684,7 +684,7 @@ namespace Game.AI
public override void Reset() { _Reset(); }
- public override void EnterCombat(Unit who) { _EnterCombat(); }
+ public override void JustEngagedWith(Unit who) { _JustEngagedWith(); }
public override void JustDied(Unit killer) { _JustDied(); }
}
diff --git a/Source/Game/AI/SmartScripts/SmartAI.cs b/Source/Game/AI/SmartScripts/SmartAI.cs
index e5044b618..654f807a5 100644
--- a/Source/Game/AI/SmartScripts/SmartAI.cs
+++ b/Source/Game/AI/SmartScripts/SmartAI.cs
@@ -609,7 +609,7 @@ namespace Game.AI
me.GetMotionMaster().MoveIdle(); // wait the order of leader
}
- public override void EnterCombat(Unit victim)
+ public override void JustEngagedWith(Unit victim)
{
if (IsAIControlled())
me.InterruptNonMeleeSpells(false); // must be before ProcessEvents
diff --git a/Source/Game/Entities/Unit/Unit.Combat.cs b/Source/Game/Entities/Unit/Unit.Combat.cs
index 0250bb075..f1670b3f8 100644
--- a/Source/Game/Entities/Unit/Unit.Combat.cs
+++ b/Source/Game/Entities/Unit/Unit.Combat.cs
@@ -1443,7 +1443,7 @@ namespace Game.Entities
if (enemy != null)
{
if (IsAIEnabled)
- creature.GetAI().EnterCombat(enemy);
+ creature.GetAI().JustEngagedWith(enemy);
if (creature.GetFormation() != null)
creature.GetFormation().MemberEngagingTarget(creature, enemy);
diff --git a/Source/Scripts/Pets/Generic.cs b/Source/Scripts/Pets/Generic.cs
index 403451642..19defb38a 100644
--- a/Source/Scripts/Pets/Generic.cs
+++ b/Source/Scripts/Pets/Generic.cs
@@ -49,7 +49,7 @@ namespace Scripts.Pets
me.GetMotionMaster().MoveFollow(owner, 0.0f, 0.0f);
}
- public override void EnterCombat(Unit who) { }
+ public override void JustEngagedWith(Unit who) { }
public override void UpdateAI(uint diff) { }
diff --git a/Source/Scripts/Pets/Hunter.cs b/Source/Scripts/Pets/Hunter.cs
index c7ecf318b..0a238e26d 100644
--- a/Source/Scripts/Pets/Hunter.cs
+++ b/Source/Scripts/Pets/Hunter.cs
@@ -43,7 +43,7 @@ namespace Scripts.Pets
{
public npc_pet_hunter_snake_trap(Creature creature) : base(creature) { }
- public override void EnterCombat(Unit who) { }
+ public override void JustEngagedWith(Unit who) { }
public override void Reset()
{
diff --git a/Source/Scripts/Pets/Mage.cs b/Source/Scripts/Pets/Mage.cs
index b0bfba300..e990b2fc8 100644
--- a/Source/Scripts/Pets/Mage.cs
+++ b/Source/Scripts/Pets/Mage.cs
@@ -151,7 +151,7 @@ namespace Scripts.Pets
owner.CastSpell(me, SpellIds.CloneMe, false);
}
- public override void EnterCombat(Unit victim)
+ public override void JustEngagedWith(Unit victim)
{
if (me.GetVictim() && !me.GetVictim().HasBreakableByDamageCrowdControlAura(me))
{
diff --git a/Source/Scripts/World/EmeraldDragons.cs b/Source/Scripts/World/EmeraldDragons.cs
index 919413bee..71d72950f 100644
--- a/Source/Scripts/World/EmeraldDragons.cs
+++ b/Source/Scripts/World/EmeraldDragons.cs
@@ -231,10 +231,10 @@ namespace Scripts.World.EmeraldDragons
});
}
- public override void EnterCombat(Unit who)
+ public override void JustEngagedWith(Unit who)
{
Talk(TextIds.SayYsondreAggro);
- base.EnterCombat(who);
+ base.JustEngagedWith(who);
}
// Summon druid spirits on 75%, 50% and 25% health
@@ -278,10 +278,10 @@ namespace Scripts.World.EmeraldDragons
});
}
- public override void EnterCombat(Unit who)
+ public override void JustEngagedWith(Unit who)
{
Talk(TextIds.SayLethonAggro);
- base.EnterCombat(who);
+ base.JustEngagedWith(who);
}
public override void DamageTaken(Unit attacker, ref uint damage)
@@ -361,10 +361,10 @@ namespace Scripts.World.EmeraldDragons
base.KilledUnit(who);
}
- public override void EnterCombat(Unit who)
+ public override void JustEngagedWith(Unit who)
{
Talk(TextIds.SayEmerissAggro);
- base.EnterCombat(who);
+ base.JustEngagedWith(who);
}
public override void DamageTaken(Unit attacker, ref uint damage)
@@ -419,10 +419,10 @@ namespace Scripts.World.EmeraldDragons
});
}
- public override void EnterCombat(Unit who)
+ public override void JustEngagedWith(Unit who)
{
Talk(TextIds.SayTaerarAggro);
- base.EnterCombat(who);
+ base.JustEngagedWith(who);
}
public override void SummonedCreatureDies(Creature summon, Unit killer)
diff --git a/Source/Scripts/World/NpcGuard.cs b/Source/Scripts/World/NpcGuard.cs
index 7dfcbb9e3..9a1c2d72d 100644
--- a/Source/Scripts/World/NpcGuard.cs
+++ b/Source/Scripts/World/NpcGuard.cs
@@ -118,7 +118,7 @@ namespace Scripts.World.NpcGuard
DoReplyToTextEmote(textEmote);
}
- public override void EnterCombat(Unit who)
+ public override void JustEngagedWith(Unit who)
{
if (me.GetEntry() == CreatureIds.CenarionHoldInfantry)
Talk(TextIds.SayGuardSilAggro, who);
@@ -202,7 +202,7 @@ namespace Scripts.World.NpcGuard
_scheduler.CancelAll();
}
- public override void EnterCombat(Unit who)
+ public override void JustEngagedWith(Unit who)
{
ScheduleVanish();
}
diff --git a/Source/Scripts/World/NpcSpecial.cs b/Source/Scripts/World/NpcSpecial.cs
index aef60e8a9..04b309f6a 100644
--- a/Source/Scripts/World/NpcSpecial.cs
+++ b/Source/Scripts/World/NpcSpecial.cs
@@ -619,7 +619,7 @@ namespace Scripts.World.NpcSpecial
me.RemoveNpcFlag(NPCFlags.QuestGiver);
}
- public override void EnterCombat(Unit who) { }
+ public override void JustEngagedWith(Unit who) { }
public override void UpdateAI(uint diff)
{
@@ -719,7 +719,7 @@ namespace Scripts.World.NpcSpecial
}
}
- public override void EnterCombat(Unit who) { }
+ public override void JustEngagedWith(Unit who) { }
public override void ReceiveEmote(Player player, TextEmotes emote)
{
@@ -1038,7 +1038,7 @@ namespace Scripts.World.NpcSpecial
}
}
- public override void EnterCombat(Unit who) { }
+ public override void JustEngagedWith(Unit who) { }
public override void QuestAccept(Player player, Quest quest)
{
@@ -1108,7 +1108,7 @@ namespace Scripts.World.NpcSpecial
}
}
- public override void EnterCombat(Unit who) { }
+ public override void JustEngagedWith(Unit who) { }
public override void SpellHit(Unit caster, SpellInfo spell)
{
@@ -1230,7 +1230,7 @@ namespace Scripts.World.NpcSpecial
me.SetHealth(me.CountPctFromMaxHealth(70));
}
- public override void EnterCombat(Unit who) { }
+ public override void JustEngagedWith(Unit who) { }
public override void SpellHit(Unit caster, SpellInfo spell)
{
@@ -1319,9 +1319,7 @@ namespace Scripts.World.NpcSpecial
me.AddUnitFlag(UnitFlags.NonAttackable);
}
- public override void EnterCombat(Unit who)
- {
- }
+ public override void JustEngagedWith(Unit who) { }
public override void UpdateAI(uint diff)
{
@@ -1463,7 +1461,7 @@ namespace Scripts.World.NpcSpecial
public npc_steam_tonk(Creature creature) : base(creature) { }
public override void Reset() { }
- public override void EnterCombat(Unit who) { }
+ public override void JustEngagedWith(Unit who) { }
public override void OnPossess(bool apply)
{
@@ -1501,7 +1499,7 @@ namespace Scripts.World.NpcSpecial
Initialize();
}
- public override void EnterCombat(Unit who) { }
+ public override void JustEngagedWith(Unit who) { }
public override void AttackStart(Unit who) { }
public override void MoveInLineOfSight(Unit who) { }
@@ -1966,7 +1964,7 @@ namespace Scripts.World.NpcSpecial
me.GetMotionMaster().MoveFollow(owner, SharedConst.PetFollowDist, SharedConst.PetFollowAngle);
}
- public override void EnterCombat(Unit who) { }
+ public override void JustEngagedWith(Unit who) { }
public override void DoAction(int param)
{