// Copyright (c) CypherCore All rights reserved. // Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information. using Framework.Constants; using System.Runtime.InteropServices; namespace Game.Miscellaneous { public struct RaceMask { public static RaceMask AllPlayable = new RaceMask( RaceMask.GetMaskForRace(Race.Human) | RaceMask.GetMaskForRace(Race.Orc) | RaceMask.GetMaskForRace(Race.Dwarf) | RaceMask.GetMaskForRace(Race.NightElf) | RaceMask.GetMaskForRace(Race.Undead) | RaceMask.GetMaskForRace(Race.Tauren) | RaceMask.GetMaskForRace(Race.Gnome) | RaceMask.GetMaskForRace(Race.Troll) | RaceMask.GetMaskForRace(Race.BloodElf) | RaceMask.GetMaskForRace(Race.Draenei) | RaceMask.GetMaskForRace(Race.Goblin) | RaceMask.GetMaskForRace(Race.Worgen) | RaceMask.GetMaskForRace(Race.PandarenNeutral) | RaceMask.GetMaskForRace(Race.PandarenAlliance) | RaceMask.GetMaskForRace(Race.PandarenHorde) | RaceMask.GetMaskForRace(Race.Nightborne) | RaceMask.GetMaskForRace(Race.HighmountainTauren) | RaceMask.GetMaskForRace(Race.VoidElf) | RaceMask.GetMaskForRace(Race.LightforgedDraenei) | RaceMask.GetMaskForRace(Race.ZandalariTroll) | RaceMask.GetMaskForRace(Race.KulTiran) | RaceMask.GetMaskForRace(Race.DarkIronDwarf) | RaceMask.GetMaskForRace(Race.Vulpera) | RaceMask.GetMaskForRace(Race.MagharOrc) | RaceMask.GetMaskForRace(Race.MechaGnome) | RaceMask.GetMaskForRace(Race.DracthyrAlliance) | RaceMask.GetMaskForRace(Race.DracthyrHorde)); public static RaceMask Neutral = new(RaceMask.GetMaskForRace(Race.PandarenNeutral)); public static RaceMask Alliance = new( RaceMask.GetMaskForRace(Race.Human) | RaceMask.GetMaskForRace(Race.Dwarf) | RaceMask.GetMaskForRace(Race.NightElf) | RaceMask.GetMaskForRace(Race.Gnome) | RaceMask.GetMaskForRace(Race.Draenei) | RaceMask.GetMaskForRace(Race.Worgen) | RaceMask.GetMaskForRace(Race.PandarenAlliance) | RaceMask.GetMaskForRace(Race.VoidElf) | RaceMask.GetMaskForRace(Race.LightforgedDraenei) | RaceMask.GetMaskForRace(Race.KulTiran) | RaceMask.GetMaskForRace(Race.DarkIronDwarf) | RaceMask.GetMaskForRace(Race.MechaGnome) | RaceMask.GetMaskForRace(Race.DracthyrAlliance)); public static RaceMask Horde = new(AllPlayable.RawValue & ~(Neutral | Alliance).RawValue); } public struct RaceMask where T : unmanaged { public T RawValue; public RaceMask(T rawValue) { RawValue = rawValue; } public bool HasRace(Race raceId) { return ((dynamic)RawValue & GetMaskForRace(raceId)) != 0; } public bool IsEmpty() { return RawValue == (dynamic)0; } public static RaceMask operator &(RaceMask left, RaceMask right) { return new RaceMask((dynamic)left.RawValue & right.RawValue); } public static RaceMask operator |(RaceMask left, RaceMask right) { return new RaceMask((dynamic)left.RawValue | right.RawValue); } public static explicit operator T(RaceMask raceMask) { return raceMask.RawValue; } public static dynamic GetMaskForRace(Race raceId) { int raceBit = GetRaceBit(raceId); return (raceBit >= 0 && (uint)raceBit < Marshal.SizeOf() * 8 ? (1 << raceBit) : 0); } static int GetRaceBit(Race raceId) { switch (raceId) { case Race.Human: case Race.Orc: case Race.Dwarf: case Race.NightElf: case Race.Undead: case Race.Tauren: case Race.Gnome: case Race.Troll: case Race.Goblin: case Race.BloodElf: case Race.Draenei: case Race.Worgen: case Race.PandarenNeutral: case Race.PandarenAlliance: case Race.PandarenHorde: case Race.Nightborne: case Race.HighmountainTauren: case Race.VoidElf: case Race.LightforgedDraenei: case Race.ZandalariTroll: case Race.KulTiran: return (int)raceId - 1; case Race.DarkIronDwarf: return 11; case Race.Vulpera: return 12; case Race.MagharOrc: return 13; case Race.MechaGnome: return 14; case Race.DracthyrAlliance: return 16; case Race.DracthyrHorde: return 15; default: break; } return -1; } } }