diff --git a/Source/Game/Entities/Creature/Creature.Fields.cs b/Source/Game/Entities/Creature/Creature.Fields.cs index 2c764d1c7..4b2e109a4 100644 --- a/Source/Game/Entities/Creature/Creature.Fields.cs +++ b/Source/Game/Entities/Creature/Creature.Fields.cs @@ -21,14 +21,7 @@ namespace Game.Entities long _lastDamagedTime; // Part of Evade mechanics MultiMap m_textRepeat = new(); - CreatureStaticFlags _staticFlags; - CreatureStaticFlags2 _staticFlags2; - CreatureStaticFlags3 _staticFlags3; - CreatureStaticFlags4 _staticFlags4; - CreatureStaticFlags5 _staticFlags5; - CreatureStaticFlags6 _staticFlags6; - CreatureStaticFlags7 _staticFlags7; - CreatureStaticFlags8 _staticFlags8; + CreatureStaticFlagsHolder _staticFlags; // Regenerate health bool _regenerateHealth; // Set on creation @@ -108,4 +101,34 @@ namespace Game.Entities public ObjectGuid Target; // the creature's "real" target while casting public float Orientation; // the creature's "real" orientation while casting } + + struct CreatureStaticFlagsHolder + { + CreatureStaticFlags _flags; + CreatureStaticFlags2 _flags2; + CreatureStaticFlags3 _flags3; + CreatureStaticFlags4 _flags4; + CreatureStaticFlags5 _flags5; + CreatureStaticFlags6 _flags6; + CreatureStaticFlags7 _flags7; + CreatureStaticFlags8 _flags8; + + public bool HasFlag(CreatureStaticFlags flag) { return _flags.HasFlag(flag); } + public bool HasFlag(CreatureStaticFlags2 flag) { return _flags2.HasFlag(flag); } + public bool HasFlag(CreatureStaticFlags3 flag) { return _flags3.HasFlag(flag); } + public bool HasFlag(CreatureStaticFlags4 flag) { return _flags4.HasFlag(flag); } + public bool HasFlag(CreatureStaticFlags5 flag) { return _flags5.HasFlag(flag); } + public bool HasFlag(CreatureStaticFlags6 flag) { return _flags6.HasFlag(flag); } + public bool HasFlag(CreatureStaticFlags7 flag) { return _flags7.HasFlag(flag); } + public bool HasFlag(CreatureStaticFlags8 flag) { return _flags8.HasFlag(flag); } + + public void ApplyFlag(CreatureStaticFlags flag, bool apply) { if (apply) _flags |= flag; else _flags &= ~flag; } + public void ApplyFlag(CreatureStaticFlags2 flag, bool apply) { if (apply) _flags2 |= flag; else _flags2 &= ~flag; } + public void ApplyFlag(CreatureStaticFlags3 flag, bool apply) { if (apply) _flags3 |= flag; else _flags3 &= ~flag; } + public void ApplyFlag(CreatureStaticFlags4 flag, bool apply) { if (apply) _flags4 |= flag; else _flags4 &= ~flag; } + public void ApplyFlag(CreatureStaticFlags5 flag, bool apply) { if (apply) _flags5 |= flag; else _flags5 &= ~flag; } + public void ApplyFlag(CreatureStaticFlags6 flag, bool apply) { if (apply) _flags6 |= flag; else _flags6 &= ~flag; } + public void ApplyFlag(CreatureStaticFlags7 flag, bool apply) { if (apply) _flags7 |= flag; else _flags7 &= ~flag; } + public void ApplyFlag(CreatureStaticFlags8 flag, bool apply) { if (apply) _flags8 |= flag; else _flags8 &= ~flag; } + } } diff --git a/Source/Game/Entities/Creature/Creature.cs b/Source/Game/Entities/Creature/Creature.cs index 7de800b10..6ee14edc2 100644 --- a/Source/Game/Entities/Creature/Creature.cs +++ b/Source/Game/Entities/Creature/Creature.cs @@ -1129,14 +1129,14 @@ namespace Game.Entities SetHomePosition(GetPosition()); } - public bool HasFlag(CreatureStaticFlags flag) { return _staticFlags.HasFlag(flag); } - public bool HasFlag(CreatureStaticFlags2 flag) { return _staticFlags2.HasFlag(flag); } - public bool HasFlag(CreatureStaticFlags3 flag) { return _staticFlags3.HasFlag(flag); } - public bool HasFlag(CreatureStaticFlags4 flag) { return _staticFlags4.HasFlag(flag); } - public bool HasFlag(CreatureStaticFlags5 flag) { return _staticFlags5.HasFlag(flag); } - public bool HasFlag(CreatureStaticFlags6 flag) { return _staticFlags6.HasFlag(flag); } - public bool HasFlag(CreatureStaticFlags7 flag) { return _staticFlags7.HasFlag(flag); } - public bool HasFlag(CreatureStaticFlags8 flag) { return _staticFlags8.HasFlag(flag); } + public bool HasFlag(CreatureStaticFlags flag) { return _staticFlags.HasFlag(flag); } + public bool HasFlag(CreatureStaticFlags2 flag) { return _staticFlags.HasFlag(flag); } + public bool HasFlag(CreatureStaticFlags3 flag) { return _staticFlags.HasFlag(flag); } + public bool HasFlag(CreatureStaticFlags4 flag) { return _staticFlags.HasFlag(flag); } + public bool HasFlag(CreatureStaticFlags5 flag) { return _staticFlags.HasFlag(flag); } + public bool HasFlag(CreatureStaticFlags6 flag) { return _staticFlags.HasFlag(flag); } + public bool HasFlag(CreatureStaticFlags7 flag) { return _staticFlags.HasFlag(flag); } + public bool HasFlag(CreatureStaticFlags8 flag) { return _staticFlags.HasFlag(flag); } public uint GetTrainerId() { @@ -1624,7 +1624,7 @@ namespace Game.Entities public void SetSpawnHealth() { - if (_staticFlags5.HasFlag(CreatureStaticFlags5.NoHealthRegen)) + if (_staticFlags.HasFlag(CreatureStaticFlags5.NoHealthRegen)) return; ulong curhealth; @@ -3187,13 +3187,7 @@ namespace Game.Entities public override void SetImmuneToPC(bool apply) { SetImmuneToPC(apply, HasReactState(ReactStates.Passive)); } public override void SetImmuneToNPC(bool apply) { SetImmuneToNPC(apply, HasReactState(ReactStates.Passive)); } - void SetUnkillable(bool unkillable) - { - if (unkillable) - _staticFlags |= CreatureStaticFlags.Unkillable; - else - _staticFlags &= ~CreatureStaticFlags.Unkillable; - } + void SetUnkillable(bool unkillable) { _staticFlags.ApplyFlag(CreatureStaticFlags.Unkillable, unkillable); } public bool IsInEvadeMode() { return HasUnitState(UnitState.Evade); } public bool IsEvadingAttacks() { return IsInEvadeMode() || CanNotReachTarget(); } @@ -3357,15 +3351,9 @@ namespace Game.Entities m_combatPulseTime = delay; } - public bool CanRegenerateHealth() { return !_staticFlags5.HasFlag(CreatureStaticFlags5.NoHealthRegen) && _regenerateHealth; } - public void SetRegenerateHealth(bool value) - { - if (!value) - _staticFlags5 |= CreatureStaticFlags5.NoHealthRegen; - else - _staticFlags5 &= ~CreatureStaticFlags5.NoHealthRegen; - } - + bool CanRegenerateHealth() { return !_staticFlags.HasFlag(CreatureStaticFlags5.NoHealthRegen) && _regenerateHealth; } + public void SetRegenerateHealth(bool value) { _staticFlags.ApplyFlag(CreatureStaticFlags5.NoHealthRegen, !value); } + public void SetHomePosition(float x, float y, float z, float o) { m_homePosition.Relocate(x, y, z, o);