TrinityCore
World.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
22#include "World.h"
23#include "AccountMgr.h"
24#include "AchievementMgr.h"
26#include "ArenaTeamMgr.h"
27#include "AuctionHouseBot.h"
28#include "AuctionHouseMgr.h"
30#include "BattlePetMgr.h"
31#include "BattlefieldMgr.h"
32#include "BattlegroundMgr.h"
34#include "BlackMarketMgr.h"
35#include "CalendarMgr.h"
36#include "ChannelMgr.h"
37#include "CharacterCache.h"
40#include "Chat.h"
41#include "ChatCommand.h"
42#include "ChatPackets.h"
43#include "Config.h"
44#include "Containers.h"
46#include "CreatureAIRegistry.h"
47#include "CreatureGroups.h"
48#include "CreatureTextMgr.h"
49#include "DB2Stores.h"
50#include "DatabaseEnv.h"
52#include "DisableMgr.h"
53#include "GameEventMgr.h"
54#include "GameObjectModel.h"
55#include "GameTables.h"
56#include "GameTime.h"
57#include "GarrisonMgr.h"
58#include "GitRevision.h"
59#include "GridNotifiersImpl.h"
60#include "GroupMgr.h"
61#include "GuildMgr.h"
62#include "IPLocation.h"
63#include "InstanceLockMgr.h"
64#include "ItemBonusMgr.h"
65#include "LFGMgr.h"
66#include "Language.h"
67#include "LanguageMgr.h"
68#include "Log.h"
69#include "LootItemStorage.h"
70#include "LootMgr.h"
71#include "M2Stores.h"
72#include "MMapFactory.h"
73#include "Map.h"
74#include "MapManager.h"
75#include "Metric.h"
76#include "MiscPackets.h"
77#include "ObjectAccessor.h"
78#include "ObjectMgr.h"
79#include "OutdoorPvPMgr.h"
80#include "PetitionMgr.h"
81#include "Player.h"
82#include "PlayerDump.h"
83#include "PoolMgr.h"
84#include "QuestPools.h"
85#include "Realm.h"
86#include "ScenarioMgr.h"
87#include "ScriptMgr.h"
88#include "ScriptReloadMgr.h"
89#include "SkillDiscovery.h"
90#include "SkillExtraItems.h"
91#include "SmartScriptMgr.h"
92#include "SpellMgr.h"
93#include "SupportMgr.h"
94#include "TaxiPathGraph.h"
95#include "TerrainMgr.h"
96#include "TraitMgr.h"
97#include "TransportMgr.h"
98#include "Unit.h"
99#include "UpdateTime.h"
100#include "VMapFactory.h"
101#include "VMapManager2.h"
102#include "WardenCheckMgr.h"
103#include "WaypointManager.h"
104#include "WeatherMgr.h"
105#include "WhoListStorage.h"
106#include "WorldSession.h"
107#include "WorldSocket.h"
108#include "WorldStateMgr.h"
109
110#include <boost/algorithm/string.hpp>
111
112TC_GAME_API std::atomic<bool> World::m_stopEvent(false);
114
115TC_GAME_API std::atomic<uint32> World::m_worldLoopCounter(0);
116
121
126
128{
129 std::string Id;
130};
131
132PersistentWorldVariable const World::NextCurrencyResetTimeVarId{ "NextCurrencyResetTime" };
133PersistentWorldVariable const World::NextWeeklyQuestResetTimeVarId{ "NextWeeklyQuestResetTime" };
134PersistentWorldVariable const World::NextBGRandomDailyResetTimeVarId{ "NextBGRandomDailyResetTime" };
135PersistentWorldVariable const World::CharacterDatabaseCleaningFlagsVarId{ "PersistentCharacterCleanFlags" };
136PersistentWorldVariable const World::NextGuildDailyResetTimeVarId{ "NextGuildDailyResetTime" };
137PersistentWorldVariable const World::NextMonthlyQuestResetTimeVarId{ "NextMonthlyQuestResetTime" };
138PersistentWorldVariable const World::NextDailyQuestResetTimeVarId{ "NextDailyQuestResetTime" };
139PersistentWorldVariable const World::NextOldCalendarEventDeletionTimeVarId{ "NextOldCalendarEventDeletionTime" };
140PersistentWorldVariable const World::NextGuildWeeklyResetTimeVarId{ "NextGuildWeeklyResetTime" };
141
144{
145 m_playerLimit = 0;
147 m_allowMovement = true;
148 m_ShutdownMask = 0;
149 m_ShutdownTimer = 0;
150
153 m_PlayerCount = 0;
162
165
166 mail_timer = 0;
169
170 m_isClosed = false;
171
172 m_CleaningFlags = 0;
173
174 memset(rate_values, 0, sizeof(rate_values));
175 memset(m_int_configs, 0, sizeof(m_int_configs));
176 memset(m_int64_configs, 0, sizeof(m_int64_configs));
177 memset(m_bool_configs, 0, sizeof(m_bool_configs));
178 memset(m_float_configs, 0, sizeof(m_float_configs));
179
180 _guidWarn = false;
181 _guidAlert = false;
182 _warnDiff = 0;
184}
185
188{
190 while (!m_sessions.empty())
191 {
192 // not remove from queue, prevent loading new sessions
193 delete m_sessions.begin()->second;
194 m_sessions.erase(m_sessions.begin());
195 }
196
197 CliCommandHolder* command = nullptr;
198 while (cliCmdQueue.next(command))
199 delete command;
200
203
205}
206
208{
209 static World instance;
210 return &instance;
211}
212
215{
217 SessionMap::const_iterator itr;
218 for (itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
219 {
220 if (!itr->second)
221 continue;
222
223 Player* player = itr->second->GetPlayer();
224 if (!player)
225 continue;
226
227 if (player->IsInWorld() && player->GetZoneId() == zone)
228 return player;
229 }
230 return nullptr;
231}
232
233bool World::IsClosed() const
234{
235 return m_isClosed;
236}
237
238void World::SetClosed(bool val)
239{
240 m_isClosed = val;
241
242 // Invert the value, for simplicity for scripters.
243 sScriptMgr->OnOpenStateChange(!val);
244}
245
247{
249 stmt->setInt32(0, int32(realm.Id.Realm));
250 PreparedQueryResult result = LoginDatabase.Query(stmt);
251
252 if (result)
253 SetPlayerSecurityLimit(AccountTypes(result->Fetch()->GetUInt8()));
254}
255
257{
258 AccountTypes sec = _sec < SEC_CONSOLE ? _sec : SEC_PLAYER;
259 bool update = sec > m_allowedSecurityLevel;
261 if (update)
263}
264
265void World::SetMotd(std::string motd)
266{
268 sScriptMgr->OnMotdChange(motd);
269
270 _motd.clear();
271 boost::split(_motd, motd, boost::is_any_of("@"));
272}
273
274std::vector<std::string> const& World::GetMotd() const
275{
276 return _motd;
277}
278
280{
281 // Lock this only to prevent multiple maps triggering at the same time
282 std::lock_guard<std::mutex> lock(_guidAlertLock);
283
284 time_t gameTime = GameTime::GetGameTime();
285 time_t today = (gameTime / DAY) * DAY;
286
287 // Check if our window to restart today has passed. 5 mins until quiet time
288 while (gameTime >= GetLocalHourTimestamp(today, getIntConfig(CONFIG_RESPAWN_RESTARTQUIETTIME)) - 1810)
289 today += DAY;
290
291 // Schedule restart for 30 minutes before quiet time, or as long as we have
293
294 _guidWarn = true;
296}
297
299{
300 // Lock this only to prevent multiple maps triggering at the same time
301 std::lock_guard<std::mutex> lock(_guidAlertLock);
302
304 _guidAlert = true;
305 _guidWarn = false;
306}
307
309{
310 if (m_ShutdownTimer)
311 return;
312
315}
316
318{
319 if (m_ShutdownTimer)
320 return;
321
323}
324
326{
329 _warnDiff = 0;
330}
331
334{
335 SessionMap::const_iterator itr = m_sessions.find(id);
336
337 if (itr != m_sessions.end())
338 return itr->second; // also can return nullptr for kicked session
339 else
340 return nullptr;
341}
342
345{
347 SessionMap::const_iterator itr = m_sessions.find(id);
348
349 if (itr != m_sessions.end() && itr->second)
350 {
351 if (itr->second->PlayerLoading())
352 return false;
353
354 itr->second->KickPlayer("World::RemoveSession");
355 }
356
357 return true;
358}
359
361{
362 addSessQueue.add(s);
363}
364
365void World::AddInstanceSocket(std::weak_ptr<WorldSocket> sock, uint64 connectToKey)
366{
367 _linkSocketQueue.add(std::make_pair(sock, connectToKey));
368}
369
371{
372 ASSERT(s);
373
374 //NOTE - Still there is race condition in WorldSession* being used in the Sockets
375
378 if (!RemoveSession(s->GetAccountId()))
379 {
380 s->KickPlayer("World::AddSession_ Couldn't remove the other session while on loading screen");
381 delete s; // session not added yet in session list, so not listed in queue
382 return;
383 }
384
385 // decrease session counts only at not reconnection case
386 bool decrease_session = true;
387
388 // if session already exist, prepare to it deleting at next world update
389 // NOTE - KickPlayer() should be called on "old" in RemoveSession()
390 {
391 SessionMap::const_iterator old = m_sessions.find(s->GetAccountId());
392
393 if (old != m_sessions.end())
394 {
395 // prevent decrease sessions count if session queued
396 if (RemoveQueuedPlayer(old->second))
397 decrease_session = false;
398 // not remove replaced session form queue if listed
399 Trinity::Containers::MultimapErasePair(m_sessionsByBnetGuid, old->second->GetBattlenetAccountGUID(), old->second);
400 delete old->second;
401 }
402 }
403
404 m_sessions[s->GetAccountId()] = s;
406
408 uint32 pLimit = GetPlayerAmountLimit();
409 uint32 QueueSize = GetQueuedSessionCount(); //number of players in the queue
410
411 //so we don't count the user trying to
412 //login as a session and queue the socket that we are using
413 if (decrease_session)
414 --Sessions;
415
416 if (pLimit > 0 && Sessions >= pLimit && !s->HasPermission(rbac::RBAC_PERM_SKIP_QUEUE) && !HasRecentlyDisconnected(s))
417 {
420 TC_LOG_INFO("misc", "PlayerQueue: Account id {} is in Queue Position ({}).", s->GetAccountId(), ++QueueSize);
421 return;
422 }
423
425
427
428 // Updates the population
429 if (pLimit > 0)
430 {
431 float popu = (float)GetActiveSessionCount(); // updated number of users on the server
432 popu /= pLimit;
433 popu *= 2;
434 TC_LOG_INFO("misc", "Server Population ({}).", popu);
435 }
436}
437
438void World::ProcessLinkInstanceSocket(std::pair<std::weak_ptr<WorldSocket>, uint64> linkInfo)
439{
440 if (std::shared_ptr<WorldSocket> sock = linkInfo.first.lock())
441 {
442 if (!sock->IsOpen())
443 return;
444
446 key.Raw = linkInfo.second;
447
449 if (!session || session->GetConnectToInstanceKey() != linkInfo.second)
450 {
451 sock->SendAuthResponseError(ERROR_TIMED_OUT);
452 sock->DelayedCloseSocket();
453 return;
454 }
455
456 sock->SetWorldSession(session);
457 session->AddInstanceConnection(sock);
458 session->HandleContinuePlayerLogin();
459 }
460}
461
463{
464 if (!session)
465 return false;
466
468 {
469 for (DisconnectMap::iterator i = m_disconnects.begin(); i != m_disconnects.end();)
470 {
471 if (difftime(i->second, GameTime::GetGameTime()) < tolerance)
472 {
473 if (i->first == session->GetAccountId())
474 return true;
475 ++i;
476 }
477 else
478 m_disconnects.erase(i++);
479 }
480 }
481 return false;
482 }
483
485{
486 uint32 position = 1;
487
488 for (Queue::const_iterator iter = m_QueuedPlayer.begin(); iter != m_QueuedPlayer.end(); ++iter, ++position)
489 if ((*iter) == sess)
490 return position;
491
492 return 0;
493}
494
496{
497 sess->SetInQueue(true);
498 m_QueuedPlayer.push_back(sess);
499
500 // The 1st SMSG_AUTH_RESPONSE needs to contain other info too.
501 sess->SendAuthResponse(ERROR_OK, true, GetQueuePos(sess));
502}
503
505{
506 // sessions count including queued to remove (if removed_session set)
507 uint32 sessions = GetActiveSessionCount();
508
509 uint32 position = 1;
510 Queue::iterator iter = m_QueuedPlayer.begin();
511
512 // search to remove and count skipped positions
513 bool found = false;
514
515 for (; iter != m_QueuedPlayer.end(); ++iter, ++position)
516 {
517 if (*iter == sess)
518 {
519 sess->SetInQueue(false);
520 sess->ResetTimeOutTime(false);
521 iter = m_QueuedPlayer.erase(iter);
522 found = true; // removing queued session
523 break;
524 }
525 }
526
527 // iter point to next socked after removed or end()
528 // position store position of removed socket and then new position next socket after removed
529
530 // if session not queued then we need decrease sessions count
531 if (!found && sessions)
532 --sessions;
533
534 // accept first in queue
535 if ((!m_playerLimit || sessions < m_playerLimit) && !m_QueuedPlayer.empty())
536 {
537 WorldSession* pop_sess = m_QueuedPlayer.front();
538 pop_sess->InitializeSession();
539 m_QueuedPlayer.pop_front();
540
541 // update iter to point first queued socket or end() if queue is empty now
542 iter = m_QueuedPlayer.begin();
543 position = 1;
544 }
545
546 // update position from iter to end()
547 // iter point to first not updated socket, position store new position
548 for (; iter != m_QueuedPlayer.end(); ++iter, ++position)
549 (*iter)->SendAuthWaitQueue(position);
550
551 return found;
552}
553
556{
557 if (reload)
558 {
559 std::vector<std::string> configErrors;
560 if (!sConfigMgr->Reload(configErrors))
561 {
562 for (std::string const& configError : configErrors)
563 TC_LOG_ERROR("misc", "World settings reload fail: {}.", configError);
564
565 return;
566 }
567 sLog->LoadFromConfig();
568 sMetric->LoadFromConfigs();
569 }
570
571 m_defaultDbcLocale = LocaleConstant(sConfigMgr->GetIntDefault("DBC.Locale", 0));
572
574 {
575 TC_LOG_ERROR("server.loading", "Incorrect DBC.Locale! Must be >= 0 and < {} and not {} (set to 0)", TOTAL_LOCALES, LOCALE_none);
577 }
578
579 TC_LOG_INFO("server.loading", "Using {} DBC Locale", localeNames[m_defaultDbcLocale]);
580
582 SetPlayerAmountLimit(sConfigMgr->GetIntDefault("PlayerLimit", 100));
583 SetMotd(sConfigMgr->GetStringDefault("Motd", "Welcome to a Trinity Core Server."));
584
586 m_bool_configs[CONFIG_SUPPORT_ENABLED] = sConfigMgr->GetBoolDefault("Support.Enabled", true);
587 m_bool_configs[CONFIG_SUPPORT_TICKETS_ENABLED] = sConfigMgr->GetBoolDefault("Support.TicketsEnabled", false);
588 m_bool_configs[CONFIG_SUPPORT_BUGS_ENABLED] = sConfigMgr->GetBoolDefault("Support.BugsEnabled", false);
589 m_bool_configs[CONFIG_SUPPORT_COMPLAINTS_ENABLED] = sConfigMgr->GetBoolDefault("Support.ComplaintsEnabled", false);
590 m_bool_configs[CONFIG_SUPPORT_SUGGESTIONS_ENABLED] = sConfigMgr->GetBoolDefault("Support.SuggestionsEnabled", false);
591 if (reload)
592 {
593 sSupportMgr->SetSupportSystemStatus(m_bool_configs[CONFIG_SUPPORT_ENABLED]);
598 }
599
601 SetNewCharString(sConfigMgr->GetStringDefault("PlayerStart.String", ""));
602
604 m_int_configs[CONFIG_ENABLE_SINFO_LOGIN] = sConfigMgr->GetIntDefault("Server.LoginInfo", 0);
605
607 auto setRegenRate = [this](Rates rate, char const* configKey)
608 {
609 rate_values[rate] = sConfigMgr->GetFloatDefault(configKey, 1.0f);
610 if (rate_values[rate] < 0.0f)
611 {
612 TC_LOG_ERROR("server.loading", "{} ({}) must be > 0. Using 1 instead.", configKey, rate_values[rate]);
613 rate_values[rate] = 1.0f;
614 }
615 };
616
617 setRegenRate(RATE_HEALTH, "Rate.Health");
618 setRegenRate(RATE_POWER_MANA, "Rate.Mana");
619 setRegenRate(RATE_POWER_RAGE_INCOME, "Rate.Rage.Gain");
620 setRegenRate(RATE_POWER_RAGE_LOSS, "Rate.Rage.Loss");
621 setRegenRate(RATE_POWER_FOCUS, "Rate.Focus");
622 setRegenRate(RATE_POWER_ENERGY, "Rate.Energy");
623 setRegenRate(RATE_POWER_COMBO_POINTS_LOSS, "Rate.ComboPoints.Loss");
624 setRegenRate(RATE_POWER_RUNIC_POWER_INCOME, "Rate.RunicPower.Gain");
625 setRegenRate(RATE_POWER_RUNIC_POWER_LOSS, "Rate.RunicPower.Loss");
626 setRegenRate(RATE_POWER_SOUL_SHARDS, "Rate.SoulShards.Loss");
627 setRegenRate(RATE_POWER_LUNAR_POWER, "Rate.LunarPower.Loss");
628 setRegenRate(RATE_POWER_HOLY_POWER, "Rate.HolyPower.Loss");
629 setRegenRate(RATE_POWER_MAELSTROM, "Rate.Maelstrom.Loss");
630 setRegenRate(RATE_POWER_CHI, "Rate.Chi.Loss");
631 setRegenRate(RATE_POWER_INSANITY, "Rate.Insanity.Loss");
632 setRegenRate(RATE_POWER_ARCANE_CHARGES, "Rate.ArcaneCharges.Loss");
633 setRegenRate(RATE_POWER_FURY, "Rate.Fury.Loss");
634 setRegenRate(RATE_POWER_PAIN, "Rate.Pain.Loss");
635 setRegenRate(RATE_POWER_ESSENCE, "Rate.Essence.Loss");
636
637 rate_values[RATE_SKILL_DISCOVERY] = sConfigMgr->GetFloatDefault("Rate.Skill.Discovery", 1.0f);
638 rate_values[RATE_DROP_ITEM_POOR] = sConfigMgr->GetFloatDefault("Rate.Drop.Item.Poor", 1.0f);
639 rate_values[RATE_DROP_ITEM_NORMAL] = sConfigMgr->GetFloatDefault("Rate.Drop.Item.Normal", 1.0f);
640 rate_values[RATE_DROP_ITEM_UNCOMMON] = sConfigMgr->GetFloatDefault("Rate.Drop.Item.Uncommon", 1.0f);
641 rate_values[RATE_DROP_ITEM_RARE] = sConfigMgr->GetFloatDefault("Rate.Drop.Item.Rare", 1.0f);
642 rate_values[RATE_DROP_ITEM_EPIC] = sConfigMgr->GetFloatDefault("Rate.Drop.Item.Epic", 1.0f);
643 rate_values[RATE_DROP_ITEM_LEGENDARY] = sConfigMgr->GetFloatDefault("Rate.Drop.Item.Legendary", 1.0f);
644 rate_values[RATE_DROP_ITEM_ARTIFACT] = sConfigMgr->GetFloatDefault("Rate.Drop.Item.Artifact", 1.0f);
645 rate_values[RATE_DROP_ITEM_REFERENCED] = sConfigMgr->GetFloatDefault("Rate.Drop.Item.Referenced", 1.0f);
646 rate_values[RATE_DROP_ITEM_REFERENCED_AMOUNT] = sConfigMgr->GetFloatDefault("Rate.Drop.Item.ReferencedAmount", 1.0f);
647 rate_values[RATE_DROP_MONEY] = sConfigMgr->GetFloatDefault("Rate.Drop.Money", 1.0f);
648 rate_values[RATE_XP_KILL] = sConfigMgr->GetFloatDefault("Rate.XP.Kill", 1.0f);
649 rate_values[RATE_XP_BG_KILL] = sConfigMgr->GetFloatDefault("Rate.XP.BattlegroundKill", 1.0f);
650 rate_values[RATE_XP_QUEST] = sConfigMgr->GetFloatDefault("Rate.XP.Quest", 1.0f);
651 rate_values[RATE_XP_EXPLORE] = sConfigMgr->GetFloatDefault("Rate.XP.Explore", 1.0f);
652
653 m_int_configs[CONFIG_XP_BOOST_DAYMASK] = sConfigMgr->GetIntDefault("XP.Boost.Daymask", 0);
654 rate_values[RATE_XP_BOOST] = sConfigMgr->GetFloatDefault("XP.Boost.Rate", 2.0f);
655
656 rate_values[RATE_REPAIRCOST] = sConfigMgr->GetFloatDefault("Rate.RepairCost", 1.0f);
657 if (rate_values[RATE_REPAIRCOST] < 0.0f)
658 {
659 TC_LOG_ERROR("server.loading", "Rate.RepairCost ({}) must be >=0. Using 0.0 instead.", rate_values[RATE_REPAIRCOST]);
661 }
662 rate_values[RATE_REPUTATION_GAIN] = sConfigMgr->GetFloatDefault("Rate.Reputation.Gain", 1.0f);
663 rate_values[RATE_REPUTATION_LOWLEVEL_KILL] = sConfigMgr->GetFloatDefault("Rate.Reputation.LowLevel.Kill", 1.0f);
664 rate_values[RATE_REPUTATION_LOWLEVEL_QUEST] = sConfigMgr->GetFloatDefault("Rate.Reputation.LowLevel.Quest", 1.0f);
665 rate_values[RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS] = sConfigMgr->GetFloatDefault("Rate.Reputation.RecruitAFriendBonus", 0.1f);
666 rate_values[RATE_CREATURE_HP_NORMAL] = sConfigMgr->GetFloatDefault("Rate.Creature.HP.Normal", 1.0f);
667 rate_values[RATE_CREATURE_HP_ELITE] = sConfigMgr->GetFloatDefault("Rate.Creature.HP.Elite", 1.0f);
668 rate_values[RATE_CREATURE_HP_RAREELITE] = sConfigMgr->GetFloatDefault("Rate.Creature.HP.RareElite", 1.0f);
669 rate_values[RATE_CREATURE_HP_OBSOLETE] = sConfigMgr->GetFloatDefault("Rate.Creature.HP.Obsolete", 1.0f);
670 rate_values[RATE_CREATURE_HP_RARE] = sConfigMgr->GetFloatDefault("Rate.Creature.HP.Rare", 1.0f);
671 rate_values[RATE_CREATURE_HP_TRIVIAL] = sConfigMgr->GetFloatDefault("Rate.Creature.HP.Trivial", 1.0f);
672 rate_values[RATE_CREATURE_HP_MINUSMOB] = sConfigMgr->GetFloatDefault("Rate.Creature.HP.MinusMob", 1.0f);
673 rate_values[RATE_CREATURE_DAMAGE_NORMAL] = sConfigMgr->GetFloatDefault("Rate.Creature.Damage.Normal", 1.0f);
674 rate_values[RATE_CREATURE_DAMAGE_ELITE] = sConfigMgr->GetFloatDefault("Rate.Creature.Damage.Elite", 1.0f);
675 rate_values[RATE_CREATURE_DAMAGE_RAREELITE] = sConfigMgr->GetFloatDefault("Rate.Creature.Damage.RareElite", 1.0f);
676 rate_values[RATE_CREATURE_DAMAGE_OBSOLETE] = sConfigMgr->GetFloatDefault("Rate.Creature.Damage.Obsolete", 1.0f);
677 rate_values[RATE_CREATURE_DAMAGE_RARE] = sConfigMgr->GetFloatDefault("Rate.Creature.Damage.Rare", 1.0f);
678 rate_values[RATE_CREATURE_DAMAGE_TRIVIAL] = sConfigMgr->GetFloatDefault("Rate.Creature.Damage.Trivial", 1.0f);
679 rate_values[RATE_CREATURE_DAMAGE_MINUSMOB] = sConfigMgr->GetFloatDefault("Rate.Creature.Damage.MinusMob", 1.0f);
680 rate_values[RATE_CREATURE_SPELLDAMAGE_NORMAL] = sConfigMgr->GetFloatDefault("Rate.Creature.SpellDamage.Normal", 1.0f);
681 rate_values[RATE_CREATURE_SPELLDAMAGE_ELITE] = sConfigMgr->GetFloatDefault("Rate.Creature.SpellDamage.Elite", 1.0f);
682 rate_values[RATE_CREATURE_SPELLDAMAGE_RAREELITE] = sConfigMgr->GetFloatDefault("Rate.Creature.SpellDamage.RareElite", 1.0f);
683 rate_values[RATE_CREATURE_SPELLDAMAGE_OBSOLETE] = sConfigMgr->GetFloatDefault("Rate.Creature.SpellDamage.Obsolete", 1.0f);
684 rate_values[RATE_CREATURE_SPELLDAMAGE_RARE] = sConfigMgr->GetFloatDefault("Rate.Creature.SpellDamage.Rare", 1.0f);
685 rate_values[RATE_CREATURE_SPELLDAMAGE_TRIVIAL] = sConfigMgr->GetFloatDefault("Rate.Creature.SpellDamage.Trivial", 1.0f);
686 rate_values[RATE_CREATURE_SPELLDAMAGE_MINUSMOB] = sConfigMgr->GetFloatDefault("Rate.Creature.SpellDamage.MinusMob", 1.0f);
687 rate_values[RATE_CREATURE_AGGRO] = sConfigMgr->GetFloatDefault("Rate.Creature.Aggro", 1.0f);
688 rate_values[RATE_REST_INGAME] = sConfigMgr->GetFloatDefault("Rate.Rest.InGame", 1.0f);
689 rate_values[RATE_REST_OFFLINE_IN_TAVERN_OR_CITY] = sConfigMgr->GetFloatDefault("Rate.Rest.Offline.InTavernOrCity", 1.0f);
690 rate_values[RATE_REST_OFFLINE_IN_WILDERNESS] = sConfigMgr->GetFloatDefault("Rate.Rest.Offline.InWilderness", 1.0f);
691 rate_values[RATE_DAMAGE_FALL] = sConfigMgr->GetFloatDefault("Rate.Damage.Fall", 1.0f);
692 rate_values[RATE_AUCTION_TIME] = sConfigMgr->GetFloatDefault("Rate.Auction.Time", 1.0f);
693 rate_values[RATE_AUCTION_DEPOSIT] = sConfigMgr->GetFloatDefault("Rate.Auction.Deposit", 1.0f);
694 rate_values[RATE_AUCTION_CUT] = sConfigMgr->GetFloatDefault("Rate.Auction.Cut", 1.0f);
695 rate_values[RATE_HONOR] = sConfigMgr->GetFloatDefault("Rate.Honor", 1.0f);
696 rate_values[RATE_INSTANCE_RESET_TIME] = sConfigMgr->GetFloatDefault("Rate.InstanceResetTime", 1.0f);
697 rate_values[RATE_TALENT] = sConfigMgr->GetFloatDefault("Rate.Talent", 1.0f);
698 if (rate_values[RATE_TALENT] < 0.0f)
699 {
700 TC_LOG_ERROR("server.loading", "Rate.Talent ({}) must be > 0. Using 1 instead.", rate_values[RATE_TALENT]);
701 rate_values[RATE_TALENT] = 1.0f;
702 }
703 rate_values[RATE_MOVESPEED] = sConfigMgr->GetFloatDefault("Rate.MoveSpeed", 1.0f);
705 {
706 TC_LOG_ERROR("server.loading", "Rate.MoveSpeed ({}) must be > 0. Using 1 instead.", rate_values[RATE_MOVESPEED]);
708 }
710 rate_values[RATE_CORPSE_DECAY_LOOTED] = sConfigMgr->GetFloatDefault("Rate.Corpse.Decay.Looted", 0.5f);
711
712 rate_values[RATE_DURABILITY_LOSS_ON_DEATH] = sConfigMgr->GetFloatDefault("DurabilityLoss.OnDeath", 10.0f);
714 {
715 TC_LOG_ERROR("server.loading", "DurabilityLoss.OnDeath ({}) must be >=0. Using 0.0 instead.", rate_values[RATE_DURABILITY_LOSS_ON_DEATH]);
717 }
719 {
720 TC_LOG_ERROR("server.loading", "DurabilityLoss.OnDeath ({}) must be <= 100. Using 100.0 instead.", rate_values[RATE_DURABILITY_LOSS_ON_DEATH]);
722 }
724
725 rate_values[RATE_DURABILITY_LOSS_DAMAGE] = sConfigMgr->GetFloatDefault("DurabilityLossChance.Damage", 0.5f);
727 {
728 TC_LOG_ERROR("server.loading", "DurabilityLossChance.Damage ({}) must be >=0. Using 0.0 instead.", rate_values[RATE_DURABILITY_LOSS_DAMAGE]);
730 }
731 rate_values[RATE_DURABILITY_LOSS_ABSORB] = sConfigMgr->GetFloatDefault("DurabilityLossChance.Absorb", 0.5f);
733 {
734 TC_LOG_ERROR("server.loading", "DurabilityLossChance.Absorb ({}) must be >=0. Using 0.0 instead.", rate_values[RATE_DURABILITY_LOSS_ABSORB]);
736 }
737 rate_values[RATE_DURABILITY_LOSS_PARRY] = sConfigMgr->GetFloatDefault("DurabilityLossChance.Parry", 0.05f);
739 {
740 TC_LOG_ERROR("server.loading", "DurabilityLossChance.Parry ({}) must be >=0. Using 0.0 instead.", rate_values[RATE_DURABILITY_LOSS_PARRY]);
742 }
743 rate_values[RATE_DURABILITY_LOSS_BLOCK] = sConfigMgr->GetFloatDefault("DurabilityLossChance.Block", 0.05f);
745 {
746 TC_LOG_ERROR("server.loading", "DurabilityLossChance.Block ({}) must be >=0. Using 0.0 instead.", rate_values[RATE_DURABILITY_LOSS_BLOCK]);
748 }
749 rate_values[RATE_MONEY_QUEST] = sConfigMgr->GetFloatDefault("Rate.Quest.Money.Reward", 1.0f);
750 if (rate_values[RATE_MONEY_QUEST] < 0.0f)
751 {
752 TC_LOG_ERROR("server.loading", "Rate.Quest.Money.Reward ({}) must be >=0. Using 0 instead.", rate_values[RATE_MONEY_QUEST]);
754 }
755 rate_values[RATE_MONEY_MAX_LEVEL_QUEST] = sConfigMgr->GetFloatDefault("Rate.Quest.Money.Max.Level.Reward", 1.0f);
757 {
758 TC_LOG_ERROR("server.loading", "Rate.Quest.Money.Max.Level.Reward ({}) must be >=0. Using 0 instead.", rate_values[RATE_MONEY_MAX_LEVEL_QUEST]);
760 }
762
763 m_bool_configs[CONFIG_DURABILITY_LOSS_IN_PVP] = sConfigMgr->GetBoolDefault("DurabilityLoss.InPvP", false);
764
765 m_int_configs[CONFIG_COMPRESSION] = sConfigMgr->GetIntDefault("Compression", 1);
767 {
768 TC_LOG_ERROR("server.loading", "Compression level ({}) must be in range 1..9. Using default compression level (1).", m_int_configs[CONFIG_COMPRESSION]);
770 }
771 m_bool_configs[CONFIG_ADDON_CHANNEL] = sConfigMgr->GetBoolDefault("AddonChannel", true);
772 m_bool_configs[CONFIG_CLEAN_CHARACTER_DB] = sConfigMgr->GetBoolDefault("CleanCharacterDB", false);
773 m_int_configs[CONFIG_PERSISTENT_CHARACTER_CLEAN_FLAGS] = sConfigMgr->GetIntDefault("PersistentCharacterCleanFlags", 0);
774 m_int_configs[CONFIG_AUCTION_REPLICATE_DELAY] = sConfigMgr->GetIntDefault("Auction.ReplicateItemsCooldown", 900);
775 m_int_configs[CONFIG_AUCTION_SEARCH_DELAY] = sConfigMgr->GetIntDefault("Auction.SearchDelay", 300);
777 {
778 TC_LOG_ERROR("server.loading", "Auction.SearchDelay ({}) must be between 100 and 10000. Using default of 300ms", m_int_configs[CONFIG_AUCTION_SEARCH_DELAY]);
780 }
781 m_int_configs[CONFIG_AUCTION_TAINTED_SEARCH_DELAY] = sConfigMgr->GetIntDefault("Auction.TaintedSearchDelay", 3000);
783 {
784 TC_LOG_ERROR("server.loading", "Auction.TaintedSearchDelay ({}) must be between 100 and 10000. Using default of 3s", m_int_configs[CONFIG_AUCTION_SEARCH_DELAY]);
786 }
787 m_int_configs[CONFIG_CHAT_CHANNEL_LEVEL_REQ] = sConfigMgr->GetIntDefault("ChatLevelReq.Channel", 1);
788 m_int_configs[CONFIG_CHAT_WHISPER_LEVEL_REQ] = sConfigMgr->GetIntDefault("ChatLevelReq.Whisper", 1);
789 m_int_configs[CONFIG_CHAT_EMOTE_LEVEL_REQ] = sConfigMgr->GetIntDefault("ChatLevelReq.Emote", 1);
790 m_int_configs[CONFIG_CHAT_SAY_LEVEL_REQ] = sConfigMgr->GetIntDefault("ChatLevelReq.Say", 1);
791 m_int_configs[CONFIG_CHAT_YELL_LEVEL_REQ] = sConfigMgr->GetIntDefault("ChatLevelReq.Yell", 1);
792 m_int_configs[CONFIG_PARTY_LEVEL_REQ] = sConfigMgr->GetIntDefault("PartyLevelReq", 1);
793 m_int_configs[CONFIG_TRADE_LEVEL_REQ] = sConfigMgr->GetIntDefault("LevelReq.Trade", 1);
794 m_int_configs[CONFIG_AUCTION_LEVEL_REQ] = sConfigMgr->GetIntDefault("LevelReq.Auction", 1);
795 m_int_configs[CONFIG_MAIL_LEVEL_REQ] = sConfigMgr->GetIntDefault("LevelReq.Mail", 1);
796 m_bool_configs[CONFIG_PRESERVE_CUSTOM_CHANNELS] = sConfigMgr->GetBoolDefault("PreserveCustomChannels", false);
797 m_int_configs[CONFIG_PRESERVE_CUSTOM_CHANNEL_DURATION] = sConfigMgr->GetIntDefault("PreserveCustomChannelDuration", 14);
798 m_int_configs[CONFIG_PRESERVE_CUSTOM_CHANNEL_INTERVAL] = sConfigMgr->GetIntDefault("PreserveCustomChannelInterval", 5);
799 m_bool_configs[CONFIG_GRID_UNLOAD] = sConfigMgr->GetBoolDefault("GridUnload", true);
800 m_bool_configs[CONFIG_BASEMAP_LOAD_GRIDS] = sConfigMgr->GetBoolDefault("BaseMapLoadAllGrids", false);
802 {
803 TC_LOG_ERROR("server.loading", "BaseMapLoadAllGrids enabled, but GridUnload also enabled. GridUnload must be disabled to enable base map pre-loading. Base map pre-loading disabled");
805 }
806 m_bool_configs[CONFIG_INSTANCEMAP_LOAD_GRIDS] = sConfigMgr->GetBoolDefault("InstanceMapLoadAllGrids", false);
808 {
809 TC_LOG_ERROR("server.loading", "InstanceMapLoadAllGrids enabled, but GridUnload also enabled. GridUnload must be disabled to enable instance map pre-loading. Instance map pre-loading disabled");
811 }
812 m_bool_configs[CONFIG_BATTLEGROUNDMAP_LOAD_GRIDS] = sConfigMgr->GetBoolDefault("BattlegroundMapLoadAllGrids", true);
813 m_int_configs[CONFIG_INTERVAL_SAVE] = sConfigMgr->GetIntDefault("PlayerSaveInterval", 15 * MINUTE * IN_MILLISECONDS);
814 m_int_configs[CONFIG_INTERVAL_DISCONNECT_TOLERANCE] = sConfigMgr->GetIntDefault("DisconnectToleranceInterval", 0);
815 m_bool_configs[CONFIG_STATS_SAVE_ONLY_ON_LOGOUT] = sConfigMgr->GetBoolDefault("PlayerSave.Stats.SaveOnlyOnLogout", true);
816
817 m_int_configs[CONFIG_MIN_LEVEL_STAT_SAVE] = sConfigMgr->GetIntDefault("PlayerSave.Stats.MinLevel", 0);
819 {
820 TC_LOG_ERROR("server.loading", "PlayerSave.Stats.MinLevel ({}) must be in range 0..80. Using default, do not save character stats (0).", m_int_configs[CONFIG_MIN_LEVEL_STAT_SAVE]);
822 }
823
824 m_int_configs[CONFIG_INTERVAL_GRIDCLEAN] = sConfigMgr->GetIntDefault("GridCleanUpDelay", 5 * MINUTE * IN_MILLISECONDS);
826 {
827 TC_LOG_ERROR("server.loading", "GridCleanUpDelay ({}) must be greater {}. Use this minimal value.", m_int_configs[CONFIG_INTERVAL_GRIDCLEAN], MIN_GRID_DELAY);
829 }
830 if (reload)
831 sMapMgr->SetGridCleanUpDelay(m_int_configs[CONFIG_INTERVAL_GRIDCLEAN]);
832
833 m_int_configs[CONFIG_INTERVAL_MAPUPDATE] = sConfigMgr->GetIntDefault("MapUpdateInterval", 10);
835 {
836 TC_LOG_ERROR("server.loading", "MapUpdateInterval ({}) must be greater {}. Use this minimal value.", m_int_configs[CONFIG_INTERVAL_MAPUPDATE], MIN_MAP_UPDATE_DELAY);
838 }
839 if (reload)
840 sMapMgr->SetMapUpdateInterval(m_int_configs[CONFIG_INTERVAL_MAPUPDATE]);
841
842 m_int_configs[CONFIG_INTERVAL_CHANGEWEATHER] = sConfigMgr->GetIntDefault("ChangeWeatherInterval", 10 * MINUTE * IN_MILLISECONDS);
843
844 if (reload)
845 {
846 uint32 val = sConfigMgr->GetIntDefault("WorldServerPort", 8085);
848 TC_LOG_ERROR("server.loading", "WorldServerPort option can't be changed at worldserver.conf reload, using current value ({}).", m_int_configs[CONFIG_PORT_WORLD]);
849
850 val = sConfigMgr->GetIntDefault("InstanceServerPort", 8086);
852 TC_LOG_ERROR("server.loading", "InstanceServerPort option can't be changed at worldserver.conf reload, using current value ({}).", m_int_configs[CONFIG_PORT_INSTANCE]);
853 }
854 else
855 {
856 m_int_configs[CONFIG_PORT_WORLD] = sConfigMgr->GetIntDefault("WorldServerPort", 8085);
857 m_int_configs[CONFIG_PORT_INSTANCE] = sConfigMgr->GetIntDefault("InstanceServerPort", 8086);
858 }
859
860 // Config values are in "milliseconds" but we handle SocketTimeOut only as "seconds" so divide by 1000
861 m_int_configs[CONFIG_SOCKET_TIMEOUTTIME] = sConfigMgr->GetIntDefault("SocketTimeOutTime", 900000) / 1000;
862 m_int_configs[CONFIG_SOCKET_TIMEOUTTIME_ACTIVE] = sConfigMgr->GetIntDefault("SocketTimeOutTimeActive", 60000) / 1000;
863
864 m_int_configs[CONFIG_SESSION_ADD_DELAY] = sConfigMgr->GetIntDefault("SessionAddDelay", 10000);
865
866 m_float_configs[CONFIG_GROUP_XP_DISTANCE] = sConfigMgr->GetFloatDefault("MaxGroupXPDistance", 74.0f);
867 m_float_configs[CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE] = sConfigMgr->GetFloatDefault("MaxRecruitAFriendBonusDistance", 100.0f);
868
869 m_int_configs[CONFIG_MIN_QUEST_SCALED_XP_RATIO] = sConfigMgr->GetIntDefault("MinQuestScaledXPRatio", 0);
871 {
872 TC_LOG_ERROR("server.loading", "MinQuestScaledXPRatio ({}) must be in range 0..100. Set to 0.", m_int_configs[CONFIG_MIN_QUEST_SCALED_XP_RATIO]);
874 }
875
876 m_int_configs[CONFIG_MIN_CREATURE_SCALED_XP_RATIO] = sConfigMgr->GetIntDefault("MinCreatureScaledXPRatio", 0);
878 {
879 TC_LOG_ERROR("server.loading", "MinCreatureScaledXPRatio ({}) must be in range 0..100. Set to 0.", m_int_configs[CONFIG_MIN_CREATURE_SCALED_XP_RATIO]);
881 }
882
883 m_int_configs[CONFIG_MIN_DISCOVERED_SCALED_XP_RATIO] = sConfigMgr->GetIntDefault("MinDiscoveredScaledXPRatio", 0);
885 {
886 TC_LOG_ERROR("server.loading", "MinDiscoveredScaledXPRatio ({}) must be in range 0..100. Set to 0.", m_int_configs[CONFIG_MIN_DISCOVERED_SCALED_XP_RATIO]);
888 }
889
891 m_float_configs[CONFIG_SIGHT_MONSTER] = sConfigMgr->GetFloatDefault("MonsterSight", 50.0f);
892
893 m_bool_configs[CONFIG_REGEN_HP_CANNOT_REACH_TARGET_IN_RAID] = sConfigMgr->GetBoolDefault("Creature.RegenHPCannotReachTargetInRaid", true);
894
895 if (reload)
896 {
897 uint32 val = sConfigMgr->GetIntDefault("GameType", 0);
899 TC_LOG_ERROR("server.loading", "GameType option can't be changed at worldserver.conf reload, using current value ({}).", m_int_configs[CONFIG_GAME_TYPE]);
900 }
901 else
902 m_int_configs[CONFIG_GAME_TYPE] = sConfigMgr->GetIntDefault("GameType", 0);
903
904 if (reload)
905 {
906 uint32 val = sConfigMgr->GetIntDefault("RealmZone", HARDCODED_DEVELOPMENT_REALM_CATEGORY_ID);
908 TC_LOG_ERROR("server.loading", "RealmZone option can't be changed at worldserver.conf reload, using current value ({}).", m_int_configs[CONFIG_REALM_ZONE]);
909 }
910 else
912
913 m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_CALENDAR]= sConfigMgr->GetBoolDefault("AllowTwoSide.Interaction.Calendar", false);
914 m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL] = sConfigMgr->GetBoolDefault("AllowTwoSide.Interaction.Channel", false);
915 m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP] = sConfigMgr->GetBoolDefault("AllowTwoSide.Interaction.Group", false);
916 m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD] = sConfigMgr->GetBoolDefault("AllowTwoSide.Interaction.Guild", false);
917 m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION] = sConfigMgr->GetBoolDefault("AllowTwoSide.Interaction.Auction", true);
918 m_bool_configs[CONFIG_ALLOW_TWO_SIDE_TRADE] = sConfigMgr->GetBoolDefault("AllowTwoSide.Trade", false);
919 m_int_configs[CONFIG_STRICT_PLAYER_NAMES] = sConfigMgr->GetIntDefault ("StrictPlayerNames", 0);
920 m_int_configs[CONFIG_STRICT_CHARTER_NAMES] = sConfigMgr->GetIntDefault ("StrictCharterNames", 0);
921 m_int_configs[CONFIG_STRICT_PET_NAMES] = sConfigMgr->GetIntDefault ("StrictPetNames", 0);
922
923 m_int_configs[CONFIG_MIN_PLAYER_NAME] = sConfigMgr->GetIntDefault ("MinPlayerName", 2);
925 {
926 TC_LOG_ERROR("server.loading", "MinPlayerName ({}) must be in range 1..{}. Set to 2.", m_int_configs[CONFIG_MIN_PLAYER_NAME], MAX_PLAYER_NAME);
928 }
929
930 m_int_configs[CONFIG_MIN_CHARTER_NAME] = sConfigMgr->GetIntDefault ("MinCharterName", 2);
932 {
933 TC_LOG_ERROR("server.loading", "MinCharterName ({}) must be in range 1..{}. Set to 2.", m_int_configs[CONFIG_MIN_CHARTER_NAME], MAX_CHARTER_NAME);
935 }
936
937 m_int_configs[CONFIG_MIN_PET_NAME] = sConfigMgr->GetIntDefault ("MinPetName", 2);
939 {
940 TC_LOG_ERROR("server.loading", "MinPetName ({}) must be in range 1..{}. Set to 2.", m_int_configs[CONFIG_MIN_PET_NAME], MAX_PET_NAME);
942 }
943
944 m_int_configs[CONFIG_CHARTER_COST_GUILD] = sConfigMgr->GetIntDefault("Guild.CharterCost", 1000);
945 m_int_configs[CONFIG_CHARTER_COST_ARENA_2v2] = sConfigMgr->GetIntDefault("ArenaTeam.CharterCost.2v2", 800000);
946 m_int_configs[CONFIG_CHARTER_COST_ARENA_3v3] = sConfigMgr->GetIntDefault("ArenaTeam.CharterCost.3v3", 1200000);
947 m_int_configs[CONFIG_CHARTER_COST_ARENA_5v5] = sConfigMgr->GetIntDefault("ArenaTeam.CharterCost.5v5", 2000000);
948
949 m_int_configs[CONFIG_CHARACTER_CREATING_DISABLED] = sConfigMgr->GetIntDefault("CharacterCreating.Disabled", 0);
950 m_int64_configs[CONFIG_CHARACTER_CREATING_DISABLED_RACEMASK] = sConfigMgr->GetInt64Default("CharacterCreating.Disabled.RaceMask", 0);
951 m_int_configs[CONFIG_CHARACTER_CREATING_DISABLED_CLASSMASK] = sConfigMgr->GetIntDefault("CharacterCreating.Disabled.ClassMask", 0);
952
953 m_int_configs[CONFIG_CHARACTERS_PER_REALM] = sConfigMgr->GetIntDefault("CharactersPerRealm", 60);
955 {
956 TC_LOG_ERROR("server.loading", "CharactersPerRealm ({}) must be in range 1..{}. Set to {}.", m_int_configs[CONFIG_CHARACTERS_PER_REALM], MAX_CHARACTERS_PER_REALM, MAX_CHARACTERS_PER_REALM);
958 }
959
960 // must be after CONFIG_CHARACTERS_PER_REALM
961 m_int_configs[CONFIG_CHARACTERS_PER_ACCOUNT] = sConfigMgr->GetIntDefault("CharactersPerAccount", 60);
963 {
964 TC_LOG_ERROR("server.loading", "CharactersPerAccount ({}) can't be less than CharactersPerRealm ({}).", m_int_configs[CONFIG_CHARACTERS_PER_ACCOUNT], m_int_configs[CONFIG_CHARACTERS_PER_REALM]);
966 }
967
968 m_int_configs[CONFIG_CHARACTER_CREATING_EVOKERS_PER_REALM] = sConfigMgr->GetIntDefault("CharacterCreating.EvokersPerRealm", 1);
970 {
971 TC_LOG_ERROR("server.loading", "CharacterCreating.EvokersPerRealm ({}) must be in range 0..10. Set to 1.", m_int_configs[CONFIG_CHARACTER_CREATING_EVOKERS_PER_REALM]);
973 }
974
975 m_int_configs[CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_DEMON_HUNTER] = sConfigMgr->GetIntDefault("CharacterCreating.MinLevelForDemonHunter", 0);
976 m_int_configs[CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_EVOKER] = sConfigMgr->GetIntDefault("CharacterCreating.MinLevelForEvoker", 50);
977 m_bool_configs[CONFIG_CHARACTER_CREATING_DISABLE_ALLIED_RACE_ACHIEVEMENT_REQUIREMENT] = sConfigMgr->GetBoolDefault("CharacterCreating.DisableAlliedRaceAchievementRequirement", false);
978
979 m_int_configs[CONFIG_SKIP_CINEMATICS] = sConfigMgr->GetIntDefault("SkipCinematics", 0);
981 {
982 TC_LOG_ERROR("server.loading", "SkipCinematics ({}) must be in range 0..2. Set to 0.", m_int_configs[CONFIG_SKIP_CINEMATICS]);
984 }
985
986 if (reload)
987 {
988 uint32 val = sConfigMgr->GetIntDefault("MaxPlayerLevel", DEFAULT_MAX_LEVEL);
990 TC_LOG_ERROR("server.loading", "MaxPlayerLevel option can't be changed at config reload, using current value ({}).", m_int_configs[CONFIG_MAX_PLAYER_LEVEL]);
991 }
992 else
993 m_int_configs[CONFIG_MAX_PLAYER_LEVEL] = sConfigMgr->GetIntDefault("MaxPlayerLevel", DEFAULT_MAX_LEVEL);
994
996 {
997 TC_LOG_ERROR("server.loading", "MaxPlayerLevel ({}) must be in range 1..{}. Set to {}.", m_int_configs[CONFIG_MAX_PLAYER_LEVEL], MAX_LEVEL, MAX_LEVEL);
999 }
1000
1001 m_int_configs[CONFIG_MIN_DUALSPEC_LEVEL] = sConfigMgr->GetIntDefault("MinDualSpecLevel", 40);
1002
1003 m_int_configs[CONFIG_START_PLAYER_LEVEL] = sConfigMgr->GetIntDefault("StartPlayerLevel", 1);
1005 {
1006 TC_LOG_ERROR("server.loading", "StartPlayerLevel ({}) must be in range 1..MaxPlayerLevel({}). Set to 1.", m_int_configs[CONFIG_START_PLAYER_LEVEL], m_int_configs[CONFIG_MAX_PLAYER_LEVEL]);
1008 }
1010 {
1011 TC_LOG_ERROR("server.loading", "StartPlayerLevel ({}) must be in range 1..MaxPlayerLevel({}). Set to {}.", m_int_configs[CONFIG_START_PLAYER_LEVEL], m_int_configs[CONFIG_MAX_PLAYER_LEVEL], m_int_configs[CONFIG_MAX_PLAYER_LEVEL]);
1013 }
1014
1015 m_int_configs[CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL] = sConfigMgr->GetIntDefault("StartDeathKnightPlayerLevel", 8);
1017 {
1018 TC_LOG_ERROR("server.loading", "StartDeathKnightPlayerLevel ({}) must be in range 1..MaxPlayerLevel({}). Set to 1.",
1021 }
1023 {
1024 TC_LOG_ERROR("server.loading", "StartDeathKnightPlayerLevel ({}) must be in range 1..MaxPlayerLevel({}). Set to {}.",
1027 }
1028
1029 m_int_configs[CONFIG_START_DEMON_HUNTER_PLAYER_LEVEL] = sConfigMgr->GetIntDefault("StartDemonHunterPlayerLevel", 8);
1031 {
1032 TC_LOG_ERROR("server.loading", "StartDemonHunterPlayerLevel ({}) must be in range 1..MaxPlayerLevel({}). Set to 1.",
1035 }
1037 {
1038 TC_LOG_ERROR("server.loading", "StartDemonHunterPlayerLevel ({}) must be in range 1..MaxPlayerLevel({}). Set to {}.",
1041 }
1042
1043 m_int_configs[CONFIG_START_EVOKER_PLAYER_LEVEL] = sConfigMgr->GetIntDefault("StartEvokerPlayerLevel", 58);
1045 {
1046 TC_LOG_ERROR("server.loading", "StartEvokerPlayerLevel ({}) must be in range 1..MaxPlayerLevel({}). Set to 1.",
1049 }
1051 {
1052 TC_LOG_ERROR("server.loading", "StartEvokerPlayerLevel ({}) must be in range 1..MaxPlayerLevel({}). Set to {}.",
1055 }
1056
1057 m_int_configs[CONFIG_START_ALLIED_RACE_LEVEL] = sConfigMgr->GetIntDefault("StartAlliedRacePlayerLevel", 10);
1059 {
1060 TC_LOG_ERROR("server.loading", "StartDemonHunterPlayerLevel ({}) must be in range 1..MaxPlayerLevel({}). Set to 1.",
1063 }
1065 {
1066 TC_LOG_ERROR("server.loading", "StartDemonHunterPlayerLevel ({}) must be in range 1..MaxPlayerLevel({}). Set to {}.",
1069 }
1070
1071 m_int_configs[CONFIG_START_PLAYER_MONEY] = sConfigMgr->GetIntDefault("StartPlayerMoney", 0);
1073 {
1074 TC_LOG_ERROR("server.loading", "StartPlayerMoney ({}) must be in range 0..{}. Set to {}.", m_int_configs[CONFIG_START_PLAYER_MONEY], MAX_MONEY_AMOUNT, 0);
1076 }
1077 else if (m_int_configs[CONFIG_START_PLAYER_MONEY] > 0x7FFFFFFF-1) // TODO: (See MAX_MONEY_AMOUNT)
1078 {
1079 TC_LOG_ERROR("server.loading", "StartPlayerMoney ({}) must be in range 0..{}. Set to {}.",
1080 m_int_configs[CONFIG_START_PLAYER_MONEY], 0x7FFFFFFF-1, 0x7FFFFFFF-1);
1082 }
1083
1084 m_int_configs[CONFIG_CURRENCY_RESET_HOUR] = sConfigMgr->GetIntDefault("Currency.ResetHour", 3);
1086 {
1087 TC_LOG_ERROR("server.loading", "Currency.ResetHour ({}) can't be load. Set to 6.", m_int_configs[CONFIG_CURRENCY_RESET_HOUR]);
1089 }
1090 m_int_configs[CONFIG_CURRENCY_RESET_DAY] = sConfigMgr->GetIntDefault("Currency.ResetDay", 3);
1092 {
1093 TC_LOG_ERROR("server.loading", "Currency.ResetDay ({}) can't be load. Set to 3.", m_int_configs[CONFIG_CURRENCY_RESET_DAY]);
1095 }
1096 m_int_configs[CONFIG_CURRENCY_RESET_INTERVAL] = sConfigMgr->GetIntDefault("Currency.ResetInterval", 7);
1098 {
1099 TC_LOG_ERROR("server.loading", "Currency.ResetInterval ({}) must be > 0, set to default 7.", m_int_configs[CONFIG_CURRENCY_RESET_INTERVAL]);
1101 }
1102
1103 m_int_configs[CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL] = sConfigMgr->GetIntDefault("RecruitAFriend.MaxLevel", 85);
1105 {
1106 TC_LOG_ERROR("server.loading", "RecruitAFriend.MaxLevel ({}) must be in the range 0..MaxLevel({}). Set to {}.",
1109 }
1110
1111 m_int_configs[CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE] = sConfigMgr->GetIntDefault("RecruitAFriend.MaxDifference", 4);
1112 m_bool_configs[CONFIG_ALL_TAXI_PATHS] = sConfigMgr->GetBoolDefault("AllFlightPaths", false);
1113 m_bool_configs[CONFIG_INSTANT_TAXI] = sConfigMgr->GetBoolDefault("InstantFlightPaths", false);
1114
1115 m_bool_configs[CONFIG_INSTANCE_IGNORE_LEVEL] = sConfigMgr->GetBoolDefault("Instance.IgnoreLevel", false);
1116 m_bool_configs[CONFIG_INSTANCE_IGNORE_RAID] = sConfigMgr->GetBoolDefault("Instance.IgnoreRaid", false);
1117
1118 m_bool_configs[CONFIG_CAST_UNSTUCK] = sConfigMgr->GetBoolDefault("CastUnstuck", true);
1119 m_int_configs[CONFIG_RESET_SCHEDULE_WEEK_DAY] = sConfigMgr->GetIntDefault("ResetSchedule.WeekDay", 2);
1120 m_int_configs[CONFIG_RESET_SCHEDULE_HOUR] = sConfigMgr->GetIntDefault("ResetSchedule.Hour", 8);
1121 m_int_configs[CONFIG_INSTANCE_UNLOAD_DELAY] = sConfigMgr->GetIntDefault("Instance.UnloadDelay", 30 * MINUTE * IN_MILLISECONDS);
1122
1123 m_int_configs[CONFIG_DAILY_QUEST_RESET_TIME_HOUR] = sConfigMgr->GetIntDefault("Quests.DailyResetTime", 3);
1125 {
1126 TC_LOG_ERROR("server.loading", "Quests.DailyResetTime ({}) must be in range 0..23. Set to 3.", m_int_configs[CONFIG_DAILY_QUEST_RESET_TIME_HOUR]);
1128 }
1129
1130 m_int_configs[CONFIG_WEEKLY_QUEST_RESET_TIME_WDAY] = sConfigMgr->GetIntDefault("Quests.WeeklyResetWDay", 3);
1132 {
1133 TC_LOG_ERROR("server.loading", "Quests.WeeklyResetDay ({}) must be in range 0..6. Set to 3 (Wednesday).", m_int_configs[CONFIG_WEEKLY_QUEST_RESET_TIME_WDAY]);
1135 }
1136
1137 m_int_configs[CONFIG_MAX_PRIMARY_TRADE_SKILL] = sConfigMgr->GetIntDefault("MaxPrimaryTradeSkill", 2);
1138 m_int_configs[CONFIG_MIN_PETITION_SIGNS] = sConfigMgr->GetIntDefault("MinPetitionSigns", 4);
1140 {
1141 TC_LOG_ERROR("server.loading", "MinPetitionSigns ({}) must be in range 0..4. Set to 4.", m_int_configs[CONFIG_MIN_PETITION_SIGNS]);
1143 }
1144
1145 m_int_configs[CONFIG_GM_LOGIN_STATE] = sConfigMgr->GetIntDefault("GM.LoginState", 2);
1146 m_int_configs[CONFIG_GM_VISIBLE_STATE] = sConfigMgr->GetIntDefault("GM.Visible", 2);
1147 m_int_configs[CONFIG_GM_CHAT] = sConfigMgr->GetIntDefault("GM.Chat", 2);
1148 m_int_configs[CONFIG_GM_WHISPERING_TO] = sConfigMgr->GetIntDefault("GM.WhisperingTo", 2);
1149 m_int_configs[CONFIG_GM_FREEZE_DURATION] = sConfigMgr->GetIntDefault("GM.FreezeAuraDuration", 0);
1150
1151 m_int_configs[CONFIG_GM_LEVEL_IN_GM_LIST] = sConfigMgr->GetIntDefault("GM.InGMList.Level", SEC_ADMINISTRATOR);
1152 m_int_configs[CONFIG_GM_LEVEL_IN_WHO_LIST] = sConfigMgr->GetIntDefault("GM.InWhoList.Level", SEC_ADMINISTRATOR);
1153 m_int_configs[CONFIG_START_GM_LEVEL] = sConfigMgr->GetIntDefault("GM.StartLevel", 1);
1155 {
1156 TC_LOG_ERROR("server.loading", "GM.StartLevel ({}) must be in range StartPlayerLevel({})..{}. Set to {}.",
1159 }
1161 {
1162 TC_LOG_ERROR("server.loading", "GM.StartLevel ({}) must be in range 1..{}. Set to {}.", m_int_configs[CONFIG_START_GM_LEVEL], MAX_LEVEL, MAX_LEVEL);
1164 }
1165 m_bool_configs[CONFIG_ALLOW_GM_GROUP] = sConfigMgr->GetBoolDefault("GM.AllowInvite", false);
1166 m_bool_configs[CONFIG_GM_LOWER_SECURITY] = sConfigMgr->GetBoolDefault("GM.LowerSecurity", false);
1167 m_int_configs[CONFIG_FORCE_SHUTDOWN_THRESHOLD] = sConfigMgr->GetIntDefault("GM.ForceShutdownThreshold", 30);
1168
1169 m_int_configs[CONFIG_GROUP_VISIBILITY] = sConfigMgr->GetIntDefault("Visibility.GroupMode", 1);
1170
1171 m_int_configs[CONFIG_MAIL_DELIVERY_DELAY] = sConfigMgr->GetIntDefault("MailDeliveryDelay", HOUR);
1172 m_int_configs[CONFIG_CLEAN_OLD_MAIL_TIME] = sConfigMgr->GetIntDefault("CleanOldMailTime", 4);
1174 {
1175 TC_LOG_ERROR("server.loading", "CleanOldMailTime ({}) must be an hour, between 0 and 23. Set to 4.", m_int_configs[CONFIG_CLEAN_OLD_MAIL_TIME]);
1177 }
1178
1179 m_int_configs[CONFIG_UPTIME_UPDATE] = sConfigMgr->GetIntDefault("UpdateUptimeInterval", 10);
1181 {
1182 TC_LOG_ERROR("server.loading", "UpdateUptimeInterval ({}) must be > 0, set to default 10.", m_int_configs[CONFIG_UPTIME_UPDATE]);
1184 }
1185 if (reload)
1186 {
1189 }
1190
1191 // log db cleanup interval
1192 m_int_configs[CONFIG_LOGDB_CLEARINTERVAL] = sConfigMgr->GetIntDefault("LogDB.Opt.ClearInterval", 10);
1194 {
1195 TC_LOG_ERROR("server.loading", "LogDB.Opt.ClearInterval ({}) must be > 0, set to default 10.", m_int_configs[CONFIG_LOGDB_CLEARINTERVAL]);
1197 }
1198 if (reload)
1199 {
1202 }
1203 m_int_configs[CONFIG_LOGDB_CLEARTIME] = sConfigMgr->GetIntDefault("LogDB.Opt.ClearTime", 1209600); // 14 days default
1204 TC_LOG_INFO("server.loading", "Will clear `logs` table of entries older than {} seconds every {} minutes.",
1206
1207 m_int_configs[CONFIG_SKILL_CHANCE_ORANGE] = sConfigMgr->GetIntDefault("SkillChance.Orange", 100);
1208 m_int_configs[CONFIG_SKILL_CHANCE_YELLOW] = sConfigMgr->GetIntDefault("SkillChance.Yellow", 75);
1209 m_int_configs[CONFIG_SKILL_CHANCE_GREEN] = sConfigMgr->GetIntDefault("SkillChance.Green", 25);
1210 m_int_configs[CONFIG_SKILL_CHANCE_GREY] = sConfigMgr->GetIntDefault("SkillChance.Grey", 0);
1211
1212 m_int_configs[CONFIG_SKILL_CHANCE_MINING_STEPS] = sConfigMgr->GetIntDefault("SkillChance.MiningSteps", 75);
1213 m_int_configs[CONFIG_SKILL_CHANCE_SKINNING_STEPS] = sConfigMgr->GetIntDefault("SkillChance.SkinningSteps", 75);
1214
1215 m_bool_configs[CONFIG_SKILL_PROSPECTING] = sConfigMgr->GetBoolDefault("SkillChance.Prospecting", false);
1216 m_bool_configs[CONFIG_SKILL_MILLING] = sConfigMgr->GetBoolDefault("SkillChance.Milling", false);
1217
1218 m_int_configs[CONFIG_SKILL_GAIN_CRAFTING] = sConfigMgr->GetIntDefault("SkillGain.Crafting", 1);
1219
1220 m_int_configs[CONFIG_SKILL_GAIN_GATHERING] = sConfigMgr->GetIntDefault("SkillGain.Gathering", 1);
1221
1222 m_int_configs[CONFIG_MAX_OVERSPEED_PINGS] = sConfigMgr->GetIntDefault("MaxOverspeedPings", 2);
1223
1225 {
1226 TC_LOG_ERROR("server.loading", "MaxOverspeedPings ({}) must be in range 2..infinity (or 0 to disable check). Set to 2.", m_int_configs[CONFIG_MAX_OVERSPEED_PINGS]);
1228 }
1229
1230 m_bool_configs[CONFIG_WEATHER] = sConfigMgr->GetBoolDefault("ActivateWeather", true);
1231
1232 m_int_configs[CONFIG_DISABLE_BREATHING] = sConfigMgr->GetIntDefault("DisableWaterBreath", SEC_CONSOLE);
1233
1234 if (reload)
1235 {
1236 uint32 val = sConfigMgr->GetIntDefault("Expansion", CURRENT_EXPANSION);
1237 if (val != m_int_configs[CONFIG_EXPANSION])
1238 TC_LOG_ERROR("server.loading", "Expansion option can't be changed at worldserver.conf reload, using current value ({}).", m_int_configs[CONFIG_EXPANSION]);
1239 }
1240 else
1241 m_int_configs[CONFIG_EXPANSION] = sConfigMgr->GetIntDefault("Expansion", CURRENT_EXPANSION);
1242
1243 m_int_configs[CONFIG_CHATFLOOD_MESSAGE_COUNT] = sConfigMgr->GetIntDefault("ChatFlood.MessageCount", 10);
1244 m_int_configs[CONFIG_CHATFLOOD_MESSAGE_DELAY] = sConfigMgr->GetIntDefault("ChatFlood.MessageDelay", 1);
1245 m_int_configs[CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT] = sConfigMgr->GetIntDefault("ChatFlood.AddonMessageCount", 100);
1246 m_int_configs[CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY] = sConfigMgr->GetIntDefault("ChatFlood.AddonMessageDelay", 1);
1247 m_int_configs[CONFIG_CHATFLOOD_MUTE_TIME] = sConfigMgr->GetIntDefault("ChatFlood.MuteTime", 10);
1248
1249 m_bool_configs[CONFIG_EVENT_ANNOUNCE] = sConfigMgr->GetBoolDefault("Event.Announce", false);
1250
1251 m_float_configs[CONFIG_CREATURE_FAMILY_FLEE_ASSISTANCE_RADIUS] = sConfigMgr->GetFloatDefault("CreatureFamilyFleeAssistanceRadius", 30.0f);
1252 m_float_configs[CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS] = sConfigMgr->GetFloatDefault("CreatureFamilyAssistanceRadius", 10.0f);
1253 m_int_configs[CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY] = sConfigMgr->GetIntDefault("CreatureFamilyAssistanceDelay", 1500);
1254 m_int_configs[CONFIG_CREATURE_FAMILY_FLEE_DELAY] = sConfigMgr->GetIntDefault("CreatureFamilyFleeDelay", 7000);
1255
1256 m_int_configs[CONFIG_WORLD_BOSS_LEVEL_DIFF] = sConfigMgr->GetIntDefault("WorldBossLevelDiff", 3);
1257
1258 m_bool_configs[CONFIG_QUEST_ENABLE_QUEST_TRACKER] = sConfigMgr->GetBoolDefault("Quests.EnableQuestTracker", false);
1259
1260 // note: disable value (-1) will assigned as 0xFFFFFFF, to prevent overflow at calculations limit it to max possible player level MAX_LEVEL(100)
1261 m_int_configs[CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF] = sConfigMgr->GetIntDefault("Quests.LowLevelHideDiff", 4);
1264 m_int_configs[CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF] = sConfigMgr->GetIntDefault("Quests.HighLevelHideDiff", 7);
1267 m_bool_configs[CONFIG_QUEST_IGNORE_RAID] = sConfigMgr->GetBoolDefault("Quests.IgnoreRaid", false);
1268 m_bool_configs[CONFIG_QUEST_IGNORE_AUTO_ACCEPT] = sConfigMgr->GetBoolDefault("Quests.IgnoreAutoAccept", false);
1269 m_bool_configs[CONFIG_QUEST_IGNORE_AUTO_COMPLETE] = sConfigMgr->GetBoolDefault("Quests.IgnoreAutoComplete", false);
1270
1271 m_int_configs[CONFIG_RANDOM_BG_RESET_HOUR] = sConfigMgr->GetIntDefault("Battleground.Random.ResetHour", 6);
1273 {
1274 TC_LOG_ERROR("server.loading", "Battleground.Random.ResetHour ({}) can't be load. Set to 6.", m_int_configs[CONFIG_RANDOM_BG_RESET_HOUR]);
1276 }
1277
1278 m_int_configs[CONFIG_CALENDAR_DELETE_OLD_EVENTS_HOUR] = sConfigMgr->GetIntDefault("Calendar.DeleteOldEventsHour", 6);
1280 {
1281 TC_LOG_ERROR("misc", "Calendar.DeleteOldEventsHour ({}) can't be load. Set to 6.", m_int_configs[CONFIG_CALENDAR_DELETE_OLD_EVENTS_HOUR]);
1283 }
1284
1285 m_int_configs[CONFIG_GUILD_RESET_HOUR] = sConfigMgr->GetIntDefault("Guild.ResetHour", 6);
1287 {
1288 TC_LOG_ERROR("misc", "Guild.ResetHour ({}) can't be load. Set to 6.", m_int_configs[CONFIG_GUILD_RESET_HOUR]);
1290 }
1291
1292 m_bool_configs[CONFIG_DETECT_POS_COLLISION] = sConfigMgr->GetBoolDefault("DetectPosCollision", true);
1293
1294 m_bool_configs[CONFIG_RESTRICTED_LFG_CHANNEL] = sConfigMgr->GetBoolDefault("Channel.RestrictedLfg", true);
1295 m_int_configs[CONFIG_TALENTS_INSPECTING] = sConfigMgr->GetIntDefault("TalentsInspecting", 1);
1296 m_bool_configs[CONFIG_CHAT_FAKE_MESSAGE_PREVENTING] = sConfigMgr->GetBoolDefault("ChatFakeMessagePreventing", false);
1297 m_int_configs[CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY] = sConfigMgr->GetIntDefault("ChatStrictLinkChecking.Severity", 0);
1298 m_int_configs[CONFIG_CHAT_STRICT_LINK_CHECKING_KICK] = sConfigMgr->GetIntDefault("ChatStrictLinkChecking.Kick", 0);
1299
1300 m_int_configs[CONFIG_CORPSE_DECAY_NORMAL] = sConfigMgr->GetIntDefault("Corpse.Decay.Normal", 60);
1301 m_int_configs[CONFIG_CORPSE_DECAY_ELITE] = sConfigMgr->GetIntDefault("Corpse.Decay.Elite", 300);
1302 m_int_configs[CONFIG_CORPSE_DECAY_RAREELITE] = sConfigMgr->GetIntDefault("Corpse.Decay.RareElite", 300);
1303 m_int_configs[CONFIG_CORPSE_DECAY_OBSOLETE] = sConfigMgr->GetIntDefault("Corpse.Decay.Obsolete", 3600);
1304 m_int_configs[CONFIG_CORPSE_DECAY_RARE] = sConfigMgr->GetIntDefault("Corpse.Decay.Rare", 300);
1305 m_int_configs[CONFIG_CORPSE_DECAY_TRIVIAL] = sConfigMgr->GetIntDefault("Corpse.Decay.Trivial", 300);
1306 m_int_configs[CONFIG_CORPSE_DECAY_MINUSMOB] = sConfigMgr->GetIntDefault("Corpse.Decay.MinusMob", 150);
1307
1308 m_int_configs[CONFIG_DEATH_SICKNESS_LEVEL] = sConfigMgr->GetIntDefault ("Death.SicknessLevel", 11);
1309 m_bool_configs[CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP] = sConfigMgr->GetBoolDefault("Death.CorpseReclaimDelay.PvP", true);
1310 m_bool_configs[CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE] = sConfigMgr->GetBoolDefault("Death.CorpseReclaimDelay.PvE", true);
1311 m_bool_configs[CONFIG_DEATH_BONES_WORLD] = sConfigMgr->GetBoolDefault("Death.Bones.World", true);
1312 m_bool_configs[CONFIG_DEATH_BONES_BG_OR_ARENA] = sConfigMgr->GetBoolDefault("Death.Bones.BattlegroundOrArena", true);
1313
1314 m_bool_configs[CONFIG_DIE_COMMAND_MODE] = sConfigMgr->GetBoolDefault("Die.Command.Mode", true);
1315
1316 m_float_configs[CONFIG_THREAT_RADIUS] = sConfigMgr->GetFloatDefault("ThreatRadius", 60.0f);
1317
1318 m_bool_configs[CONFIG_DECLINED_NAMES_USED] = sConfigMgr->GetBoolDefault("DeclinedNames", false);
1319
1320 // always use declined names in the russian client
1321 if (Cfg_CategoriesEntry const* category = sCfgCategoriesStore.LookupEntry(m_int_configs[CONFIG_REALM_ZONE]))
1322 if (category->GetCreateCharsetMask().HasFlag(CfgCategoriesCharsets::Russian))
1324
1325 m_float_configs[CONFIG_LISTEN_RANGE_SAY] = sConfigMgr->GetFloatDefault("ListenRange.Say", 25.0f);
1326 m_float_configs[CONFIG_LISTEN_RANGE_TEXTEMOTE] = sConfigMgr->GetFloatDefault("ListenRange.TextEmote", 25.0f);
1327 m_float_configs[CONFIG_LISTEN_RANGE_YELL] = sConfigMgr->GetFloatDefault("ListenRange.Yell", 300.0f);
1328
1329 m_bool_configs[CONFIG_BATTLEGROUND_CAST_DESERTER] = sConfigMgr->GetBoolDefault("Battleground.CastDeserter", true);
1330 m_bool_configs[CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE] = sConfigMgr->GetBoolDefault("Battleground.QueueAnnouncer.Enable", false);
1331 m_bool_configs[CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY] = sConfigMgr->GetBoolDefault("Battleground.QueueAnnouncer.PlayerOnly", false);
1332 m_bool_configs[CONFIG_BATTLEGROUND_STORE_STATISTICS_ENABLE] = sConfigMgr->GetBoolDefault("Battleground.StoreStatistics.Enable", false);
1333 m_int_configs[CONFIG_BATTLEGROUND_REPORT_AFK] = sConfigMgr->GetIntDefault("Battleground.ReportAFK", 3);
1335 {
1336 TC_LOG_ERROR("server.loading", "Battleground.ReportAFK ({}) must be >0. Using 3 instead.", m_int_configs[CONFIG_BATTLEGROUND_REPORT_AFK]);
1338 }
1340 {
1341 TC_LOG_ERROR("server.loading", "Battleground.ReportAFK ({}) must be <10. Using 3 instead.", m_int_configs[CONFIG_BATTLEGROUND_REPORT_AFK]);
1343 }
1344 m_int_configs[CONFIG_BATTLEGROUND_INVITATION_TYPE] = sConfigMgr->GetIntDefault ("Battleground.InvitationType", 0);
1345 m_int_configs[CONFIG_BATTLEGROUND_PREMATURE_FINISH_TIMER] = sConfigMgr->GetIntDefault ("Battleground.PrematureFinishTimer", 5 * MINUTE * IN_MILLISECONDS);
1346 m_int_configs[CONFIG_BATTLEGROUND_PREMADE_GROUP_WAIT_FOR_MATCH] = sConfigMgr->GetIntDefault ("Battleground.PremadeGroupWaitForMatch", 30 * MINUTE * IN_MILLISECONDS);
1347 m_bool_configs[CONFIG_BG_XP_FOR_KILL] = sConfigMgr->GetBoolDefault("Battleground.GiveXPForKills", false);
1348 m_int_configs[CONFIG_ARENA_MAX_RATING_DIFFERENCE] = sConfigMgr->GetIntDefault ("Arena.MaxRatingDifference", 150);
1349 m_int_configs[CONFIG_ARENA_RATING_DISCARD_TIMER] = sConfigMgr->GetIntDefault ("Arena.RatingDiscardTimer", 10 * MINUTE * IN_MILLISECONDS);
1350 m_int_configs[CONFIG_ARENA_RATED_UPDATE_TIMER] = sConfigMgr->GetIntDefault ("Arena.RatedUpdateTimer", 5 * IN_MILLISECONDS);
1351 m_bool_configs[CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE] = sConfigMgr->GetBoolDefault("Arena.QueueAnnouncer.Enable", false);
1352 m_int_configs[CONFIG_ARENA_SEASON_ID] = sConfigMgr->GetIntDefault ("Arena.ArenaSeason.ID", 32);
1353 m_int_configs[CONFIG_ARENA_START_RATING] = sConfigMgr->GetIntDefault ("Arena.ArenaStartRating", 0);
1354 m_int_configs[CONFIG_ARENA_START_PERSONAL_RATING] = sConfigMgr->GetIntDefault ("Arena.ArenaStartPersonalRating", 1000);
1355 m_int_configs[CONFIG_ARENA_START_MATCHMAKER_RATING] = sConfigMgr->GetIntDefault ("Arena.ArenaStartMatchmakerRating", 1500);
1356 m_bool_configs[CONFIG_ARENA_SEASON_IN_PROGRESS] = sConfigMgr->GetBoolDefault("Arena.ArenaSeason.InProgress", false);
1357 m_bool_configs[CONFIG_ARENA_LOG_EXTENDED_INFO] = sConfigMgr->GetBoolDefault("ArenaLog.ExtendedInfo", false);
1358 m_float_configs[CONFIG_ARENA_WIN_RATING_MODIFIER_1] = sConfigMgr->GetFloatDefault("Arena.ArenaWinRatingModifier1", 48.0f);
1359 m_float_configs[CONFIG_ARENA_WIN_RATING_MODIFIER_2] = sConfigMgr->GetFloatDefault("Arena.ArenaWinRatingModifier2", 24.0f);
1360 m_float_configs[CONFIG_ARENA_LOSE_RATING_MODIFIER] = sConfigMgr->GetFloatDefault("Arena.ArenaLoseRatingModifier", 24.0f);
1361 m_float_configs[CONFIG_ARENA_MATCHMAKER_RATING_MODIFIER] = sConfigMgr->GetFloatDefault("Arena.ArenaMatchmakerRatingModifier", 24.0f);
1362
1363 if (reload)
1364 {
1367 }
1368
1369 m_bool_configs[CONFIG_OFFHAND_CHECK_AT_SPELL_UNLEARN] = sConfigMgr->GetBoolDefault("OffhandCheckAtSpellUnlearn", true);
1370
1371 m_int_configs[CONFIG_CREATURE_PICKPOCKET_REFILL] = sConfigMgr->GetIntDefault("Creature.PickPocketRefillDelay", 10 * MINUTE);
1372 m_int_configs[CONFIG_CREATURE_STOP_FOR_PLAYER] = sConfigMgr->GetIntDefault("Creature.MovingStopTimeForPlayer", 3 * MINUTE * IN_MILLISECONDS);
1373
1374 if (int32 clientCacheId = sConfigMgr->GetIntDefault("ClientCacheVersion", 0))
1375 {
1376 // overwrite DB/old value
1377 if (clientCacheId > 0)
1379 else
1380 TC_LOG_ERROR("server.loading", "ClientCacheVersion can't be negative {}, ignored.", clientCacheId);
1381 }
1382 TC_LOG_INFO("server.loading", "Client cache version set to: {}", m_int_configs[CONFIG_CLIENTCACHE_VERSION]);
1383
1384 m_int_configs[CONFIG_GUILD_NEWS_LOG_COUNT] = sConfigMgr->GetIntDefault("Guild.NewsLogRecordsCount", GUILD_NEWSLOG_MAX_RECORDS);
1387 m_int_configs[CONFIG_GUILD_EVENT_LOG_COUNT] = sConfigMgr->GetIntDefault("Guild.EventLogRecordsCount", GUILD_EVENTLOG_MAX_RECORDS);
1390 m_int_configs[CONFIG_GUILD_BANK_EVENT_LOG_COUNT] = sConfigMgr->GetIntDefault("Guild.BankEventLogRecordsCount", GUILD_BANKLOG_MAX_RECORDS);
1393
1394 // visibility on continents
1395 m_MaxVisibleDistanceOnContinents = sConfigMgr->GetFloatDefault("Visibility.Distance.Continents", DEFAULT_VISIBILITY_DISTANCE);
1397 {
1398 TC_LOG_ERROR("server.loading", "Visibility.Distance.Continents can't be less max aggro radius {}", 45*getRate(RATE_CREATURE_AGGRO));
1400 }
1402 {
1403 TC_LOG_ERROR("server.loading", "Visibility.Distance.Continents can't be greater {}", MAX_VISIBILITY_DISTANCE);
1405 }
1406
1407 // visibility in instances
1408 m_MaxVisibleDistanceInInstances = sConfigMgr->GetFloatDefault("Visibility.Distance.Instances", DEFAULT_VISIBILITY_INSTANCE);
1410 {
1411 TC_LOG_ERROR("server.loading", "Visibility.Distance.Instances can't be less max aggro radius {}", 45*getRate(RATE_CREATURE_AGGRO));
1413 }
1415 {
1416 TC_LOG_ERROR("server.loading", "Visibility.Distance.Instances can't be greater {}", MAX_VISIBILITY_DISTANCE);
1418 }
1419
1420 // visibility in BG
1421 m_MaxVisibleDistanceInBG = sConfigMgr->GetFloatDefault("Visibility.Distance.BG", DEFAULT_VISIBILITY_BGARENAS);
1423 {
1424 TC_LOG_ERROR("server.loading", "Visibility.Distance.BG can't be less max aggro radius {}", 45*getRate(RATE_CREATURE_AGGRO));
1426 }
1428 {
1429 TC_LOG_ERROR("server.loading", "Visibility.Distance.BG can't be greater {}", MAX_VISIBILITY_DISTANCE);
1431 }
1432
1433 // Visibility in Arenas
1434 m_MaxVisibleDistanceInArenas = sConfigMgr->GetFloatDefault("Visibility.Distance.Arenas", DEFAULT_VISIBILITY_BGARENAS);
1436 {
1437 TC_LOG_ERROR("server.loading", "Visibility.Distance.Arenas can't be less max aggro radius {}", 45*getRate(RATE_CREATURE_AGGRO));
1439 }
1441 {
1442 TC_LOG_ERROR("server.loading", "Visibility.Distance.Arenas can't be greater {}", MAX_VISIBILITY_DISTANCE);
1444 }
1445
1446 m_visibility_notify_periodOnContinents = sConfigMgr->GetIntDefault("Visibility.Notify.Period.OnContinents", DEFAULT_VISIBILITY_NOTIFY_PERIOD);
1447 m_visibility_notify_periodInInstances = sConfigMgr->GetIntDefault("Visibility.Notify.Period.InInstances", DEFAULT_VISIBILITY_NOTIFY_PERIOD);
1448 m_visibility_notify_periodInBG = sConfigMgr->GetIntDefault("Visibility.Notify.Period.InBG", DEFAULT_VISIBILITY_NOTIFY_PERIOD);
1449 m_visibility_notify_periodInArenas = sConfigMgr->GetIntDefault("Visibility.Notify.Period.InArenas", DEFAULT_VISIBILITY_NOTIFY_PERIOD);
1450
1452 m_int_configs[CONFIG_CHARDELETE_METHOD] = sConfigMgr->GetIntDefault("CharDelete.Method", 0);
1453 m_int_configs[CONFIG_CHARDELETE_MIN_LEVEL] = sConfigMgr->GetIntDefault("CharDelete.MinLevel", 0);
1454 m_int_configs[CONFIG_CHARDELETE_DEATH_KNIGHT_MIN_LEVEL] = sConfigMgr->GetIntDefault("CharDelete.DeathKnight.MinLevel", 0);
1455 m_int_configs[CONFIG_CHARDELETE_DEMON_HUNTER_MIN_LEVEL] = sConfigMgr->GetIntDefault("CharDelete.DemonHunter.MinLevel", 0);
1456 m_int_configs[CONFIG_CHARDELETE_KEEP_DAYS] = sConfigMgr->GetIntDefault("CharDelete.KeepDays", 30);
1457
1458 // No aggro from gray mobs
1459 m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE] = sConfigMgr->GetIntDefault("NoGrayAggro.Above", 0);
1460 m_int_configs[CONFIG_NO_GRAY_AGGRO_BELOW] = sConfigMgr->GetIntDefault("NoGrayAggro.Below", 0);
1462 {
1463 TC_LOG_ERROR("server.loading", "NoGrayAggro.Above ({}) must be in range 0..{}. Set to {}.", m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE], m_int_configs[CONFIG_MAX_PLAYER_LEVEL], m_int_configs[CONFIG_MAX_PLAYER_LEVEL]);
1465 }
1467 {
1468 TC_LOG_ERROR("server.loading", "NoGrayAggro.Below ({}) must be in range 0..{}. Set to {}.", m_int_configs[CONFIG_NO_GRAY_AGGRO_BELOW], m_int_configs[CONFIG_MAX_PLAYER_LEVEL], m_int_configs[CONFIG_MAX_PLAYER_LEVEL]);
1470 }
1472 {
1473 TC_LOG_ERROR("server.loading", "NoGrayAggro.Below ({}) cannot be greater than NoGrayAggro.Above ({}). Set to {}.", m_int_configs[CONFIG_NO_GRAY_AGGRO_BELOW], m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE], m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE]);
1475 }
1476
1477 // Respawn Settings
1478 m_int_configs[CONFIG_RESPAWN_MINCHECKINTERVALMS] = sConfigMgr->GetIntDefault("Respawn.MinCheckIntervalMS", 5000);
1479 m_int_configs[CONFIG_RESPAWN_DYNAMICMODE] = sConfigMgr->GetIntDefault("Respawn.DynamicMode", 0);
1481 {
1482 TC_LOG_ERROR("server.loading", "Invalid value for Respawn.DynamicMode ({}). Set to 0.", m_int_configs[CONFIG_RESPAWN_DYNAMICMODE]);
1484 }
1485 m_bool_configs[CONFIG_RESPAWN_DYNAMIC_ESCORTNPC] = sConfigMgr->GetBoolDefault("Respawn.DynamicEscortNPC", false);
1486 m_int_configs[CONFIG_RESPAWN_GUIDWARNLEVEL] = sConfigMgr->GetIntDefault("Respawn.GuidWarnLevel", 12000000);
1488 {
1489 TC_LOG_ERROR("server.loading", "Respawn.GuidWarnLevel ({}) cannot be greater than maximum GUID (16777215). Set to 12000000.", m_int_configs[CONFIG_RESPAWN_GUIDWARNLEVEL]);
1491 }
1492 m_int_configs[CONFIG_RESPAWN_GUIDALERTLEVEL] = sConfigMgr->GetIntDefault("Respawn.GuidAlertLevel", 16000000);
1494 {
1495 TC_LOG_ERROR("server.loading", "Respawn.GuidWarnLevel ({}) cannot be greater than maximum GUID (16777215). Set to 16000000.", m_int_configs[CONFIG_RESPAWN_GUIDALERTLEVEL]);
1497 }
1498 m_int_configs[CONFIG_RESPAWN_RESTARTQUIETTIME] = sConfigMgr->GetIntDefault("Respawn.RestartQuietTime", 3);
1500 {
1501 TC_LOG_ERROR("server.loading", "Respawn.RestartQuietTime ({}) must be an hour, between 0 and 23. Set to 3.", m_int_configs[CONFIG_RESPAWN_RESTARTQUIETTIME]);
1503 }
1504 m_float_configs[CONFIG_RESPAWN_DYNAMICRATE_CREATURE] = sConfigMgr->GetFloatDefault("Respawn.DynamicRateCreature", 10.0f);
1506 {
1507 TC_LOG_ERROR("server.loading", "Respawn.DynamicRateCreature ({}) must be positive. Set to 10.", m_float_configs[CONFIG_RESPAWN_DYNAMICRATE_CREATURE]);
1509 }
1510 m_int_configs[CONFIG_RESPAWN_DYNAMICMINIMUM_CREATURE] = sConfigMgr->GetIntDefault("Respawn.DynamicMinimumCreature", 10);
1511 m_float_configs[CONFIG_RESPAWN_DYNAMICRATE_GAMEOBJECT] = sConfigMgr->GetFloatDefault("Respawn.DynamicRateGameObject", 10.0f);
1513 {
1514 TC_LOG_ERROR("server.loading", "Respawn.DynamicRateGameObject ({}) must be positive. Set to 10.", m_float_configs[CONFIG_RESPAWN_DYNAMICRATE_GAMEOBJECT]);
1516 }
1517 m_int_configs[CONFIG_RESPAWN_DYNAMICMINIMUM_GAMEOBJECT] = sConfigMgr->GetIntDefault("Respawn.DynamicMinimumGameObject", 10);
1518 _guidWarningMsg = sConfigMgr->GetStringDefault("Respawn.WarningMessage", "There will be an unscheduled server restart at 03:00. The server will be available again shortly after.");
1519 _alertRestartReason = sConfigMgr->GetStringDefault("Respawn.AlertRestartReason", "Urgent Maintenance");
1520 m_int_configs[CONFIG_RESPAWN_GUIDWARNING_FREQUENCY] = sConfigMgr->GetIntDefault("Respawn.WarningFrequency", 1800);
1522 std::string dataPath = sConfigMgr->GetStringDefault("DataDir", "./");
1523 if (dataPath.empty() || (dataPath.at(dataPath.length()-1) != '/' && dataPath.at(dataPath.length()-1) != '\\'))
1524 dataPath.push_back('/');
1525
1526#if TRINITY_PLATFORM == TRINITY_PLATFORM_UNIX || TRINITY_PLATFORM == TRINITY_PLATFORM_APPLE
1527 if (dataPath[0] == '~')
1528 {
1529 char const* home = getenv("HOME");
1530 if (home)
1531 dataPath.replace(0, 1, home);
1532 }
1533#endif
1534
1535 if (reload)
1536 {
1537 if (dataPath != m_dataPath)
1538 TC_LOG_ERROR("server.loading", "DataDir option can't be changed at worldserver.conf reload, using current value ({}).", m_dataPath);
1539 }
1540 else
1541 {
1542 m_dataPath = dataPath;
1543 TC_LOG_INFO("server.loading", "Using DataDir {}", m_dataPath);
1544 }
1545
1546 m_bool_configs[CONFIG_ENABLE_MMAPS] = sConfigMgr->GetBoolDefault("mmap.enablePathFinding", true);
1547 TC_LOG_INFO("server.loading", "WORLD: MMap data directory is: {}mmaps", m_dataPath);
1548
1549 m_bool_configs[CONFIG_VMAP_INDOOR_CHECK] = sConfigMgr->GetBoolDefault("vmap.enableIndoorCheck", false);
1550 bool enableIndoor = sConfigMgr->GetBoolDefault("vmap.enableIndoorCheck", true);
1551 bool enableLOS = sConfigMgr->GetBoolDefault("vmap.enableLOS", true);
1552 bool enableHeight = sConfigMgr->GetBoolDefault("vmap.enableHeight", true);
1553
1554 if (!enableHeight)
1555 TC_LOG_ERROR("server.loading", "VMap height checking disabled! Creatures movements and other various things WILL be broken! Expect no support.");
1556
1559 TC_LOG_INFO("server.loading", "VMap support included. LineOfSight: {}, getHeight: {}, indoorCheck: {}", enableLOS, enableHeight, enableIndoor);
1560 TC_LOG_INFO("server.loading", "VMap data directory is: {}vmaps", m_dataPath);
1561
1562 m_int_configs[CONFIG_MAX_WHO] = sConfigMgr->GetIntDefault("MaxWhoListReturns", 49);
1563 m_bool_configs[CONFIG_START_ALL_SPELLS] = sConfigMgr->GetBoolDefault("PlayerStart.AllSpells", false);
1565 TC_LOG_WARN("server.loading", "PlayerStart.AllSpells enabled - may not function as intended!");
1566 m_int_configs[CONFIG_HONOR_AFTER_DUEL] = sConfigMgr->GetIntDefault("HonorPointsAfterDuel", 0);
1567 m_bool_configs[CONFIG_RESET_DUEL_COOLDOWNS] = sConfigMgr->GetBoolDefault("ResetDuelCooldowns", false);
1568 m_bool_configs[CONFIG_RESET_DUEL_HEALTH_MANA] = sConfigMgr->GetBoolDefault("ResetDuelHealthMana", false);
1569 m_bool_configs[CONFIG_START_ALL_EXPLORED] = sConfigMgr->GetBoolDefault("PlayerStart.MapsExplored", false);
1570 m_bool_configs[CONFIG_START_ALL_REP] = sConfigMgr->GetBoolDefault("PlayerStart.AllReputation", false);
1571 m_bool_configs[CONFIG_PVP_TOKEN_ENABLE] = sConfigMgr->GetBoolDefault("PvPToken.Enable", false);
1572 m_int_configs[CONFIG_PVP_TOKEN_MAP_TYPE] = sConfigMgr->GetIntDefault("PvPToken.MapAllowType", 4);
1573 m_int_configs[CONFIG_PVP_TOKEN_ID] = sConfigMgr->GetIntDefault("PvPToken.ItemID", 29434);
1574 m_int_configs[CONFIG_PVP_TOKEN_COUNT] = sConfigMgr->GetIntDefault("PvPToken.ItemCount", 1);
1577
1578 m_bool_configs[CONFIG_NO_RESET_TALENT_COST] = sConfigMgr->GetBoolDefault("NoResetTalentsCost", false);
1579 m_bool_configs[CONFIG_SHOW_KICK_IN_WORLD] = sConfigMgr->GetBoolDefault("ShowKickInWorld", false);
1580 m_bool_configs[CONFIG_SHOW_MUTE_IN_WORLD] = sConfigMgr->GetBoolDefault("ShowMuteInWorld", false);
1581 m_bool_configs[CONFIG_SHOW_BAN_IN_WORLD] = sConfigMgr->GetBoolDefault("ShowBanInWorld", false);
1582 m_int_configs[CONFIG_NUMTHREADS] = sConfigMgr->GetIntDefault("MapUpdate.Threads", 1);
1583 m_int_configs[CONFIG_MAX_RESULTS_LOOKUP_COMMANDS] = sConfigMgr->GetIntDefault("Command.LookupMaxResults", 0);
1584
1585 // Warden
1586 m_bool_configs[CONFIG_WARDEN_ENABLED] = sConfigMgr->GetBoolDefault("Warden.Enabled", false);
1587 m_int_configs[CONFIG_WARDEN_NUM_INJECT_CHECKS] = sConfigMgr->GetIntDefault("Warden.NumInjectionChecks", 9);
1588 m_int_configs[CONFIG_WARDEN_NUM_LUA_CHECKS] = sConfigMgr->GetIntDefault("Warden.NumLuaSandboxChecks", 1);
1589 m_int_configs[CONFIG_WARDEN_NUM_CLIENT_MOD_CHECKS] = sConfigMgr->GetIntDefault("Warden.NumClientModChecks", 1);
1590 m_int_configs[CONFIG_WARDEN_CLIENT_BAN_DURATION] = sConfigMgr->GetIntDefault("Warden.BanDuration", 86400);
1591 m_int_configs[CONFIG_WARDEN_CLIENT_CHECK_HOLDOFF] = sConfigMgr->GetIntDefault("Warden.ClientCheckHoldOff", 30);
1592 m_int_configs[CONFIG_WARDEN_CLIENT_FAIL_ACTION] = sConfigMgr->GetIntDefault("Warden.ClientCheckFailAction", 0);
1593 m_int_configs[CONFIG_WARDEN_CLIENT_RESPONSE_DELAY] = sConfigMgr->GetIntDefault("Warden.ClientResponseDelay", 600);
1594
1595 // Feature System
1596 m_bool_configs[CONFIG_FEATURE_SYSTEM_BPAY_STORE_ENABLED] = sConfigMgr->GetBoolDefault("FeatureSystem.BpayStore.Enabled", false);
1597 m_bool_configs[CONFIG_FEATURE_SYSTEM_CHARACTER_UNDELETE_ENABLED] = sConfigMgr->GetBoolDefault("FeatureSystem.CharacterUndelete.Enabled", false);
1598 m_int_configs[CONFIG_FEATURE_SYSTEM_CHARACTER_UNDELETE_COOLDOWN] = sConfigMgr->GetIntDefault("FeatureSystem.CharacterUndelete.Cooldown", 2592000);
1599
1600 // Dungeon finder
1601 m_int_configs[CONFIG_LFG_OPTIONSMASK] = sConfigMgr->GetIntDefault("DungeonFinder.OptionsMask", 1);
1602
1603 // DBC_ItemAttributes
1604 m_bool_configs[CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES] = sConfigMgr->GetBoolDefault("DBC.EnforceItemAttributes", true);
1605
1606 // Accountpassword Secruity
1607 m_int_configs[CONFIG_ACC_PASSCHANGESEC] = sConfigMgr->GetIntDefault("Account.PasswordChangeSecurity", 0);
1608
1609 // Random Battleground Rewards
1610 m_int_configs[CONFIG_BG_REWARD_WINNER_HONOR_FIRST] = sConfigMgr->GetIntDefault("Battleground.RewardWinnerHonorFirst", 27000);
1611 m_int_configs[CONFIG_BG_REWARD_WINNER_CONQUEST_FIRST] = sConfigMgr->GetIntDefault("Battleground.RewardWinnerConquestFirst", 10000);
1612 m_int_configs[CONFIG_BG_REWARD_WINNER_HONOR_LAST] = sConfigMgr->GetIntDefault("Battleground.RewardWinnerHonorLast", 13500);
1613 m_int_configs[CONFIG_BG_REWARD_WINNER_CONQUEST_LAST] = sConfigMgr->GetIntDefault("Battleground.RewardWinnerConquestLast", 5000);
1614 m_int_configs[CONFIG_BG_REWARD_LOSER_HONOR_FIRST] = sConfigMgr->GetIntDefault("Battleground.RewardLoserHonorFirst", 4500);
1615 m_int_configs[CONFIG_BG_REWARD_LOSER_HONOR_LAST] = sConfigMgr->GetIntDefault("Battleground.RewardLoserHonorLast", 3500);
1616
1617 // Max instances per hour
1618 m_int_configs[CONFIG_MAX_INSTANCES_PER_HOUR] = sConfigMgr->GetIntDefault("AccountInstancesPerHour", 5);
1619
1620 // Anounce reset of instance to whole party
1621 m_bool_configs[CONFIG_INSTANCES_RESET_ANNOUNCE] = sConfigMgr->GetBoolDefault("InstancesResetAnnounce", false);
1622
1623 // AutoBroadcast
1624 m_bool_configs[CONFIG_AUTOBROADCAST] = sConfigMgr->GetBoolDefault("AutoBroadcast.On", false);
1625 m_int_configs[CONFIG_AUTOBROADCAST_CENTER] = sConfigMgr->GetIntDefault("AutoBroadcast.Center", 0);
1626 m_int_configs[CONFIG_AUTOBROADCAST_INTERVAL] = sConfigMgr->GetIntDefault("AutoBroadcast.Timer", 60000);
1627 if (reload)
1628 {
1631 }
1632
1633 // MySQL ping time interval
1634 m_int_configs[CONFIG_DB_PING_INTERVAL] = sConfigMgr->GetIntDefault("MaxPingTime", 30);
1635
1636 // Guild save interval
1637 m_int_configs[CONFIG_GUILD_SAVE_INTERVAL] = sConfigMgr->GetIntDefault("Guild.SaveInterval", 15);
1638
1639 // misc
1640 m_bool_configs[CONFIG_PDUMP_NO_PATHS] = sConfigMgr->GetBoolDefault("PlayerDump.DisallowPaths", true);
1641 m_bool_configs[CONFIG_PDUMP_NO_OVERWRITE] = sConfigMgr->GetBoolDefault("PlayerDump.DisallowOverwrite", true);
1642
1643 // Wintergrasp battlefield
1644 m_bool_configs[CONFIG_WINTERGRASP_ENABLE] = sConfigMgr->GetBoolDefault("Wintergrasp.Enable", false);
1645 m_int_configs[CONFIG_WINTERGRASP_PLR_MAX] = sConfigMgr->GetIntDefault("Wintergrasp.PlayerMax", 100);
1646 m_int_configs[CONFIG_WINTERGRASP_PLR_MIN] = sConfigMgr->GetIntDefault("Wintergrasp.PlayerMin", 0);
1647 m_int_configs[CONFIG_WINTERGRASP_PLR_MIN_LVL] = sConfigMgr->GetIntDefault("Wintergrasp.PlayerMinLvl", 77);
1648 m_int_configs[CONFIG_WINTERGRASP_BATTLETIME] = sConfigMgr->GetIntDefault("Wintergrasp.BattleTimer", 30);
1649 m_int_configs[CONFIG_WINTERGRASP_NOBATTLETIME] = sConfigMgr->GetIntDefault("Wintergrasp.NoBattleTimer", 150);
1650 m_int_configs[CONFIG_WINTERGRASP_RESTART_AFTER_CRASH] = sConfigMgr->GetIntDefault("Wintergrasp.CrashRestartTimer", 10);
1651
1652 // Tol Barad battlefield
1653 m_bool_configs[CONFIG_TOLBARAD_ENABLE] = sConfigMgr->GetBoolDefault("TolBarad.Enable", true);
1654 m_int_configs[CONFIG_TOLBARAD_PLR_MAX] = sConfigMgr->GetIntDefault("TolBarad.PlayerMax", 100);
1655 m_int_configs[CONFIG_TOLBARAD_PLR_MIN] = sConfigMgr->GetIntDefault("TolBarad.PlayerMin", 0);
1656 m_int_configs[CONFIG_TOLBARAD_PLR_MIN_LVL] = sConfigMgr->GetIntDefault("TolBarad.PlayerMinLvl", 85);
1657 m_int_configs[CONFIG_TOLBARAD_BATTLETIME] = sConfigMgr->GetIntDefault("TolBarad.BattleTimer", 15);
1658 m_int_configs[CONFIG_TOLBARAD_BONUSTIME] = sConfigMgr->GetIntDefault("TolBarad.BonusTime", 5);
1659 m_int_configs[CONFIG_TOLBARAD_NOBATTLETIME] = sConfigMgr->GetIntDefault("TolBarad.NoBattleTimer", 150);
1660 m_int_configs[CONFIG_TOLBARAD_RESTART_AFTER_CRASH] = sConfigMgr->GetIntDefault("TolBarad.CrashRestartTimer", 10);
1661
1662 // Stats limits
1663 m_bool_configs[CONFIG_STATS_LIMITS_ENABLE] = sConfigMgr->GetBoolDefault("Stats.Limits.Enable", false);
1664 m_float_configs[CONFIG_STATS_LIMITS_DODGE] = sConfigMgr->GetFloatDefault("Stats.Limits.Dodge", 95.0f);
1665 m_float_configs[CONFIG_STATS_LIMITS_PARRY] = sConfigMgr->GetFloatDefault("Stats.Limits.Parry", 95.0f);
1666 m_float_configs[CONFIG_STATS_LIMITS_BLOCK] = sConfigMgr->GetFloatDefault("Stats.Limits.Block", 95.0f);
1667 m_float_configs[CONFIG_STATS_LIMITS_CRIT] = sConfigMgr->GetFloatDefault("Stats.Limits.Crit", 95.0f);
1668
1669 //packet spoof punishment
1671 m_int_configs[CONFIG_PACKET_SPOOF_BANMODE] = sConfigMgr->GetIntDefault("PacketSpoof.BanMode", (uint32)BAN_ACCOUNT);
1674
1675 m_int_configs[CONFIG_PACKET_SPOOF_BANDURATION] = sConfigMgr->GetIntDefault("PacketSpoof.BanDuration", 86400);
1676
1677 m_bool_configs[CONFIG_IP_BASED_ACTION_LOGGING] = sConfigMgr->GetBoolDefault("Allow.IP.Based.Action.Logging", false);
1678
1679 // AHBot
1680 m_int_configs[CONFIG_AHBOT_UPDATE_INTERVAL] = sConfigMgr->GetIntDefault("AuctionHouseBot.Update.Interval", 20);
1681
1682 m_bool_configs[CONFIG_CALCULATE_CREATURE_ZONE_AREA_DATA] = sConfigMgr->GetBoolDefault("Calculate.Creature.Zone.Area.Data", false);
1683 m_bool_configs[CONFIG_CALCULATE_GAMEOBJECT_ZONE_AREA_DATA] = sConfigMgr->GetBoolDefault("Calculate.Gameoject.Zone.Area.Data", false);
1684
1685 // Black Market
1686 m_bool_configs[CONFIG_BLACKMARKET_ENABLED] = sConfigMgr->GetBoolDefault("BlackMarket.Enabled", true);
1687
1688 m_int_configs[CONFIG_BLACKMARKET_MAXAUCTIONS] = sConfigMgr->GetIntDefault("BlackMarket.MaxAuctions", 12);
1689 m_int_configs[CONFIG_BLACKMARKET_UPDATE_PERIOD] = sConfigMgr->GetIntDefault("BlackMarket.UpdatePeriod", 24);
1690
1691 // HotSwap
1692 m_bool_configs[CONFIG_HOTSWAP_ENABLED] = sConfigMgr->GetBoolDefault("HotSwap.Enabled", true);
1693 m_bool_configs[CONFIG_HOTSWAP_RECOMPILER_ENABLED] = sConfigMgr->GetBoolDefault("HotSwap.EnableReCompiler", true);
1694 m_bool_configs[CONFIG_HOTSWAP_EARLY_TERMINATION_ENABLED] = sConfigMgr->GetBoolDefault("HotSwap.EnableEarlyTermination", true);
1695 m_bool_configs[CONFIG_HOTSWAP_BUILD_FILE_RECREATION_ENABLED] = sConfigMgr->GetBoolDefault("HotSwap.EnableBuildFileRecreation", true);
1696 m_bool_configs[CONFIG_HOTSWAP_INSTALL_ENABLED] = sConfigMgr->GetBoolDefault("HotSwap.EnableInstall", true);
1697 m_bool_configs[CONFIG_HOTSWAP_PREFIX_CORRECTION_ENABLED] = sConfigMgr->GetBoolDefault("HotSwap.EnablePrefixCorrection", true);
1698
1699 // prevent character rename on character customization
1700 m_bool_configs[CONFIG_PREVENT_RENAME_CUSTOMIZATION] = sConfigMgr->GetBoolDefault("PreventRenameCharacterOnCustomization", false);
1701
1702 // Allow 5-man parties to use raid warnings
1703 m_bool_configs[CONFIG_CHAT_PARTY_RAID_WARNINGS] = sConfigMgr->GetBoolDefault("PartyRaidWarnings", false);
1704
1705 // Allow to cache data queries
1706 m_bool_configs[CONFIG_CACHE_DATA_QUERIES] = sConfigMgr->GetBoolDefault("CacheDataQueries", true);
1707
1708 // Check Invalid Position
1709 m_bool_configs[CONFIG_CREATURE_CHECK_INVALID_POSITION] = sConfigMgr->GetBoolDefault("Creature.CheckInvalidPosition", false);
1710 m_bool_configs[CONFIG_GAME_OBJECT_CHECK_INVALID_POSITION] = sConfigMgr->GetBoolDefault("GameObject.CheckInvalidPosition", false);
1711
1712 // Whether to use LoS from game objects
1713 m_bool_configs[CONFIG_CHECK_GOBJECT_LOS] = sConfigMgr->GetBoolDefault("CheckGameObjectLoS", true);
1714
1715 // FactionBalance
1716 m_int_configs[CONFIG_FACTION_BALANCE_LEVEL_CHECK_DIFF] = sConfigMgr->GetIntDefault("Pvp.FactionBalance.LevelCheckDiff", 0);
1717 m_float_configs[CONFIG_CALL_TO_ARMS_5_PCT] = sConfigMgr->GetFloatDefault("Pvp.FactionBalance.Pct5", 0.6f);
1718 m_float_configs[CONFIG_CALL_TO_ARMS_10_PCT] = sConfigMgr->GetFloatDefault("Pvp.FactionBalance.Pct10", 0.7f);
1719 m_float_configs[CONFIG_CALL_TO_ARMS_20_PCT] = sConfigMgr->GetFloatDefault("Pvp.FactionBalance.Pct20", 0.8f);
1720
1721 // Specifies if IP addresses can be logged to the database
1722 m_bool_configs[CONFIG_ALLOW_LOGGING_IP_ADDRESSES_IN_DATABASE] = sConfigMgr->GetBoolDefault("AllowLoggingIPAddressesInDatabase", true, true);
1723
1724 // Enable AE loot
1725 m_bool_configs[CONFIG_ENABLE_AE_LOOT] = sConfigMgr->GetBoolDefault("Loot.EnableAELoot", true);
1726
1727 // call ScriptMgr if we're reloading the configuration
1728 if (reload)
1729 sScriptMgr->OnConfigLoad(reload);
1730}
1731
1734{
1735 sLog->SetRealmId(realm.Id.Realm);
1736
1738 uint32 startupBegin = getMSTime();
1739
1741 srand((unsigned int)GameTime::GetGameTime());
1742
1744 dtAllocSetCustom(dtCustomAlloc, dtCustomFree);
1745
1750
1753
1756
1758 sObjectMgr->SetHighestGuids();
1759
1761 if (!TerrainMgr::ExistMapAndVMap(0, -6240.32f, 331.033f)
1762 || !TerrainMgr::ExistMapAndVMap(0, -8949.95f, -132.493f)
1763 || !TerrainMgr::ExistMapAndVMap(1, -618.518f, -4251.67f)
1764 || !TerrainMgr::ExistMapAndVMap(0, 1676.35f, 1677.45f)
1765 || !TerrainMgr::ExistMapAndVMap(1, 10311.3f, 832.463f)
1766 || !TerrainMgr::ExistMapAndVMap(1, -2917.58f, -257.98f)
1768 !TerrainMgr::ExistMapAndVMap(530, 10349.6f, -6357.29f) ||
1769 !TerrainMgr::ExistMapAndVMap(530, -3961.64f, -13931.2f))))
1770 {
1771 TC_LOG_FATAL("server.loading", "Unable to load map and vmap data for starting zones - server shutting down!");
1772 exit(1);
1773 }
1774
1776 sPoolMgr->Initialize();
1777
1779 sGameEventMgr->Initialize();
1780
1782
1783 TC_LOG_INFO("server.loading", "Loading Trinity strings...");
1784 if (!sObjectMgr->LoadTrinityStrings())
1785 exit(1); // Error message displayed in function already
1786
1788 //No SQL injection as values are treated as integers
1789
1790 // not send custom type REALM_FFA_PVP to realm list
1793
1794 LoginDatabase.PExecute("UPDATE realmlist SET icon = {}, timezone = {} WHERE id = '{}'", server_type, realm_zone, realm.Id.Realm); // One-time query
1795
1796 TC_LOG_INFO("server.loading", "Initialize data stores...");
1800 {
1801 TC_LOG_FATAL("server.loading", "Unable to load db2 files for {} locale specified in DBC.Locale config!", localeNames[m_defaultDbcLocale]);
1802 exit(1);
1803 }
1804
1805 TC_LOG_INFO("server.loading", "Loading GameObject models...");
1807 {
1808 TC_LOG_FATAL("server.loading", "Unable to load gameobject models (part of vmaps), objects using WMO models will crash the client - server shutting down!");
1809 exit(1);
1810 }
1811
1812 TC_LOG_INFO("misc", "Loading hotfix blobs...");
1813 sDB2Manager.LoadHotfixBlob(m_availableDbcLocaleMask);
1814 TC_LOG_INFO("misc", "Loading hotfix info...");
1815 sDB2Manager.LoadHotfixData(m_availableDbcLocaleMask);
1816 TC_LOG_INFO("misc", "Loading hotfix optional data...");
1817 sDB2Manager.LoadHotfixOptionalData(m_availableDbcLocaleMask);
1822
1823 //Load weighted graph on taxi nodes path
1825 // Load IP Location Database
1826 sIPLocation->Load();
1827
1828 std::unordered_map<uint32, std::vector<uint32>> mapData;
1829 for (MapEntry const* mapEntry : sMapStore)
1830 {
1831 mapData.emplace(std::piecewise_construct, std::forward_as_tuple(mapEntry->ID), std::forward_as_tuple());
1832 if (mapEntry->ParentMapID != -1)
1833 {
1834 ASSERT(mapEntry->CosmeticParentMapID == -1 || mapEntry->ParentMapID == mapEntry->CosmeticParentMapID,
1835 "Inconsistent parent map data for map %u (ParentMapID = %hd, CosmeticParentMapID = %hd)",
1836 mapEntry->ID, mapEntry->ParentMapID, mapEntry->CosmeticParentMapID);
1837
1838 mapData[mapEntry->ParentMapID].push_back(mapEntry->ID);
1839 }
1840 else if (mapEntry->CosmeticParentMapID != -1)
1841 mapData[mapEntry->CosmeticParentMapID].push_back(mapEntry->ID);
1842 }
1843
1844 sTerrainMgr.InitializeParentMapData(mapData);
1845
1846 vmmgr2->InitializeThreadUnsafe(mapData);
1847
1849 mmmgr->InitializeThreadUnsafe(mapData);
1850
1853
1854 TC_LOG_INFO("server.loading", "Initializing PlayerDump tables...");
1856
1857 TC_LOG_INFO("server.loading", "Loading SpellInfo store...");
1858 sSpellMgr->LoadSpellInfoStore();
1859
1860 TC_LOG_INFO("server.loading", "Loading serverside spells...");
1861 sSpellMgr->LoadSpellInfoServerside();
1862
1863 TC_LOG_INFO("server.loading", "Loading SpellInfo corrections...");
1864 sSpellMgr->LoadSpellInfoCorrections();
1865
1866 TC_LOG_INFO("server.loading", "Loading SkillLineAbilityMultiMap Data...");
1867 sSpellMgr->LoadSkillLineAbilityMap();
1868
1869 TC_LOG_INFO("server.loading", "Loading SpellInfo custom attributes...");
1870 sSpellMgr->LoadSpellInfoCustomAttributes();
1871
1872 TC_LOG_INFO("server.loading", "Loading SpellInfo diminishing infos...");
1873 sSpellMgr->LoadSpellInfoDiminishing();
1874
1875 TC_LOG_INFO("server.loading", "Loading SpellInfo immunity infos...");
1876 sSpellMgr->LoadSpellInfoImmunities();
1877
1878 TC_LOG_INFO("server.loading", "Loading PetFamilySpellsStore Data...");
1879 sSpellMgr->LoadPetFamilySpellsStore();
1880
1881 TC_LOG_INFO("server.loading", "Loading Spell Totem models...");
1882 sSpellMgr->LoadSpellTotemModel();
1883
1884 TC_LOG_INFO("server.loading", "Loading Traits...");
1886
1887 TC_LOG_INFO("server.loading", "Loading languages..."); // must be after LoadSpellInfoStore and LoadSkillLineAbilityMap
1888 sLanguageMgr->LoadLanguages();
1889
1890 TC_LOG_INFO("server.loading", "Loading languages words...");
1891 sLanguageMgr->LoadLanguagesWords();
1892
1893 TC_LOG_INFO("server.loading", "Loading Instance Template...");
1894 sObjectMgr->LoadInstanceTemplate();
1895
1896 // Must be called before `respawn` data
1897 TC_LOG_INFO("server.loading", "Loading instances...");
1898 sMapMgr->InitInstanceIds();
1899 sInstanceLockMgr.Load();
1900
1901 TC_LOG_INFO("server.loading", "Loading Localization strings...");
1902 uint32 oldMSTime = getMSTime();
1903 sObjectMgr->LoadCreatureLocales();
1904 sObjectMgr->LoadGameObjectLocales();
1905 sObjectMgr->LoadQuestTemplateLocale();
1906 sObjectMgr->LoadQuestOfferRewardLocale();
1907 sObjectMgr->LoadQuestRequestItemsLocale();
1908 sObjectMgr->LoadQuestObjectivesLocale();
1909 sObjectMgr->LoadPageTextLocales();
1910 sObjectMgr->LoadGossipMenuItemsLocales();
1911 sObjectMgr->LoadPointOfInterestLocales();
1912
1913 sObjectMgr->SetDBCLocaleIndex(GetDefaultDbcLocale()); // Get once for all the locale index of DBC language (console/broadcasts)
1914 TC_LOG_INFO("server.loading", ">> Localization strings loaded in {} ms", GetMSTimeDiffToNow(oldMSTime));
1915
1916 TC_LOG_INFO("server.loading", "Loading Account Roles and Permissions...");
1917 sAccountMgr->LoadRBAC();
1918
1919 TC_LOG_INFO("server.loading", "Loading Page Texts...");
1920 sObjectMgr->LoadPageTexts();
1921
1922 TC_LOG_INFO("server.loading", "Loading Game Object Templates..."); // must be after LoadPageTexts
1923 sObjectMgr->LoadGameObjectTemplate();
1924
1925 TC_LOG_INFO("server.loading", "Loading Game Object template addons...");
1926 sObjectMgr->LoadGameObjectTemplateAddons();
1927
1928 TC_LOG_INFO("server.loading", "Loading Transport templates...");
1929 sTransportMgr->LoadTransportTemplates();
1930
1931 TC_LOG_INFO("server.loading", "Loading Transport animations and rotations...");
1932 sTransportMgr->LoadTransportAnimationAndRotation();
1933
1934 TC_LOG_INFO("server.loading", "Loading Transport spawns...");
1935 sTransportMgr->LoadTransportSpawns();
1936
1937 TC_LOG_INFO("server.loading", "Loading Spell Rank Data...");
1938 sSpellMgr->LoadSpellRanks();
1939
1940 TC_LOG_INFO("server.loading", "Loading Spell Required Data...");
1941 sSpellMgr->LoadSpellRequired();
1942
1943 TC_LOG_INFO("server.loading", "Loading Spell Group types...");
1944 sSpellMgr->LoadSpellGroups();
1945
1946 TC_LOG_INFO("server.loading", "Loading Spell Learn Skills...");
1947 sSpellMgr->LoadSpellLearnSkills(); // must be after LoadSpellRanks
1948
1949 TC_LOG_INFO("server.loading", "Loading SpellInfo SpellSpecific and AuraState...");
1950 sSpellMgr->LoadSpellInfoSpellSpecificAndAuraState(); // must be after LoadSpellRanks
1951
1952 TC_LOG_INFO("server.loading", "Loading Spell Learn Spells...");
1953 sSpellMgr->LoadSpellLearnSpells();
1954
1955 TC_LOG_INFO("server.loading", "Loading Spell Proc conditions and data...");
1956 sSpellMgr->LoadSpellProcs();
1957
1958 TC_LOG_INFO("server.loading", "Loading Aggro Spells Definitions...");
1959 sSpellMgr->LoadSpellThreats();
1960
1961 TC_LOG_INFO("server.loading", "Loading Spell Group Stack Rules...");
1962 sSpellMgr->LoadSpellGroupStackRules();
1963
1964 TC_LOG_INFO("server.loading", "Loading NPC Texts...");
1965 sObjectMgr->LoadNPCText();
1966
1967 TC_LOG_INFO("server.loading", "Loading Enchant Spells Proc datas...");
1968 sSpellMgr->LoadSpellEnchantProcData();
1969
1970 TC_LOG_INFO("server.loading", "Loading item bonus data...");
1972
1973 TC_LOG_INFO("server.loading", "Loading Random item bonus list definitions...");
1975
1976 TC_LOG_INFO("server.loading", "Loading Disables"); // must be before loading quests and items
1978
1979 TC_LOG_INFO("server.loading", "Loading Items..."); // must be after LoadRandomEnchantmentsTable and LoadPageTexts
1980 sObjectMgr->LoadItemTemplates();
1981
1982 TC_LOG_INFO("server.loading", "Loading Item set names..."); // must be after LoadItemPrototypes
1983 sObjectMgr->LoadItemTemplateAddon();
1984
1985 TC_LOG_INFO("misc", "Loading Item Scripts..."); // must be after LoadItemPrototypes
1986 sObjectMgr->LoadItemScriptNames();
1987
1988 TC_LOG_INFO("server.loading", "Loading Creature Model Based Info Data...");
1989 sObjectMgr->LoadCreatureModelInfo();
1990
1991 TC_LOG_INFO("server.loading", "Loading Creature templates...");
1992 sObjectMgr->LoadCreatureTemplates();
1993
1994 TC_LOG_INFO("server.loading", "Loading Equipment templates..."); // must be after LoadCreatureTemplates
1995 sObjectMgr->LoadEquipmentTemplates();
1996
1997 TC_LOG_INFO("server.loading", "Loading Creature template addons...");
1998 sObjectMgr->LoadCreatureTemplateAddons();
1999
2000 TC_LOG_INFO("server.loading", "Loading Creature template difficulty...");
2001 sObjectMgr->LoadCreatureTemplateDifficulty();
2002
2003 TC_LOG_INFO("server.loading", "Loading Creature template sparring...");
2004 sObjectMgr->LoadCreatureTemplateSparring();
2005
2006 TC_LOG_INFO("server.loading", "Loading Reputation Reward Rates...");
2007 sObjectMgr->LoadReputationRewardRate();
2008
2009 TC_LOG_INFO("server.loading", "Loading Creature Reputation OnKill Data...");
2010 sObjectMgr->LoadReputationOnKill();
2011
2012 TC_LOG_INFO("server.loading", "Loading Reputation Spillover Data...");
2013 sObjectMgr->LoadReputationSpilloverTemplate();
2014
2015 TC_LOG_INFO("server.loading", "Loading Points Of Interest Data...");
2016 sObjectMgr->LoadPointsOfInterest();
2017
2018 TC_LOG_INFO("server.loading", "Loading Creature Base Stats...");
2019 sObjectMgr->LoadCreatureClassLevelStats();
2020
2021 TC_LOG_INFO("server.loading", "Loading Spawn Group Templates...");
2022 sObjectMgr->LoadSpawnGroupTemplates();
2023
2024 TC_LOG_INFO("server.loading", "Loading Creature Data...");
2025 sObjectMgr->LoadCreatures();
2026
2027 TC_LOG_INFO("server.loading", "Loading Temporary Summon Data...");
2028 sObjectMgr->LoadTempSummons(); // must be after LoadCreatureTemplates() and LoadGameObjectTemplates()
2029
2030 TC_LOG_INFO("server.loading", "Loading pet levelup spells...");
2031 sSpellMgr->LoadPetLevelupSpellMap();
2032
2033 TC_LOG_INFO("server.loading", "Loading pet default spells additional to levelup spells...");
2034 sSpellMgr->LoadPetDefaultSpells();
2035
2036 TC_LOG_INFO("server.loading", "Loading Creature Addon Data...");
2037 sObjectMgr->LoadCreatureAddons(); // must be after LoadCreatureTemplates() and LoadCreatures()
2038
2039 TC_LOG_INFO("server.loading", "Loading Creature Movement Overrides...");
2040 sObjectMgr->LoadCreatureMovementOverrides(); // must be after LoadCreatures()
2041
2042 TC_LOG_INFO("server.loading", "Loading Gameobject Data...");
2043 sObjectMgr->LoadGameObjects();
2044
2045 TC_LOG_INFO("server.loading", "Loading Spawn Group Data...");
2046 sObjectMgr->LoadSpawnGroups();
2047
2048 TC_LOG_INFO("server.loading", "Loading instance spawn groups...");
2049 sObjectMgr->LoadInstanceSpawnGroups();
2050
2051 TC_LOG_INFO("server.loading", "Loading GameObject Addon Data...");
2052 sObjectMgr->LoadGameObjectAddons(); // must be after LoadGameObjects()
2053
2054 TC_LOG_INFO("server.loading", "Loading GameObject faction and flags overrides...");
2055 sObjectMgr->LoadGameObjectOverrides(); // must be after LoadGameObjects()
2056
2057 TC_LOG_INFO("server.loading", "Loading GameObject Quest Items...");
2058 sObjectMgr->LoadGameObjectQuestItems();
2059
2060 TC_LOG_INFO("server.loading", "Loading Creature Quest Items...");
2061 sObjectMgr->LoadCreatureQuestItems();
2062
2063 TC_LOG_INFO("server.loading", "Loading Creature Quest Currencies...");
2064 sObjectMgr->LoadCreatureQuestCurrencies();
2065
2066 TC_LOG_INFO("server.loading", "Loading Creature Linked Respawn...");
2067 sObjectMgr->LoadLinkedRespawn(); // must be after LoadCreatures(), LoadGameObjects()
2068
2069 TC_LOG_INFO("server.loading", "Loading Weather Data...");
2071
2072 TC_LOG_INFO("server.loading", "Loading Quests...");
2073 sObjectMgr->LoadQuests(); // must be loaded after DBCs, creature_template, items, gameobject tables
2074
2075 TC_LOG_INFO("server.loading", "Checking Quest Disables");
2076 DisableMgr::CheckQuestDisables(); // must be after loading quests
2077
2078 TC_LOG_INFO("server.loading", "Loading Quest POI");
2079 sObjectMgr->LoadQuestPOI();
2080
2081 TC_LOG_INFO("server.loading", "Loading Quests Starters and Enders...");
2082 sObjectMgr->LoadQuestStartersAndEnders(); // must be after quest load
2083
2084 TC_LOG_INFO("server.loading", "Loading Quest Greetings...");
2085 sObjectMgr->LoadQuestGreetings();
2086 sObjectMgr->LoadQuestGreetingLocales();
2087
2088 TC_LOG_INFO("server.loading", "Loading Objects Pooling Data...");
2089 sPoolMgr->LoadFromDB();
2090 TC_LOG_INFO("server.loading", "Loading Quest Pooling Data...");
2091 sQuestPoolMgr->LoadFromDB(); // must be after quest templates
2092
2093 TC_LOG_INFO("server.loading", "Loading Game Event Data..."); // must be after loading pools fully
2094 sGameEventMgr->LoadFromDB();
2095
2096 TC_LOG_INFO("server.loading", "Loading creature summoned data...");
2097 sObjectMgr->LoadCreatureSummonedData(); // must be after LoadCreatureTemplates() and LoadQuests()
2098
2099 TC_LOG_INFO("server.loading", "Loading UNIT_NPC_FLAG_SPELLCLICK Data..."); // must be after LoadQuests
2100 sObjectMgr->LoadNPCSpellClickSpells();
2101
2102 TC_LOG_INFO("server.loading", "Loading Vehicle Templates...");
2103 sObjectMgr->LoadVehicleTemplate(); // must be after LoadCreatureTemplates()
2104
2105 TC_LOG_INFO("server.loading", "Loading Vehicle Template Accessories...");
2106 sObjectMgr->LoadVehicleTemplateAccessories(); // must be after LoadCreatureTemplates() and LoadNPCSpellClickSpells()
2107
2108 TC_LOG_INFO("server.loading", "Loading Vehicle Accessories...");
2109 sObjectMgr->LoadVehicleAccessories(); // must be after LoadCreatureTemplates() and LoadNPCSpellClickSpells()
2110
2111 TC_LOG_INFO("server.loading", "Loading Vehicle Seat Addon Data...");
2112 sObjectMgr->LoadVehicleSeatAddon(); // must be after loading DBC
2113
2114 TC_LOG_INFO("server.loading", "Loading SpellArea Data..."); // must be after quest load
2115 sSpellMgr->LoadSpellAreas();
2116
2117 TC_LOG_INFO("server.loading", "Loading World locations...");
2118 sObjectMgr->LoadWorldSafeLocs(); // must be before LoadAreaTriggerTeleports and LoadGraveyardZones
2119
2120 TC_LOG_INFO("server.loading", "Loading Area Trigger Teleports definitions...");
2121 sObjectMgr->LoadAreaTriggerTeleports();
2122
2123 TC_LOG_INFO("server.loading", "Loading Access Requirements...");
2124 sObjectMgr->LoadAccessRequirements(); // must be after item template load
2125
2126 TC_LOG_INFO("server.loading", "Loading Quest Area Triggers...");
2127 sObjectMgr->LoadQuestAreaTriggers(); // must be after LoadQuests
2128
2129 TC_LOG_INFO("server.loading", "Loading Tavern Area Triggers...");
2130 sObjectMgr->LoadTavernAreaTriggers();
2131
2132 TC_LOG_INFO("server.loading", "Loading AreaTrigger script names...");
2133 sObjectMgr->LoadAreaTriggerScripts();
2134
2135 TC_LOG_INFO("server.loading", "Loading LFG entrance positions..."); // Must be after areatriggers
2136 sLFGMgr->LoadLFGDungeons();
2137
2138 TC_LOG_INFO("server.loading", "Loading LFG rewards...");
2139 sLFGMgr->LoadRewards();
2140
2141 TC_LOG_INFO("server.loading", "Loading Graveyard-zone links...");
2142 sObjectMgr->LoadGraveyardZones();
2143
2144 TC_LOG_INFO("server.loading", "Loading spell pet auras...");
2145 sSpellMgr->LoadSpellPetAuras();
2146
2147 TC_LOG_INFO("server.loading", "Loading Spell target coordinates...");
2148 sSpellMgr->LoadSpellTargetPositions();
2149
2150 TC_LOG_INFO("server.loading", "Loading linked spells...");
2151 sSpellMgr->LoadSpellLinked();
2152
2153 TC_LOG_INFO("server.loading", "Loading Scenes Templates..."); // must be before LoadPlayerInfo
2154 sObjectMgr->LoadSceneTemplates();
2155
2156 TC_LOG_INFO("server.loading", "Loading Player Create Data...");
2157 sObjectMgr->LoadPlayerInfo();
2158
2159 TC_LOG_INFO("server.loading", "Loading Exploration BaseXP Data...");
2160 sObjectMgr->LoadExplorationBaseXP();
2161
2162 TC_LOG_INFO("server.loading", "Loading Pet Name Parts...");
2163 sObjectMgr->LoadPetNames();
2164
2165 TC_LOG_INFO("server.loading", "Loading AreaTrigger Templates...");
2166 sAreaTriggerDataStore->LoadAreaTriggerTemplates();
2167
2168 TC_LOG_INFO("server.loading", "Loading AreaTrigger Spawns...");
2169 sAreaTriggerDataStore->LoadAreaTriggerSpawns();
2170
2171 TC_LOG_INFO("server.loading", "Loading Conversation Templates...");
2172 sConversationDataStore->LoadConversationTemplates();
2173
2174 TC_LOG_INFO("server.loading", "Loading Player Choices...");
2175 sObjectMgr->LoadPlayerChoices();
2176
2177 TC_LOG_INFO("server.loading", "Loading Player Choices Locales...");
2178 sObjectMgr->LoadPlayerChoicesLocale();
2179
2180 TC_LOG_INFO("server.loading", "Loading Jump Charge Params...");
2181 sObjectMgr->LoadJumpChargeParams();
2182
2184
2185 TC_LOG_INFO("server.loading", "Loading the max pet number...");
2186 sObjectMgr->LoadPetNumber();
2187
2188 TC_LOG_INFO("server.loading", "Loading pet level stats...");
2189 sObjectMgr->LoadPetLevelInfo();
2190
2191 TC_LOG_INFO("server.loading", "Loading Player level dependent mail rewards...");
2192 sObjectMgr->LoadMailLevelRewards();
2193
2194 // Loot tables
2196
2197 TC_LOG_INFO("server.loading", "Loading Skill Discovery Table...");
2199
2200 TC_LOG_INFO("server.loading", "Loading Skill Extra Item Table...");
2202
2203 TC_LOG_INFO("server.loading", "Loading Skill Perfection Data Table...");
2205
2206 TC_LOG_INFO("server.loading", "Loading Skill Fishing base level requirements...");
2207 sObjectMgr->LoadFishingBaseSkillLevel();
2208
2209 TC_LOG_INFO("server.loading", "Loading skill tier info...");
2210 sObjectMgr->LoadSkillTiers();
2211
2212 TC_LOG_INFO("server.loading", "Loading Criteria Modifier trees...");
2213 sCriteriaMgr->LoadCriteriaModifiersTree();
2214 TC_LOG_INFO("server.loading", "Loading Criteria Lists...");
2215 sCriteriaMgr->LoadCriteriaList();
2216 TC_LOG_INFO("server.loading", "Loading Criteria Data...");
2217 sCriteriaMgr->LoadCriteriaData();
2218 TC_LOG_INFO("server.loading", "Loading Achievements...");
2219 sAchievementMgr->LoadAchievementReferenceList();
2220 TC_LOG_INFO("server.loading", "Loading Achievements Scripts...");
2221 sAchievementMgr->LoadAchievementScripts();
2222 TC_LOG_INFO("server.loading", "Loading Achievement Rewards...");
2223 sAchievementMgr->LoadRewards();
2224 TC_LOG_INFO("server.loading", "Loading Achievement Reward Locales...");
2225 sAchievementMgr->LoadRewardLocales();
2226 TC_LOG_INFO("server.loading", "Loading Completed Achievements...");
2227 sAchievementMgr->LoadCompletedAchievements();
2228
2229 // Load before guilds and arena teams
2230 TC_LOG_INFO("server.loading", "Loading character cache store...");
2231 sCharacterCache->LoadCharacterCacheStorage();
2232
2234 TC_LOG_INFO("server.loading", "Loading Auctions...");
2235 sAuctionMgr->LoadAuctions();
2236
2238 {
2239 TC_LOG_INFO("server.loading", "Loading Black Market Templates...");
2240 sBlackMarketMgr->LoadTemplates();
2241
2242 TC_LOG_INFO("server.loading", "Loading Black Market Auctions...");
2243 sBlackMarketMgr->LoadAuctions();
2244 }
2245
2246 TC_LOG_INFO("server.loading", "Loading Guild rewards...");
2247 sGuildMgr->LoadGuildRewards();
2248
2249 TC_LOG_INFO("server.loading", "Loading Guilds...");
2250 sGuildMgr->LoadGuilds();
2251
2252 TC_LOG_INFO("server.loading", "Loading ArenaTeams...");
2253 sArenaTeamMgr->LoadArenaTeams();
2254
2255 TC_LOG_INFO("server.loading", "Loading Groups...");
2256 sGroupMgr->LoadGroups();
2257
2258 TC_LOG_INFO("server.loading", "Loading ReservedNames...");
2259 sObjectMgr->LoadReservedPlayersNames();
2260
2261 TC_LOG_INFO("server.loading", "Loading GameObjects for quests...");
2262 sObjectMgr->LoadGameObjectForQuests();
2263
2264 TC_LOG_INFO("server.loading", "Loading BattleMasters...");
2265 sBattlegroundMgr->LoadBattleMastersEntry(); // must be after load CreatureTemplate
2266
2267 TC_LOG_INFO("server.loading", "Loading GameTeleports...");
2268 sObjectMgr->LoadGameTele();
2269
2270 TC_LOG_INFO("server.loading", "Loading Trainers...");
2271 sObjectMgr->LoadTrainers(); // must be after load CreatureTemplate
2272
2273 TC_LOG_INFO("server.loading", "Loading Gossip menu...");
2274 sObjectMgr->LoadGossipMenu();
2275
2276 TC_LOG_INFO("server.loading", "Loading Gossip menu options...");
2277 sObjectMgr->LoadGossipMenuItems();
2278
2279 TC_LOG_INFO("server.loading", "Loading Gossip menu addon...");
2280 sObjectMgr->LoadGossipMenuAddon();
2281
2282 TC_LOG_INFO("server.loading", "Loading Creature Template Gossip...");
2283 sObjectMgr->LoadCreatureTemplateGossip();
2284
2285 TC_LOG_INFO("server.loading", "Loading Creature trainers...");
2286 sObjectMgr->LoadCreatureTrainers(); // must be after LoadGossipMenuItems
2287
2288 TC_LOG_INFO("server.loading", "Loading Vendors...");
2289 sObjectMgr->LoadVendors(); // must be after load CreatureTemplate and ItemTemplate
2290
2291 TC_LOG_INFO("server.loading", "Loading Waypoint paths...");
2292 sWaypointMgr->LoadPaths();
2293
2294 TC_LOG_INFO("server.loading", "Loading Creature Formations...");
2295 sFormationMgr->LoadCreatureFormations();
2296
2297 TC_LOG_INFO("server.loading", "Loading World State templates...");
2298 sWorldStateMgr->LoadFromDB(); // must be loaded before battleground, outdoor PvP and conditions
2299
2300 TC_LOG_INFO("server.loading", "Loading Persistend World Variables...");
2302
2305
2306 sObjectMgr->LoadPhases();
2307
2308 TC_LOG_INFO("server.loading", "Loading Conditions...");
2309 sConditionMgr->LoadConditions();
2310
2311 TC_LOG_INFO("server.loading", "Loading faction change achievement pairs...");
2312 sObjectMgr->LoadFactionChangeAchievements();
2313
2314 TC_LOG_INFO("server.loading", "Loading faction change spell pairs...");
2315 sObjectMgr->LoadFactionChangeSpells();
2316
2317 TC_LOG_INFO("server.loading", "Loading faction change quest pairs...");
2318 sObjectMgr->LoadFactionChangeQuests();
2319
2320 TC_LOG_INFO("server.loading", "Loading faction change item pairs...");
2321 sObjectMgr->LoadFactionChangeItems();
2322
2323 TC_LOG_INFO("server.loading", "Loading faction change reputation pairs...");
2324 sObjectMgr->LoadFactionChangeReputations();
2325
2326 TC_LOG_INFO("server.loading", "Loading faction change title pairs...");
2327 sObjectMgr->LoadFactionChangeTitles();
2328
2329 TC_LOG_INFO("server.loading", "Loading mount definitions...");
2331
2332 TC_LOG_INFO("server.loading", "Loading GM bugs...");
2333 sSupportMgr->LoadBugTickets();
2334
2335 TC_LOG_INFO("server.loading", "Loading GM complaints...");
2336 sSupportMgr->LoadComplaintTickets();
2337
2338 TC_LOG_INFO("server.loading", "Loading GM suggestions...");
2339 sSupportMgr->LoadSuggestionTickets();
2340
2341 /*TC_LOG_INFO("server.loading", "Loading GM surveys...");
2342 sSupportMgr->LoadSurveys();*/
2343
2344 TC_LOG_INFO("server.loading", "Loading garrison info...");
2345 sGarrisonMgr.Initialize();
2346
2348 TC_LOG_INFO("server.loading", "Returning old mails...");
2349 sObjectMgr->ReturnOrDeleteOldMails(false);
2350
2351 TC_LOG_INFO("server.loading", "Loading Autobroadcasts...");
2353
2355 sObjectMgr->LoadSpellScripts(); // must be after load Creature/Gameobject(Template/Data)
2356 sObjectMgr->LoadEventScripts(); // must be after load Creature/Gameobject(Template/Data)
2357
2358 TC_LOG_INFO("server.loading", "Loading spell script names...");
2359 sObjectMgr->LoadSpellScriptNames();
2360
2361 TC_LOG_INFO("server.loading", "Loading Creature Texts...");
2362 sCreatureTextMgr->LoadCreatureTexts();
2363
2364 TC_LOG_INFO("server.loading", "Loading Creature Text Locales...");
2365 sCreatureTextMgr->LoadCreatureTextLocales();
2366
2367 TC_LOG_INFO("server.loading", "Initializing Scripts...");
2368 sScriptMgr->Initialize();
2369 sScriptMgr->OnConfigLoad(false); // must be done after the ScriptMgr has been properly initialized
2370
2371 TC_LOG_INFO("server.loading", "Validating spell scripts...");
2372 sObjectMgr->ValidateSpellScripts();
2373
2374 TC_LOG_INFO("server.loading", "Loading SmartAI scripts...");
2375 sSmartScriptMgr->LoadSmartAIFromDB();
2376
2377 TC_LOG_INFO("server.loading", "Loading Calendar data...");
2378 sCalendarMgr->LoadFromDB();
2379
2380 TC_LOG_INFO("server.loading", "Loading Petitions...");
2381 sPetitionMgr->LoadPetitions();
2382
2383 TC_LOG_INFO("server.loading", "Loading Signatures...");
2384 sPetitionMgr->LoadSignatures();
2385
2386 TC_LOG_INFO("server.loading", "Loading Item loot...");
2387 sLootItemStorage->LoadStorageFromDB();
2388
2389 TC_LOG_INFO("server.loading", "Initialize query data...");
2390 sObjectMgr->InitializeQueriesData(QUERY_DATA_ALL);
2391
2392 TC_LOG_INFO("server.loading", "Initialize commands...");
2394
2396 TC_LOG_INFO("server.loading", "Initialize game time and timers");
2398
2399 LoginDatabase.PExecute("INSERT INTO uptime (realmid, starttime, uptime, revision) VALUES({}, {}, 0, '{}')",
2401
2405 //Update "uptime" table based on configuration entry in minutes.
2407 //erase corpses every 20 minutes
2409 // clean logs table every 14 days by default
2411 m_timers[WUPDATE_DELETECHARS].SetInterval(DAY*IN_MILLISECONDS); // check for chars to delete every day
2412
2413 // for AhBot
2415
2417
2419
2421
2423
2424 m_timers[WUPDATE_WHO_LIST].SetInterval(5 * IN_MILLISECONDS); // update who list cache every 5 seconds
2425
2427
2428 //to set mailtimer to return mails every day between 4 and 5 am
2429 //mailtimer is increased when updating auctions
2430 //one second is 1000 -(tested on win system)
2432 tm localTm;
2433 time_t gameTime = GameTime::GetGameTime();
2434 localtime_r(&gameTime, &localTm);
2435 uint8 CleanOldMailsTime = getIntConfig(CONFIG_CLEAN_OLD_MAIL_TIME);
2436 mail_timer = ((((localTm.tm_hour + (24 - CleanOldMailsTime)) % 24)* HOUR * IN_MILLISECONDS) / m_timers[WUPDATE_AUCTIONS].GetInterval());
2437 //1440
2439 TC_LOG_INFO("server.loading", "Mail timer set to: {}, mail return is called every {} minutes", uint64(mail_timer), uint64(mail_timer_expires));
2440
2442 TC_LOG_INFO("server.loading", "Starting Map System");
2443 sMapMgr->Initialize();
2444
2445 TC_LOG_INFO("server.loading", "Starting Game Event system...");
2446 uint32 nextGameEvent = sGameEventMgr->StartSystem();
2447 m_timers[WUPDATE_EVENTS].SetInterval(nextGameEvent); //depend on next event
2448
2449 // Delete all characters which have been deleted X days before
2451
2452 TC_LOG_INFO("server.loading", "Initialize AuctionHouseBot...");
2453 sAuctionBot->Initialize();
2454
2455 TC_LOG_INFO("server.loading", "Initializing chat channels...");
2457
2458 TC_LOG_INFO("server.loading", "Initializing Opcodes...");
2462
2463 TC_LOG_INFO("server.loading", "Starting Arena Season...");
2464 sGameEventMgr->StartArenaSeason();
2465
2466 sSupportMgr->Initialize();
2467
2469 TC_LOG_INFO("server.loading", "Starting Battleground System");
2470 sBattlegroundMgr->LoadBattlegroundTemplates();
2471
2473 TC_LOG_INFO("server.loading", "Starting Outdoor PvP System");
2474 sOutdoorPvPMgr->InitOutdoorPvP();
2475
2477 TC_LOG_INFO("server.loading", "Starting Battlefield System");
2478 sBattlefieldMgr->InitBattlefield();
2479
2481 TC_LOG_INFO("server.loading", "Loading Warden Checks...");
2482 sWardenCheckMgr->LoadWardenChecks();
2483
2484 TC_LOG_INFO("server.loading", "Loading Warden Action Overrides...");
2485 sWardenCheckMgr->LoadWardenOverrides();
2486
2487 TC_LOG_INFO("server.loading", "Deleting expired bans...");
2488 LoginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate <= UNIX_TIMESTAMP() AND unbandate<>bandate"); // One-time query
2489
2490 TC_LOG_INFO("server.loading", "Initializing quest reset times...");
2493
2494 TC_LOG_INFO("server.loading", "Calculate random battleground reset time...");
2496
2497 TC_LOG_INFO("server.loading", "Calculate deletion of old calendar events time...");
2499
2500 TC_LOG_INFO("server.loading", "Calculate guild limitation(s) reset time...");
2502
2503 TC_LOG_INFO("server.loading", "Calculate next currency reset time...");
2505
2506 TC_LOG_INFO("server.loading", "Loading race and class expansion requirements...");
2507 sObjectMgr->LoadRaceAndClassExpansionRequirements();
2508
2509 TC_LOG_INFO("server.loading", "Loading character templates...");
2510 sCharacterTemplateDataStore->LoadCharacterTemplates();
2511
2512 TC_LOG_INFO("server.loading", "Loading battle pets info...");
2514
2515 TC_LOG_INFO("server.loading", "Loading scenarios");
2516 sScenarioMgr->LoadDB2Data();
2517 sScenarioMgr->LoadDBData();
2518
2519 TC_LOG_INFO("server.loading", "Loading scenario poi data");
2520 sScenarioMgr->LoadScenarioPOI();
2521
2522 TC_LOG_INFO("server.loading", "Loading phase names...");
2523 sObjectMgr->LoadPhaseNames();
2524
2525 uint32 startupDuration = GetMSTimeDiffToNow(startupBegin);
2526
2527 TC_LOG_INFO("server.worldserver", "World initialized in {} minutes {} seconds", (startupDuration / 60000), ((startupDuration % 60000) / 1000));
2528
2529 TC_METRIC_EVENT("events", "World initialized", "World initialized in " + std::to_string(startupDuration / 60000) + " minutes " + std::to_string((startupDuration % 60000) / 1000) + " seconds");
2530}
2531
2533{
2534 sWorldStateMgr->SetValueAndSaveInDb(WS_WAR_MODE_HORDE_BUFF_VALUE, 10 + (team == TEAM_ALLIANCE ? reward : 0), false, nullptr);
2535 sWorldStateMgr->SetValueAndSaveInDb(WS_WAR_MODE_ALLIANCE_BUFF_VALUE, 10 + (team == TEAM_HORDE ? reward : 0), false, nullptr);
2536}
2537
2539{
2541}
2542
2544{
2545 uint32 oldMSTime = getMSTime();
2546
2547 m_Autobroadcasts.clear();
2548
2550 stmt->setInt32(0, realm.Id.Realm);
2551 PreparedQueryResult result = LoginDatabase.Query(stmt);
2552
2553 if (!result)
2554 {
2555 TC_LOG_INFO("server.loading", ">> Loaded 0 autobroadcasts definitions. DB table `autobroadcast` is empty for this realm!");
2556 return;
2557 }
2558
2559 do
2560 {
2561 Field* fields = result->Fetch();
2562 uint8 id = fields[0].GetUInt8();
2563
2564 m_Autobroadcasts[id] = { fields[2].GetString(), fields[1].GetUInt8() };
2565
2566 } while (result->NextRow());
2567
2568 TC_LOG_INFO("server.loading", ">> Loaded {} autobroadcast definitions in {} ms", m_Autobroadcasts.size(), GetMSTimeDiffToNow(oldMSTime));
2569}
2570
2573{
2574 TC_METRIC_TIMER("world_update_time_total");
2577 time_t currentGameTime = GameTime::GetGameTime();
2578
2580
2582 for (int i = 0; i < WUPDATE_COUNT; ++i)
2583 {
2584 if (m_timers[i].GetCurrent() >= 0)
2585 m_timers[i].Update(diff);
2586 else
2587 m_timers[i].SetCurrent(0);
2588 }
2589
2591 if (m_timers[WUPDATE_WHO_LIST].Passed())
2592 {
2593 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Update who list"));
2595 sWhoListStorageMgr->Update();
2596 }
2597
2598 if (IsStopped() || m_timers[WUPDATE_CHANNEL_SAVE].Passed())
2599 {
2601
2603 {
2604 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Save custom channels"));
2606 mgr1->SaveToDB();
2608 if (mgr1 != mgr2)
2609 mgr2->SaveToDB();
2610 }
2611 }
2612
2613 {
2614 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Check daily reset times"));
2616 }
2617
2618 if (currentGameTime > m_NextRandomBGReset)
2619 {
2620 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Reset random BG"));
2621 ResetRandomBG();
2622 }
2623
2624 if (currentGameTime > m_NextCalendarOldEventsDeletionTime)
2625 {
2626 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Delete old calendar events"));
2628 }
2629
2630 if (currentGameTime > m_NextGuildReset)
2631 {
2632 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Reset guild cap"));
2633 ResetGuildCap();
2634 }
2635
2636 if (currentGameTime > m_NextCurrencyReset)
2637 {
2638 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Reset currency weekly cap"));
2640 }
2641
2643 if (m_timers[WUPDATE_AUCTIONS].Passed())
2644 {
2645 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Update expired auctions"));
2647
2649 //(tested... works on win)
2651 {
2652 mail_timer = 0;
2653 sObjectMgr->ReturnOrDeleteOldMails(true);
2654 }
2655
2657 sAuctionMgr->Update();
2658 }
2659
2660 if (m_timers[WUPDATE_AUCTIONS_PENDING].Passed())
2661 {
2662 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Update pending auctions"));
2664
2665 sAuctionMgr->UpdatePendingAuctions();
2666 }
2667
2668 if (m_timers[WUPDATE_BLACKMARKET].Passed())
2669 {
2670 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Update pending black market auctions"));
2672
2674 if ((blackmarket_timer * m_timers[WUPDATE_BLACKMARKET].GetInterval() >=
2677 {
2678 sBlackMarketMgr->RefreshAuctions();
2679 blackmarket_timer = 1; // timer is 0 on startup
2680 }
2681 else
2682 {
2684 sBlackMarketMgr->Update();
2685 }
2686 }
2687
2689 if (m_timers[WUPDATE_AHBOT].Passed())
2690 {
2691 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Update AHBot"));
2692 sAuctionBot->Update();
2694 }
2695
2697 sScriptMgr->SyncScripts();
2698
2700 if (m_timers[WUPDATE_CHECK_FILECHANGES].Passed())
2701 {
2702 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Update HotSwap"));
2703 sScriptReloadMgr->Update();
2705 }
2706
2707 {
2709 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Update sessions"));
2710 UpdateSessions(diff);
2711 }
2712
2714 if (m_timers[WUPDATE_UPTIME].Passed())
2715 {
2716 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Update uptime"));
2717 uint32 tmpDiff = GameTime::GetUptime();
2718 uint32 maxOnlinePlayers = GetMaxPlayerCount();
2719
2721
2723
2724 stmt->setUInt32(0, tmpDiff);
2725 stmt->setUInt16(1, uint16(maxOnlinePlayers));
2726 stmt->setUInt32(2, realm.Id.Realm);
2728
2729 LoginDatabase.Execute(stmt);
2730 }
2731
2733 if (getIntConfig(CONFIG_LOGDB_CLEARTIME) > 0) // if not enabled, ignore the timer
2734 {
2735 if (m_timers[WUPDATE_CLEANDB].Passed())
2736 {
2737 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Clean logs table"));
2739
2741
2744 stmt->setUInt32(2, realm.Id.Realm);
2745
2746 LoginDatabase.Execute(stmt);
2747 }
2748 }
2749
2752 {
2753 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Update maps"));
2754 sMapMgr->Update(diff);
2755 }
2756
2757 {
2758 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Terrain data cleanup"));
2759 sTerrainMgr.Update(diff);
2760 }
2761
2763 {
2764 if (m_timers[WUPDATE_AUTOBROADCAST].Passed())
2765 {
2766 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Send autobroadcast"));
2769 }
2770 }
2771
2772 {
2773 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Update battlegrounds"));
2774 sBattlegroundMgr->Update(diff);
2775 }
2776
2777 {
2778 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Update outdoor pvp"));
2779 sOutdoorPvPMgr->Update(diff);
2780 }
2781
2782 {
2783 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Update battlefields"));
2784 sBattlefieldMgr->Update(diff);
2785 }
2786
2788 if (m_timers[WUPDATE_DELETECHARS].Passed())
2789 {
2790 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Delete old characters"));
2793 }
2794
2795 {
2796 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Update groups"));
2797 sGroupMgr->Update(diff);
2798 }
2799
2800 {
2801 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Update LFG"));
2802 sLFGMgr->Update(diff);
2803 }
2804
2805 {
2806 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Process query callbacks"));
2807 // execute callbacks from sql queries that were queued recently
2809 }
2810
2812 if (m_timers[WUPDATE_CORPSES].Passed())
2813 {
2814 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Remove old corpses"));
2816 sMapMgr->DoForAllMaps([](Map* map)
2817 {
2818 map->RemoveOldCorpses();
2819 });
2820 }
2821
2823 if (m_timers[WUPDATE_EVENTS].Passed())
2824 {
2825 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Update game events"));
2826 m_timers[WUPDATE_EVENTS].Reset(); // to give time for Update() to be processed
2827 uint32 nextGameEvent = sGameEventMgr->Update();
2828 m_timers[WUPDATE_EVENTS].SetInterval(nextGameEvent);
2830 }
2831
2833 if (m_timers[WUPDATE_PINGDB].Passed())
2834 {
2835 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Ping MySQL"));
2837 TC_LOG_DEBUG("misc", "Ping MySQL to keep connection alive");
2838 CharacterDatabase.KeepAlive();
2839 LoginDatabase.KeepAlive();
2840 WorldDatabase.KeepAlive();
2841 }
2842
2843 if (m_timers[WUPDATE_GUILDSAVE].Passed())
2844 {
2845 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Save guilds"));
2847 sGuildMgr->SaveGuilds();
2848 }
2849
2850 // Check for shutdown warning
2851 if (_guidWarn && !_guidAlert)
2852 {
2853 _warnDiff += diff;
2858 }
2859
2860 {
2861 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Process cli commands"));
2862 // And last, but not least handle the issued cli commands
2864 }
2865
2866 {
2867 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Update world scripts"));
2868 sScriptMgr->OnWorldUpdate(diff);
2869 }
2870
2871 {
2872 TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Update metrics"));
2873 // Stats logger update
2874 sMetric->Update();
2875 TC_METRIC_VALUE("update_time_diff", diff);
2876 }
2877}
2878
2880{
2881 m_timers[WUPDATE_EVENTS].Reset(); // to give time for Update() to be processed
2882 uint32 nextGameEvent = sGameEventMgr->Update();
2883 m_timers[WUPDATE_EVENTS].SetInterval(nextGameEvent);
2885}
2886
2889{
2890 SessionMap::const_iterator itr;
2891 for (itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
2892 {
2893 if (itr->second &&
2894 itr->second->GetPlayer() &&
2895 itr->second->GetPlayer()->IsInWorld() &&
2896 itr->second != self &&
2897 (!team || itr->second->GetPlayer()->GetTeam() == team))
2898 {
2899 itr->second->SendPacket(packet);
2900 }
2901 }
2902}
2903
2906{
2907 for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
2908 {
2909 // check if session and can receive global GM Messages and its not self
2910 WorldSession* session = itr->second;
2911 if (!session || session == self || !session->HasPermission(rbac::RBAC_PERM_RECEIVE_GLOBAL_GM_TEXTMESSAGE))
2912 continue;
2913
2914 // Player should be in world
2915 Player* player = session->GetPlayer();
2916 if (!player || !player->IsInWorld())
2917 continue;
2918
2919 // Send only to same team, if team is given
2920 if (!team || player->GetTeam() == team)
2921 session->SendPacket(packet);
2922 }
2923}
2924
2925namespace Trinity
2926{
2928 {
2930 {
2931 public:
2932 void operator()(Player const* receiver) const
2933 {
2934 for (std::unique_ptr<WorldPackets::Packet> const& packet : Packets)
2935 receiver->SendDirectMessage(packet->GetRawPacket());
2936 }
2937
2938 std::vector<std::unique_ptr<WorldPackets::Packet>> Packets;
2939 };
2940
2941 public:
2942 static size_t const BufferSize = 2048;
2943
2944 explicit WorldWorldTextBuilder(uint32 textId, va_list* args = nullptr) : i_textId(textId), i_args(args) { }
2945
2947 {
2948 char const* text = sObjectMgr->GetTrinityString(i_textId, locale);
2949
2950 char strBuffer[BufferSize];
2951 if (i_args)
2952 {
2953 // we need copy va_list before use or original va_list will corrupted
2954 va_list ap;
2955 va_copy(ap, *i_args);
2956 vsnprintf(strBuffer, BufferSize, text, ap);
2957 va_end(ap);
2958 }
2959 else
2960 {
2961 std::strncpy(strBuffer, text, BufferSize);
2962 strBuffer[BufferSize - 1] = '\0';
2963 }
2964
2966 do_helper(sender->Packets, strBuffer);
2967 return sender;
2968 }
2969
2970 private:
2971 void do_helper(std::vector<std::unique_ptr<WorldPackets::Packet>>& dataList, char* text)
2972 {
2973 while (char* line = ChatHandler::LineFromMessage(text))
2974 {
2976 packet->Initialize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line);
2977 packet->Write();
2978 dataList.emplace_back(packet);
2979 }
2980 }
2981
2983 va_list* i_args;
2984 };
2985} // namespace Trinity
2986
2988void World::SendWorldText(uint32 string_id, ...)
2989{
2990 va_list ap;
2991 va_start(ap, string_id);
2992
2993 Trinity::WorldWorldTextBuilder wt_builder(string_id, &ap);
2995 for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
2996 {
2997 if (!itr->second || !itr->second->GetPlayer() || !itr->second->GetPlayer()->IsInWorld())
2998 continue;
2999
3000 wt_do(itr->second->GetPlayer());
3001 }
3002
3003 va_end(ap);
3004}
3005
3007void World::SendGMText(uint32 string_id, ...)
3008{
3009 va_list ap;
3010 va_start(ap, string_id);
3011
3012 Trinity::WorldWorldTextBuilder wt_builder(string_id, &ap);
3014 for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
3015 {
3016 // Session should have permissions to receive global gm messages
3017 WorldSession* session = itr->second;
3019 continue;
3020
3021 // Player should be in world
3022 Player* player = session->GetPlayer();
3023 if (!player || !player->IsInWorld())
3024 continue;
3025
3026 wt_do(player);
3027 }
3028
3029 va_end(ap);
3030}
3031
3033void World::SendGlobalText(char const* text, WorldSession* self)
3034{
3035 // need copy to prevent corruption by strtok call in LineFromMessage original string
3036 char* buf = strdup(text);
3037 char* pos = buf;
3038
3039 while (char* line = ChatHandler::LineFromMessage(pos))
3040 {
3042 packet.Initialize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line);
3043 SendGlobalMessage(packet.Write(), self);
3044 }
3045
3046 free(buf);
3047}
3048
3051{
3052 bool foundPlayerToSend = false;
3053 SessionMap::const_iterator itr;
3054
3055 for (itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
3056 {
3057 if (itr->second &&
3058 itr->second->GetPlayer() &&
3059 itr->second->GetPlayer()->IsInWorld() &&
3060 itr->second->GetPlayer()->GetZoneId() == zone &&
3061 itr->second != self &&
3062 (!team || itr->second->GetPlayer()->GetTeam() == team))
3063 {
3064 itr->second->SendPacket(packet);
3065 foundPlayerToSend = true;
3066 }
3067 }
3068
3069 return foundPlayerToSend;
3070}
3071
3073void World::SendZoneText(uint32 zone, char const* text, WorldSession* self, Optional<Team> team)
3074{
3076 packet.Initialize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, text);
3077 SendZoneMessage(zone, packet.Write(), self, team);
3078}
3079
3082{
3083 m_QueuedPlayer.clear(); // prevent send queue update packet and login queued sessions
3084
3085 // session not removed at kick and will removed in next update tick
3086 for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
3087 itr->second->KickPlayer("World::KickAll");
3088}
3089
3092{
3093 // session not removed at kick and will removed in next update tick
3094 for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
3095 if (itr->second->GetSecurity() < sec)
3096 itr->second->KickPlayer("World::KickAllLess");
3097}
3098
3100BanReturn World::BanAccount(BanMode mode, std::string const& nameOrIP, std::string const& duration, std::string const& reason, std::string const& author)
3101{
3102 uint32 duration_secs = TimeStringToSecs(duration);
3103 return BanAccount(mode, nameOrIP, duration_secs, reason, author);
3104}
3105
3107BanReturn World::BanAccount(BanMode mode, std::string const& nameOrIP, uint32 duration_secs, std::string const& reason, std::string const& author)
3108{
3109 PreparedQueryResult resultAccounts = PreparedQueryResult(nullptr); //used for kicking
3110
3111 // Prevent banning an already banned account
3112 if (mode == BAN_ACCOUNT && AccountMgr::IsBannedAccount(nameOrIP))
3113 return BAN_EXISTS;
3114
3116 switch (mode)
3117 {
3118 case BAN_IP:
3119 {
3120 // No SQL injection with prepared statements
3122 stmt->setString(0, nameOrIP);
3123 resultAccounts = LoginDatabase.Query(stmt);
3124 stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_IP_BANNED);
3125 stmt->setString(0, nameOrIP);
3126 stmt->setUInt32(1, duration_secs);
3127 stmt->setString(2, author);
3128 stmt->setString(3, reason);
3129 LoginDatabase.Execute(stmt);
3130 break;
3131 }
3132 case BAN_ACCOUNT:
3133 {
3134 // No SQL injection with prepared statements
3136 stmt->setString(0, nameOrIP);
3137 resultAccounts = LoginDatabase.Query(stmt);
3138 break;
3139 }
3140 case BAN_CHARACTER:
3141 {
3142 // No SQL injection with prepared statements
3144 stmt->setString(0, nameOrIP);
3145 resultAccounts = CharacterDatabase.Query(stmt);
3146 break;
3147 }
3148 default:
3149 return BAN_SYNTAX_ERROR;
3150 }
3151
3152 if (!resultAccounts)
3153 {
3154 if (mode == BAN_IP)
3155 return BAN_SUCCESS; // ip correctly banned but nobody affected (yet)
3156 else
3157 return BAN_NOTFOUND; // Nobody to ban
3158 }
3159
3161 LoginDatabaseTransaction trans = LoginDatabase.BeginTransaction();
3162 do
3163 {
3164 Field* fieldsAccount = resultAccounts->Fetch();
3165 uint32 account = fieldsAccount[0].GetUInt32();
3166
3167 if (mode != BAN_IP)
3168 {
3169 // make sure there is only one active ban
3171 stmt->setUInt32(0, account);
3172 trans->Append(stmt);
3173 // No SQL injection with prepared statements
3174 stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_ACCOUNT_BANNED);
3175 stmt->setUInt32(0, account);
3176 stmt->setUInt32(1, duration_secs);
3177 stmt->setString(2, author);
3178 stmt->setString(3, reason);
3179 trans->Append(stmt);
3180 }
3181
3182 if (WorldSession* sess = FindSession(account))
3183 if (std::string(sess->GetPlayerName()) != author)
3184 sess->KickPlayer("World::BanAccount Banning account");
3185 } while (resultAccounts->NextRow());
3186
3187 LoginDatabase.CommitTransaction(trans);
3188
3189 return BAN_SUCCESS;
3190}
3191
3193bool World::RemoveBanAccount(BanMode mode, std::string const& nameOrIP)
3194{
3195 LoginDatabasePreparedStatement* stmt = nullptr;
3196 if (mode == BAN_IP)
3197 {
3198 stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_IP_NOT_BANNED);
3199 stmt->setString(0, nameOrIP);
3200 LoginDatabase.Execute(stmt);
3201 }
3202 else
3203 {
3204 uint32 account = 0;
3205 if (mode == BAN_ACCOUNT)
3206 account = AccountMgr::GetId(nameOrIP);
3207 else if (mode == BAN_CHARACTER)
3208 account = sCharacterCache->GetCharacterAccountIdByName(nameOrIP);
3209
3210 if (!account)
3211 return false;
3212
3213 //NO SQL injection as account is uint32
3214 stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_ACCOUNT_NOT_BANNED);
3215 stmt->setUInt32(0, account);
3216 LoginDatabase.Execute(stmt);
3217 }
3218 return true;
3219}
3220
3222BanReturn World::BanCharacter(std::string const& name, std::string const& duration, std::string const& reason, std::string const& author)
3223{
3225 ObjectGuid guid;
3226
3227 uint32 duration_secs = TimeStringToSecs(duration);
3228
3230 if (!banned)
3231 {
3232 guid = sCharacterCache->GetCharacterGuidByName(name);
3233 if (guid.IsEmpty())
3234 return BAN_NOTFOUND; // Nobody to ban
3235 }
3236 else
3237 guid = banned->GetGUID();
3238
3239 //Use transaction in order to ensure the order of the queries
3240 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
3241 // make sure there is only one active ban
3243 stmt->setUInt64(0, guid.GetCounter());
3244 trans->Append(stmt);
3245
3246 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_BAN);
3247 stmt->setUInt64(0, guid.GetCounter());
3248 stmt->setInt64(1, duration_secs);
3249 stmt->setString(2, author);
3250 stmt->setString(3, reason);
3251 trans->Append(stmt);
3252 CharacterDatabase.CommitTransaction(trans);
3253
3254 if (banned)
3255 banned->GetSession()->KickPlayer("World::BanCharacter Banning character");
3256
3257 return BAN_SUCCESS;
3258}
3259
3261bool World::RemoveBanCharacter(std::string const& name)
3262{
3264 ObjectGuid guid;
3265
3267 if (!banned)
3268 {
3269 guid = sCharacterCache->GetCharacterGuidByName(name);
3270 if (guid.IsEmpty())
3271 return false; // Nobody to ban
3272 }
3273 else
3274 guid = banned->GetGUID();
3275
3277 stmt->setUInt64(0, guid.GetCounter());
3278 CharacterDatabase.Execute(stmt);
3279 return true;
3280}
3281
3284{
3286 time_t lastGameTime = GameTime::GetGameTime();
3288
3289 uint32 elapsed = uint32(GameTime::GetGameTime() - lastGameTime);
3290
3292 if (!IsStopped() && m_ShutdownTimer > 0 && elapsed > 0)
3293 {
3295 if (m_ShutdownTimer <= elapsed)
3296 {
3298 m_stopEvent = true; // exist code already set
3299 else
3300 m_ShutdownTimer = 1; // minimum timer value to wait idle state
3301 }
3303 else
3304 {
3305 m_ShutdownTimer -= elapsed;
3306
3307 ShutdownMsg();
3308 }
3309 }
3310}
3311
3313void World::ShutdownServ(uint32 time, uint32 options, uint8 exitcode, const std::string& reason)
3314{
3315 // ignore if server shutdown at next tick
3316 if (IsStopped())
3317 return;
3318
3319 m_ShutdownMask = options;
3320 m_ExitCode = exitcode;
3321
3323 if (time == 0)
3324 m_ShutdownTimer = 1;
3326 else
3327 {
3328 m_ShutdownTimer = time;
3329 ShutdownMsg(true, nullptr, reason);
3330 }
3331
3332 sScriptMgr->OnShutdownInitiate(ShutdownExitCode(exitcode), ShutdownMask(options));
3333}
3334
3336void World::ShutdownMsg(bool show, Player* player, const std::string& reason)
3337{
3338 // not show messages for idle shutdown mode
3340 return;
3341
3343 if (show ||
3344 (m_ShutdownTimer < 5* MINUTE && (m_ShutdownTimer % 15) == 0) || // < 5 min; every 15 sec
3345 (m_ShutdownTimer < 15 * MINUTE && (m_ShutdownTimer % MINUTE) == 0) || // < 15 min ; every 1 min
3346 (m_ShutdownTimer < 30 * MINUTE && (m_ShutdownTimer % (5 * MINUTE)) == 0) || // < 30 min ; every 5 min
3347 (m_ShutdownTimer < 12 * HOUR && (m_ShutdownTimer % HOUR) == 0) || // < 12 h ; every 1 h
3348 (m_ShutdownTimer > 12 * HOUR && (m_ShutdownTimer % (12 * HOUR)) == 0)) // > 12 h ; every 12 h
3349 {
3351 if (!reason.empty())
3352 str += " - " + reason;
3353
3355
3356 SendServerMessage(msgid, str, player);
3357 TC_LOG_DEBUG("misc", "Server is {} in {}", (m_ShutdownMask & SHUTDOWN_MASK_RESTART ? "restart" : "shuttingdown"), str);
3358 }
3359}
3360
3363{
3364 // nothing cancel or too late
3366 return 0;
3367
3369
3370 uint32 oldTimer = m_ShutdownTimer;
3371 m_ShutdownMask = 0;
3372 m_ShutdownTimer = 0;
3373 m_ExitCode = SHUTDOWN_EXIT_CODE; // to default value
3374 SendServerMessage(msgid);
3375
3376 TC_LOG_DEBUG("misc", "Server {} cancelled.", (m_ShutdownMask & SHUTDOWN_MASK_RESTART ? "restart" : "shutdown"));
3377
3378 sScriptMgr->OnShutdownCancel();
3379 return oldTimer;
3380}
3381
3383void World::SendServerMessage(ServerMessageType messageID, std::string_view stringParam /*= {}*/, Player const* player /*= nullptr*/)
3384{
3385 ServerMessagesEntry const* serverMessage = sServerMessagesStore.LookupEntry(messageID);
3386 if (!serverMessage)
3387 return;
3388
3389 WorldPackets::Chat::ChatServerMessage chatServerMessage;
3390 chatServerMessage.MessageID = int32(messageID);
3391 if (strstr(serverMessage->Text[player ? player->GetSession()->GetSessionDbcLocale() : GetDefaultDbcLocale()], "%s"))
3392 chatServerMessage.StringParam = stringParam;
3393
3394 if (player)
3395 player->SendDirectMessage(chatServerMessage.Write());
3396 else
3397 SendGlobalMessage(chatServerMessage.Write());
3398}
3399
3401{
3402 std::pair<std::weak_ptr<WorldSocket>, uint64> linkInfo;
3403 while (_linkSocketQueue.next(linkInfo))
3404 ProcessLinkInstanceSocket(std::move(linkInfo));
3405
3406 {
3407 TC_METRIC_DETAILED_NO_THRESHOLD_TIMER("world_update_time",
3408 TC_METRIC_TAG("type", "Add sessions"),
3409 TC_METRIC_TAG("parent_type", "Update sessions"));
3411 WorldSession* sess = nullptr;
3412 while (addSessQueue.next(sess))
3413 AddSession_(sess);
3414 }
3415
3417 for (SessionMap::iterator itr = m_sessions.begin(), next; itr != m_sessions.end(); itr = next)
3418 {
3419 next = itr;
3420 ++next;
3421
3423 WorldSession* pSession = itr->second;
3424 WorldSessionFilter updater(pSession);
3425
3426 [[maybe_unused]] uint32 currentSessionId = itr->first;
3427 TC_METRIC_DETAILED_TIMER("world_update_sessions_time", TC_METRIC_TAG("account_id", std::to_string(currentSessionId)));
3428
3429 if (!pSession->Update(diff, updater)) // As interval = 0
3430 {
3431 if (!RemoveQueuedPlayer(itr->second) && itr->second && getIntConfig(CONFIG_INTERVAL_DISCONNECT_TOLERANCE))
3432 m_disconnects[itr->second->GetAccountId()] = GameTime::GetGameTime();
3433 RemoveQueuedPlayer(pSession);
3434 m_sessions.erase(itr);
3436 delete pSession;
3437 }
3438 }
3439}
3440
3441// This handles the issued and queued CLI commands
3443{
3444 CliCommandHolder::Print zprint = nullptr;
3445 void* callbackArg = nullptr;
3446 CliCommandHolder* command = nullptr;
3447 while (cliCmdQueue.next(command))
3448 {
3449 TC_LOG_INFO("misc", "CLI command under processing...");
3450 zprint = command->m_print;
3451 callbackArg = command->m_callbackArg;
3452 CliHandler handler(callbackArg, zprint);
3453 handler.ParseCommands(command->m_command);
3454 if (command->m_commandFinished)
3455 command->m_commandFinished(callbackArg, !handler.HasSentErrorMessage());
3456 delete command;
3457 }
3458}
3459
3461{
3462 if (m_Autobroadcasts.empty())
3463 return;
3464
3465 auto itr = Trinity::Containers::SelectRandomWeightedContainerElement(m_Autobroadcasts, [](AutobroadcastContainer::value_type const& pair)
3466 {
3467 return pair.second.Weight;
3468 });
3469
3471
3472 if (abcenter == 0)
3473 SendWorldText(LANG_AUTO_BROADCAST, itr->second.Message.c_str());
3474 else if (abcenter == 1)
3476 else if (abcenter == 2)
3477 {
3478 SendWorldText(LANG_AUTO_BROADCAST, itr->second.Message.c_str());
3480 }
3481
3482 TC_LOG_DEBUG("misc", "AutoBroadcast: '{}'", itr->second.Message);
3483}
3484
3486{
3488 stmt->setUInt32(0, accountId);
3489 _queryProcessor.AddCallback(CharacterDatabase.AsyncQuery(stmt).WithPreparedCallback([this](PreparedQueryResult result)
3490 {
3491 _UpdateRealmCharCount(std::move(result));
3492 }));
3493}
3494
3496{
3497 if (resultCharCount)
3498 {
3499 Field* fields = resultCharCount->Fetch();
3500 uint32 accountId = fields[0].GetUInt32();
3501 uint8 charCount = uint8(fields[1].GetUInt64());
3502
3503 LoginDatabaseTransaction trans = LoginDatabase.BeginTransaction();
3504
3506 stmt->setUInt8(0, charCount);
3507 stmt->setUInt32(1, accountId);
3508 stmt->setUInt32(2, realm.Id.Realm);
3509 trans->Append(stmt);
3510
3511 LoginDatabase.CommitTransaction(trans);
3512 }
3513}
3514
3516{
3520}
3521
3522static time_t GetNextDailyResetTime(time_t t)
3523{
3524 return GetLocalHourTimestamp(t, sWorld->getIntConfig(CONFIG_DAILY_QUEST_RESET_TIME_HOUR), true);
3525}
3526
3528{
3529 // reset all saved quest status
3531 CharacterDatabase.Execute(stmt);
3532
3534 stmt->setUInt32(0, 1);
3535 CharacterDatabase.Execute(stmt);
3536
3537 // reset all quest status in memory
3538 for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
3539 if (Player* player = itr->second->GetPlayer())
3540 player->DailyReset();
3541
3542 // reselect pools
3543 sQuestPoolMgr->ChangeDailyQuests();
3544
3545 // store next reset time
3546 time_t now = GameTime::GetGameTime();
3547 time_t next = GetNextDailyResetTime(now);
3548 ASSERT(now < next);
3549
3550 m_NextDailyQuestReset = next;
3552
3553 TC_LOG_INFO("misc", "Daily quests for all characters have been reset.");
3554}
3555
3556static time_t GetNextWeeklyResetTime(time_t t)
3557{
3558 t = GetNextDailyResetTime(t);
3559 tm time = TimeBreakdown(t);
3560 int wday = time.tm_wday;
3561 int target = sWorld->getIntConfig(CONFIG_WEEKLY_QUEST_RESET_TIME_WDAY);
3562 if (target < wday)
3563 wday -= 7;
3564 t += (DAY * (target - wday));
3565 return t;
3566}
3567
3569{
3570 // reset all saved quest status
3572 CharacterDatabase.Execute(stmt);
3573 // reset all quest status in memory
3574 for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
3575 if (Player* player = itr->second->GetPlayer())
3576 player->ResetWeeklyQuestStatus();
3577
3578 // reselect pools
3579 sQuestPoolMgr->ChangeWeeklyQuests();
3580
3581 // Update faction balance
3583
3584 // store next reset time
3585 time_t now = GameTime::GetGameTime();
3586 time_t next = GetNextWeeklyResetTime(now);
3587 ASSERT(now < next);
3588
3591
3592 TC_LOG_INFO("misc", "Weekly quests for all characters have been reset.");
3593}
3594
3595static time_t GetNextMonthlyResetTime(time_t t)
3596{
3597 t = GetNextDailyResetTime(t);
3598 tm time = TimeBreakdown(t);
3599 if (time.tm_mday == 1)
3600 return t;
3601
3602 time.tm_mday = 1;
3603 time.tm_mon += 1;
3604 return mktime(&time);
3605}
3606
3608{
3609 // reset all saved quest status
3611 CharacterDatabase.Execute(stmt);
3612 // reset all quest status in memory
3613 for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
3614 if (Player* player = itr->second->GetPlayer())
3615 player->ResetMonthlyQuestStatus();
3616
3617 // reselect pools
3618 sQuestPoolMgr->ChangeMonthlyQuests();
3619
3620 // store next reset time
3621 time_t now = GameTime::GetGameTime();
3622 time_t next = GetNextMonthlyResetTime(now);
3623 ASSERT(now < next);
3624
3627
3628 TC_LOG_INFO("misc", "Monthly quests for all characters have been reset.");
3629}
3630
3632{
3633 time_t const now = GameTime::GetGameTime();
3634 if (m_NextDailyQuestReset <= now)
3635 DailyReset();
3636 if (m_NextWeeklyQuestReset <= now)
3638 if (m_NextMonthlyQuestReset <= now)
3640}
3641
3643{
3645 if (!bgtime)
3646 m_NextRandomBGReset = GameTime::GetGameTime(); // game time not yet init
3647
3648 // generate time by config
3649 time_t curTime = GameTime::GetGameTime();
3650 tm localTm;
3651 localtime_r(&curTime, &localTm);
3652 localTm.tm_hour = getIntConfig(CONFIG_RANDOM_BG_RESET_HOUR);
3653 localTm.tm_min = 0;
3654 localTm.tm_sec = 0;
3655
3656 // current day reset time
3657 time_t nextDayResetTime = mktime(&localTm);
3658
3659 // next reset time before current moment
3660 if (curTime >= nextDayResetTime)
3661 nextDayResetTime += DAY;
3662
3663 // normalize reset time
3664 m_NextRandomBGReset = bgtime < curTime ? nextDayResetTime - DAY : nextDayResetTime;
3665
3666 if (!bgtime)
3668}
3669
3671{
3672 time_t now = GameTime::GetGameTime();
3675
3676 // If the reset time saved in the worldstate is before now it means the server was offline when the reset was supposed to occur.
3677 // In this case we set the reset time in the past and next world update will do the reset and schedule next one in the future.
3678 if (currentDeletionTime < now)
3679 m_NextCalendarOldEventsDeletionTime = nextDeletionTime - DAY;
3680 else
3681 m_NextCalendarOldEventsDeletionTime = nextDeletionTime;
3682
3683 if (!currentDeletionTime)
3685}
3686
3688{
3690 if (!gtime)
3691 m_NextGuildReset = GameTime::GetGameTime(); // game time not yet init
3692
3693 // generate time by config
3694 time_t curTime = GameTime::GetGameTime();
3695 tm localTm;
3696 localtime_r(&curTime, &localTm);
3697 localTm.tm_hour = getIntConfig(CONFIG_GUILD_RESET_HOUR);
3698 localTm.tm_min = 0;
3699 localTm.tm_sec = 0;
3700
3701 // current day reset time
3702 time_t nextDayResetTime = mktime(&localTm);
3703
3704 // next reset time before current moment
3705 if (curTime >= nextDayResetTime)
3706 nextDayResetTime += DAY;
3707
3708 // normalize reset time
3709 m_NextGuildReset = gtime < curTime ? nextDayResetTime - DAY : nextDayResetTime;
3710
3711 if (!gtime)
3713}
3714
3716{
3718 if (!currencytime)
3719 m_NextCurrencyReset = GameTime::GetGameTime(); // game time not yet init
3720
3721 // generate time by config
3722 time_t curTime = GameTime::GetGameTime();
3723 tm localTm;
3724 localtime_r(&curTime, &localTm);
3725
3726 localTm.tm_wday = getIntConfig(CONFIG_CURRENCY_RESET_DAY);
3727 localTm.tm_hour = getIntConfig(CONFIG_CURRENCY_RESET_HOUR);
3728 localTm.tm_min = 0;
3729 localTm.tm_sec = 0;
3730
3731 // current week reset time
3732 time_t nextWeekResetTime = mktime(&localTm);
3733
3734 // next reset time before current moment
3735 if (curTime >= nextWeekResetTime)
3736 nextWeekResetTime += getIntConfig(CONFIG_CURRENCY_RESET_INTERVAL) * DAY;
3737
3738 // normalize reset time
3739 m_NextCurrencyReset = currencytime < curTime ? nextWeekResetTime - getIntConfig(CONFIG_CURRENCY_RESET_INTERVAL) * DAY : nextWeekResetTime;
3740
3741 if (!currencytime)
3743}
3744
3746{
3747 CharacterDatabase.Execute("UPDATE `character_currency` SET `WeeklyQuantity` = 0");
3748
3749 for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
3750 if (itr->second->GetPlayer())
3751 itr->second->GetPlayer()->ResetCurrencyWeekCap();
3752
3755}
3756
3757void World::ResetEventSeasonalQuests(uint16 event_id, time_t eventStartTime)
3758{
3759 TC_LOG_INFO("misc", "Seasonal quests reset for all characters.");
3760
3762 stmt->setUInt16(0, event_id);
3763 stmt->setInt64(1, eventStartTime);
3764 CharacterDatabase.Execute(stmt);
3765
3766 for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
3767 if (itr->second->GetPlayer())
3768 itr->second->GetPlayer()->ResetSeasonalQuestStatus(event_id, eventStartTime);
3769}
3770
3772{
3773 TC_LOG_INFO("misc", "Random BG status reset for all characters.");
3774
3776 CharacterDatabase.Execute(stmt);
3777
3778 for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
3779 if (itr->second->GetPlayer())
3780 itr->second->GetPlayer()->SetRandomWinner(false);
3781
3784}
3785
3787{
3788 TC_LOG_INFO("misc", "Calendar deletion of old events.");
3789
3792 sCalendarMgr->DeleteOldEvents();
3793}
3794
3796{
3800 week = week < 7 ? week + 1 : 1;
3801
3802 TC_LOG_INFO("misc", "Guild Daily Cap reset. Week: {}", week == 1);
3804 sGuildMgr->ResetTimes(week == 1);
3805}
3806
3808{
3811}
3812
3814{
3815 if (QueryResult result = WorldDatabase.Query("SELECT db_version, cache_id FROM version LIMIT 1"))
3816 {
3817 Field* fields = result->Fetch();
3818
3819 m_DBVersion = fields[0].GetString();
3820 // will be overwrite by config values if different and non-0
3822 }
3823
3824 if (m_DBVersion.empty())
3825 m_DBVersion = "Unknown world database.";
3826}
3827
3829{
3830 SessionMap::const_iterator itr;
3831 for (itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
3832 if (itr->second && itr->second->GetPlayer() && itr->second->GetPlayer()->IsInWorld())
3833 {
3834 itr->second->GetPlayer()->UpdateAreaDependentAuras(itr->second->GetPlayer()->GetAreaId());
3835 itr->second->GetPlayer()->UpdateZoneDependentAuras(itr->second->GetPlayer()->GetZoneId());
3836 }
3837}
3838
3840{
3841 for (auto&& sessionForBnet : Trinity::Containers::MapEqualRange(m_sessionsByBnetGuid, battlenetAccountGuid))
3842 if (sessionForBnet.second->GetBattlePetMgr()->HasJournalLock())
3843 return true;
3844
3845 return false;
3846}
3847
3849{
3851}
3852
3854{
3856}
3857
3859{
3861 return *value;
3862
3863 return 0;
3864}
3865
3867{
3868 m_worldVariables[var.Id] = value;
3869
3871 stmt->setStringView(0, var.Id);
3872 stmt->setInt32(1, value);
3873 CharacterDatabase.Execute(stmt);
3874}
3875
3877{
3878 uint32 oldMSTime = getMSTime();
3879
3880 if (QueryResult result = CharacterDatabase.Query("SELECT ID, Value FROM world_variable"))
3881 {
3882 do
3883 {
3884 Field* fields = result->Fetch();
3885 m_worldVariables[fields[0].GetString()] = fields[1].GetInt32();
3886 } while (result->NextRow());
3887 }
3888
3889 TC_LOG_INFO("server.loading", ">> Loaded {} world variables in {} ms", m_worldVariables.size(), GetMSTimeDiffToNow(oldMSTime));
3890}
3891
3893{
3895}
3896
3898{
3899 // Passive reload, we mark the data as invalidated and next time a permission is checked it will be reloaded
3900 TC_LOG_INFO("rbac", "World::ReloadRBAC()");
3901 for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
3902 if (WorldSession* session = itr->second)
3903 session->InvalidateRBACData();
3904}
3905
3907{
3909}
3910
3912{
3913 std::array<int64, 2> warModeEnabledFaction = { };
3914
3915 // Search for characters that have war mode enabled and played during the last week
3919 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
3920 {
3921 do
3922 {
3923 Field* fields = result->Fetch();
3924 uint8 race = fields[0].GetUInt8();
3925 if (ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(race))
3926 {
3927 if (FactionTemplateEntry const* raceFaction = sFactionTemplateStore.AssertEntry(raceEntry->FactionID))
3928 {
3929 if (raceFaction->FactionGroup & FACTION_MASK_ALLIANCE)
3930 warModeEnabledFaction[TEAM_ALLIANCE] += fields[1].GetInt64();
3931 else if (raceFaction->FactionGroup & FACTION_MASK_HORDE)
3932 warModeEnabledFaction[TEAM_HORDE] += fields[1].GetInt64();
3933 }
3934 }
3935
3936 } while (result->NextRow());
3937 }
3938
3939 TeamId dominantFaction = TEAM_ALLIANCE;
3940 int32 outnumberedFactionReward = 0;
3941
3942 if (std::any_of(warModeEnabledFaction.begin(), warModeEnabledFaction.end(), [](int64 val) { return val != 0; }))
3943 {
3944 int64 dominantFactionCount = warModeEnabledFaction[TEAM_ALLIANCE];
3945 if (warModeEnabledFaction[TEAM_ALLIANCE] < warModeEnabledFaction[TEAM_HORDE])
3946 {
3947 dominantFactionCount = warModeEnabledFaction[TEAM_HORDE];
3948 dominantFaction = TEAM_HORDE;
3949 }
3950
3951 double total = warModeEnabledFaction[TEAM_ALLIANCE] + warModeEnabledFaction[TEAM_HORDE];
3952 double pct = dominantFactionCount / total;
3953
3955 outnumberedFactionReward = 20;
3957 outnumberedFactionReward = 10;
3959 outnumberedFactionReward = 5;
3960 }
3961
3962 sWorldStateMgr->SetValueAndSaveInDb(WS_WAR_MODE_HORDE_BUFF_VALUE, 10 + (dominantFaction == TEAM_ALLIANCE ? outnumberedFactionReward : 0), false, nullptr);
3963 sWorldStateMgr->SetValueAndSaveInDb(WS_WAR_MODE_ALLIANCE_BUFF_VALUE, 10 + (dominantFaction == TEAM_HORDE ? outnumberedFactionReward : 0), false, nullptr);
3964}
3965
3967
3969{
3970 return realm.Id.GetAddress();
3971}
3972
3973CliCommandHolder::CliCommandHolder(void* callbackArg, char const* command, Print zprint, CommandFinished commandFinished)
3974 : m_callbackArg(callbackArg), m_command(strdup(command)), m_print(zprint), m_commandFinished(commandFinished)
3975{
3976}
3977
3979{
3980 free(m_command);
3981}
#define sAccountMgr
Definition: AccountMgr.h:98
#define sAchievementMgr
#define sAreaTriggerDataStore
#define sArenaTeamMgr
Definition: ArenaTeamMgr.h:53
#define sAuctionBot
#define sAuctionMgr
#define sBattlefieldMgr
#define sBattlegroundMgr
@ ERROR_TIMED_OUT
#define sBlackMarketMgr
#define sCalendarMgr
Definition: CalendarMgr.h:370
#define sCharacterCache
@ CHAR_DEL_RESET_CHARACTER_QUESTSTATUS_MONTHLY
@ CHAR_INS_CHARACTER_BAN
@ CHAR_UPD_CHARACTER_BAN
@ CHAR_SEL_ACCOUNT_BY_NAME
@ CHAR_SEL_CHARACTER_COUNT
@ CHAR_DEL_RESET_CHARACTER_QUESTSTATUS_SEASONAL_BY_EVENT
@ CHAR_DEL_RESET_CHARACTER_QUESTSTATUS_DAILY
@ CHAR_REP_WORLD_VARIABLE
@ CHAR_DEL_BATTLEGROUND_RANDOM_ALL
@ CHAR_UPD_CHARACTER_GARRISON_FOLLOWER_ACTIVATIONS
@ CHAR_DEL_RESET_CHARACTER_QUESTSTATUS_WEEKLY
@ CHAR_SEL_WAR_MODE_TUNING
#define sCharacterTemplateDataStore
char const * localeNames[TOTAL_LOCALES]
Definition: Common.cpp:20
LocaleConstant
Definition: Common.h:48
@ LOCALE_none
Definition: Common.h:58
@ TOTAL_LOCALES
Definition: Common.h:62
@ LOCALE_enUS
Definition: Common.h:49
@ IN_MILLISECONDS
Definition: Common.h:35
@ MINUTE
Definition: Common.h:29
@ HOUR
Definition: Common.h:30
@ DAY
Definition: Common.h:31
AccountTypes
Definition: Common.h:39
@ SEC_PLAYER
Definition: Common.h:40
@ SEC_ADMINISTRATOR
Definition: Common.h:43
@ SEC_CONSOLE
Definition: Common.h:44
#define sConditionMgr
Definition: ConditionMgr.h:365
#define sConfigMgr
Definition: Config.h:61
#define sConversationDataStore
#define sFormationMgr
#define sCreatureTextMgr
#define sCriteriaMgr
DB2Storage< MapEntry > sMapStore("Map.db2", &MapLoadInfo::Instance)
DB2Storage< ServerMessagesEntry > sServerMessagesStore("ServerMessages.db2", &ServerMessagesLoadInfo::Instance)
DB2Storage< Cfg_CategoriesEntry > sCfgCategoriesStore("Cfg_Categories.db2", &CfgCategoriesLoadInfo::Instance)
DB2Storage< ChrRacesEntry > sChrRacesStore("ChrRaces.db2", &ChrRacesLoadInfo::Instance)
DB2Storage< FactionTemplateEntry > sFactionTemplateStore("FactionTemplate.db2", &FactionTemplateLoadInfo::Instance)
#define sDB2Manager
Definition: DB2Stores.h:538
@ DEFAULT_MAX_LEVEL
Definition: DBCEnums.h:47
@ MAX_LEVEL
Definition: DBCEnums.h:51
@ FACTION_MASK_ALLIANCE
Definition: DBCEnums.h:950
@ FACTION_MASK_HORDE
Definition: DBCEnums.h:951
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
SQLTransaction< LoginDatabaseConnection > LoginDatabaseTransaction
std::shared_ptr< ResultSet > QueryResult
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< LoginDatabaseConnection > LoginDatabase
Accessor to the realm/login database.
Definition: DatabaseEnv.cpp:22
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition: DatabaseEnv.cpp:21
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
Definition: DatabaseEnv.cpp:20
#define TC_GAME_API
Definition: Define.h:123
uint8_t uint8
Definition: Define.h:144
int64_t int64
Definition: Define.h:137
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint16_t uint16
Definition: Define.h:143
uint32_t uint32
Definition: Define.h:142
void dtCustomFree(void *ptr)
void * dtCustomAlloc(size_t size, dtAllocHint)
#define ASSERT_NOTNULL(pointer)
Definition: Errors.h:84
#define ASSERT
Definition: Errors.h:68
#define sGameEventMgr
Definition: GameEventMgr.h:177
bool LoadGameObjectModelList(std::string const &dataPath)
void LoadGameTables(std::string const &dataPath)
Definition: GameTables.cpp:103
#define sGarrisonMgr
Definition: GarrisonMgr.h:88
#define MIN_GRID_DELAY
Definition: GridDefines.h:45
#define MIN_MAP_UPDATE_DELAY
Definition: GridDefines.h:46
#define sGroupMgr
Definition: GroupMgr.h:61
#define sGuildMgr
Definition: GuildMgr.h:70
#define sIPLocation
Definition: IPLocation.h:51
#define sInstanceLockMgr
void LoadItemRandomBonusListTemplates()
#define sLFGMgr
Definition: LFGMgr.h:507
#define sLanguageMgr
Definition: LanguageMgr.h:97
@ LANG_AUTO_BROADCAST
Definition: Language.h:1214
#define TC_LOG_WARN(filterType__,...)
Definition: Log.h:162
#define TC_LOG_DEBUG(filterType__,...)
Definition: Log.h:156
#define TC_LOG_ERROR(filterType__,...)
Definition: Log.h:165
#define sLog
Definition: Log.h:130
#define TC_LOG_INFO(filterType__,...)
Definition: Log.h:159
#define TC_LOG_FATAL(filterType__,...)
Definition: Log.h:168
@ LOGIN_INS_ACCOUNT_BANNED
Definition: LoginDatabase.h:53
@ LOGIN_SEL_ACCOUNT_BY_IP
Definition: LoginDatabase.h:47
@ LOGIN_UPD_UPTIME_PLAYERS
Definition: LoginDatabase.h:72
@ LOGIN_DEL_IP_NOT_BANNED
Definition: LoginDatabase.h:49
@ LOGIN_REP_REALM_CHARACTERS
Definition: LoginDatabase.h:56
@ LOGIN_INS_IP_BANNED
Definition: LoginDatabase.h:48
@ LOGIN_SEL_REALMLIST_SECURITY_LEVEL
Definition: LoginDatabase.h:89
@ LOGIN_UPD_ACCOUNT_NOT_BANNED
Definition: LoginDatabase.h:54
@ LOGIN_SEL_AUTOBROADCAST
Definition: LoginDatabase.h:91
@ LOGIN_SEL_ACCOUNT_ID_BY_NAME
Definition: LoginDatabase.h:43
@ LOGIN_DEL_OLD_LOGS
Definition: LoginDatabase.h:73
#define sLootItemStorage
void LoadLootTables()
Definition: LootMgr.cpp:1337
TC_GAME_API void LoadM2Cameras(std::string const &dataPath)
Definition: M2Stores.cpp:174
#define sMapMgr
Definition: MapManager.h:184
#define TC_METRIC_DETAILED_TIMER(category,...)
Definition: Metric.h:241
#define sMetric
Definition: Metric.h:149
#define TC_METRIC_VALUE(category, value,...)
Definition: Metric.h:214
#define TC_METRIC_EVENT(category, title, description)
Definition: Metric.h:206
#define TC_METRIC_TAG(name, value)
Definition: Metric.h:180
#define TC_METRIC_DETAILED_NO_THRESHOLD_TIMER(category,...)
Definition: Metric.h:242
#define TC_METRIC_TIMER(category,...)
Definition: Metric.h:223
#define DEFAULT_VISIBILITY_NOTIFY_PERIOD
Definition: NGrid.h:28
#define MAX_VISIBILITY_DISTANCE
Definition: ObjectDefines.h:28
#define DEFAULT_VISIBILITY_DISTANCE
Definition: ObjectDefines.h:35
#define DEFAULT_VISIBILITY_BGARENAS
Definition: ObjectDefines.h:37
#define DEFAULT_VISIBILITY_INSTANCE
Definition: ObjectDefines.h:36
#define MAX_PLAYER_NAME
Definition: ObjectMgr.h:980
#define MAX_CHARTER_NAME
Definition: ObjectMgr.h:983
@ QUERY_DATA_ALL
Definition: ObjectMgr.h:1048
#define sObjectMgr
Definition: ObjectMgr.h:1946
#define MAX_PET_NAME
Definition: ObjectMgr.h:982
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:25
#define sOutdoorPvPMgr
#define sPetitionMgr
Definition: PetitionMgr.h:87
uint64 const MAX_MONEY_AMOUNT
Definition: Player.cpp:158
@ PLAYER_FLAGS_WAR_MODE_DESIRED
Definition: Player.h:439
#define sPoolMgr
Definition: PoolMgr.h:179
#define sQuestPoolMgr
Definition: QuestPools.h:63
constexpr uint32 HARDCODED_DEVELOPMENT_REALM_CATEGORY_ID
Definition: Realm.h:77
@ REALM_TYPE_FFA_PVP
Definition: Realm.h:73
@ REALM_TYPE_RPPVP
Definition: Realm.h:69
@ REALM_TYPE_PVP
Definition: Realm.h:66
#define sScenarioMgr
Definition: ScenarioMgr.h:125
#define sScriptMgr
Definition: ScriptMgr.h:1418
#define sScriptReloadMgr
#define CURRENT_EXPANSION
@ LANG_UNIVERSAL
BanReturn
Ban function return codes.
@ BAN_EXISTS
@ BAN_SYNTAX_ERROR
@ BAN_NOTFOUND
@ BAN_SUCCESS
TeamId
@ TEAM_ALLIANCE
@ TEAM_HORDE
#define MAX_CHARACTERS_PER_REALM
Definition: SharedDefines.h:85
@ ALLIANCE
@ HORDE
@ GUILD_BANKLOG_MAX_RECORDS
@ GUILD_EVENTLOG_MAX_RECORDS
@ GUILD_NEWSLOG_MAX_RECORDS
@ CHAT_MSG_SYSTEM
@ WS_WAR_MODE_HORDE_BUFF_VALUE
@ WS_WAR_MODE_ALLIANCE_BUFF_VALUE
@ WS_PREVIOUS_PVP_SEASON_ID
@ WS_CURRENT_PVP_SEASON_ID
BanMode
Ban function modes.
@ BAN_ACCOUNT
@ BAN_IP
@ BAN_CHARACTER
void LoadSkillDiscoveryTable()
void LoadSkillPerfectItemTable()
void LoadSkillExtraItemTable()
#define sSmartScriptMgr
#define sSpellMgr
Definition: SpellMgr.h:849
#define sSupportMgr
Definition: SupportMgr.h:310
#define sTerrainMgr
Definition: TerrainMgr.h:165
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition: Timer.h:57
uint32 getMSTime()
Definition: Timer.h:33
#define sTransportMgr
Definition: TransportMgr.h:183
#define MAX_MOVE_TYPE
Definition: UnitDefines.h:128
float baseMoveSpeed[MAX_MOVE_TYPE]
Definition: Unit.cpp:97
float playerBaseMoveSpeed[MAX_MOVE_TYPE]
Definition: Unit.cpp:110
WorldUpdateTime sWorldUpdateTime
Definition: UpdateTime.cpp:21
time_t GetLocalHourTimestamp(time_t time, uint8 hour, bool onlyAfterTime)
Definition: Util.cpp:100
tm TimeBreakdown(time_t time)
Definition: Util.cpp:93
std::string secsToTimeString(uint64 timeInSecs, TimeFormat timeFormat, bool hoursOnly)
Definition: Util.cpp:115
uint32 TimeStringToSecs(std::string const &timestring)
Definition: Util.cpp:258
#define sWardenCheckMgr
#define sWaypointMgr
#define sWhoListStorageMgr
#define sWorldStateMgr
Definition: WorldStateMgr.h:50
static time_t GetNextDailyResetTime(time_t t)
Definition: World.cpp:3522
static time_t GetNextWeeklyResetTime(time_t t)
Definition: World.cpp:3556
static time_t GetNextMonthlyResetTime(time_t t)
Definition: World.cpp:3595
static bool IsBannedAccount(std::string const &name)
Definition: AccountMgr.cpp:419
static uint32 GetId(std::string_view username)
Definition: AccountMgr.cpp:289
static void LoadFromDB()
Definition: ChannelMgr.cpp:40
static ChannelMgr * ForTeam(uint32 team)
Definition: ChannelMgr.cpp:114
void SaveToDB()
Definition: ChannelMgr.cpp:154
bool HasSentErrorMessage() const
Definition: Chat.h:113
static char * LineFromMessage(char *&pos)
Definition: Chat.cpp:41
bool ParseCommands(std::string_view str) override
Definition: Chat.cpp:623
static void LoadMountDefinitions()
static uint32 GetLiquidFlags(uint32 liquidType)
Definition: DB2Stores.cpp:2615
Class used to access individual fields of database query result.
Definition: Field.h:90
uint8 GetUInt8() const
Definition: Field.cpp:30
std::string GetString() const
Definition: Field.cpp:118
int64 GetInt64() const
Definition: Field.cpp:86
uint32 GetUInt32() const
Definition: Field.cpp:62
int32 GetInt32() const
Definition: Field.cpp:70
void add(const T &item)
Adds an item to the queue.
Definition: LockedQueue.h:50
bool next(T &result)
Gets the next result in the queue, if any.
Definition: LockedQueue.h:68
static MMapManager * createOrGetMMapManager()
Definition: MMapFactory.cpp:26
static void clear()
Definition: MMapFactory.cpp:34
void InitializeThreadUnsafe(std::unordered_map< uint32, std::vector< uint32 > > const &mapData)
Definition: MMapManager.cpp:38
Definition: Map.h:189
void RemoveOldCorpses()
Definition: Map.cpp:3839
LowType GetCounter() const
Definition: ObjectGuid.h:293
bool IsEmpty() const
Definition: ObjectGuid.h:319
bool IsInWorld() const
Definition: Object.h:154
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
void Initialize()
Correspondence between opcodes and their names.
Definition: Opcodes.cpp:134
static void InitializeTables()
Definition: PlayerDump.cpp:284
static void DeleteOldCharacters()
Definition: Player.cpp:4310
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:6324
WorldSession * GetSession() const
Definition: Player.h:2101
Team GetTeam() const
Definition: Player.h:2235
void setInt32(const uint8 index, const int32 value)
void setStringView(const uint8 index, const std::string_view value)
void setUInt8(const uint8 index, const uint8 value)
void setInt64(const uint8 index, const int64 value)
void setUInt32(const uint8 index, const uint32 value)
void setUInt16(const uint8 index, const uint16 value)
void setString(const uint8 index, const std::string &value)
void setUInt64(const uint8 index, const uint64 value)
static bool ExistMapAndVMap(uint32 mapid, float x, float y)
Definition: TerrainMgr.cpp:859
void operator()(Player const *receiver) const
Definition: World.cpp:2932
std::vector< std::unique_ptr< WorldPackets::Packet > > Packets
Definition: World.cpp:2938
void do_helper(std::vector< std::unique_ptr< WorldPackets::Packet > > &dataList, char *text)
Definition: World.cpp:2971
static size_t const BufferSize
Definition: World.cpp:2942
WorldWorldTextBuilder(uint32 textId, va_list *args=nullptr)
Definition: World.cpp:2944
MultiplePacketSender * operator()(LocaleConstant locale)
Definition: World.cpp:2946
void UpdateWithDiff(uint32 diff)
Definition: UpdateTime.cpp:33
void setEnableLineOfSightCalc(bool pVal)
Definition: IVMapManager.h:106
void setEnableHeightCalc(bool pVal)
Definition: IVMapManager.h:111
static VMapManager2 * createOrGetVMapManager()
Definition: VMapFactory.cpp:27
static void clear()
Definition: VMapFactory.cpp:36
IsVMAPDisabledForFn IsVMAPDisabledForPtr
Definition: VMapManager2.h:126
void InitializeThreadUnsafe(std::unordered_map< uint32, std::vector< uint32 > > const &mapData)
GetLiquidFlagsFn GetLiquidFlagsPtr
Definition: VMapManager2.h:123
uint32 GetZoneId() const
Definition: Object.h:545
WorldPacket const * Write() override
void Initialize(ChatMsg chatType, Language language, WorldObject const *sender, WorldObject const *receiver, std::string_view message, uint32 achievementId=0, std::string_view channelName="", LocaleConstant locale=DEFAULT_LOCALE, std::string_view addonPrefix="")
WorldPacket const * Write() override
WorldPacket const * Write() override
Player session in the World.
Definition: WorldSession.h:963
bool Update(uint32 diff, PacketFilter &updater)
Update the WorldSession (triggered by World update)
ObjectGuid GetBattlenetAccountGUID() const
void SendAuthResponse(uint32 code, bool queued, uint32 queuePos=0)
Definition: AuthHandler.cpp:32
uint64 GetConnectToInstanceKey() const
void AddInstanceConnection(std::shared_ptr< WorldSocket > sock)
Definition: WorldSession.h:978
LocaleConstant GetSessionDbcLocale() const
void KickPlayer(std::string const &reason)
Kick a player out of the World.
Player * GetPlayer() const
void SetInQueue(bool state)
Session in auth.queue currently.
bool HasPermission(uint32 permissionId)
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
uint32 GetAccountId() const
void HandleContinuePlayerLogin()
void ResetTimeOutTime(bool onlyActive)
void InitializeSession()
The World.
Definition: World.h:563
time_t m_NextWeeklyQuestReset
Definition: World.h:876
static PersistentWorldVariable const NextGuildDailyResetTimeVarId
Definition: World.h:729
uint32 ShutdownCancel()
Cancel a planned server shutdown.
Definition: World.cpp:3362
bool SendZoneMessage(uint32 zone, WorldPacket const *packet, WorldSession *self=nullptr, Optional< Team > team={ })
Send a packet to all players (or players selected team) in the zone (except self if mentioned)
Definition: World.cpp:3050
bool RemoveBanCharacter(std::string const &name)
Remove a ban from a character.
Definition: World.cpp:3261
void UpdateSessions(uint32 diff)
Definition: World.cpp:3400
void InitCurrencyResetTime()
Definition: World.cpp:3715
uint32 getIntConfig(WorldIntConfigs index) const
Get a server configuration element (see #WorldConfigs)
Definition: World.h:715
LocaleConstant m_defaultDbcLocale
Definition: World.h:854
static int32 m_visibility_notify_periodInBG
Definition: World.h:868
static uint8 m_ExitCode
Definition: World.h:822
SessionMap m_sessions
Definition: World.h:835
uint32 m_int_configs[INT_CONFIG_VALUE_COUNT]
Definition: World.h:847
bool RemoveBanAccount(BanMode mode, std::string const &nameOrIP)
Remove a ban from an account or IP address.
Definition: World.cpp:3193
static int32 m_visibility_notify_periodInInstances
Definition: World.h:867
static std::atomic< uint32 > m_worldLoopCounter
Definition: World.h:567
void AddSession_(WorldSession *s)
Definition: World.cpp:370
void SetForcedWarModeFactionBalanceState(TeamId team, int32 reward=0)
Definition: World.cpp:2532
float m_float_configs[FLOAT_CONFIG_VALUE_COUNT]
Definition: World.h:850
static PersistentWorldVariable const NextOldCalendarEventDeletionTimeVarId
Definition: World.h:732
AccountTypes m_allowedSecurityLevel
Definition: World.h:853
time_t blackmarket_timer
Definition: World.h:833
void LoadConfigSettings(bool reload=false)
Initialize config values.
Definition: World.cpp:555
void _UpdateGameTime()
Update the game time.
Definition: World.cpp:3283
static std::atomic< bool > m_stopEvent
Definition: World.h:821
std::string m_dataPath
Definition: World.h:858
float rate_values[MAX_RATES]
Definition: World.h:846
void KickAllLess(AccountTypes sec)
Kick (and save) all players with security level less sec
Definition: World.cpp:3091
static PersistentWorldVariable const NextMonthlyQuestResetTimeVarId
Definition: World.h:730
void SetMotd(std::string motd)
Set a new Message of the Day.
Definition: World.cpp:265
bool IsPvPRealm() const
Are we on a "Player versus Player" server?
Definition: World.cpp:3848
void SetNewCharString(std::string const &str)
Set the string for new characters (first login)
Definition: World.h:630
LockedQueue< WorldSession * > addSessQueue
Definition: World.h:888
static float m_MaxVisibleDistanceInArenas
Definition: World.h:864
void SendServerMessage(ServerMessageType messageID, std::string_view stringParam={}, Player const *player=nullptr)
Send a server message to the user(s)
Definition: World.cpp:3383
void SetPersistentWorldVariable(PersistentWorldVariable const &var, int32 value)
Definition: World.cpp:3866
static float m_MaxVisibleDistanceInBG
Definition: World.h:863
QueryCallbackProcessor _queryProcessor
Definition: World.h:909
bool m_bool_configs[BOOL_CONFIG_VALUE_COUNT]
Definition: World.h:849
void UpdateRealmCharCount(uint32 accountId)
Definition: World.cpp:3485
Queue m_QueuedPlayer
Definition: World.h:884
void LoadDBAllowedSecurityLevel()
Definition: World.cpp:246
static PersistentWorldVariable const CharacterDatabaseCleaningFlagsVarId
Definition: World.h:728
std::mutex _guidAlertLock
Definition: World.h:914
void LoadDBVersion()
Definition: World.cpp:3813
bool HasRecentlyDisconnected(WorldSession *)
Definition: World.cpp:462
uint64 m_int64_configs[INT64_CONFIT_VALUE_COUNT]
Definition: World.h:848
void AddQueuedPlayer(WorldSession *)
Definition: World.cpp:495
void ResetCurrencyWeekCap()
Definition: World.cpp:3745
uint32 GetQueuedSessionCount() const
Definition: World.h:579
static PersistentWorldVariable const NextCurrencyResetTimeVarId
Definition: World.h:725
void UpdateMaxSessionCounters()
Get the number of current active sessions.
Definition: World.cpp:3807
uint32 m_CleaningFlags
Definition: World.h:826
static PersistentWorldVariable const NextDailyQuestResetTimeVarId
Definition: World.h:731
uint32 m_maxActiveSessionCount
Definition: World.h:839
void SetInitialWorldSettings()
Initialize the World.
Definition: World.cpp:1733
void ResetMonthlyQuests()
Definition: World.cpp:3607
time_t m_NextDailyQuestReset
Definition: World.h:875
void InitCalendarOldEventsDeletionTime()
Definition: World.cpp:3670
uint32 m_PlayerCount
Definition: World.h:841
void DoGuidAlertRestart()
Definition: World.cpp:317
time_t _warnShutdownTime
Definition: World.h:919
void TriggerGuidAlert()
Definition: World.cpp:298
bool IsFFAPvPRealm() const
Definition: World.cpp:3853
time_t m_NextCurrencyReset
Definition: World.h:881
void ResetGuildCap()
Definition: World.cpp:3795
bool RemoveSession(uint32 id)
Remove a given session.
Definition: World.cpp:344
time_t m_NextRandomBGReset
Definition: World.h:878
Player * FindPlayerInZone(uint32 zone)
Find a player in a specified zone.
Definition: World.cpp:214
BanReturn BanCharacter(std::string const &name, std::string const &duration, std::string const &reason, std::string const &author)
Ban an account or ban an IP address, duration will be parsed using TimeStringToSecs if it is positive...
Definition: World.cpp:3222
int32 GetPersistentWorldVariable(PersistentWorldVariable const &var) const
Definition: World.cpp:3858
void TriggerGuidWarning()
Definition: World.cpp:279
float getRate(Rates rate) const
Get a server rate (see Rates)
Definition: World.h:679
void SendGMText(uint32 string_id,...)
Send a System Message to all GMs (except self if mentioned)
Definition: World.cpp:3007
void ShutdownMsg(bool show=false, Player *player=nullptr, const std::string &reason=std::string())
Display a shutdown message to the user(s)
Definition: World.cpp:3336
static PersistentWorldVariable const NextGuildWeeklyResetTimeVarId
Definition: World.h:733
void InitGuildResetTime()
Definition: World.cpp:3687
std::string m_DBVersion
Definition: World.h:894
BanReturn BanAccount(BanMode mode, std::string const &nameOrIP, std::string const &duration, std::string const &reason, std::string const &author)
Ban an account or ban an IP address, duration will be parsed using TimeStringToSecs if it is positive...
Definition: World.cpp:3100
time_t mail_timer_expires
Definition: World.h:832
void InitRandomBGResetTime()
Definition: World.cpp:3642
std::vector< std::string > const & GetMotd() const
Get the current Message of the Day.
Definition: World.cpp:274
~World()
World destructor.
Definition: World.cpp:187
std::unordered_multimap< ObjectGuid, WorldSession * > m_sessionsByBnetGuid
Definition: World.h:836
bool getBoolConfig(WorldBoolConfigs index) const
Get a server configuration element (see #WorldConfigs)
Definition: World.h:689
static PersistentWorldVariable const NextBGRandomDailyResetTimeVarId
Definition: World.h:727
void ResetWeeklyQuests()
Definition: World.cpp:3568
void _UpdateRealmCharCount(PreparedQueryResult resultCharCount)
Definition: World.cpp:3495
uint32 GetActiveSessionCount() const
Definition: World.h:578
DisconnectMap m_disconnects
Definition: World.h:838
time_t m_NextCalendarOldEventsDeletionTime
Definition: World.h:879
void ReloadRBAC()
Definition: World.cpp:3897
uint32 m_availableDbcLocaleMask
Definition: World.h:855
void DailyReset()
Definition: World.cpp:3527
void UpdateWarModeRewardValues()
Definition: World.cpp:3911
time_t mail_timer
Definition: World.h:831
std::string _guidWarningMsg
Definition: World.h:911
void ResetRandomBG()
Definition: World.cpp:3771
void SendZoneText(uint32 zone, const char *text, WorldSession *self=nullptr, Optional< Team > team={ })
Send a System Message to all players in the zone (except self if mentioned)
Definition: World.cpp:3073
uint32 m_ShutdownMask
Definition: World.h:824
void ResetEventSeasonalQuests(uint16 event_id, time_t eventStartTime)
Definition: World.cpp:3757
time_t m_NextGuildReset
Definition: World.h:880
void SetPlayerSecurityLimit(AccountTypes sec)
Definition: World.cpp:256
AutobroadcastContainer m_Autobroadcasts
Definition: World.h:902
bool IsClosed() const
Deny clients?
Definition: World.cpp:233
uint32 m_ShutdownTimer
Definition: World.h:823
static int32 m_visibility_notify_periodInArenas
Definition: World.h:869
void KickAll()
Kick (and save) all players.
Definition: World.cpp:3081
uint32 GetPlayerAmountLimit() const
Definition: World.h:609
void SendGuidWarning()
Definition: World.cpp:325
void AddSession(WorldSession *s)
Definition: World.cpp:360
void CheckScheduledResetTimes()
Definition: World.cpp:3631
std::string _alertRestartReason
Definition: World.h:912
void ForceGameEventUpdate()
Definition: World.cpp:2879
static PersistentWorldVariable const NextWeeklyQuestResetTimeVarId
Definition: World.h:726
void CalendarDeleteOldEvents()
Definition: World.cpp:3786
void ProcessQueryCallbacks()
Definition: World.cpp:3892
void RemoveOldCorpses()
Definition: World.cpp:3906
static World * instance()
Definition: World.cpp:207
uint32 m_MaxPlayerCount
Definition: World.h:842
float getFloatConfig(WorldFloatConfigs index) const
Get a server configuration element (see #WorldConfigs)
Definition: World.h:702
void AddInstanceSocket(std::weak_ptr< WorldSocket > sock, uint64 connectToKey)
Definition: World.cpp:365
LocaleConstant GetDefaultDbcLocale() const
Definition: World.h:634
static float m_MaxVisibleDistanceOnContinents
Definition: World.h:861
void SendGlobalMessage(WorldPacket const *packet, WorldSession *self=nullptr, Optional< Team > team={ })
Send a packet to all players (except self if mentioned)
Definition: World.cpp:2888
uint32 GetActiveAndQueuedSessionCount() const
Definition: World.h:577
static float m_MaxVisibleDistanceInInstances
Definition: World.h:862
WorldSession * FindSession(uint32 id) const
Find a session by its id.
Definition: World.cpp:333
int32 GetQueuePos(WorldSession *)
Definition: World.cpp:484
bool RemoveQueuedPlayer(WorldSession *session)
Definition: World.cpp:504
void UpdateAreaDependentAuras()
Definition: World.cpp:3828
void InitQuestResetTimes()
Definition: World.cpp:3515
bool _guidWarn
Definition: World.h:916
bool m_isClosed
Definition: World.h:828
void DisableForcedWarModeFactionBalanceState()
Definition: World.cpp:2538
uint32 GetMaxPlayerCount() const
Definition: World.h:585
IntervalTimer m_timers[WUPDATE_COUNT]
Definition: World.h:830
bool _guidAlert
Definition: World.h:917
std::unordered_map< std::string, int32 > m_worldVariables
Definition: World.h:851
void SendGlobalGMMessage(WorldPacket const *packet, WorldSession *self=nullptr, Optional< Team > team={ })
Send a packet to all GMs (except self if mentioned)
Definition: World.cpp:2905
void SendGlobalText(char const *text, WorldSession *self)
DEPRECATED, only for debug purpose. Send a System Message to all players (except self if mentioned)
Definition: World.cpp:3033
static bool IsStopped()
Definition: World.h:671
time_t m_NextMonthlyQuestReset
Definition: World.h:877
void ProcessLinkInstanceSocket(std::pair< std::weak_ptr< WorldSocket >, uint64 > linkInfo)
Definition: World.cpp:438
std::vector< std::string > _motd
Definition: World.h:857
uint32 m_maxQueuedSessionCount
Definition: World.h:840
static int32 m_visibility_notify_periodOnContinents
Definition: World.h:866
void SendAutoBroadcast()
Definition: World.cpp:3460
void Update(uint32 diff)
Update the World !
Definition: World.cpp:2572
bool IsBattlePetJournalLockAcquired(ObjectGuid battlenetAccountGuid)
Definition: World.cpp:3839
uint32 m_playerLimit
Definition: World.h:852
void LoadAutobroadcasts()
Definition: World.cpp:2543
void LoadPersistentWorldVariables()
Definition: World.cpp:3876
void SetPlayerAmountLimit(uint32 limit)
Active session server limit.
Definition: World.h:608
LockedQueue< std::pair< std::weak_ptr< WorldSocket >, uint64 > > _linkSocketQueue
Definition: World.h:891
bool m_allowMovement
Definition: World.h:856
void SendWorldText(uint32 string_id,...)
Send a System Message to all players (except self if mentioned)
Definition: World.cpp:2988
void DoGuidWarningRestart()
Definition: World.cpp:308
void ProcessCliCommands()
Definition: World.cpp:3442
void SetClosed(bool val)
Close world.
Definition: World.cpp:238
uint32 _warnDiff
Definition: World.h:918
LockedQueue< CliCommandHolder * > cliCmdQueue
Definition: World.h:872
World()
World constructor.
Definition: World.cpp:143
void ShutdownServ(uint32 time, uint32 options, uint8 exitcode, const std::string &reason=std::string())
Shutdown the server.
Definition: World.cpp:3313
void commandFinished(void *, bool)
Definition: CliRunnable.cpp:86
OpcodeTable opcodeTable
Definition: Opcodes.cpp:38
#define sWorld
Definition: World.h:931
ServerMessageType
Definition: World.h:49
void LoadWeatherData()
Definition: WeatherMgr.cpp:43
uint32 GetVirtualRealmAddress()
Definition: World.cpp:3968
Rates
Server rates.
Definition: World.h:452
Realm realm
Definition: World.cpp:3966
ShutdownExitCode
Definition: World.h:73
ShutdownMask
Definition: World.h:66
@ SERVER_MSG_SHUTDOWN_TIME
Definition: World.h:50
@ SERVER_MSG_STRING
Definition: World.h:52
@ SERVER_MSG_SHUTDOWN_CANCELLED
Definition: World.h:53
@ SERVER_MSG_RESTART_CANCELLED
Definition: World.h:54
@ SERVER_MSG_RESTART_TIME
Definition: World.h:51
@ CONFIG_AUTOBROADCAST_CENTER
Definition: World.h:374
@ CONFIG_ARENA_START_MATCHMAKER_RATING
Definition: World.h:350
@ CONFIG_RESPAWN_RESTARTQUIETTIME
Definition: World.h:433
@ CONFIG_ARENA_SEASON_ID
Definition: World.h:347
@ CONFIG_CORPSE_DECAY_ELITE
Definition: World.h:331
@ CONFIG_MAX_INSTANCES_PER_HOUR
Definition: World.h:382
@ CONFIG_GUILD_EVENT_LOG_COUNT
Definition: World.h:363
@ CONFIG_ARENA_START_RATING
Definition: World.h:348
@ CONFIG_SOCKET_TIMEOUTTIME
Definition: World.h:241
@ CONFIG_MAX_OVERSPEED_PINGS
Definition: World.h:307
@ CONFIG_WARDEN_NUM_LUA_CHECKS
Definition: World.h:389
@ CONFIG_NO_GRAY_AGGRO_BELOW
Definition: World.h:424
@ CONFIG_CHARDELETE_METHOD
Definition: World.h:370
@ CONFIG_SESSION_ADD_DELAY
Definition: World.h:242
@ CONFIG_MIN_CREATURE_SCALED_XP_RATIO
Definition: World.h:284
@ CONFIG_CORPSE_DECAY_OBSOLETE
Definition: World.h:333
@ CONFIG_CHARACTER_CREATING_DISABLED_CLASSMASK
Definition: World.h:252
@ CONFIG_WARDEN_CLIENT_BAN_DURATION
Definition: World.h:387
@ CONFIG_CLIENTCACHE_VERSION
Definition: World.h:361
@ CONFIG_TOLBARAD_BATTLETIME
Definition: World.h:400
@ CONFIG_DAILY_QUEST_RESET_TIME_HOUR
Definition: World.h:279
@ CONFIG_CURRENCY_RESET_DAY
Definition: World.h:272
@ CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF
Definition: World.h:317
@ CONFIG_CREATURE_PICKPOCKET_REFILL
Definition: World.h:415
@ CONFIG_BG_REWARD_WINNER_CONQUEST_FIRST
Definition: World.h:413
@ CONFIG_SKILL_CHANCE_ORANGE
Definition: World.h:299
@ CONFIG_GM_CHAT
Definition: World.h:288
@ CONFIG_RESPAWN_DYNAMICMODE
Definition: World.h:430
@ CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_EVOKER
Definition: World.h:257
@ CONFIG_CHATFLOOD_MUTE_TIME
Definition: World.h:313
@ CONFIG_STRICT_PET_NAMES
Definition: World.h:247
@ CONFIG_CHARACTER_CREATING_DISABLED
Definition: World.h:251
@ CONFIG_MIN_PET_NAME
Definition: World.h:250
@ CONFIG_LOGDB_CLEARTIME
Definition: World.h:360
@ CONFIG_TOLBARAD_PLR_MIN_LVL
Definition: World.h:399
@ CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF
Definition: World.h:318
@ CONFIG_INTERVAL_CHANGEWEATHER
Definition: World.h:237
@ CONFIG_PRESERVE_CUSTOM_CHANNEL_INTERVAL
Definition: World.h:379
@ CONFIG_PRESERVE_CUSTOM_CHANNEL_DURATION
Definition: World.h:378
@ CONFIG_GM_WHISPERING_TO
Definition: World.h:289
@ CONFIG_TOLBARAD_RESTART_AFTER_CRASH
Definition: World.h:403
@ CONFIG_SKILL_CHANCE_SKINNING_STEPS
Definition: World.h:304
@ CONFIG_SKILL_CHANCE_YELLOW
Definition: World.h:300
@ CONFIG_RESPAWN_GUIDWARNING_FREQUENCY
Definition: World.h:436
@ CONFIG_AUTOBROADCAST_INTERVAL
Definition: World.h:375
@ CONFIG_PVP_TOKEN_MAP_TYPE
Definition: World.h:353
@ CONFIG_ENABLE_SINFO_LOGIN
Definition: World.h:356
@ CONFIG_CHARTER_COST_GUILD
Definition: World.h:419
@ CONFIG_CHARDELETE_MIN_LEVEL
Definition: World.h:371
@ CONFIG_FORCE_SHUTDOWN_THRESHOLD
Definition: World.h:294
@ CONFIG_ARENA_MAX_RATING_DIFFERENCE
Definition: World.h:344
@ CONFIG_BG_REWARD_LOSER_HONOR_LAST
Definition: World.h:412
@ CONFIG_START_ALLIED_RACE_LEVEL
Definition: World.h:265
@ CONFIG_BLACKMARKET_UPDATE_PERIOD
Definition: World.h:439
@ CONFIG_TOLBARAD_BONUSTIME
Definition: World.h:401
@ CONFIG_AUCTION_TAINTED_SEARCH_DELAY
Definition: World.h:427
@ CONFIG_GAME_TYPE
Definition: World.h:243
@ CONFIG_ARENA_RATED_UPDATE_TIMER
Definition: World.h:346
@ CONFIG_START_DEMON_HUNTER_PLAYER_LEVEL
Definition: World.h:263
@ CONFIG_START_GM_LEVEL
Definition: World.h:293
@ CONFIG_MAIL_LEVEL_REQ
Definition: World.h:329
@ CONFIG_MIN_PETITION_SIGNS
Definition: World.h:282
@ CONFIG_WARDEN_CLIENT_CHECK_HOLDOFF
Definition: World.h:385
@ CONFIG_RESPAWN_DYNAMICMINIMUM_CREATURE
Definition: World.h:434
@ CONFIG_PARTY_LEVEL_REQ
Definition: World.h:326
@ CONFIG_MIN_LEVEL_STAT_SAVE
Definition: World.h:365
@ CONFIG_START_EVOKER_PLAYER_LEVEL
Definition: World.h:264
@ CONFIG_BATTLEGROUND_INVITATION_TYPE
Definition: World.h:340
@ CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL
Definition: World.h:262
@ CONFIG_MAX_PLAYER_LEVEL
Definition: World.h:259
@ CONFIG_MIN_CHARTER_NAME
Definition: World.h:249
@ CONFIG_CHAT_CHANNEL_LEVEL_REQ
Definition: World.h:321
@ CONFIG_PORT_INSTANCE
Definition: World.h:240
@ CONFIG_CHARACTERS_PER_ACCOUNT
Definition: World.h:253
@ CONFIG_DEATH_SICKNESS_LEVEL
Definition: World.h:337
@ CONFIG_CHARTER_COST_ARENA_5v5
Definition: World.h:422
@ CONFIG_WINTERGRASP_PLR_MIN_LVL
Definition: World.h:393
@ CONFIG_PVP_TOKEN_ID
Definition: World.h:354
@ CONFIG_GUILD_RESET_HOUR
Definition: World.h:368
@ CONFIG_CURRENCY_RESET_HOUR
Definition: World.h:271
@ CONFIG_MAIL_DELIVERY_DELAY
Definition: World.h:296
@ CONFIG_WINTERGRASP_BATTLETIME
Definition: World.h:394
@ CONFIG_CORPSE_DECAY_MINUSMOB
Definition: World.h:336
@ CONFIG_GM_FREEZE_DURATION
Definition: World.h:290
@ CONFIG_WINTERGRASP_NOBATTLETIME
Definition: World.h:395
@ CONFIG_PVP_TOKEN_COUNT
Definition: World.h:355
@ CONFIG_PACKET_SPOOF_BANDURATION
Definition: World.h:407
@ CONFIG_WARDEN_NUM_CLIENT_MOD_CHECKS
Definition: World.h:390
@ CONFIG_SKILL_CHANCE_MINING_STEPS
Definition: World.h:303
@ CONFIG_START_PLAYER_MONEY
Definition: World.h:266
@ CONFIG_GUILD_BANK_EVENT_LOG_COUNT
Definition: World.h:364
@ CONFIG_TRADE_LEVEL_REQ
Definition: World.h:327
@ CONFIG_AHBOT_UPDATE_INTERVAL
Definition: World.h:417
@ CONFIG_BATTLEGROUND_PREMADE_GROUP_WAIT_FOR_MATCH
Definition: World.h:342
@ CONFIG_CORPSE_DECAY_NORMAL
Definition: World.h:330
@ CONFIG_WINTERGRASP_RESTART_AFTER_CRASH
Definition: World.h:396
@ CONFIG_SOCKET_TIMEOUTTIME_ACTIVE
Definition: World.h:437
@ CONFIG_START_PLAYER_LEVEL
Definition: World.h:261
@ CONFIG_RESPAWN_GUIDALERTLEVEL
Definition: World.h:432
@ CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL
Definition: World.h:274
@ CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE
Definition: World.h:275
@ CONFIG_CLEAN_OLD_MAIL_TIME
Definition: World.h:297
@ CONFIG_INTERVAL_GRIDCLEAN
Definition: World.h:235
@ CONFIG_BG_REWARD_WINNER_HONOR_FIRST
Definition: World.h:409
@ CONFIG_ARENA_START_PERSONAL_RATING
Definition: World.h:349
@ CONFIG_COMPRESSION
Definition: World.h:233
@ CONFIG_STRICT_CHARTER_NAMES
Definition: World.h:246
@ CONFIG_INTERVAL_SAVE
Definition: World.h:234
@ CONFIG_BG_REWARD_LOSER_HONOR_FIRST
Definition: World.h:411
@ CONFIG_RESET_SCHEDULE_WEEK_DAY
Definition: World.h:276
@ CONFIG_PACKET_SPOOF_POLICY
Definition: World.h:405
@ CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT
Definition: World.h:311
@ CONFIG_FEATURE_SYSTEM_CHARACTER_UNDELETE_COOLDOWN
Definition: World.h:418
@ CONFIG_CHAT_YELL_LEVEL_REQ
Definition: World.h:325
@ CONFIG_WARDEN_NUM_INJECT_CHECKS
Definition: World.h:388
@ CONFIG_BG_REWARD_WINNER_CONQUEST_LAST
Definition: World.h:414
@ CONFIG_LFG_OPTIONSMASK
Definition: World.h:381
@ CONFIG_GM_LOGIN_STATE
Definition: World.h:286
@ CONFIG_GUILD_NEWS_LOG_COUNT
Definition: World.h:362
@ CONFIG_CORPSE_DECAY_TRIVIAL
Definition: World.h:335
@ CONFIG_AUCTION_LEVEL_REQ
Definition: World.h:328
@ CONFIG_TOLBARAD_PLR_MAX
Definition: World.h:397
@ CONFIG_REALM_ZONE
Definition: World.h:244
@ CONFIG_CHAT_STRICT_LINK_CHECKING_KICK
Definition: World.h:320
@ CONFIG_GM_LEVEL_IN_GM_LIST
Definition: World.h:291
@ CONFIG_ARENA_RATING_DISCARD_TIMER
Definition: World.h:345
@ CONFIG_TOLBARAD_PLR_MIN
Definition: World.h:398
@ CONFIG_CHARACTER_CREATING_EVOKERS_PER_REALM
Definition: World.h:255
@ CONFIG_CALENDAR_DELETE_OLD_EVENTS_HOUR
Definition: World.h:367
@ CONFIG_GM_VISIBLE_STATE
Definition: World.h:287
@ CONFIG_NO_GRAY_AGGRO_ABOVE
Definition: World.h:423
@ CONFIG_AUCTION_REPLICATE_DELAY
Definition: World.h:425
@ CONFIG_GUILD_SAVE_INTERVAL
Definition: World.h:404
@ CONFIG_GROUP_VISIBILITY
Definition: World.h:295
@ CONFIG_CREATURE_FAMILY_FLEE_DELAY
Definition: World.h:315
@ CONFIG_PACKET_SPOOF_BANMODE
Definition: World.h:406
@ CONFIG_CHARDELETE_DEMON_HUNTER_MIN_LEVEL
Definition: World.h:373
@ CONFIG_XP_BOOST_DAYMASK
Definition: World.h:383
@ CONFIG_MIN_DISCOVERED_SCALED_XP_RATIO
Definition: World.h:285
@ CONFIG_MAX_WHO
Definition: World.h:351
@ CONFIG_CHARDELETE_KEEP_DAYS
Definition: World.h:369
@ CONFIG_TOLBARAD_NOBATTLETIME
Definition: World.h:402
@ CONFIG_MAX_RESULTS_LOOKUP_COMMANDS
Definition: World.h:376
@ CONFIG_CREATURE_STOP_FOR_PLAYER
Definition: World.h:416
@ CONFIG_INTERVAL_DISCONNECT_TOLERANCE
Definition: World.h:238
@ CONFIG_CHAT_WHISPER_LEVEL_REQ
Definition: World.h:322
@ CONFIG_SKILL_GAIN_GATHERING
Definition: World.h:306
@ CONFIG_CHARTER_COST_ARENA_2v2
Definition: World.h:420
@ CONFIG_CHATFLOOD_MESSAGE_DELAY
Definition: World.h:310
@ CONFIG_CHARDELETE_DEATH_KNIGHT_MIN_LEVEL
Definition: World.h:372
@ CONFIG_DISABLE_BREATHING
Definition: World.h:339
@ CONFIG_FACTION_BALANCE_LEVEL_CHECK_DIFF
Definition: World.h:440
@ CONFIG_ACC_PASSCHANGESEC
Definition: World.h:408
@ CONFIG_STRICT_PLAYER_NAMES
Definition: World.h:245
@ CONFIG_LOGDB_CLEARINTERVAL
Definition: World.h:359
@ CONFIG_BATTLEGROUND_REPORT_AFK
Definition: World.h:343
@ CONFIG_MIN_QUEST_SCALED_XP_RATIO
Definition: World.h:283
@ CONFIG_INSTANCE_UNLOAD_DELAY
Definition: World.h:278
@ CONFIG_GM_LEVEL_IN_WHO_LIST
Definition: World.h:292
@ CONFIG_CURRENCY_RESET_INTERVAL
Definition: World.h:273
@ CONFIG_BATTLEGROUND_PREMATURE_FINISH_TIMER
Definition: World.h:341
@ CONFIG_HONOR_AFTER_DUEL
Definition: World.h:352
@ CONFIG_WEEKLY_QUEST_RESET_TIME_WDAY
Definition: World.h:280
@ CONFIG_PERSISTENT_CHARACTER_CLEAN_FLAGS
Definition: World.h:380
@ CONFIG_EXPANSION
Definition: World.h:308
@ CONFIG_CORPSE_DECAY_RARE
Definition: World.h:334
@ CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY
Definition: World.h:319
@ CONFIG_RESPAWN_GUIDWARNLEVEL
Definition: World.h:431
@ CONFIG_UPTIME_UPDATE
Definition: World.h:298
@ CONFIG_WARDEN_CLIENT_RESPONSE_DELAY
Definition: World.h:384
@ CONFIG_TALENTS_INSPECTING
Definition: World.h:428
@ CONFIG_WINTERGRASP_PLR_MAX
Definition: World.h:391
@ CONFIG_CHAT_EMOTE_LEVEL_REQ
Definition: World.h:323
@ CONFIG_AUCTION_SEARCH_DELAY
Definition: World.h:426
@ CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_DEMON_HUNTER
Definition: World.h:256
@ CONFIG_PORT_WORLD
Definition: World.h:239
@ CONFIG_MIN_DUALSPEC_LEVEL
Definition: World.h:260
@ CONFIG_SKILL_GAIN_CRAFTING
Definition: World.h:305
@ CONFIG_RANDOM_BG_RESET_HOUR
Definition: World.h:366
@ CONFIG_DB_PING_INTERVAL
Definition: World.h:377
@ CONFIG_WORLD_BOSS_LEVEL_DIFF
Definition: World.h:316
@ CONFIG_CORPSE_DECAY_RAREELITE
Definition: World.h:332
@ CONFIG_CHATFLOOD_MESSAGE_COUNT
Definition: World.h:309
@ CONFIG_WARDEN_CLIENT_FAIL_ACTION
Definition: World.h:386
@ CONFIG_RESPAWN_DYNAMICMINIMUM_GAMEOBJECT
Definition: World.h:435
@ CONFIG_CHARTER_COST_ARENA_3v3
Definition: World.h:421
@ CONFIG_MIN_PLAYER_NAME
Definition: World.h:248
@ CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY
Definition: World.h:312
@ CONFIG_SKILL_CHANCE_GREY
Definition: World.h:302
@ CONFIG_INTERVAL_MAPUPDATE
Definition: World.h:236
@ CONFIG_NUMTHREADS
Definition: World.h:358
@ CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY
Definition: World.h:314
@ CONFIG_MAX_PRIMARY_TRADE_SKILL
Definition: World.h:281
@ CONFIG_RESET_SCHEDULE_HOUR
Definition: World.h:277
@ CONFIG_SKIP_CINEMATICS
Definition: World.h:258
@ CONFIG_SKILL_CHANCE_GREEN
Definition: World.h:301
@ CONFIG_CHAT_SAY_LEVEL_REQ
Definition: World.h:324
@ CONFIG_WINTERGRASP_PLR_MIN
Definition: World.h:392
@ CONFIG_BLACKMARKET_MAXAUCTIONS
Definition: World.h:438
@ CONFIG_BG_REWARD_WINNER_HONOR_LAST
Definition: World.h:410
@ CONFIG_CHARACTERS_PER_REALM
Definition: World.h:254
@ CONFIG_RESPAWN_MINCHECKINTERVALMS
Definition: World.h:429
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_CALENDAR
Definition: World.h:109
@ CONFIG_SHOW_KICK_IN_WORLD
Definition: World.h:151
@ CONFIG_QUEST_IGNORE_AUTO_COMPLETE
Definition: World.h:165
@ CONFIG_BG_XP_FOR_KILL
Definition: World.h:140
@ CONFIG_CREATURE_CHECK_INVALID_POSITION
Definition: World.h:192
@ CONFIG_SUPPORT_COMPLAINTS_ENABLED
Definition: World.h:158
@ CONFIG_AUTOBROADCAST
Definition: World.h:154
@ CONFIG_CHECK_GOBJECT_LOS
Definition: World.h:194
@ CONFIG_INSTANCEMAP_LOAD_GRIDS
Definition: World.h:182
@ CONFIG_WEATHER
Definition: World.h:124
@ CONFIG_ALL_TAXI_PATHS
Definition: World.h:115
@ CONFIG_GM_LOWER_SECURITY
Definition: World.h:121
@ CONFIG_SKILL_MILLING
Definition: World.h:123
@ CONFIG_PDUMP_NO_OVERWRITE
Definition: World.h:163
@ CONFIG_GRID_UNLOAD
Definition: World.h:107
@ CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP
Definition: World.h:130
@ CONFIG_START_ALL_SPELLS
Definition: World.h:146
@ CONFIG_SUPPORT_BUGS_ENABLED
Definition: World.h:157
@ CONFIG_ALLOW_LOGGING_IP_ADDRESSES_IN_DATABASE
Definition: World.h:197
@ CONFIG_SHOW_MUTE_IN_WORLD
Definition: World.h:152
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION
Definition: World.h:113
@ CONFIG_CHAT_PARTY_RAID_WARNINGS
Definition: World.h:126
@ CONFIG_ALLOW_GM_GROUP
Definition: World.h:120
@ CONFIG_DECLINED_NAMES_USED
Definition: World.h:135
@ CONFIG_EVENT_ANNOUNCE
Definition: World.h:171
@ CONFIG_ARENA_LOG_EXTENDED_INFO
Definition: World.h:143
@ CONFIG_CALCULATE_GAMEOBJECT_ZONE_AREA_DATA
Definition: World.h:176
@ CONFIG_STATS_LIMITS_ENABLE
Definition: World.h:172
@ CONFIG_HOTSWAP_INSTALL_ENABLED
Definition: World.h:188
@ CONFIG_QUEST_IGNORE_RAID
Definition: World.h:125
@ CONFIG_SHOW_BAN_IN_WORLD
Definition: World.h:153
@ CONFIG_HOTSWAP_EARLY_TERMINATION_ENABLED
Definition: World.h:186
@ CONFIG_HOTSWAP_ENABLED
Definition: World.h:184
@ CONFIG_CLEAN_CHARACTER_DB
Definition: World.h:106
@ CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY
Definition: World.h:138
@ CONFIG_CHAT_FAKE_MESSAGE_PREVENTING
Definition: World.h:129
@ CONFIG_ALLOW_TWO_SIDE_TRADE
Definition: World.h:114
@ CONFIG_ENABLE_AE_LOOT
Definition: World.h:200
@ CONFIG_TOLBARAD_ENABLE
Definition: World.h:170
@ CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE
Definition: World.h:131
@ CONFIG_SKILL_PROSPECTING
Definition: World.h:122
@ CONFIG_IP_BASED_ACTION_LOGGING
Definition: World.h:174
@ CONFIG_ADDON_CHANNEL
Definition: World.h:105
@ CONFIG_START_ALL_REP
Definition: World.h:148
@ CONFIG_PVP_TOKEN_ENABLE
Definition: World.h:149
@ CONFIG_FEATURE_SYSTEM_BPAY_STORE_ENABLED
Definition: World.h:177
@ CONFIG_CHARACTER_CREATING_DISABLE_ALLIED_RACE_ACHIEVEMENT_REQUIREMENT
Definition: World.h:198
@ CONFIG_ARENA_SEASON_IN_PROGRESS
Definition: World.h:142
@ CONFIG_DETECT_POS_COLLISION
Definition: World.h:127
@ CONFIG_DEATH_BONES_BG_OR_ARENA
Definition: World.h:133
@ CONFIG_BASEMAP_LOAD_GRIDS
Definition: World.h:181
@ CONFIG_HOTSWAP_PREFIX_CORRECTION_ENABLED
Definition: World.h:189
@ CONFIG_BATTLEGROUND_STORE_STATISTICS_ENABLE
Definition: World.h:139
@ CONFIG_INSTANCE_IGNORE_RAID
Definition: World.h:118
@ CONFIG_RESET_DUEL_HEALTH_MANA
Definition: World.h:180
@ CONFIG_BATTLEGROUND_CAST_DESERTER
Definition: World.h:136
@ CONFIG_HOTSWAP_BUILD_FILE_RECREATION_ENABLED
Definition: World.h:187
@ CONFIG_STATS_SAVE_ONLY_ON_LOGOUT
Definition: World.h:108
@ CONFIG_INSTANT_TAXI
Definition: World.h:116
@ CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE
Definition: World.h:141
@ CONFIG_RESTRICTED_LFG_CHANNEL
Definition: World.h:128
@ CONFIG_NO_RESET_TALENT_COST
Definition: World.h:150
@ CONFIG_CALCULATE_CREATURE_ZONE_AREA_DATA
Definition: World.h:175
@ CONFIG_HOTSWAP_RECOMPILER_ENABLED
Definition: World.h:185
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL
Definition: World.h:110
@ CONFIG_PRESERVE_CUSTOM_CHANNELS
Definition: World.h:161
@ CONFIG_ENABLE_MMAPS
Definition: World.h:168
@ CONFIG_OFFHAND_CHECK_AT_SPELL_UNLEARN
Definition: World.h:144
@ CONFIG_CAST_UNSTUCK
Definition: World.h:119
@ CONFIG_RESET_DUEL_COOLDOWNS
Definition: World.h:179
@ CONFIG_DURABILITY_LOSS_IN_PVP
Definition: World.h:104
@ CONFIG_INSTANCES_RESET_ANNOUNCE
Definition: World.h:173
@ CONFIG_WINTERGRASP_ENABLE
Definition: World.h:169
@ CONFIG_QUEST_IGNORE_AUTO_ACCEPT
Definition: World.h:164
@ CONFIG_PREVENT_RENAME_CUSTOMIZATION
Definition: World.h:190
@ CONFIG_DIE_COMMAND_MODE
Definition: World.h:134
@ CONFIG_SUPPORT_SUGGESTIONS_ENABLED
Definition: World.h:159
@ CONFIG_VMAP_INDOOR_CHECK
Definition: World.h:145
@ CONFIG_WARDEN_ENABLED
Definition: World.h:167
@ CONFIG_CACHE_DATA_QUERIES
Definition: World.h:191
@ CONFIG_PDUMP_NO_PATHS
Definition: World.h:162
@ CONFIG_SUPPORT_TICKETS_ENABLED
Definition: World.h:156
@ CONFIG_GAME_OBJECT_CHECK_INVALID_POSITION
Definition: World.h:193
@ CONFIG_RESPAWN_DYNAMIC_ESCORTNPC
Definition: World.h:195
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition: World.h:111
@ CONFIG_DEATH_BONES_WORLD
Definition: World.h:132
@ CONFIG_SUPPORT_ENABLED
Definition: World.h:155
@ CONFIG_QUEST_ENABLE_QUEST_TRACKER
Definition: World.h:166
@ CONFIG_REGEN_HP_CANNOT_REACH_TARGET_IN_RAID
Definition: World.h:196
@ CONFIG_BATTLEGROUNDMAP_LOAD_GRIDS
Definition: World.h:199
@ CONFIG_BLACKMARKET_ENABLED
Definition: World.h:183
@ CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES
Definition: World.h:160
@ CONFIG_START_ALL_EXPLORED
Definition: World.h:147
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD
Definition: World.h:112
@ CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE
Definition: World.h:137
@ CONFIG_INSTANCE_IGNORE_LEVEL
Definition: World.h:117
@ CONFIG_FEATURE_SYSTEM_CHARACTER_UNDELETE_ENABLED
Definition: World.h:178
@ WUPDATE_DELETECHARS
Definition: World.h:90
@ WUPDATE_GUILDSAVE
Definition: World.h:93
@ WUPDATE_COUNT
Definition: World.h:98
@ WUPDATE_CLEANDB
Definition: World.h:87
@ WUPDATE_CORPSES
Definition: World.h:85
@ WUPDATE_PINGDB
Definition: World.h:92
@ WUPDATE_CHANNEL_SAVE
Definition: World.h:97
@ WUPDATE_AUCTIONS_PENDING
Definition: World.h:83
@ WUPDATE_AUTOBROADCAST
Definition: World.h:88
@ WUPDATE_WHO_LIST
Definition: World.h:96
@ WUPDATE_CHECK_FILECHANGES
Definition: World.h:95
@ WUPDATE_UPTIME
Definition: World.h:84
@ WUPDATE_BLACKMARKET
Definition: World.h:94
@ WUPDATE_EVENTS
Definition: World.h:86
@ WUPDATE_AUCTIONS
Definition: World.h:82
@ WUPDATE_AHBOT
Definition: World.h:91
@ RATE_POWER_CHI
Definition: World.h:466
@ RATE_DAMAGE_FALL
Definition: World.h:518
@ RATE_CREATURE_DAMAGE_NORMAL
Definition: World.h:500
@ RATE_DROP_ITEM_REFERENCED_AMOUNT
Definition: World.h:481
@ RATE_POWER_RUNIC_POWER_LOSS
Definition: World.h:461
@ RATE_CREATURE_DAMAGE_RAREELITE
Definition: World.h:502
@ RATE_POWER_RAGE_INCOME
Definition: World.h:455
@ RATE_CREATURE_AGGRO
Definition: World.h:514
@ RATE_POWER_RAGE_LOSS
Definition: World.h:456
@ RATE_REPUTATION_LOWLEVEL_QUEST
Definition: World.h:491
@ RATE_CREATURE_HP_ELITE
Definition: World.h:494
@ RATE_DURABILITY_LOSS_BLOCK
Definition: World.h:530
@ RATE_DROP_ITEM_RARE
Definition: World.h:476
@ RATE_REPUTATION_LOWLEVEL_KILL
Definition: World.h:490
@ RATE_XP_KILL
Definition: World.h:483
@ RATE_INSTANCE_RESET_TIME
Definition: World.h:525
@ RATE_CREATURE_HP_RARE
Definition: World.h:497
@ RATE_CREATURE_DAMAGE_ELITE
Definition: World.h:501
@ RATE_REST_OFFLINE_IN_WILDERNESS
Definition: World.h:517
@ RATE_POWER_ENERGY
Definition: World.h:458
@ RATE_TALENT
Definition: World.h:523
@ RATE_CREATURE_SPELLDAMAGE_TRIVIAL
Definition: World.h:512
@ RATE_MONEY_MAX_LEVEL_QUEST
Definition: World.h:534
@ RATE_CREATURE_SPELLDAMAGE_NORMAL
Definition: World.h:507
@ RATE_POWER_MANA
Definition: World.h:454
@ RATE_DROP_ITEM_LEGENDARY
Definition: World.h:478
@ RATE_DURABILITY_LOSS_PARRY
Definition: World.h:528
@ RATE_DROP_ITEM_POOR
Definition: World.h:473
@ RATE_REST_OFFLINE_IN_TAVERN_OR_CITY
Definition: World.h:516
@ RATE_AUCTION_DEPOSIT
Definition: World.h:520
@ RATE_DROP_ITEM_UNCOMMON
Definition: World.h:475
@ RATE_DROP_ITEM_REFERENCED
Definition: World.h:480
@ RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS
Definition: World.h:492
@ RATE_REPAIRCOST
Definition: World.h:488
@ RATE_CREATURE_SPELLDAMAGE_RAREELITE
Definition: World.h:509
@ RATE_DROP_MONEY
Definition: World.h:482
@ RATE_DURABILITY_LOSS_DAMAGE
Definition: World.h:527
@ RATE_MONEY_QUEST
Definition: World.h:533
@ RATE_AUCTION_CUT
Definition: World.h:521
@ RATE_HEALTH
Definition: World.h:453
@ RATE_MOVESPEED
Definition: World.h:531
@ RATE_DURABILITY_LOSS_ON_DEATH
Definition: World.h:526
@ RATE_XP_QUEST
Definition: World.h:485
@ RATE_XP_BOOST
Definition: World.h:532
@ RATE_DROP_ITEM_EPIC
Definition: World.h:477
@ RATE_CREATURE_HP_OBSOLETE
Definition: World.h:496
@ RATE_SKILL_DISCOVERY
Definition: World.h:472
@ RATE_POWER_MAELSTROM
Definition: World.h:465
@ RATE_DROP_ITEM_ARTIFACT
Definition: World.h:479
@ RATE_CREATURE_DAMAGE_OBSOLETE
Definition: World.h:503
@ RATE_CREATURE_DAMAGE_MINUSMOB
Definition: World.h:506
@ RATE_XP_EXPLORE
Definition: World.h:487
@ RATE_POWER_INSANITY
Definition: World.h:467
@ RATE_POWER_FURY
Definition: World.h:469
@ RATE_REPUTATION_GAIN
Definition: World.h:489
@ RATE_REST_INGAME
Definition: World.h:515
@ RATE_POWER_RUNIC_POWER_INCOME
Definition: World.h:460
@ RATE_POWER_FOCUS
Definition: World.h:457
@ RATE_XP_BG_KILL
Definition: World.h:484
@ RATE_CREATURE_HP_NORMAL
Definition: World.h:493
@ RATE_POWER_ARCANE_CHARGES
Definition: World.h:468
@ RATE_CREATURE_HP_MINUSMOB
Definition: World.h:499
@ RATE_HONOR
Definition: World.h:522
@ RATE_POWER_HOLY_POWER
Definition: World.h:464
@ RATE_POWER_LUNAR_POWER
Definition: World.h:463
@ RATE_CREATURE_HP_TRIVIAL
Definition: World.h:498
@ RATE_CORPSE_DECAY_LOOTED
Definition: World.h:524
@ RATE_DURABILITY_LOSS_ABSORB
Definition: World.h:529
@ RATE_AUCTION_TIME
Definition: World.h:519
@ RATE_CREATURE_DAMAGE_RARE
Definition: World.h:504
@ RATE_CREATURE_DAMAGE_TRIVIAL
Definition: World.h:505
@ RATE_CREATURE_SPELLDAMAGE_ELITE
Definition: World.h:508
@ RATE_POWER_ESSENCE
Definition: World.h:471
@ RATE_CREATURE_SPELLDAMAGE_MINUSMOB
Definition: World.h:513
@ RATE_DROP_ITEM_NORMAL
Definition: World.h:474
@ RATE_POWER_SOUL_SHARDS
Definition: World.h:462
@ RATE_CREATURE_HP_RAREELITE
Definition: World.h:495
@ RATE_CREATURE_SPELLDAMAGE_OBSOLETE
Definition: World.h:510
@ RATE_CREATURE_SPELLDAMAGE_RARE
Definition: World.h:511
@ RATE_POWER_PAIN
Definition: World.h:470
@ RATE_POWER_COMBO_POINTS_LOSS
Definition: World.h:459
@ CONFIG_CHARACTER_CREATING_DISABLED_RACEMASK
Definition: World.h:446
@ CONFIG_STATS_LIMITS_DODGE
Definition: World.h:215
@ CONFIG_RESPAWN_DYNAMICRATE_CREATURE
Definition: World.h:223
@ CONFIG_SIGHT_MONSTER
Definition: World.h:208
@ CONFIG_ARENA_WIN_RATING_MODIFIER_1
Definition: World.h:219
@ CONFIG_GROUP_XP_DISTANCE
Definition: World.h:206
@ CONFIG_CALL_TO_ARMS_20_PCT
Definition: World.h:227
@ CONFIG_LISTEN_RANGE_YELL
Definition: World.h:211
@ CONFIG_STATS_LIMITS_PARRY
Definition: World.h:216
@ CONFIG_CREATURE_FAMILY_FLEE_ASSISTANCE_RADIUS
Definition: World.h:212
@ CONFIG_ARENA_WIN_RATING_MODIFIER_2
Definition: World.h:220
@ CONFIG_ARENA_LOSE_RATING_MODIFIER
Definition: World.h:221
@ CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS
Definition: World.h:213
@ CONFIG_LISTEN_RANGE_SAY
Definition: World.h:209
@ CONFIG_THREAT_RADIUS
Definition: World.h:214
@ CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE
Definition: World.h:207
@ CONFIG_ARENA_MATCHMAKER_RATING_MODIFIER
Definition: World.h:222
@ CONFIG_CALL_TO_ARMS_5_PCT
Definition: World.h:225
@ CONFIG_RESPAWN_DYNAMICRATE_GAMEOBJECT
Definition: World.h:224
@ CONFIG_CALL_TO_ARMS_10_PCT
Definition: World.h:226
@ CONFIG_STATS_LIMITS_CRIT
Definition: World.h:218
@ CONFIG_LISTEN_RANGE_TEXTEMOTE
Definition: World.h:210
@ CONFIG_STATS_LIMITS_BLOCK
Definition: World.h:217
@ RESTART_EXIT_CODE
Definition: World.h:76
@ SHUTDOWN_EXIT_CODE
Definition: World.h:74
@ SHUTDOWN_MASK_RESTART
Definition: World.h:67
@ SHUTDOWN_MASK_IDLE
Definition: World.h:68
void CheckQuestDisables()
Definition: DisableMgr.cpp:256
bool IsVMAPDisabledFor(uint32 entry, uint8 flags)
Definition: DisableMgr.cpp:396
void LoadDisables()
Definition: DisableMgr.cpp:59
void UpdateGameTimers()
Definition: GameTime.cpp:102
time_t GetGameTime()
Definition: GameTime.cpp:44
time_t GetStartTime()
Definition: GameTime.cpp:39
uint32 GetUptime()
Uptime (in secs)
Definition: GameTime.cpp:82
TC_COMMON_API char const * GetFullVersion()
Definition: GitRevision.cpp:96
TC_GAME_API Player * FindConnectedPlayerByName(std::string_view name)
void Load()
Definition: TraitMgr.cpp:80
TC_GAME_API void LoadCommandMap()
auto SelectRandomWeightedContainerElement(C const &container, std::span< double > const &weights) -> decltype(std::begin(container))
Definition: Containers.h:126
auto MapEqualRange(M &map, typename M::key_type const &key)
Definition: IteratorPair.h:60
auto MapGetValuePtr(M &map, typename M::key_type const &key)
Definition: MapUtils.h:29
void MultimapErasePair(M< K, V, Rest... > &multimap, K const &key, V const &value)
Definition: MapUtils.h:39
@ RBAC_PERM_SKIP_QUEUE
Definition: RBAC.h:55
@ RBAC_PERM_RECEIVE_GLOBAL_GM_TEXTMESSAGE
Definition: RBAC.h:97
uint32 GetAddress() const
Definition: Realm.h:56
Storage class for commands issued for delayed execution.
Definition: World.h:542
CommandFinished m_commandFinished
Definition: World.h:549
void * m_callbackArg
Definition: World.h:546
CliCommandHolder(void *callbackArg, char const *command, Print zprint, CommandFinished commandFinished)
Definition: World.cpp:3973
Print m_print
Definition: World.h:548
void(*)(void *, std::string_view) Print
Definition: World.h:543
char * m_command
Definition: World.h:547
void(*)(void *, bool success) CommandFinished
Definition: World.h:544
void SetInterval(time_t interval)
Definition: Timer.h:94
time_t GetInterval() const
Definition: Timer.h:99
void Update(time_t diff)
Definition: Timer.h:71
void SetCurrent(time_t current)
Definition: Timer.h:89
void Reset()
Definition: Timer.h:83
Definition: Realm.h:81
Battlenet::RealmHandle Id
Definition: Realm.h:82
LocalizedString Text
struct WorldSession::ConnectToKey::@330 Fields