From b3ebc2f8b5f37650dbc8afb4d11f87013d7f6efe Mon Sep 17 00:00:00 2001 From: hondacrx Date: Sat, 22 Aug 2020 12:58:19 -0400 Subject: [PATCH] Core/Spells: enable and implement SMSG_MISSILE_CANCEL Port From (https://github.com/TrinityCore/TrinityCore/commit/71db17220ae67dc6a354e88451ffc0700fe6c5f9) --- Source/Framework/Dynamic/EventSystem.cs | 4 ++- Source/Game/Entities/Unit/Unit.cs | 26 +++++++++++++++++++ .../Game/Networking/Packets/SpellPackets.cs | 17 ++++++++++++ Source/Game/Spells/Spell.cs | 13 ++++++++++ 4 files changed, 59 insertions(+), 1 deletion(-) diff --git a/Source/Framework/Dynamic/EventSystem.cs b/Source/Framework/Dynamic/EventSystem.cs index 03913ab52..d67e342b8 100644 --- a/Source/Framework/Dynamic/EventSystem.cs +++ b/Source/Framework/Dynamic/EventSystem.cs @@ -60,7 +60,7 @@ namespace Framework.Dynamic AddEvent(Event, CalculateTime(1), false); } } - + public void KillAllEvents(bool force) { @@ -115,6 +115,8 @@ namespace Framework.Dynamic return (m_time + t_offset); } + public SortedMultiMap GetEvents() { return m_events; } + ulong m_time; SortedMultiMap m_events = new SortedMultiMap(); } diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index ff4dc43cc..2f1e04611 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -1067,6 +1067,32 @@ namespace Game.Entities SendMessageToSet(playSpellVisualKit, true); } + void CancelSpellMissiles(uint spellId, bool reverseMissile = false) + { + bool hasMissile = false; + foreach (var pair in m_Events.GetEvents()) + { + Spell spell = Spell.ExtractSpellFromEvent(pair.Value); + if (spell != null) + { + if (spell.GetSpellInfo().Id == spellId) + { + pair.Value.ScheduleAbort(); + hasMissile = true; + } + } + } + + if (hasMissile) + { + MissileCancel packet = new MissileCancel(); + packet.OwnerGUID = GetGUID(); + packet.SpellID = spellId; + packet.Reverse = reverseMissile; + SendMessageToSet(packet, false); + } + } + public void UnsummonAllTotems() { for (byte i = 0; i < SharedConst.MaxSummonSlot; ++i) diff --git a/Source/Game/Networking/Packets/SpellPackets.cs b/Source/Game/Networking/Packets/SpellPackets.cs index debadb0a2..5f74324e2 100644 --- a/Source/Game/Networking/Packets/SpellPackets.cs +++ b/Source/Game/Networking/Packets/SpellPackets.cs @@ -1118,6 +1118,23 @@ namespace Game.Networking.Packets public uint Result; } + + class MissileCancel : ServerPacket + { + public MissileCancel() : base(ServerOpcodes.MissileCancel) { } + + public override void Write() + { + _worldPacket.WritePackedGuid(OwnerGUID); + _worldPacket.WriteUInt32(SpellID); + _worldPacket.WriteBit(Reverse); + _worldPacket.FlushBits(); + } + + public ObjectGuid OwnerGUID; + public bool Reverse; + public uint SpellID; + } //Structs public struct SpellLogPowerData diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index 68aa8f735..814a6e041 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -4418,6 +4418,15 @@ namespace Game.Spells Global.SpellMgr.GetSpellEffectHandler(eff).Invoke(this, i); } + public static Spell ExtractSpellFromEvent(BasicEvent basicEvent) + { + SpellEvent spellEvent = (SpellEvent)basicEvent; + if (spellEvent != null) + return spellEvent.GetSpell(); + + return null; + } + public SpellCastResult CheckCast(bool strict) { uint param1 = 0, param2 = 0; @@ -7998,17 +8007,21 @@ namespace Game.Spells m_Spell.GetCaster().m_Events.AddEvent(this, e_time + 1, false); return false; // event not complete } + public override void Abort(ulong e_time) { // oops, the spell we try to do is aborted if (m_Spell.GetState() != SpellState.Finished) m_Spell.Cancel(); } + public override bool IsDeletable() { return m_Spell.IsDeletable(); } + public Spell GetSpell() { return m_Spell; } + Spell m_Spell; }