Misc fixes
This commit is contained in:
@@ -362,17 +362,17 @@ namespace Game.Combat
|
||||
public void TauntUpdate()
|
||||
{
|
||||
var tauntEffects = _owner.GetAuraEffectsByType(AuraType.ModTaunt);
|
||||
TauntState state = TauntState.Taunt;
|
||||
Dictionary<ObjectGuid, TauntState> tauntStates = new();
|
||||
uint tauntPriority = 0; // lowest is highest
|
||||
Dictionary<ObjectGuid, uint> 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();
|
||||
}
|
||||
|
||||
@@ -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<Unit> flagChangeFunc = null;
|
||||
Func<Unit, bool> 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();
|
||||
|
||||
|
||||
@@ -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<int, int> spentCurrencies = new();
|
||||
FillSpentCurrenciesMap(traitConfig.Entries, spentCurrencies);
|
||||
|
||||
Reference in New Issue
Block a user