aboutsummaryrefslogtreecommitdiff
path: root/src/server/worldserver/Main.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-08-18 18:59:58 +0200
committerOvahlord <dreadkiller@gmx.de>2024-08-18 20:39:21 +0200
commit25ffdbc5ef0859aeaadfa132329a498e86827e68 (patch)
treed7df51da8cdc3e3df7c50e5058803f9324715ee4 /src/server/worldserver/Main.cpp
parent0c98004896cb91ef2d22baa5569ff0e0d6cd15ee (diff)
Core/Realms: Realmlist refactors
* Removed global realm variable from World and use RealmList everywhere * Match auth build key with client version * Restored allowedSecurityLevel checks for realmlist packet building * Restored updating population field, mysteriously removed 15 years ago in f20b25d1c90f608deab28c9957b3b376ab2a0d50 (cherry picked from commit c4b710446d62c95eb8124175203fa5f394912594) # Conflicts: # sql/base/auth_database.sql
Diffstat (limited to 'src/server/worldserver/Main.cpp')
-rw-r--r--src/server/worldserver/Main.cpp70
1 files changed, 31 insertions, 39 deletions
diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp
index e781fb8b95e..c3ad9b4f420 100644
--- a/src/server/worldserver/Main.cpp
+++ b/src/server/worldserver/Main.cpp
@@ -126,10 +126,9 @@ AsyncAcceptor* StartRaSocketAcceptor(Trinity::Asio::IoContext& ioContext);
bool StartDB();
void StopDB();
void WorldUpdateLoop();
-void ClearOnlineAccounts();
+void ClearOnlineAccounts(uint32 realmId);
struct ShutdownTCSoapThread { void operator()(std::thread* thread) const; };
struct ShutdownCLIThread { void operator()(std::thread* cliThread) const; };
-bool LoadRealmInfo();
variables_map GetConsoleArguments(int argc, char** argv, fs::path& configFile, fs::path& configDir, std::string& winServiceAction);
/// Launch the Trinity server
@@ -305,16 +304,33 @@ extern int main(int argc, char** argv)
Trinity::Net::ScanLocalNetworks();
- // Set server offline (not connectable)
- LoginDatabase.DirectPExecute("UPDATE realmlist SET flag = flag | {} WHERE id = '{}'", REALM_FLAG_OFFLINE, realm.Id.Realm);
-
sRealmList->Initialize(*ioContext, sConfigMgr->GetIntDefault("RealmsStateUpdateDelay", 10));
auto sRealmListHandle = Trinity::make_unique_ptr_with_deleter(sRealmList, [](RealmList* realmList) { realmList->Close(); });
- LoadRealmInfo();
+ ///- Get the realm Id from the configuration file
+ uint32 realmId = sConfigMgr->GetIntDefault("RealmID", 0);
+ if (!realmId)
+ {
+ TC_LOG_ERROR("server.worldserver", "Realm ID not defined in configuration file");
+ return 1;
+ }
+
+ sRealmList->SetCurrentRealmId(realmId);
- sMetric->Initialize(realm.Name, *ioContext, []()
+ TC_LOG_INFO("server.worldserver", "Realm running as realm ID {}", realmId);
+
+ ///- Clean the database before starting
+ ClearOnlineAccounts(realmId);
+
+ std::shared_ptr<Realm const> realm = sRealmList->GetCurrentRealm();
+ if (!realm)
+ return 1;
+
+ // Set server offline (not connectable)
+ LoginDatabase.DirectPExecute("UPDATE realmlist SET flag = flag | {} WHERE id = '{}'", Trinity::Legacy::REALM_FLAG_OFFLINE, realmId);
+
+ sMetric->Initialize(realm->Name, *ioContext, []()
{
TC_METRIC_VALUE("online_players", sWorld->GetPlayerCount());
TC_METRIC_VALUE("db_queue_login", uint64(LoginDatabase.QueueSize()));
@@ -322,6 +338,8 @@ extern int main(int argc, char** argv)
TC_METRIC_VALUE("db_queue_world", uint64(WorldDatabase.QueueSize()));
});
+ realm = nullptr;
+
TC_METRIC_EVENT("events", "Worldserver started", "");
auto sMetricHandle = Trinity::make_unique_ptr_with_deleter(sMetric, [](Metric* metric)
@@ -388,7 +406,7 @@ extern int main(int argc, char** argv)
return 1;
}
- auto sWorldSocketMgrHandle = Trinity::make_unique_ptr_with_deleter(&sWorldSocketMgr, [](WorldSocketMgr* mgr)
+ auto sWorldSocketMgrHandle = Trinity::make_unique_ptr_with_deleter(&sWorldSocketMgr, [realmId](WorldSocketMgr* mgr)
{
sWorld->KickAll(); // save and kick all players
sWorld->UpdateSessions(1); // real players unload required UpdateSessions call
@@ -396,13 +414,11 @@ extern int main(int argc, char** argv)
mgr->StopNetwork();
///- Clean database before leaving
- ClearOnlineAccounts();
+ ClearOnlineAccounts(realmId);
});
// Set server online (allow connecting now)
- LoginDatabase.DirectPExecute("UPDATE realmlist SET flag = flag & ~{}, population = 0 WHERE id = '{}'", REALM_FLAG_OFFLINE, realm.Id.Realm);
- realm.PopulationLevel = 0.0f;
- realm.Flags = RealmFlags(realm.Flags & ~uint32(REALM_FLAG_OFFLINE));
+ LoginDatabase.DirectPExecute("UPDATE realmlist SET flag = flag & ~{}, population = 0 WHERE id = '{}'", Trinity::Legacy::REALM_FLAG_OFFLINE, realmId);
// Start the freeze check callback cycle in 5 seconds (cycle itself is 1 sec)
std::shared_ptr<FreezeDetector> freezeDetector;
@@ -443,7 +459,7 @@ extern int main(int argc, char** argv)
sScriptMgr->OnShutdown();
// set server offline
- LoginDatabase.DirectPExecute("UPDATE realmlist SET flag = flag | {} WHERE id = '{}'", REALM_FLAG_OFFLINE, realm.Id.Realm);
+ LoginDatabase.DirectPExecute("UPDATE realmlist SET flag = flag | {} WHERE id = '{}'", Trinity::Legacy::REALM_FLAG_OFFLINE, realmId);
TC_LOG_INFO("server.worldserver", "Halting process...");
@@ -633,17 +649,6 @@ AsyncAcceptor* StartRaSocketAcceptor(Trinity::Asio::IoContext& ioContext)
return acceptor;
}
-bool LoadRealmInfo()
-{
- if (Realm const* realmListRealm = sRealmList->GetRealm(realm.Id))
- {
- realm = *realmListRealm;
- return true;
- }
-
- return false;
-}
-
/// Initialize connection to the databases
bool StartDB()
{
@@ -660,19 +665,6 @@ bool StartDB()
if (!loader.Load())
return false;
- ///- Get the realm Id from the configuration file
- realm.Id.Realm = sConfigMgr->GetIntDefault("RealmID", 0);
- if (!realm.Id.Realm)
- {
- TC_LOG_ERROR("server.worldserver", "Realm ID not defined in configuration file");
- return false;
- }
-
- TC_LOG_INFO("server.worldserver", "Realm running as realm ID {}", realm.Id.Realm);
-
- ///- Clean the database before starting
- ClearOnlineAccounts();
-
///- Insert version info into DB
WorldDatabase.PExecute("UPDATE version SET core_version = '{}', core_revision = '{}'", GitRevision::GetFullVersion(), GitRevision::GetHash()); // One-time query
@@ -693,10 +685,10 @@ void StopDB()
}
/// Clear 'online' status for all accounts with characters in this realm
-void ClearOnlineAccounts()
+void ClearOnlineAccounts(uint32 realmId)
{
// Reset online status for all accounts with characters on the current realm
- LoginDatabase.DirectPExecute("UPDATE account SET online = 0 WHERE online > 0 AND id IN (SELECT acctid FROM realmcharacters WHERE realmid = {})", realm.Id.Realm);
+ LoginDatabase.DirectPExecute("UPDATE account SET online = 0 WHERE online > 0 AND id IN (SELECT acctid FROM realmcharacters WHERE realmid = {})", realmId);
// Reset online status for all characters
CharacterDatabase.DirectExecute("UPDATE characters SET online = 0 WHERE online <> 0");