diff options
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 9 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 4 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 10 |
3 files changed, 14 insertions, 9 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index e899e5d5930..7625720792b 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -17103,7 +17103,7 @@ bool CharmInfo::IsReturning() return _isReturning; } -void Unit::SetInFront(Unit const* target) +void Unit::SetInFront(WorldObject const* target) { if (!HasUnitState(UNIT_STATE_CANNOT_TURN)) SetOrientation(GetAngle(target)); @@ -17245,16 +17245,19 @@ void Unit::SendMovementCanFlyChange() SendMessageToSet(&data, false); } -void Unit::FocusTarget(Spell const* focusSpell, uint64 target) +void Unit::FocusTarget(Spell const* focusSpell, WorldObject const* target) { // already focused if (_focusSpell) return; _focusSpell = focusSpell; - SetUInt64Value(UNIT_FIELD_TARGET, target); + SetUInt64Value(UNIT_FIELD_TARGET, target->GetGUID()); if (focusSpell->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_DONT_TURN_DURING_CAST) AddUnitState(UNIT_STATE_ROTATING); + + // Set serverside orientation if needed (needs to be after attribute check) + SetInFront(target); } void Unit::ReleaseFocus(Spell const* focusSpell) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index b549802c91c..5dc12dc2ca4 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1658,7 +1658,7 @@ class Unit : public WorldObject virtual bool SetDisableGravity(bool disable, bool packetOnly = false); virtual bool SetHover(bool enable); - void SetInFront(Unit const* target); + void SetInFront(WorldObject const* target); void SetFacingTo(float ori); void SetFacingToObject(WorldObject* object); @@ -2243,7 +2243,7 @@ class Unit : public WorldObject } // Handling caster facing during spellcast - void FocusTarget(Spell const* focusSpell, uint64 target); + void FocusTarget(Spell const* focusSpell, WorldObject const* target); void ReleaseFocus(Spell const* focusSpell); // Movement info diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 6f1aa6e38ad..668bf65fb17 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3072,8 +3072,8 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered // set target for proper facing if ((m_casttime || m_spellInfo->IsChanneled()) && !(_triggeredCastFlags & TRIGGERED_IGNORE_SET_FACING)) - if (m_caster->GetGUID() != m_targets.GetObjectTargetGUID() && m_caster->GetTypeId() == TYPEID_UNIT) - m_caster->FocusTarget(this, m_targets.GetObjectTargetGUID()); + if (m_caster->GetTypeId() == TYPEID_UNIT && m_targets.GetObjectTarget() && m_caster != m_targets.GetObjectTarget()) + m_caster->FocusTarget(this, m_targets.GetObjectTarget()); if (!(_triggeredCastFlags & TRIGGERED_IGNORE_GCD)) TriggerGlobalCooldown(); @@ -3165,10 +3165,12 @@ void Spell::cast(bool skipCheck) if (playerPet->isAlive() && playerPet->isControlled() && (m_targets.GetTargetMask() & TARGET_FLAG_UNIT)) playerPet->AI()->OwnerAttacked(m_targets.GetObjectTarget()->ToUnit()); } + SetExecutedCurrently(true); - if (m_caster->GetTypeId() != TYPEID_PLAYER && m_targets.GetUnitTarget() && m_targets.GetUnitTarget() != m_caster) - m_caster->SetInFront(m_targets.GetUnitTarget()); + if (!(_triggeredCastFlags & TRIGGERED_IGNORE_SET_FACING)) + if (m_caster->GetTypeId() == TYPEID_UNIT && m_targets.GetObjectTarget() && m_caster != m_targets.GetObjectTarget()) + m_caster->SetInFront(m_targets.GetObjectTarget()); // Should this be done for original caster? if (m_caster->GetTypeId() == TYPEID_PLAYER) |