fix(Core/SAI): implement response for ranged mode on interrupt (#24175)

This commit is contained in:
killerwife
2025-12-21 14:09:25 +01:00
committed by GitHub
parent ec6d3b070e
commit f0d9704d91
2 changed files with 28 additions and 0 deletions
@@ -81,6 +81,7 @@ SmartAI::SmartAI(Creature* c) : CreatureAI(c)
_currentRangeMode = false; _currentRangeMode = false;
_attackDistance = 0.f; _attackDistance = 0.f;
_mainSpellId = 0;
} }
bool SmartAI::IsAIControlled() const bool SmartAI::IsAIControlled() const
@@ -1122,6 +1123,7 @@ void SmartAI::SetMainSpell(uint32 spellId)
if (maxRange <= NOMINAL_MELEE_RANGE) if (maxRange <= NOMINAL_MELEE_RANGE)
return; return;
_mainSpellId = spellId;
_attackDistance = std::max(maxRange - NOMINAL_MELEE_RANGE, 0.0f); _attackDistance = std::max(maxRange - NOMINAL_MELEE_RANGE, 0.0f);
_currentRangeMode = true; _currentRangeMode = true;
} }
@@ -1222,6 +1224,27 @@ void SmartAI::DistancingEnded()
_pendingDistancing = 0.f; _pendingDistancing = 0.f;
} }
bool SmartAI::IsMainSpellPrevented(SpellInfo const* spellInfo) const
{
if (me->HasSpellCooldown(spellInfo->Id))
return true;
if (spellInfo->PreventionType == SPELL_PREVENTION_TYPE_SILENCE && me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED))
return true;
if (spellInfo->PreventionType == SPELL_PREVENTION_TYPE_PACIFY && me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED))
return true;
return false;
}
void SmartAI::OnSpellCastFinished(SpellInfo const* spell, SpellFinishReason reason)
{
CreatureAI::OnSpellCastFinished(spell, reason);
if (reason == SPELL_FINISHED_CANCELED && _mainSpellId == spell->Id)
if (_currentRangeMode && IsMainSpellPrevented(spell))
SetCurrentRangeMode(false);
}
void SmartGameObjectAI::SummonedCreatureDies(Creature* summon, Unit* /*killer*/) void SmartGameObjectAI::SummonedCreatureDies(Creature* summon, Unit* /*killer*/)
{ {
GetScript()->ProcessEventsFor(SMART_EVENT_SUMMONED_UNIT_DIES, summon); GetScript()->ProcessEventsFor(SMART_EVENT_SUMMONED_UNIT_DIES, summon);
@@ -214,6 +214,10 @@ public:
void DistancingEnded() override; void DistancingEnded() override;
bool IsMainSpellPrevented(SpellInfo const* spellInfo) const;
void OnSpellCastFinished(SpellInfo const* spell, SpellFinishReason reason) override;
private: private:
bool mIsCharmed; bool mIsCharmed;
uint32 mFollowCreditType; uint32 mFollowCreditType;
@@ -265,6 +269,7 @@ private:
bool _currentRangeMode; bool _currentRangeMode;
float _attackDistance; float _attackDistance;
float _pendingDistancing; float _pendingDistancing;
uint32 _mainSpellId;
}; };
class SmartGameObjectAI : public GameObjectAI class SmartGameObjectAI : public GameObjectAI