diff --git a/Source/Framework/Constants/Spells/SpellAuraConst.cs b/Source/Framework/Constants/Spells/SpellAuraConst.cs index e6301f0c6..dde080d4e 100644 --- a/Source/Framework/Constants/Spells/SpellAuraConst.cs +++ b/Source/Framework/Constants/Spells/SpellAuraConst.cs @@ -408,7 +408,7 @@ namespace Framework.Constants BattleGroundPlayerPosition = 398, ModTimeRate = 399, ModSkill2 = 400, - Unk401 = 401, + ActAsControlZone = 401, ModOverridePowerDisplay = 402, OverrideSpellVisual = 403, OverrideAttackPowerBySpPct = 404, diff --git a/Source/Game/Entities/GameObject/GameObject.cs b/Source/Game/Entities/GameObject/GameObject.cs index 543affd57..81be3f7cf 100644 --- a/Source/Game/Entities/GameObject/GameObject.cs +++ b/Source/Game/Entities/GameObject/GameObject.cs @@ -4697,7 +4697,7 @@ namespace Game.Entities if (Math.Abs(delta) < minSuperiority) return 0; - float slope = ((float)minTime - maxTime) / (maxSuperiority - minSuperiority); + float slope = ((float)minTime - maxTime) / Math.Max(maxSuperiority - minSuperiority, 1); float intercept = maxTime - slope * minSuperiority; float timeNeeded = slope * Math.Abs(delta) + intercept; float percentageIncrease = 100.0f / timeNeeded; diff --git a/Source/Game/Entities/Unit/Unit.Movement.cs b/Source/Game/Entities/Unit/Unit.Movement.cs index 31ba75948..c3b47f4cc 100644 --- a/Source/Game/Entities/Unit/Unit.Movement.cs +++ b/Source/Game/Entities/Unit/Unit.Movement.cs @@ -689,6 +689,14 @@ namespace Game.Entities GetMap().PlayerRelocation(ToPlayer(), x, y, z, orientation); else GetMap().CreatureRelocation(ToCreature(), x, y, z, orientation); + + var controlZoneAuras = GetAuraEffectsByType(AuraType.ActAsControlZone); + foreach (AuraEffect auraEffect in controlZoneAuras) + { + GameObject controlZone = GetGameObject(auraEffect.GetSpellInfo().Id); + if (controlZone != null) + GetMap().GameObjectRelocation(controlZone, x, y, z, orientation); + } } else if (turn) UpdateOrientation(orientation); diff --git a/Source/Game/Spells/Auras/AuraEffect.cs b/Source/Game/Spells/Auras/AuraEffect.cs index c387e3d5e..5bb6d0eef 100644 --- a/Source/Game/Spells/Auras/AuraEffect.cs +++ b/Source/Game/Spells/Auras/AuraEffect.cs @@ -6063,6 +6063,43 @@ namespace Game.Spells playerTarget.UpdatePositionData(); } + + [AuraEffectHandler(AuraType.ActAsControlZone)] + void HandleAuraActAsControlZone(AuraApplication aurApp, AuraEffectHandleModes mode, bool apply) + { + if (!mode.HasAnyFlag(AuraEffectHandleModes.Real)) + return; + + Unit auraOwner = aurApp.GetTarget(); + if (!apply) + { + auraOwner.RemoveGameObject(GetSpellInfo().Id, true); + return; + } + + GameObjectTemplate gameobjectTemplate = Global.ObjectMgr.GetGameObjectTemplate((uint)GetMiscValue()); + if (gameobjectTemplate == null) + { + Log.outWarn(LogFilter.Spells, $"AuraEffect::HanldeAuraActAsControlZone: Spell {GetId()} [EffectIndex: {GetEffIndex()}] does not have an existing gameobject template."); + return; + } + + if (gameobjectTemplate.type != GameObjectTypes.ControlZone) + { + Log.outWarn(LogFilter.Spells, $"AuraEffect::HanldeAuraActAsControlZone: Spell {GetId()} [EffectIndex: {GetEffIndex()}] has a gameobject template ({gameobjectTemplate.entry}) that is not a control zone."); + return; + } + + if (gameobjectTemplate.displayId != 0) + { + Log.outWarn(LogFilter.Spells, $"AuraEffect::HanldeAuraActAsControlZone: Spell {GetId()} [EffectIndex: {GetEffIndex()}] has a gameobject template ({gameobjectTemplate.entry}) that has a display id. Only invisible gameobjects are supported."); + return; + } + + GameObject controlZone = auraOwner.SummonGameObject(gameobjectTemplate.entry, auraOwner.GetPosition(), Quaternion.CreateFromRotationMatrix(Extensions.fromEulerAnglesZYX(aurApp.GetTarget().GetOrientation(), 0.0f, 0.0f)), TimeSpan.FromHours(24), GameObjectSummonType.TimedOrCorpseDespawn); + if (controlZone != null) + controlZone.SetSpellId(GetSpellInfo().Id); + } #endregion }