From eef0e8e8754f58222585355d131dbec43a49274d Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 7 Dec 2021 20:57:02 -0500 Subject: [PATCH] Misc fixes --- Source/Framework/Framework.csproj | 4 +- Source/Game/AI/CoreAI/UnitAI.cs | 38 +++++++++---------- Source/Game/Movement/MotionMaster.cs | 28 +++++++------- Source/Game/Spells/SpellManager.cs | 56 ++++++++++++++++++++++++++++ Source/Game/Time/Updatetime.cs | 4 ++ Source/Scripts/Spells/Generic.cs | 23 ++++++++++++ 6 files changed, 118 insertions(+), 35 deletions(-) diff --git a/Source/Framework/Framework.csproj b/Source/Framework/Framework.csproj index 71fcceaf0..4ee1138ec 100644 --- a/Source/Framework/Framework.csproj +++ b/Source/Framework/Framework.csproj @@ -1,4 +1,4 @@ - + True @@ -6,7 +6,7 @@ - + diff --git a/Source/Game/AI/CoreAI/UnitAI.cs b/Source/Game/AI/CoreAI/UnitAI.cs index a6aebed11..c61bc8fd0 100644 --- a/Source/Game/AI/CoreAI/UnitAI.cs +++ b/Source/Game/AI/CoreAI/UnitAI.cs @@ -520,11 +520,11 @@ namespace Game.AI // default predicate function to select target based on distance, player and/or aura criteria public class DefaultTargetSelector : ICheck { - Unit me; - float m_dist; - bool m_playerOnly; - Unit except; - int m_aura; + Unit _me; + float _dist; + bool _playerOnly; + Unit _exception; + int _aura; /// the reference unit /// if 0: ignored, if > 0: maximum distance to the reference unit, if < 0: minimum distance to the reference unit @@ -533,43 +533,43 @@ namespace Game.AI /// if 0: ignored, if > 0: the target shall have the aura, if < 0, the target shall NOT have the aura public DefaultTargetSelector(Unit unit, float dist, bool playerOnly, bool withTank, int aura) { - me = unit; - m_dist = dist; - m_playerOnly = playerOnly; - except = !withTank ? me.GetThreatManager().GetCurrentVictim() : null; - m_aura = aura; + _me = unit; + _dist = dist; + _playerOnly = playerOnly; + _exception = !withTank ? _me.GetThreatManager().GetCurrentVictim() : null; + _aura = aura; } public bool Invoke(Unit target) { - if (me == null) + if (_me == null) return false; if (target == null) return false; - if (except != null && target == except) + if (_exception != null && target == _exception) return false; - if (m_playerOnly && !target.IsTypeId(TypeId.Player)) + if (_playerOnly && !target.IsTypeId(TypeId.Player)) return false; - if (m_dist > 0.0f && !me.IsWithinCombatRange(target, m_dist)) + if (_dist > 0.0f && !_me.IsWithinCombatRange(target, _dist)) return false; - if (m_dist < 0.0f && me.IsWithinCombatRange(target, -m_dist)) + if (_dist < 0.0f && _me.IsWithinCombatRange(target, -_dist)) return false; - if (m_aura != 0) + if (_aura != 0) { - if (m_aura > 0) + if (_aura > 0) { - if (!target.HasAura((uint)m_aura)) + if (!target.HasAura((uint)_aura)) return false; } else { - if (target.HasAura((uint)-m_aura)) + if (target.HasAura((uint)-_aura)) return false; } } diff --git a/Source/Game/Movement/MotionMaster.cs b/Source/Game/Movement/MotionMaster.cs index e3fcad7ed..a40d6d08f 100644 --- a/Source/Game/Movement/MotionMaster.cs +++ b/Source/Game/Movement/MotionMaster.cs @@ -57,20 +57,20 @@ namespace Game.Movement } } - class MotionMasterDelayedAction + class DelayedAction { + Action Action; Func Validator; - public Action Action; - public MotionMasterDelayedActionType Type; + MotionMasterDelayedActionType Type; - public MotionMasterDelayedAction(Action action, Func validator, MotionMasterDelayedActionType type) + public DelayedAction(Action action, Func validator, MotionMasterDelayedActionType type) { Action = action; Validator = validator; Type = type; } - public MotionMasterDelayedAction(Action action, MotionMasterDelayedActionType type) + public DelayedAction(Action action, MotionMasterDelayedActionType type) { Action = action; Validator = () => true; @@ -96,7 +96,7 @@ namespace Game.Movement SortedSet _generators { get; } = new(new MovementGeneratorComparator()); MultiMap _baseUnitStatesMap { get; } = new(); - Queue _delayedActions { get; } = new(); + Queue _delayedActions { get; } = new(); MotionMasterFlags _flags { get; set; } public MotionMaster(Unit unit) @@ -108,7 +108,7 @@ namespace Game.Movement { if (HasFlag(MotionMasterFlags.Update)) { - _delayedActions.Enqueue(new MotionMasterDelayedAction(() => Initialize(), MotionMasterDelayedActionType.Initialize)); + _delayedActions.Enqueue(new DelayedAction(() => Initialize(), MotionMasterDelayedActionType.Initialize)); return; } @@ -331,7 +331,7 @@ namespace Game.Movement return; if (HasFlag(MotionMasterFlags.Update)) - _delayedActions.Enqueue(new MotionMasterDelayedAction(() => Add(movement, slot), MotionMasterDelayedActionType.Add)); + _delayedActions.Enqueue(new DelayedAction(() => Add(movement, slot), MotionMasterDelayedActionType.Add)); else DirectAdd(movement, slot); } @@ -343,7 +343,7 @@ namespace Game.Movement if (HasFlag(MotionMasterFlags.Update)) { - _delayedActions.Enqueue(new MotionMasterDelayedAction(() => Remove(movement, slot), MotionMasterDelayedActionType.Remove)); + _delayedActions.Enqueue(new DelayedAction(() => Remove(movement, slot), MotionMasterDelayedActionType.Remove)); return; } @@ -375,7 +375,7 @@ namespace Game.Movement if (HasFlag(MotionMasterFlags.Update)) { - _delayedActions.Enqueue(new MotionMasterDelayedAction(() => Remove(type, slot), MotionMasterDelayedActionType.RemoveType)); + _delayedActions.Enqueue(new DelayedAction(() => Remove(type, slot), MotionMasterDelayedActionType.RemoveType)); return; } @@ -405,7 +405,7 @@ namespace Game.Movement { if (HasFlag(MotionMasterFlags.Update)) { - _delayedActions.Enqueue(new MotionMasterDelayedAction(() => Clear(), MotionMasterDelayedActionType.Clear)); + _delayedActions.Enqueue(new DelayedAction(() => Clear(), MotionMasterDelayedActionType.Clear)); return; } @@ -420,7 +420,7 @@ namespace Game.Movement if (HasFlag(MotionMasterFlags.Update)) { - _delayedActions.Enqueue(new MotionMasterDelayedAction(() => Clear(slot), MotionMasterDelayedActionType.ClearSlot)); + _delayedActions.Enqueue(new DelayedAction(() => Clear(slot), MotionMasterDelayedActionType.ClearSlot)); return; } @@ -444,7 +444,7 @@ namespace Game.Movement { if (HasFlag(MotionMasterFlags.Update)) { - _delayedActions.Enqueue(new MotionMasterDelayedAction(() => Clear(mode), MotionMasterDelayedActionType.ClearMode)); + _delayedActions.Enqueue(new DelayedAction(() => Clear(mode), MotionMasterDelayedActionType.ClearMode)); return; } @@ -459,7 +459,7 @@ namespace Game.Movement if (HasFlag(MotionMasterFlags.Update)) { - _delayedActions.Enqueue(new MotionMasterDelayedAction(() => Clear(priority), MotionMasterDelayedActionType.ClearPriority)); + _delayedActions.Enqueue(new DelayedAction(() => Clear(priority), MotionMasterDelayedActionType.ClearPriority)); return; } diff --git a/Source/Game/Spells/SpellManager.cs b/Source/Game/Spells/SpellManager.cs index 6bdc2200f..9cef4c49d 100644 --- a/Source/Game/Spells/SpellManager.cs +++ b/Source/Game/Spells/SpellManager.cs @@ -3597,6 +3597,62 @@ namespace Game.Entities }); }); + // Tag Greater Felfire Diemetradon + ApplySpellFix(new[] { + 37851, // Tag Greater Felfire Diemetradon + 37918 // Arcano-pince + }, spellInfo => + { + spellInfo.RecoveryTime = 3000; + }); + + // Jormungar Strike + ApplySpellFix(new[] { 56513 }, spellInfo => + { + spellInfo.RecoveryTime = 2000; + }); + + ApplySpellFix(new[] { + 54997, // Cast Net (tooltip says 10s but sniffs say 6s) + 56524 // Acid Breath + }, spellInfo => + { + spellInfo.RecoveryTime = 6000; + }); + + ApplySpellFix(new[] { + 47911, // EMP + 48620, // Wing Buffet + 51752 // Stampy's Stompy-Stomp + }, spellInfo => + { + spellInfo.RecoveryTime = 10000; + }); + + ApplySpellFix(new[] { + 37727, // Touch of Darkness + 54996 // Ice Slick (tooltip says 20s but sniffs say 12s) + }, spellInfo => + { + spellInfo.RecoveryTime = 12000; + }); + + // Signal Helmet to Attack + ApplySpellFix(new[] { 51748 }, spellInfo => + { + spellInfo.RecoveryTime = 15000; + }); + + // Charge + ApplySpellFix(new[] { + 51756, // Charge + 37919, //Arcano-dismantle + 37917 //Arcano-Cloak + }, spellInfo => + { + spellInfo.RecoveryTime = 20000; + }); + // // VIOLET HOLD SPELLS // diff --git a/Source/Game/Time/Updatetime.cs b/Source/Game/Time/Updatetime.cs index 8301970d0..e9508beae 100644 --- a/Source/Game/Time/Updatetime.cs +++ b/Source/Game/Time/Updatetime.cs @@ -27,6 +27,10 @@ namespace Game sum += diff * diff; weightsum += diff; } + + if (weightsum == 0) + return 0; + return sum / weightsum; } diff --git a/Source/Scripts/Spells/Generic.cs b/Source/Scripts/Spells/Generic.cs index d19fd7b19..054b565b4 100644 --- a/Source/Scripts/Spells/Generic.cs +++ b/Source/Scripts/Spells/Generic.cs @@ -3821,6 +3821,29 @@ namespace Scripts.Spells.Generic OnEffectHitTarget.Add(new EffectHandler(HandleDamage, 1, SpellEffectName.SchoolDamage)); } } + + [Script] // Used for some spells cast by vehicles or charmed creatures that do not send a cooldown event on their own + class spell_gen_charmed_unit_spell_cooldown : SpellScript + { + void HandleCast() + { + Unit caster = GetCaster(); + Player owner = caster.GetCharmerOrOwnerPlayerOrPlayerItself(); + if (owner != null) + { + SpellCooldownPkt spellCooldown = new(); + spellCooldown.Caster = owner.GetGUID(); + spellCooldown.Flags = SpellCooldownFlags.None; + spellCooldown.SpellCooldowns.Add(new SpellCooldownStruct(GetSpellInfo().Id, GetSpellInfo().RecoveryTime)); + owner.SendPacket(spellCooldown); + } + } + + public override void Register() + { + OnCast.Add(new CastHandler(HandleCast)); + } + } [Script] // 169869 - Transformation Sickness class spell_gen_decimatus_transformation_sickness : SpellScript