// 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((ulong)( 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) | RaceMask.GetMaskForRace(Race.EarthenDwarfHorde) | RaceMask.GetMaskForRace(Race.EarthenDwarfAlliance))); public static RaceMask Neutral = new RaceMask((ulong)RaceMask.GetMaskForRace(Race.PandarenNeutral)); public static RaceMask Alliance = new RaceMask((ulong)( 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) | RaceMask.GetMaskForRace(Race.EarthenDwarfAlliance))); public static RaceMask Horde = new RaceMask((ulong)(AllPlayable.RawValue & (~(Neutral | Alliance).RawValue))); } public struct RaceMask { public dynamic RawValue; public RaceMask(T rawValue) { RawValue = rawValue; } public bool HasRace(Race raceId) { return (RawValue & GetMaskForRace(raceId)) != 0; } public bool IsEmpty() { return RawValue == 0; } public static RaceMask operator &(RaceMask left, RaceMask right) { return new RaceMask(left.RawValue & right.RawValue); } public static RaceMask operator |(RaceMask left, RaceMask right) { return new RaceMask(left.RawValue | right.RawValue); } public static dynamic GetMaskForRace(Race raceId) { int raceBit = GetRaceBit(raceId); return (T)(dynamic)(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; case Race.EarthenDwarfHorde: return 17; case Race.EarthenDwarfAlliance: return 18; default: break; } return -1; } } }