This commit is contained in:
Aaron Kimbrell
2026-02-24 20:35:09 -06:00
parent f1847d1f20
commit 910b92ffc7
24 changed files with 883 additions and 180 deletions

View File

@@ -0,0 +1,68 @@
#include "DashboardPacketHandler.h"
#include "BitStreamUtils.h"
#include "Logger.h"
#include "Game.h"
#include "handlers/MasterPacketHandler.h"
#include <functional>
#include <map>
namespace DashboardPacketHandler {
std::map<ServiceType, std::function<void()>> g_ServiceHandlers;
void DashboardNewIncomingConnection::Handle() {
LOG_DEBUG("DashboardPacketHandler: New incoming connection from %s", sysAddr.ToString(true));
}
void DashboardDisconnectionNotification::Handle() {
LOG_DEBUG("DashboardPacketHandler: Disconnection notification from %s", sysAddr.ToString(true));
}
void DashboardConnectionLost::Handle() {
LOG_DEBUG("DashboardPacketHandler: Connection lost with %s", sysAddr.ToString(true));
}
void DashboardConnectedPong::Handle() {
LOG_DEBUG("DashboardPacketHandler: Received pong from %s", sysAddr.ToString(true));
}
void DashboardUserPacketEnum::Handle() {
const auto it = g_ServiceHandlers.find(serviceType);
if (it != g_ServiceHandlers.end()) {
it->second();
} else {
LOG_DEBUG("DashboardPacketHandler: No handler registered for service type %u from %s", static_cast<uint16_t>(serviceType), sysAddr.ToString(true));
}
}
bool DashboardUserPacketEnum::Deserialize(RakNet::BitStream& bitStream) {
if (!PacketHandler::UserPacketEnum::Deserialize(bitStream)) {
return false;
}
VALIDATE_READ(bitStream.Read(serviceType));
return true;
}
void RegisterDashboardHandlers() {
// Override the default handlers with dashboard-specific implementations
PacketHandler::g_Handlers[ID_NEW_INCOMING_CONNECTION] = []() {
return std::make_unique<DashboardNewIncomingConnection>();
};
PacketHandler::g_Handlers[ID_DISCONNECTION_NOTIFICATION] = []() {
return std::make_unique<DashboardDisconnectionNotification>();
};
PacketHandler::g_Handlers[ID_CONNECTION_LOST] = []() {
return std::make_unique<DashboardConnectionLost>();
};
PacketHandler::g_Handlers[ID_CONNECTED_PONG] = []() {
return std::make_unique<DashboardConnectedPong>();
};
PacketHandler::g_Handlers[ID_USER_PACKET_ENUM] = []() {
return std::make_unique<DashboardUserPacketEnum>();
};
// Register service type handlers
}
}

View File

@@ -0,0 +1,37 @@
#pragma once
#include "PacketHandler.h"
#include "ServiceType.h"
namespace DashboardPacketHandler {
// Dashboard-specific implementations of RakNet packet handlers
struct DashboardNewIncomingConnection : public PacketHandler::NewIncomingConnection {
void Handle() override;
};
struct DashboardDisconnectionNotification : public PacketHandler::DisconnectionNotification {
void Handle() override;
};
struct DashboardConnectionLost : public PacketHandler::ConnectionLost {
void Handle() override;
};
struct DashboardConnectedPong : public PacketHandler::ConnectedPong {
void Handle() override;
};
struct DashboardUserPacketEnum : public PacketHandler::UserPacketEnum {
ServiceType serviceType{};
bool Deserialize(RakNet::BitStream& bitStream);
void Handle() override;
};
// Initialize dashboard-specific packet handlers
void RegisterDashboardHandlers();
}

View File

@@ -0,0 +1,157 @@
#include "MasterPacketHandler.h"
#include "BitStreamUtils.h"
#include "dServer.h"
#include "Game.h"
#include "Logger.h"
#include "RakNetTypes.h"
#include "ServerState.h"
#include <chrono>
namespace MasterPacketHandler {
std::map<MessageType::Master, std::function<std::unique_ptr<MasterPacket>()>> g_Handlers = {
{MessageType::Master::SERVER_INFO, []() {
return std::make_unique<ServerInfo>();
}},
{MessageType::Master::PLAYER_ADDED, []() {
return std::make_unique<PlayerAdded>();
}},
{MessageType::Master::PLAYER_REMOVED, []() {
return std::make_unique<PlayerRemoved>();
}},
{MessageType::Master::SHUTDOWN_RESPONSE, []() {
return std::make_unique<ShutdownResponse>();
}},
{MessageType::Master::SHUTDOWN, []() {
return std::make_unique<Shutdown>();
}},
};
bool ServerInfo::Deserialize(RakNet::BitStream& bitStream) {
VALIDATE_READ(bitStream.Read(port));
VALIDATE_READ(bitStream.Read(zoneID));
VALIDATE_READ(bitStream.Read(instanceID));
VALIDATE_READ(bitStream.Read(serverType));
LUString ipStr{};
VALIDATE_READ(bitStream.Read(ipStr));
ip = ipStr.string;
return true;
}
void ServerInfo::Handle() {
LOG("MasterPacketHandler: Processing SERVER_INFO for service type %i, zone %u, instance %u, port %u", serverType, zoneID, instanceID, port);
switch (serverType) {
case ServiceType::AUTH:
ServerState::g_AuthStatus.online = true;
ServerState::g_AuthStatus.lastSeen = std::chrono::steady_clock::now();
LOG("Updated Auth server status: online");
break;
case ServiceType::CHAT:
ServerState::g_ChatStatus.online = true;
ServerState::g_ChatStatus.lastSeen = std::chrono::steady_clock::now();
LOG("Updated Chat server status: online");
break;
case ServiceType::WORLD: {
// Update or add world instance
bool found = false;
for (auto& world : ServerState::g_WorldInstances) {
if (world.mapID == zoneID && world.instanceID == instanceID) {
world.ip = ip;
world.port = port;
found = true;
break;
}
}
if (!found) {
WorldInstanceInfo info{};
info.mapID = zoneID;
info.instanceID = instanceID;
info.cloneID = 0;
info.players = 0;
info.ip = ip;
info.port = port;
info.isPrivate = false;
ServerState::g_WorldInstances.push_back(info);
LOG("Added world instance: map %u instance %u", zoneID, instanceID);
}
break;
}
default:
break;
}
}
bool PlayerAdded::Deserialize(RakNet::BitStream& bitStream) {
VALIDATE_READ(bitStream.Read(zoneID));
VALIDATE_READ(bitStream.Read(instanceID));
return true;
}
void PlayerAdded::Handle() {
for (auto& world : ServerState::g_WorldInstances) {
if (world.mapID == zoneID && world.instanceID == instanceID) {
world.players++;
LOG_DEBUG("Player added to map %u instance %u, now %u players", zoneID, instanceID, world.players);
break;
}
}
}
bool PlayerRemoved::Deserialize(RakNet::BitStream& bitStream) {
VALIDATE_READ(bitStream.Read(zoneID));
VALIDATE_READ(bitStream.Read(instanceID));
return true;
}
void PlayerRemoved::Handle() {
for (auto& world : ServerState::g_WorldInstances) {
if (world.mapID == zoneID && world.instanceID == instanceID) {
if (world.players > 0) world.players--;
LOG_DEBUG("Player removed from map %u instance %u, now %u players", zoneID, instanceID, world.players);
break;
}
}
}
bool ShutdownResponse::Deserialize(RakNet::BitStream& bitStream) {
VALIDATE_READ(bitStream.Read(zoneID));
VALIDATE_READ(bitStream.Read(instanceID));
VALIDATE_READ(bitStream.Read(serverType));
return true;
}
void ShutdownResponse::Handle() {
switch (serverType) {
case ServiceType::AUTH:
ServerState::g_AuthStatus.online = false;
LOG_DEBUG("Auth server shutdown");
break;
case ServiceType::CHAT:
ServerState::g_ChatStatus.online = false;
LOG_DEBUG("Chat server shutdown");
break;
case ServiceType::WORLD:
for (auto it = ServerState::g_WorldInstances.begin(); it != ServerState::g_WorldInstances.end(); ++it) {
if (it->mapID == zoneID && it->instanceID == instanceID) {
ServerState::g_WorldInstances.erase(it);
LOG_DEBUG("Removed shutdown instance: map %u instance %u", zoneID, instanceID);
break;
}
}
break;
default:
break;
}
}
bool Shutdown::Deserialize(RakNet::BitStream& bitStream) {
// SHUTDOWN message has no additional data
return true;
}
void Shutdown::Handle() {
LOG("Received SHUTDOWN command from Master");
Game::lastSignal = -1; // Trigger shutdown
}
}

View File

@@ -0,0 +1,79 @@
#pragma once
#include <functional>
#include <map>
#include <memory>
#include "dCommonVars.h"
#include "MessageType/Master.h"
#include "BitStream.h"
struct Packet;
namespace MasterPacketHandler {
// Base class for all master packet handlers
class MasterPacket {
public:
virtual ~MasterPacket() = default;
virtual bool Deserialize(RakNet::BitStream& bitStream) = 0;
virtual void Handle() = 0;
};
// SERVER_INFO packet handler
class ServerInfo : public MasterPacket {
public:
bool Deserialize(RakNet::BitStream& bitStream) override;
void Handle() override;
private:
uint32_t port{0};
uint32_t zoneID{0};
uint32_t instanceID{0};
ServiceType serverType{};
std::string ip{};
};
// PLAYER_ADDED packet handler
class PlayerAdded : public MasterPacket {
public:
bool Deserialize(RakNet::BitStream& bitStream) override;
void Handle() override;
private:
LWOMAPID zoneID{};
LWOINSTANCEID instanceID{};
};
// PLAYER_REMOVED packet handler
class PlayerRemoved : public MasterPacket {
public:
bool Deserialize(RakNet::BitStream& bitStream) override;
void Handle() override;
private:
LWOMAPID zoneID{};
LWOINSTANCEID instanceID{};
};
// SHUTDOWN_RESPONSE packet handler
class ShutdownResponse : public MasterPacket {
public:
bool Deserialize(RakNet::BitStream& bitStream) override;
void Handle() override;
private:
uint32_t zoneID{};
uint32_t instanceID{};
ServiceType serverType{};
};
// SHUTDOWN packet handler
class Shutdown : public MasterPacket {
public:
bool Deserialize(RakNet::BitStream& bitStream) override;
void Handle() override;
};
// Master packet handler registry
extern std::map<MessageType::Master, std::function<std::unique_ptr<MasterPacket>()>> g_Handlers;
}