aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/hotfixes/master/2023_10_05_26_hotfixes.sql38
-rw-r--r--src/common/Utilities/Util.h33
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.cpp6
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.h4
-rw-r--r--src/server/game/DataStores/DB2LoadInfo.h16
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp2
-rw-r--r--src/server/game/DataStores/DB2Stores.h1
-rw-r--r--src/server/game/DataStores/DB2Structure.h15
-rw-r--r--src/server/game/DataStores/DBCEnums.h20
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp65
-rw-r--r--src/server/game/World/World.cpp12
-rw-r--r--src/server/game/World/World.h42
-rw-r--r--src/server/shared/Realm/Realm.h2
13 files changed, 155 insertions, 101 deletions
diff --git a/sql/updates/hotfixes/master/2023_10_05_26_hotfixes.sql b/sql/updates/hotfixes/master/2023_10_05_26_hotfixes.sql
new file mode 100644
index 00000000000..111abc03f6b
--- /dev/null
+++ b/sql/updates/hotfixes/master/2023_10_05_26_hotfixes.sql
@@ -0,0 +1,38 @@
+--
+-- Table structure for table `cfg_categories`
+--
+DROP TABLE IF EXISTS `cfg_categories`;
+CREATE TABLE `cfg_categories` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `Name` text,
+ `LocaleMask` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `CreateCharsetMask` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `ExistingCharsetMask` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `Order` tinyint(4) NOT NULL DEFAULT '0',
+ `VerifiedBuild` int(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`,`VerifiedBuild`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+--
+-- Table structure for table `cfg_categories_locale`
+--
+DROP TABLE IF EXISTS `cfg_categories_locale`;
+CREATE TABLE `cfg_categories_locale` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `locale` varchar(4) NOT NULL,
+ `Name_lang` text,
+ `VerifiedBuild` int(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`,`locale`,`VerifiedBuild`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
+/*!50500 PARTITION BY LIST COLUMNS(locale)
+(PARTITION deDE VALUES IN ('deDE') ENGINE = InnoDB,
+ PARTITION esES VALUES IN ('esES') ENGINE = InnoDB,
+ PARTITION esMX VALUES IN ('esMX') ENGINE = InnoDB,
+ PARTITION frFR VALUES IN ('frFR') ENGINE = InnoDB,
+ PARTITION itIT VALUES IN ('itIT') ENGINE = InnoDB,
+ PARTITION koKR VALUES IN ('koKR') ENGINE = InnoDB,
+ PARTITION ptBR VALUES IN ('ptBR') ENGINE = InnoDB,
+ PARTITION ruRU VALUES IN ('ruRU') ENGINE = InnoDB,
+ PARTITION zhCN VALUES IN ('zhCN') ENGINE = InnoDB,
+ PARTITION zhTW VALUES IN ('zhTW') ENGINE = InnoDB) */;
diff --git a/src/common/Utilities/Util.h b/src/common/Utilities/Util.h
index 3fc09f65792..be4a68d7788 100644
--- a/src/common/Utilities/Util.h
+++ b/src/common/Utilities/Util.h
@@ -157,23 +157,28 @@ inline bool isCyrillicCharacter(wchar_t wchar)
return false;
}
-inline bool isEastAsianCharacter(wchar_t wchar)
+inline bool isKoreanCharacter(wchar_t wchar)
{
if (wchar >= 0x1100 && wchar <= 0x11F9) // Hangul Jamo
return true;
- if (wchar >= 0x3041 && wchar <= 0x30FF) // Hiragana + Katakana
- return true;
if (wchar >= 0x3131 && wchar <= 0x318E) // Hangul Compatibility Jamo
return true;
- if (wchar >= 0x31F0 && wchar <= 0x31FF) // Katakana Phonetic Ext.
+ if (wchar >= 0xAC00 && wchar <= 0xD7A3) // Hangul Syllables
return true;
- if (wchar >= 0x3400 && wchar <= 0x4DB5) // CJK Ideographs Ext. A
+ if (wchar >= 0xFF01 && wchar <= 0xFFEE) // Halfwidth forms
return true;
- if (wchar >= 0x4E00 && wchar <= 0x9FC3) // Unified CJK Ideographs
+ return false;
+}
+
+inline bool isChineseCharacter(wchar_t wchar)
+{
+ if (wchar >= 0x4E00 && wchar <= 0x9FFF) // Unified CJK Ideographs
return true;
- if (wchar >= 0xAC00 && wchar <= 0xD7A3) // Hangul Syllables
+ if (wchar >= 0x3400 && wchar <= 0x4DBF) // CJK Ideographs Ext. A
return true;
- if (wchar >= 0xFF01 && wchar <= 0xFFEE) // Halfwidth forms
+ if (wchar >= 0x3100 && wchar <= 0x312C) // Bopomofo
+ return true;
+ if (wchar >= 0xF900 && wchar <= 0xFAFF) // CJK Compatibility Ideographs
return true;
return false;
}
@@ -226,10 +231,18 @@ inline bool isCyrillicString(std::wstring_view wstr, bool numericOrSpace)
return true;
}
-inline bool isEastAsianString(std::wstring_view wstr, bool numericOrSpace)
+inline bool isKoreanString(std::wstring_view wstr, bool numericOrSpace)
+{
+ for (wchar_t c : wstr)
+ if (!isKoreanCharacter(c) && (!numericOrSpace || !isNumericOrSpace(c)))
+ return false;
+ return true;
+}
+
+inline bool isChineseString(std::wstring_view wstr, bool numericOrSpace)
{
for (wchar_t c : wstr)
- if (!isEastAsianCharacter(c) && (!numericOrSpace || !isNumericOrSpace(c)))
+ if (!isChineseCharacter(c) && (!numericOrSpace || !isNumericOrSpace(c)))
return false;
return true;
}
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp
index 12f874de4f4..ca2fd93d164 100644
--- a/src/server/database/Database/Implementation/HotfixDatabase.cpp
+++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp
@@ -288,6 +288,12 @@ void HotfixDatabaseConnection::DoPrepareStatements()
" WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_BROADCAST_TEXT_DURATION, "SELECT MAX(ID) + 1 FROM broadcast_text_duration", CONNECTION_SYNCH);
+ // CfgCategories.db2
+ PrepareStatement(HOTFIX_SEL_CFG_CATEGORIES, "SELECT ID, Name, LocaleMask, CreateCharsetMask, ExistingCharsetMask, Flags, `Order`"
+ " FROM cfg_categories WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ PREPARE_MAX_ID_STMT(HOTFIX_SEL_CFG_CATEGORIES, "SELECT MAX(ID) + 1 FROM cfg_categories", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_CFG_CATEGORIES, "SELECT ID, Name_lang FROM cfg_categories_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH);
+
// CfgRegions.db2
PrepareStatement(HOTFIX_SEL_CFG_REGIONS, "SELECT ID, Tag, RegionID, Raidorigin, RegionGroupMask, ChallengeOrigin FROM cfg_regions"
" WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h
index b6afe80c0a6..fcebf47817e 100644
--- a/src/server/database/Database/Implementation/HotfixDatabase.h
+++ b/src/server/database/Database/Implementation/HotfixDatabase.h
@@ -182,6 +182,10 @@ enum HotfixDatabaseStatements : uint32
HOTFIX_SEL_BROADCAST_TEXT_DURATION,
HOTFIX_SEL_BROADCAST_TEXT_DURATION_MAX_ID,
+ HOTFIX_SEL_CFG_CATEGORIES,
+ HOTFIX_SEL_CFG_CATEGORIES_MAX_ID,
+ HOTFIX_SEL_CFG_CATEGORIES_LOCALE,
+
HOTFIX_SEL_CFG_REGIONS,
HOTFIX_SEL_CFG_REGIONS_MAX_ID,
diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h
index d6ab9499fcd..7a7648110fe 100644
--- a/src/server/game/DataStores/DB2LoadInfo.h
+++ b/src/server/game/DataStores/DB2LoadInfo.h
@@ -793,6 +793,22 @@ struct BroadcastTextDurationLoadInfo
static constexpr DB2LoadInfo Instance{ Fields, 4, &BroadcastTextDurationMeta::Instance, HOTFIX_SEL_BROADCAST_TEXT_DURATION };
};
+struct CfgCategoriesLoadInfo
+{
+ static constexpr DB2FieldMeta Fields[7] =
+ {
+ { false, FT_INT, "ID" },
+ { false, FT_STRING, "Name" },
+ { false, FT_SHORT, "LocaleMask" },
+ { false, FT_BYTE, "CreateCharsetMask" },
+ { false, FT_BYTE, "ExistingCharsetMask" },
+ { false, FT_BYTE, "Flags" },
+ { true, FT_BYTE, "Order" },
+ };
+
+ static constexpr DB2LoadInfo Instance{ Fields, 7, &Cfg_CategoriesMeta::Instance, HOTFIX_SEL_CFG_CATEGORIES };
+};
+
struct CfgRegionsLoadInfo
{
static constexpr DB2FieldMeta Fields[6] =
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp
index f917f66b1bc..a15fcdcebf6 100644
--- a/src/server/game/DataStores/DB2Stores.cpp
+++ b/src/server/game/DataStores/DB2Stores.cpp
@@ -85,6 +85,7 @@ DB2Storage<BattlePetSpeciesStateEntry> sBattlePetSpeciesStateStore("Bat
DB2Storage<BattlemasterListEntry> sBattlemasterListStore("BattlemasterList.db2", &BattlemasterListLoadInfo::Instance);
DB2Storage<BroadcastTextEntry> sBroadcastTextStore("BroadcastText.db2", &BroadcastTextLoadInfo::Instance);
DB2Storage<BroadcastTextDurationEntry> sBroadcastTextDurationStore("BroadcastTextDuration.db2", &BroadcastTextDurationLoadInfo::Instance);
+DB2Storage<Cfg_CategoriesEntry> sCfgCategoriesStore("Cfg_Categories.db2", &CfgCategoriesLoadInfo::Instance);
DB2Storage<Cfg_RegionsEntry> sCfgRegionsStore("Cfg_Regions.db2", &CfgRegionsLoadInfo::Instance);
DB2Storage<ChallengeModeItemBonusOverrideEntry> sChallengeModeItemBonusOverrideStore("ChallengeModeItemBonusOverride.db2", &ChallengeModeItemBonusOverrideLoadInfo::Instance);
DB2Storage<CharTitlesEntry> sCharTitlesStore("CharTitles.db2", &CharTitlesLoadInfo::Instance);
@@ -679,6 +680,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul
LOAD_DB2(sBattlemasterListStore);
LOAD_DB2(sBroadcastTextStore);
LOAD_DB2(sBroadcastTextDurationStore);
+ LOAD_DB2(sCfgCategoriesStore);
LOAD_DB2(sCfgRegionsStore);
LOAD_DB2(sChallengeModeItemBonusOverrideStore);
LOAD_DB2(sCharTitlesStore);
diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h
index f7281022a04..a6426e3483a 100644
--- a/src/server/game/DataStores/DB2Stores.h
+++ b/src/server/game/DataStores/DB2Stores.h
@@ -69,6 +69,7 @@ TC_GAME_API extern DB2Storage<BattlePetSpeciesEntry> sBattlePetSp
TC_GAME_API extern DB2Storage<BattlePetSpeciesStateEntry> sBattlePetSpeciesStateStore;
TC_GAME_API extern DB2Storage<BattlemasterListEntry> sBattlemasterListStore;
TC_GAME_API extern DB2Storage<BroadcastTextEntry> sBroadcastTextStore;
+TC_GAME_API extern DB2Storage<Cfg_CategoriesEntry> sCfgCategoriesStore;
TC_GAME_API extern DB2Storage<Cfg_RegionsEntry> sCfgRegionsStore;
TC_GAME_API extern DB2Storage<ChallengeModeItemBonusOverrideEntry> sChallengeModeItemBonusOverrideStore;
TC_GAME_API extern DB2Storage<CharTitlesEntry> sCharTitlesStore;
diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h
index 3f640b0280b..abe3f9e9e45 100644
--- a/src/server/game/DataStores/DB2Structure.h
+++ b/src/server/game/DataStores/DB2Structure.h
@@ -545,6 +545,21 @@ struct BroadcastTextDurationEntry
int32 Duration;
};
+struct Cfg_CategoriesEntry
+{
+ uint32 ID;
+ LocalizedString Name;
+ uint16 LocaleMask;
+ uint8 CreateCharsetMask;
+ uint8 ExistingCharsetMask;
+ uint8 Flags;
+ int8 Order;
+
+ EnumFlag<CfgCategoriesCharsets> GetCreateCharsetMask() const { return static_cast<CfgCategoriesCharsets>(CreateCharsetMask); }
+ EnumFlag<CfgCategoriesCharsets> GetExistingCharsetMask() const { return static_cast<CfgCategoriesCharsets>(ExistingCharsetMask); }
+ EnumFlag<CfgCategoriesFlags> GetFlags() const { return static_cast<CfgCategoriesFlags>(Flags); }
+};
+
struct Cfg_RegionsEntry
{
uint32 ID;
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index 70dcb492655..f76cb07b3a2 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -249,6 +249,26 @@ enum class BattlemasterListFlags : uint32
DEFINE_ENUM_FLAG(BattlemasterListFlags);
+enum class CfgCategoriesCharsets : uint8
+{
+ Any = 0x00,
+ Latin1 = 0x01,
+ English = 0x02,
+ Russian = 0x04,
+ Korean = 0x08,
+ Chinese = 0x10
+};
+
+DEFINE_ENUM_FLAG(CfgCategoriesCharsets);
+
+enum class CfgCategoriesFlags : uint8
+{
+ None = 0x0,
+ Tournament = 0x1
+};
+
+DEFINE_ENUM_FLAG(CfgCategoriesFlags);
+
enum class ChrRacesFlag : int32
{
NPCOnly = 0x000001,
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index a7822903214..c33c494954a 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -53,6 +53,7 @@
#include "QueryPackets.h"
#include "QuestDef.h"
#include "Random.h"
+#include "Realm.h"
#include "ReputationMgr.h"
#include "ScriptMgr.h"
#include "ScriptReloadMgr.h"
@@ -8593,41 +8594,12 @@ bool ObjectMgr::IsReservedName(std::string_view name) const
return _reservedNamesStore.find(wstr) != _reservedNamesStore.end();
}
-enum LanguageType
+static EnumFlag<CfgCategoriesCharsets> GetRealmLanguageType(bool create)
{
- LT_BASIC_LATIN = 0x0000,
- LT_EXTENDEN_LATIN = 0x0001,
- LT_CYRILLIC = 0x0002,
- LT_EAST_ASIA = 0x0004,
- LT_ANY = 0xFFFF
-};
+ if (Cfg_CategoriesEntry const* category = sCfgCategoriesStore.LookupEntry(realm.Timezone))
+ return create ? category->GetCreateCharsetMask() : category->GetExistingCharsetMask();
-static LanguageType GetRealmLanguageType(bool create)
-{
- switch (sWorld->getIntConfig(CONFIG_REALM_ZONE))
- {
- case REALM_ZONE_UNKNOWN: // any language
- case REALM_ZONE_DEVELOPMENT:
- case REALM_ZONE_TEST_SERVER:
- case REALM_ZONE_QA_SERVER:
- return LT_ANY;
- case REALM_ZONE_UNITED_STATES: // extended-Latin
- case REALM_ZONE_OCEANIC:
- case REALM_ZONE_LATIN_AMERICA:
- case REALM_ZONE_ENGLISH:
- case REALM_ZONE_GERMAN:
- case REALM_ZONE_FRENCH:
- case REALM_ZONE_SPANISH:
- return LT_EXTENDEN_LATIN;
- case REALM_ZONE_KOREA: // East-Asian
- case REALM_ZONE_TAIWAN:
- case REALM_ZONE_CHINA:
- return LT_EAST_ASIA;
- case REALM_ZONE_RUSSIAN: // Cyrillic
- return LT_CYRILLIC;
- default:
- return create ? LT_BASIC_LATIN : LT_ANY; // basic-Latin at create, any at login
- }
+ return create ? CfgCategoriesCharsets::English : CfgCategoriesCharsets::Any; // basic-Latin at create, any at login
}
bool isValidString(const std::wstring& wstr, uint32 strictMask, bool numericOrSpace, bool create = false)
@@ -8638,23 +8610,28 @@ bool isValidString(const std::wstring& wstr, uint32 strictMask, bool numericOrSp
return true;
if (isCyrillicString(wstr, numericOrSpace))
return true;
- if (isEastAsianString(wstr, numericOrSpace))
+ if (isKoreanString(wstr, numericOrSpace))
+ return true;
+ if (isChineseString(wstr, numericOrSpace))
return true;
return false;
}
if (strictMask & 0x2) // realm zone specific
{
- LanguageType lt = GetRealmLanguageType(create);
- if (lt & LT_EXTENDEN_LATIN)
- if (isExtendedLatinString(wstr, numericOrSpace))
- return true;
- if (lt & LT_CYRILLIC)
- if (isCyrillicString(wstr, numericOrSpace))
- return true;
- if (lt & LT_EAST_ASIA)
- if (isEastAsianString(wstr, numericOrSpace))
- return true;
+ EnumFlag<CfgCategoriesCharsets> lt = GetRealmLanguageType(create);
+ if (lt == CfgCategoriesCharsets::Any)
+ return true;
+ if (lt.HasFlag(CfgCategoriesCharsets::Latin1) && isExtendedLatinString(wstr, numericOrSpace))
+ return true;
+ if (lt.HasFlag(CfgCategoriesCharsets::English) && isBasicLatinString(wstr, numericOrSpace))
+ return true;
+ if (lt.HasFlag(CfgCategoriesCharsets::Russian) && isCyrillicString(wstr, numericOrSpace))
+ return true;
+ if (lt.HasFlag(CfgCategoriesCharsets::Korean) && isKoreanString(wstr, numericOrSpace))
+ return true;
+ if (lt.HasFlag(CfgCategoriesCharsets::Chinese) && isChineseString(wstr, numericOrSpace))
+ return true;
}
if (strictMask & 0x1) // basic Latin
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index c1838f8058f..e0c0b559a8a 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -896,12 +896,12 @@ void World::LoadConfigSettings(bool reload)
if (reload)
{
- uint32 val = sConfigMgr->GetIntDefault("RealmZone", REALM_ZONE_DEVELOPMENT);
+ uint32 val = sConfigMgr->GetIntDefault("RealmZone", HARDCODED_DEVELOPMENT_REALM_CATEGORY_ID);
if (val != m_int_configs[CONFIG_REALM_ZONE])
TC_LOG_ERROR("server.loading", "RealmZone option can't be changed at worldserver.conf reload, using current value ({}).", m_int_configs[CONFIG_REALM_ZONE]);
}
else
- m_int_configs[CONFIG_REALM_ZONE] = sConfigMgr->GetIntDefault("RealmZone", REALM_ZONE_DEVELOPMENT);
+ m_int_configs[CONFIG_REALM_ZONE] = sConfigMgr->GetIntDefault("RealmZone", HARDCODED_DEVELOPMENT_REALM_CATEGORY_ID);
m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_CALENDAR]= sConfigMgr->GetBoolDefault("AllowTwoSide.Interaction.Calendar", false);
m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL] = sConfigMgr->GetBoolDefault("AllowTwoSide.Interaction.Channel", false);
@@ -1306,10 +1306,12 @@ void World::LoadConfigSettings(bool reload)
m_float_configs[CONFIG_THREAT_RADIUS] = sConfigMgr->GetFloatDefault("ThreatRadius", 60.0f);
- // always use declined names in the russian client
- m_bool_configs[CONFIG_DECLINED_NAMES_USED] =
+ m_bool_configs[CONFIG_DECLINED_NAMES_USED] = sConfigMgr->GetBoolDefault("DeclinedNames", false);
- (m_int_configs[CONFIG_REALM_ZONE] == REALM_ZONE_RUSSIAN) ? true : sConfigMgr->GetBoolDefault("DeclinedNames", false);
+ // always use declined names in the russian client
+ if (Cfg_CategoriesEntry const* category = sCfgCategoriesStore.LookupEntry(m_int_configs[CONFIG_REALM_ZONE]))
+ if (category->GetCreateCharsetMask().HasFlag(CfgCategoriesCharsets::Russian))
+ m_bool_configs[CONFIG_DECLINED_NAMES_USED] = true;
m_float_configs[CONFIG_LISTEN_RANGE_SAY] = sConfigMgr->GetFloatDefault("ListenRange.Say", 25.0f);
m_float_configs[CONFIG_LISTEN_RANGE_TEXTEMOTE] = sConfigMgr->GetFloatDefault("ListenRange.TextEmote", 25.0f);
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index cb2973cc6a8..7281cff64b1 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -524,48 +524,6 @@ enum Rates
MAX_RATES
};
-enum RealmZone
-{
- REALM_ZONE_UNKNOWN = 0, // any language
- REALM_ZONE_DEVELOPMENT = 1, // any language
- REALM_ZONE_UNITED_STATES = 2, // extended-Latin
- REALM_ZONE_OCEANIC = 3, // extended-Latin
- REALM_ZONE_LATIN_AMERICA = 4, // extended-Latin
- REALM_ZONE_TOURNAMENT_5 = 5, // basic-Latin at create, any at login
- REALM_ZONE_KOREA = 6, // East-Asian
- REALM_ZONE_TOURNAMENT_7 = 7, // basic-Latin at create, any at login
- REALM_ZONE_ENGLISH = 8, // extended-Latin
- REALM_ZONE_GERMAN = 9, // extended-Latin
- REALM_ZONE_FRENCH = 10, // extended-Latin
- REALM_ZONE_SPANISH = 11, // extended-Latin
- REALM_ZONE_RUSSIAN = 12, // Cyrillic
- REALM_ZONE_TOURNAMENT_13 = 13, // basic-Latin at create, any at login
- REALM_ZONE_TAIWAN = 14, // East-Asian
- REALM_ZONE_TOURNAMENT_15 = 15, // basic-Latin at create, any at login
- REALM_ZONE_CHINA = 16, // East-Asian
- REALM_ZONE_CN1 = 17, // basic-Latin at create, any at login
- REALM_ZONE_CN2 = 18, // basic-Latin at create, any at login
- REALM_ZONE_CN3 = 19, // basic-Latin at create, any at login
- REALM_ZONE_CN4 = 20, // basic-Latin at create, any at login
- REALM_ZONE_CN5 = 21, // basic-Latin at create, any at login
- REALM_ZONE_CN6 = 22, // basic-Latin at create, any at login
- REALM_ZONE_CN7 = 23, // basic-Latin at create, any at login
- REALM_ZONE_CN8 = 24, // basic-Latin at create, any at login
- REALM_ZONE_TOURNAMENT_25 = 25, // basic-Latin at create, any at login
- REALM_ZONE_TEST_SERVER = 26, // any language
- REALM_ZONE_TOURNAMENT_27 = 27, // basic-Latin at create, any at login
- REALM_ZONE_QA_SERVER = 28, // any language
- REALM_ZONE_CN9 = 29, // basic-Latin at create, any at login
- REALM_ZONE_TEST_SERVER_2 = 30, // any language
- REALM_ZONE_CN10 = 31, // basic-Latin at create, any at login
- REALM_ZONE_CTC = 32,
- REALM_ZONE_CNC = 33,
- REALM_ZONE_CN1_4 = 34, // basic-Latin at create, any at login
- REALM_ZONE_CN2_6_9 = 35, // basic-Latin at create, any at login
- REALM_ZONE_CN3_7 = 36, // basic-Latin at create, any at login
- REALM_ZONE_CN5_8 = 37 // basic-Latin at create, any at login
-};
-
struct PersistentWorldVariable;
/// Storage class for commands issued for delayed execution
diff --git a/src/server/shared/Realm/Realm.h b/src/server/shared/Realm/Realm.h
index 9dcbb581538..45a07ebaa52 100644
--- a/src/server/shared/Realm/Realm.h
+++ b/src/server/shared/Realm/Realm.h
@@ -74,6 +74,8 @@ enum RealmType
// replaced by REALM_PVP in realm list
};
+inline constexpr uint32 HARDCODED_DEVELOPMENT_REALM_CATEGORY_ID = 1;
+
// Storage object for a realm
struct TC_SHARED_API Realm
{