Core/World: Refactor World::LoadConfigSettings to unify validation of all config options and reduce its impact on compile time

Port From (https://github.com/TrinityCore/TrinityCore/commit/b6d64447ba3a9aa4e3759e2c3582b07438da8633)
This commit is contained in:
Hondacrx
2025-09-04 22:30:57 -04:00
parent 9f05b762ad
commit f5906bce10
8 changed files with 580 additions and 1024 deletions
+12
View File
@@ -131,6 +131,7 @@ namespace Framework.Constants
/// <summary> /// <summary>
/// Misc Const /// Misc Const
/// </summary> /// </summary>
public const int MaxCharactersPerRealm = 200;
public const Locale DefaultLocale = Locale.enUS; public const Locale DefaultLocale = Locale.enUS;
public const int MaxAccountTutorialValues = 8; public const int MaxAccountTutorialValues = 8;
public const int MinAuctionTime = (12 * Time.Hour); public const int MinAuctionTime = (12 * Time.Hour);
@@ -1584,6 +1585,8 @@ namespace Framework.Constants
ChatChannelLevelReq, ChatChannelLevelReq,
ChatEmoteLevelReq, ChatEmoteLevelReq,
ChatFakeMessagePreventing, ChatFakeMessagePreventing,
ChatFloodAddonMessageCount,
ChatFloodAddonMessageDelay,
ChatFloodMessageCount, ChatFloodMessageCount,
ChatFloodMessageDelay, ChatFloodMessageDelay,
ChatFloodMuteTime, ChatFloodMuteTime,
@@ -1621,6 +1624,7 @@ namespace Framework.Constants
CurrencyResetHour, CurrencyResetHour,
CurrencyResetInterval, CurrencyResetInterval,
DailyQuestResetTimeHour, DailyQuestResetTimeHour,
DbPingInterval,
DbcEnforceItemAttributes, DbcEnforceItemAttributes,
DeathBonesBgOrArena, DeathBonesBgOrArena,
DeathBonesWorld, DeathBonesWorld,
@@ -1693,6 +1697,10 @@ namespace Framework.Constants
MaxRecruitAFriendBonusPlayerLevelDifference, MaxRecruitAFriendBonusPlayerLevelDifference,
MaxRecruitAFriendDistance, MaxRecruitAFriendDistance,
MaxResultsLookupCommands, MaxResultsLookupCommands,
MaxVisibilityDistanceContinent,
MaxVisibilityDistanceInstance,
MaxVisibilityDistanceBattleground,
MaxVisibilityDistanceArena,
MaxWho, MaxWho,
MinCharterName, MinCharterName,
MinCreatureScaledXpRatio, MinCreatureScaledXpRatio,
@@ -1885,6 +1893,10 @@ namespace Framework.Constants
TolbaradRestartAfterCrash, TolbaradRestartAfterCrash,
TradeLevelReq, TradeLevelReq,
UptimeUpdate, UptimeUpdate,
VisibilityNotifyPeriodContinent,
VisibilityNotifyPeriodInstance,
VisibilityNotifyPeriodBattleground,
VisibilityNotifyPeriodArena,
VmapIndoorCheck, VmapIndoorCheck,
WardenClientResponseDelay, WardenClientResponseDelay,
WardenClientCheckHoldoff, WardenClientCheckHoldoff,
+1 -1
View File
@@ -247,7 +247,7 @@ namespace Game.Entities
InitRunes(); InitRunes();
SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Coinage), (ulong)WorldConfig.GetIntValue(WorldCfg.StartPlayerMoney)); SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Coinage), WorldConfig.GetUInt64Value(WorldCfg.StartPlayerMoney));
// Played time // Played time
m_Last_tick = GameTime.GetGameTime(); m_Last_tick = GameTime.GetGameTime();
+2 -2
View File
@@ -39,8 +39,8 @@ namespace Game.Garrisons
public override void InitVisibilityDistance() public override void InitVisibilityDistance()
{ {
//init visibility distance for instances //init visibility distance for instances
m_VisibleDistance = Global.WorldMgr.GetMaxVisibleDistanceInInstances(); m_VisibleDistance = WorldConfig.GetFloatValue(WorldCfg.MaxVisibilityDistanceInstance);
m_VisibilityNotifyPeriod = Global.WorldMgr.GetVisibilityNotifyPeriodInInstances(); m_VisibilityNotifyPeriod = WorldConfig.GetIntValue(WorldCfg.VisibilityNotifyPeriodInstance);
} }
public override bool AddPlayerToMap(Player player, bool initPlayer = true) public override bool AddPlayerToMap(Player player, bool initPlayer = true)
+5 -1
View File
@@ -109,7 +109,7 @@ namespace Game
charResult.MaxCharacterLevel = Math.Max(charResult.MaxCharacterLevel, charInfo.ExperienceLevel); charResult.MaxCharacterLevel = Math.Max(charResult.MaxCharacterLevel, charInfo.ExperienceLevel);
} }
while (result.NextRow() && charResult.Characters.Count < 200); while (result.NextRow() && charResult.Characters.Count < SharedConst.MaxCharactersPerRealm);
} }
foreach (var requirement in Global.ObjectMgr.GetRaceUnlockRequirements()) foreach (var requirement in Global.ObjectMgr.GetRaceUnlockRequirements())
@@ -893,6 +893,10 @@ namespace Game
break; break;
} }
} }
// send new char string if not empty
if (!Global.WorldMgr.GetNewCharString().IsEmpty())
pCurrChar.SendSysMessage(Global.WorldMgr.GetNewCharString());
} }
if (!pCurrChar.GetMap().AddPlayerToMap(pCurrChar)) if (!pCurrChar.GetMap().AddPlayerToMap(pCurrChar))
+6 -6
View File
@@ -90,8 +90,8 @@ namespace Game.Maps
public virtual void InitVisibilityDistance() public virtual void InitVisibilityDistance()
{ {
//init visibility for continents //init visibility for continents
m_VisibleDistance = Global.WorldMgr.GetMaxVisibleDistanceOnContinents(); m_VisibleDistance = WorldConfig.GetFloatValue(WorldCfg.MaxVisibilityDistanceContinent);
m_VisibilityNotifyPeriod = Global.WorldMgr.GetVisibilityNotifyPeriodOnContinents(); m_VisibilityNotifyPeriod = WorldConfig.GetIntValue(WorldCfg.VisibilityNotifyPeriodContinent);
} }
public void AddToGrid<T>(T obj, Cell cell) where T : WorldObject public void AddToGrid<T>(T obj, Cell cell) where T : WorldObject
@@ -4915,8 +4915,8 @@ namespace Game.Maps
public override void InitVisibilityDistance() public override void InitVisibilityDistance()
{ {
//init visibility distance for instances //init visibility distance for instances
m_VisibleDistance = Global.WorldMgr.GetMaxVisibleDistanceInInstances(); m_VisibleDistance = WorldConfig.GetFloatValue(WorldCfg.MaxVisibilityDistanceInstance);
m_VisibilityNotifyPeriod = Global.WorldMgr.GetVisibilityNotifyPeriodInInstances(); m_VisibilityNotifyPeriod = WorldConfig.GetIntValue(WorldCfg.VisibilityNotifyPeriodInstance);
} }
public override TransferAbortParams CannotEnter(Player player) public override TransferAbortParams CannotEnter(Player player)
@@ -5354,8 +5354,8 @@ namespace Game.Maps
public override void InitVisibilityDistance() public override void InitVisibilityDistance()
{ {
m_VisibleDistance = IsBattleArena() ? Global.WorldMgr.GetMaxVisibleDistanceInArenas() : Global.WorldMgr.GetMaxVisibleDistanceInBG(); m_VisibleDistance = WorldConfig.GetFloatValue(IsBattleArena() ? WorldCfg.MaxVisibilityDistanceArena : WorldCfg.MaxVisibilityDistanceBattleground);
m_VisibilityNotifyPeriod = IsBattleArena() ? Global.WorldMgr.GetVisibilityNotifyPeriodInArenas() : Global.WorldMgr.GetVisibilityNotifyPeriodInBG(); m_VisibilityNotifyPeriod = WorldConfig.GetIntValue(IsBattleArena() ? WorldCfg.VisibilityNotifyPeriodArena : WorldCfg.VisibilityNotifyPeriodBattleground);
} }
string GetScriptName() string GetScriptName()
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1284,7 +1284,7 @@ namespace Game
WorldSession Session; WorldSession Session;
Dictionary<uint, PacketCounter> _PacketThrottlingMap = new(); Dictionary<uint, PacketCounter> _PacketThrottlingMap = new();
enum Policy public enum Policy
{ {
Log, Log,
Kick, Kick,
+14 -81
View File
@@ -104,6 +104,10 @@ namespace Game
return m_motd; return m_motd;
} }
public void SetNewCharString(string str) { m_newCharString = str; }
public string GetNewCharString() { return m_newCharString; }
public void TriggerGuidWarning() public void TriggerGuidWarning()
{ {
// Lock this only to prevent multiple maps triggering at the same time // Lock this only to prevent multiple maps triggering at the same time
@@ -938,9 +942,6 @@ namespace Game
Log.outInfo(LogFilter.ServerLoading, "Loading Persistend World Variables..."); // must be loaded before Battleground, outdoor PvP and conditions Log.outInfo(LogFilter.ServerLoading, "Loading Persistend World Variables..."); // must be loaded before Battleground, outdoor PvP and conditions
LoadPersistentWorldVariables(); LoadPersistentWorldVariables();
Global.WorldStateMgr.SetValue(WorldStates.CurrentPvpSeasonId, WorldConfig.GetBoolValue(WorldCfg.ArenaSeasonInProgress) ? WorldConfig.GetIntValue(WorldCfg.ArenaSeasonId) : 0, false, null);
Global.WorldStateMgr.SetValue(WorldStates.PreviousPvpSeasonId, WorldConfig.GetIntValue(WorldCfg.ArenaSeasonId) - (WorldConfig.GetBoolValue(WorldCfg.ArenaSeasonInProgress) ? 1 : 0), false, null);
Global.ObjectMgr.LoadPhases(); Global.ObjectMgr.LoadPhases();
Log.outInfo(LogFilter.ServerLoading, "Loading Conditions..."); Log.outInfo(LogFilter.ServerLoading, "Loading Conditions...");
@@ -1204,69 +1205,20 @@ namespace Game
m_timers[WorldTimers.AutoBroadcast].SetInterval(WorldConfig.GetIntValue(WorldCfg.AutoBroadcastInterval)); m_timers[WorldTimers.AutoBroadcast].SetInterval(WorldConfig.GetIntValue(WorldCfg.AutoBroadcastInterval));
m_timers[WorldTimers.AutoBroadcast].Reset(); m_timers[WorldTimers.AutoBroadcast].Reset();
Global.WorldStateMgr.SetValue(WorldStates.CurrentPvpSeasonId, WorldConfig.GetBoolValue(WorldCfg.ArenaSeasonInProgress) ? WorldConfig.GetIntValue(WorldCfg.ArenaSeasonId) : 0, false, null);
Global.WorldStateMgr.SetValue(WorldStates.PreviousPvpSeasonId, WorldConfig.GetIntValue(WorldCfg.ArenaSeasonId) - (WorldConfig.GetBoolValue(WorldCfg.ArenaSeasonInProgress) ? 1 : 0), false, null);
// call ScriptMgr if we're reloading the configuration
Global.ScriptMgr.OnConfigLoad(reload);
} }
// Get string for new logins (newly created characters)
SetNewCharString(ConfigMgr.GetDefaultValue("PlayerStart.String", ""));
for (byte i = 0; i < (int)UnitMoveType.Max; ++i) for (byte i = 0; i < (int)UnitMoveType.Max; ++i)
SharedConst.playerBaseMoveSpeed[i] = SharedConst.baseMoveSpeed[i] * WorldConfig.GetFloatValue(WorldCfg.RateMovespeed); SharedConst.playerBaseMoveSpeed[i] = SharedConst.baseMoveSpeed[i] * WorldConfig.GetFloatValue(WorldCfg.RateMovespeed);
var rateCreatureAggro = WorldConfig.GetFloatValue(WorldCfg.RateCreatureAggro);
//visibility on continents
m_MaxVisibleDistanceOnContinents = ConfigMgr.GetDefaultValue("Visibility.Distance.Continents", SharedConst.DefaultVisibilityDistance);
if (m_MaxVisibleDistanceOnContinents < 45 * rateCreatureAggro)
{
Log.outError(LogFilter.ServerLoading, "Visibility.Distance.Continents can't be less max aggro radius {0}", 45 * rateCreatureAggro);
m_MaxVisibleDistanceOnContinents = 45 * rateCreatureAggro;
}
else if (m_MaxVisibleDistanceOnContinents > SharedConst.MaxVisibilityDistance)
{
Log.outError(LogFilter.ServerLoading, "Visibility.Distance.Continents can't be greater {0}", SharedConst.MaxVisibilityDistance);
m_MaxVisibleDistanceOnContinents = SharedConst.MaxVisibilityDistance;
}
//visibility in instances
m_MaxVisibleDistanceInInstances = ConfigMgr.GetDefaultValue("Visibility.Distance.Instances", SharedConst.DefaultVisibilityInstance);
if (m_MaxVisibleDistanceInInstances < 45 * rateCreatureAggro)
{
Log.outError(LogFilter.ServerLoading, "Visibility.Distance.Instances can't be less max aggro radius {0}", 45 * rateCreatureAggro);
m_MaxVisibleDistanceInInstances = 45 * rateCreatureAggro;
}
else if (m_MaxVisibleDistanceInInstances > SharedConst.MaxVisibilityDistance)
{
Log.outError(LogFilter.ServerLoading, "Visibility.Distance.Instances can't be greater {0}", SharedConst.MaxVisibilityDistance);
m_MaxVisibleDistanceInInstances = SharedConst.MaxVisibilityDistance;
}
//visibility in BG
m_MaxVisibleDistanceInBG = ConfigMgr.GetDefaultValue("Visibility.Distance.BG", SharedConst.DefaultVisibilityBGAreans);
if (m_MaxVisibleDistanceInBG < 45 * rateCreatureAggro)
{
Log.outError(LogFilter.ServerLoading, $"Visibility.Distance.BG can't be less max aggro radius {45 * rateCreatureAggro}");
m_MaxVisibleDistanceInBG = 45 * rateCreatureAggro;
}
else if (m_MaxVisibleDistanceInBG > SharedConst.MaxVisibilityDistance)
{
Log.outError(LogFilter.ServerLoading, $"Visibility.Distance.BG can't be greater {SharedConst.MaxVisibilityDistance}");
m_MaxVisibleDistanceInBG = SharedConst.MaxVisibilityDistance;
}
// Visibility in Arenas
m_MaxVisibleDistanceInArenas = ConfigMgr.GetDefaultValue("Visibility.Distance.Arenas", SharedConst.DefaultVisibilityBGAreans);
if (m_MaxVisibleDistanceInArenas < 45 * rateCreatureAggro)
{
Log.outError(LogFilter.ServerLoading, $"Visibility.Distance.Arenas can't be less max aggro radius {45 * rateCreatureAggro}");
m_MaxVisibleDistanceInArenas = 45 * rateCreatureAggro;
}
else if (m_MaxVisibleDistanceInArenas > SharedConst.MaxVisibilityDistance)
{
Log.outError(LogFilter.ServerLoading, $"Visibility.Distance.Arenas can't be greater {SharedConst.MaxVisibilityDistance}");
m_MaxVisibleDistanceInArenas = SharedConst.MaxVisibilityDistance;
}
m_visibility_notify_periodOnContinents = ConfigMgr.GetDefaultValue("Visibility.Notify.Period.OnContinents", SharedConst.DefaultVisibilityNotifyPeriod);
m_visibility_notify_periodInInstances = ConfigMgr.GetDefaultValue("Visibility.Notify.Period.InInstances", SharedConst.DefaultVisibilityNotifyPeriod);
m_visibility_notify_periodInBG = ConfigMgr.GetDefaultValue("Visibility.Notify.Period.InBG", SharedConst.DefaultVisibilityNotifyPeriod);
m_visibility_notify_periodInArenas = ConfigMgr.GetDefaultValue("Visibility.Notify.Period.InArenas", SharedConst.DefaultVisibilityNotifyPeriod);
_guidWarningMsg = WorldConfig.GetDefaultValue("Respawn.WarningMessage", "There will be an unscheduled server restart at 03:00. The server will be available again shortly after."); _guidWarningMsg = WorldConfig.GetDefaultValue("Respawn.WarningMessage", "There will be an unscheduled server restart at 03:00. The server will be available again shortly after.");
_alertRestartReason = WorldConfig.GetDefaultValue("Respawn.AlertRestartReason", "Urgent Maintenance"); _alertRestartReason = WorldConfig.GetDefaultValue("Respawn.AlertRestartReason", "Urgent Maintenance");
@@ -2535,16 +2487,6 @@ namespace Game
return Global.RealmMgr.GetCurrentRealmId().GetAddress(); return Global.RealmMgr.GetCurrentRealmId().GetAddress();
} }
public float GetMaxVisibleDistanceOnContinents() { return m_MaxVisibleDistanceOnContinents; }
public float GetMaxVisibleDistanceInInstances() { return m_MaxVisibleDistanceInInstances; }
public float GetMaxVisibleDistanceInBG() { return m_MaxVisibleDistanceInBG; }
public float GetMaxVisibleDistanceInArenas() { return m_MaxVisibleDistanceInArenas; }
public int GetVisibilityNotifyPeriodOnContinents() { return m_visibility_notify_periodOnContinents; }
public int GetVisibilityNotifyPeriodInInstances() { return m_visibility_notify_periodInInstances; }
public int GetVisibilityNotifyPeriodInBG() { return m_visibility_notify_periodInBG; }
public int GetVisibilityNotifyPeriodInArenas() { return m_visibility_notify_periodInArenas; }
public Locale GetAvailableDbcLocale(Locale locale) public Locale GetAvailableDbcLocale(Locale locale)
{ {
if (m_availableDbcLocaleMask[(int)locale]) if (m_availableDbcLocaleMask[(int)locale])
@@ -2576,16 +2518,6 @@ namespace Game
CleaningFlags m_CleaningFlags; CleaningFlags m_CleaningFlags;
float m_MaxVisibleDistanceOnContinents = SharedConst.DefaultVisibilityDistance;
float m_MaxVisibleDistanceInInstances = SharedConst.DefaultVisibilityInstance;
float m_MaxVisibleDistanceInBG = SharedConst.DefaultVisibilityBGAreans;
float m_MaxVisibleDistanceInArenas = SharedConst.DefaultVisibilityBGAreans;
int m_visibility_notify_periodOnContinents = SharedConst.DefaultVisibilityNotifyPeriod;
int m_visibility_notify_periodInInstances = SharedConst.DefaultVisibilityNotifyPeriod;
int m_visibility_notify_periodInBG = SharedConst.DefaultVisibilityNotifyPeriod;
int m_visibility_notify_periodInArenas = SharedConst.DefaultVisibilityNotifyPeriod;
bool m_isClosed; bool m_isClosed;
Dictionary<WorldTimers, IntervalTimer> m_timers = new(); Dictionary<WorldTimers, IntervalTimer> m_timers = new();
@@ -2607,6 +2539,7 @@ namespace Game
Locale m_defaultDbcLocale; // from config for one from loaded DBC locales Locale m_defaultDbcLocale; // from config for one from loaded DBC locales
BitSet m_availableDbcLocaleMask; // by loaded DBC BitSet m_availableDbcLocaleMask; // by loaded DBC
List<string> m_motd = new(); List<string> m_motd = new();
string m_newCharString;
// scheduled reset times // scheduled reset times
long m_NextDailyQuestReset; long m_NextDailyQuestReset;