From 100a9d74e7de0baf1419f794598e49ad7c800410 Mon Sep 17 00:00:00 2001 From: Hondacrx Date: Mon, 1 Sep 2025 22:41:28 -0400 Subject: [PATCH] Misc fixes --- Source/Game/Combat/ThreatManager.cs | 12 ++++++------ Source/Game/Spells/Auras/AuraEffect.cs | 21 +++++++++++---------- Source/Game/Spells/TraitManager.cs | 18 ++++++++---------- 3 files changed, 25 insertions(+), 26 deletions(-) diff --git a/Source/Game/Combat/ThreatManager.cs b/Source/Game/Combat/ThreatManager.cs index 2d0fb9630..3002e01c1 100644 --- a/Source/Game/Combat/ThreatManager.cs +++ b/Source/Game/Combat/ThreatManager.cs @@ -362,17 +362,17 @@ namespace Game.Combat public void TauntUpdate() { var tauntEffects = _owner.GetAuraEffectsByType(AuraType.ModTaunt); - TauntState state = TauntState.Taunt; - Dictionary tauntStates = new(); + uint tauntPriority = 0; // lowest is highest + Dictionary tauntStates = new(); // Only the last taunt effect applied by something still on our threat list is considered - foreach (var auraEffect in tauntEffects) - tauntStates[auraEffect.GetCasterGUID()] = state++; + foreach (AuraEffect tauntEffect in tauntEffects) + tauntStates[tauntEffect.GetCasterGUID()] = ++tauntPriority; foreach (var pair in _myThreatListEntries) { - if (tauntStates.TryGetValue(pair.Key, out TauntState tauntState)) - pair.Value.UpdateTauntState(tauntState); + if (tauntStates.TryGetValue(pair.Key, out uint tauntState)) + pair.Value.UpdateTauntState((TauntState)((uint)TauntState.Taunt + tauntStates.Count - tauntState)); else pair.Value.UpdateTauntState(); } diff --git a/Source/Game/Spells/Auras/AuraEffect.cs b/Source/Game/Spells/Auras/AuraEffect.cs index 647d9b8e3..28c934829 100644 --- a/Source/Game/Spells/Auras/AuraEffect.cs +++ b/Source/Game/Spells/Auras/AuraEffect.cs @@ -1838,38 +1838,37 @@ namespace Game.Spells Unit target = aurApp.GetTarget(); - //Prevent handling aura twice AuraType type = GetAuraType(); if (apply ? target.GetAuraEffectsByType(type).Count > 1 : target.HasAuraType(type)) return; - Action flagChangeFunc = null; + Func flagChangeFunc = null; byte slot; WeaponAttackType attType; switch (type) { case AuraType.ModDisarm: if (apply) - flagChangeFunc = unit => { unit.SetUnitFlag(UnitFlags.Disarmed); }; + flagChangeFunc = unit => { if (unit.HasUnitFlag(UnitFlags.Disarmed)) { return false; } unit.SetUnitFlag(UnitFlags.Disarmed); return true; }; else - flagChangeFunc = unit => { unit.RemoveUnitFlag(UnitFlags.Disarmed); }; + flagChangeFunc = unit => { if (unit.HasAuraType(AuraType.ModDisarm)) { return false; } unit.RemoveUnitFlag(UnitFlags.Disarmed); return true; }; slot = EquipmentSlot.MainHand; attType = WeaponAttackType.BaseAttack; break; case AuraType.ModDisarmOffhand: if (apply) - flagChangeFunc = unit => { unit.SetUnitFlag2(UnitFlags2.DisarmOffhand); }; + flagChangeFunc = unit => { if (unit.HasUnitFlag2(UnitFlags2.DisarmOffhand)) { return false; } unit.SetUnitFlag2(UnitFlags2.DisarmOffhand); return true; }; else - flagChangeFunc = unit => { unit.RemoveUnitFlag2(UnitFlags2.DisarmOffhand); }; + flagChangeFunc = unit => { if (unit.HasAuraType(AuraType.ModDisarmOffhand)) { return false; } unit.RemoveUnitFlag2(UnitFlags2.DisarmOffhand); return true; }; slot = EquipmentSlot.OffHand; attType = WeaponAttackType.OffAttack; break; case AuraType.ModDisarmRanged: if (apply) - flagChangeFunc = unit => { unit.SetUnitFlag2(UnitFlags2.DisarmRanged); }; + flagChangeFunc = unit => { if (unit.HasUnitFlag2(UnitFlags2.DisarmRanged)) { return false; } unit.SetUnitFlag2(UnitFlags2.DisarmRanged); return true; }; else - flagChangeFunc = unit => { unit.RemoveUnitFlag2(UnitFlags2.DisarmRanged); }; + flagChangeFunc = unit => { if (unit.HasAuraType(AuraType.ModDisarmRanged)) { return false; } unit.RemoveUnitFlag2(UnitFlags2.DisarmRanged); return true; }; slot = EquipmentSlot.MainHand; attType = WeaponAttackType.RangedAttack; break; @@ -1878,10 +1877,12 @@ namespace Game.Spells } // set/remove flag before weapon bonuses so it's properly reflected in CanUseAttackType - flagChangeFunc?.Invoke(target); + if (flagChangeFunc != null) + if (!flagChangeFunc(target)) //Prevent handling aura twice + return; // Handle damage modification, shapeshifted druids are not affected - if (target.IsTypeId(TypeId.Player) && !target.IsInFeralForm()) + if (target.IsPlayer() && !target.IsInFeralForm()) { Player player = target.ToPlayer(); diff --git a/Source/Game/Spells/TraitManager.cs b/Source/Game/Spells/TraitManager.cs index e520b9d6c..b890667b0 100644 --- a/Source/Game/Spells/TraitManager.cs +++ b/Source/Game/Spells/TraitManager.cs @@ -748,19 +748,17 @@ namespace Game bool isNodeFullyFilled(Node node) { - if (node.Data.GetNodeType() == TraitNodeType.Selection) - return node.Entries.Any(nodeEntry => - { - TraitEntryPacket traitEntry = getNodeEntry(node.Data.Id, nodeEntry.Data.Id); - return traitEntry != null && (traitEntry.Rank + traitEntry.GrantedRanks) == nodeEntry.Data.MaxRanks; - }); - - return node.Entries.All(nodeEntry => + bool nodeEntryMatches(NodeEntry nodeEntry) { TraitEntryPacket traitEntry = getNodeEntry(node.Data.Id, nodeEntry.Data.Id); return traitEntry != null && (traitEntry.Rank + traitEntry.GrantedRanks) == nodeEntry.Data.MaxRanks; - }); - }; + }; + + if (node.Data.GetNodeType() == TraitNodeType.Selection) + return node.Entries.Any(nodeEntryMatches); + + return node.Entries.All(nodeEntryMatches); + } Dictionary spentCurrencies = new(); FillSpentCurrenciesMap(traitConfig.Entries, spentCurrencies);