diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 9c0714375e..27f6ebdfb0 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -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 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 raceStatModifiers = { }; + Trinity::Containers::FlatSet 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(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_) }); } diff --git a/src/server/game/Miscellaneous/RaceMask.h b/src/server/game/Miscellaneous/RaceMask.h index 93a2324205..0db0033b59 100644 --- a/src/server/game/Miscellaneous/RaceMask.h +++ b/src/server/game/Miscellaneous/RaceMask.h @@ -15,8 +15,8 @@ * with this program. If not, see . */ -#ifndef RaceMask_h__ -#define RaceMask_h__ +#ifndef TRINITYCORE_RACE_MASK_H +#define TRINITYCORE_RACE_MASK_H #include "Define.h" #include @@ -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 @@ -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 RACEMASK_ALL_PLAYABLE = { std::integral_constant 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 }; + Trinity::RaceMask::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) | + Trinity::RaceMask::GetMaskForRace(RACE_EARTHEN_DWARF_ALLIANCE) | + Trinity::RaceMask::GetMaskForRace(RACE_HARANIR_ALLIANCE) | + Trinity::RaceMask::GetMaskForRace(RACE_HARANIR_HORDE)>::value }; -constexpr Trinity::RaceMask RACEMASK_NEUTRAL = { std::integral_constant::GetMaskForRace(RACE_PANDAREN_NEUTRAL)>::value }; +inline 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 }; +inline 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) | + Trinity::RaceMask::GetMaskForRace(RACE_HARANIR_ALLIANCE)>::value }; -constexpr Trinity::RaceMask RACEMASK_HORDE = { std::integral_constant::value }; +inline constexpr Trinity::RaceMask RACEMASK_HORDE = { std::integral_constant::value }; -#endif // RaceMask_h__ +#endif // TRINITYCORE_RACE_MASK_H diff --git a/src/server/game/Miscellaneous/enuminfo_RaceMask.cpp b/src/server/game/Miscellaneous/enuminfo_RaceMask.cpp index 3225a607db..0222be5519 100644 --- a/src/server/game/Miscellaneous/enuminfo_RaceMask.cpp +++ b/src/server/game/Miscellaneous/enuminfo_RaceMask.cpp @@ -60,12 +60,14 @@ TC_API_EXPORT EnumText EnumUtils::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::Count() { return 29; } +TC_API_EXPORT size_t EnumUtils::Count() { return 31; } template <> TC_API_EXPORT Races EnumUtils::FromIndex(size_t index) @@ -101,6 +103,8 @@ TC_API_EXPORT Races EnumUtils::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::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"); } } diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 806ddd763f..2a1f8d6cb1 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -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)