Skip to content

Commit

Permalink
Merge branch 'main' into fix--remove-the-wacrimes-from-our-docker-config
Browse files Browse the repository at this point in the history
  • Loading branch information
aronwk-aaron committed Jan 2, 2024
2 parents 7499e24 + 1941679 commit f7664ad
Show file tree
Hide file tree
Showing 22 changed files with 118 additions and 70 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.18)
project(Darkflame)
include(CTest)

set (CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD 20)

# Read variables from file
FILE(READ "${CMAKE_SOURCE_DIR}/CMakeVariables.txt" variables)
Expand Down
17 changes: 13 additions & 4 deletions dAuthServer/AuthServer.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include <iostream>
#include <string>
#include <ctime>
#include <csignal>
#include <chrono>
#include <thread>

Expand Down Expand Up @@ -28,7 +29,7 @@ namespace Game {
Logger* logger = nullptr;
dServer* server = nullptr;
dConfig* config = nullptr;
bool shouldShutdown = false;
Game::signal_t lastSignal = 0;
std::mt19937 randomEngine;
}

Expand All @@ -42,6 +43,9 @@ int main(int argc, char** argv) {
Diagnostics::SetProcessFileName(argv[0]);
Diagnostics::Initialize();

std::signal(SIGINT, Game::OnSignal);
std::signal(SIGTERM, Game::OnSignal);

//Create all the objects we need to run our service:
Game::logger = SetupLogger();
if (!Game::logger) return EXIT_FAILURE;
Expand Down Expand Up @@ -74,6 +78,7 @@ int main(int argc, char** argv) {
masterIP = masterInfo->ip;
masterPort = masterInfo->port;
}
LOG("Master is at %s:%d", masterIP.c_str(), masterPort);

Game::randomEngine = std::mt19937(time(0));

Expand All @@ -83,7 +88,7 @@ int main(int argc, char** argv) {
if (Game::config->GetValue("max_clients") != "") maxClients = std::stoi(Game::config->GetValue("max_clients"));
if (Game::config->GetValue("port") != "") ourPort = std::atoi(Game::config->GetValue("port").c_str());

Game::server = new dServer(Game::config->GetValue("external_ip"), ourPort, 0, maxClients, false, true, Game::logger, masterIP, masterPort, ServerType::Auth, Game::config, &Game::shouldShutdown);
Game::server = new dServer(Game::config->GetValue("external_ip"), ourPort, 0, maxClients, false, true, Game::logger, masterIP, masterPort, ServerType::Auth, Game::config, &Game::lastSignal);

//Run it until server gets a kill message from Master:
auto t = std::chrono::high_resolution_clock::now();
Expand All @@ -96,13 +101,16 @@ int main(int argc, char** argv) {

AuthPackets::LoadClaimCodes();

while (!Game::shouldShutdown) {
Game::logger->Flush(); // once immediately before main loop
while (!Game::ShouldShutdown()) {
//Check if we're still connected to master:
if (!Game::server->GetIsConnectedToMaster()) {
framesSinceMasterDisconnect++;

if (framesSinceMasterDisconnect >= authFramerate)
if (framesSinceMasterDisconnect >= authFramerate) {
LOG("No connection to master!");
break; //Exit our loop, shut down.
}
} else framesSinceMasterDisconnect = 0;

//In world we'd update our other systems here.
Expand Down Expand Up @@ -141,6 +149,7 @@ int main(int argc, char** argv) {
std::this_thread::sleep_until(t);
}

LOG("Exited Main Loop! (signal %d)", Game::lastSignal);
//Delete our objects here:
Database::Destroy("AuthServer");
delete Game::server;
Expand Down
10 changes: 7 additions & 3 deletions dChatServer/ChatServer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ namespace Game {
dConfig* config = nullptr;
dChatFilter* chatFilter = nullptr;
AssetManager* assetManager = nullptr;
bool shouldShutdown = false;
Game::signal_t lastSignal = 0;
std::mt19937 randomEngine;
PlayerContainer playerContainer;
}
Expand All @@ -48,6 +48,9 @@ int main(int argc, char** argv) {
Diagnostics::SetProcessFileName(argv[0]);
Diagnostics::Initialize();

std::signal(SIGINT, Game::OnSignal);
std::signal(SIGTERM, Game::OnSignal);

//Create all the objects we need to run our service:
Game::logger = SetupLogger();
if (!Game::logger) return EXIT_FAILURE;
Expand Down Expand Up @@ -101,7 +104,7 @@ int main(int argc, char** argv) {
if (Game::config->GetValue("max_clients") != "") maxClients = std::stoi(Game::config->GetValue("max_clients"));
if (Game::config->GetValue("port") != "") ourPort = std::atoi(Game::config->GetValue("port").c_str());

Game::server = new dServer(Game::config->GetValue("external_ip"), ourPort, 0, maxClients, false, true, Game::logger, masterIP, masterPort, ServerType::Chat, Game::config, &Game::shouldShutdown);
Game::server = new dServer(Game::config->GetValue("external_ip"), ourPort, 0, maxClients, false, true, Game::logger, masterIP, masterPort, ServerType::Chat, Game::config, &Game::lastSignal);

Game::chatFilter = new dChatFilter(Game::assetManager->GetResPath().string() + "/chatplus_en_us", bool(std::stoi(Game::config->GetValue("dont_generate_dcf"))));

Expand All @@ -118,7 +121,8 @@ int main(int argc, char** argv) {
uint32_t framesSinceMasterDisconnect = 0;
uint32_t framesSinceLastSQLPing = 0;

while (!Game::shouldShutdown) {
Game::logger->Flush(); // once immediately before main loop
while (!Game::ShouldShutdown()) {
//Check if we're still connected to master:
if (!Game::server->GetIsConnectedToMaster()) {
framesSinceMasterDisconnect++;
Expand Down
1 change: 1 addition & 0 deletions dCommon/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ set(DCOMMON_SOURCES
"dConfig.cpp"
"Diagnostics.cpp"
"Logger.cpp"
"Game.cpp"
"GeneralUtils.cpp"
"LDFFormat.cpp"
"MD5.cpp"
Expand Down
7 changes: 7 additions & 0 deletions dCommon/Game.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#include "Game.h"

namespace Game {
void OnSignal(int signal) {
lastSignal = signal;
}
}
9 changes: 8 additions & 1 deletion dCommon/Game.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include <string>
#include <random>
#include <csignal>

class dServer;
class Logger;
Expand All @@ -16,6 +17,7 @@ class dZoneManager;
class PlayerContainer;

namespace Game {
using signal_t = volatile std::sig_atomic_t;
extern Logger* logger;
extern dServer* server;
extern InstanceManager* im;
Expand All @@ -25,9 +27,14 @@ namespace Game {
extern RakPeerInterface* chatServer;
extern AssetManager* assetManager;
extern SystemAddress chatSysAddr;
extern bool shouldShutdown;
extern signal_t lastSignal;
extern EntityManager* entityManager;
extern dZoneManager* zoneManager;
extern PlayerContainer playerContainer;
extern std::string projectVersion;

inline bool ShouldShutdown() {
return lastSignal != 0;
}
void OnSignal(int signal);
}
2 changes: 2 additions & 0 deletions dCommon/Logger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
#include <stdarg.h>

Writer::~Writer() {
// Flush before we close
Flush();
// Dont try to close stdcout...
if (!m_Outfile || m_IsConsoleWriter) return;

Expand Down
2 changes: 1 addition & 1 deletion dGame/UserManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ void UserManager::CreateCharacter(const SystemAddress& sysAddr, Packet* packet)
}

//Now that the name is ok, we can get an objectID from Master:
ObjectIDManager::Instance()->RequestPersistentID([=](uint32_t objectID) {
ObjectIDManager::Instance()->RequestPersistentID([=, this](uint32_t objectID) {
if (Database::Get()->GetCharacterInfo(objectID)) {
LOG("Character object id unavailable, check object_id_tracker!");
WorldPackets::SendCharacterCreationResponse(sysAddr, eCharacterCreationResponse::OBJECT_ID_UNAVAILABLE);
Expand Down
6 changes: 3 additions & 3 deletions dGame/dComponents/ActivityComponent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ ActivityComponent::ActivityComponent(Entity* parent, int32_t activityID) : Compo
if (activityID > 0) m_ActivityID = activityID;
else m_ActivityID = parent->GetVar<int32_t>(u"activityID");
CDActivitiesTable* activitiesTable = CDClientManager::Instance().GetTable<CDActivitiesTable>();
std::vector<CDActivities> activities = activitiesTable->Query([=](CDActivities entry) {return (entry.ActivityID == m_ActivityID); });
std::vector<CDActivities> activities = activitiesTable->Query([this](CDActivities entry) {return (entry.ActivityID == m_ActivityID); });

for (CDActivities activity : activities) {
m_ActivityInfo = activity;
Expand Down Expand Up @@ -93,7 +93,7 @@ void ActivityComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsIniti

void ActivityComponent::ReloadConfig() {
CDActivitiesTable* activitiesTable = CDClientManager::Instance().GetTable<CDActivitiesTable>();
std::vector<CDActivities> activities = activitiesTable->Query([=](CDActivities entry) {return (entry.ActivityID == m_ActivityID); });
std::vector<CDActivities> activities = activitiesTable->Query([this](CDActivities entry) {return (entry.ActivityID == m_ActivityID); });
for (auto activity : activities) {
auto mapID = m_ActivityInfo.instanceMapID;
if (static_cast<Leaderboard::Type>(activity.leaderboardType) == Leaderboard::Type::Racing && Game::config->GetValue("solo_racing") == "1") {
Expand Down Expand Up @@ -532,7 +532,7 @@ void ActivityInstance::RewardParticipant(Entity* participant) {

// First, get the activity data
auto* activityRewardsTable = CDClientManager::Instance().GetTable<CDActivityRewardsTable>();
std::vector<CDActivityRewards> activityRewards = activityRewardsTable->Query([=](CDActivityRewards entry) { return (entry.objectTemplate == m_ActivityInfo.ActivityID); });
std::vector<CDActivityRewards> activityRewards = activityRewardsTable->Query([this](CDActivityRewards entry) { return (entry.objectTemplate == m_ActivityInfo.ActivityID); });

if (!activityRewards.empty()) {
uint32_t minCoins = 0;
Expand Down
2 changes: 1 addition & 1 deletion dGame/dComponents/RacingControlComponent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -312,7 +312,7 @@ void RacingControlComponent::OnRequestDie(Entity* player) {
}

// Respawn the player in 2 seconds, as was done in live. Not sure if this value is in a setting somewhere else...
vehicle->AddCallbackTimer(2.0f, [=]() {
vehicle->AddCallbackTimer(2.0f, [=, this]() {
if (!vehicle || !this->m_Parent) return;
GameMessages::SendRacingResetPlayerToLastReset(
m_Parent->GetObjectID(), racingPlayer.playerID,
Expand Down
2 changes: 1 addition & 1 deletion dGame/dInventory/Item.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ bool Item::IsEquipped() const {
bool Item::Consume() {
auto* skillsTable = CDClientManager::Instance().GetTable<CDObjectSkillsTable>();

auto skills = skillsTable->Query([=](const CDObjectSkills entry) {
auto skills = skillsTable->Query([this](const CDObjectSkills entry) {
return entry.objectTemplate == static_cast<uint32_t>(lot);
});

Expand Down
27 changes: 13 additions & 14 deletions dGame/dUtilities/VanityUtilities.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -294,21 +294,20 @@ void VanityUtilities::ParseXML(const std::string& file) {
auto* partyPhrases = npcs->FirstChildElement("partyphrases");

if (partyPhrases == nullptr) {
LOG("Failed to parse party phrases");
return;
}

for (auto* phrase = partyPhrases->FirstChildElement("phrase"); phrase != nullptr;
phrase = phrase->NextSiblingElement("phrase")) {
// Get the phrase
auto* text = phrase->GetText();

if (text == nullptr) {
LOG("Failed to parse party phrase");
continue;
LOG("No party phrases found");
} else {
for (auto* phrase = partyPhrases->FirstChildElement("phrase"); phrase != nullptr;
phrase = phrase->NextSiblingElement("phrase")) {
// Get the phrase
auto* text = phrase->GetText();

if (text == nullptr) {
LOG("Failed to parse party phrase");
continue;
}

m_PartyPhrases.push_back(text);
}

m_PartyPhrases.push_back(text);
}

for (auto* npc = npcs->FirstChildElement("npc"); npc != nullptr; npc = npc->NextSiblingElement("npc")) {
Expand Down
2 changes: 1 addition & 1 deletion dMasterServer/InstanceManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ void InstanceManager::RemoveInstance(Instance* instance) {
if (m_Instances[i] == instance) {
instance->SetShutdownComplete(true);

if (!Game::shouldShutdown) RedirectPendingRequests(instance);
if (!Game::ShouldShutdown()) RedirectPendingRequests(instance);

delete m_Instances[i];

Expand Down
32 changes: 18 additions & 14 deletions dMasterServer/MasterServer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,12 +47,13 @@ namespace Game {
InstanceManager* im = nullptr;
dConfig* config = nullptr;
AssetManager* assetManager = nullptr;
bool shouldShutdown = false;
Game::signal_t lastSignal = 0;
bool universeShutdownRequested = false;
std::mt19937 randomEngine;
} //namespace Game

bool shutdownSequenceStarted = false;
void ShutdownSequence(int32_t signal = -1);
int ShutdownSequence(int32_t signal = -1);
int32_t FinalizeShutdown(int32_t signal = -1);
Logger* SetupLogger();
void HandlePacket(Packet* packet);
Expand All @@ -73,8 +74,8 @@ int main(int argc, char** argv) {

//Triggers the shutdown sequence at application exit
std::atexit([]() { ShutdownSequence(); });
signal(SIGINT, [](int32_t signal) { ShutdownSequence(EXIT_FAILURE); });
signal(SIGTERM, [](int32_t signal) { ShutdownSequence(EXIT_FAILURE); });
std::signal(SIGINT, Game::OnSignal);
std::signal(SIGTERM, Game::OnSignal);

//Create all the objects we need to run our service:
Game::logger = SetupLogger();
Expand Down Expand Up @@ -286,7 +287,7 @@ int main(int argc, char** argv) {
if (Game::config->GetValue("max_clients") != "") maxClients = std::stoi(Game::config->GetValue("max_clients"));
if (Game::config->GetValue("port") != "") ourPort = std::stoi(Game::config->GetValue("port"));

Game::server = new dServer(Game::config->GetValue("external_ip"), ourPort, 0, maxClients, true, false, Game::logger, "", 0, ServerType::Master, Game::config, &Game::shouldShutdown);
Game::server = new dServer(Game::config->GetValue("external_ip"), ourPort, 0, maxClients, true, false, Game::logger, "", 0, ServerType::Master, Game::config, &Game::lastSignal);

//Query for the database for a server labeled "master"

Expand Down Expand Up @@ -321,7 +322,8 @@ int main(int argc, char** argv) {
uint32_t framesSinceLastSQLPing = 0;
uint32_t framesSinceKillUniverseCommand = 0;

while (true) {
Game::logger->Flush();
while (!Game::ShouldShutdown()) {
//In world we'd update our other systems here.

//Check for packets here:
Expand Down Expand Up @@ -355,10 +357,10 @@ int main(int argc, char** argv) {
framesSinceLastSQLPing++;

//10m shutdown for universe kill command
if (Game::shouldShutdown) {
if (Game::universeShutdownRequested) {
if (framesSinceKillUniverseCommand >= shutdownUniverseTime) {
//Break main loop and exit
break;
Game::lastSignal = -1;
} else
framesSinceKillUniverseCommand++;
}
Expand Down Expand Up @@ -402,7 +404,7 @@ int main(int argc, char** argv) {
t += std::chrono::milliseconds(masterFrameDelta);
std::this_thread::sleep_until(t);
}
return FinalizeShutdown(EXIT_SUCCESS);
return ShutdownSequence(EXIT_SUCCESS);
}

Logger* SetupLogger() {
Expand Down Expand Up @@ -799,7 +801,7 @@ void HandlePacket(Packet* packet) {

case eMasterMessageType::SHUTDOWN_UNIVERSE: {
LOG("Received shutdown universe command, shutting down in 10 minutes.");
Game::shouldShutdown = true;
Game::universeShutdownRequested = true;
break;
}

Expand All @@ -809,9 +811,11 @@ void HandlePacket(Packet* packet) {
}
}

void ShutdownSequence(int32_t signal) {
int ShutdownSequence(int32_t signal) {
LOG("Recieved Signal %d", signal);
if (shutdownSequenceStarted) {
return;
LOG("Duplicate Shutdown Sequence");
return -1;
}

if (!Game::im) {
Expand All @@ -820,7 +824,7 @@ void ShutdownSequence(int32_t signal) {

Game::im->SetIsShuttingDown(true);
shutdownSequenceStarted = true;
Game::shouldShutdown = true;
Game::lastSignal = -1;

{
CBITSTREAM;
Expand Down Expand Up @@ -889,7 +893,7 @@ void ShutdownSequence(int32_t signal) {
}
}

FinalizeShutdown(signal);
return FinalizeShutdown(signal);
}

int32_t FinalizeShutdown(int32_t signal) {
Expand Down
4 changes: 2 additions & 2 deletions dMasterServer/Start.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include "BinaryPathFinder.h"

void StartChatServer() {
if (Game::shouldShutdown) {
if (Game::ShouldShutdown()) {
LOG("Currently shutting down. Chat will not be restarted.");
return;
}
Expand All @@ -24,7 +24,7 @@ void StartChatServer() {
}

void StartAuthServer() {
if (Game::shouldShutdown) {
if (Game::ShouldShutdown()) {
LOG("Currently shutting down. Auth will not be restarted.");
return;
}
Expand Down
Loading

0 comments on commit f7664ad

Please sign in to comment.