Files
CypherCore/Source/Game/Server/WorldConfig.cs
T

647 lines
61 KiB
C#

// Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved.
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
using Framework.Configuration;
using Framework.Constants;
using Game.DataStorage;
using System;
using System.Collections.Generic;
namespace Game
{
public class WorldConfig : ConfigMgr
{
public static void Load(bool reload = false)
{
if (reload)
Load("WorldServer.conf");
uint databaseCacheVersion = (uint)Values[WorldCfg.ClientCacheVersion];
ConfigOptionLoadDefinition<bool>[] bools =
[
new() { Name = "Support.Enabled", DefaultValue = true, Index = WorldCfg.SupportEnabled },
new() { Name = "Support.TicketsEnabled", DefaultValue = false, Index = WorldCfg.SupportTicketsEnabled },
new() { Name = "Support.BugsEnabled", DefaultValue = false, Index = WorldCfg.SupportBugsEnabled },
new() { Name = "Support.ComplaintsEnabled", DefaultValue = false, Index = WorldCfg.SupportComplaintsEnabled },
new() { Name = "Support.SuggestionsEnabled", DefaultValue = false, Index = WorldCfg.SupportSuggestionsEnabled },
new() { Name = "DurabilityLoss.InPvP", DefaultValue = false, Index = WorldCfg.DurabilityLossInPvp },
new() { Name = "AddonChannel", DefaultValue = true, Index = WorldCfg.AddonChannel },
new() { Name = "CleanCharacterDB", DefaultValue = false, Index = WorldCfg.CleanCharacterDb },
new() { Name = "PreserveCustomChannels", DefaultValue = false, Index = WorldCfg.PreserveCustomChannels },
new() { Name = "GridUnload", DefaultValue = true, Index = WorldCfg.GridUnload },
new() { Name = "BaseMapLoadAllGrids", DefaultValue = false, Index = WorldCfg.BasemapLoadGrids },
new() { Name = "InstanceMapLoadAllGrids", DefaultValue = false, Index = WorldCfg.InstancemapLoadGrids },
new() { Name = "BattlegroundMapLoadAllGrids", DefaultValue = true, Index = WorldCfg.BattlegroundMapLoadGrids },
new() { Name = "PlayerSave.Stats.SaveOnlyOnLogout", DefaultValue = true, Index = WorldCfg.StatsSaveOnlyOnLogout },
new() { Name = "Creature.RegenHPCannotReachTargetInRaid", DefaultValue = true, Index = WorldCfg.RegenHpCannotReachTargetInRaid },
new() { Name = "AllowTwoSide.Interaction.Calendar", DefaultValue = false, Index = WorldCfg.AllowTwoSideInteractionCalendar },
new() { Name = "AllowTwoSide.Interaction.Channel", DefaultValue = false, Index = WorldCfg.AllowTwoSideInteractionChannel },
new() { Name = "AllowTwoSide.Interaction.Group", DefaultValue = false, Index = WorldCfg.AllowTwoSideInteractionGroup },
new() { Name = "AllowTwoSide.Interaction.Guild", DefaultValue = false, Index = WorldCfg.AllowTwoSideInteractionGuild },
new() { Name = "AllowTwoSide.Interaction.Auction", DefaultValue = true, Index = WorldCfg.AllowTwoSideInteractionAuction },
new() { Name = "AllowTwoSide.Trade", DefaultValue = false, Index = WorldCfg.AllowTwoSideTrade },
new() { Name = "CharacterCreating.DisableAlliedRaceAchievementRequirement", DefaultValue = false, Index = WorldCfg.CharacterCreatingDisableAlliedRaceAchievementRequirement },
new() { Name = "AllFlightPaths", DefaultValue = false, Index = WorldCfg.AllTaxiPaths },
new() { Name = "InstantFlightPaths", DefaultValue = false, Index = WorldCfg.InstantTaxi },
new() { Name = "Instance.IgnoreLevel", DefaultValue = false, Index = WorldCfg.InstanceIgnoreLevel },
new() { Name = "Instance.IgnoreRaid", DefaultValue = false, Index = WorldCfg.InstanceIgnoreRaid },
new() { Name = "CastUnstuck", DefaultValue = true, Index = WorldCfg.CastUnstuck },
new() { Name = "GM.AllowInvite", DefaultValue = false, Index = WorldCfg.AllowGmGroup },
new() { Name = "GM.LowerSecurity", DefaultValue = false, Index = WorldCfg.GmLowerSecurity },
new() { Name = "SkillChance.Prospecting", DefaultValue = false, Index = WorldCfg.SkillProspecting },
new() { Name = "SkillChance.Milling", DefaultValue = false, Index = WorldCfg.SkillMilling },
new() { Name = "ActivateWeather", DefaultValue = true, Index = WorldCfg.Weather },
new() { Name = "Event.Announce", DefaultValue = false, Index = WorldCfg.EventAnnounce },
new() { Name = "Quests.EnableQuestTracker", DefaultValue = false, Index = WorldCfg.QuestEnableQuestTracker },
new() { Name = "Quests.IgnoreRaid", DefaultValue = false, Index = WorldCfg.QuestIgnoreRaid },
new() { Name = "Quests.IgnoreAutoAccept", DefaultValue = false, Index = WorldCfg.QuestIgnoreAutoAccept },
new() { Name = "Quests.IgnoreAutoComplete", DefaultValue = false, Index = WorldCfg.QuestIgnoreAutoComplete },
new() { Name = "DetectPosCollision", DefaultValue = true, Index = WorldCfg.DetectPosCollision },
new() { Name = "Channel.RestrictedLfg", DefaultValue = true, Index = WorldCfg.RestrictedLfgChannel },
new() { Name = "ChatFakeMessagePreventing", DefaultValue = false, Index = WorldCfg.ChatFakeMessagePreventing },
new() { Name = "Death.CorpseReclaimDelay.PvP", DefaultValue = true, Index = WorldCfg.DeathCorpseReclaimDelayPvp },
new() { Name = "Death.CorpseReclaimDelay.PvE", DefaultValue = true, Index = WorldCfg.DeathCorpseReclaimDelayPve },
new() { Name = "Death.Bones.World", DefaultValue = true, Index = WorldCfg.DeathBonesWorld },
new() { Name = "Death.Bones.BattlegroundOrArena", DefaultValue = true, Index = WorldCfg.DeathBonesBgOrArena },
new() { Name = "Die.Command.Mode", DefaultValue = true, Index = WorldCfg.DieCommandMode },
new() { Name = "DeclinedNames", DefaultValue = false, Index = WorldCfg.DeclinedNamesUsed },
new() { Name = "Battleground.CastDeserter", DefaultValue = true, Index = WorldCfg.BattlegroundCastDeserter },
new() { Name = "Battleground.QueueAnnouncer.Enable", DefaultValue = false, Index = WorldCfg.BattlegroundQueueAnnouncerEnable },
new() { Name = "Battleground.QueueAnnouncer.PlayerOnly", DefaultValue = false, Index = WorldCfg.BattlegroundQueueAnnouncerPlayeronly },
new() { Name = "Battleground.StoreStatistics.Enable", DefaultValue = false, Index = WorldCfg.BattlegroundStoreStatisticsEnable },
new() { Name = "Battleground.GiveXPForKills", DefaultValue = false, Index = WorldCfg.BgXpForKill },
new() { Name = "Arena.QueueAnnouncer.Enable", DefaultValue = false, Index = WorldCfg.ArenaQueueAnnouncerEnable },
new() { Name = "Arena.ArenaSeason.InProgress", DefaultValue = false, Index = WorldCfg.ArenaSeasonInProgress },
new() { Name = "ArenaLog.ExtendedInfo", DefaultValue = false, Index = WorldCfg.ArenaLogExtendedInfo },
new() { Name = "OffhandCheckAtSpellUnlearn", DefaultValue = true, Index = WorldCfg.OffhandCheckAtSpellUnlearn },
new() { Name = "Respawn.DynamicEscortNPC", DefaultValue = false, Index = WorldCfg.RespawnDynamicEscortNpc },
new() { Name = "mmap.enablePathFinding", DefaultValue = true, Index = WorldCfg.EnableMmaps },
new() { Name = "vmap.enableIndoorCheck", DefaultValue = true, Index = WorldCfg.VmapIndoorCheck },
new() { Name = "PlayerStart.AllSpells", DefaultValue = false, Index = WorldCfg.StartAllSpells },
new() { Name = "ResetDuelCooldowns", DefaultValue = false, Index = WorldCfg.ResetDuelCooldowns },
new() { Name = "ResetDuelHealthMana", DefaultValue = false, Index = WorldCfg.ResetDuelHealthMana },
new() { Name = "PlayerStart.MapsExplored", DefaultValue = false, Index = WorldCfg.StartAllExplored },
new() { Name = "PlayerStart.AllReputation", DefaultValue = false, Index = WorldCfg.StartAllRep },
new() { Name = "PvPToken.Enable", DefaultValue = false, Index = WorldCfg.PvpTokenEnable },
new() { Name = "NoResetTalentsCost", DefaultValue = false, Index = WorldCfg.NoResetTalentCost },
new() { Name = "ShowKickInWorld", DefaultValue = false, Index = WorldCfg.ShowKickInWorld },
new() { Name = "ShowMuteInWorld", DefaultValue = false, Index = WorldCfg.ShowMuteInWorld },
new() { Name = "ShowBanInWorld", DefaultValue = false, Index = WorldCfg.ShowBanInWorld },
new() { Name = "Warden.Enabled", DefaultValue = false, Index = WorldCfg.WardenEnabled },
new() { Name = "FeatureSystem.CharacterUndelete.Enabled", DefaultValue = false, Index = WorldCfg.FeatureSystemCharacterUndeleteEnabled },
new() { Name = "DBC.EnforceItemAttributes", DefaultValue = true, Index = WorldCfg.DbcEnforceItemAttributes },
new() { Name = "InstancesResetAnnounce", DefaultValue = false, Index = WorldCfg.InstancesResetAnnounce },
new() { Name = "AutoBroadcast.On", DefaultValue = false, Index = WorldCfg.AutoBroadcast },
new() { Name = "PlayerDump.DisallowPaths", DefaultValue = true, Index = WorldCfg.PdumpNoPaths },
new() { Name = "PlayerDump.DisallowOverwrite", DefaultValue = true, Index = WorldCfg.PdumpNoOverwrite },
new() { Name = "Wintergrasp.Enable", DefaultValue = false, Index = WorldCfg.WintergraspEnable },
new() { Name = "TolBarad.Enable", DefaultValue = true, Index = WorldCfg.TolbaradEnable },
new() { Name = "Stats.Limits.Enable", DefaultValue = false, Index = WorldCfg.StatsLimitsEnable },
new() { Name = "Allow.IP.Based.Action.Logging", DefaultValue = false, Index = WorldCfg.IpBasedActionLogging },
new() { Name = "Calculate.Creature.Zone.Area.Data", DefaultValue = false, Index = WorldCfg.CalculateCreatureZoneAreaData },
new() { Name = "Calculate.Gameoject.Zone.Area.Data", DefaultValue = false, Index = WorldCfg.CalculateGameobjectZoneAreaData },
new() { Name = "BlackMarket.Enabled", DefaultValue = true, Index = WorldCfg.BlackmarketEnabled },
new() { Name = "PreventRenameCharacterOnCustomization", DefaultValue = false, Index = WorldCfg.PreventRenameCustomization },
new() { Name = "PartyRaidWarnings", DefaultValue = false, Index = WorldCfg.ChatPartyRaidWarnings },
new() { Name = "CacheDataQueries", DefaultValue = true, Index = WorldCfg.CacheDataQueries },
new() { Name = "Creature.CheckInvalidPosition", DefaultValue = false, Index = WorldCfg.CreatureCheckInvalidPostion },
new() { Name = "GameObject.CheckInvalidPosition", DefaultValue = false, Index = WorldCfg.GameobjectCheckInvalidPostion },
new() { Name = "CheckGameObjectLoS", DefaultValue = true, Index = WorldCfg.CheckGobjectLos },
new() { Name = "AllowLoggingIPAddressesInDatabase", DefaultValue = true, Index = WorldCfg.AllowLogginIpAddressesInDatabase },
new() { Name = "Loot.EnableAELoot", DefaultValue = true, Index = WorldCfg.EnableAeLoot },
new() { Name = "Load.Locales", DefaultValue = true, Index = WorldCfg.LoadLocales },
];
ConfigOptionLoadDefinition<uint>[] ints =
[
new() { Name = "Server.LoginInfo", DefaultValue = 0, Index = WorldCfg.EnableSinfoLogin },
new() { Name = "XP.Boost.Daymask", DefaultValue = 0, Index = WorldCfg.XpBoostDaymask },
new() { Name = "Compression", DefaultValue = 1, Index = WorldCfg.Compression, Min = 1, Max = 9 },
new() { Name = "PersistentCharacterCleanFlags", DefaultValue = 0, Index = WorldCfg.PersistentCharacterCleanFlags },
new() { Name = "Auction.ReplicateItemsCooldown", DefaultValue = 900, Index = WorldCfg.AuctionReplicateDelay },
new() { Name = "Auction.SearchDelay", DefaultValue = 300, Index = WorldCfg.AuctionSearchDelay, Min = 100, Max = 10000 },
new() { Name = "Auction.TaintedSearchDelay", DefaultValue = 3000, Index = WorldCfg.AuctionTaintedSearchDelay, Min = 100, Max = 10000 },
new() { Name = "ChatLevelReq.Channel", DefaultValue = 1, Index = WorldCfg.ChatChannelLevelReq },
new() { Name = "ChatLevelReq.Whisper", DefaultValue = 1, Index = WorldCfg.ChatWhisperLevelReq },
new() { Name = "ChatLevelReq.Emote", DefaultValue = 1, Index = WorldCfg.ChatEmoteLevelReq },
new() { Name = "ChatLevelReq.Say", DefaultValue = 1, Index = WorldCfg.ChatSayLevelReq },
new() { Name = "ChatLevelReq.Yell", DefaultValue = 1, Index = WorldCfg.ChatYellLevelReq },
new() { Name = "PartyLevelReq", DefaultValue = 1, Index = WorldCfg.PartyLevelReq },
new() { Name = "LevelReq.Trade", DefaultValue = 1, Index = WorldCfg.TradeLevelReq },
new() { Name = "LevelReq.Auction", DefaultValue = 1, Index = WorldCfg.AuctionLevelReq },
new() { Name = "LevelReq.Mail", DefaultValue = 1, Index = WorldCfg.MailLevelReq },
new() { Name = "PreserveCustomChannelDuration", DefaultValue = 14, Index = WorldCfg.PreserveCustomChannelDuration },
new() { Name = "PreserveCustomChannelInterval", DefaultValue = 5, Index = WorldCfg.PreserveCustomChannelInterval },
new() { Name = "PlayerSaveInterval", DefaultValue = 15 * Time.Minute * Time.InMilliseconds, Index = WorldCfg.IntervalSave },
new() { Name = "DisconnectToleranceInterval", DefaultValue = 0, Index = WorldCfg.IntervalDisconnectTolerance },
new() { Name = "PlayerSave.StatsMinLevel", DefaultValue = 0, Index = WorldCfg.MinLevelStatSave, Max = SharedConst.StrongMaxLevel },
new() { Name = "GridCleanUpDelay", DefaultValue = 5 * Time.Minute * Time.InMilliseconds, Index = WorldCfg.IntervalGridclean, Min = MapConst.MinGridDelay },
new() { Name = "MapUpdateInterval", DefaultValue = 10, Index = WorldCfg.IntervalMapupdate, Min = MapConst.MinMapUpdateDelay },
new() { Name = "ChangeWeatherInterval", DefaultValue = 10 * Time.Minute * Time.InMilliseconds, Index = WorldCfg.IntervalChangeweather },
new() { Name = "WorldServerPort", DefaultValue = 8085, Index = WorldCfg.PortWorld, Min = 1, Max = ushort.MaxValue, Reloadable = false },
new() { Name = "SocketTimeOutTime", DefaultValue = 900000, Index = WorldCfg.SocketTimeoutTime },
new() { Name = "SocketTimeOutTimeActive", DefaultValue = 60000, Index = WorldCfg.SocketTimeoutTimeActive },
new() { Name = "SessionAddDelay", DefaultValue = 10000, Index = WorldCfg.SessionAddDelay },
new() { Name = "MinQuestScaledXPRatio", DefaultValue = 0, Index = WorldCfg.MinQuestScaledXpRatio, Max = 100 },
new() { Name = "MinCreatureScaledXPRatio", DefaultValue = 0, Index = WorldCfg.MinCreatureScaledXpRatio, Max = 100 },
new() { Name = "MinDiscoveredScaledXPRatio", DefaultValue = 0, Index = WorldCfg.MinDiscoveredScaledXpRatio, Max = 100 },
new() { Name = "GameType", DefaultValue = 0, Index = WorldCfg.GameType, Reloadable = false },
new() { Name = "RealmZone", DefaultValue = RealmManager.HardcodedDevelopmentRealmCategoryId, Index = WorldCfg.RealmZone, Reloadable = false },
new() { Name = "StrictPlayerNames", DefaultValue = 0, Index = WorldCfg.StrictPlayerNames },
new() { Name = "StrictCharterNames", DefaultValue = 0, Index = WorldCfg.StrictCharterNames },
new() { Name = "StrictPetNames", DefaultValue = 0, Index = WorldCfg.StrictPetNames },
new() { Name = "MinPlayerName", DefaultValue = 2, Index = WorldCfg.MinPlayerName, Min = 1, Max = 12 },
new() { Name = "MinCharterName", DefaultValue = 2, Index = WorldCfg.MinCharterName, Min = 1, Max = 24 },
new() { Name = "MinPetName", DefaultValue = 2, Index = WorldCfg.MinPetName, Min = 1, Max = 12 },
new() { Name = "Guild.CharterCost", DefaultValue = 1000, Index = WorldCfg.CharterCostGuild },
new() { Name = "ArenaTeam.CharterCost.2v2", DefaultValue = 800000, Index = WorldCfg.CharterCostArena2v2 },
new() { Name = "ArenaTeam.CharterCost.3v3", DefaultValue = 1200000, Index = WorldCfg.CharterCostArena3v3 },
new() { Name = "ArenaTeam.CharterCost.5v5", DefaultValue = 2000000, Index = WorldCfg.CharterCostArena5v5 },
new() { Name = "CharacterCreating.Disabled", DefaultValue = 0, Index = WorldCfg.CharacterCreatingDisabled },
new() { Name = "CharacterCreating.Disabled.ClassMask", DefaultValue = 0, Index = WorldCfg.CharacterCreatingDisabledClassmask },
new() { Name = "CharactersPerRealm", DefaultValue = 60, Index = WorldCfg.CharactersPerRealm, Min = 1, Max = SharedConst.MaxCharactersPerRealm },
new() { Name = "CharactersPerAccount", DefaultValue = 60, Index = WorldCfg.CharactersPerAccount, Min = 1, Max = SharedConst.MaxCharactersPerRealm },
new() { Name = "CharacterCreating.EvokersPerRealm", DefaultValue = 1, Index = WorldCfg.CharacterCreatingEvokersPerRealm, Min = 1, Max = SharedConst.MaxCharactersPerRealm },
new() { Name = "CharacterCreatingMinLevelForDemonHunter", DefaultValue = 0, Index = WorldCfg.CharacterCreatingMinLevelForDemonHunter },
new() { Name = "CharacterCreatingMinLevelForEvoker", DefaultValue = 50, Index = WorldCfg.CharacterCreatingMinLevelForEvoker },
new() { Name = "SkipCinematics", DefaultValue = 0, Index = WorldCfg.SkipCinematics, Min = 0, Max = 2 },
new() { Name = "MaxPlayerLevel", DefaultValue = SharedConst.DefaultMaxLevel, Index = WorldCfg.MaxPlayerLevel, Min = 1, Max = SharedConst.MaxLevel, Reloadable = false },
new() { Name = "MinDualSpecLevel", DefaultValue = 40, Index = WorldCfg.MinDualspecLevel },
new() { Name = "StartPlayerLevel", DefaultValue = 1, Index = WorldCfg.StartPlayerLevel, Min = 1 },
new() { Name = "StartDeathKnightPlayerLevel", DefaultValue = 8, Index = WorldCfg.StartDeathKnightPlayerLevel, Min = 1 },
new() { Name = "StartDemonHunterPlayerLevel", DefaultValue = 8, Index = WorldCfg.StartDemonHunterPlayerLevel, Min = 1 },
new() { Name = "StartEvokerPlayerLevel", DefaultValue = 10, Index = WorldCfg.StartEvokerPlayerLevel, Min = 1 },
new() { Name = "StartAlliedRacePlayerLevel", DefaultValue = 10, Index = WorldCfg.StartAlliedRaceLevel, Min = 1 },
new() { Name = "Currency.ResetHour", DefaultValue = 3, Index = WorldCfg.CurrencyResetHour, Min = 0, Max = 23 },
new() { Name = "Currency.ResetDay", DefaultValue = 3, Index = WorldCfg.CurrencyResetDay, Min = 0, Max = 6 },
new() { Name = "Currency.ResetInterval", DefaultValue = 7, Index = WorldCfg.CurrencyResetInterval, Min = 1 },
new() { Name = "RecruitAFriendMaxLevel", DefaultValue = SharedConst.DefaultMaxLevel, Index = WorldCfg.MaxRecruitAFriendBonusPlayerLevel, Min = 1 },
new() { Name = "RecruitAFriendMaxDifference", DefaultValue = 4, Index = WorldCfg.MaxRecruitAFriendBonusPlayerLevelDifference },
new() { Name = "ResetSchedule.WeekDay", DefaultValue = 2, Index = WorldCfg.ResetScheduleWeekDay, Min = 0, Max = 6 },
new() { Name = "ResetSchedule.Hour", DefaultValue = 8, Index = WorldCfg.ResetScheduleHour, Min = 0, Max = 23 },
new() { Name = "Instance.UnloadDelay", DefaultValue = 30 * Time.Minute * Time.InMilliseconds, Index = WorldCfg.InstanceUnloadDelay },
new() { Name = "Quests.DailyResetTime", DefaultValue = 3, Index = WorldCfg.DailyQuestResetTimeHour, Min = 0, Max = 23 },
new() { Name = "Quests.WeeklyResetWDay", DefaultValue = 3, Index = WorldCfg.WeeklyQuestResetTimeWDay, Min = 0, Max = 6 },
new() { Name = "MaxPrimaryTradeSkill", DefaultValue = 2, Index = WorldCfg.MaxPrimaryTradeSkill },
new() { Name = "MinPetitionSigns", DefaultValue = 4, Index = WorldCfg.MinPetitionSigns, Max = 4 },
new() { Name = "GM.LoginState", DefaultValue = 2, Index = WorldCfg.GmLoginState },
new() { Name = "GM.Visible", DefaultValue = 2, Index = WorldCfg.GmVisibleState },
new() { Name = "GM.Chat", DefaultValue = 2, Index = WorldCfg.GmChat },
new() { Name = "GM.WhisperingTo", DefaultValue = 2, Index = WorldCfg.GmWhisperingTo },
new() { Name = "GM.FreezeAuraDuration", DefaultValue = 0, Index = WorldCfg.GmFreezeDuration },
new() { Name = "GM.InGMList.Level", DefaultValue = (uint)AccountTypes.Administrator, Index = WorldCfg.GmLevelInGmList },
new() { Name = "GM.InWhoList.Level", DefaultValue = (uint)AccountTypes.Administrator, Index = WorldCfg.GmLevelInWhoList },
new() { Name = "GM.StartLevel", DefaultValue = 1, Index = WorldCfg.StartGmLevel, Min = 1, Max = SharedConst.MaxLevel },
new() { Name = "GM.ForceShutdownThreshold", DefaultValue = 30, Index = WorldCfg.ForceShutdownThreshold },
new() { Name = "Visibility.GroupMode", DefaultValue = 1, Index = WorldCfg.GroupVisibility, Min = 0, Max = 3 },
new() { Name = "MailDeliveryDelay", DefaultValue = Time.Hour, Index = WorldCfg.MailDeliveryDelay },
new() { Name = "CleanOldMailTime", DefaultValue = 4, Index = WorldCfg.CleanOldMailTime, Min = 0, Max = 23 },
new() { Name = "UpdateUptimeInterval", DefaultValue = 10, Index = WorldCfg.UptimeUpdate, Min = 1 },
new() { Name = "LogDB.Opt.ClearInterval", DefaultValue = 10, Index = WorldCfg.LogdbClearinterval, Min = 1 },
new() { Name = "LogDB.Opt.ClearTime", DefaultValue = 1209600, Index = WorldCfg.LogdbCleartime, Min = 1 },
new() { Name = "SkillChance.Orange", DefaultValue = 100, Index = WorldCfg.SkillChanceOrange },
new() { Name = "SkillChance.Yellow", DefaultValue = 75, Index = WorldCfg.SkillChanceYellow },
new() { Name = "SkillChance.Green", DefaultValue = 25, Index = WorldCfg.SkillChanceGreen },
new() { Name = "SkillChance.Grey", DefaultValue = 0, Index = WorldCfg.SkillChanceGrey },
new() { Name = "SkillChanceMiningSteps", DefaultValue = 75, Index = WorldCfg.SkillChanceMiningSteps },
new() { Name = "SkillChance.SkinningSteps", DefaultValue = 75, Index = WorldCfg.SkillChanceSkinningSteps },
new() { Name = "SkillGain.Crafting", DefaultValue = 1, Index = WorldCfg.SkillGainCrafting },
new() { Name = "SkillGain.Gathering", DefaultValue = 1, Index = WorldCfg.SkillGainGathering },
new() { Name = "MaxOverspeedPings", DefaultValue = 2, Index = WorldCfg.MaxOverspeedPings },
new() { Name = "ClientCacheVersion", DefaultValue = 0, Index = WorldCfg.ClientCacheVersion },
new() { Name = "DisableWaterBreath", DefaultValue = (uint)AccountTypes.Console, Index = WorldCfg.DisableBreathing },
new() { Name = "Expansion", DefaultValue = (uint)PlayerConst.CurrentExpansion, Index = WorldCfg.Expansion, Min = 0, Max = (uint)Expansion.Max, Reloadable = false },
new() { Name = "ChatFlood.MessageCount", DefaultValue = 10, Index = WorldCfg.ChatFloodMessageCount },
new() { Name = "ChatFlood.MessageDelay", DefaultValue = 1, Index = WorldCfg.ChatFloodMessageDelay },
new() { Name = "ChatFlood.AddonMessageCount", DefaultValue = 100, Index = WorldCfg.ChatFloodAddonMessageCount },
new() { Name = "ChatFlood.AddonMessageDelay", DefaultValue = 1, Index = WorldCfg.ChatFloodAddonMessageDelay },
new() { Name = "ChatFlood.MuteTime", DefaultValue = 10, Index = WorldCfg.ChatFloodMuteTime },
new() { Name = "CreatureFamilyAssistanceDelay", DefaultValue = 1500, Index = WorldCfg.CreatureFamilyAssistanceDelay },
new() { Name = "CreatureFamilyFleeDelay", DefaultValue = 7000, Index = WorldCfg.CreatureFamilyFleeDelay },
new() { Name = "WorldBossLevelDiff", DefaultValue = 3, Index = WorldCfg.WorldBossLevelDiff },
new() { Name = "Quests.LowLevelHideDiff", DefaultValue = 4, Index = WorldCfg.QuestLowLevelHideDiff, Max = SharedConst.MaxLevel },
new() { Name = "Quests.HighLevelHideDiff", DefaultValue = 7, Index = WorldCfg.QuestHighLevelHideDiff, Max = SharedConst.MaxLevel },
new() { Name = "Battleground.Random.ResetHour", DefaultValue = 6, Index = WorldCfg.RandomBgResetHour, Min = 0, Max = 23 },
new() { Name = "Calendar.DeleteOldEventsHour", DefaultValue = 6, Index = WorldCfg.CalendarDeleteOldEventsHour, Min = 0, Max = 23 },
new() { Name = "Guild.ResetHour", DefaultValue = 6, Index = WorldCfg.GuildResetHour, Min = 0, Max = 23 },
new() { Name = "TalentsInspecting", DefaultValue = 1, Index = WorldCfg.TalentsInspecting },
new() { Name = "ChatStrictLinkChecking.Severity", DefaultValue = 0, Index = WorldCfg.ChatStrictLinkCheckingSeverity },
new() { Name = "ChatStrictLinkChecking.Kick", DefaultValue = 0, Index = WorldCfg.ChatStrictLinkCheckingKick },
new() { Name = "Corpse.Decay.Normal", DefaultValue = 60, Index = WorldCfg.CorpseDecayNormal },
new() { Name = "Corpse.Decay.Elite", DefaultValue = 300, Index = WorldCfg.CorpseDecayElite },
new() { Name = "Corpse.Decay.RareElite", DefaultValue = 300, Index = WorldCfg.CorpseDecayRareelite },
new() { Name = "Corpse.Decay.Obsolete", DefaultValue = 3600, Index = WorldCfg.CorpseDecayObsolete },
new() { Name = "Corpse.Decay.Rare", DefaultValue = 300, Index = WorldCfg.CorpseDecayRare },
new() { Name = "Corpse.Decay.Trivial", DefaultValue = 300, Index = WorldCfg.CorpseDecayTrivial },
new() { Name = "Corpse.DecayMinusMob", DefaultValue = 150, Index = WorldCfg.CorpseDecayMinusMob },
new() { Name = "Death.SicknessLevel", DefaultValue = 11, Index = WorldCfg.DeathSicknessLevel },
new() { Name = "Battleground.ReportAFK", DefaultValue = 3, Index = WorldCfg.BattlegroundReportAfk, Min = 1, Max = 9 },
new() { Name = "Battleground.InvitationType", DefaultValue = 0, Index = WorldCfg.BattlegroundInvitationType },
new() { Name = "Battleground.PrematureFinishTimer", DefaultValue = 5 * Time.Minute * Time.InMilliseconds, Index = WorldCfg.BattlegroundPrematureFinishTimer },
new() { Name = "Battleground.PremadeGroupWaitForMatch", DefaultValue = 30 * Time.Minute * Time.InMilliseconds, Index = WorldCfg.BattlegroundPremadeGroupWaitForMatch },
new() { Name = "ArenaMaxRatingDifference", DefaultValue = 150, Index = WorldCfg.ArenaMaxRatingDifference },
new() { Name = "Arena.RatingDiscardTimer", DefaultValue = 10 * Time.Minute * Time.InMilliseconds, Index = WorldCfg.ArenaRatingDiscardTimer },
new() { Name = "Arena.RatedUpdateTimer", DefaultValue = 5 * Time.InMilliseconds, Index = WorldCfg.ArenaRatedUpdateTimer },
new() { Name = "Arena.ArenaSeason.ID", DefaultValue = 32, Index = WorldCfg.ArenaSeasonId },
new() { Name = "Arena.ArenaStartRating", DefaultValue = 0, Index = WorldCfg.ArenaStartRating },
new() { Name = "Arena.ArenaStartPersonalRating", DefaultValue = 1000, Index = WorldCfg.ArenaStartPersonalRating },
new() { Name = "Arena.ArenaStartMatchmakerRating", DefaultValue = 1500, Index = WorldCfg.ArenaStartMatchmakerRating },
new() { Name = "Creature.PickPocketRefillDelay", DefaultValue = 10 * Time.Minute, Index = WorldCfg.CreaturePickpocketRefill },
new() { Name = "Creature.MovingStopTimeForPlayer", DefaultValue = 3 * Time.Minute * Time.InMilliseconds, Index = WorldCfg.CreatureStopForPlayer },
new() { Name = "Guild.NewsLogRecordsCount", DefaultValue = GuildConst.NewsLogMaxRecords, Index = WorldCfg.GuildNewsLogCount, Max = GuildConst.NewsLogMaxRecords },
new() { Name = "Guild.EventLogRecordsCount", DefaultValue = GuildConst.EventLogMaxRecords, Index = WorldCfg.GuildEventLogCount, Max = GuildConst.EventLogMaxRecords },
new() { Name = "Guild.BankEventLogRecordsCount", DefaultValue = GuildConst.BankLogMaxRecords, Index = WorldCfg.GuildBankEventLogCount, Max = GuildConst.BankLogMaxRecords },
new() { Name = "Visibility.Notify.Period.OnContinents", DefaultValue = SharedConst.DefaultVisibilityNotifyPeriod, Index = WorldCfg.VisibilityNotifyPeriodContinent },
new() { Name = "Visibility.Notify.Period.InInstances", DefaultValue = SharedConst.DefaultVisibilityNotifyPeriod, Index = WorldCfg.VisibilityNotifyPeriodInstance },
new() { Name = "Visibility.Notify.Period.InBG", DefaultValue = SharedConst.DefaultVisibilityNotifyPeriod, Index = WorldCfg.VisibilityNotifyPeriodBattleground },
new() { Name = "Visibility.Notify.Period.InArenas", DefaultValue = SharedConst.DefaultVisibilityNotifyPeriod, Index = WorldCfg.VisibilityNotifyPeriodArena },
new() { Name = "CharDelete.Method", DefaultValue = 0, Index = WorldCfg.ChardeleteMethod },
new() { Name = "CharDeleteMinLevel", DefaultValue = 0, Index = WorldCfg.ChardeleteMinLevel },
new() { Name = "CharDelete.DeathKnightMinLevel", DefaultValue = 0, Index = WorldCfg.ChardeleteDeathKnightMinLevel },
new() { Name = "CharDelete.DemonHunterMinLevel", DefaultValue = 0, Index = WorldCfg.ChardeleteDemonHunterMinLevel },
new() { Name = "CharDelete.KeepDays", DefaultValue = 30, Index = WorldCfg.ChardeleteKeepDays },
new() { Name = "NoGrayAggro.Above", DefaultValue = 0, Index = WorldCfg.NoGrayAggroAbove },
new() { Name = "NoGrayAggro.Below", DefaultValue = 0, Index = WorldCfg.NoGrayAggroBelow },
new() { Name = "RespawnMinCheckIntervalMS", DefaultValue = 5000, Index = WorldCfg.RespawnMinCheckIntervalMs },
new() { Name = "Respawn.DynamicMode", DefaultValue = 0, Index = WorldCfg.RespawnDynamicMode, Min = 0, Max = 1 },
new() { Name = "Respawn.GuidWarnLevel", DefaultValue = 12000000, Index = WorldCfg.RespawnGuidWarnLevel, Min = 0, Max = 16777215 },
new() { Name = "Respawn.GuidAlertLevel", DefaultValue = 16000000, Index = WorldCfg.RespawnGuidAlertLevel, Min = 0, Max = 16777215 },
new() { Name = "Respawn.RestartQuietTime", DefaultValue = 3, Index = WorldCfg.RespawnRestartQuietTime, Min = 0, Max = 23 },
new() { Name = "Respawn.DynamicMinimumCreature", DefaultValue = 10, Index = WorldCfg.RespawnDynamicMinimumCreature },
new() { Name = "Respawn.DynamicMinimumGameObject", DefaultValue = 10, Index = WorldCfg.RespawnDynamicMinimumGameObject },
new() { Name = "Respawn.WarningFrequency", DefaultValue = 1800, Index = WorldCfg.RespawnGuidWarningFrequency },
new() { Name = "MaxWhoListReturns", DefaultValue = 49, Index = WorldCfg.MaxWho },
new() { Name = "HonorPointsAfterDuel", DefaultValue = 0, Index = WorldCfg.HonorAfterDuel },
new() { Name = "PvPToken.MapAllowType", DefaultValue = 4, Index = WorldCfg.PvpTokenMapType, Min = 1, Max = 4 },
new() { Name = "PvPToken.ItemID", DefaultValue = 29434, Index = WorldCfg.PvpTokenId },
new() { Name = "PvPToken.ItemCount", DefaultValue = 1, Index = WorldCfg.PvpTokenCount, Min = 1 },
new() { Name = "MapUpdate.Threads", DefaultValue = 1, Index = WorldCfg.Numthreads, Min = 1 },
new() { Name = "Command.LookupMaxResults", DefaultValue = 0, Index = WorldCfg.MaxResultsLookupCommands },
new() { Name = "Warden.NumInjectionChecks", DefaultValue = 9, Index = WorldCfg.WardenNumInjectChecks },
new() { Name = "Warden.NumLuaSandboxChecks", DefaultValue = 1, Index = WorldCfg.WardenNumLuaChecks },
new() { Name = "Warden.NumClientModChecks", DefaultValue = 1, Index = WorldCfg.WardenNumClientModChecks },
new() { Name = "Warden.BanDuration", DefaultValue = 86400, Index = WorldCfg.WardenClientBanDuration },
new() { Name = "Warden.ClientCheckHoldOff", DefaultValue = 30, Index = WorldCfg.WardenClientCheckHoldoff },
new() { Name = "Warden.ClientCheckFailAction", DefaultValue = 0, Index = WorldCfg.WardenClientFailAction },
new() { Name = "Warden.ClientResponseDelay", DefaultValue = 600, Index = WorldCfg.WardenClientResponseDelay },
new() { Name = "FeatureSystem.CharacterUndelete.Cooldown", DefaultValue = 2592000, Index = WorldCfg.FeatureSystemCharacterUndeleteCooldown },
new() { Name = "DungeonFinder.OptionsMask", DefaultValue = 1, Index = WorldCfg.LfgOptionsmask },
new() { Name = "Account.PasswordChangeSecurity", DefaultValue = 0, Index = WorldCfg.AccPasschangesec },
new() { Name = "Battleground.RewardWinnerHonorFirst", DefaultValue = 27000, Index = WorldCfg.BgRewardWinnerHonorFirst },
new() { Name = "Battleground.RewardWinnerConquestFirst", DefaultValue = 10000, Index = WorldCfg.BgRewardWinnerConquestFirst },
new() { Name = "Battleground.RewardWinnerHonorLast", DefaultValue = 13500, Index = WorldCfg.BgRewardWinnerHonorLast },
new() { Name = "Battleground.RewardWinnerConquestLast", DefaultValue = 5000, Index = WorldCfg.BgRewardWinnerConquestLast },
new() { Name = "Battleground.RewardLoserHonorFirst", DefaultValue = 4500, Index = WorldCfg.BgRewardLoserHonorFirst },
new() { Name = "Battleground.RewardLoserHonorLast", DefaultValue = 3500, Index = WorldCfg.BgRewardLoserHonorLast },
new() { Name = "AccountInstancesPerHour", DefaultValue = 10, Index = WorldCfg.MaxInstancesPerHour },
new() { Name = "AutoBroadcast.Center", DefaultValue = 0, Index = WorldCfg.AutoBroadcastCenter },
new() { Name = "AutoBroadcast.Timer", DefaultValue = 60000, Index = WorldCfg.AutoBroadcastInterval },
new() { Name = "MaxPingTime", DefaultValue = 30, Index = WorldCfg.DbPingInterval },
new() { Name = "Guild.SaveInterval", DefaultValue = 15, Index = WorldCfg.GuildSaveInterval },
new() { Name = "Wintergrasp.PlayerMax", DefaultValue = 100, Index = WorldCfg.WintergraspPlrMax },
new() { Name = "Wintergrasp.PlayerMin", DefaultValue = 0, Index = WorldCfg.WintergraspPlrMin },
new() { Name = "Wintergrasp.PlayerMinLvl", DefaultValue = 77, Index = WorldCfg.WintergraspPlrMinLvl },
new() { Name = "Wintergrasp.BattleTimer", DefaultValue = 30, Index = WorldCfg.WintergraspBattletime },
new() { Name = "Wintergrasp.NoBattleTimer", DefaultValue = 150, Index = WorldCfg.WintergraspNobattletime },
new() { Name = "Wintergrasp.CrashRestartTimer", DefaultValue = 10, Index = WorldCfg.WintergraspRestartAfterCrash },
new() { Name = "TolBarad.PlayerMax", DefaultValue = 100, Index = WorldCfg.TolbaradPlrMax },
new() { Name = "TolBarad.PlayerMin", DefaultValue = 0, Index = WorldCfg.TolbaradPlrMin },
new() { Name = "TolBarad.PlayerMinLvl", DefaultValue = 85, Index = WorldCfg.TolbaradPlrMinLvl },
new() { Name = "TolBarad.BattleTimer", DefaultValue = 15, Index = WorldCfg.TolbaradBattleTime },
new() { Name = "TolBarad.BonusTime", DefaultValue = 5, Index = WorldCfg.TolbaradBonusTime },
new() { Name = "TolBarad.NoBattleTimer", DefaultValue = 150, Index = WorldCfg.TolbaradNoBattleTime },
new() { Name = "TolBarad.CrashRestartTimer", DefaultValue = 10, Index = WorldCfg.TolbaradRestartAfterCrash },
new() { Name = "PacketSpoof.Policy", DefaultValue = (uint)DosProtection.Policy.Kick, Index = WorldCfg.PacketSpoofPolicy },
new() { Name = "PacketSpoof.BanMode", DefaultValue = (uint)BanMode.Account, Index = WorldCfg.PacketSpoofBanmode, Min = (uint)BanMode.Account, Max = (uint)BanMode.IP },
new() { Name = "PacketSpoof.BanDuration", DefaultValue = 86400, Index = WorldCfg.PacketSpoofBanduration },
new() { Name = "AuctionHouseBot.Update.Interval", DefaultValue = 20, Index = WorldCfg.AhbotUpdateInterval },
new() { Name = "BlackMarketMaxAuctions", DefaultValue = 12, Index = WorldCfg.BlackmarketMaxAuctions },
new() { Name = "BlackMarket.UpdatePeriod", DefaultValue = 24, Index = WorldCfg.BlackmarketUpdatePeriod },
new() { Name = "Pvp.FactionBalance.LevelCheckDiff", DefaultValue = 0, Index = WorldCfg.FactionBalanceLevelCheckDiff },
];
ConfigOptionLoadDefinition<ulong>[] int64s =
[
new() { Name = "CharacterCreating.Disabled.RaceMask", DefaultValue = 0, Index = WorldCfg.CharacterCreatingDisabledRacemask },
new() { Name = "StartPlayerMoney", DefaultValue = 0, Index = WorldCfg.StartPlayerMoney, Min = 0, Max = PlayerConst.MaxMoneyAmount },
];
ConfigOptionLoadDefinition<float>[] floats =
[
new() { Name = "MaxGroupXPDistance", DefaultValue = 74.0f, Index = WorldCfg.GroupXpDistance },
new() { Name = "MaxRecruitAFriendBonusDistance", DefaultValue = 100.0f, Index = WorldCfg.MaxRecruitAFriendDistance },
new() { Name = "MonsterSight", DefaultValue = 50.0f, Index = WorldCfg.SightMonster },
new() { Name = "CreatureFamilyFleeAssistanceRadius", DefaultValue = 30.0f, Index = WorldCfg.CreatureFamilyFleeAssistanceRadius },
new() { Name = "CreatureFamilyAssistanceRadius", DefaultValue = 10.0f, Index = WorldCfg.CreatureFamilyAssistanceRadius },
new() { Name = "ThreatRadius", DefaultValue = 60.0f, Index = WorldCfg.ThreatRadius },
new() { Name = "ListenRange.Say", DefaultValue = 25.0f, Index = WorldCfg.ListenRangeSay },
new() { Name = "ListenRange.TextEmote", DefaultValue = 25.0f, Index = WorldCfg.ListenRangeTextemote },
new() { Name = "ListenRange.Yell", DefaultValue = 300.0f, Index = WorldCfg.ListenRangeYell },
new() { Name = "Arena.ArenaWinRatingModifier1", DefaultValue = 48.0f, Index = WorldCfg.ArenaWinRatingModifier1 },
new() { Name = "Arena.ArenaWinRatingModifier2", DefaultValue = 24.0f, Index = WorldCfg.ArenaWinRatingModifier2 },
new() { Name = "Arena.ArenaLoseRatingModifier", DefaultValue = 24.0f, Index = WorldCfg.ArenaLoseRatingModifier },
new() { Name = "Arena.ArenaMatchmakerRatingModifier", DefaultValue = 24.0f, Index = WorldCfg.ArenaMatchmakerRatingModifier },
new() { Name = "Visibility.Distance.Continents", DefaultValue = SharedConst.DefaultVisibilityDistance, Index = WorldCfg.MaxVisibilityDistanceContinent, Min = 0.0f, Max = SharedConst.MaxVisibilityDistance },
new() { Name = "Visibility.Distance.Instances", DefaultValue = SharedConst.DefaultVisibilityInstance, Index = WorldCfg.MaxVisibilityDistanceInstance, Min = 0.0f, Max = SharedConst.MaxVisibilityDistance },
new() { Name = "Visibility.Distance.BG", DefaultValue = SharedConst.DefaultVisibilityBGAreans, Index = WorldCfg.MaxVisibilityDistanceBattleground, Min = 0.0f, Max = SharedConst.MaxVisibilityDistance },
new() { Name = "Visibility.Distance.Arenas", DefaultValue = SharedConst.DefaultVisibilityBGAreans, Index = WorldCfg.MaxVisibilityDistanceArena, Min = 0.0f, Max = SharedConst.MaxVisibilityDistance },
new() { Name = "Respawn.DynamicRateCreature", DefaultValue = 10.0f, Index = WorldCfg.RespawnDynamicRateCreature, Min = 0.0f },
new() { Name = "Respawn.DynamicRateGameObject", DefaultValue = 10.0f, Index = WorldCfg.RespawnDynamicRateGameobject, Min = 0.0f },
new() { Name = "Stats.Limits.Dodge", DefaultValue = 95.0f, Index = WorldCfg.StatsLimitsDodge },
new() { Name = "Stats.Limits.Parry", DefaultValue = 95.0f, Index = WorldCfg.StatsLimitsParry },
new() { Name = "Stats.Limits.Block", DefaultValue = 95.0f, Index = WorldCfg.StatsLimitsBlock },
new() { Name = "Stats.Limits.Crit", DefaultValue = 95.0f, Index = WorldCfg.StatsLimitsCrit },
new() { Name = "Pvp.FactionBalance.Pct5", DefaultValue = 0.6f, Index = WorldCfg.CallToArms5Pct },
new() { Name = "Pvp.FactionBalance.Pct10", DefaultValue = 0.7f, Index = WorldCfg.CallToArms10Pct },
new() { Name = "Pvp.FactionBalance.Pct20", DefaultValue = 0.8f, Index = WorldCfg.CallToArms20Pct },
];
ConfigOptionLoadDefinition<float>[] rates =
[
new() { Name = "Rate.Health", DefaultValue = 1.0f, Index = WorldCfg.RateHealth, Min = 0.01f },
new() { Name = "Rate.Mana", DefaultValue = 1.0f, Index = WorldCfg.RatePowerMana, Min = 0.01f },
new() { Name = "Rate.Rage.Gain", DefaultValue = 1.0f, Index = WorldCfg.RatePowerRageIncome, Min = 0.01f },
new() { Name = "Rate.Rage.Loss", DefaultValue = 1.0f, Index = WorldCfg.RatePowerRageLoss, Min = 0.01f },
new() { Name = "Rate.Focus", DefaultValue = 1.0f, Index = WorldCfg.RatePowerFocus, Min = 0.01f },
new() { Name = "Rate.Energy", DefaultValue = 1.0f, Index = WorldCfg.RatePowerEnergy, Min = 0.01f },
new() { Name = "Rate.ComboPoints.Loss", DefaultValue = 1.0f, Index = WorldCfg.RatePowerComboPointsLoss, Min = 0.01f },
new() { Name = "Rate.RunicPower.Gain", DefaultValue = 1.0f, Index = WorldCfg.RatePowerRunicPowerIncome, Min = 0.01f },
new() { Name = "Rate.RunicPower.Loss", DefaultValue = 1.0f, Index = WorldCfg.RatePowerRunicPowerLoss, Min = 0.01f },
new() { Name = "Rate.SoulShards.Loss", DefaultValue = 1.0f, Index = WorldCfg.RatePowerSoulShards, Min = 0.01f },
new() { Name = "Rate.LunarPower.Loss", DefaultValue = 1.0f, Index = WorldCfg.RatePowerLunarPower, Min = 0.01f },
new() { Name = "Rate.HolyPower.Loss", DefaultValue = 1.0f, Index = WorldCfg.RatePowerHolyPower, Min = 0.01f },
new() { Name = "Rate.Maelstrom.Loss", DefaultValue = 1.0f, Index = WorldCfg.RatePowerMaelstrom, Min = 0.01f },
new() { Name = "Rate.Chi.Loss", DefaultValue = 1.0f, Index = WorldCfg.RatePowerChi, Min = 0.01f },
new() { Name = "Rate.Insanity.Loss", DefaultValue = 1.0f, Index = WorldCfg.RatePowerInsanity, Min = 0.01f },
new() { Name = "Rate.ArcaneCharges.Loss", DefaultValue = 1.0f, Index = WorldCfg.RatePowerArcaneCharges, Min = 0.01f },
new() { Name = "Rate.Fury.Loss", DefaultValue = 1.0f, Index = WorldCfg.RatePowerFury, Min = 0.01f },
new() { Name = "Rate.Pain.Loss", DefaultValue = 1.0f, Index = WorldCfg.RatePowerPain, Min = 0.01f },
new() { Name = "Rate.Essence.Loss", DefaultValue = 1.0f, Index = WorldCfg.RatePowerEssence, Min = 0.01f },
new() { Name = "Rate.Skill.Discovery", DefaultValue = 1.0f, Index = WorldCfg.RateSkillDiscovery },
new() { Name = "Rate.Drop.Item.Poor", DefaultValue = 1.0f, Index = WorldCfg.RateDropItemPoor },
new() { Name = "Rate.Drop.Item.Normal", DefaultValue = 1.0f, Index = WorldCfg.RateDropItemNormal },
new() { Name = "Rate.Drop.Item.Uncommon", DefaultValue = 1.0f, Index = WorldCfg.RateDropItemUncommon },
new() { Name = "Rate.Drop.Item.Rare", DefaultValue = 1.0f, Index = WorldCfg.RateDropItemRare },
new() { Name = "Rate.Drop.Item.Epic", DefaultValue = 1.0f, Index = WorldCfg.RateDropItemEpic },
new() { Name = "Rate.Drop.Item.Legendary", DefaultValue = 1.0f, Index = WorldCfg.RateDropItemLegendary },
new() { Name = "Rate.Drop.Item.Artifact", DefaultValue = 1.0f, Index = WorldCfg.RateDropItemArtifact },
new() { Name = "Rate.Drop.Item.Referenced", DefaultValue = 1.0f, Index = WorldCfg.RateDropItemReferenced },
new() { Name = "Rate.Drop.Item.ReferencedAmount", DefaultValue = 1.0f, Index = WorldCfg.RateDropItemReferencedAmount },
new() { Name = "Rate.Drop.Money", DefaultValue = 1.0f, Index = WorldCfg.RateDropMoney },
new() { Name = "Rate.XP.Kill", DefaultValue = 1.0f, Index = WorldCfg.RateXpKill },
new() { Name = "Rate.XP.BattlegroundKill", DefaultValue = 1.0f, Index = WorldCfg.RateXpBgKill },
new() { Name = "Rate.XP.Quest", DefaultValue = 1.0f, Index = WorldCfg.RateXpQuest },
new() { Name = "Rate.XP.Explore", DefaultValue = 1.0f, Index = WorldCfg.RateXpExplore },
new() { Name = "XP.Boost.Rate", DefaultValue = 2.0f, Index = WorldCfg.RateXpBoost },
new() { Name = "Rate.RepairCost", DefaultValue = 1.0f, Index = WorldCfg.RateRepaircost, Min = 0.0f },
new() { Name = "Rate.Reputation.Gain", DefaultValue = 1.0f, Index = WorldCfg.RateReputationGain },
new() { Name = "Rate.Reputation.LowLevel.Kill", DefaultValue = 1.0f, Index = WorldCfg.RateReputationLowLevelKill },
new() { Name = "Rate.Reputation.LowLevel.Quest", DefaultValue = 1.0f, Index = WorldCfg.RateReputationLowLevelQuest },
new() { Name = "Rate.Reputation.RecruitAFriendBonus", DefaultValue = 0.1f, Index = WorldCfg.RateReputationRecruitAFriendBonus},
new() { Name = "Rate.Creature.HP.Normal", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureHpNormal },
new() { Name = "Rate.Creature.HP.Elite", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureHpElite },
new() { Name = "Rate.Creature.HP.RareElite", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureHpRareelite },
new() { Name = "Rate.Creature.HP.Obsolete", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureHpObsolete },
new() { Name = "Rate.Creature.HP.Rare", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureHpRare },
new() { Name = "Rate.Creature.HP.Trivial", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureHpTrivial },
new() { Name = "Rate.Creature.HPMinusMob", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureHpMinusmob },
new() { Name = "Rate.Creature.Damage.Normal", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureDamageNormal },
new() { Name = "Rate.Creature.Damage.Elite", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureDamageElite },
new() { Name = "Rate.Creature.Damage.RareElite", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureDamageRareelite },
new() { Name = "Rate.Creature.Damage.Obsolete", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureDamageObsolete },
new() { Name = "Rate.Creature.Damage.Rare", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureDamageRare },
new() { Name = "Rate.Creature.Damage.Trivial", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureDamageTrivial },
new() { Name = "Rate.Creature.DamageMinusMob", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureDamageMinusmob },
new() { Name = "Rate.Creature.SpellDamage.Normal", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureSpelldamageNormal },
new() { Name = "Rate.Creature.SpellDamage.Elite", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureSpelldamageElite },
new() { Name = "Rate.Creature.SpellDamage.RareElite", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureSpelldamageRareelite },
new() { Name = "Rate.Creature.SpellDamage.Obsolete", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureSpelldamageObsolete },
new() { Name = "Rate.Creature.SpellDamage.Rare", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureSpelldamageRare },
new() { Name = "Rate.Creature.SpellDamage.Trivial", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureSpelldamageTrivial },
new() { Name = "Rate.Creature.SpellDamageMinusMob", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureSpelldamageMinusmob },
new() { Name = "Rate.Creature.Aggro", DefaultValue = 1.0f, Index = WorldCfg.RateCreatureAggro },
new() { Name = "Rate.Rest.InGame", DefaultValue = 1.0f, Index = WorldCfg.RateRestIngame },
new() { Name = "Rate.Rest.Offline.InTavernOrCity", DefaultValue = 1.0f, Index = WorldCfg.RateRestOfflineInTavernOrCity },
new() { Name = "Rate.Rest.Offline.InWilderness", DefaultValue = 1.0f, Index = WorldCfg.RateRestOfflineInWilderness },
new() { Name = "Rate.Damage.Fall", DefaultValue = 1.0f, Index = WorldCfg.RateDamageFall },
new() { Name = "Rate.Auction.Time", DefaultValue = 1.0f, Index = WorldCfg.RateAuctionTime },
new() { Name = "Rate.Auction.Deposit", DefaultValue = 1.0f, Index = WorldCfg.RateAuctionDeposit },
new() { Name = "Rate.Auction.Cut", DefaultValue = 1.0f, Index = WorldCfg.RateAuctionCut },
new() { Name = "Rate.Honor", DefaultValue = 1.0f, Index = WorldCfg.RateHonor },
new() { Name = "Rate.InstanceResetTime", DefaultValue = 1.0f, Index = WorldCfg.RateInstanceResetTime },
new() { Name = "Rate.MoveSpeed", DefaultValue = 1.0f, Index = WorldCfg.RateMovespeed, Min = 0.01f },
new() { Name = "Rate.Corpse.Decay.Looted", DefaultValue = 0.5f, Index = WorldCfg.RateCorpseDecayLooted },
new() { Name = "DurabilityLoss.OnDeath", DefaultValue = 10.0f, Index = WorldCfg.RateDurabilityLossOnDeath, Min = 0.0f, Max = 100.0f },
new() { Name = "DurabilityLossChance.Damage", DefaultValue = 0.5f, Index = WorldCfg.RateDurabilityLossDamage, Min = 0.0f },
new() { Name = "DurabilityLossChance.Absorb", DefaultValue = 0.5f, Index = WorldCfg.RateDurabilityLossAbsorb, Min = 0.0f },
new() { Name = "DurabilityLossChance.Parry", DefaultValue = 0.05f, Index = WorldCfg.RateDurabilityLossParry, Min = 0.0f },
new() { Name = "DurabilityLossChance.Block", DefaultValue = 0.05f, Index = WorldCfg.RateDurabilityLossBlock, Min = 0.0f },
new() { Name = "Rate.Quest.Money.Reward", DefaultValue = 1.0f, Index = WorldCfg.RateMoneyQuest, Min = 0.0f },
new() { Name = "Rate.Quest.MoneyMax.Level.Reward", DefaultValue = 1.0f, Index = WorldCfg.RateMoneyMaxLevelQuest, Min = 0.0f },
];
foreach (ConfigOptionLoadDefinition<bool> definition in bools)
StoreConfigValue(GetDefaultValue(definition.Name, definition.DefaultValue), definition, reload);
foreach (ConfigOptionLoadDefinition<uint> definition in ints)
StoreConfigValue(GetDefaultValue(definition.Name, definition.DefaultValue), definition, reload);
foreach (ConfigOptionLoadDefinition<ulong> definition in int64s)
StoreConfigValue(GetDefaultValue(definition.Name, definition.DefaultValue), definition, reload);
foreach (ConfigOptionLoadDefinition<float> definition in floats)
StoreConfigValue(GetDefaultValue(definition.Name, definition.DefaultValue), definition, reload);
foreach (ConfigOptionLoadDefinition<float> definition in rates)
StoreConfigValue(GetDefaultValue(definition.Name, definition.DefaultValue), definition, reload);
Values[WorldCfg.RateDurabilityLossOnDeath] = (float)Values[WorldCfg.RateDurabilityLossOnDeath] / 100.0f;
if ((bool)Values[WorldCfg.GridUnload])
{
if ((bool)Values[WorldCfg.BasemapLoadGrids])
{
Log.outError(LogFilter.ServerLoading, "BaseMapLoadAllGrids enabled, but GridUnload also enabled. GridUnload must be disabled to enable base map pre-loading. Base map pre-loading disabled");
Values[WorldCfg.BasemapLoadGrids] = false;
}
if ((bool)Values[WorldCfg.InstancemapLoadGrids])
{
Log.outError(LogFilter.ServerLoading, "InstanceMapLoadAllGrids enabled, but GridUnload also enabled. GridUnload must be disabled to enable instance map pre-loading. Instance map pre-loading disabled");
Values[WorldCfg.InstancemapLoadGrids] = false;
}
}
// Config values are in "milliseconds" but we handle SocketTimeOut only as "seconds" so divide by 1000
Values[WorldCfg.SocketTimeoutTime] = (uint)Values[WorldCfg.SocketTimeoutTime] / 1000;
Values[WorldCfg.SocketTimeoutTimeActive] = (uint)Values[WorldCfg.SocketTimeoutTime] / 1000;
// must be after CONFIG_CHARACTERS_PER_REALM
if ((uint)Values[WorldCfg.CharactersPerAccount] < (uint)Values[WorldCfg.CharactersPerRealm])
{
Log.outError(LogFilter.ServerLoading, $"CharactersPerAccount ({Values[WorldCfg.CharactersPerAccount]}) can't be less than CharactersPerRealm ({Values[WorldCfg.CharactersPerRealm]}).");
Values[WorldCfg.CharactersPerAccount] = Values[WorldCfg.CharactersPerRealm];
}
void validateStartLevel(WorldCfg config, string name)
{
uint maxLevel = (uint)Values[WorldCfg.MaxPlayerLevel];
if ((uint)Values[config] > maxLevel)
{
Log.outError(LogFilter.ServerLoading, $"{name} ({Values[config]}) must be in range 1..MaxPlayerLevel({maxLevel}). Set to {maxLevel}.");
Values[config] = maxLevel;
}
}
validateStartLevel(WorldCfg.StartPlayerLevel, "StartPlayerLevel");
validateStartLevel(WorldCfg.StartDeathKnightPlayerLevel, "StartDeathKnightPlayerLevel");
validateStartLevel(WorldCfg.StartDemonHunterPlayerLevel, "StartDemonHunterPlayerLevel");
validateStartLevel(WorldCfg.StartEvokerPlayerLevel, "StartEvokerPlayerLevel");
validateStartLevel(WorldCfg.StartAlliedRaceLevel, "StartDemonHunterPlayerLevel");
validateStartLevel(WorldCfg.MaxRecruitAFriendBonusPlayerLevel, "RecruitAFriend.MaxLevel");
if ((int)Values[WorldCfg.StartGmLevel] < (int)Values[WorldCfg.StartPlayerLevel])
{
Log.outError(LogFilter.ServerLoading, $"GM.StartLevel ({Values[WorldCfg.StartGmLevel]}) must be in range StartPlayerLevel({Values[WorldCfg.StartPlayerLevel]})..{SharedConst.MaxLevel}. Set to {Values[WorldCfg.StartPlayerLevel]}.");
Values[WorldCfg.StartGmLevel] = Values[WorldCfg.StartPlayerLevel];
}
Log.outInfo(LogFilter.ServerLoading, $"Will clear `logs` table of entries older than {Values[WorldCfg.LogdbCleartime]} seconds every {Values[WorldCfg.LogdbClearinterval]} minutes.");
if ((int)Values[WorldCfg.MaxOverspeedPings] != 0 && (int)Values[WorldCfg.MaxOverspeedPings] < 2)
{
Log.outError(LogFilter.ServerLoading, $"MaxOverspeedPings ({Values[WorldCfg.MaxOverspeedPings]}) must be in range 2..infinity (or 0 to disable check). Set to 2.");
Values[WorldCfg.MaxOverspeedPings] = 2;
}
// always use declined names in the russian client
Cfg_CategoriesRecord category = CliDB.CfgCategoriesStorage.LookupByKey(Values[WorldCfg.RealmZone]);
if (category != null && category.GetCreateCharsetMask().HasFlag(CfgCategoriesCharsets.Russian))
Values[WorldCfg.DeclinedNamesUsed] = true;
if ((int)Values[WorldCfg.ClientCacheVersion] == 0)
Values[WorldCfg.ClientCacheVersion] = databaseCacheVersion;
void validateVisibilityDistance(WorldCfg config, string name)
{
float minVisibilityDistance = 45.0f * (float)Values[WorldCfg.RateCreatureAggro];
if ((float)Values[config] < minVisibilityDistance)
{
Log.outError(LogFilter.ServerLoading, $"{name} can't be less max aggro radius {minVisibilityDistance}");
Values[config] = minVisibilityDistance;
}
}
// visibility on continents
validateVisibilityDistance(WorldCfg.MaxVisibilityDistanceContinent, "Visibility.Distance.Continents");
// visibility in instances
validateVisibilityDistance(WorldCfg.MaxVisibilityDistanceInstance, "Visibility.Distance.Instances");
// visibility in BG
validateVisibilityDistance(WorldCfg.MaxVisibilityDistanceBattleground, "Visibility.Distance.BG");
// Visibility in Arenas
validateVisibilityDistance(WorldCfg.MaxVisibilityDistanceArena, "Visibility.Distance.Arenas");
// No aggro from gray mobs
if ((int)Values[WorldCfg.NoGrayAggroAbove] > (int)Values[WorldCfg.MaxPlayerLevel])
{
Log.outError(LogFilter.ServerLoading, $"NoGrayAggro.Above ({Values[WorldCfg.NoGrayAggroAbove]}) must be in range 0..{Values[WorldCfg.MaxPlayerLevel]}. Set to {Values[WorldCfg.MaxPlayerLevel]}.");
Values[WorldCfg.NoGrayAggroAbove] = Values[WorldCfg.MaxPlayerLevel];
}
if ((int)Values[WorldCfg.NoGrayAggroBelow] > (int)Values[WorldCfg.MaxPlayerLevel])
{
Log.outError(LogFilter.ServerLoading, $"NoGrayAggro.Below ({Values[WorldCfg.NoGrayAggroBelow]}) must be in range 0..{Values[WorldCfg.MaxPlayerLevel]}. Set to {Values[WorldCfg.MaxPlayerLevel]}.");
Values[WorldCfg.NoGrayAggroBelow] = Values[WorldCfg.MaxPlayerLevel];
}
if ((int)Values[WorldCfg.NoGrayAggroAbove] > 0 && (int)Values[WorldCfg.NoGrayAggroAbove] < (int)Values[WorldCfg.NoGrayAggroBelow])
{
Log.outError(LogFilter.ServerLoading, $"NoGrayAggro.Below ({Values[WorldCfg.NoGrayAggroBelow]}) cannot be greater than NoGrayAggro.Above ({Values[WorldCfg.NoGrayAggroAbove]}). Set to {Values[WorldCfg.NoGrayAggroAbove]}.");
Values[WorldCfg.NoGrayAggroBelow] = Values[WorldCfg.NoGrayAggroAbove];
}
int clientCacheId = GetDefaultValue("ClientCacheVersion", 0);
if (clientCacheId != 0)
{
// overwrite DB/old value
if (clientCacheId > 0)
Values[WorldCfg.ClientCacheVersion] = clientCacheId;
else
Log.outError(LogFilter.ServerLoading, "ClientCacheVersion can't be negative {0}, ignored.", clientCacheId);
}
Log.outInfo(LogFilter.ServerLoading, "Client cache version set to: {0}", clientCacheId);
// call ScriptMgr if we're reloading the configuration
if (reload)
Global.ScriptMgr.OnConfigLoad(reload);
}
static void StoreConfigValue<T>(dynamic value, ConfigOptionLoadDefinition<T> definition, bool reload) where T : struct
{
if (typeof(T) == typeof(bool))
{
if (definition.Min.HasValue && value < definition.Min)
{
Log.outError(LogFilter.Sql, $"{definition.Name} {value} must be >= {definition.Min}. Using {definition.Min} instead.");
value = definition.Min;
}
if (definition.Max.HasValue && value > definition.Max)
{
Log.outError(LogFilter.ServerLoading, $"{definition.Name} {value} must be <= {definition.Max}. Using {definition.Max} instead.");
value = definition.Max;
}
}
if (reload && !definition.Reloadable)
{
if (value != Values[definition.Index])
Log.outError(LogFilter.ServerLoading, $"{definition.Name} option can't be changed at worldserver.conf reload, using current value ({Values[definition.Index]}).");
return;
}
Values[definition.Index] = value;
}
public static uint GetUIntValue(WorldCfg confi)
{
return Convert.ToUInt32(Values.LookupByKey(confi));
}
public static int GetIntValue(WorldCfg confi)
{
return Convert.ToInt32(Values.LookupByKey(confi));
}
public static ulong GetUInt64Value(WorldCfg confi)
{
return Convert.ToUInt64(Values.LookupByKey(confi));
}
public static bool GetBoolValue(WorldCfg confi)
{
return Convert.ToBoolean(Values.LookupByKey(confi));
}
public static float GetFloatValue(WorldCfg confi)
{
return Convert.ToSingle(Values.LookupByKey(confi));
}
public static void SetValue(WorldCfg confi, object value)
{
Values[confi] = value;
}
static Dictionary<WorldCfg, object> Values = new();
}
struct ConfigOptionLoadDefinition<T>() where T : struct
{
public string Name;
public T DefaultValue;
public WorldCfg Index;
public T? Min;
public T? Max;
public bool Reloadable = true;
}
}