Core/Players: Update racemask definitions to include Haranir

This commit is contained in:
Shauren
2026-03-07 13:59:51 +01:00
parent 5f40c537ab
commit a0f7556533
4 changed files with 120 additions and 139 deletions

View File

@@ -3947,12 +3947,12 @@ void ObjectMgr::LoadPlayerInfo()
if (!items)
continue;
for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex)
for (ChrRacesEntry const* race : sChrRacesStore)
{
if (!characterLoadout->RaceMask.HasRace(raceIndex))
if (!characterLoadout->RaceMask.HasRace(race->ID))
continue;
if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(raceIndex), Classes(characterLoadout->ChrClassID) }))
if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race->ID), Classes(characterLoadout->ChrClassID) }))
{
playerInfo->itemContext = ItemContext(characterLoadout->ItemContext);
@@ -4006,14 +4006,14 @@ void ObjectMgr::LoadPlayerInfo()
Field* fields = result->Fetch();
uint32 current_race = fields[0].GetUInt8();
if (current_race >= MAX_RACES)
if (!sChrRacesStore.HasRecord(current_race))
{
TC_LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo_item` table, ignoring.", current_race);
continue;
}
uint32 current_class = fields[1].GetUInt8();
if (current_class >= MAX_CLASSES)
if (!sChrClassesStore.HasRecord(current_class))
{
TC_LOG_ERROR("sql.sql", "Wrong class {} in `playercreateinfo_item` table, ignoring.", current_class);
continue;
@@ -4038,9 +4038,9 @@ void ObjectMgr::LoadPlayerInfo()
if (!current_race || !current_class)
{
uint32 min_race = current_race ? current_race : 1;
uint32 max_race = current_race ? current_race + 1 : MAX_RACES;
uint32 max_race = current_race ? current_race + 1 : sChrRacesStore.GetNumRows();
uint32 min_class = current_class ? current_class : 1;
uint32 max_class = current_class ? current_class + 1 : MAX_CLASSES;
uint32 max_class = current_class ? current_class + 1 : sChrClassesStore.GetNumRows();
for (uint32 r = min_race; r < max_race; ++r)
for (uint32 c = min_class; c < max_class; ++c)
PlayerCreateInfoAddItemHelper(r, c, item_id, amount);
@@ -4063,11 +4063,11 @@ void ObjectMgr::LoadPlayerInfo()
for (SkillRaceClassInfoEntry const* rcInfo : sSkillRaceClassInfoStore)
if (rcInfo->Availability == 1)
for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex)
if (rcInfo->RaceMask.IsEmpty() || rcInfo->RaceMask.HasRace(raceIndex))
for (ChrRacesEntry const* race : sChrRacesStore)
if (rcInfo->RaceMask.IsEmpty() || rcInfo->RaceMask.HasRace(race->ID))
for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex)
if (rcInfo->ClassMask == -1 || rcInfo->ClassMask == 0 || ((1 << (classIndex - 1)) & rcInfo->ClassMask))
if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(raceIndex), Classes(classIndex) }))
if (PlayerInfo* playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race->ID), Classes(classIndex) }))
playerInfo->skills.push_back(rcInfo);
TC_LOG_INFO("server.loading", ">> Loaded player create skills in {} ms", GetMSTimeDiffToNow(oldMSTime));
@@ -4107,15 +4107,15 @@ void ObjectMgr::LoadPlayerInfo()
continue;
}
for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex)
for (ChrRacesEntry const* race : sChrRacesStore)
{
if (raceMask.IsEmpty() || raceMask.HasRace(raceIndex))
if (raceMask.IsEmpty() || raceMask.HasRace(race->ID))
{
for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex)
{
if (classMask == 0 || ((1 << (classIndex - 1)) & classMask))
{
if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(raceIndex), Classes(classIndex) }))
if (PlayerInfo* playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, {Races(race->ID), Classes(classIndex)}))
{
playerInfo->customSpells.push_back(spellId);
++count;
@@ -4174,15 +4174,15 @@ void ObjectMgr::LoadPlayerInfo()
continue;
}
for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex)
for (ChrRacesEntry const* race : sChrRacesStore)
{
if (raceMask.IsEmpty() || raceMask.HasRace(raceIndex))
if (raceMask.IsEmpty() || raceMask.HasRace(race->ID))
{
for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex)
{
if (classMask == 0 || ((1 << (classIndex - 1)) & classMask))
{
if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(raceIndex), Classes(classIndex) }))
if (PlayerInfo* playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race->ID), Classes(classIndex) }))
{
playerInfo->castSpells[playerCreateMode].push_back(spellId);
++count;
@@ -4218,14 +4218,14 @@ void ObjectMgr::LoadPlayerInfo()
Field* fields = result->Fetch();
uint32 current_race = fields[0].GetUInt8();
if (current_race >= MAX_RACES)
if (!sChrRacesStore.HasRecord(current_race))
{
TC_LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo_action` table, ignoring.", current_race);
continue;
}
uint32 current_class = fields[1].GetUInt8();
if (current_class >= MAX_CLASSES)
if (!sChrClassesStore.HasRecord(current_class))
{
TC_LOG_ERROR("sql.sql", "Wrong class {} in `playercreateinfo_action` table, ignoring.", current_class);
continue;
@@ -4247,10 +4247,15 @@ void ObjectMgr::LoadPlayerInfo()
{
struct RaceStats
{
Races Race;
std::array<int16, MAX_STATS> StatModifier = { };
explicit RaceStats(Races race) : Race(race) { }
std::strong_ordering operator<=>(RaceStats const& right) const { return Race <=> right.Race; }
bool operator==(RaceStats const& right) const { return Race == right.Race; }
};
std::array<RaceStats, MAX_RACES> raceStatModifiers = { };
Trinity::Containers::FlatSet<RaceStats> raceStatModifiers;
uint32 oldMSTime = getMSTime();
@@ -4267,14 +4272,15 @@ void ObjectMgr::LoadPlayerInfo()
Field* fields = raceStatsResult->Fetch();
uint32 current_race = fields[0].GetUInt8();
if (current_race >= MAX_RACES)
if (!sChrRacesStore.HasRecord(current_race))
{
TC_LOG_ERROR("sql.sql", "Wrong race {} in `player_racestats` table, ignoring.", current_race);
continue;
}
RaceStats& stats = *raceStatModifiers.emplace(Races(current_race)).first;
for (uint32 i = 0; i < MAX_STATS; ++i)
raceStatModifiers[current_race].StatModifier[i] = fields[i + 1].GetInt16();
stats.StatModifier[i] = fields[i + 1].GetInt16();
} while (raceStatsResult->NextRow());
@@ -4294,7 +4300,7 @@ void ObjectMgr::LoadPlayerInfo()
Field* fields = result->Fetch();
uint32 current_class = fields[0].GetUInt8();
if (current_class >= MAX_CLASSES)
if (!sChrClassesStore.HasRecord(current_class))
{
TC_LOG_ERROR("sql.sql", "Wrong class {} in `player_classlevelstats` table, ignoring.", current_class);
continue;
@@ -4311,16 +4317,16 @@ void ObjectMgr::LoadPlayerInfo()
continue;
}
for (std::size_t race = 0; race < raceStatModifiers.size(); ++race)
for (RaceStats const& raceStats : raceStatModifiers)
{
if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(current_class) }))
if (PlayerInfo* playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { raceStats.Race, Classes(current_class) }))
{
if (!playerInfo->levelInfo)
playerInfo->levelInfo = std::make_unique<PlayerLevelInfo[]>(sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL));
PlayerLevelInfo& levelInfo = playerInfo->levelInfo[current_level - 1];
for (uint8 i = 0; i < MAX_STATS; ++i)
levelInfo.stats[i] = fields[i + 2].GetInt32() + raceStatModifiers[race].StatModifier[i];
levelInfo.stats[i] = fields[i + 2].GetInt32() + raceStats.StatModifier[i];
}
}
@@ -4329,61 +4335,24 @@ void ObjectMgr::LoadPlayerInfo()
while (result->NextRow());
// Fill gaps and check integrity
for (uint8 race = 0; race < MAX_RACES; ++race)
for (auto const& [raceClass, playerInfo] : _playerInfo)
{
// skip non existed races
if (!sChrRacesStore.LookupEntry(race))
continue;
auto [race, class_] = raceClass;
for (uint8 class_ = 0; class_ < MAX_CLASSES; ++class_)
// fatal error if no level 1 data
if (!playerInfo->levelInfo || playerInfo->levelInfo[0].stats[0] == 0)
{
// skip non existed classes
if (!sChrClassesStore.LookupEntry(class_))
continue;
TC_LOG_ERROR("sql.sql", "Race {} Class {} Level 1 does not have stats data!", race, class_);
ABORT();
}
auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(class_) });
if (!playerInfo)
continue;
// skip expansion races if not playing with expansion
if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_THE_BURNING_CRUSADE && (race == RACE_BLOODELF || race == RACE_DRAENEI))
continue;
// skip expansion classes if not playing with expansion
if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_WRATH_OF_THE_LICH_KING && class_ == CLASS_DEATH_KNIGHT)
continue;
// skip expansion races if not playing with expansion
if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_CATACLYSM && (race == RACE_GOBLIN || race == RACE_WORGEN))
continue;
if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_MISTS_OF_PANDARIA && (race == RACE_PANDAREN_NEUTRAL || race == RACE_PANDAREN_HORDE || race == RACE_PANDAREN_ALLIANCE))
continue;
if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_LEGION && class_ == CLASS_DEMON_HUNTER)
continue;
if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_DRAGONFLIGHT && (class_ == CLASS_EVOKER || race == RACE_DRACTHYR_ALLIANCE || race == RACE_DRACTHYR_HORDE))
continue;
if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_THE_WAR_WITHIN && (race == RACE_EARTHEN_DWARF_HORDE || race == RACE_EARTHEN_DWARF_ALLIANCE))
continue;
// fatal error if no level 1 data
if (!playerInfo->levelInfo || playerInfo->levelInfo[0].stats[0] == 0)
// fill level gaps
for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
{
if (playerInfo->levelInfo[level].stats[0] == 0)
{
TC_LOG_ERROR("sql.sql", "Race {} Class {} Level 1 does not have stats data!", race, class_);
ABORT();
}
// fill level gaps
for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
{
if (playerInfo->levelInfo[level].stats[0] == 0)
{
TC_LOG_ERROR("sql.sql", "Race {} Class {} Level {} does not have stats data. Using stats data of level {}.", race, class_, level + 1, level);
playerInfo->levelInfo[level] = playerInfo->levelInfo[level - 1];
}
TC_LOG_ERROR("sql.sql", "Race {} Class {} Level {} does not have stats data. Using stats data of level {}.", race, class_, level + 1, level);
playerInfo->levelInfo[level] = playerInfo->levelInfo[level - 1];
}
}
}
@@ -4468,10 +4437,10 @@ void ObjectMgr::GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& base
void ObjectMgr::GetPlayerLevelInfo(uint32 race, uint32 class_, uint8 level, PlayerLevelInfo* info) const
{
if (level < 1 || race >= MAX_RACES || class_ >= MAX_CLASSES)
if (level < 1)
return;
PlayerInfo const* pInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, {Races(race), Classes(class_)});
PlayerInfo const* pInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(class_) });
if (!pInfo)
return;
@@ -10609,10 +10578,6 @@ VehicleAccessoryList const* ObjectMgr::GetVehicleAccessoryList(Vehicle* veh) con
PlayerInfo const* ObjectMgr::GetPlayerInfo(uint32 race, uint32 class_) const
{
if (race >= MAX_RACES)
return nullptr;
if (class_ >= MAX_CLASSES)
return nullptr;
return Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(class_) });
}

View File

@@ -15,8 +15,8 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef RaceMask_h__
#define RaceMask_h__
#ifndef TRINITYCORE_RACE_MASK_H
#define TRINITYCORE_RACE_MASK_H
#include "Define.h"
#include <type_traits>
@@ -76,13 +76,13 @@ enum Races
//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,
RACE_HARANIR_ALLIANCE = 86, // TITLE Haranir DESCRIPTION Haranir (Alliance) (RaceMask bit 20)
//RACE_ROSTRUM_AIRSHIP_SEASON_1 = 87,
//RACE_ROSTRUM_AIRSHIP_SEASON_2 = 90,
RACE_HARANIR_HORDE = 91, // TITLE Haranir DESCRIPTION Haranir (Horde) (RaceMask bit 19)
//RACE_ROSTRUM_AIRSHIP_SEASON_3 = 92,
};
// max+1 for player race
#define MAX_RACES 88
namespace Trinity
{
template<typename T>
@@ -92,12 +92,12 @@ struct RaceMask
T RawValue;
constexpr bool HasRace(uint8 raceId) const
constexpr bool HasRace(uint32 raceId) const
{
return (RawValue & GetMaskForRace(raceId)) != 0;
}
static constexpr int32 GetRaceBit(uint8 raceId)
static constexpr int32 GetRaceBit(uint32 raceId)
{
switch (raceId)
{
@@ -139,13 +139,17 @@ struct RaceMask
return 17;
case RACE_EARTHEN_DWARF_ALLIANCE:
return 18;
case RACE_HARANIR_HORDE:
return 19;
case RACE_HARANIR_ALLIANCE:
return 20;
default:
break;
}
return -1;
}
static constexpr T GetMaskForRace(uint8 raceId)
static constexpr T GetMaskForRace(uint32 raceId)
{
int32 raceBit = GetRaceBit(raceId);
return raceBit >= 0 && uint32(raceBit) < sizeof(T) * 8 ? (T(1) << raceBit) : T(0);
@@ -159,55 +163,59 @@ struct RaceMask
};
}
constexpr Trinity::RaceMask<uint64> RACEMASK_ALL_PLAYABLE = { std::integral_constant<uint64,
inline constexpr Trinity::RaceMask<uint64> RACEMASK_ALL_PLAYABLE = { std::integral_constant<uint64,
// force compile time evaluation via integral_constant
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_HUMAN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_ORC) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DWARF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_NIGHTELF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_UNDEAD_PLAYER) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_TAUREN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_GNOME) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_TROLL) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_BLOODELF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DRAENEI) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_GOBLIN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_WORGEN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_PANDAREN_NEUTRAL) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_PANDAREN_ALLIANCE) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_PANDAREN_HORDE) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_NIGHTBORNE) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_HIGHMOUNTAIN_TAUREN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_VOID_ELF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_LIGHTFORGED_DRAENEI) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_ZANDALARI_TROLL) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_KUL_TIRAN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DARK_IRON_DWARF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_VULPERA) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_MAGHAR_ORC) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_MECHAGNOME) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DRACTHYR_ALLIANCE) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DRACTHYR_HORDE) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_EARTHEN_DWARF_HORDE)>::value };
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_HUMAN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_ORC) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DWARF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_NIGHTELF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_UNDEAD_PLAYER) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_TAUREN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_GNOME) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_TROLL) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_BLOODELF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DRAENEI) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_GOBLIN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_WORGEN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_PANDAREN_NEUTRAL) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_PANDAREN_ALLIANCE) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_PANDAREN_HORDE) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_NIGHTBORNE) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_HIGHMOUNTAIN_TAUREN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_VOID_ELF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_LIGHTFORGED_DRAENEI) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_ZANDALARI_TROLL) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_KUL_TIRAN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DARK_IRON_DWARF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_VULPERA) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_MAGHAR_ORC) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_MECHAGNOME) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DRACTHYR_ALLIANCE) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DRACTHYR_HORDE) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_EARTHEN_DWARF_HORDE) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_EARTHEN_DWARF_ALLIANCE) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_HARANIR_ALLIANCE) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_HARANIR_HORDE)>::value };
constexpr Trinity::RaceMask<uint64> RACEMASK_NEUTRAL = { std::integral_constant<uint64, Trinity::RaceMask<uint64>::GetMaskForRace(RACE_PANDAREN_NEUTRAL)>::value };
inline constexpr Trinity::RaceMask<uint64> RACEMASK_NEUTRAL = { std::integral_constant<uint64, Trinity::RaceMask<uint64>::GetMaskForRace(RACE_PANDAREN_NEUTRAL)>::value };
constexpr Trinity::RaceMask<uint64> RACEMASK_ALLIANCE = { std::integral_constant<uint64,
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_HUMAN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DWARF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_NIGHTELF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_GNOME) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DRAENEI) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_WORGEN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_PANDAREN_ALLIANCE) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_VOID_ELF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_LIGHTFORGED_DRAENEI) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_KUL_TIRAN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DARK_IRON_DWARF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_MECHAGNOME) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DRACTHYR_ALLIANCE) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_EARTHEN_DWARF_ALLIANCE)>::value };
inline constexpr Trinity::RaceMask<uint64> RACEMASK_ALLIANCE = { std::integral_constant<uint64,
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_HUMAN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DWARF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_NIGHTELF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_GNOME) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DRAENEI) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_WORGEN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_PANDAREN_ALLIANCE) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_VOID_ELF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_LIGHTFORGED_DRAENEI) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_KUL_TIRAN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DARK_IRON_DWARF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_MECHAGNOME) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DRACTHYR_ALLIANCE) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_EARTHEN_DWARF_ALLIANCE) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_HARANIR_ALLIANCE)>::value };
constexpr Trinity::RaceMask<uint64> RACEMASK_HORDE = { std::integral_constant<uint64, (RACEMASK_ALL_PLAYABLE & ~(RACEMASK_NEUTRAL | RACEMASK_ALLIANCE)).RawValue>::value };
inline constexpr Trinity::RaceMask<uint64> RACEMASK_HORDE = { std::integral_constant<uint64, (RACEMASK_ALL_PLAYABLE & ~(RACEMASK_NEUTRAL | RACEMASK_ALLIANCE)).RawValue>::value };
#endif // RaceMask_h__
#endif // TRINITYCORE_RACE_MASK_H

View File

@@ -60,12 +60,14 @@ TC_API_EXPORT EnumText EnumUtils<Races>::ToString(Races value)
case RACE_DRACTHYR_HORDE: return { "RACE_DRACTHYR_HORDE", "Dracthyr", "Dracthyr (Horde) (RaceMask bit 15)" };
case RACE_EARTHEN_DWARF_HORDE: return { "RACE_EARTHEN_DWARF_HORDE", "Earthen", "Earthen (Horde) (RaceMask bit 17)" };
case RACE_EARTHEN_DWARF_ALLIANCE: return { "RACE_EARTHEN_DWARF_ALLIANCE", "Earthen", "Earthen (Alliance) (RaceMask bit 18)" };
case RACE_HARANIR_ALLIANCE: return { "RACE_HARANIR_ALLIANCE", "Haranir", "Haranir (Alliance) (RaceMask bit 20)" };
case RACE_HARANIR_HORDE: return { "RACE_HARANIR_HORDE", "Haranir", "Haranir (Horde) (RaceMask bit 19)" };
default: throw std::out_of_range("value");
}
}
template <>
TC_API_EXPORT size_t EnumUtils<Races>::Count() { return 29; }
TC_API_EXPORT size_t EnumUtils<Races>::Count() { return 31; }
template <>
TC_API_EXPORT Races EnumUtils<Races>::FromIndex(size_t index)
@@ -101,6 +103,8 @@ TC_API_EXPORT Races EnumUtils<Races>::FromIndex(size_t index)
case 26: return RACE_DRACTHYR_HORDE;
case 27: return RACE_EARTHEN_DWARF_HORDE;
case 28: return RACE_EARTHEN_DWARF_ALLIANCE;
case 29: return RACE_HARANIR_ALLIANCE;
case 30: return RACE_HARANIR_HORDE;
default: throw std::out_of_range("index");
}
}
@@ -139,6 +143,8 @@ TC_API_EXPORT size_t EnumUtils<Races>::ToIndex(Races value)
case RACE_DRACTHYR_HORDE: return 26;
case RACE_EARTHEN_DWARF_HORDE: return 27;
case RACE_EARTHEN_DWARF_ALLIANCE: return 28;
case RACE_HARANIR_ALLIANCE: return 29;
case RACE_HARANIR_HORDE: return 30;
default: throw std::out_of_range("value");
}
}

View File

@@ -799,6 +799,8 @@ CharacterCreating.Disabled = 0
# 65536 - (Disabled, Dracthyr Alliance)
# 131072 - (Disabled, Earthen Horde)
# 262144 - (Disabled, Earthen Alliance)
# 524288 - (Disabled, Haranir Horde)
# 1048576 - (Disabled, Haranir Alliance)
# 2097152 - (Disabled, Worgen)
# 8388608 - (Disabled, Pandaren Neutral)
# 16777216 - (Disabled, Pandaren Alliance)