Core/Spells: Always remove spell target from transport on teleport spells if spell destination does not target a position on the transport

Port From (https://github.com/TrinityCore/TrinityCore/commit/8cfc8e41418c127aa11ef0bbbdd0f1d6388ab0ae)
This commit is contained in:
hondacrx
2023-06-13 05:24:33 -04:00
parent 48f8d37ccb
commit 4180b6fa3f
2 changed files with 35 additions and 19 deletions
@@ -329,8 +329,10 @@ namespace Framework.Constants
Item = 0x80 Item = 0x80
} }
[Flags]
public enum TeleportToOptions public enum TeleportToOptions
{ {
None = 0x00,
GMMode = 0x01, GMMode = 0x01,
NotLeaveTransport = 0x02, NotLeaveTransport = 0x02,
NotLeaveCombat = 0x04, NotLeaveCombat = 0x04,
+29 -15
View File
@@ -537,6 +537,23 @@ namespace Game.Spells
unitCaster.GetMotionMaster().MoveJump(destTarget, speedXY, speedZ, EventId.Jump, !m_targets.GetObjectTargetGUID().IsEmpty(), arrivalCast); unitCaster.GetMotionMaster().MoveJump(destTarget, speedXY, speedZ, EventId.Jump, !m_targets.GetObjectTargetGUID().IsEmpty(), arrivalCast);
} }
TeleportToOptions GetTeleportOptions(WorldObject caster, Unit unitTarget, SpellDestination targetDest)
{
TeleportToOptions options = TeleportToOptions.None;
if (caster == unitTarget)
options |= TeleportToOptions.Spell;
if (targetDest.Position.GetMapId() == unitTarget.GetMapId())
{
options |= TeleportToOptions.NotLeaveCombat | TeleportToOptions.NotUnSummonPet;
if (unitTarget.GetTransGUID() == targetDest.TransportGUID)
options |= TeleportToOptions.NotLeaveTransport;
}
return options;
}
[SpellEffectHandler(SpellEffectName.TeleportUnits)] [SpellEffectHandler(SpellEffectName.TeleportUnits)]
void EffectTeleportUnits() void EffectTeleportUnits()
{ {
@@ -568,17 +585,15 @@ namespace Game.Spells
uint customLoadingScreenId = (uint)effectInfo.MiscValue; uint customLoadingScreenId = (uint)effectInfo.MiscValue;
if (customLoadingScreenId != 0) if (customLoadingScreenId != 0)
player.SendPacket(new CustomLoadScreen(m_spellInfo.Id, customLoadingScreenId)); player.SendPacket(new CustomLoadScreen(m_spellInfo.Id, customLoadingScreenId));
}
if (targetDest.GetMapId() == unitTarget.GetMapId()) TeleportToOptions options = GetTeleportOptions(m_caster, unitTarget, m_destTargets[effectInfo.EffectIndex]);
unitTarget.NearTeleportTo(targetDest, unitTarget == m_caster);
else if (player != null) player.TeleportTo(targetDest, options);
player.TeleportTo(targetDest, unitTarget == m_caster ? TeleportToOptions.Spell : 0);
else
{
Log.outError(LogFilter.Spells, "Spell.EffectTeleportUnits - spellId {0} attempted to teleport creature to a different map.", m_spellInfo.Id);
return;
} }
else if (targetDest.GetMapId() == unitTarget.GetMapId())
unitTarget.NearTeleportTo(targetDest, unitTarget == m_caster);
else
Log.outError(LogFilter.Spells, "Spell.EffectTeleportUnits - spellId {0} attempted to teleport creature to a different map.", m_spellInfo.Id);
} }
[SpellEffectHandler(SpellEffectName.TeleportWithSpellVisualKitLoadingScreen)] [SpellEffectHandler(SpellEffectName.TeleportWithSpellVisualKitLoadingScreen)]
@@ -612,7 +627,8 @@ namespace Game.Spells
playerTarget.SendPacket(new SpellVisualLoadScreen(effectInfo.MiscValueB, effectInfo.MiscValue)); playerTarget.SendPacket(new SpellVisualLoadScreen(effectInfo.MiscValueB, effectInfo.MiscValue));
} }
unitTarget.m_Events.AddEventAtOffset(new DelayedSpellTeleportEvent(unitTarget, targetDest, unitTarget == m_caster ? TeleportToOptions.Spell : 0, m_spellInfo.Id), TimeSpan.FromMilliseconds(effectInfo.MiscValue)); TeleportToOptions options = GetTeleportOptions(m_caster, unitTarget, m_destTargets[effectInfo.EffectIndex]);
unitTarget.m_Events.AddEventAtOffset(new DelayedSpellTeleportEvent(unitTarget, targetDest, options, m_spellInfo.Id), TimeSpan.FromMilliseconds(effectInfo.MiscValue));
} }
[SpellEffectHandler(SpellEffectName.ApplyAura)] [SpellEffectHandler(SpellEffectName.ApplyAura)]
@@ -5851,16 +5867,14 @@ namespace Game.Spells
public override bool Execute(ulong e_time, uint p_time) public override bool Execute(ulong e_time, uint p_time)
{ {
if (_targetDest.GetMapId() == _target.GetMapId())
_target.NearTeleportTo(_targetDest, (_options & TeleportToOptions.Spell) != 0);
else
{
Player player = _target.ToPlayer(); Player player = _target.ToPlayer();
if (player != null) if (player != null)
player.TeleportTo(_targetDest, _options); player.TeleportTo(_targetDest, _options);
else if (_targetDest.GetMapId() == _target.GetMapId())
_target.NearTeleportTo(_targetDest, (_options & TeleportToOptions.Spell) != TeleportToOptions.None);
else else
Log.outError(LogFilter.Spells, $"Spell::EffectTeleportUnitsWithVisualLoadingScreen - spellId {_spellId} attempted to teleport creature to a different map."); Log.outError(LogFilter.Spells, $"Spell::EffectTeleportUnitsWithVisualLoadingScreen - spellId {_spellId} attempted to teleport creature to a different map.");
}
return true; return true;
} }