diff --git a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs index a0e271a24..ed13156a3 100644 --- a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs +++ b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs @@ -136,14 +136,12 @@ namespace Game.Entities spellForVisuals = Global.SpellMgr.GetSpellInfo(GetCreateProperties().SpellForVisuals.Value, Difficulty.None); if (spellForVisuals != null) - spellVisual.SpellXSpellVisualID = spellForVisuals.GetSpellXSpellVisualId(); + spellVisual.SpellXSpellVisualID = caster != null ? caster.GetCastSpellXSpellVisualId(spellForVisuals) : spellForVisuals.GetSpellXSpellVisualId(); } if (spellForVisuals != null) SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.SpellForVisuals), spellForVisuals.Id); - SpellCastVisualField spellCastVisual = areaTriggerData.ModifyValue(m_areaTriggerData.SpellVisual); - SetUpdateFieldValue(ref spellCastVisual.SpellXSpellVisualID, spellVisual.SpellXSpellVisualID); - SetUpdateFieldValue(ref spellCastVisual.ScriptVisualID, spellVisual.ScriptVisualID); + SetSpellVisual(spellVisual); if (!IsStaticSpawn()) SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.TimeToTargetScale), GetCreateProperties().TimeToTargetScale != 0 ? GetCreateProperties().TimeToTargetScale : m_areaTriggerData.Duration); @@ -404,6 +402,13 @@ namespace Game.Entities ClearScaleCurve(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.OverrideMoveCurveZ)); } + public void SetSpellVisual(SpellCastVisual visual) + { + SpellCastVisualField spellCastVisual = m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellVisual); + SetUpdateFieldValue(ref spellCastVisual.SpellXSpellVisualID, visual.SpellXSpellVisualID); + SetUpdateFieldValue(ref spellCastVisual.ScriptVisualID, visual.ScriptVisualID); + } + public void SetDuration(int newDuration) { _duration = newDuration; @@ -1449,7 +1454,7 @@ namespace Game.Entities public AreaTriggerOrbitInfo GetOrbit() { return _orbitInfo; } - AreaTriggerFieldData m_areaTriggerData; + public AreaTriggerFieldData m_areaTriggerData; ulong _spawnId; diff --git a/Source/Game/Globals/ObjectAccessor.cs b/Source/Game/Globals/ObjectAccessor.cs index 9e1c542d7..ce9a0650d 100644 --- a/Source/Game/Globals/ObjectAccessor.cs +++ b/Source/Game/Globals/ObjectAccessor.cs @@ -116,7 +116,7 @@ public class ObjectAccessor : Singleton return u.GetMap().GetDynamicObject(guid); } - static AreaTrigger GetAreaTrigger(WorldObject u, ObjectGuid guid) + public static AreaTrigger GetAreaTrigger(WorldObject u, ObjectGuid guid) { return u.GetMap().GetAreaTrigger(guid); } diff --git a/Source/Game/Handlers/SpellHandler.cs b/Source/Game/Handlers/SpellHandler.cs index f6b2d2a89..7fa2f05bc 100644 --- a/Source/Game/Handlers/SpellHandler.cs +++ b/Source/Game/Handlers/SpellHandler.cs @@ -623,6 +623,23 @@ namespace Game _player.SetChannelVisual(new SpellCastVisualField() { SpellXSpellVisualID = spellXspellVisualId }); } + [WorldPacketHandler(ClientOpcodes.UpdateAreaTriggerVisual, Processing = PacketProcessing.Inplace)] + void HandleUpdateAreaTriggerVisual(UpdateAreaTriggerVisual updateAreaTriggerVisual) + { + AreaTrigger target = ObjectAccessor.GetAreaTrigger(_player, updateAreaTriggerVisual.TargetGUID); + if (target == null) + return; + + if (target.GetCasterGuid() != _player.GetGUID()) + return; + + SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(target.m_areaTriggerData.SpellForVisuals, _player.GetMap().GetDifficultyID()); + if (spellInfo == null) + return; + + target.SetSpellVisual(new SpellCastVisual(_player.GetCastSpellXSpellVisualId(spellInfo), 0)); + } + [WorldPacketHandler(ClientOpcodes.KeyboundOverride, Processing = PacketProcessing.ThreadSafe)] void HandleKeyboundOverride(KeyboundOverride keyboundOverride) { diff --git a/Source/Game/Networking/Packets/AreaTriggerPackets.cs b/Source/Game/Networking/Packets/AreaTriggerPackets.cs index e7f1a1dd4..bc8a7385a 100644 --- a/Source/Game/Networking/Packets/AreaTriggerPackets.cs +++ b/Source/Game/Networking/Packets/AreaTriggerPackets.cs @@ -93,6 +93,23 @@ namespace Game.Networking.Packets } } + class UpdateAreaTriggerVisual : ClientPacket + { + public int SpellID; + public SpellCastVisual Visual; + public ObjectGuid TargetGUID; + + public UpdateAreaTriggerVisual(WorldPacket packet) : base(packet) { } + + public override void Read() + { + SpellID = _worldPacket.ReadInt32(); + Visual.Read(_worldPacket); + TargetGUID = _worldPacket.ReadPackedGuid(); + } + } + + //Structs class AreaTriggerSplineInfo {