diagnostics

log checksum

Update WorldServer.cpp

Update WorldServer.cpp

lotta this

Update WorldServer.cpp

Update WorldServer.cpp

Update WorldServer.cpp

Update Logger.cpp

logs

Update WorldServer.cpp
This commit is contained in:
EmosewaMC 2024-12-26 02:30:04 -08:00 committed by David Markowitz
parent 0c948a8df6
commit c305af7172
3 changed files with 126 additions and 123 deletions

View File

@ -1,7 +1,7 @@
#include "Diagnostics.h" #include "Diagnostics.h"
#include "Game.h" #include "Game.h"
#include "Logger.h" #include "Logger.h"
#define _XOPEN_SOURCE
// If we're on Win32, we'll include our minidump writer // If we're on Win32, we'll include our minidump writer
#ifdef _WIN32 #ifdef _WIN32
@ -60,7 +60,7 @@ LONG CALLBACK unhandled_handler(EXCEPTION_POINTERS* e) {
} }
#endif #endif
#if defined(__linux__) //&& !defined(__clang__) // backtrace is a gcc exclusive system library // #if defined(__linux__) //&& !defined(__clang__) // backtrace is a gcc exclusive system library
#include <execinfo.h> #include <execinfo.h>
#include <ucontext.h> #include <ucontext.h>
#include <unistd.h> #include <unistd.h>
@ -219,16 +219,16 @@ void MakeBacktrace() {
std::set_terminate(OnTerminate); std::set_terminate(OnTerminate);
} }
#endif // #endif
void Diagnostics::Initialize() { void Diagnostics::Initialize() {
#ifdef _WIN32 // #ifdef _WIN32
SetUnhandledExceptionFilter(unhandled_handler); // SetUnhandledExceptionFilter(unhandled_handler);
#elif defined(__linux__) //&& !defined(__clang__) // #elif defined(__linux__) //&& !defined(__clang__)
MakeBacktrace(); MakeBacktrace();
#else // #else
fprintf(stderr, "Diagnostics not supported on this platform.\n"); // fprintf(stderr, "Diagnostics not supported on this platform.\n");
#endif // #endif
} }
std::string Diagnostics::m_ProcessName{}; std::string Diagnostics::m_ProcessName{};

View File

@ -58,6 +58,7 @@ void Logger::vLog(const char* format, va_list args) {
for (const auto& writer : m_Writers) { for (const auto& writer : m_Writers) {
writer->Log(timeStr, message); writer->Log(timeStr, message);
} }
Flush();
} }
void Logger::Log(const char* className, const char* format, ...) { void Logger::Log(const char* className, const char* format, ...) {

View File

@ -267,8 +267,6 @@ int main(int argc, char** argv) {
// pre calculate the FDB checksum // pre calculate the FDB checksum
if (Game::config->GetValue("check_fdb") == "1") { if (Game::config->GetValue("check_fdb") == "1") {
std::ifstream fileStream;
static const std::vector<std::string> aliases = { static const std::vector<std::string> aliases = {
"CDServers.fdb", "CDServers.fdb",
"cdserver.fdb", "cdserver.fdb",
@ -277,31 +275,29 @@ int main(int argc, char** argv) {
}; };
for (const auto& file : aliases) { for (const auto& file : aliases) {
fileStream.open(Game::assetManager->GetResPath() / file, std::ios::binary | std::ios::in); auto cdclient = Game::assetManager->GetFile("cdclient.fdb");
if (fileStream.is_open()) { if (cdclient) {
const int32_t bufferSize = 1024;
MD5 md5;
char fileStreamBuffer[1024] = {};
while (!cdclient.eof()) {
memset(fileStreamBuffer, 0, bufferSize);
cdclient.read(fileStreamBuffer, bufferSize);
md5.update(fileStreamBuffer, cdclient.gcount());
}
const char* nullTerminateBuffer = "\0";
md5.update(nullTerminateBuffer, 1); // null terminate the data
md5.finalize();
databaseChecksum = md5.hexdigest();
LOG("FDB Checksum calculated as: %s", databaseChecksum.c_str());
break; break;
} }
} }
const int32_t bufferSize = 1024;
MD5 md5;
char fileStreamBuffer[1024] = {};
while (!fileStream.eof()) {
memset(fileStreamBuffer, 0, bufferSize);
fileStream.read(fileStreamBuffer, bufferSize);
md5.update(fileStreamBuffer, fileStream.gcount());
}
fileStream.close();
const char* nullTerminateBuffer = "\0";
md5.update(nullTerminateBuffer, 1); // null terminate the data
md5.finalize();
databaseChecksum = md5.hexdigest();
LOG("FDB Checksum calculated as: %s", databaseChecksum.c_str());
} }
uint32_t currentFrameDelta = highFrameDelta; uint32_t currentFrameDelta = highFrameDelta;
@ -548,115 +544,115 @@ void HandlePacketChat(Packet* packet) {
if (packet->data[0] == ID_USER_PACKET_ENUM && packet->length >= 4) { if (packet->data[0] == ID_USER_PACKET_ENUM && packet->length >= 4) {
if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::CHAT) { if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::CHAT) {
switch (static_cast<MessageType::Chat>(packet->data[3])) { switch (static_cast<MessageType::Chat>(packet->data[3])) {
case MessageType::Chat::WORLD_ROUTE_PACKET: { case MessageType::Chat::WORLD_ROUTE_PACKET: {
CINSTREAM_SKIP_HEADER; CINSTREAM_SKIP_HEADER;
LWOOBJID playerID; LWOOBJID playerID;
inStream.Read(playerID); inStream.Read(playerID);
auto player = Game::entityManager->GetEntity(playerID); auto player = Game::entityManager->GetEntity(playerID);
if (!player) return; if (!player) return;
auto sysAddr = player->GetSystemAddress(); auto sysAddr = player->GetSystemAddress();
//Write our stream outwards: //Write our stream outwards:
CBITSTREAM; CBITSTREAM;
unsigned char data; unsigned char data;
while (inStream.Read(data)) { while (inStream.Read(data)) {
bitStream.Write(data); bitStream.Write(data);
}
SEND_PACKET; //send routed packet to player
break;
} }
case MessageType::Chat::GM_ANNOUNCE: { SEND_PACKET; //send routed packet to player
CINSTREAM_SKIP_HEADER; break;
}
std::string title; case MessageType::Chat::GM_ANNOUNCE: {
std::string msg; CINSTREAM_SKIP_HEADER;
uint32_t len; std::string title;
inStream.Read<uint32_t>(len); std::string msg;
for (uint32_t i = 0; len > i; i++) {
char character;
inStream.Read<char>(character);
title += character;
}
len = 0; uint32_t len;
inStream.Read<uint32_t>(len); inStream.Read<uint32_t>(len);
for (uint32_t i = 0; len > i; i++) { for (uint32_t i = 0; len > i; i++) {
char character; char character;
inStream.Read<char>(character); inStream.Read<char>(character);
msg += character; title += character;
} }
//Send to our clients: len = 0;
AMFArrayValue args; inStream.Read<uint32_t>(len);
for (uint32_t i = 0; len > i; i++) {
char character;
inStream.Read<char>(character);
msg += character;
}
args.Insert("title", title); //Send to our clients:
args.Insert("message", msg); AMFArrayValue args;
GameMessages::SendUIMessageServerToAllClients("ToggleAnnounce", args); args.Insert("title", title);
args.Insert("message", msg);
GameMessages::SendUIMessageServerToAllClients("ToggleAnnounce", args);
break;
}
case MessageType::Chat::GM_MUTE: {
CINSTREAM_SKIP_HEADER;
LWOOBJID playerId;
time_t expire = 0;
inStream.Read(playerId);
inStream.Read(expire);
auto* entity = Game::entityManager->GetEntity(playerId);
auto* character = entity != nullptr ? entity->GetCharacter() : nullptr;
auto* user = character != nullptr ? character->GetParentUser() : nullptr;
if (user) {
user->SetMuteExpire(expire);
entity->GetCharacter()->SendMuteNotice();
}
break;
}
case MessageType::Chat::TEAM_GET_STATUS: {
CINSTREAM_SKIP_HEADER;
LWOOBJID teamID = 0;
char lootOption = 0;
char memberCount = 0;
std::vector<LWOOBJID> members;
inStream.Read(teamID);
bool deleteTeam = inStream.ReadBit();
if (deleteTeam) {
TeamManager::Instance()->DeleteTeam(teamID);
LOG("Deleting team (%llu)", teamID);
break; break;
} }
case MessageType::Chat::GM_MUTE: { inStream.Read(lootOption);
CINSTREAM_SKIP_HEADER; inStream.Read(memberCount);
LWOOBJID playerId; LOG("Updating team (%llu), (%i), (%i)", teamID, lootOption, memberCount);
time_t expire = 0; for (char i = 0; i < memberCount; i++) {
inStream.Read(playerId); LWOOBJID member = LWOOBJID_EMPTY;
inStream.Read(expire); inStream.Read(member);
members.push_back(member);
auto* entity = Game::entityManager->GetEntity(playerId); LOG("Updating team member (%llu)", member);
auto* character = entity != nullptr ? entity->GetCharacter() : nullptr;
auto* user = character != nullptr ? character->GetParentUser() : nullptr;
if (user) {
user->SetMuteExpire(expire);
entity->GetCharacter()->SendMuteNotice();
}
break;
} }
case MessageType::Chat::TEAM_GET_STATUS: { TeamManager::Instance()->UpdateTeam(teamID, lootOption, members);
CINSTREAM_SKIP_HEADER;
LWOOBJID teamID = 0; break;
char lootOption = 0; }
char memberCount = 0; default:
std::vector<LWOOBJID> members; LOG("Received an unknown chat: %i", int(packet->data[3]));
inStream.Read(teamID);
bool deleteTeam = inStream.ReadBit();
if (deleteTeam) {
TeamManager::Instance()->DeleteTeam(teamID);
LOG("Deleting team (%llu)", teamID);
break;
}
inStream.Read(lootOption);
inStream.Read(memberCount);
LOG("Updating team (%llu), (%i), (%i)", teamID, lootOption, memberCount);
for (char i = 0; i < memberCount; i++) {
LWOOBJID member = LWOOBJID_EMPTY;
inStream.Read(member);
members.push_back(member);
LOG("Updating team member (%llu)", member);
}
TeamManager::Instance()->UpdateTeam(teamID, lootOption, members);
break;
}
default:
LOG("Received an unknown chat: %i", int(packet->data[3]));
} }
} }
} }
@ -869,10 +865,12 @@ void HandlePacket(Packet* packet) {
Game::server->Disconnect(packet->systemAddress, eServerDisconnectIdentifiers::CHARACTER_NOT_FOUND); Game::server->Disconnect(packet->systemAddress, eServerDisconnectIdentifiers::CHARACTER_NOT_FOUND);
return; return;
} }
LOG("server %s client %s", databaseChecksum.c_str(), clientDatabaseChecksum.string.c_str());
// Developers may skip this check // Developers may skip this check
if (clientDatabaseChecksum.string != databaseChecksum) { if (clientDatabaseChecksum.string != databaseChecksum) {
LOG("");
if (accountInfo->maxGmLevel < eGameMasterLevel::DEVELOPER) { if (accountInfo->maxGmLevel < eGameMasterLevel::DEVELOPER) {
LOG("Client's database checksum does not match the server's, aborting connection."); LOG("Client's database checksum does not match the server's, aborting connection.");
std::vector<Stamp> stamps; std::vector<Stamp> stamps;
@ -884,6 +882,7 @@ void HandlePacket(Packet* packet) {
Game::config->GetValue("cdclient_mismatch_message"), "", 0, "", stamps); Game::config->GetValue("cdclient_mismatch_message"), "", 0, "", stamps);
return; return;
} else { } else {
LOG("");
AMFArrayValue args; AMFArrayValue args;
args.Insert("title", Game::config->GetValue("cdclient_mismatch_title")); args.Insert("title", Game::config->GetValue("cdclient_mismatch_title"));
@ -896,18 +895,21 @@ void HandlePacket(Packet* packet) {
} }
} }
LOG("");
//Request the session info from Master: //Request the session info from Master:
CBITSTREAM; CBITSTREAM;
BitStreamUtils::WriteHeader(bitStream, eConnectionType::MASTER, MessageType::Master::REQUEST_SESSION_KEY); BitStreamUtils::WriteHeader(bitStream, eConnectionType::MASTER, MessageType::Master::REQUEST_SESSION_KEY);
bitStream.Write(username); bitStream.Write(username);
Game::server->SendToMaster(bitStream); Game::server->SendToMaster(bitStream);
LOG("");
//Insert info into our pending list //Insert info into our pending list
tempSessionInfo info; tempSessionInfo info;
info.sysAddr = SystemAddress(packet->systemAddress); info.sysAddr = SystemAddress(packet->systemAddress);
info.hash = sessionKey.GetAsString(); info.hash = sessionKey.GetAsString();
m_PendingUsers.insert(std::make_pair(username.GetAsString(), info)); m_PendingUsers.insert(std::make_pair(username.GetAsString(), info));
LOG("");
break; break;
} }