Core/Objects: Fix flags overflow for InvisibilityType because TOTAL_INVISIBILITY_TYPES (38) can't fit in 32 bits flag

Port From (https://github.com/TrinityCore/TrinityCore/commit/423f81fbdaad9bedf936b313a97afe0be53b6ae0)
This commit is contained in:
hondacrx
2022-10-11 17:09:46 -04:00
parent c34b6cd77b
commit 1ba4405421
2 changed files with 33 additions and 13 deletions
+25 -5
View File
@@ -173,20 +173,40 @@ namespace Framework.Dynamic
}
}
public class FlaggedArray<T> where T : struct
public class FlaggedArray32<T> where T : struct
{
int[] m_values;
uint m_flags;
public FlaggedArray(byte arraysize)
public FlaggedArray32(byte arraysize)
{
m_values = new int[4 * arraysize];
}
public uint GetFlags() { return m_flags; }
public bool HasFlag(T flag) { return Convert.ToBoolean(Convert.ToInt32(m_flags) & 1 << Convert.ToInt32(flag)); }
public void AddFlag(T flag) { m_flags |= (uint)(1 << Convert.ToInt32(flag)); }
public void DelFlag(T flag) { m_flags &= ~(uint)(1 << Convert.ToInt32(flag)); }
public bool HasFlag(T flag) { return (m_flags & 1 << Convert.ToInt32(flag)) != 0; }
public void AddFlag(T flag) { m_flags |= (dynamic)(1 << Convert.ToInt32(flag)); }
public void DelFlag(T flag) { m_flags &= ~(dynamic)(1 << Convert.ToInt32(flag)); }
public int GetValue(T flag) { return m_values[Convert.ToInt32(flag)]; }
public void SetValue(T flag, object value) { m_values[Convert.ToInt32(flag)] = Convert.ToInt32(value); }
public void AddValue(T flag, object value) { m_values[Convert.ToInt32(flag)] += Convert.ToInt32(value); }
}
public class FlaggedArray64<T> where T : struct
{
int[] m_values;
ulong m_flags;
public FlaggedArray64(byte arraysize)
{
m_values = new int[4 * arraysize];
}
public ulong GetFlags() { return m_flags; }
public bool HasFlag(T flag) { return (m_flags & 1ul << Convert.ToInt32(flag)) != 0; }
public void AddFlag(T flag) { m_flags |= (dynamic)(1ul << Convert.ToInt32(flag)); }
public void DelFlag(T flag) { m_flags &= ~(dynamic)(1ul << Convert.ToInt32(flag)); }
public int GetValue(T flag) { return m_values[Convert.ToInt32(flag)]; }
public void SetValue(T flag, object value) { m_values[Convert.ToInt32(flag)] = Convert.ToInt32(value); }