mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-21 09:44:45 +01:00
Core/Spells: Fix orientation- and targeting-related issues if the creature isn't currently engaged in combat. (#17120)
Also disable spell focus system for vehicle control auras. Closes #16572 Closes #17016
This commit is contained in:
@@ -605,8 +605,6 @@ m_caster((info->HasAttribute(SPELL_ATTR6_CAST_BY_CHARMER) && caster->GetCharmerO
|
||||
//Auto Shot & Shoot (wand)
|
||||
m_autoRepeat = m_spellInfo->IsAutoRepeatRangedSpell();
|
||||
|
||||
m_isDelayedInstantCast = false;
|
||||
|
||||
m_runesState = 0;
|
||||
m_powerCost = 0; // setup to correct value in Spell::prepare, must not be used before.
|
||||
m_casttime = 0; // setup to correct value in Spell::prepare, must not be used before.
|
||||
@@ -2984,21 +2982,9 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered
|
||||
if (!(IsNextMeleeSwingSpell() || IsAutoRepeat() || _triggeredCastFlags & TRIGGERED_IGNORE_SET_FACING))
|
||||
{
|
||||
if (m_targets.GetObjectTarget() && m_caster != m_targets.GetObjectTarget())
|
||||
{
|
||||
if (m_caster->ToCreature()->FocusTarget(this, m_targets.GetObjectTarget()))
|
||||
{
|
||||
m_isDelayedInstantCast = true;
|
||||
m_timer = 100; // 100ms delay ensures client has updated creature orientation when cast goes off
|
||||
}
|
||||
}
|
||||
m_caster->ToCreature()->FocusTarget(this, m_targets.GetObjectTarget());
|
||||
else if (m_spellInfo->HasAttribute(SPELL_ATTR5_DONT_TURN_DURING_CAST))
|
||||
{
|
||||
if (m_caster->ToCreature()->FocusTarget(this, nullptr))
|
||||
{
|
||||
m_isDelayedInstantCast = true;
|
||||
m_timer = 100;
|
||||
}
|
||||
}
|
||||
m_caster->ToCreature()->FocusTarget(this, nullptr);
|
||||
}
|
||||
|
||||
// don't allow channeled spells / spells with cast time to be cast while moving
|
||||
@@ -3045,14 +3031,13 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered
|
||||
}
|
||||
|
||||
m_caster->SetCurrentCastSpell(this);
|
||||
if (!m_isDelayedInstantCast)
|
||||
SendSpellStart();
|
||||
SendSpellStart();
|
||||
|
||||
if (!(_triggeredCastFlags & TRIGGERED_IGNORE_GCD))
|
||||
TriggerGlobalCooldown();
|
||||
|
||||
//item: first cast may destroy item and second cast causes crash
|
||||
if (!m_casttime && !m_isDelayedInstantCast && !m_spellInfo->StartRecoveryTime && !m_castItemGUID && GetCurrentContainer() == CURRENT_GENERIC_SPELL)
|
||||
if (!m_casttime && !m_spellInfo->StartRecoveryTime && !m_castItemGUID && GetCurrentContainer() == CURRENT_GENERIC_SPELL)
|
||||
cast(true);
|
||||
}
|
||||
}
|
||||
@@ -3061,9 +3046,6 @@ void Spell::cancel()
|
||||
{
|
||||
if (m_spellState == SPELL_STATE_FINISHED)
|
||||
return;
|
||||
// delayed instant casts are used for client-side visual orientation; they are treated as instant for all intents and purposes server-side, and thus cannot be interrupted by another cast
|
||||
if (m_isDelayedInstantCast)
|
||||
return;
|
||||
|
||||
uint32 oldState = m_spellState;
|
||||
m_spellState = SPELL_STATE_FINISHED;
|
||||
@@ -3133,9 +3115,6 @@ void Spell::cast(bool skipCheck)
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_isDelayedInstantCast)
|
||||
SendSpellStart();
|
||||
|
||||
if (Player* playerCaster = m_caster->ToPlayer())
|
||||
{
|
||||
// now that we've done the basic check, now run the scripts
|
||||
@@ -3220,10 +3199,7 @@ void Spell::cast(bool skipCheck)
|
||||
if (m_caster->GetTypeId() == TYPEID_UNIT && !m_caster->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED))
|
||||
if (!m_spellInfo->HasAttribute(SPELL_ATTR5_DONT_TURN_DURING_CAST))
|
||||
if (WorldObject* objTarget = m_targets.GetObjectTarget())
|
||||
{
|
||||
m_caster->SetInFront(objTarget);
|
||||
m_caster->SetFacingToObject(objTarget);
|
||||
}
|
||||
|
||||
SelectSpellTargets();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user