diff options
author | Shauren <shauren.trinity@gmail.com> | 2023-10-05 23:57:25 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2023-10-05 23:57:25 +0200 |
commit | e161874695c5506bfa3cbcddf944d68b11cbc124 (patch) | |
tree | 1ef7b18fbe683c0e747ecb3f51593563d118a5cd /src | |
parent | 77504240783fad4f01f8726e948b99fc91085c21 (diff) |
Core/Realms: Replaced hardcoded realm category list with Cfg_Categories.db2
Diffstat (limited to 'src')
-rw-r--r-- | src/common/Utilities/Util.h | 33 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/HotfixDatabase.cpp | 6 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/HotfixDatabase.h | 4 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2LoadInfo.h | 16 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.cpp | 2 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.h | 1 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Structure.h | 15 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCEnums.h | 20 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 65 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 12 | ||||
-rw-r--r-- | src/server/game/World/World.h | 42 | ||||
-rw-r--r-- | src/server/shared/Realm/Realm.h | 2 |
12 files changed, 117 insertions, 101 deletions
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 { |