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:
@@ -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,
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
+524
-917
File diff suppressed because it is too large
Load Diff
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user