/* * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #ifndef RaceMask_h__ #define RaceMask_h__ #include "Define.h" #include // EnumUtils: DESCRIBE THIS enum Races { RACE_NONE = 0, // SKIP RACE_HUMAN = 1, // TITLE Human RACE_ORC = 2, // TITLE Orc RACE_DWARF = 3, // TITLE Dwarf RACE_NIGHTELF = 4, // TITLE Night Elf RACE_UNDEAD_PLAYER = 5, // TITLE Undead RACE_TAUREN = 6, // TITLE Tauren RACE_GNOME = 7, // TITLE Gnome RACE_TROLL = 8, // TITLE Troll RACE_GOBLIN = 9, // TITLE Goblin RACE_BLOODELF = 10, // TITLE Blood Elf RACE_DRAENEI = 11, // TITLE Draenei //RACE_FEL_ORC = 12, //RACE_NAGA = 13, //RACE_BROKEN = 14, //RACE_SKELETON = 15, //RACE_VRYKUL = 16, //RACE_TUSKARR = 17, //RACE_FOREST_TROLL = 18, //RACE_TAUNKA = 19, //RACE_NORTHREND_SKELETON = 20, //RACE_ICE_TROLL = 21, RACE_WORGEN = 22, // TITLE Worgen //RACE_GILNEAN = 23, RACE_PANDAREN_NEUTRAL = 24, // TITLE Pandaren DESCRIPTION Pandaren (Neutral) RACE_PANDAREN_ALLIANCE = 25, // TITLE Pandaren DESCRIPTION Pandaren (Alliance) RACE_PANDAREN_HORDE = 26, // TITLE Pandaren DESCRIPTION Pandaren (Horde) RACE_NIGHTBORNE = 27, // TITLE Nightborne RACE_HIGHMOUNTAIN_TAUREN = 28, // TITLE Highmountain Tauren RACE_VOID_ELF = 29, // TITLE Void Elf RACE_LIGHTFORGED_DRAENEI = 30, // TITLE Lightforged Draenei RACE_ZANDALARI_TROLL = 31, // TITLE Zandalari Troll RACE_KUL_TIRAN = 32, // TITLE Kul Tiran //RACE_THIN_HUMAN = 33, RACE_DARK_IRON_DWARF = 34, // TITLE Dark Iron Dwarf DESCRIPTION Dark Iron Dwarf (RaceMask bit 11) RACE_VULPERA = 35, // TITLE Vulpera DESCRIPTION Vulpera (RaceMask bit 12) RACE_MAGHAR_ORC = 36, // TITLE Mag'har Orc DESCRIPTION Mag'har Orc (RaceMask bit 13) RACE_MECHAGNOME = 37, // TITLE Mechagnome DESCRIPTION Mechagnome (RaceMask bit 14) RACE_DRACTHYR_ALLIANCE = 52, // TITLE Dracthyr DESCRIPTION Dracthyr (Alliance) (RaceMask bit 16) RACE_DRACTHYR_HORDE = 70, // TITLE Dracthyr DESCRIPTION Dracthyr (Horde) (RaceMask bit 15) //RACE_COMPANION_DRAKE = 71, //RACE_COMPANION_PROTO_DRAGON = 72, //RACE_COMPANION_SERPENT = 73, //RACE_COMPANION_WYVERN = 74, //RACE_DRACTHYR_VISAGE_ALLIANCE = 75, //RACE_DRACTHYR_VISAGE_HORDE = 76, //RACE_COMPANION_PTERRODAX = 77, //RACE_COMPANION_NETHERWING_DRAKE = 80, //RACE_ROSTRUM_STORM_GRYPHON = 82, //RACE_ROSTRUM_FAERIE_DRAGON = 83, RACE_EARTHEN_DWARF_HORDE = 84, // TITLE Earthen DESCRIPTION Earthen (Horde) (RaceMask bit 17) RACE_EARTHEN_DWARF_ALLIANCE = 85, // TITLE Earthen DESCRIPTION Earthen (Alliance) (RaceMask bit 18) //RACE_HARRONIR = 86, //RACE_ROSTRUM_AIRSHIP = 87, }; // max+1 for player race #define MAX_RACES 88 namespace Trinity { template struct RaceMask { static_assert(std::is_integral_v, "RaceMask must be integral"); T RawValue; constexpr bool HasRace(uint8 raceId) const { return (RawValue & GetMaskForRace(raceId)) != 0; } static constexpr int32 GetRaceBit(uint8 raceId) { switch (raceId) { case RACE_HUMAN: case RACE_ORC: case RACE_DWARF: case RACE_NIGHTELF: case RACE_UNDEAD_PLAYER: case RACE_TAUREN: case RACE_GNOME: case RACE_TROLL: case RACE_GOBLIN: case RACE_BLOODELF: case RACE_DRAENEI: case RACE_WORGEN: case RACE_PANDAREN_NEUTRAL: case RACE_PANDAREN_ALLIANCE: case RACE_PANDAREN_HORDE: case RACE_NIGHTBORNE: case RACE_HIGHMOUNTAIN_TAUREN: case RACE_VOID_ELF: case RACE_LIGHTFORGED_DRAENEI: case RACE_ZANDALARI_TROLL: case RACE_KUL_TIRAN: return raceId - 1; case RACE_DARK_IRON_DWARF: return 11; case RACE_VULPERA: return 12; case RACE_MAGHAR_ORC: return 13; case RACE_MECHAGNOME: return 14; case RACE_DRACTHYR_ALLIANCE: return 16; case RACE_DRACTHYR_HORDE: return 15; case RACE_EARTHEN_DWARF_HORDE: return 17; case RACE_EARTHEN_DWARF_ALLIANCE: return 18; default: break; } return -1; } static constexpr T GetMaskForRace(uint8 raceId) { int32 raceBit = GetRaceBit(raceId); return raceBit >= 0 && uint32(raceBit) < sizeof(T) * 8 ? (T(1) << raceBit) : T(0); } constexpr bool IsEmpty() const { return RawValue == T(0); } constexpr RaceMask operator&(RaceMask right) const { return { RawValue & right.RawValue }; } constexpr RaceMask operator|(RaceMask right) const { return { RawValue | right.RawValue }; } constexpr RaceMask operator~() const { return { ~RawValue }; } }; } constexpr Trinity::RaceMask RACEMASK_ALL_PLAYABLE = { std::integral_constant::GetMaskForRace(RACE_HUMAN) | Trinity::RaceMask::GetMaskForRace(RACE_ORC) | Trinity::RaceMask::GetMaskForRace(RACE_DWARF) | Trinity::RaceMask::GetMaskForRace(RACE_NIGHTELF) | Trinity::RaceMask::GetMaskForRace(RACE_UNDEAD_PLAYER) | Trinity::RaceMask::GetMaskForRace(RACE_TAUREN) | Trinity::RaceMask::GetMaskForRace(RACE_GNOME) | Trinity::RaceMask::GetMaskForRace(RACE_TROLL) | Trinity::RaceMask::GetMaskForRace(RACE_BLOODELF) | Trinity::RaceMask::GetMaskForRace(RACE_DRAENEI) | Trinity::RaceMask::GetMaskForRace(RACE_GOBLIN) | Trinity::RaceMask::GetMaskForRace(RACE_WORGEN) | Trinity::RaceMask::GetMaskForRace(RACE_PANDAREN_NEUTRAL) | Trinity::RaceMask::GetMaskForRace(RACE_PANDAREN_ALLIANCE) | Trinity::RaceMask::GetMaskForRace(RACE_PANDAREN_HORDE) | Trinity::RaceMask::GetMaskForRace(RACE_NIGHTBORNE) | Trinity::RaceMask::GetMaskForRace(RACE_HIGHMOUNTAIN_TAUREN) | Trinity::RaceMask::GetMaskForRace(RACE_VOID_ELF) | Trinity::RaceMask::GetMaskForRace(RACE_LIGHTFORGED_DRAENEI) | Trinity::RaceMask::GetMaskForRace(RACE_ZANDALARI_TROLL) | Trinity::RaceMask::GetMaskForRace(RACE_KUL_TIRAN) | Trinity::RaceMask::GetMaskForRace(RACE_DARK_IRON_DWARF) | Trinity::RaceMask::GetMaskForRace(RACE_VULPERA) | Trinity::RaceMask::GetMaskForRace(RACE_MAGHAR_ORC) | Trinity::RaceMask::GetMaskForRace(RACE_MECHAGNOME) | Trinity::RaceMask::GetMaskForRace(RACE_DRACTHYR_ALLIANCE) | Trinity::RaceMask::GetMaskForRace(RACE_DRACTHYR_HORDE) | Trinity::RaceMask::GetMaskForRace(RACE_EARTHEN_DWARF_HORDE)>::value }; constexpr Trinity::RaceMask RACEMASK_NEUTRAL = { std::integral_constant::GetMaskForRace(RACE_PANDAREN_NEUTRAL)>::value }; constexpr Trinity::RaceMask RACEMASK_ALLIANCE = { std::integral_constant::GetMaskForRace(RACE_HUMAN) | Trinity::RaceMask::GetMaskForRace(RACE_DWARF) | Trinity::RaceMask::GetMaskForRace(RACE_NIGHTELF) | Trinity::RaceMask::GetMaskForRace(RACE_GNOME) | Trinity::RaceMask::GetMaskForRace(RACE_DRAENEI) | Trinity::RaceMask::GetMaskForRace(RACE_WORGEN) | Trinity::RaceMask::GetMaskForRace(RACE_PANDAREN_ALLIANCE) | Trinity::RaceMask::GetMaskForRace(RACE_VOID_ELF) | Trinity::RaceMask::GetMaskForRace(RACE_LIGHTFORGED_DRAENEI) | Trinity::RaceMask::GetMaskForRace(RACE_KUL_TIRAN) | Trinity::RaceMask::GetMaskForRace(RACE_DARK_IRON_DWARF) | Trinity::RaceMask::GetMaskForRace(RACE_MECHAGNOME) | Trinity::RaceMask::GetMaskForRace(RACE_DRACTHYR_ALLIANCE) | Trinity::RaceMask::GetMaskForRace(RACE_EARTHEN_DWARF_ALLIANCE)>::value }; constexpr Trinity::RaceMask RACEMASK_HORDE = { std::integral_constant::value }; #endif // RaceMask_h__