summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakenbacon <revoke1336@live.com>2025-06-30 08:14:12 -0700
committerGitHub <noreply@github.com>2025-06-30 17:14:12 +0200
commitfd262c3ab109afec7d191c97d2b44f58eb4a1477 (patch)
tree203365aa95c3e394283f5259b7a0b3d070c13d02
parent904ddc72cc92bbd668c2a2a0b4da8e2a09de02cc (diff)
feat(Core/Config): Improvements to config caching (#21647)
-rw-r--r--src/common/Configuration/ConfigValueCache.h145
-rw-r--r--src/server/game/Entities/Player/Player.cpp4
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp4
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp32
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp5
-rw-r--r--src/server/game/Loot/LootMgr.cpp7
-rw-r--r--src/server/game/Warden/WardenWin.cpp2
-rw-r--r--src/server/game/World/IWorld.h494
-rw-r--r--src/server/game/World/World.cpp1075
-rw-r--r--src/server/game/World/World.h63
-rw-r--r--src/server/game/World/WorldConfig.cpp658
-rw-r--r--src/server/game/World/WorldConfig.h487
-rw-r--r--src/test/mocks/WorldMock.h20
13 files changed, 1442 insertions, 1554 deletions
diff --git a/src/common/Configuration/ConfigValueCache.h b/src/common/Configuration/ConfigValueCache.h
new file mode 100644
index 0000000000..e36d411ac4
--- /dev/null
+++ b/src/common/Configuration/ConfigValueCache.h
@@ -0,0 +1,145 @@
+/*
+ * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation; either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef CONFIGVALUECACHE_H
+#define CONFIGVALUECACHE_H
+
+#include "Common.h"
+#include "Config.h"
+#include "Errors.h"
+#include "Log.h"
+#include <variant>
+
+template<typename ConfigEnum>
+class ConfigValueCache
+{
+ static_assert(std::is_enum_v<ConfigEnum>);
+
+public:
+ enum class Reloadable : bool
+ {
+ No = false,
+ Yes = true
+ };
+
+ ConfigValueCache(ConfigEnum const configCount)
+ {
+ _configs.resize(static_cast<uint32>(configCount));
+ _reloading = false;
+ }
+
+ void Initialize(bool reload)
+ {
+ _reloading = reload;
+ BuildConfigCache();
+ _reloading = false;
+ VerifyAllConfigsLoaded();
+ }
+
+ template<class T>
+ void SetConfigValue(ConfigEnum const config, std::string const& configName, T const& defaultValue, Reloadable reloadable = Reloadable::Yes, std::function<bool(T const& value)>&& checker = {}, std::string const& validationErrorText = "")
+ {
+ uint32 const configIndex = static_cast<uint32>(config);
+ ASSERT(configIndex < _configs.size(), "Config index out of bounds");
+ T const& configValue = sConfigMgr->GetOption<T>(configName, defaultValue);
+
+ bool configValueChanged = false;
+ if (_reloading)
+ {
+ if (std::get<T>(_configs[configIndex]) != configValue)
+ configValueChanged = true;
+
+ if (reloadable == Reloadable::No)
+ {
+ if (configValueChanged)
+ LOG_ERROR("server.loading", "Server Config (Name: {}) cannot be changed by reload. A server restart is required to update this config value.", configName);
+ return;
+ }
+ }
+ else
+ ASSERT(_configs[configIndex].index() == 0, "Config overwriting an existing value");
+
+ if (checker && !checker(configValue))
+ {
+ LOG_ERROR("server.loading", "Server Config (Name: {}) failed validation check '{}'. Default value '{}' will be used instead.", configName, validationErrorText, defaultValue);
+ _configs[configIndex] = defaultValue;
+ }
+ else
+ _configs[configIndex] = configValue;
+ }
+
+ template<class T>
+ void OverwriteConfigValue(ConfigEnum const config, T const& value)
+ {
+ uint32 const configIndex = static_cast<uint32>(config);
+ ASSERT(configIndex < _configs.size(), "Config index out of bounds");
+ size_t const oldValueTypeIndex = _configs[configIndex].index();
+ ASSERT(oldValueTypeIndex != 0, "Config value must already be set");
+ _configs[configIndex] = value;
+ ASSERT(oldValueTypeIndex == _configs[configIndex].index(), "Config value type changed");
+ }
+
+ template<class T>
+ T GetConfigValue(ConfigEnum const config) const
+ {
+ uint32 const configIndex = static_cast<uint32>(config);
+ ASSERT(configIndex < _configs.size(), "Config index out of bounds");
+ ASSERT(_configs[configIndex].index() != 0, "Config value must already be set");
+
+ T const* value = std::get_if<T>(&_configs[configIndex]);
+ ASSERT(value, "Wrong config variant type");
+
+ return *value;
+ }
+
+ // Custom handling for string configs to convert from std::string to std::string_view
+ std::string_view GetConfigValue(ConfigEnum const config) const
+ {
+ uint32 const configIndex = static_cast<uint32>(config);
+ ASSERT(configIndex < _configs.size(), "Config index out of bounds");
+ ASSERT(_configs[configIndex].index() != 0, "Config value must already be set");
+
+ std::string const* stringValue = std::get_if<std::string>(&_configs[configIndex]);
+ ASSERT(stringValue, "Wrong config variant type");
+
+ return std::string_view(*stringValue);
+ }
+
+protected:
+ virtual void BuildConfigCache() = 0;
+
+private:
+ void VerifyAllConfigsLoaded()
+ {
+ uint32 configIndex = 0;
+ for (auto const& variant : _configs)
+ {
+ if (variant.index() == 0)
+ {
+ LOG_ERROR("server.loading", "Server Config (Index: {}) is defined but not loaded, unable to continue.", configIndex);
+ ASSERT(false);
+ }
+
+ ++configIndex;
+ }
+ }
+
+ std::vector<std::variant<std::monostate, float, bool, uint32, std::string>> _configs;
+ bool _reloading;
+};
+
+#endif
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 3ff49c4c81..95991766b5 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -797,8 +797,8 @@ uint32 Player::EnvironmentalDamage(EnviromentalDamage type, uint32 damage)
if (type == DAMAGE_FALL) // DealDamage not apply item durability loss at self damage
{
LOG_DEBUG("entities.player", "Player::EnvironmentalDamage: Player '{}' ({}) fall to death, losing {} durability",
- GetName(), GetGUID().ToString(), sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH));
- DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH), false);
+ GetName(), GetGUID().ToString(), sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH) / 100.0f);
+ DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH) / 100.0f, false);
// durability lost message
SendDurabilityLoss();
}
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 3d45ed10da..924ddae887 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -17949,8 +17949,8 @@ void Unit::Kill(Unit* killer, Unit* victim, bool durabilityLoss, WeaponAttackTyp
// only if not player and not controlled by player pet. And not at BG
if ((durabilityLoss && !player && !plrVictim->InBattleground()) || (player && sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP)))
{
- LOG_DEBUG("entities.unit", "We are dead, losing {} percent durability", sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH));
- plrVictim->DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH), false);
+ LOG_DEBUG("entities.unit", "We are dead, losing {} percent durability", sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH) / 100.0f);
+ plrVictim->DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH) / 100.0f, false);
// durability lost message
plrVictim->SendDurabilityLoss();
}
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index ed2ed79ea3..940f0b2224 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -2826,6 +2826,30 @@ void ObjectMgr::LoadItemLocales()
LOG_INFO("server.loading", ">> Loaded {} Item Locale Strings in {} ms", (uint32)_itemLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
}
+ServerConfigs const qualityToBuyValueConfig[MAX_ITEM_QUALITY] =
+{
+ RATE_BUYVALUE_ITEM_POOR, // ITEM_QUALITY_POOR
+ RATE_BUYVALUE_ITEM_NORMAL, // ITEM_QUALITY_NORMAL
+ RATE_BUYVALUE_ITEM_UNCOMMON, // ITEM_QUALITY_UNCOMMON
+ RATE_BUYVALUE_ITEM_RARE, // ITEM_QUALITY_RARE
+ RATE_BUYVALUE_ITEM_EPIC, // ITEM_QUALITY_EPIC
+ RATE_BUYVALUE_ITEM_LEGENDARY, // ITEM_QUALITY_LEGENDARY
+ RATE_BUYVALUE_ITEM_ARTIFACT, // ITEM_QUALITY_ARTIFACT
+ RATE_BUYVALUE_ITEM_HEIRLOOM, // ITEM_QUALITY_HEIRLOOM
+};
+
+ServerConfigs const qualityToSellValueConfig[MAX_ITEM_QUALITY] =
+{
+ RATE_SELLVALUE_ITEM_POOR, // ITEM_QUALITY_POOR
+ RATE_SELLVALUE_ITEM_NORMAL, // ITEM_QUALITY_NORMAL
+ RATE_SELLVALUE_ITEM_UNCOMMON, // ITEM_QUALITY_UNCOMMON
+ RATE_SELLVALUE_ITEM_RARE, // ITEM_QUALITY_RARE
+ RATE_SELLVALUE_ITEM_EPIC, // ITEM_QUALITY_EPIC
+ RATE_SELLVALUE_ITEM_LEGENDARY, // ITEM_QUALITY_LEGENDARY
+ RATE_SELLVALUE_ITEM_ARTIFACT, // ITEM_QUALITY_ARTIFACT
+ RATE_SELLVALUE_ITEM_HEIRLOOM, // ITEM_QUALITY_HEIRLOOM
+};
+
void ObjectMgr::LoadItemTemplates()
{
uint32 oldMSTime = getMSTime();
@@ -2893,8 +2917,8 @@ void ObjectMgr::LoadItemTemplates()
itemTemplate.Flags = ItemFlags(fields[7].Get<uint32>());
itemTemplate.Flags2 = ItemFlags2(fields[8].Get<uint32>());
itemTemplate.BuyCount = uint32(fields[9].Get<uint8>());
- itemTemplate.BuyPrice = int32(fields[10].Get<int64>() * sWorld->getRate((Rates)(RATE_BUYVALUE_ITEM_POOR + itemTemplate.Quality)));
- itemTemplate.SellPrice = uint32(fields[11].Get<uint32>() * sWorld->getRate((Rates)(RATE_SELLVALUE_ITEM_POOR + itemTemplate.Quality)));
+ itemTemplate.BuyPrice = int32(fields[10].Get<int64>());
+ itemTemplate.SellPrice = uint32(fields[11].Get<uint32>());
itemTemplate.InventoryType = uint32(fields[12].Get<uint8>());
itemTemplate.AllowableClass = fields[13].Get<int32>();
itemTemplate.AllowableRace = fields[14].Get<int32>();
@@ -3376,6 +3400,10 @@ void ObjectMgr::LoadItemTemplates()
itemTemplate.FlagsCu = static_cast<ItemFlagsCustom>(static_cast<uint32>(itemTemplate.FlagsCu) & ~ITEM_FLAGS_CU_DURATION_REAL_TIME);
}
+ // Set after checks to ensure valid item quality
+ itemTemplate.BuyPrice *= sWorld->getRate(qualityToBuyValueConfig[itemTemplate.Quality]);
+ itemTemplate.SellPrice *= sWorld->getRate(qualityToSellValueConfig[itemTemplate.Quality]);
+
// Fill categories map
for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
if (itemTemplate.Spells[i].SpellId && itemTemplate.Spells[i].SpellCategory && itemTemplate.Spells[i].SpellCategoryCooldown)
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index 38dd5fb9e5..511a5b5d2a 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -883,8 +883,9 @@ void WorldSession::HandlePlayerLoginFromDB(LoginQueryHolder const& holder)
pCurrChar->SendCinematicStart(rEntry->CinematicSequence);
// send new char string if not empty
- if (!sWorld->GetNewCharString().empty())
- chH.PSendSysMessage("{}", sWorld->GetNewCharString());
+ std::string_view newCharString = sWorld->getStringConfig(CONFIG_NEW_CHAR_STRING);
+ if (!newCharString.empty())
+ chH.PSendSysMessage("{}", newCharString);
}
}
diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp
index 8997be8468..b5bcbea318 100644
--- a/src/server/game/Loot/LootMgr.cpp
+++ b/src/server/game/Loot/LootMgr.cpp
@@ -30,7 +30,7 @@
#include "Util.h"
#include "World.h"
-static Rates const qualityToRate[MAX_ITEM_QUALITY] =
+ServerConfigs const qualityToRate[] =
{
RATE_DROP_ITEM_POOR, // ITEM_QUALITY_POOR
RATE_DROP_ITEM_NORMAL, // ITEM_QUALITY_NORMAL
@@ -322,8 +322,9 @@ bool LootStoreItem::Roll(bool rate, Player const* player, Loot& loot, LootStore
return roll_chance_f(_chance * (rate ? sWorld->getRate(RATE_DROP_ITEM_REFERENCED) : 1.0f));
ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(itemid);
-
- float qualityModifier = pProto && rate ? sWorld->getRate(qualityToRate[pProto->Quality]) : 1.0f;
+ float qualityModifier = 1.0f;
+ if (pProto && pProto->Quality < ITEM_QUALITY_HEIRLOOM && rate)
+ qualityModifier = sWorld->getRate(qualityToRate[pProto->Quality]);
return roll_chance_f(_chance * qualityModifier);
}
diff --git a/src/server/game/Warden/WardenWin.cpp b/src/server/game/Warden/WardenWin.cpp
index 64895f93ea..520dd6d015 100644
--- a/src/server/game/Warden/WardenWin.cpp
+++ b/src/server/game/Warden/WardenWin.cpp
@@ -88,7 +88,7 @@ static uint16 GetCheckPacketSize(WardenCheck const* check)
}
// Returns config id for specific type id
-static WorldIntConfigs GetMaxWardenChecksForType(uint8 type)
+static ServerConfigs GetMaxWardenChecksForType(uint8 type)
{
// Should never be higher type than defined
ASSERT(type < MAX_WARDEN_CHECK_TYPES);
diff --git a/src/server/game/World/IWorld.h b/src/server/game/World/IWorld.h
index 08f892eab3..1ec85b71c4 100644
--- a/src/server/game/World/IWorld.h
+++ b/src/server/game/World/IWorld.h
@@ -23,6 +23,7 @@
#include "Duration.h"
#include "ObjectGuid.h"
#include "SharedDefines.h"
+#include "WorldConfig.h"
#include <unordered_map>
class WorldPacket;
@@ -58,479 +59,6 @@ enum ServerMessageType
SERVER_MSG_RESTART_CANCELLED = 5
};
-/// Configuration elements
-enum WorldBoolConfigs
-{
- CONFIG_DURABILITY_LOSS_IN_PVP = 0,
- CONFIG_ADDON_CHANNEL,
- CONFIG_ALLOW_PLAYER_COMMANDS,
- CONFIG_CLEAN_CHARACTER_DB,
- CONFIG_STATS_SAVE_ONLY_ON_LOGOUT,
- CONFIG_ALLOW_TWO_SIDE_ACCOUNTS,
- CONFIG_ALLOW_TWO_SIDE_INTERACTION_CALENDAR,
- CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT,
- CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL,
- CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP,
- CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD,
- CONFIG_ALLOW_TWO_SIDE_INTERACTION_ARENA,
- CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION,
- CONFIG_ALLOW_TWO_SIDE_INTERACTION_MAIL,
- CONFIG_ALLOW_TWO_SIDE_WHO_LIST,
- CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND,
- CONFIG_ALLOW_TWO_SIDE_TRADE,
- CONFIG_ALL_TAXI_PATHS,
- CONFIG_INSTANCE_IGNORE_LEVEL,
- CONFIG_INSTANCE_IGNORE_RAID,
- CONFIG_INSTANCE_GMSUMMON_PLAYER,
- CONFIG_INSTANCE_SHARED_ID,
- CONFIG_ALLOW_GM_GROUP,
- CONFIG_ALLOW_GM_FRIEND,
- CONFIG_GM_LOWER_SECURITY,
- CONFIG_SKILL_PROSPECTING,
- CONFIG_SKILL_MILLING,
- CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY,
- CONFIG_WEATHER,
- CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL,
- CONFIG_QUEST_IGNORE_RAID,
- CONFIG_DETECT_POS_COLLISION,
- CONFIG_RESTRICTED_LFG_CHANNEL,
- CONFIG_SILENTLY_GM_JOIN_TO_CHANNEL,
- CONFIG_TALENTS_INSPECTING,
- CONFIG_CHAT_FAKE_MESSAGE_PREVENTING,
- CONFIG_CHAT_MUTE_FIRST_LOGIN,
- CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP,
- CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE,
- CONFIG_DEATH_BONES_WORLD,
- CONFIG_DEATH_BONES_BG_OR_ARENA,
- CONFIG_DIE_COMMAND_MODE,
- CONFIG_DECLINED_NAMES_USED,
- CONFIG_BATTLEGROUND_DISABLE_QUEST_SHARE_IN_BG,
- CONFIG_BATTLEGROUND_DISABLE_READY_CHECK_IN_BG,
- CONFIG_BATTLEGROUND_CAST_DESERTER,
- CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE,
- CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY,
- CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_TIMED,
- CONFIG_BATTLEGROUND_STORE_STATISTICS_ENABLE,
- CONFIG_BATTLEGROUND_TRACK_DESERTERS,
- CONFIG_BG_XP_FOR_KILL,
- CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS,
- CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE,
- CONFIG_ARENA_QUEUE_ANNOUNCER_PLAYERONLY,
- CONFIG_OFFHAND_CHECK_AT_SPELL_UNLEARN,
- CONFIG_VMAP_INDOOR_CHECK,
- CONFIG_PET_LOS,
- CONFIG_START_CUSTOM_SPELLS,
- CONFIG_START_ALL_EXPLORED,
- CONFIG_START_ALL_REP,
- CONFIG_ALWAYS_MAXSKILL,
- CONFIG_PVP_TOKEN_ENABLE,
- CONFIG_NO_RESET_TALENT_COST,
- CONFIG_SHOW_KICK_IN_WORLD,
- CONFIG_SHOW_MUTE_IN_WORLD,
- CONFIG_SHOW_BAN_IN_WORLD,
- CONFIG_AUTOBROADCAST,
- CONFIG_ALLOW_TICKETS,
- CONFIG_DELETE_CHARACTER_TICKET_TRACE,
- CONFIG_LFG_CAST_DESERTER,
- CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES,
- CONFIG_PRESERVE_CUSTOM_CHANNELS,
- CONFIG_PDUMP_NO_PATHS,
- CONFIG_PDUMP_NO_OVERWRITE,
- CONFIG_ENABLE_MMAPS, // pussywizard
- CONFIG_ENABLE_LOGIN_AFTER_DC, // pussywizard
- CONFIG_DONT_CACHE_RANDOM_MOVEMENT_PATHS, // pussywizard
- CONFIG_QUEST_IGNORE_AUTO_ACCEPT,
- CONFIG_QUEST_IGNORE_AUTO_COMPLETE,
- CONFIG_QUEST_ENABLE_QUEST_TRACKER,
- CONFIG_WARDEN_ENABLED,
- CONFIG_ENABLE_CONTINENT_TRANSPORT,
- CONFIG_ENABLE_CONTINENT_TRANSPORT_PRELOADING,
- CONFIG_MINIGOB_MANABONK,
- CONFIG_IP_BASED_ACTION_LOGGING,
- CONFIG_CALCULATE_CREATURE_ZONE_AREA_DATA,
- CONFIG_CALCULATE_GAMEOBJECT_ZONE_AREA_DATA,
- CONFIG_CHECK_GOBJECT_LOS,
- CONFIG_CLOSE_IDLE_CONNECTIONS,
- CONFIG_LFG_LOCATION_ALL, // Player can join LFG anywhere
- CONFIG_PRELOAD_ALL_NON_INSTANCED_MAP_GRIDS,
- CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE,
- CONFIG_ITEMDELETE_METHOD,
- CONFIG_ITEMDELETE_VENDOR,
- CONFIG_SET_ALL_CREATURES_WITH_WAYPOINT_MOVEMENT_ACTIVE,
- CONFIG_DEBUG_BATTLEGROUND,
- CONFIG_DEBUG_ARENA,
- CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PORTAL_CHECK_ILVL,
- CONFIG_DUNGEON_ACCESS_REQUIREMENTS_LFG_DBC_LEVEL_OVERRIDE,
- CONFIG_REGEN_HP_CANNOT_REACH_TARGET_IN_RAID,
- CONFIG_SET_BOP_ITEM_TRADEABLE,
- CONFIG_ALLOW_LOGGING_IP_ADDRESSES_IN_DATABASE,
- CONFIG_REALM_LOGIN_ENABLED,
- CONFIG_PLAYER_SETTINGS_ENABLED,
- CONFIG_ALLOW_JOIN_BG_AND_LFG,
- CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS,
- CONFIG_LEAVE_GROUP_ON_LOGOUT,
- CONFIG_QUEST_POI_ENABLED,
- CONFIG_VMAP_BLIZZLIKE_PVP_LOS,
- CONFIG_VMAP_BLIZZLIKE_LOS_OPEN_WORLD,
- CONFIG_OBJECT_SPARKLES,
- CONFIG_LOW_LEVEL_REGEN_BOOST,
- CONFIG_OBJECT_QUEST_MARKERS,
- CONFIG_STRICT_NAMES_RESERVED,
- CONFIG_STRICT_NAMES_PROFANITY,
- CONFIG_ALLOWS_RANK_MOD_FOR_PET_HEALTH,
- CONFIG_MUNCHING_BLIZZLIKE,
- CONFIG_ENABLE_DAZE,
- CONFIG_SPELL_QUEUE_ENABLED,
- BOOL_CONFIG_VALUE_COUNT
-};
-
-enum WorldFloatConfigs
-{
- CONFIG_GROUP_XP_DISTANCE = 0,
- CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE,
- CONFIG_SIGHT_MONSTER,
- CONFIG_LISTEN_RANGE_SAY,
- CONFIG_LISTEN_RANGE_TEXTEMOTE,
- CONFIG_LISTEN_RANGE_YELL,
- CONFIG_CREATURE_LEASH_RADIUS,
- CONFIG_CREATURE_FAMILY_FLEE_ASSISTANCE_RADIUS,
- CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS,
- CONFIG_CHANCE_OF_GM_SURVEY,
- CONFIG_ARENA_WIN_RATING_MODIFIER_1,
- CONFIG_ARENA_WIN_RATING_MODIFIER_2,
- CONFIG_ARENA_LOSE_RATING_MODIFIER,
- CONFIG_ARENA_MATCHMAKER_RATING_MODIFIER,
- CONFIG_RESPAWN_DYNAMICRATE_GAMEOBJECT,
- CONFIG_RESPAWN_DYNAMICRATE_CREATURE,
- FLOAT_CONFIG_VALUE_COUNT
-};
-
-enum WorldIntConfigs
-{
- CONFIG_COMPRESSION = 0,
- CONFIG_INTERVAL_MAPUPDATE,
- CONFIG_INTERVAL_CHANGEWEATHER,
- CONFIG_INTERVAL_DISCONNECT_TOLERANCE,
- CONFIG_INTERVAL_SAVE,
- CONFIG_PORT_WORLD,
- CONFIG_SOCKET_TIMEOUTTIME,
- CONFIG_SESSION_ADD_DELAY,
- CONFIG_GAME_TYPE,
- CONFIG_REALM_ZONE,
- CONFIG_STRICT_PLAYER_NAMES,
- CONFIG_STRICT_CHARTER_NAMES,
- CONFIG_STRICT_CHANNEL_NAMES,
- CONFIG_STRICT_PET_NAMES,
- CONFIG_MIN_PLAYER_NAME,
- CONFIG_MIN_CHARTER_NAME,
- CONFIG_MIN_PET_NAME,
- CONFIG_CHARACTER_CREATING_DISABLED,
- CONFIG_CHARACTER_CREATING_DISABLED_RACEMASK,
- CONFIG_CHARACTER_CREATING_DISABLED_CLASSMASK,
- CONFIG_CHARACTERS_PER_ACCOUNT,
- CONFIG_CHARACTERS_PER_REALM,
- CONFIG_CREATURE_STOP_FOR_PLAYER,
- CONFIG_HEROIC_CHARACTERS_PER_REALM,
- CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_HEROIC_CHARACTER,
- CONFIG_SKIP_CINEMATICS,
- CONFIG_MAX_PLAYER_LEVEL,
- CONFIG_MIN_DUALSPEC_LEVEL,
- CONFIG_START_PLAYER_LEVEL,
- CONFIG_START_HEROIC_PLAYER_LEVEL,
- CONFIG_START_PLAYER_MONEY,
- CONFIG_START_HEROIC_PLAYER_MONEY,
- CONFIG_MAX_HONOR_POINTS,
- CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT,
- CONFIG_START_HONOR_POINTS,
- CONFIG_MAX_ARENA_POINTS,
- CONFIG_START_ARENA_POINTS,
- CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL,
- CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE,
- CONFIG_INSTANCE_RESET_TIME_HOUR,
- CONFIG_INSTANCE_RESET_TIME_RELATIVE_TIMESTAMP,
- CONFIG_INSTANCE_UNLOAD_DELAY,
- CONFIG_MAX_PRIMARY_TRADE_SKILL,
- CONFIG_MIN_PETITION_SIGNS,
- CONFIG_GM_LOGIN_STATE,
- CONFIG_GM_VISIBLE_STATE,
- CONFIG_GM_ACCEPT_TICKETS,
- CONFIG_GM_CHAT,
- CONFIG_GM_WHISPERING_TO,
- CONFIG_GM_LEVEL_IN_GM_LIST,
- CONFIG_GM_LEVEL_IN_WHO_LIST,
- CONFIG_START_GM_LEVEL,
- CONFIG_GROUP_VISIBILITY,
- CONFIG_MAIL_DELIVERY_DELAY,
- CONFIG_UPTIME_UPDATE,
- CONFIG_SKILL_CHANCE_ORANGE,
- CONFIG_SKILL_CHANCE_YELLOW,
- CONFIG_SKILL_CHANCE_GREEN,
- CONFIG_SKILL_CHANCE_GREY,
- CONFIG_SKILL_CHANCE_MINING_STEPS,
- CONFIG_SKILL_CHANCE_SKINNING_STEPS,
- CONFIG_SKILL_GAIN_CRAFTING,
- CONFIG_SKILL_GAIN_DEFENSE,
- CONFIG_SKILL_GAIN_GATHERING,
- CONFIG_SKILL_GAIN_WEAPON,
- CONFIG_MAX_OVERSPEED_PINGS,
- CONFIG_EXPANSION,
- CONFIG_CHATFLOOD_MESSAGE_COUNT,
- CONFIG_CHATFLOOD_MESSAGE_DELAY,
- CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT,
- CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY,
- CONFIG_CHATFLOOD_MUTE_TIME,
- CONFIG_EVENT_ANNOUNCE,
- CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY,
- CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD,
- CONFIG_CREATURE_FAMILY_FLEE_DELAY,
- CONFIG_WORLD_BOSS_LEVEL_DIFF,
- CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF,
- CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF,
- CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY,
- CONFIG_CHAT_STRICT_LINK_CHECKING_KICK,
- CONFIG_CHAT_CHANNEL_LEVEL_REQ,
- CONFIG_CHAT_WHISPER_LEVEL_REQ,
- CONFIG_CHAT_SAY_LEVEL_REQ,
- CONFIG_PARTY_LEVEL_REQ,
- CONFIG_CHAT_TIME_MUTE_FIRST_LOGIN,
- CONFIG_TRADE_LEVEL_REQ,
- CONFIG_TICKET_LEVEL_REQ,
- CONFIG_AUCTION_LEVEL_REQ,
- CONFIG_MAIL_LEVEL_REQ,
- CONFIG_CORPSE_DECAY_NORMAL,
- CONFIG_CORPSE_DECAY_RARE,
- CONFIG_CORPSE_DECAY_ELITE,
- CONFIG_CORPSE_DECAY_RAREELITE,
- CONFIG_CORPSE_DECAY_WORLDBOSS,
- CONFIG_DEATH_SICKNESS_LEVEL,
- CONFIG_INSTANT_LOGOUT,
- CONFIG_DISABLE_BREATHING,
- CONFIG_BATTLEGROUND_OVERRIDE_LOWLEVELS_MINPLAYERS,
- CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_SPAM_DELAY,
- CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_TIMER,
- CONFIG_BATTLEGROUND_PREMATURE_FINISH_TIMER,
- CONFIG_BATTLEGROUND_PREMADE_GROUP_WAIT_FOR_MATCH,
- CONFIG_BATTLEGROUND_REPORT_AFK_TIMER,
- CONFIG_BATTLEGROUND_REPORT_AFK,
- CONFIG_BATTLEGROUND_INVITATION_TYPE,
- CONFIG_BATTLEGROUND_PLAYER_RESPAWN,
- CONFIG_BATTLEGROUND_RESTORATION_BUFF_RESPAWN,
- CONFIG_BATTLEGROUND_BERSERKING_BUFF_RESPAWN,
- CONFIG_BATTLEGROUND_SPEED_BUFF_RESPAWN,
- CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_LIMIT_MIN_LEVEL,
- CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_LIMIT_MIN_PLAYERS,
- CONFIG_BATTLEGROUND_WARSONG_FLAGS,
- CONFIG_BATTLEGROUND_ARATHI_CAPTUREPOINTS,
- CONFIG_BATTLEGROUND_ALTERAC_REINFORCEMENTS,
- CONFIG_BATTLEGROUND_ALTERAC_REP_ONBOSSDEATH,
- CONFIG_BATTLEGROUND_EYEOFTHESTORM_CAPTUREPOINTS,
- CONFIG_WINTERGRASP_ENABLE,
- CONFIG_ARENA_MAX_RATING_DIFFERENCE,
- CONFIG_ARENA_RATING_DISCARD_TIMER,
- CONFIG_ARENA_PREV_OPPONENTS_DISCARD_TIMER,
- CONFIG_ARENA_AUTO_DISTRIBUTE_INTERVAL_DAYS,
- CONFIG_ARENA_GAMES_REQUIRED,
- CONFIG_ARENA_START_RATING,
- CONFIG_LEGACY_ARENA_POINTS_CALC,
- CONFIG_ARENA_START_PERSONAL_RATING,
- CONFIG_ARENA_START_MATCHMAKER_RATING,
- CONFIG_ARENA_QUEUE_ANNOUNCER_DETAIL,
- CONFIG_HONOR_AFTER_DUEL,
- CONFIG_PVP_TOKEN_MAP_TYPE,
- CONFIG_PVP_TOKEN_ID,
- CONFIG_PVP_TOKEN_COUNT,
- CONFIG_ENABLE_SINFO_LOGIN,
- CONFIG_PLAYER_ALLOW_COMMANDS,
- CONFIG_NUMTHREADS,
- CONFIG_LOGDB_CLEARINTERVAL,
- CONFIG_LOGDB_CLEARTIME,
- CONFIG_TELEPORT_TIMEOUT_NEAR, // pussywizard
- CONFIG_TELEPORT_TIMEOUT_FAR, // pussywizard
- CONFIG_MAX_ALLOWED_MMR_DROP, // pussywizard
- CONFIG_CLIENTCACHE_VERSION,
- CONFIG_GUILD_EVENT_LOG_COUNT,
- CONFIG_GUILD_BANK_EVENT_LOG_COUNT,
- CONFIG_MIN_LEVEL_STAT_SAVE,
- CONFIG_RANDOM_BG_RESET_HOUR,
- CONFIG_CALENDAR_DELETE_OLD_EVENTS_HOUR,
- CONFIG_GUILD_RESET_HOUR,
- CONFIG_CHARDELETE_KEEP_DAYS,
- CONFIG_CHARDELETE_METHOD,
- CONFIG_CHARDELETE_MIN_LEVEL,
- CONFIG_AUTOBROADCAST_CENTER,
- CONFIG_AUTOBROADCAST_INTERVAL,
- CONFIG_AUTOBROADCAST_MIN_LEVEL_DISABLE,
- CONFIG_MAX_RESULTS_LOOKUP_COMMANDS,
- CONFIG_DB_PING_INTERVAL,
- CONFIG_PRESERVE_CUSTOM_CHANNEL_DURATION,
- CONFIG_PERSISTENT_CHARACTER_CLEAN_FLAGS,
- CONFIG_LFG_OPTIONSMASK,
- CONFIG_MAX_INSTANCES_PER_HOUR,
- CONFIG_WINTERGRASP_PLR_MAX,
- CONFIG_WINTERGRASP_PLR_MIN,
- CONFIG_WINTERGRASP_PLR_MIN_LVL,
- CONFIG_WINTERGRASP_BATTLETIME,
- CONFIG_WINTERGRASP_NOBATTLETIME,
- CONFIG_WINTERGRASP_RESTART_AFTER_CRASH,
- CONFIG_PACKET_SPOOF_BANMODE,
- CONFIG_PACKET_SPOOF_BANDURATION,
- CONFIG_WARDEN_CLIENT_RESPONSE_DELAY,
- CONFIG_WARDEN_CLIENT_CHECK_HOLDOFF,
- CONFIG_WARDEN_CLIENT_FAIL_ACTION,
- CONFIG_WARDEN_CLIENT_BAN_DURATION,
- CONFIG_WARDEN_NUM_MEM_CHECKS,
- CONFIG_WARDEN_NUM_LUA_CHECKS,
- CONFIG_WARDEN_NUM_OTHER_CHECKS,
- CONFIG_BIRTHDAY_TIME,
- CONFIG_SOCKET_TIMEOUTTIME_ACTIVE,
- CONFIG_INSTANT_TAXI,
- CONFIG_AFK_PREVENT_LOGOUT,
- CONFIG_ICC_BUFF_HORDE,
- CONFIG_ICC_BUFF_ALLIANCE,
- CONFIG_ITEMDELETE_QUALITY,
- CONFIG_ITEMDELETE_ITEM_LEVEL,
- CONFIG_ITEMDELETE_KEEP_DAYS,
- CONFIG_BG_REWARD_WINNER_HONOR_FIRST,
- CONFIG_BG_REWARD_WINNER_ARENA_FIRST,
- CONFIG_BG_REWARD_WINNER_HONOR_LAST,
- CONFIG_BG_REWARD_WINNER_ARENA_LAST,
- CONFIG_BG_REWARD_LOSER_HONOR_FIRST,
- CONFIG_BG_REWARD_LOSER_HONOR_LAST,
- CONFIG_CHARTER_COST_GUILD,
- CONFIG_CHARTER_COST_ARENA_2v2,
- CONFIG_CHARTER_COST_ARENA_3v3,
- CONFIG_CHARTER_COST_ARENA_5v5,
- CONFIG_MAX_WHO_LIST_RETURN,
- CONFIG_WAYPOINT_MOVEMENT_STOP_TIME_FOR_PLAYER,
- CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE,
- CONFIG_DUNGEON_ACCESS_REQUIREMENTS_OPTIONAL_STRING_ID,
- CONFIG_GUILD_BANK_INITIAL_TABS,
- CONFIG_GUILD_BANK_TAB_COST_0,
- CONFIG_GUILD_BANK_TAB_COST_1,
- CONFIG_GUILD_BANK_TAB_COST_2,
- CONFIG_GUILD_BANK_TAB_COST_3,
- CONFIG_GUILD_BANK_TAB_COST_4,
- CONFIG_GUILD_BANK_TAB_COST_5,
- CONFIG_GUILD_MEMBER_LIMIT,
- CONFIG_GM_LEVEL_CHANNEL_MODERATION,
- CONFIG_TOGGLE_XP_COST,
- CONFIG_NPC_EVADE_IF_NOT_REACHABLE,
- CONFIG_NPC_REGEN_TIME_IF_NOT_REACHABLE_IN_RAID,
- CONFIG_FFA_PVP_TIMER,
- CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION,
- CONFIG_LFG_MAX_KICK_COUNT,
- CONFIG_LFG_KICK_PREVENTION_TIMER,
- CONFIG_CHANGE_FACTION_MAX_MONEY,
- CONFIG_WATER_BREATH_TIMER,
- CONFIG_DAILY_RBG_MIN_LEVEL_AP_REWARD,
- CONFIG_AUCTIONHOUSE_WORKERTHREADS,
- CONFIG_SPELL_QUEUE_WINDOW,
- CONFIG_SUNSREACH_COUNTER_MAX,
- CONFIG_RESPAWN_DYNAMICMINIMUM_GAMEOBJECT,
- CONFIG_RESPAWN_DYNAMICMINIMUM_CREATURE,
- INT_CONFIG_VALUE_COUNT
-};
-
-/// Server rates
-enum Rates
-{
- RATE_HEALTH = 0,
- RATE_POWER_MANA,
- RATE_POWER_RAGE_INCOME,
- RATE_POWER_RAGE_LOSS,
- RATE_POWER_RUNICPOWER_INCOME,
- RATE_POWER_RUNICPOWER_LOSS,
- RATE_POWER_FOCUS,
- RATE_POWER_ENERGY,
- RATE_SKILL_DISCOVERY,
- RATE_DROP_ITEM_POOR,
- RATE_DROP_ITEM_NORMAL,
- RATE_DROP_ITEM_UNCOMMON,
- RATE_DROP_ITEM_RARE,
- RATE_DROP_ITEM_EPIC,
- RATE_DROP_ITEM_LEGENDARY,
- RATE_DROP_ITEM_ARTIFACT,
- RATE_DROP_ITEM_REFERENCED,
- RATE_DROP_ITEM_REFERENCED_AMOUNT,
- RATE_DROP_ITEM_GROUP_AMOUNT,
- RATE_SELLVALUE_ITEM_POOR,
- RATE_SELLVALUE_ITEM_NORMAL,
- RATE_SELLVALUE_ITEM_UNCOMMON,
- RATE_SELLVALUE_ITEM_RARE,
- RATE_SELLVALUE_ITEM_EPIC,
- RATE_SELLVALUE_ITEM_LEGENDARY,
- RATE_SELLVALUE_ITEM_ARTIFACT,
- RATE_SELLVALUE_ITEM_HEIRLOOM,
- RATE_BUYVALUE_ITEM_POOR,
- RATE_BUYVALUE_ITEM_NORMAL,
- RATE_BUYVALUE_ITEM_UNCOMMON,
- RATE_BUYVALUE_ITEM_RARE,
- RATE_BUYVALUE_ITEM_EPIC,
- RATE_BUYVALUE_ITEM_LEGENDARY,
- RATE_BUYVALUE_ITEM_ARTIFACT,
- RATE_BUYVALUE_ITEM_HEIRLOOM,
- RATE_DROP_MONEY,
- RATE_REWARD_QUEST_MONEY,
- RATE_REWARD_BONUS_MONEY,
- RATE_XP_KILL,
- RATE_XP_BG_KILL_AV,
- RATE_XP_BG_KILL_WSG,
- RATE_XP_BG_KILL_AB,
- RATE_XP_BG_KILL_EOTS,
- RATE_XP_BG_KILL_SOTA,
- RATE_XP_BG_KILL_IC,
- RATE_XP_QUEST,
- RATE_XP_QUEST_DF,
- RATE_XP_EXPLORE,
- RATE_XP_PET,
- RATE_XP_PET_NEXT_LEVEL,
- RATE_REPAIRCOST,
- RATE_REPUTATION_GAIN,
- RATE_REPUTATION_LOWLEVEL_KILL,
- RATE_REPUTATION_LOWLEVEL_QUEST,
- RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS,
- RATE_CREATURE_NORMAL_HP,
- RATE_CREATURE_ELITE_ELITE_HP,
- RATE_CREATURE_ELITE_RAREELITE_HP,
- RATE_CREATURE_ELITE_WORLDBOSS_HP,
- RATE_CREATURE_ELITE_RARE_HP,
- RATE_CREATURE_NORMAL_DAMAGE,
- RATE_CREATURE_ELITE_ELITE_DAMAGE,
- RATE_CREATURE_ELITE_RAREELITE_DAMAGE,
- RATE_CREATURE_ELITE_WORLDBOSS_DAMAGE,
- RATE_CREATURE_ELITE_RARE_DAMAGE,
- RATE_CREATURE_NORMAL_SPELLDAMAGE,
- RATE_CREATURE_ELITE_ELITE_SPELLDAMAGE,
- RATE_CREATURE_ELITE_RAREELITE_SPELLDAMAGE,
- RATE_CREATURE_ELITE_WORLDBOSS_SPELLDAMAGE,
- RATE_CREATURE_ELITE_RARE_SPELLDAMAGE,
- RATE_CREATURE_AGGRO,
- RATE_REST_INGAME,
- RATE_REST_OFFLINE_IN_TAVERN_OR_CITY,
- RATE_REST_OFFLINE_IN_WILDERNESS,
- RATE_REST_MAX_BONUS,
- RATE_DAMAGE_FALL,
- RATE_AUCTION_TIME,
- RATE_AUCTION_DEPOSIT,
- RATE_AUCTION_CUT,
- RATE_HONOR,
- RATE_ARENA_POINTS,
- RATE_TALENT,
- RATE_TALENT_PET,
- RATE_CORPSE_DECAY_LOOTED,
- RATE_INSTANCE_RESET_TIME,
- RATE_DURABILITY_LOSS_ON_DEATH,
- RATE_DURABILITY_LOSS_DAMAGE,
- RATE_DURABILITY_LOSS_PARRY,
- RATE_DURABILITY_LOSS_ABSORB,
- RATE_DURABILITY_LOSS_BLOCK,
- RATE_MOVESPEED_PLAYER,
- RATE_MOVESPEED_NPC,
- RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE,
- RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER,
- MAX_RATES
-};
-
class IWorld
{
public:
@@ -542,8 +70,6 @@ public:
virtual void LoadDBAllowedSecurityLevel() = 0;
[[nodiscard]] virtual bool getAllowMovement() const = 0;
virtual void SetAllowMovement(bool allow) = 0;
- virtual void SetNewCharString(std::string const& str) = 0;
- [[nodiscard]] virtual std::string const& GetNewCharString() const = 0;
[[nodiscard]] virtual LocaleConstant GetDefaultDbcLocale() const = 0;
[[nodiscard]] virtual std::string const& GetDataPath() const = 0;
[[nodiscard]] virtual Seconds GetNextDailyQuestsResetTime() const = 0;
@@ -558,14 +84,16 @@ public:
virtual void ShutdownCancel() = 0;
virtual void ShutdownMsg(bool show = false, Player* player = nullptr, const std::string& reason = std::string()) = 0;
virtual void Update(uint32 diff) = 0;
- virtual void setRate(Rates rate, float value) = 0;
- [[nodiscard]] virtual float getRate(Rates rate) const = 0;
- virtual void setBoolConfig(WorldBoolConfigs index, bool value) = 0;
- [[nodiscard]] virtual bool getBoolConfig(WorldBoolConfigs index) const = 0;
- virtual void setFloatConfig(WorldFloatConfigs index, float value) = 0;
- [[nodiscard]] virtual float getFloatConfig(WorldFloatConfigs index) const = 0;
- virtual void setIntConfig(WorldIntConfigs index, uint32 value) = 0;
- [[nodiscard]] virtual uint32 getIntConfig(WorldIntConfigs index) const = 0;
+ virtual void setRate(ServerConfigs index, float value) = 0;
+ [[nodiscard]] virtual float getRate(ServerConfigs index) const = 0;
+ virtual void setBoolConfig(ServerConfigs index, bool value) = 0;
+ [[nodiscard]] virtual bool getBoolConfig(ServerConfigs index) const = 0;
+ virtual void setFloatConfig(ServerConfigs index, float value) = 0;
+ [[nodiscard]] virtual float getFloatConfig(ServerConfigs index) const = 0;
+ virtual void setIntConfig(ServerConfigs index, uint32 value) = 0;
+ [[nodiscard]] virtual uint32 getIntConfig(ServerConfigs index) const = 0;
+ virtual void setStringConfig(ServerConfigs index, std::string const& value) = 0;
+ virtual std::string_view getStringConfig(ServerConfigs index) const = 0;
[[nodiscard]] virtual bool IsPvPRealm() const = 0;
[[nodiscard]] virtual bool IsFFAPvPRealm() const = 0;
virtual uint32 GetNextWhoListUpdateDelaySecs() = 0;
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 00ffbf428b..0ef09fdf2e 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -127,11 +127,7 @@ World::World()
_mail_expire_check_timer = 0s;
_isClosed = false;
_cleaningFlags = 0;
-
- memset(_rate_values, 0, sizeof(_rate_values));
- memset(_int_configs, 0, sizeof(_int_configs));
- memset(_bool_configs, 0, sizeof(_bool_configs));
- memset(_float_configs, 0, sizeof(_float_configs));
+ _dbClientCacheVersion = 0;
}
/// World destructor
@@ -191,802 +187,34 @@ void World::LoadConfigSettings(bool reload)
if (!reload)
sWorldSessionMgr->SetPlayerAmountLimit(sConfigMgr->GetOption<int32>("PlayerLimit", 1000));
- ///- Read ticket system setting from the config file
- _bool_configs[CONFIG_ALLOW_TICKETS] = sConfigMgr->GetOption<bool>("AllowTickets", true);
- _bool_configs[CONFIG_DELETE_CHARACTER_TICKET_TRACE] = sConfigMgr->GetOption<bool>("DeletedCharacterTicketTrace", false);
-
- ///- Get string for new logins (newly created characters)
- SetNewCharString(sConfigMgr->GetOption<std::string>("PlayerStart.String", ""));
-
- ///- Send server info on login?
- _int_configs[CONFIG_ENABLE_SINFO_LOGIN] = sConfigMgr->GetOption<int32>("Server.LoginInfo", 0);
-
- ///- Read all rates from the config file
- _rate_values[RATE_HEALTH] = sConfigMgr->GetOption<float>("Rate.Health", 1);
- if (_rate_values[RATE_HEALTH] < 0)
- {
- LOG_ERROR("server.loading", "Rate.Health ({}) must be > 0. Using 1 instead.", _rate_values[RATE_HEALTH]);
- _rate_values[RATE_HEALTH] = 1;
- }
- _rate_values[RATE_POWER_MANA] = sConfigMgr->GetOption<float>("Rate.Mana", 1);
- if (_rate_values[RATE_POWER_MANA] < 0)
- {
- LOG_ERROR("server.loading", "Rate.Mana ({}) must be > 0. Using 1 instead.", _rate_values[RATE_POWER_MANA]);
- _rate_values[RATE_POWER_MANA] = 1;
- }
- _rate_values[RATE_POWER_RAGE_INCOME] = sConfigMgr->GetOption<float>("Rate.Rage.Income", 1);
- _rate_values[RATE_POWER_RAGE_LOSS] = sConfigMgr->GetOption<float>("Rate.Rage.Loss", 1);
- if (_rate_values[RATE_POWER_RAGE_LOSS] < 0)
- {
- LOG_ERROR("server.loading", "Rate.Rage.Loss ({}) must be > 0. Using 1 instead.", _rate_values[RATE_POWER_RAGE_LOSS]);
- _rate_values[RATE_POWER_RAGE_LOSS] = 1;
- }
- _rate_values[RATE_POWER_RUNICPOWER_INCOME] = sConfigMgr->GetOption<float>("Rate.RunicPower.Income", 1);
- _rate_values[RATE_POWER_RUNICPOWER_LOSS] = sConfigMgr->GetOption<float>("Rate.RunicPower.Loss", 1);
- if (_rate_values[RATE_POWER_RUNICPOWER_LOSS] < 0)
- {
- LOG_ERROR("server.loading", "Rate.RunicPower.Loss ({}) must be > 0. Using 1 instead.", _rate_values[RATE_POWER_RUNICPOWER_LOSS]);
- _rate_values[RATE_POWER_RUNICPOWER_LOSS] = 1;
- }
- _rate_values[RATE_POWER_FOCUS] = sConfigMgr->GetOption<float>("Rate.Focus", 1.0f);
- _rate_values[RATE_POWER_ENERGY] = sConfigMgr->GetOption<float>("Rate.Energy", 1.0f);
-
- _rate_values[RATE_SKILL_DISCOVERY] = sConfigMgr->GetOption<float>("Rate.Skill.Discovery", 1.0f);
-
- _rate_values[RATE_DROP_ITEM_POOR] = sConfigMgr->GetOption<float>("Rate.Drop.Item.Poor", 1.0f);
- _rate_values[RATE_DROP_ITEM_NORMAL] = sConfigMgr->GetOption<float>("Rate.Drop.Item.Normal", 1.0f);
- _rate_values[RATE_DROP_ITEM_UNCOMMON] = sConfigMgr->GetOption<float>("Rate.Drop.Item.Uncommon", 1.0f);
- _rate_values[RATE_DROP_ITEM_RARE] = sConfigMgr->GetOption<float>("Rate.Drop.Item.Rare", 1.0f);
- _rate_values[RATE_DROP_ITEM_EPIC] = sConfigMgr->GetOption<float>("Rate.Drop.Item.Epic", 1.0f);
- _rate_values[RATE_DROP_ITEM_LEGENDARY] = sConfigMgr->GetOption<float>("Rate.Drop.Item.Legendary", 1.0f);
- _rate_values[RATE_DROP_ITEM_ARTIFACT] = sConfigMgr->GetOption<float>("Rate.Drop.Item.Artifact", 1.0f);
- _rate_values[RATE_DROP_ITEM_REFERENCED] = sConfigMgr->GetOption<float>("Rate.Drop.Item.Referenced", 1.0f);
- _rate_values[RATE_DROP_ITEM_REFERENCED_AMOUNT] = sConfigMgr->GetOption<float>("Rate.Drop.Item.ReferencedAmount", 1.0f);
- _rate_values[RATE_DROP_ITEM_GROUP_AMOUNT] = sConfigMgr->GetOption<float>("Rate.Drop.Item.GroupAmount", 1.0f);
- _rate_values[RATE_DROP_MONEY] = sConfigMgr->GetOption<float>("Rate.Drop.Money", 1.0f);
-
- _rate_values[RATE_REWARD_QUEST_MONEY] = sConfigMgr->GetOption<float>("Rate.RewardQuestMoney", 1.0f);
- _rate_values[RATE_REWARD_BONUS_MONEY] = sConfigMgr->GetOption<float>("Rate.RewardBonusMoney", 1.0f);
- _rate_values[RATE_XP_KILL] = sConfigMgr->GetOption<float>("Rate.XP.Kill", 1.0f);
- _rate_values[RATE_XP_BG_KILL_AV] = sConfigMgr->GetOption<float>("Rate.XP.BattlegroundKillAV", 1.0f);
- _rate_values[RATE_XP_BG_KILL_WSG] = sConfigMgr->GetOption<float>("Rate.XP.BattlegroundKillWSG", 1.0f);
- _rate_values[RATE_XP_BG_KILL_AB] = sConfigMgr->GetOption<float>("Rate.XP.BattlegroundKillAB", 1.0f);
- _rate_values[RATE_XP_BG_KILL_EOTS] = sConfigMgr->GetOption<float>("Rate.XP.BattlegroundKillEOTS", 1.0f);
- _rate_values[RATE_XP_BG_KILL_SOTA] = sConfigMgr->GetOption<float>("Rate.XP.BattlegroundKillSOTA", 1.0f);
- _rate_values[RATE_XP_BG_KILL_IC] = sConfigMgr->GetOption<float>("Rate.XP.BattlegroundKillIC", 1.0f);
- _rate_values[RATE_XP_QUEST] = sConfigMgr->GetOption<float>("Rate.XP.Quest", 1.0f);
- _rate_values[RATE_XP_QUEST_DF] = sConfigMgr->GetOption<float>("Rate.XP.Quest.DF", 1.0f);
- _rate_values[RATE_XP_EXPLORE] = sConfigMgr->GetOption<float>("Rate.XP.Explore", 1.0f);
- _rate_values[RATE_XP_PET] = sConfigMgr->GetOption<float>("Rate.XP.Pet", 1.0f);
- _rate_values[RATE_XP_PET_NEXT_LEVEL] = sConfigMgr->GetOption<float>("Rate.Pet.LevelXP", 0.05f);
- _rate_values[RATE_REPAIRCOST] = sConfigMgr->GetOption<float>("Rate.RepairCost", 1.0f);
-
- _rate_values[RATE_SELLVALUE_ITEM_POOR] = sConfigMgr->GetOption<float>("Rate.SellValue.Item.Poor", 1.0f);
- _rate_values[RATE_SELLVALUE_ITEM_NORMAL] = sConfigMgr->GetOption<float>("Rate.SellValue.Item.Normal", 1.0f);
- _rate_values[RATE_SELLVALUE_ITEM_UNCOMMON] = sConfigMgr->GetOption<float>("Rate.SellValue.Item.Uncommon", 1.0f);
- _rate_values[RATE_SELLVALUE_ITEM_RARE] = sConfigMgr->GetOption<float>("Rate.SellValue.Item.Rare", 1.0f);
- _rate_values[RATE_SELLVALUE_ITEM_EPIC] = sConfigMgr->GetOption<float>("Rate.SellValue.Item.Epic", 1.0f);
- _rate_values[RATE_SELLVALUE_ITEM_LEGENDARY] = sConfigMgr->GetOption<float>("Rate.SellValue.Item.Legendary", 1.0f);
- _rate_values[RATE_SELLVALUE_ITEM_ARTIFACT] = sConfigMgr->GetOption<float>("Rate.SellValue.Item.Artifact", 1.0f);
- _rate_values[RATE_SELLVALUE_ITEM_HEIRLOOM] = sConfigMgr->GetOption<float>("Rate.SellValue.Item.Heirloom", 1.0f);
-
- _rate_values[ RATE_BUYVALUE_ITEM_POOR] = sConfigMgr->GetOption<float>("Rate.BuyValue.Item.Poor", 1.0f);
- _rate_values[ RATE_BUYVALUE_ITEM_NORMAL] = sConfigMgr->GetOption<float>("Rate.BuyValue.Item.Normal", 1.0f);
- _rate_values[ RATE_BUYVALUE_ITEM_UNCOMMON] = sConfigMgr->GetOption<float>("Rate.BuyValue.Item.Uncommon", 1.0f);
- _rate_values[ RATE_BUYVALUE_ITEM_RARE] = sConfigMgr->GetOption<float>("Rate.BuyValue.Item.Rare", 1.0f);
- _rate_values[ RATE_BUYVALUE_ITEM_EPIC] = sConfigMgr->GetOption<float>("Rate.BuyValue.Item.Epic", 1.0f);
- _rate_values[ RATE_BUYVALUE_ITEM_LEGENDARY] = sConfigMgr->GetOption<float>("Rate.BuyValue.Item.Legendary", 1.0f);
- _rate_values[RATE_BUYVALUE_ITEM_ARTIFACT] = sConfigMgr->GetOption<float>("Rate.BuyValue.Item.Artifact", 1.0f);
- _rate_values[RATE_BUYVALUE_ITEM_HEIRLOOM] = sConfigMgr->GetOption<float>("Rate.BuyValue.Item.Heirloom", 1.0f);
-
- if (_rate_values[RATE_REPAIRCOST] < 0.0f)
- {
- LOG_ERROR("server.loading", "Rate.RepairCost ({}) must be >=0. Using 0.0 instead.", _rate_values[RATE_REPAIRCOST]);
- _rate_values[RATE_REPAIRCOST] = 0.0f;
- }
- _rate_values[RATE_REPUTATION_GAIN] = sConfigMgr->GetOption<float>("Rate.Reputation.Gain", 1.0f);
- _rate_values[RATE_REPUTATION_LOWLEVEL_KILL] = sConfigMgr->GetOption<float>("Rate.Reputation.LowLevel.Kill", 1.0f);
- _rate_values[RATE_REPUTATION_LOWLEVEL_QUEST] = sConfigMgr->GetOption<float>("Rate.Reputation.LowLevel.Quest", 1.0f);
- _rate_values[RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS] = sConfigMgr->GetOption<float>("Rate.Reputation.RecruitAFriendBonus", 0.1f);
- _rate_values[RATE_CREATURE_NORMAL_DAMAGE] = sConfigMgr->GetOption<float>("Rate.Creature.Normal.Damage", 1.0f);
- _rate_values[RATE_CREATURE_ELITE_ELITE_DAMAGE] = sConfigMgr->GetOption<float>("Rate.Creature.Elite.Elite.Damage", 1.0f);
- _rate_values[RATE_CREATURE_ELITE_RAREELITE_DAMAGE] = sConfigMgr->GetOption<float>("Rate.Creature.Elite.RAREELITE.Damage", 1.0f);
- _rate_values[RATE_CREATURE_ELITE_WORLDBOSS_DAMAGE] = sConfigMgr->GetOption<float>("Rate.Creature.Elite.WORLDBOSS.Damage", 1.0f);
- _rate_values[RATE_CREATURE_ELITE_RARE_DAMAGE] = sConfigMgr->GetOption<float>("Rate.Creature.Elite.RARE.Damage", 1.0f);
- _rate_values[RATE_CREATURE_NORMAL_HP] = sConfigMgr->GetOption<float>("Rate.Creature.Normal.HP", 1.0f);
- _rate_values[RATE_CREATURE_ELITE_ELITE_HP] = sConfigMgr->GetOption<float>("Rate.Creature.Elite.Elite.HP", 1.0f);
- _rate_values[RATE_CREATURE_ELITE_RAREELITE_HP] = sConfigMgr->GetOption<float>("Rate.Creature.Elite.RAREELITE.HP", 1.0f);
- _rate_values[RATE_CREATURE_ELITE_WORLDBOSS_HP] = sConfigMgr->GetOption<float>("Rate.Creature.Elite.WORLDBOSS.HP", 1.0f);
- _rate_values[RATE_CREATURE_ELITE_RARE_HP] = sConfigMgr->GetOption<float>("Rate.Creature.Elite.RARE.HP", 1.0f);
- _rate_values[RATE_CREATURE_NORMAL_SPELLDAMAGE] = sConfigMgr->GetOption<float>("Rate.Creature.Normal.SpellDamage", 1.0f);
- _rate_values[RATE_CREATURE_ELITE_ELITE_SPELLDAMAGE] = sConfigMgr->GetOption<float>("Rate.Creature.Elite.Elite.SpellDamage", 1.0f);
- _rate_values[RATE_CREATURE_ELITE_RAREELITE_SPELLDAMAGE] = sConfigMgr->GetOption<float>("Rate.Creature.Elite.RAREELITE.SpellDamage", 1.0f);
- _rate_values[RATE_CREATURE_ELITE_WORLDBOSS_SPELLDAMAGE] = sConfigMgr->GetOption<float>("Rate.Creature.Elite.WORLDBOSS.SpellDamage", 1.0f);
- _rate_values[RATE_CREATURE_ELITE_RARE_SPELLDAMAGE] = sConfigMgr->GetOption<float>("Rate.Creature.Elite.RARE.SpellDamage", 1.0f);
- _rate_values[RATE_CREATURE_AGGRO] = sConfigMgr->GetOption<float>("Rate.Creature.Aggro", 1.0f);
- _rate_values[RATE_REST_INGAME] = sConfigMgr->GetOption<float>("Rate.Rest.InGame", 1.0f);
- _rate_values[RATE_REST_OFFLINE_IN_TAVERN_OR_CITY] = sConfigMgr->GetOption<float>("Rate.Rest.Offline.InTavernOrCity", 1.0f);
- _rate_values[RATE_REST_OFFLINE_IN_WILDERNESS] = sConfigMgr->GetOption<float>("Rate.Rest.Offline.InWilderness", 1.0f);
- _rate_values[RATE_REST_MAX_BONUS] = sConfigMgr->GetOption<float>("Rate.Rest.MaxBonus", 1.5f);
- _rate_values[RATE_DAMAGE_FALL] = sConfigMgr->GetOption<float>("Rate.Damage.Fall", 1.0f);
- _rate_values[RATE_AUCTION_TIME] = sConfigMgr->GetOption<float>("Rate.Auction.Time", 1.0f);
- _rate_values[RATE_AUCTION_DEPOSIT] = sConfigMgr->GetOption<float>("Rate.Auction.Deposit", 1.0f);
- _rate_values[RATE_AUCTION_CUT] = sConfigMgr->GetOption<float>("Rate.Auction.Cut", 1.0f);
- _rate_values[RATE_HONOR] = sConfigMgr->GetOption<float>("Rate.Honor", 1.0f);
- _rate_values[RATE_ARENA_POINTS] = sConfigMgr->GetOption<float>("Rate.ArenaPoints", 1.0f);
- _rate_values[RATE_INSTANCE_RESET_TIME] = sConfigMgr->GetOption<float>("Rate.InstanceResetTime", 1.0f);
-
- _rate_values[RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE] = sConfigMgr->GetOption<float>("Rate.MissChanceMultiplier.TargetCreature", 11.0f);
- _rate_values[RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER] = sConfigMgr->GetOption<float>("Rate.MissChanceMultiplier.TargetPlayer", 7.0f);
- _bool_configs[CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS] = sConfigMgr->GetOption<bool>("Rate.MissChanceMultiplier.OnlyAffectsPlayer", false);
-
- _rate_values[RATE_TALENT] = sConfigMgr->GetOption<float>("Rate.Talent", 1.0f);
- if (_rate_values[RATE_TALENT] < 0.0f)
- {
- LOG_ERROR("server.loading", "Rate.Talent ({}) must be > 0. Using 1 instead.", _rate_values[RATE_TALENT]);
- _rate_values[RATE_TALENT] = 1.0f;
- }
- _rate_values[RATE_TALENT_PET] = sConfigMgr->GetOption<float>("Rate.Talent.Pet", 1.0f);
- if (_rate_values[RATE_TALENT_PET] < 0.0f)
- {
- LOG_ERROR("server.loading", "Rate.Talent.Pet ({}) must be > 0. Using 1 instead.", _rate_values[RATE_TALENT_PET]);
- _rate_values[RATE_TALENT_PET] = 1.0f;
- }
- // Controls Player movespeed rate.
- _rate_values[RATE_MOVESPEED_PLAYER] = sConfigMgr->GetOption<float>("Rate.MoveSpeed.Player", 1.0f);
- if (_rate_values[RATE_MOVESPEED_PLAYER] < 0)
- {
- LOG_ERROR("server.loading", "Rate.MoveSpeed.Player ({}) must be > 0. Using 1 instead.", _rate_values[RATE_MOVESPEED_PLAYER]);
- _rate_values[RATE_MOVESPEED_PLAYER] = 1.0f;
- }
- for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i) playerBaseMoveSpeed[i] = baseMoveSpeed[i] * _rate_values[RATE_MOVESPEED_PLAYER];
-
- // Controls all npc movespeed rate.
- _rate_values[RATE_MOVESPEED_NPC] = sConfigMgr->GetOption<float>("Rate.MoveSpeed.NPC", 1.0f);
- if (_rate_values[RATE_MOVESPEED_NPC] < 0)
- {
- LOG_ERROR("server.loading", "Rate.MoveSpeed.NPC ({}) must be > 0. Using 1 instead.", _rate_values[RATE_MOVESPEED_NPC]);
- _rate_values[RATE_MOVESPEED_NPC] = 1.0f;
- }
- for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i) baseMoveSpeed[i] *= _rate_values[RATE_MOVESPEED_NPC];
-
- _rate_values[RATE_CORPSE_DECAY_LOOTED] = sConfigMgr->GetOption<float>("Rate.Corpse.Decay.Looted", 0.5f);
-
- _rate_values[RATE_DURABILITY_LOSS_ON_DEATH] = sConfigMgr->GetOption<float>("DurabilityLoss.OnDeath", 10.0f);
- if (_rate_values[RATE_DURABILITY_LOSS_ON_DEATH] < 0.0f)
- {
- LOG_ERROR("server.loading", "DurabilityLoss.OnDeath ({}) must be >=0. Using 0.0 instead.", _rate_values[RATE_DURABILITY_LOSS_ON_DEATH]);
- _rate_values[RATE_DURABILITY_LOSS_ON_DEATH] = 0.0f;
- }
- if (_rate_values[RATE_DURABILITY_LOSS_ON_DEATH] > 100.0f)
- {
- LOG_ERROR("server.loading", "DurabilityLoss.OnDeath ({}) must be <= 100. Using 100.0 instead.", _rate_values[RATE_DURABILITY_LOSS_ON_DEATH]);
- _rate_values[RATE_DURABILITY_LOSS_ON_DEATH] = 0.0f;
- }
- _rate_values[RATE_DURABILITY_LOSS_ON_DEATH] = _rate_values[RATE_DURABILITY_LOSS_ON_DEATH] / 100.0f;
-
- _rate_values[RATE_DURABILITY_LOSS_DAMAGE] = sConfigMgr->GetOption<float>("DurabilityLossChance.Damage", 0.5f);
- if (_rate_values[RATE_DURABILITY_LOSS_DAMAGE] < 0.0f)
- {
- LOG_ERROR("server.loading", "DurabilityLossChance.Damage ({}) must be >=0. Using 0.0 instead.", _rate_values[RATE_DURABILITY_LOSS_DAMAGE]);
- _rate_values[RATE_DURABILITY_LOSS_DAMAGE] = 0.0f;
- }
- _rate_values[RATE_DURABILITY_LOSS_ABSORB] = sConfigMgr->GetOption<float>("DurabilityLossChance.Absorb", 0.5f);
- if (_rate_values[RATE_DURABILITY_LOSS_ABSORB] < 0.0f)
- {
- LOG_ERROR("server.loading", "DurabilityLossChance.Absorb ({}) must be >=0. Using 0.0 instead.", _rate_values[RATE_DURABILITY_LOSS_ABSORB]);
- _rate_values[RATE_DURABILITY_LOSS_ABSORB] = 0.0f;
- }
- _rate_values[RATE_DURABILITY_LOSS_PARRY] = sConfigMgr->GetOption<float>("DurabilityLossChance.Parry", 0.05f);
- if (_rate_values[RATE_DURABILITY_LOSS_PARRY] < 0.0f)
- {
- LOG_ERROR("server.loading", "DurabilityLossChance.Parry ({}) must be >=0. Using 0.0 instead.", _rate_values[RATE_DURABILITY_LOSS_PARRY]);
- _rate_values[RATE_DURABILITY_LOSS_PARRY] = 0.0f;
- }
- _rate_values[RATE_DURABILITY_LOSS_BLOCK] = sConfigMgr->GetOption<float>("DurabilityLossChance.Block", 0.05f);
- if (_rate_values[RATE_DURABILITY_LOSS_BLOCK] < 0.0f)
- {
- LOG_ERROR("server.loading", "DurabilityLossChance.Block ({}) must be >=0. Using 0.0 instead.", _rate_values[RATE_DURABILITY_LOSS_BLOCK]);
- _rate_values[RATE_DURABILITY_LOSS_BLOCK] = 0.0f;
- }
-
- ///- Read other configuration items from the config file
-
- _bool_configs[CONFIG_DURABILITY_LOSS_IN_PVP] = sConfigMgr->GetOption<bool>("DurabilityLoss.InPvP", false);
-
- _int_configs[CONFIG_COMPRESSION] = sConfigMgr->GetOption<int32>("Compression", 1);
- if (_int_configs[CONFIG_COMPRESSION] < 1 || _int_configs[CONFIG_COMPRESSION] > 9)
- {
- LOG_ERROR("server.loading", "Compression level ({}) must be in range 1..9. Using default compression level (1).", _int_configs[CONFIG_COMPRESSION]);
- _int_configs[CONFIG_COMPRESSION] = 1;
- }
- _bool_configs[CONFIG_ADDON_CHANNEL] = sConfigMgr->GetOption<bool>("AddonChannel", true);
- _bool_configs[CONFIG_CLEAN_CHARACTER_DB] = sConfigMgr->GetOption<bool>("CleanCharacterDB", false);
- _int_configs[CONFIG_PERSISTENT_CHARACTER_CLEAN_FLAGS] = sConfigMgr->GetOption<int32>("PersistentCharacterCleanFlags", 0);
- _int_configs[CONFIG_CHAT_CHANNEL_LEVEL_REQ] = sConfigMgr->GetOption<int32>("ChatLevelReq.Channel", 1);
- _int_configs[CONFIG_CHAT_WHISPER_LEVEL_REQ] = sConfigMgr->GetOption<int32>("ChatLevelReq.Whisper", 1);
- _int_configs[CONFIG_CHAT_SAY_LEVEL_REQ] = sConfigMgr->GetOption<int32>("ChatLevelReq.Say", 1);
- _int_configs[CONFIG_PARTY_LEVEL_REQ] = sConfigMgr->GetOption<int32>("PartyLevelReq", 1);
- _int_configs[CONFIG_TRADE_LEVEL_REQ] = sConfigMgr->GetOption<int32>("LevelReq.Trade", 1);
- _int_configs[CONFIG_TICKET_LEVEL_REQ] = sConfigMgr->GetOption<int32>("LevelReq.Ticket", 1);
- _int_configs[CONFIG_AUCTION_LEVEL_REQ] = sConfigMgr->GetOption<int32>("LevelReq.Auction", 1);
- _int_configs[CONFIG_MAIL_LEVEL_REQ] = sConfigMgr->GetOption<int32>("LevelReq.Mail", 1);
- _bool_configs[CONFIG_ALLOW_PLAYER_COMMANDS] = sConfigMgr->GetOption<bool>("AllowPlayerCommands", 1);
- _bool_configs[CONFIG_PRESERVE_CUSTOM_CHANNELS] = sConfigMgr->GetOption<bool>("PreserveCustomChannels", false);
- _int_configs[CONFIG_PRESERVE_CUSTOM_CHANNEL_DURATION] = sConfigMgr->GetOption<int32>("PreserveCustomChannelDuration", 14);
- _int_configs[CONFIG_INTERVAL_SAVE] = sConfigMgr->GetOption<int32>("PlayerSaveInterval", 15 * MINUTE * IN_MILLISECONDS);
- _int_configs[CONFIG_INTERVAL_DISCONNECT_TOLERANCE] = sConfigMgr->GetOption<int32>("DisconnectToleranceInterval", 0);
- _bool_configs[CONFIG_STATS_SAVE_ONLY_ON_LOGOUT] = sConfigMgr->GetOption<bool>("PlayerSave.Stats.SaveOnlyOnLogout", true);
-
- _int_configs[CONFIG_MIN_LEVEL_STAT_SAVE] = sConfigMgr->GetOption<int32>("PlayerSave.Stats.MinLevel", 0);
- if (_int_configs[CONFIG_MIN_LEVEL_STAT_SAVE] > MAX_LEVEL || int32(_int_configs[CONFIG_MIN_LEVEL_STAT_SAVE]) < 0)
- {
- LOG_ERROR("server.loading", "PlayerSave.Stats.MinLevel ({}) must be in range 0..80. Using default, do not save character stats (0).", _int_configs[CONFIG_MIN_LEVEL_STAT_SAVE]);
- _int_configs[CONFIG_MIN_LEVEL_STAT_SAVE] = 0;
- }
-
- _int_configs[CONFIG_INTERVAL_MAPUPDATE] = sConfigMgr->GetOption<int32>("MapUpdateInterval", 10);
- if (_int_configs[CONFIG_INTERVAL_MAPUPDATE] < MIN_MAP_UPDATE_DELAY)
- {
- LOG_ERROR("server.loading", "MapUpdateInterval ({}) must be greater {}. Use this minimal value.", _int_configs[CONFIG_INTERVAL_MAPUPDATE], MIN_MAP_UPDATE_DELAY);
- _int_configs[CONFIG_INTERVAL_MAPUPDATE] = MIN_MAP_UPDATE_DELAY;
- }
- if (reload)
- sMapMgr->SetMapUpdateInterval(_int_configs[CONFIG_INTERVAL_MAPUPDATE]);
-
- _int_configs[CONFIG_INTERVAL_CHANGEWEATHER] = sConfigMgr->GetOption<int32>("ChangeWeatherInterval", 10 * MINUTE * IN_MILLISECONDS);
-
- if (reload)
- {
- uint32 val = sConfigMgr->GetOption<int32>("WorldServerPort", 8085);
- if (val != _int_configs[CONFIG_PORT_WORLD])
- LOG_ERROR("server.loading", "WorldServerPort option can't be changed at worldserver.conf reload, using current value ({}).", _int_configs[CONFIG_PORT_WORLD]);
- }
- else
- _int_configs[CONFIG_PORT_WORLD] = sConfigMgr->GetOption<int32>("WorldServerPort", 8085);
-
- _bool_configs[CONFIG_CLOSE_IDLE_CONNECTIONS] = sConfigMgr->GetOption<bool>("CloseIdleConnections", true);
- _int_configs[CONFIG_SOCKET_TIMEOUTTIME] = sConfigMgr->GetOption<int32>("SocketTimeOutTime", 900000);
- _int_configs[CONFIG_SOCKET_TIMEOUTTIME_ACTIVE] = sConfigMgr->GetOption<int32>("SocketTimeOutTimeActive", 60000);
- _int_configs[CONFIG_SESSION_ADD_DELAY] = sConfigMgr->GetOption<int32>("SessionAddDelay", 10000);
+ _worldConfig.Initialize(reload);
- _float_configs[CONFIG_GROUP_XP_DISTANCE] = sConfigMgr->GetOption<float>("MaxGroupXPDistance", 74.0f);
- _float_configs[CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE] = sConfigMgr->GetOption<float>("MaxRecruitAFriendBonusDistance", 100.0f);
+ for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
+ playerBaseMoveSpeed[i] = baseMoveSpeed[i] * getRate(RATE_MOVESPEED_PLAYER);
- /// \todo Add MonsterSight in worldserver.conf or put it as define
- _float_configs[CONFIG_SIGHT_MONSTER] = sConfigMgr->GetOption<float>("MonsterSight", 50);
+ for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
+ baseMoveSpeed[i] *= getRate(RATE_MOVESPEED_NPC);
if (reload)
{
- uint32 val = sConfigMgr->GetOption<int32>("GameType", 0);
- if (val != _int_configs[CONFIG_GAME_TYPE])
- LOG_ERROR("server.loading", "GameType option can't be changed at worldserver.conf reload, using current value ({}).", _int_configs[CONFIG_GAME_TYPE]);
- }
- else
- _int_configs[CONFIG_GAME_TYPE] = sConfigMgr->GetOption<int32>("GameType", 0);
-
- if (reload)
- {
- uint32 val = sConfigMgr->GetOption<int32>("RealmZone", REALM_ZONE_DEVELOPMENT);
- if (val != _int_configs[CONFIG_REALM_ZONE])
- LOG_ERROR("server.loading", "RealmZone option can't be changed at worldserver.conf reload, using current value ({}).", _int_configs[CONFIG_REALM_ZONE]);
- }
- else
- _int_configs[CONFIG_REALM_ZONE] = sConfigMgr->GetOption<int32>("RealmZone", REALM_ZONE_DEVELOPMENT);
-
- _bool_configs[CONFIG_STRICT_NAMES_RESERVED] = sConfigMgr->GetOption<bool> ("StrictNames.Reserved", true);
- _bool_configs[CONFIG_STRICT_NAMES_PROFANITY] = sConfigMgr->GetOption<bool> ("StrictNames.Profanity", true);
- _int_configs[CONFIG_STRICT_PLAYER_NAMES] = sConfigMgr->GetOption<int32> ("StrictPlayerNames", 0);
- _int_configs[CONFIG_STRICT_CHARTER_NAMES] = sConfigMgr->GetOption<int32> ("StrictCharterNames", 0);
- _int_configs[CONFIG_STRICT_CHANNEL_NAMES] = sConfigMgr->GetOption<int32> ("StrictChannelNames", 0);
- _int_configs[CONFIG_STRICT_PET_NAMES] = sConfigMgr->GetOption<int32> ("StrictPetNames", 0);
-
- _bool_configs[CONFIG_ALLOW_TWO_SIDE_ACCOUNTS] = sConfigMgr->GetOption<bool>("AllowTwoSide.Accounts", true);
- _bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_CALENDAR] = sConfigMgr->GetOption<bool>("AllowTwoSide.Interaction.Calendar", false);
- _bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT] = sConfigMgr->GetOption<bool>("AllowTwoSide.Interaction.Chat", false);
- _bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL] = sConfigMgr->GetOption<bool>("AllowTwoSide.Interaction.Channel", false);
- _bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP] = sConfigMgr->GetOption<bool>("AllowTwoSide.Interaction.Group", false);
- _bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD] = sConfigMgr->GetOption<bool>("AllowTwoSide.Interaction.Guild", false);
- _bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_ARENA] = sConfigMgr->GetOption<bool>("AllowTwoSide.Interaction.Arena", false);
- _bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION] = sConfigMgr->GetOption<bool>("AllowTwoSide.Interaction.Auction", false);
- _bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_MAIL] = sConfigMgr->GetOption<bool>("AllowTwoSide.Interaction.Mail", false);
- _bool_configs[CONFIG_ALLOW_TWO_SIDE_WHO_LIST] = sConfigMgr->GetOption<bool>("AllowTwoSide.WhoList", false);
- _bool_configs[CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND] = sConfigMgr->GetOption<bool>("AllowTwoSide.AddFriend", false);
- _bool_configs[CONFIG_ALLOW_TWO_SIDE_TRADE] = sConfigMgr->GetOption<bool>("AllowTwoSide.Trade", false);
- _bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE] = sConfigMgr->GetOption<bool>("AllowTwoSide.Interaction.Emote", false);
-
- _int_configs[CONFIG_MIN_PLAYER_NAME] = sConfigMgr->GetOption<int32> ("MinPlayerName", 2);
- if (_int_configs[CONFIG_MIN_PLAYER_NAME] < 1 || _int_configs[CONFIG_MIN_PLAYER_NAME] > MAX_PLAYER_NAME)
- {
- LOG_ERROR("server.loading", "MinPlayerName ({}) must be in range 1..{}. Set to 2.", _int_configs[CONFIG_MIN_PLAYER_NAME], MAX_PLAYER_NAME);
- _int_configs[CONFIG_MIN_PLAYER_NAME] = 2;
- }
-
- _int_configs[CONFIG_MIN_CHARTER_NAME] = sConfigMgr->GetOption<int32> ("MinCharterName", 2);
- if (_int_configs[CONFIG_MIN_CHARTER_NAME] < 1 || _int_configs[CONFIG_MIN_CHARTER_NAME] > MAX_CHARTER_NAME)
- {
- LOG_ERROR("server.loading", "MinCharterName ({}) must be in range 1..{}. Set to 2.", _int_configs[CONFIG_MIN_CHARTER_NAME], MAX_CHARTER_NAME);
- _int_configs[CONFIG_MIN_CHARTER_NAME] = 2;
- }
-
- _int_configs[CONFIG_MIN_PET_NAME] = sConfigMgr->GetOption<int32> ("MinPetName", 2);
- if (_int_configs[CONFIG_MIN_PET_NAME] < 1 || _int_configs[CONFIG_MIN_PET_NAME] > MAX_PET_NAME)
- {
- LOG_ERROR("server.loading", "MinPetName ({}) must be in range 1..{}. Set to 2.", _int_configs[CONFIG_MIN_PET_NAME], MAX_PET_NAME);
- _int_configs[CONFIG_MIN_PET_NAME] = 2;
- }
-
- _int_configs[CONFIG_CHARTER_COST_GUILD] = sConfigMgr->GetOption<int32>("Guild.CharterCost", 1000);
- _int_configs[CONFIG_CHARTER_COST_ARENA_2v2] = sConfigMgr->GetOption<int32>("ArenaTeam.CharterCost.2v2", 800000);
- _int_configs[CONFIG_CHARTER_COST_ARENA_3v3] = sConfigMgr->GetOption<int32>("ArenaTeam.CharterCost.3v3", 1200000);
- _int_configs[CONFIG_CHARTER_COST_ARENA_5v5] = sConfigMgr->GetOption<int32>("ArenaTeam.CharterCost.5v5", 2000000);
-
- _int_configs[CONFIG_MAX_WHO_LIST_RETURN] = sConfigMgr->GetOption<int32>("MaxWhoListReturns", 49);
-
- _int_configs[CONFIG_CHARACTER_CREATING_DISABLED] = sConfigMgr->GetOption<int32>("CharacterCreating.Disabled", 0);
- _int_configs[CONFIG_CHARACTER_CREATING_DISABLED_RACEMASK] = sConfigMgr->GetOption<int32>("CharacterCreating.Disabled.RaceMask", 0);
-
- _int_configs[CONFIG_CHARACTER_CREATING_DISABLED_CLASSMASK] = sConfigMgr->GetOption<int32>("CharacterCreating.Disabled.ClassMask", 0);
-
- _int_configs[CONFIG_CHARACTERS_PER_REALM] = sConfigMgr->GetOption<int32>("CharactersPerRealm", 10);
- if (_int_configs[CONFIG_CHARACTERS_PER_REALM] < 1 || _int_configs[CONFIG_CHARACTERS_PER_REALM] > 10)
- {
- LOG_ERROR("server.loading", "CharactersPerRealm ({}) must be in range 1..10. Set to 10.", _int_configs[CONFIG_CHARACTERS_PER_REALM]);
- _int_configs[CONFIG_CHARACTERS_PER_REALM] = 10;
- }
-
- // must be after CONFIG_CHARACTERS_PER_REALM
- _int_configs[CONFIG_CHARACTERS_PER_ACCOUNT] = sConfigMgr->GetOption<int32>("CharactersPerAccount", 50);
- if (_int_configs[CONFIG_CHARACTERS_PER_ACCOUNT] < _int_configs[CONFIG_CHARACTERS_PER_REALM])
- {
- LOG_ERROR("server.loading", "CharactersPerAccount ({}) can't be less than CharactersPerRealm ({}).", _int_configs[CONFIG_CHARACTERS_PER_ACCOUNT], _int_configs[CONFIG_CHARACTERS_PER_REALM]);
- _int_configs[CONFIG_CHARACTERS_PER_ACCOUNT] = _int_configs[CONFIG_CHARACTERS_PER_REALM];
- }
-
- _int_configs[CONFIG_HEROIC_CHARACTERS_PER_REALM] = sConfigMgr->GetOption<int32>("HeroicCharactersPerRealm", 1);
- if (int32(_int_configs[CONFIG_HEROIC_CHARACTERS_PER_REALM]) < 0 || _int_configs[CONFIG_HEROIC_CHARACTERS_PER_REALM] > 10)
- {
- LOG_ERROR("server.loading", "HeroicCharactersPerRealm ({}) must be in range 0..10. Set to 1.", _int_configs[CONFIG_HEROIC_CHARACTERS_PER_REALM]);
- _int_configs[CONFIG_HEROIC_CHARACTERS_PER_REALM] = 1;
- }
-
- _int_configs[CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_HEROIC_CHARACTER] = sConfigMgr->GetOption<int32>("CharacterCreating.MinLevelForHeroicCharacter", 55);
-
- _int_configs[CONFIG_SKIP_CINEMATICS] = sConfigMgr->GetOption<int32>("SkipCinematics", 0);
- if (int32(_int_configs[CONFIG_SKIP_CINEMATICS]) < 0 || _int_configs[CONFIG_SKIP_CINEMATICS] > 2)
- {
- LOG_ERROR("server.loading", "SkipCinematics ({}) must be in range 0..2. Set to 0.", _int_configs[CONFIG_SKIP_CINEMATICS]);
- _int_configs[CONFIG_SKIP_CINEMATICS] = 0;
- }
-
- if (reload)
- {
- uint32 val = sConfigMgr->GetOption<int32>("MaxPlayerLevel", DEFAULT_MAX_LEVEL);
- if (val != _int_configs[CONFIG_MAX_PLAYER_LEVEL])
- LOG_ERROR("server.loading", "MaxPlayerLevel option can't be changed at config reload, using current value ({}).", _int_configs[CONFIG_MAX_PLAYER_LEVEL]);
- }
- else
- _int_configs[CONFIG_MAX_PLAYER_LEVEL] = sConfigMgr->GetOption<int32>("MaxPlayerLevel", DEFAULT_MAX_LEVEL);
-
- if (_int_configs[CONFIG_MAX_PLAYER_LEVEL] > MAX_LEVEL || _int_configs[CONFIG_MAX_PLAYER_LEVEL] < 1)
- {
- LOG_ERROR("server.loading", "MaxPlayerLevel ({}) must be in range 1..{}. Set to {}.", _int_configs[CONFIG_MAX_PLAYER_LEVEL], MAX_LEVEL, MAX_LEVEL);
- _int_configs[CONFIG_MAX_PLAYER_LEVEL] = MAX_LEVEL;
- }
-
- _int_configs[CONFIG_MIN_DUALSPEC_LEVEL] = sConfigMgr->GetOption<int32>("MinDualSpecLevel", 40);
-
- _int_configs[CONFIG_START_PLAYER_LEVEL] = sConfigMgr->GetOption<int32>("StartPlayerLevel", 1);
- if (_int_configs[CONFIG_START_PLAYER_LEVEL] < 1 || _int_configs[CONFIG_START_PLAYER_LEVEL] > _int_configs[CONFIG_MAX_PLAYER_LEVEL])
- {
- LOG_ERROR("server.loading", "StartPlayerLevel ({}) must be in range 1..MaxPlayerLevel({}). Set to 1.", _int_configs[CONFIG_START_PLAYER_LEVEL], _int_configs[CONFIG_MAX_PLAYER_LEVEL]);
- _int_configs[CONFIG_START_PLAYER_LEVEL] = 1;
- }
-
- _int_configs[CONFIG_START_HEROIC_PLAYER_LEVEL] = sConfigMgr->GetOption<int32>("StartHeroicPlayerLevel", 55);
- if (_int_configs[CONFIG_START_HEROIC_PLAYER_LEVEL] < 1 || _int_configs[CONFIG_START_HEROIC_PLAYER_LEVEL] > _int_configs[CONFIG_MAX_PLAYER_LEVEL])
- {
- LOG_ERROR("server.loading", "StartHeroicPlayerLevel ({}) must be in range 1..MaxPlayerLevel({}). Set to 55.",
- _int_configs[CONFIG_START_HEROIC_PLAYER_LEVEL], _int_configs[CONFIG_MAX_PLAYER_LEVEL]);
- _int_configs[CONFIG_START_HEROIC_PLAYER_LEVEL] = 55;
- }
-
- _int_configs[CONFIG_START_PLAYER_MONEY] = sConfigMgr->GetOption<int32>("StartPlayerMoney", 0);
- if (int32(_int_configs[CONFIG_START_PLAYER_MONEY]) < 0 || int32(_int_configs[CONFIG_START_PLAYER_MONEY]) > MAX_MONEY_AMOUNT)
- {
- LOG_ERROR("server.loading", "StartPlayerMoney ({}) must be in range 0..{}. Set to {}.", _int_configs[CONFIG_START_PLAYER_MONEY], MAX_MONEY_AMOUNT, 0);
- _int_configs[CONFIG_START_PLAYER_MONEY] = 0;
- }
-
- _int_configs[CONFIG_START_HEROIC_PLAYER_MONEY] = sConfigMgr->GetOption<int32>("StartHeroicPlayerMoney", 2000);
- if (int32(_int_configs[CONFIG_START_HEROIC_PLAYER_MONEY]) < 0 || int32(_int_configs[CONFIG_START_HEROIC_PLAYER_MONEY]) > MAX_MONEY_AMOUNT)
- {
- LOG_ERROR("server.loading", "StartHeroicPlayerMoney ({}) must be in range 0..{}. Set to {}.", _int_configs[CONFIG_START_HEROIC_PLAYER_MONEY], MAX_MONEY_AMOUNT, 2000);
- _int_configs[CONFIG_START_HEROIC_PLAYER_MONEY] = 2000;
- }
-
- _int_configs[CONFIG_MAX_HONOR_POINTS] = sConfigMgr->GetOption<int32>("MaxHonorPoints", 75000);
- if (int32(_int_configs[CONFIG_MAX_HONOR_POINTS]) < 0)
- {
- LOG_ERROR("server.loading", "MaxHonorPoints ({}) can't be negative. Set to 0.", _int_configs[CONFIG_MAX_HONOR_POINTS]);
- _int_configs[CONFIG_MAX_HONOR_POINTS] = 0;
- }
-
- _int_configs[CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT] = sConfigMgr->GetOption<int32>("MaxHonorPointsMoneyPerPoint", 0);
- if (int32(_int_configs[CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT]) < 0)
- {
- LOG_ERROR("server.loading", "MaxHonorPointsMoneyPerPoint ({}) can't be negative. Set to 0.", _int_configs[CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT]);
- _int_configs[CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT] = 0;
- }
-
- _int_configs[CONFIG_START_HONOR_POINTS] = sConfigMgr->GetOption<int32>("StartHonorPoints", 0);
- if (int32(_int_configs[CONFIG_START_HONOR_POINTS]) < 0 || int32(_int_configs[CONFIG_START_HONOR_POINTS]) > int32(_int_configs[CONFIG_MAX_HONOR_POINTS]))
- {
- LOG_ERROR("server.loading", "StartHonorPoints ({}) must be in range 0..MaxHonorPoints({}). Set to {}.",
- _int_configs[CONFIG_START_HONOR_POINTS], _int_configs[CONFIG_MAX_HONOR_POINTS], 0);
- _int_configs[CONFIG_START_HONOR_POINTS] = 0;
- }
-
- _int_configs[CONFIG_MAX_ARENA_POINTS] = sConfigMgr->GetOption<int32>("MaxArenaPoints", 10000);
- if (int32(_int_configs[CONFIG_MAX_ARENA_POINTS]) < 0)
- {
- LOG_ERROR("server.loading", "MaxArenaPoints ({}) can't be negative. Set to 0.", _int_configs[CONFIG_MAX_ARENA_POINTS]);
- _int_configs[CONFIG_MAX_ARENA_POINTS] = 0;
- }
-
- _int_configs[CONFIG_START_ARENA_POINTS] = sConfigMgr->GetOption<int32>("StartArenaPoints", 0);
- if (int32(_int_configs[CONFIG_START_ARENA_POINTS]) < 0 || int32(_int_configs[CONFIG_START_ARENA_POINTS]) > int32(_int_configs[CONFIG_MAX_ARENA_POINTS]))
- {
- LOG_ERROR("server.loading", "StartArenaPoints ({}) must be in range 0..MaxArenaPoints({}). Set to {}.",
- _int_configs[CONFIG_START_ARENA_POINTS], _int_configs[CONFIG_MAX_ARENA_POINTS], 0);
- _int_configs[CONFIG_START_ARENA_POINTS] = 0;
- }
-
- _int_configs[CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL] = sConfigMgr->GetOption<int32>("RecruitAFriend.MaxLevel", 60);
- if (_int_configs[CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL] > _int_configs[CONFIG_MAX_PLAYER_LEVEL]
- || int32(_int_configs[CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL]) < 0)
- {
- LOG_ERROR("server.loading", "RecruitAFriend.MaxLevel ({}) must be in the range 0..MaxLevel({}). Set to {}.",
- _int_configs[CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL], _int_configs[CONFIG_MAX_PLAYER_LEVEL], 60);
- _int_configs[CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL] = 60;
- }
-
- _int_configs[CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE] = sConfigMgr->GetOption<int32>("RecruitAFriend.MaxDifference", 4);
- _bool_configs[CONFIG_ALL_TAXI_PATHS] = sConfigMgr->GetOption<bool>("AllFlightPaths", false);
- _int_configs[CONFIG_INSTANT_TAXI] = sConfigMgr->GetOption<int32>("InstantFlightPaths", 0);
-
- _bool_configs[CONFIG_INSTANCE_IGNORE_LEVEL] = sConfigMgr->GetOption<bool>("Instance.IgnoreLevel", false);
- _bool_configs[CONFIG_INSTANCE_IGNORE_RAID] = sConfigMgr->GetOption<bool>("Instance.IgnoreRaid", false);
- _bool_configs[CONFIG_INSTANCE_GMSUMMON_PLAYER] = sConfigMgr->GetOption<bool>("Instance.GMSummonPlayer", false);
- _bool_configs[CONFIG_INSTANCE_SHARED_ID] = sConfigMgr->GetOption<bool>("Instance.SharedNormalHeroicId", false);
-
- _int_configs[CONFIG_INSTANCE_RESET_TIME_HOUR] = sConfigMgr->GetOption<int32>("Instance.ResetTimeHour", 4);
- _int_configs[CONFIG_INSTANCE_RESET_TIME_RELATIVE_TIMESTAMP] = sConfigMgr->GetOption<int32>("Instance.ResetTimeRelativeTimestamp", 1135814400);
- _int_configs[CONFIG_INSTANCE_UNLOAD_DELAY] = sConfigMgr->GetOption<int32>("Instance.UnloadDelay", 30 * MINUTE * IN_MILLISECONDS);
-
- _int_configs[CONFIG_MAX_PRIMARY_TRADE_SKILL] = sConfigMgr->GetOption<int32>("MaxPrimaryTradeSkill", 2);
- _int_configs[CONFIG_MIN_PETITION_SIGNS] = sConfigMgr->GetOption<int32>("MinPetitionSigns", 9);
- if (_int_configs[CONFIG_MIN_PETITION_SIGNS] > 9 || int32(_int_configs[CONFIG_MIN_PETITION_SIGNS]) < 0)
- {
- LOG_ERROR("server.loading", "MinPetitionSigns ({}) must be in range 0..9. Set to 9.", _int_configs[CONFIG_MIN_PETITION_SIGNS]);
- _int_configs[CONFIG_MIN_PETITION_SIGNS] = 9;
- }
-
- _int_configs[CONFIG_GM_LOGIN_STATE] = sConfigMgr->GetOption<int32>("GM.LoginState", 2);
- _int_configs[CONFIG_GM_VISIBLE_STATE] = sConfigMgr->GetOption<int32>("GM.Visible", 2);
- _int_configs[CONFIG_GM_CHAT] = sConfigMgr->GetOption<int32>("GM.Chat", 2);
- _int_configs[CONFIG_GM_WHISPERING_TO] = sConfigMgr->GetOption<int32>("GM.WhisperingTo", 2);
-
- _int_configs[CONFIG_GM_LEVEL_IN_GM_LIST] = sConfigMgr->GetOption<int32>("GM.InGMList.Level", SEC_ADMINISTRATOR);
- _int_configs[CONFIG_GM_LEVEL_IN_WHO_LIST] = sConfigMgr->GetOption<int32>("GM.InWhoList.Level", SEC_ADMINISTRATOR);
- _int_configs[CONFIG_START_GM_LEVEL] = sConfigMgr->GetOption<int32>("GM.StartLevel", 1);
- if (_int_configs[CONFIG_START_GM_LEVEL] < _int_configs[CONFIG_START_PLAYER_LEVEL])
- {
- LOG_ERROR("server.loading", "GM.StartLevel ({}) must be in range StartPlayerLevel({})..{}. Set to {}.",
- _int_configs[CONFIG_START_GM_LEVEL], _int_configs[CONFIG_START_PLAYER_LEVEL], MAX_LEVEL, _int_configs[CONFIG_START_PLAYER_LEVEL]);
- _int_configs[CONFIG_START_GM_LEVEL] = _int_configs[CONFIG_START_PLAYER_LEVEL];
- }
- else if (_int_configs[CONFIG_START_GM_LEVEL] > MAX_LEVEL)
- {
- LOG_ERROR("server.loading", "GM.StartLevel ({}) must be in range 1..{}. Set to {}.", _int_configs[CONFIG_START_GM_LEVEL], MAX_LEVEL, MAX_LEVEL);
- _int_configs[CONFIG_START_GM_LEVEL] = MAX_LEVEL;
- }
- _bool_configs[CONFIG_ALLOW_GM_GROUP] = sConfigMgr->GetOption<bool>("GM.AllowInvite", false);
- _bool_configs[CONFIG_ALLOW_GM_FRIEND] = sConfigMgr->GetOption<bool>("GM.AllowFriend", false);
- _bool_configs[CONFIG_GM_LOWER_SECURITY] = sConfigMgr->GetOption<bool>("GM.LowerSecurity", false);
- _float_configs[CONFIG_CHANCE_OF_GM_SURVEY] = sConfigMgr->GetOption<float>("GM.TicketSystem.ChanceOfGMSurvey", 50.0f);
-
- _int_configs[CONFIG_GROUP_VISIBILITY] = sConfigMgr->GetOption<int32>("Visibility.GroupMode", 1);
-
- _bool_configs[CONFIG_OBJECT_SPARKLES] = sConfigMgr->GetOption<bool>("Visibility.ObjectSparkles", true);
-
- _bool_configs[CONFIG_LOW_LEVEL_REGEN_BOOST] = sConfigMgr->GetOption<bool>("EnableLowLevelRegenBoost", true);
-
- _bool_configs[CONFIG_OBJECT_QUEST_MARKERS] = sConfigMgr->GetOption<bool>("Visibility.ObjectQuestMarkers", true);
+ sMapMgr->SetMapUpdateInterval(getIntConfig(CONFIG_INTERVAL_MAPUPDATE));
- _int_configs[CONFIG_MAIL_DELIVERY_DELAY] = sConfigMgr->GetOption<int32>("MailDeliveryDelay", HOUR);
-
- _int_configs[CONFIG_UPTIME_UPDATE] = sConfigMgr->GetOption<int32>("UpdateUptimeInterval", 10);
- if (int32(_int_configs[CONFIG_UPTIME_UPDATE]) <= 0)
- {
- LOG_ERROR("server.loading", "UpdateUptimeInterval ({}) must be > 0, set to default 10.", _int_configs[CONFIG_UPTIME_UPDATE]);
- _int_configs[CONFIG_UPTIME_UPDATE] = 1;
- }
-
- if (reload)
- {
- _timers[WUPDATE_UPTIME].SetInterval(_int_configs[CONFIG_UPTIME_UPDATE]*MINUTE * IN_MILLISECONDS);
+ _timers[WUPDATE_UPTIME].SetInterval(getIntConfig(CONFIG_UPTIME_UPDATE) * MINUTE* IN_MILLISECONDS);
_timers[WUPDATE_UPTIME].Reset();
- }
- // log db cleanup interval
- _int_configs[CONFIG_LOGDB_CLEARINTERVAL] = sConfigMgr->GetOption<int32>("LogDB.Opt.ClearInterval", 10);
- if (int32(_int_configs[CONFIG_LOGDB_CLEARINTERVAL]) <= 0)
- {
- LOG_ERROR("server.loading", "LogDB.Opt.ClearInterval ({}) must be > 0, set to default 10.", _int_configs[CONFIG_LOGDB_CLEARINTERVAL]);
- _int_configs[CONFIG_LOGDB_CLEARINTERVAL] = 10;
- }
- if (reload)
- {
- _timers[WUPDATE_CLEANDB].SetInterval(_int_configs[CONFIG_LOGDB_CLEARINTERVAL] * MINUTE * IN_MILLISECONDS);
+ _timers[WUPDATE_CLEANDB].SetInterval(getIntConfig(CONFIG_LOGDB_CLEARINTERVAL) * MINUTE * IN_MILLISECONDS);
_timers[WUPDATE_CLEANDB].Reset();
- }
- _int_configs[CONFIG_LOGDB_CLEARTIME] = sConfigMgr->GetOption<int32>("LogDB.Opt.ClearTime", 1209600); // 14 days default
- LOG_INFO("server.loading", "Will clear `logs` table of entries older than {} seconds every {} minutes.",
- _int_configs[CONFIG_LOGDB_CLEARTIME], _int_configs[CONFIG_LOGDB_CLEARINTERVAL]);
-
- _int_configs[CONFIG_TELEPORT_TIMEOUT_NEAR] = sConfigMgr->GetOption<int32>("TeleportTimeoutNear", 25); // pussywizard
- _int_configs[CONFIG_TELEPORT_TIMEOUT_FAR] = sConfigMgr->GetOption<int32>("TeleportTimeoutFar", 45); // pussywizard
- _int_configs[CONFIG_MAX_ALLOWED_MMR_DROP] = sConfigMgr->GetOption<int32>("MaxAllowedMMRDrop", 500); // pussywizard
- _bool_configs[CONFIG_ENABLE_LOGIN_AFTER_DC] = sConfigMgr->GetOption<bool>("EnableLoginAfterDC", true); // pussywizard
- _bool_configs[CONFIG_DONT_CACHE_RANDOM_MOVEMENT_PATHS] = sConfigMgr->GetOption<bool>("DontCacheRandomMovementPaths", false);
-
- _int_configs[CONFIG_SKILL_CHANCE_ORANGE] = sConfigMgr->GetOption<int32>("SkillChance.Orange", 100);
- _int_configs[CONFIG_SKILL_CHANCE_YELLOW] = sConfigMgr->GetOption<int32>("SkillChance.Yellow", 75);
- _int_configs[CONFIG_SKILL_CHANCE_GREEN] = sConfigMgr->GetOption<int32>("SkillChance.Green", 25);
- _int_configs[CONFIG_SKILL_CHANCE_GREY] = sConfigMgr->GetOption<int32>("SkillChance.Grey", 0);
-
- _int_configs[CONFIG_SKILL_CHANCE_MINING_STEPS] = sConfigMgr->GetOption<int32>("SkillChance.MiningSteps", 0);
- _int_configs[CONFIG_SKILL_CHANCE_SKINNING_STEPS] = sConfigMgr->GetOption<int32>("SkillChance.SkinningSteps", 0);
-
- _bool_configs[CONFIG_SKILL_PROSPECTING] = sConfigMgr->GetOption<bool>("SkillChance.Prospecting", false);
- _bool_configs[CONFIG_SKILL_MILLING] = sConfigMgr->GetOption<bool>("SkillChance.Milling", false);
-
- _int_configs[CONFIG_SKILL_GAIN_CRAFTING] = sConfigMgr->GetOption<int32>("SkillGain.Crafting", 1);
- _int_configs[CONFIG_SKILL_GAIN_DEFENSE] = sConfigMgr->GetOption<int32>("SkillGain.Defense", 1);
-
- _int_configs[CONFIG_SKILL_GAIN_GATHERING] = sConfigMgr->GetOption<int32>("SkillGain.Gathering", 1);
-
- _int_configs[CONFIG_SKILL_GAIN_WEAPON] = sConfigMgr->GetOption<int32>("SkillGain.Weapon", 1);
-
- _int_configs[CONFIG_MAX_OVERSPEED_PINGS] = sConfigMgr->GetOption<int32>("MaxOverspeedPings", 2);
- if (_int_configs[CONFIG_MAX_OVERSPEED_PINGS] != 0 && _int_configs[CONFIG_MAX_OVERSPEED_PINGS] < 2)
- {
- LOG_ERROR("server.loading", "MaxOverspeedPings ({}) must be in range 2..infinity (or 0 to disable check). Set to 2.", _int_configs[CONFIG_MAX_OVERSPEED_PINGS]);
- _int_configs[CONFIG_MAX_OVERSPEED_PINGS] = 2;
- }
-
- _bool_configs[CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY] = sConfigMgr->GetOption<bool>("SaveRespawnTimeImmediately", true);
- _bool_configs[CONFIG_WEATHER] = sConfigMgr->GetOption<bool>("ActivateWeather", true);
-
- _int_configs[CONFIG_DISABLE_BREATHING] = sConfigMgr->GetOption<int32>("DisableWaterBreath", SEC_CONSOLE);
-
- _bool_configs[CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL] = sConfigMgr->GetOption<bool>("AlwaysMaxSkillForLevel", false);
-
- if (reload)
- {
- uint32 val = sConfigMgr->GetOption<int32>("Expansion", 2);
- if (val != _int_configs[CONFIG_EXPANSION])
- LOG_ERROR("server.loading", "Expansion option can't be changed at worldserver.conf reload, using current value ({}).", _int_configs[CONFIG_EXPANSION]);
- }
- else
- _int_configs[CONFIG_EXPANSION] = sConfigMgr->GetOption<int32>("Expansion", 2);
-
- _int_configs[CONFIG_CHATFLOOD_MESSAGE_COUNT] = sConfigMgr->GetOption<int32>("ChatFlood.MessageCount", 10);
- _int_configs[CONFIG_CHATFLOOD_MESSAGE_DELAY] = sConfigMgr->GetOption<int32>("ChatFlood.MessageDelay", 1);
- _int_configs[CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT] = sConfigMgr->GetOption<int32>("ChatFlood.AddonMessageCount", 100);
- _int_configs[CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY] = sConfigMgr->GetOption<int32>("ChatFlood.AddonMessageDelay", 1);
- _int_configs[CONFIG_CHATFLOOD_MUTE_TIME] = sConfigMgr->GetOption<int32>("ChatFlood.MuteTime", 10);
- _bool_configs[CONFIG_CHAT_MUTE_FIRST_LOGIN] = sConfigMgr->GetOption<bool>("Chat.MuteFirstLogin", false);
- _int_configs[CONFIG_CHAT_TIME_MUTE_FIRST_LOGIN] = sConfigMgr->GetOption<int32>("Chat.MuteTimeFirstLogin", 120);
-
- _int_configs[CONFIG_EVENT_ANNOUNCE] = sConfigMgr->GetOption<int32>("Event.Announce", 0);
-
- _float_configs[CONFIG_CREATURE_LEASH_RADIUS] = sConfigMgr->GetOption<float>("CreatureLeashRadius", 30.0f);
- _float_configs[CONFIG_CREATURE_FAMILY_FLEE_ASSISTANCE_RADIUS] = sConfigMgr->GetOption<float>("CreatureFamilyFleeAssistanceRadius", 30.0f);
- _float_configs[CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS] = sConfigMgr->GetOption<float>("CreatureFamilyAssistanceRadius", 10.0f);
- _int_configs[CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY] = sConfigMgr->GetOption<int32>("CreatureFamilyAssistanceDelay", 2000);
- _int_configs[CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD] = sConfigMgr->GetOption<int32>("CreatureFamilyAssistancePeriod", 3000);
- _int_configs[CONFIG_CREATURE_FAMILY_FLEE_DELAY] = sConfigMgr->GetOption<int32>("CreatureFamilyFleeDelay", 7000);
-
- _int_configs[CONFIG_WORLD_BOSS_LEVEL_DIFF] = sConfigMgr->GetOption<int32>("WorldBossLevelDiff", 3);
-
- _bool_configs[CONFIG_QUEST_ENABLE_QUEST_TRACKER] = sConfigMgr->GetOption<bool>("Quests.EnableQuestTracker", false);
-
- // note: disable value (-1) will assigned as 0xFFFFFFF, to prevent overflow at calculations limit it to max possible player level MAX_LEVEL(100)
- _int_configs[CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF] = sConfigMgr->GetOption<int32>("Quests.LowLevelHideDiff", 4);
- if (_int_configs[CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF] > MAX_LEVEL)
- _int_configs[CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF] = MAX_LEVEL;
- _int_configs[CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF] = sConfigMgr->GetOption<int32>("Quests.HighLevelHideDiff", 7);
- if (_int_configs[CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF] > MAX_LEVEL)
- _int_configs[CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF] = MAX_LEVEL;
- _bool_configs[CONFIG_QUEST_IGNORE_RAID] = sConfigMgr->GetOption<bool>("Quests.IgnoreRaid", false);
- _bool_configs[CONFIG_QUEST_IGNORE_AUTO_ACCEPT] = sConfigMgr->GetOption<bool>("Quests.IgnoreAutoAccept", false);
- _bool_configs[CONFIG_QUEST_IGNORE_AUTO_COMPLETE] = sConfigMgr->GetOption<bool>("Quests.IgnoreAutoComplete", false);
-
- _int_configs[CONFIG_RANDOM_BG_RESET_HOUR] = sConfigMgr->GetOption<int32>("Battleground.Random.ResetHour", 6);
- if (_int_configs[CONFIG_RANDOM_BG_RESET_HOUR] > 23)
- {
- LOG_ERROR("server.loading", "Battleground.Random.ResetHour ({}) can't be load. Set to 6.", _int_configs[CONFIG_RANDOM_BG_RESET_HOUR]);
- _int_configs[CONFIG_RANDOM_BG_RESET_HOUR] = 6;
- }
-
- _int_configs[CONFIG_CALENDAR_DELETE_OLD_EVENTS_HOUR] = sConfigMgr->GetOption<int32>("Calendar.DeleteOldEventsHour", 6);
- if (_int_configs[CONFIG_CALENDAR_DELETE_OLD_EVENTS_HOUR] > 23 || int32(_int_configs[CONFIG_CALENDAR_DELETE_OLD_EVENTS_HOUR]) < 0)
- {
- LOG_ERROR("server.loading", "Calendar.DeleteOldEventsHour ({}) can't be load. Set to 6.", _int_configs[CONFIG_CALENDAR_DELETE_OLD_EVENTS_HOUR]);
- _int_configs[CONFIG_CALENDAR_DELETE_OLD_EVENTS_HOUR] = 6;
- }
-
- _int_configs[CONFIG_GUILD_RESET_HOUR] = sConfigMgr->GetOption<int32>("Guild.ResetHour", 6);
- if (_int_configs[CONFIG_GUILD_RESET_HOUR] > 23)
- {
- LOG_ERROR("server.loading", "Guild.ResetHour ({}) can't be load. Set to 6.", _int_configs[CONFIG_GUILD_RESET_HOUR]);
- _int_configs[CONFIG_GUILD_RESET_HOUR] = 6;
- }
-
- _int_configs[CONFIG_GUILD_BANK_INITIAL_TABS] = sConfigMgr->GetOption<int32>("Guild.BankInitialTabs", 0);
- _int_configs[CONFIG_GUILD_BANK_TAB_COST_0] = sConfigMgr->GetOption<int32>("Guild.BankTabCost0", 1000000);
- _int_configs[CONFIG_GUILD_BANK_TAB_COST_1] = sConfigMgr->GetOption<int32>("Guild.BankTabCost1", 2500000);
- _int_configs[CONFIG_GUILD_BANK_TAB_COST_2] = sConfigMgr->GetOption<int32>("Guild.BankTabCost2", 5000000);
- _int_configs[CONFIG_GUILD_BANK_TAB_COST_3] = sConfigMgr->GetOption<int32>("Guild.BankTabCost3", 10000000);
- _int_configs[CONFIG_GUILD_BANK_TAB_COST_4] = sConfigMgr->GetOption<int32>("Guild.BankTabCost4", 25000000);
- _int_configs[CONFIG_GUILD_BANK_TAB_COST_5] = sConfigMgr->GetOption<int32>("Guild.BankTabCost5", 50000000);
-
- _int_configs[CONFIG_GUILD_MEMBER_LIMIT] = sConfigMgr->GetOption<uint32>("Guild.MemberLimit", 0);
-
- _bool_configs[CONFIG_DETECT_POS_COLLISION] = sConfigMgr->GetOption<bool>("DetectPosCollision", true);
-
- _bool_configs[CONFIG_RESTRICTED_LFG_CHANNEL] = sConfigMgr->GetOption<bool>("Channel.RestrictedLfg", true);
- _bool_configs[CONFIG_SILENTLY_GM_JOIN_TO_CHANNEL] = sConfigMgr->GetOption<bool>("Channel.SilentlyGMJoin", false);
-
- _bool_configs[CONFIG_TALENTS_INSPECTING] = sConfigMgr->GetOption<bool>("TalentsInspecting", true);
- _bool_configs[CONFIG_CHAT_FAKE_MESSAGE_PREVENTING] = sConfigMgr->GetOption<bool>("ChatFakeMessagePreventing", true);
- _int_configs[CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY] = sConfigMgr->GetOption<int32>("ChatStrictLinkChecking.Severity", 0);
- _int_configs[CONFIG_CHAT_STRICT_LINK_CHECKING_KICK] = sConfigMgr->GetOption<int32>("ChatStrictLinkChecking.Kick", 0);
-
- _int_configs[CONFIG_CORPSE_DECAY_NORMAL] = sConfigMgr->GetOption<int32>("Corpse.Decay.NORMAL", 60);
- _int_configs[CONFIG_CORPSE_DECAY_RARE] = sConfigMgr->GetOption<int32>("Corpse.Decay.RARE", 300);
- _int_configs[CONFIG_CORPSE_DECAY_ELITE] = sConfigMgr->GetOption<int32>("Corpse.Decay.ELITE", 300);
- _int_configs[CONFIG_CORPSE_DECAY_RAREELITE] = sConfigMgr->GetOption<int32>("Corpse.Decay.RAREELITE", 300);
- _int_configs[CONFIG_CORPSE_DECAY_WORLDBOSS] = sConfigMgr->GetOption<int32>("Corpse.Decay.WORLDBOSS", 3600);
-
- _int_configs[CONFIG_DEATH_SICKNESS_LEVEL] = sConfigMgr->GetOption<int32> ("Death.SicknessLevel", 11);
- _bool_configs[CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP] = sConfigMgr->GetOption<bool>("Death.CorpseReclaimDelay.PvP", true);
- _bool_configs[CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE] = sConfigMgr->GetOption<bool>("Death.CorpseReclaimDelay.PvE", true);
- _bool_configs[CONFIG_DEATH_BONES_WORLD] = sConfigMgr->GetOption<bool>("Death.Bones.World", true);
- _bool_configs[CONFIG_DEATH_BONES_BG_OR_ARENA] = sConfigMgr->GetOption<bool>("Death.Bones.BattlegroundOrArena", true);
-
- _bool_configs[CONFIG_DIE_COMMAND_MODE] = sConfigMgr->GetOption<bool>("Die.Command.Mode", true);
-
- // always use declined names in the russian client
- _bool_configs[CONFIG_DECLINED_NAMES_USED] =
- (_int_configs[CONFIG_REALM_ZONE] == REALM_ZONE_RUSSIAN) ? true : sConfigMgr->GetOption<bool>("DeclinedNames", false);
-
- _float_configs[CONFIG_LISTEN_RANGE_SAY] = sConfigMgr->GetOption<float>("ListenRange.Say", 25.0f);
- _float_configs[CONFIG_LISTEN_RANGE_TEXTEMOTE] = sConfigMgr->GetOption<float>("ListenRange.TextEmote", 25.0f);
- _float_configs[CONFIG_LISTEN_RANGE_YELL] = sConfigMgr->GetOption<float>("ListenRange.Yell", 300.0f);
-
- _int_configs[CONFIG_BATTLEGROUND_OVERRIDE_LOWLEVELS_MINPLAYERS] = sConfigMgr->GetOption<uint32>("Battleground.Override.LowLevels.MinPlayers", 0);
- _bool_configs[CONFIG_BATTLEGROUND_DISABLE_QUEST_SHARE_IN_BG] = sConfigMgr->GetOption<bool>("Battleground.DisableQuestShareInBG", false);
- _bool_configs[CONFIG_BATTLEGROUND_DISABLE_READY_CHECK_IN_BG] = sConfigMgr->GetOption<bool>("Battleground.DisableReadyCheckInBG", false);
- _bool_configs[CONFIG_BATTLEGROUND_CAST_DESERTER] = sConfigMgr->GetOption<bool>("Battleground.CastDeserter", true);
- _bool_configs[CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE] = sConfigMgr->GetOption<bool>("Battleground.QueueAnnouncer.Enable", false);
- _int_configs[CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_LIMIT_MIN_LEVEL] = sConfigMgr->GetOption<uint32>("Battleground.QueueAnnouncer.Limit.MinLevel", 0);
- _int_configs[CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_LIMIT_MIN_PLAYERS] = sConfigMgr->GetOption<uint32>("Battleground.QueueAnnouncer.Limit.MinPlayers", 3);
- _int_configs[CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_SPAM_DELAY] = sConfigMgr->GetOption<uint32>("Battleground.QueueAnnouncer.SpamProtection.Delay", 30);
- _bool_configs[CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY] = sConfigMgr->GetOption<bool>("Battleground.QueueAnnouncer.PlayerOnly", false);
- _bool_configs[CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_TIMED] = sConfigMgr->GetOption<bool>("Battleground.QueueAnnouncer.Timed", false);
- _int_configs[CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_TIMER] = sConfigMgr->GetOption<uint32>("Battleground.QueueAnnouncer.Timer", 30000);
- _bool_configs[CONFIG_BATTLEGROUND_STORE_STATISTICS_ENABLE] = sConfigMgr->GetOption<bool>("Battleground.StoreStatistics.Enable", false);
- _bool_configs[CONFIG_BATTLEGROUND_TRACK_DESERTERS] = sConfigMgr->GetOption<bool>("Battleground.TrackDeserters.Enable", false);
- _int_configs[CONFIG_BATTLEGROUND_PREMATURE_FINISH_TIMER] = sConfigMgr->GetOption<int32> ("Battleground.PrematureFinishTimer", 5 * MINUTE * IN_MILLISECONDS);
- _int_configs[CONFIG_BATTLEGROUND_INVITATION_TYPE] = sConfigMgr->GetOption<int32>("Battleground.InvitationType", 0);
- _int_configs[CONFIG_BATTLEGROUND_PREMADE_GROUP_WAIT_FOR_MATCH] = sConfigMgr->GetOption<int32> ("Battleground.PremadeGroupWaitForMatch", 30 * MINUTE * IN_MILLISECONDS);
- _bool_configs[CONFIG_BG_XP_FOR_KILL] = sConfigMgr->GetOption<bool>("Battleground.GiveXPForKills", false);
- _int_configs[CONFIG_BATTLEGROUND_REPORT_AFK_TIMER] = sConfigMgr->GetOption<int32>("Battleground.ReportAFK.Timer", 4);
- _int_configs[CONFIG_BATTLEGROUND_REPORT_AFK] = sConfigMgr->GetOption<int32>("Battleground.ReportAFK", 3);
- if (_int_configs[CONFIG_BATTLEGROUND_REPORT_AFK] < 1)
- {
- LOG_ERROR("server.loading", "Battleground.ReportAFK ({}) must be >0. Using 3 instead.", _int_configs[CONFIG_BATTLEGROUND_REPORT_AFK]);
- _int_configs[CONFIG_BATTLEGROUND_REPORT_AFK] = 3;
- }
- else if (_int_configs[CONFIG_BATTLEGROUND_REPORT_AFK] > 9)
- {
- LOG_ERROR("server.loading", "Battleground.ReportAFK ({}) must be <10. Using 3 instead.", _int_configs[CONFIG_BATTLEGROUND_REPORT_AFK]);
- _int_configs[CONFIG_BATTLEGROUND_REPORT_AFK] = 3;
- }
- _int_configs[CONFIG_BATTLEGROUND_PLAYER_RESPAWN] = sConfigMgr->GetOption<int32>("Battleground.PlayerRespawn", 30);
- if (_int_configs[CONFIG_BATTLEGROUND_PLAYER_RESPAWN] < 3)
- {
- LOG_ERROR("server.loading", "Battleground.PlayerRespawn ({}) must be >2. Using 30 instead.", _int_configs[CONFIG_BATTLEGROUND_PLAYER_RESPAWN]);
- _int_configs[CONFIG_BATTLEGROUND_PLAYER_RESPAWN] = 30;
- }
- _int_configs[CONFIG_BATTLEGROUND_RESTORATION_BUFF_RESPAWN] = sConfigMgr->GetOption<int32>("Battleground.RestorationBuffRespawn", 20);
- if (_int_configs[CONFIG_BATTLEGROUND_RESTORATION_BUFF_RESPAWN] < 1)
- {
- LOG_ERROR("server.loading", "Battleground.RestorationBuffRespawn ({}) must be > 0. Using 20 instead.", _int_configs[CONFIG_BATTLEGROUND_RESTORATION_BUFF_RESPAWN]);
- _int_configs[CONFIG_BATTLEGROUND_RESTORATION_BUFF_RESPAWN] = 20;
- }
- _int_configs[CONFIG_BATTLEGROUND_BERSERKING_BUFF_RESPAWN] = sConfigMgr->GetOption<int32>("Battleground.BerserkingBuffRespawn", 120);
- if (_int_configs[CONFIG_BATTLEGROUND_BERSERKING_BUFF_RESPAWN] < 1)
- {
- LOG_ERROR("server.loading", "Battleground.BerserkingBuffRespawn ({}) must be > 0. Using 120 instead.", _int_configs[CONFIG_BATTLEGROUND_BERSERKING_BUFF_RESPAWN]);
- _int_configs[CONFIG_BATTLEGROUND_BERSERKING_BUFF_RESPAWN] = 120;
- }
- _int_configs[CONFIG_BATTLEGROUND_SPEED_BUFF_RESPAWN] = sConfigMgr->GetOption<int32>("Battleground.SpeedBuffRespawn", 150);
- if (_int_configs[CONFIG_BATTLEGROUND_SPEED_BUFF_RESPAWN] < 1)
- {
- LOG_ERROR("server.loading", "Battleground.SpeedBuffRespawn ({}) must be > 0. Using 150 instead.", _int_configs[CONFIG_BATTLEGROUND_SPEED_BUFF_RESPAWN]);
- _int_configs[CONFIG_BATTLEGROUND_SPEED_BUFF_RESPAWN] = 150;
- }
-
- _int_configs[CONFIG_BATTLEGROUND_WARSONG_FLAGS] = sConfigMgr->GetOption<uint32>("Battleground.Warsong.Flags", 3);
- _int_configs[CONFIG_BATTLEGROUND_ARATHI_CAPTUREPOINTS] = sConfigMgr->GetOption<uint32>("Battleground.Arathi.CapturePoints", 1600);
- _int_configs[CONFIG_BATTLEGROUND_ALTERAC_REINFORCEMENTS] = sConfigMgr->GetOption<uint32>("Battleground.Alterac.Reinforcements", 600);
- _int_configs[CONFIG_BATTLEGROUND_ALTERAC_REP_ONBOSSDEATH] = sConfigMgr->GetOption<uint32>("Battleground.Alterac.ReputationOnBossDeath", 350);
- _int_configs[CONFIG_BATTLEGROUND_EYEOFTHESTORM_CAPTUREPOINTS] = sConfigMgr->GetOption<uint32>("Battleground.EyeOfTheStorm.CapturePoints", 1600);
-
- _int_configs[CONFIG_ARENA_MAX_RATING_DIFFERENCE] = sConfigMgr->GetOption<uint32>("Arena.MaxRatingDifference", 150);
- _int_configs[CONFIG_ARENA_RATING_DISCARD_TIMER] = sConfigMgr->GetOption<uint32>("Arena.RatingDiscardTimer", 10 * MINUTE * IN_MILLISECONDS);
- _int_configs[CONFIG_ARENA_PREV_OPPONENTS_DISCARD_TIMER] = sConfigMgr->GetOption<uint32>("Arena.PreviousOpponentsDiscardTimer", 2 * MINUTE * IN_MILLISECONDS);
- _bool_configs[CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS] = sConfigMgr->GetOption<bool>("Arena.AutoDistributePoints", false);
- _int_configs[CONFIG_ARENA_AUTO_DISTRIBUTE_INTERVAL_DAYS] = sConfigMgr->GetOption<uint32>("Arena.AutoDistributeInterval", 7); // pussywizard: spoiled by implementing constant day and hour, always 7 now
- _int_configs[CONFIG_ARENA_GAMES_REQUIRED] = sConfigMgr->GetOption<uint32>("Arena.GamesRequired", 10);
- _int_configs[CONFIG_ARENA_START_RATING] = sConfigMgr->GetOption<uint32>("Arena.ArenaStartRating", 0);
- _int_configs[CONFIG_LEGACY_ARENA_POINTS_CALC] = sConfigMgr->GetOption<uint32>("Arena.LegacyArenaPoints", 0);
- _int_configs[CONFIG_ARENA_START_PERSONAL_RATING] = sConfigMgr->GetOption<uint32>("Arena.ArenaStartPersonalRating", 0);
- _int_configs[CONFIG_ARENA_START_MATCHMAKER_RATING] = sConfigMgr->GetOption<uint32>("Arena.ArenaStartMatchmakerRating", 1500);
- _float_configs[CONFIG_ARENA_WIN_RATING_MODIFIER_1] = sConfigMgr->GetOption<float>("Arena.ArenaWinRatingModifier1", 48.0f);
- _float_configs[CONFIG_ARENA_WIN_RATING_MODIFIER_2] = sConfigMgr->GetOption<float>("Arena.ArenaWinRatingModifier2", 24.0f);
- _float_configs[CONFIG_ARENA_LOSE_RATING_MODIFIER] = sConfigMgr->GetOption<float>("Arena.ArenaLoseRatingModifier", 24.0f);
- _float_configs[CONFIG_ARENA_MATCHMAKER_RATING_MODIFIER] = sConfigMgr->GetOption<float>("Arena.ArenaMatchmakerRatingModifier", 24.0f);
- _bool_configs[CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE] = sConfigMgr->GetOption<bool>("Arena.QueueAnnouncer.Enable", false);
- _bool_configs[CONFIG_ARENA_QUEUE_ANNOUNCER_PLAYERONLY] = sConfigMgr->GetOption<bool>("Arena.QueueAnnouncer.PlayerOnly", false);
- _int_configs[CONFIG_ARENA_QUEUE_ANNOUNCER_DETAIL] = sConfigMgr->GetOption<uint32>("Arena.QueueAnnouncer.Detail", 3);
-
- _bool_configs[CONFIG_OFFHAND_CHECK_AT_SPELL_UNLEARN] = sConfigMgr->GetOption<bool>("OffhandCheckAtSpellUnlearn", true);
- _int_configs[CONFIG_CREATURE_STOP_FOR_PLAYER] = sConfigMgr->GetOption<uint32>("Creature.MovingStopTimeForPlayer", 3 * MINUTE * IN_MILLISECONDS);
-
- _int_configs[CONFIG_WATER_BREATH_TIMER] = sConfigMgr->GetOption<uint32>("WaterBreath.Timer", 180000);
- if (_int_configs[CONFIG_WATER_BREATH_TIMER] <= 0)
- {
- LOG_ERROR("server.loading", "WaterBreath.Timer ({}) must be > 0. Using 180000 instead.", _int_configs[CONFIG_WATER_BREATH_TIMER]);
- _int_configs[CONFIG_WATER_BREATH_TIMER] = 180000;
+ _timers[WUPDATE_AUTOBROADCAST].SetInterval(getIntConfig(CONFIG_AUTOBROADCAST_INTERVAL));
+ _timers[WUPDATE_AUTOBROADCAST].Reset();
}
- if (int32 clientCacheId = sConfigMgr->GetOption<int32>("ClientCacheVersion", 0))
+ if (getIntConfig(CONFIG_CLIENTCACHE_VERSION) == 0)
{
- // overwrite DB/old value
- if (clientCacheId > 0)
- {
- _int_configs[CONFIG_CLIENTCACHE_VERSION] = clientCacheId;
- LOG_INFO("server.loading", "Client cache version set to: {}", clientCacheId);
- }
- else
- LOG_ERROR("server.loading", "ClientCacheVersion can't be negative {}, ignored.", clientCacheId);
+ _worldConfig.OverwriteConfigValue<uint32>(CONFIG_CLIENTCACHE_VERSION, _dbClientCacheVersion);
+ LOG_INFO("server.loading", "Client cache version set to: {}", _dbClientCacheVersion);
}
- _int_configs[CONFIG_INSTANT_LOGOUT] = sConfigMgr->GetOption<int32>("InstantLogout", SEC_MODERATOR);
-
- _int_configs[CONFIG_GUILD_EVENT_LOG_COUNT] = sConfigMgr->GetOption<int32>("Guild.EventLogRecordsCount", GUILD_EVENTLOG_MAX_RECORDS);
- if (_int_configs[CONFIG_GUILD_EVENT_LOG_COUNT] > GUILD_EVENTLOG_MAX_RECORDS)
- _int_configs[CONFIG_GUILD_EVENT_LOG_COUNT] = GUILD_EVENTLOG_MAX_RECORDS;
- _int_configs[CONFIG_GUILD_BANK_EVENT_LOG_COUNT] = sConfigMgr->GetOption<int32>("Guild.BankEventLogRecordsCount", GUILD_BANKLOG_MAX_RECORDS);
- if (_int_configs[CONFIG_GUILD_BANK_EVENT_LOG_COUNT] > GUILD_BANKLOG_MAX_RECORDS)
- _int_configs[CONFIG_GUILD_BANK_EVENT_LOG_COUNT] = GUILD_BANKLOG_MAX_RECORDS;
-
//visibility on continents
_maxVisibleDistanceOnContinents = sConfigMgr->GetOption<float>("Visibility.Distance.Continents", DEFAULT_VISIBILITY_DISTANCE);
if (_maxVisibleDistanceOnContinents < 45 * sWorld->getRate(RATE_CREATURE_AGGRO))
@@ -1026,46 +254,8 @@ void World::LoadConfigSettings(bool reload)
_maxVisibleDistanceInBGArenas = MAX_VISIBILITY_DISTANCE;
}
- ///- Load the CharDelete related config options
- _int_configs[CONFIG_CHARDELETE_METHOD] = sConfigMgr->GetOption<int32>("CharDelete.Method", 0);
- _int_configs[CONFIG_CHARDELETE_MIN_LEVEL] = sConfigMgr->GetOption<int32>("CharDelete.MinLevel", 0);
- _int_configs[CONFIG_CHARDELETE_KEEP_DAYS] = sConfigMgr->GetOption<int32>("CharDelete.KeepDays", 30);
-
- ///- Load the ItemDelete related config options
- _bool_configs[CONFIG_ITEMDELETE_METHOD] = sConfigMgr->GetOption<bool>("ItemDelete.Method", 0);
- _bool_configs[CONFIG_ITEMDELETE_VENDOR] = sConfigMgr->GetOption<bool>("ItemDelete.Vendor", 0);
- _int_configs[CONFIG_ITEMDELETE_QUALITY] = sConfigMgr->GetOption<int32>("ItemDelete.Quality", 3);
- _int_configs[CONFIG_ITEMDELETE_ITEM_LEVEL] = sConfigMgr->GetOption<int32>("ItemDelete.ItemLevel", 80);
- _int_configs[CONFIG_ITEMDELETE_KEEP_DAYS] = sConfigMgr->GetOption<int32>("ItemDelete.KeepDays", 0);
-
- _int_configs[CONFIG_FFA_PVP_TIMER] = sConfigMgr->GetOption<int32>("FFAPvPTimer", 30);
-
- _int_configs[CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION] = sConfigMgr->GetOption<int32>("LootNeedBeforeGreedILvlRestriction", 70);
-
- _bool_configs[CONFIG_PLAYER_SETTINGS_ENABLED] = sConfigMgr->GetOption<bool>("EnablePlayerSettings", 0);
-
- _bool_configs[CONFIG_ALLOW_JOIN_BG_AND_LFG] = sConfigMgr->GetOption<bool>("JoinBGAndLFG.Enable", false);
-
- _bool_configs[CONFIG_LEAVE_GROUP_ON_LOGOUT] = sConfigMgr->GetOption<bool>("LeaveGroupOnLogout.Enabled", false);
-
- _bool_configs[CONFIG_QUEST_POI_ENABLED] = sConfigMgr->GetOption<bool>("QuestPOI.Enabled", true);
-
- _int_configs[CONFIG_CHANGE_FACTION_MAX_MONEY] = sConfigMgr->GetOption<uint32>("ChangeFaction.MaxMoney", 0);
-
- _bool_configs[CONFIG_ALLOWS_RANK_MOD_FOR_PET_HEALTH] = sConfigMgr->GetOption<bool>("Pet.RankMod.Health", true);
-
- _bool_configs[CONFIG_MUNCHING_BLIZZLIKE] = sConfigMgr->GetOption<bool>("MunchingBlizzlike.Enabled", true);
-
- _bool_configs[CONFIG_ENABLE_DAZE] = sConfigMgr->GetOption<bool>("Daze.Enabled", true);
-
- _int_configs[CONFIG_DAILY_RBG_MIN_LEVEL_AP_REWARD] = sConfigMgr->GetOption<uint32>("DailyRBGArenaPoints.MinLevel", 71);
-
- // Respawn
- _float_configs[CONFIG_RESPAWN_DYNAMICRATE_CREATURE] = sConfigMgr->GetOption<float>("Respawn.DynamicRateCreature", 1.0f);
- _int_configs[CONFIG_RESPAWN_DYNAMICMINIMUM_CREATURE] = sConfigMgr->GetOption<int32>("Respawn.DynamicMinimumCreature", 10);
-
- _float_configs[CONFIG_RESPAWN_DYNAMICRATE_GAMEOBJECT] = sConfigMgr->GetOption<float>("Respawn.DynamicRateGameObject", 1.0f);
- _int_configs[CONFIG_RESPAWN_DYNAMICMINIMUM_GAMEOBJECT] = sConfigMgr->GetOption<int32>("Respawn.DynamicMinimumGameObject", 10);
+ LOG_INFO("server.loading", "Will clear `logs` table of entries older than {} seconds every {} minutes.",
+ getIntConfig(CONFIG_LOGDB_CLEARTIME), getIntConfig(CONFIG_LOGDB_CLEARINTERVAL));
///- Read the "Data" directory from the config file
std::string dataPath = sConfigMgr->GetOption<std::string>("DataDir", "./");
@@ -1092,14 +282,10 @@ void World::LoadConfigSettings(bool reload)
LOG_INFO("server.loading", "Using DataDir {}", _dataPath);
}
- bool enableIndoor = sConfigMgr->GetOption<bool>("vmap.enableIndoorCheck", true);
- _bool_configs[CONFIG_VMAP_INDOOR_CHECK] = enableIndoor;
- bool enableLOS = sConfigMgr->GetOption<bool>("vmap.enableLOS", true);
- bool enableHeight = sConfigMgr->GetOption<bool>("vmap.enableHeight", true);
- bool enablePetLOS = sConfigMgr->GetOption<bool>("vmap.petLOS", true);
- _bool_configs[CONFIG_VMAP_BLIZZLIKE_PVP_LOS] = sConfigMgr->GetOption<bool>("vmap.BlizzlikePvPLOS", true);
- _bool_configs[CONFIG_VMAP_BLIZZLIKE_LOS_OPEN_WORLD] = sConfigMgr->GetOption<bool>("vmap.BlizzlikeLOSInOpenWorld", true);
-
+ bool const enableIndoor = getBoolConfig(CONFIG_VMAP_INDOOR_CHECK);
+ bool const enableLOS = sConfigMgr->GetOption<bool>("vmap.enableLOS", true);
+ bool const enablePetLOS = getBoolConfig(CONFIG_PET_LOS);
+ bool const enableHeight = sConfigMgr->GetOption<bool>("vmap.enableHeight", true);
if (!enableHeight)
LOG_ERROR("server.loading", "VMap height checking disabled! Creatures movements and other various things WILL be broken! Expect no support.");
@@ -1107,169 +293,8 @@ void World::LoadConfigSettings(bool reload)
VMAP::VMapFactory::createOrGetVMapMgr()->setEnableHeightCalc(enableHeight);
LOG_INFO("server.loading", "WORLD: VMap support included. LineOfSight:{}, getHeight:{}, indoorCheck:{} PetLOS:{}", enableLOS, enableHeight, enableIndoor, enablePetLOS);
- _bool_configs[CONFIG_PET_LOS] = enablePetLOS;
- _bool_configs[CONFIG_START_CUSTOM_SPELLS] = sConfigMgr->GetOption<bool>("PlayerStart.CustomSpells", false);
- _int_configs[CONFIG_HONOR_AFTER_DUEL] = sConfigMgr->GetOption<int32>("HonorPointsAfterDuel", 0);
- _bool_configs[CONFIG_START_ALL_EXPLORED] = sConfigMgr->GetOption<bool>("PlayerStart.MapsExplored", false);
- _bool_configs[CONFIG_START_ALL_REP] = sConfigMgr->GetOption<bool>("PlayerStart.AllReputation", false);
- _bool_configs[CONFIG_ALWAYS_MAXSKILL] = sConfigMgr->GetOption<bool>("AlwaysMaxWeaponSkill", false);
- _bool_configs[CONFIG_PVP_TOKEN_ENABLE] = sConfigMgr->GetOption<bool>("PvPToken.Enable", false);
- _int_configs[CONFIG_PVP_TOKEN_MAP_TYPE] = sConfigMgr->GetOption<int32>("PvPToken.MapAllowType", 4);
- _int_configs[CONFIG_PVP_TOKEN_ID] = sConfigMgr->GetOption<int32>("PvPToken.ItemID", 29434);
- _int_configs[CONFIG_PVP_TOKEN_COUNT] = sConfigMgr->GetOption<int32>("PvPToken.ItemCount", 1);
- if (_int_configs[CONFIG_PVP_TOKEN_COUNT] < 1)
- _int_configs[CONFIG_PVP_TOKEN_COUNT] = 1;
-
- _bool_configs[CONFIG_NO_RESET_TALENT_COST] = sConfigMgr->GetOption<bool>("NoResetTalentsCost", false);
- _int_configs[CONFIG_TOGGLE_XP_COST] = sConfigMgr->GetOption<int32>("ToggleXP.Cost", 100000);
- _bool_configs[CONFIG_SHOW_KICK_IN_WORLD] = sConfigMgr->GetOption<bool>("ShowKickInWorld", false);
- _bool_configs[CONFIG_SHOW_MUTE_IN_WORLD] = sConfigMgr->GetOption<bool>("ShowMuteInWorld", false);
- _bool_configs[CONFIG_SHOW_BAN_IN_WORLD] = sConfigMgr->GetOption<bool>("ShowBanInWorld", false);
- _int_configs[CONFIG_NUMTHREADS] = sConfigMgr->GetOption<int32>("MapUpdate.Threads", 1);
- _int_configs[CONFIG_MAX_RESULTS_LOOKUP_COMMANDS] = sConfigMgr->GetOption<int32>("Command.LookupMaxResults", 0);
-
- // Warden
- _bool_configs[CONFIG_WARDEN_ENABLED] = sConfigMgr->GetOption<bool>("Warden.Enabled", true);
- _int_configs[CONFIG_WARDEN_NUM_MEM_CHECKS] = sConfigMgr->GetOption<int32>("Warden.NumMemChecks", 3);
- _int_configs[CONFIG_WARDEN_NUM_LUA_CHECKS] = sConfigMgr->GetOption<int32>("Warden.NumLuaChecks", 1);
- _int_configs[CONFIG_WARDEN_NUM_OTHER_CHECKS] = sConfigMgr->GetOption<int32>("Warden.NumOtherChecks", 7);
- _int_configs[CONFIG_WARDEN_CLIENT_BAN_DURATION] = sConfigMgr->GetOption<int32>("Warden.BanDuration", 86400);
- _int_configs[CONFIG_WARDEN_CLIENT_CHECK_HOLDOFF] = sConfigMgr->GetOption<int32>("Warden.ClientCheckHoldOff", 30);
- _int_configs[CONFIG_WARDEN_CLIENT_FAIL_ACTION] = sConfigMgr->GetOption<int32>("Warden.ClientCheckFailAction", 0);
- _int_configs[CONFIG_WARDEN_CLIENT_RESPONSE_DELAY] = sConfigMgr->GetOption<int32>("Warden.ClientResponseDelay", 600);
-
- // Dungeon finder
- _int_configs[CONFIG_LFG_OPTIONSMASK] = sConfigMgr->GetOption<int32>("DungeonFinder.OptionsMask", 5);
-
- _bool_configs[CONFIG_LFG_CAST_DESERTER] = sConfigMgr->GetOption<int32>("DungeonFinder.CastDeserter", true);
-
- // DBC_ItemAttributes
- _bool_configs[CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES] = sConfigMgr->GetOption<bool>("DBC.EnforceItemAttributes", true);
-
- // Max instances per hour
- _int_configs[CONFIG_MAX_INSTANCES_PER_HOUR] = sConfigMgr->GetOption<int32>("AccountInstancesPerHour", 5);
-
- // AutoBroadcast
- _bool_configs[CONFIG_AUTOBROADCAST] = sConfigMgr->GetOption<bool>("AutoBroadcast.On", false);
- _int_configs[CONFIG_AUTOBROADCAST_CENTER] = sConfigMgr->GetOption<int32>("AutoBroadcast.Center", 0);
- _int_configs[CONFIG_AUTOBROADCAST_INTERVAL] = sConfigMgr->GetOption<int32>("AutoBroadcast.Timer", 60000);
- _int_configs[CONFIG_AUTOBROADCAST_MIN_LEVEL_DISABLE] = sConfigMgr->GetOption<int32>("AutoBroadcast.MinDisableLevel", 0);
- if (reload)
- {
- _timers[WUPDATE_AUTOBROADCAST].SetInterval(_int_configs[CONFIG_AUTOBROADCAST_INTERVAL]);
- _timers[WUPDATE_AUTOBROADCAST].Reset();
- }
-
- // MySQL ping time interval
- _int_configs[CONFIG_DB_PING_INTERVAL] = sConfigMgr->GetOption<int32>("MaxPingTime", 30);
-
- // misc
- _bool_configs[CONFIG_PDUMP_NO_PATHS] = sConfigMgr->GetOption<bool>("PlayerDump.DisallowPaths", true);
- _bool_configs[CONFIG_PDUMP_NO_OVERWRITE] = sConfigMgr->GetOption<bool>("PlayerDump.DisallowOverwrite", true);
- _bool_configs[CONFIG_ENABLE_MMAPS] = sConfigMgr->GetOption<bool>("MoveMaps.Enable", true);
MMAP::MMapFactory::InitializeDisabledMaps();
- // Wintergrasp
- _int_configs[CONFIG_WINTERGRASP_ENABLE] = sConfigMgr->GetOption<int32>("Wintergrasp.Enable", 1);
- _int_configs[CONFIG_WINTERGRASP_PLR_MAX] = sConfigMgr->GetOption<int32>("Wintergrasp.PlayerMax", 120);
- _int_configs[CONFIG_WINTERGRASP_PLR_MIN] = sConfigMgr->GetOption<int32>("Wintergrasp.PlayerMin", 0);
- _int_configs[CONFIG_WINTERGRASP_PLR_MIN_LVL] = sConfigMgr->GetOption<int32>("Wintergrasp.PlayerMinLvl", 75);
- _int_configs[CONFIG_WINTERGRASP_BATTLETIME] = sConfigMgr->GetOption<int32>("Wintergrasp.BattleTimer", 30);
- _int_configs[CONFIG_WINTERGRASP_NOBATTLETIME] = sConfigMgr->GetOption<int32>("Wintergrasp.NoBattleTimer", 150);
- _int_configs[CONFIG_WINTERGRASP_RESTART_AFTER_CRASH] = sConfigMgr->GetOption<int32>("Wintergrasp.CrashRestartTimer", 10);
-
- _int_configs[CONFIG_BIRTHDAY_TIME] = sConfigMgr->GetOption<int32>("BirthdayTime", 1222964635);
- _bool_configs[CONFIG_MINIGOB_MANABONK] = sConfigMgr->GetOption<bool>("Minigob.Manabonk.Enable", true);
-
- _bool_configs[CONFIG_ENABLE_CONTINENT_TRANSPORT] = sConfigMgr->GetOption<bool>("IsContinentTransport.Enabled", true);
- _bool_configs[CONFIG_ENABLE_CONTINENT_TRANSPORT_PRELOADING] = sConfigMgr->GetOption<bool>("IsPreloadedContinentTransport.Enabled", false);
-
- _bool_configs[CONFIG_IP_BASED_ACTION_LOGGING] = sConfigMgr->GetOption<bool>("Allow.IP.Based.Action.Logging", false);
-
- // Whether to use LoS from game objects
- _bool_configs[CONFIG_CHECK_GOBJECT_LOS] = sConfigMgr->GetOption<bool>("CheckGameObjectLoS", true);
-
- _bool_configs[CONFIG_CALCULATE_CREATURE_ZONE_AREA_DATA] = sConfigMgr->GetOption<bool>("Calculate.Creature.Zone.Area.Data", false);
- _bool_configs[CONFIG_CALCULATE_GAMEOBJECT_ZONE_AREA_DATA] = sConfigMgr->GetOption<bool>("Calculate.Gameoject.Zone.Area.Data", false);
-
- // Player can join LFG anywhere
- _bool_configs[CONFIG_LFG_LOCATION_ALL] = sConfigMgr->GetOption<bool>("LFG.Location.All", false);
-
- // Prevent players AFK from being logged out
- _int_configs[CONFIG_AFK_PREVENT_LOGOUT] = sConfigMgr->GetOption<int32>("PreventAFKLogout", 0);
-
- // Preload all grids of all non-instanced maps
- _bool_configs[CONFIG_PRELOAD_ALL_NON_INSTANCED_MAP_GRIDS] = sConfigMgr->GetOption<bool>("PreloadAllNonInstancedMapGrids", false);
-
- // ICC buff override
- _int_configs[CONFIG_ICC_BUFF_HORDE] = sConfigMgr->GetOption<int32>("ICC.Buff.Horde", 73822);
- _int_configs[CONFIG_ICC_BUFF_ALLIANCE] = sConfigMgr->GetOption<int32>("ICC.Buff.Alliance", 73828);
-
- _bool_configs[CONFIG_SET_ALL_CREATURES_WITH_WAYPOINT_MOVEMENT_ACTIVE] = sConfigMgr->GetOption<bool>("SetAllCreaturesWithWaypointMovementActive", false);
-
- // packet spoof punishment
- _int_configs[CONFIG_PACKET_SPOOF_BANMODE] = sConfigMgr->GetOption<int32>("PacketSpoof.BanMode", (uint32)0);
- if (_int_configs[CONFIG_PACKET_SPOOF_BANMODE] > 1)
- _int_configs[CONFIG_PACKET_SPOOF_BANMODE] = (uint32)0;
-
- _int_configs[CONFIG_PACKET_SPOOF_BANDURATION] = sConfigMgr->GetOption<int32>("PacketSpoof.BanDuration", 86400);
-
- // Random Battleground Rewards
- _int_configs[CONFIG_BG_REWARD_WINNER_HONOR_FIRST] = sConfigMgr->GetOption<int32>("Battleground.RewardWinnerHonorFirst", 30);
- _int_configs[CONFIG_BG_REWARD_WINNER_ARENA_FIRST] = sConfigMgr->GetOption<int32>("Battleground.RewardWinnerArenaFirst", 25);
- _int_configs[CONFIG_BG_REWARD_WINNER_HONOR_LAST] = sConfigMgr->GetOption<int32>("Battleground.RewardWinnerHonorLast", 15);
- _int_configs[CONFIG_BG_REWARD_WINNER_ARENA_LAST] = sConfigMgr->GetOption<int32>("Battleground.RewardWinnerArenaLast", 0);
- _int_configs[CONFIG_BG_REWARD_LOSER_HONOR_FIRST] = sConfigMgr->GetOption<int32>("Battleground.RewardLoserHonorFirst", 5);
- _int_configs[CONFIG_BG_REWARD_LOSER_HONOR_LAST] = sConfigMgr->GetOption<int32>("Battleground.RewardLoserHonorLast", 5);
-
- _int_configs[CONFIG_WAYPOINT_MOVEMENT_STOP_TIME_FOR_PLAYER] = sConfigMgr->GetOption<int32>("WaypointMovementStopTimeForPlayer", 120);
-
- _int_configs[CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE] = sConfigMgr->GetOption<int32>("DungeonAccessRequirements.PrintMode", 1);
- _bool_configs[CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PORTAL_CHECK_ILVL] = sConfigMgr->GetOption<bool>("DungeonAccessRequirements.PortalAvgIlevelCheck", false);
- _bool_configs[CONFIG_DUNGEON_ACCESS_REQUIREMENTS_LFG_DBC_LEVEL_OVERRIDE] = sConfigMgr->GetOption<bool>("DungeonAccessRequirements.LFGLevelDBCOverride", false);
- _int_configs[CONFIG_DUNGEON_ACCESS_REQUIREMENTS_OPTIONAL_STRING_ID] = sConfigMgr->GetOption<int32>("DungeonAccessRequirements.OptionalStringID", 0);
- _int_configs[CONFIG_NPC_EVADE_IF_NOT_REACHABLE] = sConfigMgr->GetOption<int32>("NpcEvadeIfTargetIsUnreachable", 5);
- _int_configs[CONFIG_NPC_REGEN_TIME_IF_NOT_REACHABLE_IN_RAID] = sConfigMgr->GetOption<int32>("NpcRegenHPTimeIfTargetIsUnreachable", 10);
- _bool_configs[CONFIG_REGEN_HP_CANNOT_REACH_TARGET_IN_RAID] = sConfigMgr->GetOption<bool>("NpcRegenHPIfTargetIsUnreachable", true);
-
- //Debug
- _bool_configs[CONFIG_DEBUG_BATTLEGROUND] = sConfigMgr->GetOption<bool>("Debug.Battleground", false);
- _bool_configs[CONFIG_DEBUG_ARENA] = sConfigMgr->GetOption<bool>("Debug.Arena", false);
-
- _int_configs[CONFIG_GM_LEVEL_CHANNEL_MODERATION] = sConfigMgr->GetOption<int32>("Channel.ModerationGMLevel", 1);
-
- _bool_configs[CONFIG_SET_BOP_ITEM_TRADEABLE] = sConfigMgr->GetOption<bool>("Item.SetItemTradeable", true);
-
- // Specifies if IP addresses can be logged to the database
- _bool_configs[CONFIG_ALLOW_LOGGING_IP_ADDRESSES_IN_DATABASE] = sConfigMgr->GetOption<bool>("AllowLoggingIPAddressesInDatabase", true, true);
-
- // LFG group mechanics.
- _int_configs[CONFIG_LFG_MAX_KICK_COUNT] = sConfigMgr->GetOption<int32>("LFG.MaxKickCount", 2);
- if (_int_configs[CONFIG_LFG_MAX_KICK_COUNT] > 3)
- {
- _int_configs[CONFIG_LFG_MAX_KICK_COUNT] = 3;
- LOG_ERROR("server.loading", "LFG.MaxKickCount can't be higher than 3.");
- }
-
- _int_configs[CONFIG_LFG_KICK_PREVENTION_TIMER] = sConfigMgr->GetOption<int32>("LFG.KickPreventionTimer", 15 * MINUTE * IN_MILLISECONDS) * IN_MILLISECONDS;
- if (_int_configs[CONFIG_LFG_KICK_PREVENTION_TIMER] > 15 * MINUTE * IN_MILLISECONDS)
- {
- _int_configs[CONFIG_LFG_KICK_PREVENTION_TIMER] = 15 * MINUTE * IN_MILLISECONDS;
- LOG_ERROR("server.loading", "LFG.KickPreventionTimer can't be higher than 15 minutes.");
- }
-
- // Realm Availability
- _bool_configs[CONFIG_REALM_LOGIN_ENABLED] = sConfigMgr->GetOption<bool>("World.RealmAvailability", true);
-
- // AH Worker threads
- _int_configs[CONFIG_AUCTIONHOUSE_WORKERTHREADS] = sConfigMgr->GetOption<int32>("AuctionHouse.WorkerThreads", 1);
-
- // SpellQueue
- _bool_configs[CONFIG_SPELL_QUEUE_ENABLED] = sConfigMgr->GetOption<bool>("SpellQueue.Enabled", true);
- _int_configs[CONFIG_SPELL_QUEUE_WINDOW] = sConfigMgr->GetOption<uint32>("SpellQueue.Window", 400);
-
- _int_configs[CONFIG_SUNSREACH_COUNTER_MAX] = sConfigMgr->GetOption<uint32>("Sunsreach.CounterMax", 10000);
-
// call ScriptMgr if we're reloading the configuration
sScriptMgr->OnAfterConfigLoad(reload);
}
@@ -1309,7 +334,7 @@ void World::SetInitialWorldSettings()
|| !MapMgr::ExistMapAndVMap(MAP_EASTERN_KINGDOMS, 1676.35f, 1677.45f)
|| !MapMgr::ExistMapAndVMap(MAP_KALIMDOR, 10311.3f, 832.463f)
|| !MapMgr::ExistMapAndVMap(MAP_KALIMDOR, -2917.58f, -257.98f)
- || (_int_configs[CONFIG_EXPANSION] && (
+ || (getIntConfig(CONFIG_EXPANSION) && (
!MapMgr::ExistMapAndVMap(MAP_OUTLAND, 10349.6f, -6357.29f) ||
!MapMgr::ExistMapAndVMap(MAP_OUTLAND, -3961.64f, -13931.2f))))
{
@@ -1860,12 +885,12 @@ void World::SetInitialWorldSettings()
LoginDatabase.Execute(stmt);
_timers[WUPDATE_WEATHERS].SetInterval(1 * IN_MILLISECONDS);
- _timers[WUPDATE_UPTIME].SetInterval(_int_configs[CONFIG_UPTIME_UPDATE]*MINUTE * IN_MILLISECONDS);
+ _timers[WUPDATE_UPTIME].SetInterval(getIntConfig(CONFIG_UPTIME_UPDATE)*MINUTE * IN_MILLISECONDS);
//Update "uptime" table based on configuration entry in minutes.
_timers[WUPDATE_CORPSES].SetInterval(20 * MINUTE * IN_MILLISECONDS);
//erase corpses every 20 minutes
- _timers[WUPDATE_CLEANDB].SetInterval(_int_configs[CONFIG_LOGDB_CLEARINTERVAL]*MINUTE * IN_MILLISECONDS);
+ _timers[WUPDATE_CLEANDB].SetInterval(getIntConfig(CONFIG_LOGDB_CLEARINTERVAL)*MINUTE * IN_MILLISECONDS);
// clean logs table every 14 days by default
_timers[WUPDATE_AUTOBROADCAST].SetInterval(getIntConfig(CONFIG_AUTOBROADCAST_INTERVAL));
@@ -2303,6 +1328,58 @@ void World::Update(uint32 diff)
}
}
+// Internally uses setFloatConfig. Retained for backwards compatibility
+void World::setRate(ServerConfigs index, float value)
+{
+ setFloatConfig(index, value);
+}
+
+// Internally uses getFloatConfig. Retained for backwards compatibility
+float World::getRate(ServerConfigs index) const
+{
+ return getFloatConfig(index);
+}
+
+void World::setBoolConfig(ServerConfigs index, bool value)
+{
+ _worldConfig.OverwriteConfigValue<bool>(index, value);
+}
+
+bool World::getBoolConfig(ServerConfigs index) const
+{
+ return _worldConfig.GetConfigValue<bool>(index);
+}
+
+void World::setFloatConfig(ServerConfigs index, float value)
+{
+ _worldConfig.OverwriteConfigValue<float>(index, value);
+}
+
+float World::getFloatConfig(ServerConfigs index) const
+{
+ return _worldConfig.GetConfigValue<float>(index);
+}
+
+void World::setIntConfig(ServerConfigs index, uint32 value)
+{
+ _worldConfig.OverwriteConfigValue<uint32>(index, value);
+}
+
+uint32 World::getIntConfig(ServerConfigs index) const
+{
+ return _worldConfig.GetConfigValue<uint32>(index);
+}
+
+void World::setStringConfig(ServerConfigs index, std::string const& value)
+{
+ _worldConfig.OverwriteConfigValue<std::string>(index, value);
+}
+
+std::string_view World::getStringConfig(ServerConfigs index) const
+{
+ return _worldConfig.GetConfigValue(index);
+}
+
void World::ForceGameEventUpdate()
{
_timers[WUPDATE_EVENTS].Reset(); // to give time for Update() to be processed
@@ -2716,7 +1793,7 @@ void World::LoadDBVersion()
_dbVersion = fields[0].Get<std::string>();
// will be overwrite by config values if different and non-0
- _int_configs[CONFIG_CLIENTCACHE_VERSION] = fields[1].Get<uint32>();
+ _dbClientCacheVersion = fields[1].Get<uint32>();
}
if (_dbVersion.empty())
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index 8fdcd815ee..2b8310efe5 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -160,11 +160,6 @@ public:
/// Allow/Disallow object movements
void SetAllowMovement(bool allow) override { _allowMovement = allow; }
- /// Set the string for new characters (first login)
- void SetNewCharString(std::string const& str) override { _newCharString = str; }
- /// Get the string for new characters (first login)
- [[nodiscard]] std::string const& GetNewCharString() const override { return _newCharString; }
-
[[nodiscard]] LocaleConstant GetDefaultDbcLocale() const override { return _defaultDbcLocale; }
/// Get the path where data (dbc, maps) are stored on disk
@@ -197,49 +192,20 @@ public:
void Update(uint32 diff) override;
- /// Set a server rate (see #Rates)
- void setRate(Rates rate, float value) override { _rate_values[rate] = value; }
- /// Get a server rate (see #Rates)
- [[nodiscard]] float getRate(Rates rate) const override { return _rate_values[rate]; }
+ void setRate(ServerConfigs index, float value) override;
+ float getRate(ServerConfigs index) const override;
- /// Set a server configuration element (see #WorldConfigs)
- void setBoolConfig(WorldBoolConfigs index, bool value) override
- {
- if (index < BOOL_CONFIG_VALUE_COUNT)
- _bool_configs[index] = value;
- }
+ void setBoolConfig(ServerConfigs index, bool value) override;
+ bool getBoolConfig(ServerConfigs index) const override;
- /// Get a server configuration element (see #WorldConfigs)
- [[nodiscard]] bool getBoolConfig(WorldBoolConfigs index) const override
- {
- return index < BOOL_CONFIG_VALUE_COUNT ? _bool_configs[index] : false;
- }
+ void setFloatConfig(ServerConfigs index, float value) override;
+ float getFloatConfig(ServerConfigs index) const override;
- /// Set a server configuration element (see #WorldConfigs)
- void setFloatConfig(WorldFloatConfigs index, float value) override
- {
- if (index < FLOAT_CONFIG_VALUE_COUNT)
- _float_configs[index] = value;
- }
+ void setIntConfig(ServerConfigs index, uint32 value) override;
+ uint32 getIntConfig(ServerConfigs index) const override;
- /// Get a server configuration element (see #WorldConfigs)
- [[nodiscard]] float getFloatConfig(WorldFloatConfigs index) const override
- {
- return index < FLOAT_CONFIG_VALUE_COUNT ? _float_configs[index] : 0;
- }
-
- /// Set a server configuration element (see #WorldConfigs)
- void setIntConfig(WorldIntConfigs index, uint32 value) override
- {
- if (index < INT_CONFIG_VALUE_COUNT)
- _int_configs[index] = value;
- }
-
- /// Get a server configuration element (see #WorldConfigs)
- [[nodiscard]] uint32 getIntConfig(WorldIntConfigs index) const override
- {
- return index < INT_CONFIG_VALUE_COUNT ? _int_configs[index] : 0;
- }
+ void setStringConfig(ServerConfigs index, std::string const& value) override;
+ std::string_view getStringConfig(ServerConfigs index) const override;
/// Are we on a "Player versus Player" server?
[[nodiscard]] bool IsPvPRealm() const override;
@@ -295,6 +261,8 @@ protected:
void CalendarDeleteOldEvents();
void ResetGuildCap();
private:
+ WorldConfig _worldConfig;
+
static std::atomic_long _stopEvent;
static uint8 _exitCode;
uint32 _shutdownTimer;
@@ -308,12 +276,6 @@ private:
IntervalTimer _timers[WUPDATE_COUNT];
Seconds _mail_expire_check_timer;
- std::string _newCharString;
-
- float _rate_values[MAX_RATES];
- uint32 _int_configs[INT_CONFIG_VALUE_COUNT];
- bool _bool_configs[BOOL_CONFIG_VALUE_COUNT];
- float _float_configs[FLOAT_CONFIG_VALUE_COUNT];
AccountTypes _allowedSecurityLevel;
LocaleConstant _defaultDbcLocale; // from config for one from loaded DBC locales
uint32 _availableDbcLocaleMask; // by loaded DBC
@@ -341,6 +303,7 @@ private:
// used versions
std::string _dbVersion;
+ uint32 _dbClientCacheVersion;
void ProcessQueryCallbacks();
QueryCallbackProcessor _queryProcessor;
diff --git a/src/server/game/World/WorldConfig.cpp b/src/server/game/World/WorldConfig.cpp
new file mode 100644
index 0000000000..1af0672c34
--- /dev/null
+++ b/src/server/game/World/WorldConfig.cpp
@@ -0,0 +1,658 @@
+/*
+ * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation; either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "Player.h"
+#include "WorldConfig.h"
+
+void WorldConfig::BuildConfigCache()
+{
+ SetConfigValue<bool>(CONFIG_ALLOW_TICKETS, "AllowTickets", true);
+ SetConfigValue<bool>(CONFIG_DELETE_CHARACTER_TICKET_TRACE, "DeletedCharacterTicketTrace", false);
+
+ ///- Send server info on login?
+ SetConfigValue<uint32>(CONFIG_ENABLE_SINFO_LOGIN, "Server.LoginInfo", 0);
+
+ ///- Read all rates from the config file
+ SetConfigValue<float>(RATE_HEALTH, "Rate.Health", 1, ConfigValueCache::Reloadable::Yes, [](float const& value) { return value > 0; }, "> 0");
+ SetConfigValue<float>(RATE_POWER_MANA, "Rate.Mana", 1, ConfigValueCache::Reloadable::Yes, [](float const& value) { return value > 0; }, "> 0");
+ SetConfigValue<float>(RATE_POWER_RAGE_INCOME, "Rate.Rage.Income", 1);
+ SetConfigValue<float>(RATE_POWER_RAGE_LOSS, "Rate.Rage.Loss", 1, ConfigValueCache::Reloadable::Yes, [](float const& value) { return value > 0; }, "> 0");
+ SetConfigValue<float>(RATE_POWER_RUNICPOWER_INCOME, "Rate.RunicPower.Income", 1);
+ SetConfigValue<float>(RATE_POWER_RUNICPOWER_LOSS, "Rate.RunicPower.Loss", 1, ConfigValueCache::Reloadable::Yes, [](float const& value) { return value > 0; }, "> 0");
+ SetConfigValue<float>(RATE_POWER_FOCUS, "Rate.Focus", 1);
+ SetConfigValue<float>(RATE_POWER_ENERGY, "Rate.Energy", 1);
+
+ SetConfigValue<float>(RATE_SKILL_DISCOVERY, "Rate.Skill.Discovery", 1);
+
+ SetConfigValue<float>(RATE_DROP_ITEM_POOR, "Rate.Drop.Item.Poor", 1);
+ SetConfigValue<float>(RATE_DROP_ITEM_NORMAL, "Rate.Drop.Item.Normal", 1);
+ SetConfigValue<float>(RATE_DROP_ITEM_UNCOMMON, "Rate.Drop.Item.Uncommon", 1);
+ SetConfigValue<float>(RATE_DROP_ITEM_RARE, "Rate.Drop.Item.Rare", 1);
+ SetConfigValue<float>(RATE_DROP_ITEM_EPIC, "Rate.Drop.Item.Epic", 1);
+ SetConfigValue<float>(RATE_DROP_ITEM_LEGENDARY, "Rate.Drop.Item.Legendary", 1);
+ SetConfigValue<float>(RATE_DROP_ITEM_ARTIFACT, "Rate.Drop.Item.Artifact", 1);
+ SetConfigValue<float>(RATE_DROP_ITEM_REFERENCED, "Rate.Drop.Item.Referenced", 1);
+ SetConfigValue<float>(RATE_DROP_ITEM_REFERENCED_AMOUNT, "Rate.Drop.Item.ReferencedAmount", 1);
+ SetConfigValue<float>(RATE_DROP_ITEM_GROUP_AMOUNT, "Rate.Drop.Item.GroupAmount", 1);
+ SetConfigValue<float>(RATE_DROP_MONEY, "Rate.Drop.Money", 1);
+
+ SetConfigValue<float>(RATE_REWARD_QUEST_MONEY, "Rate.RewardQuestMoney", 1);
+ SetConfigValue<float>(RATE_REWARD_BONUS_MONEY, "Rate.RewardBonusMoney", 1);
+ SetConfigValue<float>(RATE_XP_KILL, "Rate.XP.Kill", 1);
+ SetConfigValue<float>(RATE_XP_BG_KILL_AV, "Rate.XP.BattlegroundKillAV", 1);
+ SetConfigValue<float>(RATE_XP_BG_KILL_WSG, "Rate.XP.BattlegroundKillWSG", 1);
+ SetConfigValue<float>(RATE_XP_BG_KILL_AB, "Rate.XP.BattlegroundKillAB", 1);
+ SetConfigValue<float>(RATE_XP_BG_KILL_EOTS, "Rate.XP.BattlegroundKillEOTS", 1);
+ SetConfigValue<float>(RATE_XP_BG_KILL_SOTA, "Rate.XP.BattlegroundKillSOTA", 1);
+ SetConfigValue<float>(RATE_XP_BG_KILL_IC, "Rate.XP.BattlegroundKillIC", 1);
+ SetConfigValue<float>(RATE_XP_QUEST, "Rate.XP.Quest", 1);
+ SetConfigValue<float>(RATE_XP_QUEST_DF, "Rate.XP.Quest.DF", 1);
+ SetConfigValue<float>(RATE_XP_EXPLORE, "Rate.XP.Explore", 1);
+ SetConfigValue<float>(RATE_XP_PET, "Rate.XP.Pet", 1);
+ SetConfigValue<float>(RATE_XP_PET_NEXT_LEVEL, "Rate.Pet.LevelXP", 0);
+ SetConfigValue<float>(RATE_REPAIRCOST, "Rate.RepairCost", 1, ConfigValueCache::Reloadable::Yes, [](float const& value) { return value >= 0; }, ">= 0");
+
+ SetConfigValue<float>(RATE_SELLVALUE_ITEM_POOR, "Rate.SellValue.Item.Poor", 1);
+ SetConfigValue<float>(RATE_SELLVALUE_ITEM_NORMAL, "Rate.SellValue.Item.Normal", 1);
+ SetConfigValue<float>(RATE_SELLVALUE_ITEM_UNCOMMON, "Rate.SellValue.Item.Uncommon", 1);
+ SetConfigValue<float>(RATE_SELLVALUE_ITEM_RARE, "Rate.SellValue.Item.Rare", 1);
+ SetConfigValue<float>(RATE_SELLVALUE_ITEM_EPIC, "Rate.SellValue.Item.Epic", 1);
+ SetConfigValue<float>(RATE_SELLVALUE_ITEM_LEGENDARY, "Rate.SellValue.Item.Legendary", 1);
+ SetConfigValue<float>(RATE_SELLVALUE_ITEM_ARTIFACT, "Rate.SellValue.Item.Artifact", 1);
+ SetConfigValue<float>(RATE_SELLVALUE_ITEM_HEIRLOOM, "Rate.SellValue.Item.Heirloom", 1);
+
+ SetConfigValue<float>(RATE_BUYVALUE_ITEM_POOR, "Rate.BuyValue.Item.Poor", 1);
+ SetConfigValue<float>(RATE_BUYVALUE_ITEM_NORMAL, "Rate.BuyValue.Item.Normal", 1);
+ SetConfigValue<float>(RATE_BUYVALUE_ITEM_UNCOMMON, "Rate.BuyValue.Item.Uncommon", 1);
+ SetConfigValue<float>(RATE_BUYVALUE_ITEM_RARE, "Rate.BuyValue.Item.Rare", 1);
+ SetConfigValue<float>(RATE_BUYVALUE_ITEM_EPIC, "Rate.BuyValue.Item.Epic", 1);
+ SetConfigValue<float>(RATE_BUYVALUE_ITEM_LEGENDARY, "Rate.BuyValue.Item.Legendary", 1);
+ SetConfigValue<float>(RATE_BUYVALUE_ITEM_ARTIFACT, "Rate.BuyValue.Item.Artifact", 1);
+ SetConfigValue<float>(RATE_BUYVALUE_ITEM_HEIRLOOM, "Rate.BuyValue.Item.Heirloom", 1);
+
+ SetConfigValue<float>(RATE_REPUTATION_GAIN, "Rate.Reputation.Gain", 1);
+ SetConfigValue<float>(RATE_REPUTATION_LOWLEVEL_KILL, "Rate.Reputation.LowLevel.Kill", 1);
+ SetConfigValue<float>(RATE_REPUTATION_LOWLEVEL_QUEST, "Rate.Reputation.LowLevel.Quest", 1);
+ SetConfigValue<float>(RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS, "Rate.Reputation.RecruitAFriendBonus", 0);
+ SetConfigValue<float>(RATE_CREATURE_NORMAL_DAMAGE, "Rate.Creature.Normal.Damage", 1);
+ SetConfigValue<float>(RATE_CREATURE_ELITE_ELITE_DAMAGE, "Rate.Creature.Elite.Elite.Damage", 1);
+ SetConfigValue<float>(RATE_CREATURE_ELITE_RAREELITE_DAMAGE, "Rate.Creature.Elite.RAREELITE.Damage", 1);
+ SetConfigValue<float>(RATE_CREATURE_ELITE_WORLDBOSS_DAMAGE, "Rate.Creature.Elite.WORLDBOSS.Damage", 1);
+ SetConfigValue<float>(RATE_CREATURE_ELITE_RARE_DAMAGE, "Rate.Creature.Elite.RARE.Damage", 1);
+ SetConfigValue<float>(RATE_CREATURE_NORMAL_HP, "Rate.Creature.Normal.HP", 1);
+ SetConfigValue<float>(RATE_CREATURE_ELITE_ELITE_HP, "Rate.Creature.Elite.Elite.HP", 1);
+ SetConfigValue<float>(RATE_CREATURE_ELITE_RAREELITE_HP, "Rate.Creature.Elite.RAREELITE.HP", 1);
+ SetConfigValue<float>(RATE_CREATURE_ELITE_WORLDBOSS_HP, "Rate.Creature.Elite.WORLDBOSS.HP", 1);
+ SetConfigValue<float>(RATE_CREATURE_ELITE_RARE_HP, "Rate.Creature.Elite.RARE.HP", 1);
+ SetConfigValue<float>(RATE_CREATURE_NORMAL_SPELLDAMAGE, "Rate.Creature.Normal.SpellDamage", 1);
+ SetConfigValue<float>(RATE_CREATURE_ELITE_ELITE_SPELLDAMAGE, "Rate.Creature.Elite.Elite.SpellDamage", 1);
+ SetConfigValue<float>(RATE_CREATURE_ELITE_RAREELITE_SPELLDAMAGE, "Rate.Creature.Elite.RAREELITE.SpellDamage", 1);
+ SetConfigValue<float>(RATE_CREATURE_ELITE_WORLDBOSS_SPELLDAMAGE, "Rate.Creature.Elite.WORLDBOSS.SpellDamage", 1);
+ SetConfigValue<float>(RATE_CREATURE_ELITE_RARE_SPELLDAMAGE, "Rate.Creature.Elite.RARE.SpellDamage", 1);
+ SetConfigValue<float>(RATE_CREATURE_AGGRO, "Rate.Creature.Aggro", 1);
+ SetConfigValue<float>(RATE_REST_INGAME, "Rate.Rest.InGame", 1);
+ SetConfigValue<float>(RATE_REST_OFFLINE_IN_TAVERN_OR_CITY, "Rate.Rest.Offline.InTavernOrCity", 1);
+ SetConfigValue<float>(RATE_REST_OFFLINE_IN_WILDERNESS, "Rate.Rest.Offline.InWilderness", 1);
+ SetConfigValue<float>(RATE_REST_MAX_BONUS, "Rate.Rest.MaxBonus", 1);
+ SetConfigValue<float>(RATE_DAMAGE_FALL, "Rate.Damage.Fall", 1);
+ SetConfigValue<float>(RATE_AUCTION_TIME, "Rate.Auction.Time", 1);
+ SetConfigValue<float>(RATE_AUCTION_DEPOSIT, "Rate.Auction.Deposit", 1);
+ SetConfigValue<float>(RATE_AUCTION_CUT, "Rate.Auction.Cut", 1);
+ SetConfigValue<float>(RATE_HONOR, "Rate.Honor", 1);
+ SetConfigValue<float>(RATE_ARENA_POINTS, "Rate.ArenaPoints", 1);
+ SetConfigValue<float>(RATE_INSTANCE_RESET_TIME, "Rate.InstanceResetTime", 1);
+
+ SetConfigValue<float>(RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE, "Rate.MissChanceMultiplier.TargetCreature", 11);
+ SetConfigValue<float>(RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER, "Rate.MissChanceMultiplier.TargetPlayer", 7);
+ SetConfigValue<bool>(CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS, "Rate.MissChanceMultiplier.OnlyAffectsPlayer", false);
+
+ SetConfigValue<float>(RATE_TALENT, "Rate.Talent", 1, ConfigValueCache::Reloadable::Yes, [](float const& value) { return value >= 0; }, ">= 0");
+ SetConfigValue<float>(RATE_TALENT_PET, "Rate.Talent.Pet", 1, ConfigValueCache::Reloadable::Yes, [](float const& value) { return value >= 0; }, ">= 0");
+ // Controls Player movespeed rate.
+ SetConfigValue<float>(RATE_MOVESPEED_PLAYER, "Rate.MoveSpeed.Player", 1, ConfigValueCache::Reloadable::Yes, [](float const& value) { return value >= 0; }, ">= 0");
+
+ // Controls all npc movespeed rate.
+ SetConfigValue<float>(RATE_MOVESPEED_NPC, "Rate.MoveSpeed.NPC", 1, ConfigValueCache::Reloadable::Yes, [](float const& value) { return value >= 0; }, ">= 0");
+
+ SetConfigValue<float>(RATE_CORPSE_DECAY_LOOTED, "Rate.Corpse.Decay.Looted", 0);
+
+ SetConfigValue<float>(RATE_DURABILITY_LOSS_ON_DEATH, "DurabilityLoss.OnDeath", 10, ConfigValueCache::Reloadable::Yes, [](float const& value) { return value >= 0 && value <= 100; }, ">= 0 && <= 100");
+
+ SetConfigValue<float>(RATE_DURABILITY_LOSS_DAMAGE, "DurabilityLossChance.Damage", 0, ConfigValueCache::Reloadable::Yes, [](float const& value) { return value >= 0; }, ">= 0");
+ SetConfigValue<float>(RATE_DURABILITY_LOSS_ABSORB, "DurabilityLossChance.Absorb", 0, ConfigValueCache::Reloadable::Yes, [](float const& value) { return value >= 0; }, ">= 0");
+ SetConfigValue<float>(RATE_DURABILITY_LOSS_PARRY, "DurabilityLossChance.Parry", 0, ConfigValueCache::Reloadable::Yes, [](float const& value) { return value >= 0; }, ">= 0");
+ SetConfigValue<float>(RATE_DURABILITY_LOSS_BLOCK, "DurabilityLossChance.Block", 0, ConfigValueCache::Reloadable::Yes, [](float const& value) { return value >= 0; }, ">= 0");
+
+ ///- Read other configuration items from the config file
+
+ SetConfigValue<bool>(CONFIG_DURABILITY_LOSS_IN_PVP, "DurabilityLoss.InPvP", false);
+
+ SetConfigValue<uint32>(CONFIG_COMPRESSION, "Compression", 1, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value > 0 && value < 10; }, "> 0 && < 10");
+
+ SetConfigValue<bool>(CONFIG_ADDON_CHANNEL, "AddonChannel", true);
+ SetConfigValue<bool>(CONFIG_CLEAN_CHARACTER_DB, "CleanCharacterDB", false);
+ SetConfigValue<uint32>(CONFIG_PERSISTENT_CHARACTER_CLEAN_FLAGS, "PersistentCharacterCleanFlags", 0);
+ SetConfigValue<uint32>(CONFIG_CHAT_CHANNEL_LEVEL_REQ, "ChatLevelReq.Channel", 1);
+ SetConfigValue<uint32>(CONFIG_CHAT_WHISPER_LEVEL_REQ, "ChatLevelReq.Whisper", 1);
+ SetConfigValue<uint32>(CONFIG_CHAT_SAY_LEVEL_REQ, "ChatLevelReq.Say", 1);
+ SetConfigValue<uint32>(CONFIG_PARTY_LEVEL_REQ, "PartyLevelReq", 1);
+ SetConfigValue<uint32>(CONFIG_TRADE_LEVEL_REQ, "LevelReq.Trade", 1);
+ SetConfigValue<uint32>(CONFIG_TICKET_LEVEL_REQ, "LevelReq.Ticket", 1);
+ SetConfigValue<uint32>(CONFIG_AUCTION_LEVEL_REQ, "LevelReq.Auction", 1);
+ SetConfigValue<uint32>(CONFIG_MAIL_LEVEL_REQ, "LevelReq.Mail", 1);
+ SetConfigValue<bool>(CONFIG_ALLOW_PLAYER_COMMANDS, "AllowPlayerCommands", 1);
+ SetConfigValue<bool>(CONFIG_PRESERVE_CUSTOM_CHANNELS, "PreserveCustomChannels", false);
+ SetConfigValue<uint32>(CONFIG_PRESERVE_CUSTOM_CHANNEL_DURATION, "PreserveCustomChannelDuration", 14);
+ SetConfigValue<uint32>(CONFIG_INTERVAL_SAVE, "PlayerSaveInterval", 15);
+ SetConfigValue<uint32>(CONFIG_INTERVAL_DISCONNECT_TOLERANCE, "DisconnectToleranceInterval", 0);
+ SetConfigValue<bool>(CONFIG_STATS_SAVE_ONLY_ON_LOGOUT, "PlayerSave.Stats.SaveOnlyOnLogout", true);
+
+ SetConfigValue<uint32>(CONFIG_MIN_LEVEL_STAT_SAVE, "PlayerSave.Stats.MinLevel", 0, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value < MAX_LEVEL; }, "< MAX_LEVEL");
+
+ SetConfigValue<uint32>(CONFIG_INTERVAL_MAPUPDATE, "MapUpdateInterval", 10, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value >= MIN_MAP_UPDATE_DELAY; }, ">= MIN_MAP_UPDATE_DELAY");
+
+ SetConfigValue<uint32>(CONFIG_INTERVAL_CHANGEWEATHER, "ChangeWeatherInterval", 10);
+
+ SetConfigValue<uint32>(CONFIG_PORT_WORLD, "WorldServerPort", 8085, ConfigValueCache::Reloadable::No);
+
+ SetConfigValue<bool>(CONFIG_CLOSE_IDLE_CONNECTIONS, "CloseIdleConnections", true);
+ SetConfigValue<uint32>(CONFIG_SOCKET_TIMEOUTTIME, "SocketTimeOutTime", 900000);
+ SetConfigValue<uint32>(CONFIG_SOCKET_TIMEOUTTIME_ACTIVE, "SocketTimeOutTimeActive", 60000);
+ SetConfigValue<uint32>(CONFIG_SESSION_ADD_DELAY, "SessionAddDelay", 10000);
+
+ SetConfigValue<float>(CONFIG_GROUP_XP_DISTANCE, "MaxGroupXPDistance", 74);
+ SetConfigValue<float>(CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE, "MaxRecruitAFriendBonusDistance", 100);
+
+ SetConfigValue<float>(CONFIG_SIGHT_MONSTER, "MonsterSight", 50);
+
+ SetConfigValue<uint32>(CONFIG_GAME_TYPE, "GameType", 0, ConfigValueCache::Reloadable::No);
+ SetConfigValue<uint32>(CONFIG_REALM_ZONE, "RealmZone", REALM_ZONE_DEVELOPMENT, ConfigValueCache::Reloadable::No);
+
+ SetConfigValue<bool>(CONFIG_STRICT_NAMES_RESERVED, "StrictNames.Reserved", true);
+ SetConfigValue<bool>(CONFIG_STRICT_NAMES_PROFANITY, "StrictNames.Profanity", true);
+ SetConfigValue<uint32>(CONFIG_STRICT_PLAYER_NAMES, "StrictPlayerNames", 0);
+ SetConfigValue<uint32>(CONFIG_STRICT_CHARTER_NAMES, "StrictCharterNames", 0);
+ SetConfigValue<uint32>(CONFIG_STRICT_CHANNEL_NAMES, "StrictChannelNames", 0);
+ SetConfigValue<uint32>(CONFIG_STRICT_PET_NAMES, "StrictPetNames", 0);
+
+ SetConfigValue<bool>(CONFIG_ALLOW_TWO_SIDE_ACCOUNTS, "AllowTwoSide.Accounts", true);
+ SetConfigValue<bool>(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CALENDAR, "AllowTwoSide.Interaction.Calendar", false);
+ SetConfigValue<bool>(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT, "AllowTwoSide.Interaction.Chat", false);
+ SetConfigValue<bool>(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL, "AllowTwoSide.Interaction.Channel", false);
+ SetConfigValue<bool>(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP, "AllowTwoSide.Interaction.Group", false);
+ SetConfigValue<bool>(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD, "AllowTwoSide.Interaction.Guild", false);
+ SetConfigValue<bool>(CONFIG_ALLOW_TWO_SIDE_INTERACTION_ARENA, "AllowTwoSide.Interaction.Arena", false);
+ SetConfigValue<bool>(CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION, "AllowTwoSide.Interaction.Auction", false);
+ SetConfigValue<bool>(CONFIG_ALLOW_TWO_SIDE_INTERACTION_MAIL, "AllowTwoSide.Interaction.Mail", false);
+ SetConfigValue<bool>(CONFIG_ALLOW_TWO_SIDE_WHO_LIST, "AllowTwoSide.WhoList", false);
+ SetConfigValue<bool>(CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND, "AllowTwoSide.AddFriend", false);
+ SetConfigValue<bool>(CONFIG_ALLOW_TWO_SIDE_TRADE, "AllowTwoSide.Trade", false);
+ SetConfigValue<bool>(CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE, "AllowTwoSide.Interaction.Emote", false);
+
+ SetConfigValue<uint32>(CONFIG_MIN_PLAYER_NAME, "MinPlayerName", 2, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value > 0 && value <= MAX_PLAYER_NAME; }, "> 0 && <= MAX_PLAYER_NAME");
+ SetConfigValue<uint32>(CONFIG_MIN_CHARTER_NAME, "MinCharterName", 2, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value > 0 && value <= MAX_CHARTER_NAME; }, "> 0 && <= MAX_CHARTER_NAME");
+ SetConfigValue<uint32>(CONFIG_MIN_PET_NAME, "MinPetName", 2, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value > 0 && value <= MAX_PET_NAME; }, "> 0 && <= MAX_PET_NAME");
+
+ SetConfigValue<uint32>(CONFIG_CHARTER_COST_GUILD, "Guild.CharterCost", 1000);
+ SetConfigValue<uint32>(CONFIG_CHARTER_COST_ARENA_2v2, "ArenaTeam.CharterCost.2v2", 800000);
+ SetConfigValue<uint32>(CONFIG_CHARTER_COST_ARENA_3v3, "ArenaTeam.CharterCost.3v3", 1200000);
+ SetConfigValue<uint32>(CONFIG_CHARTER_COST_ARENA_5v5, "ArenaTeam.CharterCost.5v5", 2000000);
+
+ SetConfigValue<uint32>(CONFIG_MAX_WHO_LIST_RETURN, "MaxWhoListReturns", 49);
+
+ SetConfigValue<uint32>(CONFIG_CHARACTER_CREATING_DISABLED, "CharacterCreating.Disabled", 0);
+ SetConfigValue<uint32>(CONFIG_CHARACTER_CREATING_DISABLED_RACEMASK, "CharacterCreating.Disabled.RaceMask", 0);
+
+ SetConfigValue<uint32>(CONFIG_CHARACTER_CREATING_DISABLED_CLASSMASK, "CharacterCreating.Disabled.ClassMask", 0);
+
+ SetConfigValue<uint32>(CONFIG_CHARACTERS_PER_REALM, "CharactersPerRealm", 10, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value > 0 && value <= 10; }, "> 0 && <= 10");
+
+ // must be after CONFIG_CHARACTERS_PER_REALM
+ SetConfigValue<uint32>(CONFIG_CHARACTERS_PER_ACCOUNT, "CharactersPerAccount", 50, ConfigValueCache::Reloadable::Yes, [this](uint32 const& value) { return value >= GetConfigValue<uint32>(CONFIG_CHARACTERS_PER_REALM); }, ">= CONFIG_CHARACTERS_PER_REALM");
+ SetConfigValue<uint32>(CONFIG_HEROIC_CHARACTERS_PER_REALM, "HeroicCharactersPerRealm", 1, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value <= 10; }, "<= 10");
+
+ SetConfigValue<uint32>(CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_HEROIC_CHARACTER, "CharacterCreating.MinLevelForHeroicCharacter", 55);
+
+ SetConfigValue<uint32>(CONFIG_SKIP_CINEMATICS, "SkipCinematics", 0, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value <= 2; }, "<= 2");
+
+ SetConfigValue<uint32>(CONFIG_MAX_PLAYER_LEVEL, "MaxPlayerLevel", DEFAULT_MAX_LEVEL, ConfigValueCache::Reloadable::No, [](uint32 const& value) { return value > 0 && value <= MAX_LEVEL; }, "> 0 && <= MAX_LEVEL");
+
+ SetConfigValue<uint32>(CONFIG_MIN_DUALSPEC_LEVEL, "MinDualSpecLevel", 40);
+
+ SetConfigValue<uint32>(CONFIG_START_PLAYER_LEVEL, "StartPlayerLevel", 1, ConfigValueCache::Reloadable::Yes, [this](uint32 const& value) { return value > 0 && value <= GetConfigValue<uint32>(CONFIG_MAX_PLAYER_LEVEL); }, "> 0 && <= CONFIG_MAX_PLAYER_LEVEL");
+ SetConfigValue<uint32>(CONFIG_START_HEROIC_PLAYER_LEVEL, "StartHeroicPlayerLevel", 55, ConfigValueCache::Reloadable::Yes, [this](uint32 const& value) { return value > 0 && value <= GetConfigValue<uint32>(CONFIG_MAX_PLAYER_LEVEL); }, "> 0 && <= CONFIG_MAX_PLAYER_LEVEL");
+
+ SetConfigValue<uint32>(CONFIG_START_PLAYER_MONEY, "StartPlayerMoney", 0, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value <= MAX_MONEY_AMOUNT; }, "<= MAX_MONEY_AMOUNT");
+ SetConfigValue<uint32>(CONFIG_START_HEROIC_PLAYER_MONEY, "StartHeroicPlayerMoney", 2000, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value <= MAX_MONEY_AMOUNT; }, "<= MAX_MONEY_AMOUNT");
+
+ SetConfigValue<uint32>(CONFIG_MAX_HONOR_POINTS, "MaxHonorPoints", 75000);
+
+ SetConfigValue<uint32>(CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT, "MaxHonorPointsMoneyPerPoint", 0);
+
+ SetConfigValue<uint32>(CONFIG_START_HONOR_POINTS, "StartHonorPoints", 0, ConfigValueCache::Reloadable::Yes, [this](uint32 const& value) { return value <= GetConfigValue<uint32>(CONFIG_MAX_HONOR_POINTS); }, "<= CONFIG_MAX_HONOR_POINTS");
+
+ SetConfigValue<uint32>(CONFIG_MAX_ARENA_POINTS, "MaxArenaPoints", 10000);
+
+ SetConfigValue<uint32>(CONFIG_START_ARENA_POINTS, "StartArenaPoints", 0, ConfigValueCache::Reloadable::Yes, [this](uint32 const& value) { return value <= GetConfigValue<uint32>(CONFIG_MAX_ARENA_POINTS); }, "<= CONFIG_MAX_ARENA_POINTS");
+
+ SetConfigValue<uint32>(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL, "RecruitAFriend.MaxLevel", 60, ConfigValueCache::Reloadable::Yes, [this](uint32 const& value) { return value <= GetConfigValue<uint32>(CONFIG_MAX_PLAYER_LEVEL); }, "<= CONFIG_MAX_PLAYER_LEVEL");
+
+ SetConfigValue<uint32>(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE, "RecruitAFriend.MaxDifference", 4);
+ SetConfigValue<bool>(CONFIG_ALL_TAXI_PATHS, "AllFlightPaths", false);
+ SetConfigValue<uint32>(CONFIG_INSTANT_TAXI, "InstantFlightPaths", 0);
+
+ SetConfigValue<bool>(CONFIG_INSTANCE_IGNORE_LEVEL, "Instance.IgnoreLevel", false);
+ SetConfigValue<bool>(CONFIG_INSTANCE_IGNORE_RAID, "Instance.IgnoreRaid", false);
+ SetConfigValue<bool>(CONFIG_INSTANCE_GMSUMMON_PLAYER, "Instance.GMSummonPlayer", false);
+ SetConfigValue<bool>(CONFIG_INSTANCE_SHARED_ID, "Instance.SharedNormalHeroicId", false);
+
+ SetConfigValue<uint32>(CONFIG_INSTANCE_RESET_TIME_HOUR, "Instance.ResetTimeHour", 4);
+ SetConfigValue<uint32>(CONFIG_INSTANCE_RESET_TIME_RELATIVE_TIMESTAMP, "Instance.ResetTimeRelativeTimestamp", 1135814400);
+ SetConfigValue<uint32>(CONFIG_INSTANCE_UNLOAD_DELAY, "Instance.UnloadDelay", 30);
+
+ SetConfigValue<uint32>(CONFIG_MAX_PRIMARY_TRADE_SKILL, "MaxPrimaryTradeSkill", 2);
+ SetConfigValue<uint32>(CONFIG_MIN_PETITION_SIGNS, "MinPetitionSigns", 9, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value <= 9; }, "<= 9");
+
+ SetConfigValue<uint32>(CONFIG_GM_LOGIN_STATE, "GM.LoginState", 2);
+ SetConfigValue<uint32>(CONFIG_GM_VISIBLE_STATE, "GM.Visible", 2);
+ SetConfigValue<uint32>(CONFIG_GM_CHAT, "GM.Chat", 2);
+ SetConfigValue<uint32>(CONFIG_GM_WHISPERING_TO, "GM.WhisperingTo", 2);
+
+ SetConfigValue<uint32>(CONFIG_GM_LEVEL_IN_GM_LIST, "GM.InGMList.Level", SEC_ADMINISTRATOR);
+ SetConfigValue<uint32>(CONFIG_GM_LEVEL_IN_WHO_LIST, "GM.InWhoList.Level", SEC_ADMINISTRATOR);
+ SetConfigValue<uint32>(CONFIG_START_GM_LEVEL, "GM.StartLevel", 1, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value <= MAX_LEVEL; }, "<= MAX_LEVEL");
+
+ SetConfigValue<bool>(CONFIG_ALLOW_GM_GROUP, "GM.AllowInvite", false);
+ SetConfigValue<bool>(CONFIG_ALLOW_GM_FRIEND, "GM.AllowFriend", false);
+ SetConfigValue<bool>(CONFIG_GM_LOWER_SECURITY, "GM.LowerSecurity", false);
+ SetConfigValue<float>(CONFIG_CHANCE_OF_GM_SURVEY, "GM.TicketSystem.ChanceOfGMSurvey", 50);
+
+ SetConfigValue<uint32>(CONFIG_GROUP_VISIBILITY, "Visibility.GroupMode", 1);
+
+ SetConfigValue<bool>(CONFIG_OBJECT_SPARKLES, "Visibility.ObjectSparkles", true);
+
+ SetConfigValue<bool>(CONFIG_LOW_LEVEL_REGEN_BOOST, "EnableLowLevelRegenBoost", true);
+
+ SetConfigValue<bool>(CONFIG_OBJECT_QUEST_MARKERS, "Visibility.ObjectQuestMarkers", true);
+
+ SetConfigValue<uint32>(CONFIG_MAIL_DELIVERY_DELAY, "MailDeliveryDelay", HOUR);
+
+ SetConfigValue<uint32>(CONFIG_UPTIME_UPDATE, "UpdateUptimeInterval", 10, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value > 0; }, "> 0");
+
+ // log db cleanup interval
+ SetConfigValue<uint32>(CONFIG_LOGDB_CLEARINTERVAL, "LogDB.Opt.ClearInterval", 10, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value > 0; }, "> 0");
+ SetConfigValue<uint32>(CONFIG_LOGDB_CLEARTIME, "LogDB.Opt.ClearTime", 1209600);
+
+ SetConfigValue<uint32>(CONFIG_TELEPORT_TIMEOUT_NEAR, "TeleportTimeoutNear", 25);
+ SetConfigValue<uint32>(CONFIG_TELEPORT_TIMEOUT_FAR, "TeleportTimeoutFar", 45);
+ SetConfigValue<uint32>(CONFIG_MAX_ALLOWED_MMR_DROP, "MaxAllowedMMRDrop", 500);
+ SetConfigValue<bool>(CONFIG_ENABLE_LOGIN_AFTER_DC, "EnableLoginAfterDC", true);
+ SetConfigValue<bool>(CONFIG_DONT_CACHE_RANDOM_MOVEMENT_PATHS, "DontCacheRandomMovementPaths", false);
+
+ SetConfigValue<uint32>(CONFIG_SKILL_CHANCE_ORANGE, "SkillChance.Orange", 100);
+ SetConfigValue<uint32>(CONFIG_SKILL_CHANCE_YELLOW, "SkillChance.Yellow", 75);
+ SetConfigValue<uint32>(CONFIG_SKILL_CHANCE_GREEN, "SkillChance.Green", 25);
+ SetConfigValue<uint32>(CONFIG_SKILL_CHANCE_GREY, "SkillChance.Grey", 0);
+
+ SetConfigValue<uint32>(CONFIG_SKILL_CHANCE_MINING_STEPS, "SkillChance.MiningSteps", 0);
+ SetConfigValue<uint32>(CONFIG_SKILL_CHANCE_SKINNING_STEPS, "SkillChance.SkinningSteps", 0);
+
+ SetConfigValue<bool>(CONFIG_SKILL_PROSPECTING, "SkillChance.Prospecting", false);
+ SetConfigValue<bool>(CONFIG_SKILL_MILLING, "SkillChance.Milling", false);
+
+ SetConfigValue<uint32>(CONFIG_SKILL_GAIN_CRAFTING, "SkillGain.Crafting", 1);
+
+ SetConfigValue<uint32>(CONFIG_SKILL_GAIN_DEFENSE, "SkillGain.Defense", 1);
+
+ SetConfigValue<uint32>(CONFIG_SKILL_GAIN_GATHERING, "SkillGain.Gathering", 1);
+
+ SetConfigValue<uint32>(CONFIG_SKILL_GAIN_WEAPON, "SkillGain.Weapon", 1);
+
+ SetConfigValue<uint32>(CONFIG_MAX_OVERSPEED_PINGS, "MaxOverspeedPings", 2, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value != 1; }, "!= 1");
+
+ SetConfigValue<bool>(CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY, "SaveRespawnTimeImmediately", true);
+ SetConfigValue<bool>(CONFIG_WEATHER, "ActivateWeather", true);
+
+ SetConfigValue<uint32>(CONFIG_DISABLE_BREATHING, "DisableWaterBreath", SEC_CONSOLE);
+
+ SetConfigValue<bool>(CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL, "AlwaysMaxSkillForLevel", false);
+
+ SetConfigValue<uint32>(CONFIG_EXPANSION, "Expansion", 2, ConfigValueCache::Reloadable::No);
+
+ SetConfigValue<uint32>(CONFIG_CHATFLOOD_MESSAGE_COUNT, "ChatFlood.MessageCount", 10);
+ SetConfigValue<uint32>(CONFIG_CHATFLOOD_MESSAGE_DELAY, "ChatFlood.MessageDelay", 1);
+ SetConfigValue<uint32>(CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT, "ChatFlood.AddonMessageCount", 100);
+ SetConfigValue<uint32>(CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY, "ChatFlood.AddonMessageDelay", 1);
+ SetConfigValue<uint32>(CONFIG_CHATFLOOD_MUTE_TIME, "ChatFlood.MuteTime", 10);
+ SetConfigValue<bool>(CONFIG_CHAT_MUTE_FIRST_LOGIN, "Chat.MuteFirstLogin", false);
+ SetConfigValue<uint32>(CONFIG_CHAT_TIME_MUTE_FIRST_LOGIN, "Chat.MuteTimeFirstLogin", 120);
+
+ SetConfigValue<uint32>(CONFIG_EVENT_ANNOUNCE, "Event.Announce", 0);
+
+ SetConfigValue<float>(CONFIG_CREATURE_LEASH_RADIUS, "CreatureLeashRadius", 30.0f);
+ SetConfigValue<float>(CONFIG_CREATURE_FAMILY_FLEE_ASSISTANCE_RADIUS, "CreatureFamilyFleeAssistanceRadius", 30);
+ SetConfigValue<float>(CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS, "CreatureFamilyAssistanceRadius", 10);
+ SetConfigValue<uint32>(CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY, "CreatureFamilyAssistanceDelay", 2000);
+ SetConfigValue<uint32>(CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD, "CreatureFamilyAssistancePeriod", 3000);
+ SetConfigValue<uint32>(CONFIG_CREATURE_FAMILY_FLEE_DELAY, "CreatureFamilyFleeDelay", 7000);
+
+ SetConfigValue<uint32>(CONFIG_WORLD_BOSS_LEVEL_DIFF, "WorldBossLevelDiff", 3);
+
+ SetConfigValue<bool>(CONFIG_QUEST_ENABLE_QUEST_TRACKER, "Quests.EnableQuestTracker", false);
+
+ // note: disable value (-1) will assigned as 0xFFFFFFF, to prevent overflow at calculations limit it to max possible player level MAX_LEVEL(100)
+ SetConfigValue<uint32>(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF, "Quests.LowLevelHideDiff", 4, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value <= MAX_LEVEL; }, "<= MAX_LEVEL");
+ SetConfigValue<uint32>(CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF, "Quests.HighLevelHideDiff", 7, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value <= MAX_LEVEL; }, "<= MAX_LEVEL");
+ SetConfigValue<bool>(CONFIG_QUEST_IGNORE_RAID, "Quests.IgnoreRaid", false);
+ SetConfigValue<bool>(CONFIG_QUEST_IGNORE_AUTO_ACCEPT, "Quests.IgnoreAutoAccept", false);
+ SetConfigValue<bool>(CONFIG_QUEST_IGNORE_AUTO_COMPLETE, "Quests.IgnoreAutoComplete", false);
+
+ SetConfigValue<uint32>(CONFIG_RANDOM_BG_RESET_HOUR, "Battleground.Random.ResetHour", 6, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value <= 23; }, "<= 23");
+ SetConfigValue<uint32>(CONFIG_CALENDAR_DELETE_OLD_EVENTS_HOUR, "Calendar.DeleteOldEventsHour", 6, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value <= 23; }, "<= 23");
+ SetConfigValue<uint32>(CONFIG_GUILD_RESET_HOUR, "Guild.ResetHour", 6, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value <= 23; }, "<= 23");
+
+ SetConfigValue<uint32>(CONFIG_GUILD_BANK_INITIAL_TABS, "Guild.BankInitialTabs", 0);
+ SetConfigValue<uint32>(CONFIG_GUILD_BANK_TAB_COST_0, "Guild.BankTabCost0", 1000000);
+ SetConfigValue<uint32>(CONFIG_GUILD_BANK_TAB_COST_1, "Guild.BankTabCost1", 2500000);
+ SetConfigValue<uint32>(CONFIG_GUILD_BANK_TAB_COST_2, "Guild.BankTabCost2", 5000000);
+ SetConfigValue<uint32>(CONFIG_GUILD_BANK_TAB_COST_3, "Guild.BankTabCost3", 10000000);
+ SetConfigValue<uint32>(CONFIG_GUILD_BANK_TAB_COST_4, "Guild.BankTabCost4", 25000000);
+ SetConfigValue<uint32>(CONFIG_GUILD_BANK_TAB_COST_5, "Guild.BankTabCost5", 50000000);
+
+ SetConfigValue<uint32>(CONFIG_GUILD_MEMBER_LIMIT, "Guild.MemberLimit", 0);
+
+ SetConfigValue<bool>(CONFIG_DETECT_POS_COLLISION, "DetectPosCollision", true);
+
+ SetConfigValue<bool>(CONFIG_RESTRICTED_LFG_CHANNEL, "Channel.RestrictedLfg", true);
+ SetConfigValue<bool>(CONFIG_SILENTLY_GM_JOIN_TO_CHANNEL, "Channel.SilentlyGMJoin", false);
+
+ SetConfigValue<bool>(CONFIG_TALENTS_INSPECTING, "TalentsInspecting", true);
+ SetConfigValue<bool>(CONFIG_CHAT_FAKE_MESSAGE_PREVENTING, "ChatFakeMessagePreventing", true);
+ SetConfigValue<uint32>(CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY, "ChatStrictLinkChecking.Severity", 0);
+ SetConfigValue<uint32>(CONFIG_CHAT_STRICT_LINK_CHECKING_KICK, "ChatStrictLinkChecking.Kick", 0);
+
+ SetConfigValue<uint32>(CONFIG_CORPSE_DECAY_NORMAL, "Corpse.Decay.NORMAL", 60);
+ SetConfigValue<uint32>(CONFIG_CORPSE_DECAY_RARE, "Corpse.Decay.RARE", 300);
+ SetConfigValue<uint32>(CONFIG_CORPSE_DECAY_ELITE, "Corpse.Decay.ELITE", 300);
+ SetConfigValue<uint32>(CONFIG_CORPSE_DECAY_RAREELITE, "Corpse.Decay.RAREELITE", 300);
+ SetConfigValue<uint32>(CONFIG_CORPSE_DECAY_WORLDBOSS, "Corpse.Decay.WORLDBOSS", 3600);
+
+ SetConfigValue<uint32>(CONFIG_DEATH_SICKNESS_LEVEL, "Death.SicknessLevel", 11);
+ SetConfigValue<bool>(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP, "Death.CorpseReclaimDelay.PvP", true);
+ SetConfigValue<bool>(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE, "Death.CorpseReclaimDelay.PvE", true);
+ SetConfigValue<bool>(CONFIG_DEATH_BONES_WORLD, "Death.Bones.World", true);
+ SetConfigValue<bool>(CONFIG_DEATH_BONES_BG_OR_ARENA, "Death.Bones.BattlegroundOrArena", true);
+
+ SetConfigValue<bool>(CONFIG_DIE_COMMAND_MODE, "Die.Command.Mode", true);
+
+ // always use declined names in the russian client
+ SetConfigValue<bool>(CONFIG_DECLINED_NAMES_USED, "DeclinedNames", GetConfigValue<uint32>(CONFIG_REALM_ZONE) == REALM_ZONE_RUSSIAN);
+
+ SetConfigValue<float>(CONFIG_LISTEN_RANGE_SAY, "ListenRange.Say", 25);
+ SetConfigValue<float>(CONFIG_LISTEN_RANGE_TEXTEMOTE, "ListenRange.TextEmote", 25);
+ SetConfigValue<float>(CONFIG_LISTEN_RANGE_YELL, "ListenRange.Yell", 300);
+
+ SetConfigValue<uint32>(CONFIG_BATTLEGROUND_OVERRIDE_LOWLEVELS_MINPLAYERS, "Battleground.Override.LowLevels.MinPlayers", 0);
+ SetConfigValue<bool>(CONFIG_BATTLEGROUND_DISABLE_QUEST_SHARE_IN_BG, "Battleground.DisableQuestShareInBG", false);
+ SetConfigValue<bool>(CONFIG_BATTLEGROUND_DISABLE_READY_CHECK_IN_BG, "Battleground.DisableReadyCheckInBG", false);
+ SetConfigValue<bool>(CONFIG_BATTLEGROUND_CAST_DESERTER, "Battleground.CastDeserter", true);
+ SetConfigValue<bool>(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE, "Battleground.QueueAnnouncer.Enable", false);
+ SetConfigValue<uint32>(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_LIMIT_MIN_LEVEL, "Battleground.QueueAnnouncer.Limit.MinLevel", 0);
+ SetConfigValue<uint32>(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_LIMIT_MIN_PLAYERS, "Battleground.QueueAnnouncer.Limit.MinPlayers", 3);
+ SetConfigValue<uint32>(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_SPAM_DELAY, "Battleground.QueueAnnouncer.SpamProtection.Delay", 30);
+ SetConfigValue<bool>(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY, "Battleground.QueueAnnouncer.PlayerOnly", false);
+ SetConfigValue<bool>(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_TIMED, "Battleground.QueueAnnouncer.Timed", false);
+ SetConfigValue<uint32>(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_TIMER, "Battleground.QueueAnnouncer.Timer", 30000);
+ SetConfigValue<bool>(CONFIG_BATTLEGROUND_STORE_STATISTICS_ENABLE, "Battleground.StoreStatistics.Enable", false);
+ SetConfigValue<bool>(CONFIG_BATTLEGROUND_TRACK_DESERTERS, "Battleground.TrackDeserters.Enable", false);
+ SetConfigValue<uint32>(CONFIG_BATTLEGROUND_PREMATURE_FINISH_TIMER, "Battleground.PrematureFinishTimer", 5);
+ SetConfigValue<uint32>(CONFIG_BATTLEGROUND_INVITATION_TYPE, "Battleground.InvitationType", 0);
+ SetConfigValue<uint32>(CONFIG_BATTLEGROUND_PREMADE_GROUP_WAIT_FOR_MATCH, "Battleground.PremadeGroupWaitForMatch", 30);
+ SetConfigValue<bool>(CONFIG_BG_XP_FOR_KILL, "Battleground.GiveXPForKills", false);
+ SetConfigValue<uint32>(CONFIG_BATTLEGROUND_REPORT_AFK_TIMER, "Battleground.ReportAFK.Timer", 4);
+ SetConfigValue<uint32>(CONFIG_BATTLEGROUND_REPORT_AFK, "Battleground.ReportAFK", 3, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value > 0 && value <= 9; }, "> 0 && value <= 9");
+ SetConfigValue<uint32>(CONFIG_BATTLEGROUND_PLAYER_RESPAWN, "Battleground.PlayerRespawn", 30, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value >= 3; }, ">= 3");
+ SetConfigValue<uint32>(CONFIG_BATTLEGROUND_RESTORATION_BUFF_RESPAWN, "Battleground.RestorationBuffRespawn", 20, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value > 0; }, "> 0");
+ SetConfigValue<uint32>(CONFIG_BATTLEGROUND_BERSERKING_BUFF_RESPAWN, "Battleground.BerserkingBuffRespawn", 120, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value > 0; }, "> 0");
+ SetConfigValue<uint32>(CONFIG_BATTLEGROUND_SPEED_BUFF_RESPAWN, "Battleground.SpeedBuffRespawn", 150, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value > 0; }, "> 0");
+
+ SetConfigValue<uint32>(CONFIG_BATTLEGROUND_WARSONG_FLAGS, "Battleground.Warsong.Flags", 3);
+ SetConfigValue<uint32>(CONFIG_BATTLEGROUND_ARATHI_CAPTUREPOINTS, "Battleground.Arathi.CapturePoints", 1600);
+ SetConfigValue<uint32>(CONFIG_BATTLEGROUND_ALTERAC_REINFORCEMENTS, "Battleground.Alterac.Reinforcements", 600);
+ SetConfigValue<uint32>(CONFIG_BATTLEGROUND_ALTERAC_REP_ONBOSSDEATH, "Battleground.Alterac.ReputationOnBossDeath", 350);
+ SetConfigValue<uint32>(CONFIG_BATTLEGROUND_EYEOFTHESTORM_CAPTUREPOINTS, "Battleground.EyeOfTheStorm.CapturePoints", 1600);
+
+ SetConfigValue<uint32>(CONFIG_ARENA_MAX_RATING_DIFFERENCE, "Arena.MaxRatingDifference", 150);
+ SetConfigValue<uint32>(CONFIG_ARENA_RATING_DISCARD_TIMER, "Arena.RatingDiscardTimer", 10);
+ SetConfigValue<uint32>(CONFIG_ARENA_PREV_OPPONENTS_DISCARD_TIMER, "Arena.PreviousOpponentsDiscardTimer", 2);
+ SetConfigValue<bool>(CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS, "Arena.AutoDistributePoints", false);
+ SetConfigValue<uint32>(CONFIG_ARENA_AUTO_DISTRIBUTE_INTERVAL_DAYS, "Arena.AutoDistributeInterval", 7);
+ SetConfigValue<uint32>(CONFIG_ARENA_GAMES_REQUIRED, "Arena.GamesRequired", 10);
+ SetConfigValue<uint32>(CONFIG_ARENA_START_RATING, "Arena.ArenaStartRating", 0);
+ SetConfigValue<uint32>(CONFIG_LEGACY_ARENA_POINTS_CALC, "Arena.LegacyArenaPoints", 0);
+ SetConfigValue<uint32>(CONFIG_ARENA_START_PERSONAL_RATING, "Arena.ArenaStartPersonalRating", 0);
+ SetConfigValue<uint32>(CONFIG_ARENA_START_MATCHMAKER_RATING, "Arena.ArenaStartMatchmakerRating", 1500);
+ SetConfigValue<float>(CONFIG_ARENA_WIN_RATING_MODIFIER_1, "Arena.ArenaWinRatingModifier1", 48);
+ SetConfigValue<float>(CONFIG_ARENA_WIN_RATING_MODIFIER_2, "Arena.ArenaWinRatingModifier2", 24);
+ SetConfigValue<float>(CONFIG_ARENA_LOSE_RATING_MODIFIER, "Arena.ArenaLoseRatingModifier", 24);
+ SetConfigValue<float>(CONFIG_ARENA_MATCHMAKER_RATING_MODIFIER, "Arena.ArenaMatchmakerRatingModifier", 24);
+ SetConfigValue<bool>(CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE, "Arena.QueueAnnouncer.Enable", false);
+ SetConfigValue<bool>(CONFIG_ARENA_QUEUE_ANNOUNCER_PLAYERONLY, "Arena.QueueAnnouncer.PlayerOnly", false);
+ SetConfigValue<uint32>(CONFIG_ARENA_QUEUE_ANNOUNCER_DETAIL, "Arena.QueueAnnouncer.Detail", 3);
+
+ SetConfigValue<bool>(CONFIG_OFFHAND_CHECK_AT_SPELL_UNLEARN, "OffhandCheckAtSpellUnlearn", true);
+ SetConfigValue<uint32>(CONFIG_CREATURE_STOP_FOR_PLAYER, "Creature.MovingStopTimeForPlayer", 3);
+
+ SetConfigValue<uint32>(CONFIG_WATER_BREATH_TIMER, "WaterBreath.Timer", 180000, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value > 0; }, "> 0");
+
+ SetConfigValue<uint32>(CONFIG_CLIENTCACHE_VERSION, "ClientCacheVersion", 0);
+
+ SetConfigValue<uint32>(CONFIG_INSTANT_LOGOUT, "InstantLogout", SEC_MODERATOR);
+
+ SetConfigValue<uint32>(CONFIG_GUILD_EVENT_LOG_COUNT, "Guild.EventLogRecordsCount", GUILD_EVENTLOG_MAX_RECORDS, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value <= GUILD_EVENTLOG_MAX_RECORDS; }, "<= GUILD_EVENTLOG_MAX_RECORDS");
+ SetConfigValue<uint32>(CONFIG_GUILD_BANK_EVENT_LOG_COUNT, "Guild.BankEventLogRecordsCount", GUILD_BANKLOG_MAX_RECORDS, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value <= GUILD_BANKLOG_MAX_RECORDS; }, "<= GUILD_BANKLOG_MAX_RECORDS");
+
+ ///- Load the CharDelete related config options
+ SetConfigValue<uint32>(CONFIG_CHARDELETE_METHOD, "CharDelete.Method", 0);
+ SetConfigValue<uint32>(CONFIG_CHARDELETE_MIN_LEVEL, "CharDelete.MinLevel", 0);
+ SetConfigValue<uint32>(CONFIG_CHARDELETE_KEEP_DAYS, "CharDelete.KeepDays", 30);
+
+ ///- Load the ItemDelete related config options
+ SetConfigValue<bool>(CONFIG_ITEMDELETE_METHOD, "ItemDelete.Method", 0);
+ SetConfigValue<bool>(CONFIG_ITEMDELETE_VENDOR, "ItemDelete.Vendor", 0);
+ SetConfigValue<uint32>(CONFIG_ITEMDELETE_QUALITY, "ItemDelete.Quality", 3);
+ SetConfigValue<uint32>(CONFIG_ITEMDELETE_ITEM_LEVEL, "ItemDelete.ItemLevel", 80);
+ SetConfigValue<uint32>(CONFIG_ITEMDELETE_KEEP_DAYS, "ItemDelete.KeepDays", 0);
+
+ SetConfigValue<uint32>(CONFIG_FFA_PVP_TIMER, "FFAPvPTimer", 30);
+
+ SetConfigValue<uint32>(CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION, "LootNeedBeforeGreedILvlRestriction", 70);
+
+ SetConfigValue<bool>(CONFIG_PLAYER_SETTINGS_ENABLED, "EnablePlayerSettings", 0);
+
+ SetConfigValue<bool>(CONFIG_ALLOW_JOIN_BG_AND_LFG, "JoinBGAndLFG.Enable", false);
+
+ SetConfigValue<bool>(CONFIG_LEAVE_GROUP_ON_LOGOUT, "LeaveGroupOnLogout.Enabled", false);
+
+ SetConfigValue<bool>(CONFIG_QUEST_POI_ENABLED, "QuestPOI.Enabled", true);
+
+ SetConfigValue<uint32>(CONFIG_CHANGE_FACTION_MAX_MONEY, "ChangeFaction.MaxMoney", 0);
+
+ SetConfigValue<bool>(CONFIG_ALLOWS_RANK_MOD_FOR_PET_HEALTH, "Pet.RankMod.Health", true);
+
+ SetConfigValue<bool>(CONFIG_MUNCHING_BLIZZLIKE, "MunchingBlizzlike.Enabled", true);
+
+ SetConfigValue<bool>(CONFIG_ENABLE_DAZE, "Daze.Enabled", true);
+
+ SetConfigValue<uint32>(CONFIG_DAILY_RBG_MIN_LEVEL_AP_REWARD, "DailyRBGArenaPoints.MinLevel", 71);
+
+ // Respawn
+ SetConfigValue<float>(CONFIG_RESPAWN_DYNAMICRATE_CREATURE, "Respawn.DynamicRateCreature", 1);
+ SetConfigValue<uint32>(CONFIG_RESPAWN_DYNAMICMINIMUM_CREATURE, "Respawn.DynamicMinimumCreature", 10);
+
+ SetConfigValue<float>(CONFIG_RESPAWN_DYNAMICRATE_GAMEOBJECT, "Respawn.DynamicRateGameObject", 1);
+ SetConfigValue<uint32>(CONFIG_RESPAWN_DYNAMICMINIMUM_GAMEOBJECT, "Respawn.DynamicMinimumGameObject", 10);
+
+ SetConfigValue<bool>(CONFIG_VMAP_INDOOR_CHECK, "vmap.enableIndoorCheck", true);
+ SetConfigValue<bool>(CONFIG_PET_LOS, "vmap.petLOS", true);
+
+ SetConfigValue<bool>(CONFIG_VMAP_BLIZZLIKE_PVP_LOS, "vmap.BlizzlikePvPLOS", true);
+ SetConfigValue<bool>(CONFIG_VMAP_BLIZZLIKE_LOS_OPEN_WORLD, "vmap.BlizzlikeLOSInOpenWorld", true);
+
+ SetConfigValue<bool>(CONFIG_START_CUSTOM_SPELLS, "PlayerStart.CustomSpells", false);
+ SetConfigValue<uint32>(CONFIG_HONOR_AFTER_DUEL, "HonorPointsAfterDuel", 0);
+ SetConfigValue<bool>(CONFIG_START_ALL_EXPLORED, "PlayerStart.MapsExplored", false);
+ SetConfigValue<bool>(CONFIG_START_ALL_REP, "PlayerStart.AllReputation", false);
+ SetConfigValue<bool>(CONFIG_ALWAYS_MAXSKILL, "AlwaysMaxWeaponSkill", false);
+ SetConfigValue<bool>(CONFIG_PVP_TOKEN_ENABLE, "PvPToken.Enable", false);
+ SetConfigValue<uint32>(CONFIG_PVP_TOKEN_MAP_TYPE, "PvPToken.MapAllowType", 4);
+ SetConfigValue<uint32>(CONFIG_PVP_TOKEN_ID, "PvPToken.ItemID", 29434);
+ SetConfigValue<uint32>(CONFIG_PVP_TOKEN_COUNT, "PvPToken.ItemCount", 1, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value > 0; }, "> 0");
+
+ SetConfigValue<bool>(CONFIG_NO_RESET_TALENT_COST, "NoResetTalentsCost", false);
+ SetConfigValue<uint32>(CONFIG_TOGGLE_XP_COST, "ToggleXP.Cost", 100000);
+ SetConfigValue<bool>(CONFIG_SHOW_KICK_IN_WORLD, "ShowKickInWorld", false);
+ SetConfigValue<bool>(CONFIG_SHOW_MUTE_IN_WORLD, "ShowMuteInWorld", false);
+ SetConfigValue<bool>(CONFIG_SHOW_BAN_IN_WORLD, "ShowBanInWorld", false);
+ SetConfigValue<uint32>(CONFIG_NUMTHREADS, "MapUpdate.Threads", 1);
+ SetConfigValue<uint32>(CONFIG_MAX_RESULTS_LOOKUP_COMMANDS, "Command.LookupMaxResults", 0);
+
+ // Warden
+ SetConfigValue<bool>(CONFIG_WARDEN_ENABLED, "Warden.Enabled", true);
+ SetConfigValue<uint32>(CONFIG_WARDEN_NUM_MEM_CHECKS, "Warden.NumMemChecks", 3);
+ SetConfigValue<uint32>(CONFIG_WARDEN_NUM_LUA_CHECKS, "Warden.NumLuaChecks", 1);
+ SetConfigValue<uint32>(CONFIG_WARDEN_NUM_OTHER_CHECKS, "Warden.NumOtherChecks", 7);
+ SetConfigValue<uint32>(CONFIG_WARDEN_CLIENT_BAN_DURATION, "Warden.BanDuration", 86400);
+ SetConfigValue<uint32>(CONFIG_WARDEN_CLIENT_CHECK_HOLDOFF, "Warden.ClientCheckHoldOff", 30);
+ SetConfigValue<uint32>(CONFIG_WARDEN_CLIENT_FAIL_ACTION, "Warden.ClientCheckFailAction", 0);
+ SetConfigValue<uint32>(CONFIG_WARDEN_CLIENT_RESPONSE_DELAY, "Warden.ClientResponseDelay", 600);
+
+ // Dungeon finder
+ SetConfigValue<uint32>(CONFIG_LFG_OPTIONSMASK, "DungeonFinder.OptionsMask", 5);
+
+ SetConfigValue<bool>(CONFIG_LFG_CAST_DESERTER, "DungeonFinder.CastDeserter", true);
+
+ // DBC_ItemAttributes
+ SetConfigValue<bool>(CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES, "DBC.EnforceItemAttributes", true);
+
+ // Max instances per hour
+ SetConfigValue<uint32>(CONFIG_MAX_INSTANCES_PER_HOUR, "AccountInstancesPerHour", 5);
+
+ // AutoBroadcast
+ SetConfigValue<bool>(CONFIG_AUTOBROADCAST, "AutoBroadcast.On", false);
+ SetConfigValue<uint32>(CONFIG_AUTOBROADCAST_CENTER, "AutoBroadcast.Center", 0);
+ SetConfigValue<uint32>(CONFIG_AUTOBROADCAST_INTERVAL, "AutoBroadcast.Timer", 60000);
+ SetConfigValue<uint32>(CONFIG_AUTOBROADCAST_MIN_LEVEL_DISABLE, "AutoBroadcast.MinDisableLevel", 0);
+
+ // MySQL ping time interval
+ SetConfigValue<uint32>(CONFIG_DB_PING_INTERVAL, "MaxPingTime", 30);
+
+ // misc
+ SetConfigValue<bool>(CONFIG_PDUMP_NO_PATHS, "PlayerDump.DisallowPaths", true);
+ SetConfigValue<bool>(CONFIG_PDUMP_NO_OVERWRITE, "PlayerDump.DisallowOverwrite", true);
+ SetConfigValue<bool>(CONFIG_ENABLE_MMAPS, "MoveMaps.Enable", true);
+
+ // Wintergrasp
+ SetConfigValue<uint32>(CONFIG_WINTERGRASP_ENABLE, "Wintergrasp.Enable", 1);
+ SetConfigValue<uint32>(CONFIG_WINTERGRASP_PLR_MAX, "Wintergrasp.PlayerMax", 120);
+ SetConfigValue<uint32>(CONFIG_WINTERGRASP_PLR_MIN, "Wintergrasp.PlayerMin", 0);
+ SetConfigValue<uint32>(CONFIG_WINTERGRASP_PLR_MIN_LVL, "Wintergrasp.PlayerMinLvl", 75);
+ SetConfigValue<uint32>(CONFIG_WINTERGRASP_BATTLETIME, "Wintergrasp.BattleTimer", 30);
+ SetConfigValue<uint32>(CONFIG_WINTERGRASP_NOBATTLETIME, "Wintergrasp.NoBattleTimer", 150);
+ SetConfigValue<uint32>(CONFIG_WINTERGRASP_RESTART_AFTER_CRASH, "Wintergrasp.CrashRestartTimer", 10);
+
+ SetConfigValue<uint32>(CONFIG_BIRTHDAY_TIME, "BirthdayTime", 1222964635);
+ SetConfigValue<bool>(CONFIG_MINIGOB_MANABONK, "Minigob.Manabonk.Enable", true);
+
+ SetConfigValue<bool>(CONFIG_ENABLE_CONTINENT_TRANSPORT, "IsContinentTransport.Enabled", true);
+ SetConfigValue<bool>(CONFIG_ENABLE_CONTINENT_TRANSPORT_PRELOADING, "IsPreloadedContinentTransport.Enabled", false);
+
+ SetConfigValue<bool>(CONFIG_IP_BASED_ACTION_LOGGING, "Allow.IP.Based.Action.Logging", false);
+
+ // Whether to use LoS from game objects
+ SetConfigValue<bool>(CONFIG_CHECK_GOBJECT_LOS, "CheckGameObjectLoS", true);
+
+ SetConfigValue<bool>(CONFIG_CALCULATE_CREATURE_ZONE_AREA_DATA, "Calculate.Creature.Zone.Area.Data", false);
+ SetConfigValue<bool>(CONFIG_CALCULATE_GAMEOBJECT_ZONE_AREA_DATA, "Calculate.Gameoject.Zone.Area.Data", false);
+
+ // Player can join LFG anywhere
+ SetConfigValue<bool>(CONFIG_LFG_LOCATION_ALL, "LFG.Location.All", false);
+
+ // Prevent players AFK from being logged out
+ SetConfigValue<uint32>(CONFIG_AFK_PREVENT_LOGOUT, "PreventAFKLogout", 0);
+
+ // Preload all grids of all non-instanced maps
+ SetConfigValue<bool>(CONFIG_PRELOAD_ALL_NON_INSTANCED_MAP_GRIDS, "PreloadAllNonInstancedMapGrids", false);
+
+ // ICC buff override
+ SetConfigValue<uint32>(CONFIG_ICC_BUFF_HORDE, "ICC.Buff.Horde", 73822);
+ SetConfigValue<uint32>(CONFIG_ICC_BUFF_ALLIANCE, "ICC.Buff.Alliance", 73828);
+
+ SetConfigValue<bool>(CONFIG_SET_ALL_CREATURES_WITH_WAYPOINT_MOVEMENT_ACTIVE, "SetAllCreaturesWithWaypointMovementActive", false);
+
+ // packet spoof punishment
+ SetConfigValue<uint32>(CONFIG_PACKET_SPOOF_BANMODE, "PacketSpoof.BanMode", 0, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value == 0; }, "== 0");
+ SetConfigValue<uint32>(CONFIG_PACKET_SPOOF_BANDURATION, "PacketSpoof.BanDuration", 86400);
+
+ // Random Battleground Rewards
+ SetConfigValue<uint32>(CONFIG_BG_REWARD_WINNER_HONOR_FIRST, "Battleground.RewardWinnerHonorFirst", 30);
+ SetConfigValue<uint32>(CONFIG_BG_REWARD_WINNER_ARENA_FIRST, "Battleground.RewardWinnerArenaFirst", 25);
+ SetConfigValue<uint32>(CONFIG_BG_REWARD_WINNER_HONOR_LAST, "Battleground.RewardWinnerHonorLast", 15);
+ SetConfigValue<uint32>(CONFIG_BG_REWARD_WINNER_ARENA_LAST, "Battleground.RewardWinnerArenaLast", 0);
+ SetConfigValue<uint32>(CONFIG_BG_REWARD_LOSER_HONOR_FIRST, "Battleground.RewardLoserHonorFirst", 5);
+ SetConfigValue<uint32>(CONFIG_BG_REWARD_LOSER_HONOR_LAST, "Battleground.RewardLoserHonorLast", 5);
+
+ SetConfigValue<uint32>(CONFIG_WAYPOINT_MOVEMENT_STOP_TIME_FOR_PLAYER, "WaypointMovementStopTimeForPlayer", 120);
+
+ SetConfigValue<uint32>(CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE, "DungeonAccessRequirements.PrintMode", 1);
+ SetConfigValue<bool>(CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PORTAL_CHECK_ILVL, "DungeonAccessRequirements.PortalAvgIlevelCheck", false);
+ SetConfigValue<bool>(CONFIG_DUNGEON_ACCESS_REQUIREMENTS_LFG_DBC_LEVEL_OVERRIDE, "DungeonAccessRequirements.LFGLevelDBCOverride", false);
+ SetConfigValue<uint32>(CONFIG_DUNGEON_ACCESS_REQUIREMENTS_OPTIONAL_STRING_ID, "DungeonAccessRequirements.OptionalStringID", 0);
+ SetConfigValue<uint32>(CONFIG_NPC_EVADE_IF_NOT_REACHABLE, "NpcEvadeIfTargetIsUnreachable", 5);
+ SetConfigValue<uint32>(CONFIG_NPC_REGEN_TIME_IF_NOT_REACHABLE_IN_RAID, "NpcRegenHPTimeIfTargetIsUnreachable", 10);
+ SetConfigValue<bool>(CONFIG_REGEN_HP_CANNOT_REACH_TARGET_IN_RAID, "NpcRegenHPIfTargetIsUnreachable", true);
+
+ //Debug
+ SetConfigValue<bool>(CONFIG_DEBUG_BATTLEGROUND, "Debug.Battleground", false);
+ SetConfigValue<bool>(CONFIG_DEBUG_ARENA, "Debug.Arena", false);
+
+ SetConfigValue<uint32>(CONFIG_GM_LEVEL_CHANNEL_MODERATION, "Channel.ModerationGMLevel", 1);
+
+ SetConfigValue<bool>(CONFIG_SET_BOP_ITEM_TRADEABLE, "Item.SetItemTradeable", true);
+
+ // Specifies if IP addresses can be logged to the database
+ SetConfigValue<bool>(CONFIG_ALLOW_LOGGING_IP_ADDRESSES_IN_DATABASE, "AllowLoggingIPAddressesInDatabase", true);
+
+ // LFG group mechanics.
+ SetConfigValue<uint32>(CONFIG_LFG_MAX_KICK_COUNT, "LFG.MaxKickCount", 2, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value <= 3; }, "<= 3");
+
+ SetConfigValue<uint32>(CONFIG_LFG_KICK_PREVENTION_TIMER, "LFG.KickPreventionTimer", 15, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value <= 15 * MINUTE * IN_MILLISECONDS; }, "<= 15 * MINUTE * IN_MILLISECONDS");
+
+ // Realm Availability
+ SetConfigValue<bool>(CONFIG_REALM_LOGIN_ENABLED, "World.RealmAvailability", true);
+
+ // AH Worker threads
+ SetConfigValue<uint32>(CONFIG_AUCTIONHOUSE_WORKERTHREADS, "AuctionHouse.WorkerThreads", 1, ConfigValueCache::Reloadable::No, [](uint32 const& value) { return value >= 1; }, ">= 1");
+
+ // SpellQueue
+ SetConfigValue<bool>(CONFIG_SPELL_QUEUE_ENABLED, "SpellQueue.Enabled", true);
+ SetConfigValue<uint32>(CONFIG_SPELL_QUEUE_WINDOW, "SpellQueue.Window", 400);
+
+ SetConfigValue<uint32>(CONFIG_SUNSREACH_COUNTER_MAX, "Sunsreach.CounterMax", 10000);
+
+ SetConfigValue<std::string>(CONFIG_NEW_CHAR_STRING, "PlayerStart.String", "");
+}
diff --git a/src/server/game/World/WorldConfig.h b/src/server/game/World/WorldConfig.h
new file mode 100644
index 0000000000..7474df38e4
--- /dev/null
+++ b/src/server/game/World/WorldConfig.h
@@ -0,0 +1,487 @@
+/*
+ * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation; either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef WORLDCONFIG_H
+#define WORLDCONFIG_H
+
+#include "ConfigValueCache.h"
+
+enum ServerConfigs
+{
+ CONFIG_DURABILITY_LOSS_IN_PVP = 0,
+ CONFIG_ADDON_CHANNEL,
+ CONFIG_ALLOW_PLAYER_COMMANDS,
+ CONFIG_CLEAN_CHARACTER_DB,
+ CONFIG_STATS_SAVE_ONLY_ON_LOGOUT,
+ CONFIG_ALLOW_TWO_SIDE_ACCOUNTS,
+ CONFIG_ALLOW_TWO_SIDE_INTERACTION_CALENDAR,
+ CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT,
+ CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL,
+ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP,
+ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD,
+ CONFIG_ALLOW_TWO_SIDE_INTERACTION_ARENA,
+ CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION,
+ CONFIG_ALLOW_TWO_SIDE_INTERACTION_MAIL,
+ CONFIG_ALLOW_TWO_SIDE_WHO_LIST,
+ CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND,
+ CONFIG_ALLOW_TWO_SIDE_TRADE,
+ CONFIG_ALL_TAXI_PATHS,
+ CONFIG_INSTANCE_IGNORE_LEVEL,
+ CONFIG_INSTANCE_IGNORE_RAID,
+ CONFIG_INSTANCE_GMSUMMON_PLAYER,
+ CONFIG_INSTANCE_SHARED_ID,
+ CONFIG_ALLOW_GM_GROUP,
+ CONFIG_ALLOW_GM_FRIEND,
+ CONFIG_GM_LOWER_SECURITY,
+ CONFIG_SKILL_PROSPECTING,
+ CONFIG_SKILL_MILLING,
+ CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY,
+ CONFIG_WEATHER,
+ CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL,
+ CONFIG_QUEST_IGNORE_RAID,
+ CONFIG_DETECT_POS_COLLISION,
+ CONFIG_RESTRICTED_LFG_CHANNEL,
+ CONFIG_SILENTLY_GM_JOIN_TO_CHANNEL,
+ CONFIG_TALENTS_INSPECTING,
+ CONFIG_CHAT_FAKE_MESSAGE_PREVENTING,
+ CONFIG_CHAT_MUTE_FIRST_LOGIN,
+ CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP,
+ CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE,
+ CONFIG_DEATH_BONES_WORLD,
+ CONFIG_DEATH_BONES_BG_OR_ARENA,
+ CONFIG_DIE_COMMAND_MODE,
+ CONFIG_DECLINED_NAMES_USED,
+ CONFIG_BATTLEGROUND_DISABLE_QUEST_SHARE_IN_BG,
+ CONFIG_BATTLEGROUND_DISABLE_READY_CHECK_IN_BG,
+ CONFIG_BATTLEGROUND_CAST_DESERTER,
+ CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE,
+ CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY,
+ CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_TIMED,
+ CONFIG_BATTLEGROUND_STORE_STATISTICS_ENABLE,
+ CONFIG_BATTLEGROUND_TRACK_DESERTERS,
+ CONFIG_BG_XP_FOR_KILL,
+ CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS,
+ CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE,
+ CONFIG_ARENA_QUEUE_ANNOUNCER_PLAYERONLY,
+ CONFIG_OFFHAND_CHECK_AT_SPELL_UNLEARN,
+ CONFIG_VMAP_INDOOR_CHECK,
+ CONFIG_PET_LOS,
+ CONFIG_START_CUSTOM_SPELLS,
+ CONFIG_START_ALL_EXPLORED,
+ CONFIG_START_ALL_REP,
+ CONFIG_ALWAYS_MAXSKILL,
+ CONFIG_PVP_TOKEN_ENABLE,
+ CONFIG_NO_RESET_TALENT_COST,
+ CONFIG_SHOW_KICK_IN_WORLD,
+ CONFIG_SHOW_MUTE_IN_WORLD,
+ CONFIG_SHOW_BAN_IN_WORLD,
+ CONFIG_AUTOBROADCAST,
+ CONFIG_ALLOW_TICKETS,
+ CONFIG_DELETE_CHARACTER_TICKET_TRACE,
+ CONFIG_LFG_CAST_DESERTER,
+ CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES,
+ CONFIG_PRESERVE_CUSTOM_CHANNELS,
+ CONFIG_PDUMP_NO_PATHS,
+ CONFIG_PDUMP_NO_OVERWRITE,
+ CONFIG_ENABLE_MMAPS,
+ CONFIG_ENABLE_LOGIN_AFTER_DC,
+ CONFIG_DONT_CACHE_RANDOM_MOVEMENT_PATHS,
+ CONFIG_QUEST_IGNORE_AUTO_ACCEPT,
+ CONFIG_QUEST_IGNORE_AUTO_COMPLETE,
+ CONFIG_QUEST_ENABLE_QUEST_TRACKER,
+ CONFIG_WARDEN_ENABLED,
+ CONFIG_ENABLE_CONTINENT_TRANSPORT,
+ CONFIG_ENABLE_CONTINENT_TRANSPORT_PRELOADING,
+ CONFIG_MINIGOB_MANABONK,
+ CONFIG_IP_BASED_ACTION_LOGGING,
+ CONFIG_CALCULATE_CREATURE_ZONE_AREA_DATA,
+ CONFIG_CALCULATE_GAMEOBJECT_ZONE_AREA_DATA,
+ CONFIG_CHECK_GOBJECT_LOS,
+ CONFIG_CLOSE_IDLE_CONNECTIONS,
+ CONFIG_LFG_LOCATION_ALL,
+ CONFIG_PRELOAD_ALL_NON_INSTANCED_MAP_GRIDS,
+ CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE,
+ CONFIG_ITEMDELETE_METHOD,
+ CONFIG_ITEMDELETE_VENDOR,
+ CONFIG_SET_ALL_CREATURES_WITH_WAYPOINT_MOVEMENT_ACTIVE,
+ CONFIG_DEBUG_BATTLEGROUND,
+ CONFIG_DEBUG_ARENA,
+ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PORTAL_CHECK_ILVL,
+ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_LFG_DBC_LEVEL_OVERRIDE,
+ CONFIG_REGEN_HP_CANNOT_REACH_TARGET_IN_RAID,
+ CONFIG_SET_BOP_ITEM_TRADEABLE,
+ CONFIG_ALLOW_LOGGING_IP_ADDRESSES_IN_DATABASE,
+ CONFIG_REALM_LOGIN_ENABLED,
+ CONFIG_PLAYER_SETTINGS_ENABLED,
+ CONFIG_ALLOW_JOIN_BG_AND_LFG,
+ CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS,
+ CONFIG_LEAVE_GROUP_ON_LOGOUT,
+ CONFIG_QUEST_POI_ENABLED,
+ CONFIG_VMAP_BLIZZLIKE_PVP_LOS,
+ CONFIG_VMAP_BLIZZLIKE_LOS_OPEN_WORLD,
+ CONFIG_OBJECT_SPARKLES,
+ CONFIG_LOW_LEVEL_REGEN_BOOST,
+ CONFIG_OBJECT_QUEST_MARKERS,
+ CONFIG_STRICT_NAMES_RESERVED,
+ CONFIG_STRICT_NAMES_PROFANITY,
+ CONFIG_ALLOWS_RANK_MOD_FOR_PET_HEALTH,
+ CONFIG_MUNCHING_BLIZZLIKE,
+ CONFIG_ENABLE_DAZE,
+ CONFIG_SPELL_QUEUE_ENABLED,
+ CONFIG_GROUP_XP_DISTANCE,
+ CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE,
+ CONFIG_SIGHT_MONSTER,
+ CONFIG_LISTEN_RANGE_SAY,
+ CONFIG_LISTEN_RANGE_TEXTEMOTE,
+ CONFIG_LISTEN_RANGE_YELL,
+ CONFIG_CREATURE_LEASH_RADIUS,
+ CONFIG_CREATURE_FAMILY_FLEE_ASSISTANCE_RADIUS,
+ CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS,
+ CONFIG_CHANCE_OF_GM_SURVEY,
+ CONFIG_ARENA_WIN_RATING_MODIFIER_1,
+ CONFIG_ARENA_WIN_RATING_MODIFIER_2,
+ CONFIG_ARENA_LOSE_RATING_MODIFIER,
+ CONFIG_ARENA_MATCHMAKER_RATING_MODIFIER,
+ CONFIG_RESPAWN_DYNAMICRATE_GAMEOBJECT,
+ CONFIG_RESPAWN_DYNAMICRATE_CREATURE,
+ CONFIG_COMPRESSION,
+ CONFIG_INTERVAL_MAPUPDATE,
+ CONFIG_INTERVAL_CHANGEWEATHER,
+ CONFIG_INTERVAL_DISCONNECT_TOLERANCE,
+ CONFIG_INTERVAL_SAVE,
+ CONFIG_PORT_WORLD,
+ CONFIG_SOCKET_TIMEOUTTIME,
+ CONFIG_SESSION_ADD_DELAY,
+ CONFIG_GAME_TYPE,
+ CONFIG_REALM_ZONE,
+ CONFIG_STRICT_PLAYER_NAMES,
+ CONFIG_STRICT_CHARTER_NAMES,
+ CONFIG_STRICT_CHANNEL_NAMES,
+ CONFIG_STRICT_PET_NAMES,
+ CONFIG_MIN_PLAYER_NAME,
+ CONFIG_MIN_CHARTER_NAME,
+ CONFIG_MIN_PET_NAME,
+ CONFIG_CHARACTER_CREATING_DISABLED,
+ CONFIG_CHARACTER_CREATING_DISABLED_RACEMASK,
+ CONFIG_CHARACTER_CREATING_DISABLED_CLASSMASK,
+ CONFIG_CHARACTERS_PER_ACCOUNT,
+ CONFIG_CHARACTERS_PER_REALM,
+ CONFIG_CREATURE_STOP_FOR_PLAYER,
+ CONFIG_HEROIC_CHARACTERS_PER_REALM,
+ CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_HEROIC_CHARACTER,
+ CONFIG_SKIP_CINEMATICS,
+ CONFIG_MAX_PLAYER_LEVEL,
+ CONFIG_MIN_DUALSPEC_LEVEL,
+ CONFIG_START_PLAYER_LEVEL,
+ CONFIG_START_HEROIC_PLAYER_LEVEL,
+ CONFIG_START_PLAYER_MONEY,
+ CONFIG_START_HEROIC_PLAYER_MONEY,
+ CONFIG_MAX_HONOR_POINTS,
+ CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT,
+ CONFIG_START_HONOR_POINTS,
+ CONFIG_MAX_ARENA_POINTS,
+ CONFIG_START_ARENA_POINTS,
+ CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL,
+ CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE,
+ CONFIG_INSTANCE_RESET_TIME_HOUR,
+ CONFIG_INSTANCE_RESET_TIME_RELATIVE_TIMESTAMP,
+ CONFIG_INSTANCE_UNLOAD_DELAY,
+ CONFIG_MAX_PRIMARY_TRADE_SKILL,
+ CONFIG_MIN_PETITION_SIGNS,
+ CONFIG_GM_LOGIN_STATE,
+ CONFIG_GM_VISIBLE_STATE,
+ CONFIG_GM_CHAT,
+ CONFIG_GM_WHISPERING_TO,
+ CONFIG_GM_LEVEL_IN_GM_LIST,
+ CONFIG_GM_LEVEL_IN_WHO_LIST,
+ CONFIG_START_GM_LEVEL,
+ CONFIG_GROUP_VISIBILITY,
+ CONFIG_MAIL_DELIVERY_DELAY,
+ CONFIG_UPTIME_UPDATE,
+ CONFIG_SKILL_CHANCE_ORANGE,
+ CONFIG_SKILL_CHANCE_YELLOW,
+ CONFIG_SKILL_CHANCE_GREEN,
+ CONFIG_SKILL_CHANCE_GREY,
+ CONFIG_SKILL_CHANCE_MINING_STEPS,
+ CONFIG_SKILL_CHANCE_SKINNING_STEPS,
+ CONFIG_SKILL_GAIN_CRAFTING,
+ CONFIG_SKILL_GAIN_DEFENSE,
+ CONFIG_SKILL_GAIN_GATHERING,
+ CONFIG_SKILL_GAIN_WEAPON,
+ CONFIG_MAX_OVERSPEED_PINGS,
+ CONFIG_EXPANSION,
+ CONFIG_CHATFLOOD_MESSAGE_COUNT,
+ CONFIG_CHATFLOOD_MESSAGE_DELAY,
+ CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT,
+ CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY,
+ CONFIG_CHATFLOOD_MUTE_TIME,
+ CONFIG_EVENT_ANNOUNCE,
+ CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY,
+ CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD,
+ CONFIG_CREATURE_FAMILY_FLEE_DELAY,
+ CONFIG_WORLD_BOSS_LEVEL_DIFF,
+ CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF,
+ CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF,
+ CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY,
+ CONFIG_CHAT_STRICT_LINK_CHECKING_KICK,
+ CONFIG_CHAT_CHANNEL_LEVEL_REQ,
+ CONFIG_CHAT_WHISPER_LEVEL_REQ,
+ CONFIG_CHAT_SAY_LEVEL_REQ,
+ CONFIG_PARTY_LEVEL_REQ,
+ CONFIG_CHAT_TIME_MUTE_FIRST_LOGIN,
+ CONFIG_TRADE_LEVEL_REQ,
+ CONFIG_TICKET_LEVEL_REQ,
+ CONFIG_AUCTION_LEVEL_REQ,
+ CONFIG_MAIL_LEVEL_REQ,
+ CONFIG_CORPSE_DECAY_NORMAL,
+ CONFIG_CORPSE_DECAY_RARE,
+ CONFIG_CORPSE_DECAY_ELITE,
+ CONFIG_CORPSE_DECAY_RAREELITE,
+ CONFIG_CORPSE_DECAY_WORLDBOSS,
+ CONFIG_DEATH_SICKNESS_LEVEL,
+ CONFIG_INSTANT_LOGOUT,
+ CONFIG_DISABLE_BREATHING,
+ CONFIG_BATTLEGROUND_OVERRIDE_LOWLEVELS_MINPLAYERS,
+ CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_SPAM_DELAY,
+ CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_TIMER,
+ CONFIG_BATTLEGROUND_PREMATURE_FINISH_TIMER,
+ CONFIG_BATTLEGROUND_PREMADE_GROUP_WAIT_FOR_MATCH,
+ CONFIG_BATTLEGROUND_REPORT_AFK_TIMER,
+ CONFIG_BATTLEGROUND_REPORT_AFK,
+ CONFIG_BATTLEGROUND_INVITATION_TYPE,
+ CONFIG_BATTLEGROUND_PLAYER_RESPAWN,
+ CONFIG_BATTLEGROUND_RESTORATION_BUFF_RESPAWN,
+ CONFIG_BATTLEGROUND_BERSERKING_BUFF_RESPAWN,
+ CONFIG_BATTLEGROUND_SPEED_BUFF_RESPAWN,
+ CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_LIMIT_MIN_LEVEL,
+ CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_LIMIT_MIN_PLAYERS,
+ CONFIG_BATTLEGROUND_WARSONG_FLAGS,
+ CONFIG_BATTLEGROUND_ARATHI_CAPTUREPOINTS,
+ CONFIG_BATTLEGROUND_ALTERAC_REINFORCEMENTS,
+ CONFIG_BATTLEGROUND_ALTERAC_REP_ONBOSSDEATH,
+ CONFIG_BATTLEGROUND_EYEOFTHESTORM_CAPTUREPOINTS,
+ CONFIG_WINTERGRASP_ENABLE,
+ CONFIG_ARENA_MAX_RATING_DIFFERENCE,
+ CONFIG_ARENA_RATING_DISCARD_TIMER,
+ CONFIG_ARENA_PREV_OPPONENTS_DISCARD_TIMER,
+ CONFIG_ARENA_AUTO_DISTRIBUTE_INTERVAL_DAYS,
+ CONFIG_ARENA_GAMES_REQUIRED,
+ CONFIG_ARENA_START_RATING,
+ CONFIG_LEGACY_ARENA_POINTS_CALC,
+ CONFIG_ARENA_START_PERSONAL_RATING,
+ CONFIG_ARENA_START_MATCHMAKER_RATING,
+ CONFIG_ARENA_QUEUE_ANNOUNCER_DETAIL,
+ CONFIG_HONOR_AFTER_DUEL,
+ CONFIG_PVP_TOKEN_MAP_TYPE,
+ CONFIG_PVP_TOKEN_ID,
+ CONFIG_PVP_TOKEN_COUNT,
+ CONFIG_ENABLE_SINFO_LOGIN,
+ CONFIG_NUMTHREADS,
+ CONFIG_LOGDB_CLEARINTERVAL,
+ CONFIG_LOGDB_CLEARTIME,
+ CONFIG_TELEPORT_TIMEOUT_NEAR,
+ CONFIG_TELEPORT_TIMEOUT_FAR,
+ CONFIG_MAX_ALLOWED_MMR_DROP,
+ CONFIG_CLIENTCACHE_VERSION,
+ CONFIG_GUILD_EVENT_LOG_COUNT,
+ CONFIG_GUILD_BANK_EVENT_LOG_COUNT,
+ CONFIG_MIN_LEVEL_STAT_SAVE,
+ CONFIG_RANDOM_BG_RESET_HOUR,
+ CONFIG_CALENDAR_DELETE_OLD_EVENTS_HOUR,
+ CONFIG_GUILD_RESET_HOUR,
+ CONFIG_CHARDELETE_KEEP_DAYS,
+ CONFIG_CHARDELETE_METHOD,
+ CONFIG_CHARDELETE_MIN_LEVEL,
+ CONFIG_AUTOBROADCAST_CENTER,
+ CONFIG_AUTOBROADCAST_INTERVAL,
+ CONFIG_AUTOBROADCAST_MIN_LEVEL_DISABLE,
+ CONFIG_MAX_RESULTS_LOOKUP_COMMANDS,
+ CONFIG_DB_PING_INTERVAL,
+ CONFIG_PRESERVE_CUSTOM_CHANNEL_DURATION,
+ CONFIG_PERSISTENT_CHARACTER_CLEAN_FLAGS,
+ CONFIG_LFG_OPTIONSMASK,
+ CONFIG_MAX_INSTANCES_PER_HOUR,
+ CONFIG_WINTERGRASP_PLR_MAX,
+ CONFIG_WINTERGRASP_PLR_MIN,
+ CONFIG_WINTERGRASP_PLR_MIN_LVL,
+ CONFIG_WINTERGRASP_BATTLETIME,
+ CONFIG_WINTERGRASP_NOBATTLETIME,
+ CONFIG_WINTERGRASP_RESTART_AFTER_CRASH,
+ CONFIG_PACKET_SPOOF_BANMODE,
+ CONFIG_PACKET_SPOOF_BANDURATION,
+ CONFIG_WARDEN_CLIENT_RESPONSE_DELAY,
+ CONFIG_WARDEN_CLIENT_CHECK_HOLDOFF,
+ CONFIG_WARDEN_CLIENT_FAIL_ACTION,
+ CONFIG_WARDEN_CLIENT_BAN_DURATION,
+ CONFIG_WARDEN_NUM_MEM_CHECKS,
+ CONFIG_WARDEN_NUM_LUA_CHECKS,
+ CONFIG_WARDEN_NUM_OTHER_CHECKS,
+ CONFIG_BIRTHDAY_TIME,
+ CONFIG_SOCKET_TIMEOUTTIME_ACTIVE,
+ CONFIG_INSTANT_TAXI,
+ CONFIG_AFK_PREVENT_LOGOUT,
+ CONFIG_ICC_BUFF_HORDE,
+ CONFIG_ICC_BUFF_ALLIANCE,
+ CONFIG_ITEMDELETE_QUALITY,
+ CONFIG_ITEMDELETE_ITEM_LEVEL,
+ CONFIG_ITEMDELETE_KEEP_DAYS,
+ CONFIG_BG_REWARD_WINNER_HONOR_FIRST,
+ CONFIG_BG_REWARD_WINNER_ARENA_FIRST,
+ CONFIG_BG_REWARD_WINNER_HONOR_LAST,
+ CONFIG_BG_REWARD_WINNER_ARENA_LAST,
+ CONFIG_BG_REWARD_LOSER_HONOR_FIRST,
+ CONFIG_BG_REWARD_LOSER_HONOR_LAST,
+ CONFIG_CHARTER_COST_GUILD,
+ CONFIG_CHARTER_COST_ARENA_2v2,
+ CONFIG_CHARTER_COST_ARENA_3v3,
+ CONFIG_CHARTER_COST_ARENA_5v5,
+ CONFIG_MAX_WHO_LIST_RETURN,
+ CONFIG_WAYPOINT_MOVEMENT_STOP_TIME_FOR_PLAYER,
+ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE,
+ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_OPTIONAL_STRING_ID,
+ CONFIG_GUILD_BANK_INITIAL_TABS,
+ CONFIG_GUILD_BANK_TAB_COST_0,
+ CONFIG_GUILD_BANK_TAB_COST_1,
+ CONFIG_GUILD_BANK_TAB_COST_2,
+ CONFIG_GUILD_BANK_TAB_COST_3,
+ CONFIG_GUILD_BANK_TAB_COST_4,
+ CONFIG_GUILD_BANK_TAB_COST_5,
+ CONFIG_GUILD_MEMBER_LIMIT,
+ CONFIG_GM_LEVEL_CHANNEL_MODERATION,
+ CONFIG_TOGGLE_XP_COST,
+ CONFIG_NPC_EVADE_IF_NOT_REACHABLE,
+ CONFIG_NPC_REGEN_TIME_IF_NOT_REACHABLE_IN_RAID,
+ CONFIG_FFA_PVP_TIMER,
+ CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION,
+ CONFIG_LFG_MAX_KICK_COUNT,
+ CONFIG_LFG_KICK_PREVENTION_TIMER,
+ CONFIG_CHANGE_FACTION_MAX_MONEY,
+ CONFIG_WATER_BREATH_TIMER,
+ CONFIG_DAILY_RBG_MIN_LEVEL_AP_REWARD,
+ CONFIG_AUCTIONHOUSE_WORKERTHREADS,
+ CONFIG_SPELL_QUEUE_WINDOW,
+ CONFIG_SUNSREACH_COUNTER_MAX,
+ CONFIG_RESPAWN_DYNAMICMINIMUM_GAMEOBJECT,
+ CONFIG_RESPAWN_DYNAMICMINIMUM_CREATURE,
+ RATE_HEALTH,
+ RATE_POWER_MANA,
+ RATE_POWER_RAGE_INCOME,
+ RATE_POWER_RAGE_LOSS,
+ RATE_POWER_RUNICPOWER_INCOME,
+ RATE_POWER_RUNICPOWER_LOSS,
+ RATE_POWER_FOCUS,
+ RATE_POWER_ENERGY,
+ RATE_SKILL_DISCOVERY,
+ RATE_DROP_ITEM_POOR,
+ RATE_DROP_ITEM_NORMAL,
+ RATE_DROP_ITEM_UNCOMMON,
+ RATE_DROP_ITEM_RARE,
+ RATE_DROP_ITEM_EPIC,
+ RATE_DROP_ITEM_LEGENDARY,
+ RATE_DROP_ITEM_ARTIFACT,
+ RATE_DROP_ITEM_REFERENCED,
+ RATE_DROP_ITEM_REFERENCED_AMOUNT,
+ RATE_DROP_ITEM_GROUP_AMOUNT,
+ RATE_SELLVALUE_ITEM_POOR,
+ RATE_SELLVALUE_ITEM_NORMAL,
+ RATE_SELLVALUE_ITEM_UNCOMMON,
+ RATE_SELLVALUE_ITEM_RARE,
+ RATE_SELLVALUE_ITEM_EPIC,
+ RATE_SELLVALUE_ITEM_LEGENDARY,
+ RATE_SELLVALUE_ITEM_ARTIFACT,
+ RATE_SELLVALUE_ITEM_HEIRLOOM,
+ RATE_BUYVALUE_ITEM_POOR,
+ RATE_BUYVALUE_ITEM_NORMAL,
+ RATE_BUYVALUE_ITEM_UNCOMMON,
+ RATE_BUYVALUE_ITEM_RARE,
+ RATE_BUYVALUE_ITEM_EPIC,
+ RATE_BUYVALUE_ITEM_LEGENDARY,
+ RATE_BUYVALUE_ITEM_ARTIFACT,
+ RATE_BUYVALUE_ITEM_HEIRLOOM,
+ RATE_DROP_MONEY,
+ RATE_REWARD_QUEST_MONEY,
+ RATE_REWARD_BONUS_MONEY,
+ RATE_XP_KILL,
+ RATE_XP_BG_KILL_AV,
+ RATE_XP_BG_KILL_WSG,
+ RATE_XP_BG_KILL_AB,
+ RATE_XP_BG_KILL_EOTS,
+ RATE_XP_BG_KILL_SOTA,
+ RATE_XP_BG_KILL_IC,
+ RATE_XP_QUEST,
+ RATE_XP_QUEST_DF,
+ RATE_XP_EXPLORE,
+ RATE_XP_PET,
+ RATE_XP_PET_NEXT_LEVEL,
+ RATE_REPAIRCOST,
+ RATE_REPUTATION_GAIN,
+ RATE_REPUTATION_LOWLEVEL_KILL,
+ RATE_REPUTATION_LOWLEVEL_QUEST,
+ RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS,
+ RATE_CREATURE_NORMAL_HP,
+ RATE_CREATURE_ELITE_ELITE_HP,
+ RATE_CREATURE_ELITE_RAREELITE_HP,
+ RATE_CREATURE_ELITE_WORLDBOSS_HP,
+ RATE_CREATURE_ELITE_RARE_HP,
+ RATE_CREATURE_NORMAL_DAMAGE,
+ RATE_CREATURE_ELITE_ELITE_DAMAGE,
+ RATE_CREATURE_ELITE_RAREELITE_DAMAGE,
+ RATE_CREATURE_ELITE_WORLDBOSS_DAMAGE,
+ RATE_CREATURE_ELITE_RARE_DAMAGE,
+ RATE_CREATURE_NORMAL_SPELLDAMAGE,
+ RATE_CREATURE_ELITE_ELITE_SPELLDAMAGE,
+ RATE_CREATURE_ELITE_RAREELITE_SPELLDAMAGE,
+ RATE_CREATURE_ELITE_WORLDBOSS_SPELLDAMAGE,
+ RATE_CREATURE_ELITE_RARE_SPELLDAMAGE,
+ RATE_CREATURE_AGGRO,
+ RATE_REST_INGAME,
+ RATE_REST_OFFLINE_IN_TAVERN_OR_CITY,
+ RATE_REST_OFFLINE_IN_WILDERNESS,
+ RATE_REST_MAX_BONUS,
+ RATE_DAMAGE_FALL,
+ RATE_AUCTION_TIME,
+ RATE_AUCTION_DEPOSIT,
+ RATE_AUCTION_CUT,
+ RATE_HONOR,
+ RATE_ARENA_POINTS,
+ RATE_TALENT,
+ RATE_TALENT_PET,
+ RATE_CORPSE_DECAY_LOOTED,
+ RATE_INSTANCE_RESET_TIME,
+ RATE_DURABILITY_LOSS_ON_DEATH,
+ RATE_DURABILITY_LOSS_DAMAGE,
+ RATE_DURABILITY_LOSS_PARRY,
+ RATE_DURABILITY_LOSS_ABSORB,
+ RATE_DURABILITY_LOSS_BLOCK,
+ RATE_MOVESPEED_PLAYER,
+ RATE_MOVESPEED_NPC,
+ RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE,
+ RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER,
+ CONFIG_NEW_CHAR_STRING,
+
+ MAX_NUM_SERVER_CONFIGS
+};
+
+class WorldConfig : public ConfigValueCache<ServerConfigs>
+{
+public:
+ WorldConfig() : ConfigValueCache(MAX_NUM_SERVER_CONFIGS) { }
+
+ void BuildConfigCache() override;
+};
+
+#endif
diff --git a/src/test/mocks/WorldMock.h b/src/test/mocks/WorldMock.h
index fc095b4a6a..75e8438e4e 100644
--- a/src/test/mocks/WorldMock.h
+++ b/src/test/mocks/WorldMock.h
@@ -39,8 +39,6 @@ public:
MOCK_METHOD(void, LoadDBAllowedSecurityLevel, ());
MOCK_METHOD(bool, getAllowMovement, (), (const));
MOCK_METHOD(void, SetAllowMovement, (bool allow), ());
- MOCK_METHOD(void, SetNewCharString, (std::string const& str), ());
- MOCK_METHOD(std::string const&, GetNewCharString, (), (const));
MOCK_METHOD(LocaleConstant, GetDefaultDbcLocale, (), (const));
MOCK_METHOD(std::string const&, GetDataPath, (), (const));
MOCK_METHOD(Seconds, GetNextDailyQuestsResetTime, (), (const));
@@ -55,14 +53,16 @@ public:
MOCK_METHOD(void, ShutdownCancel, ());
MOCK_METHOD(void, ShutdownMsg, (bool show, Player* player, const std::string& reason), ());
MOCK_METHOD(void, Update, (uint32 diff), ());
- MOCK_METHOD(void, setRate, (Rates rate, float value), ());
- MOCK_METHOD(float, getRate, (Rates rate), (const));
- MOCK_METHOD(void, setBoolConfig, (WorldBoolConfigs index, bool value), ());
- MOCK_METHOD(bool, getBoolConfig, (WorldBoolConfigs index), (const));
- MOCK_METHOD(void, setFloatConfig, (WorldFloatConfigs index, float value), ());
- MOCK_METHOD(float, getFloatConfig, (WorldFloatConfigs index), (const));
- MOCK_METHOD(void, setIntConfig, (WorldIntConfigs index, uint32 value), ());
- MOCK_METHOD(uint32, getIntConfig, (WorldIntConfigs index), (const));
+ MOCK_METHOD(void, setRate, (ServerConfigs index, float value), ());
+ MOCK_METHOD(float, getRate, (ServerConfigs index), (const));
+ MOCK_METHOD(void, setBoolConfig, (ServerConfigs index, bool value), ());
+ MOCK_METHOD(bool, getBoolConfig, (ServerConfigs index), (const));
+ MOCK_METHOD(void, setFloatConfig, (ServerConfigs index, float value), ());
+ MOCK_METHOD(float, getFloatConfig, (ServerConfigs index), (const));
+ MOCK_METHOD(void, setIntConfig, (ServerConfigs index, uint32 value), ());
+ MOCK_METHOD(uint32, getIntConfig, (ServerConfigs index), (const));
+ MOCK_METHOD(void, setStringConfig, (ServerConfigs index, std::string const& value), ());
+ MOCK_METHOD(std::string_view, getStringConfig, (ServerConfigs index), (const));
MOCK_METHOD(void, setWorldState, (uint32 index, uint64 value), ());
MOCK_METHOD(uint64, getWorldState, (uint32 index), (const));
MOCK_METHOD(void, LoadWorldStates, ());