mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-03-01 14:19:47 +00:00
WIP
This commit is contained in:
68
dDashboardServer/handlers/DashboardPacketHandler.cpp
Normal file
68
dDashboardServer/handlers/DashboardPacketHandler.cpp
Normal 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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
37
dDashboardServer/handlers/DashboardPacketHandler.h
Normal file
37
dDashboardServer/handlers/DashboardPacketHandler.h
Normal 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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
157
dDashboardServer/handlers/MasterPacketHandler.cpp
Normal file
157
dDashboardServer/handlers/MasterPacketHandler.cpp
Normal 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
|
||||
}
|
||||
}
|
||||
79
dDashboardServer/handlers/MasterPacketHandler.h
Normal file
79
dDashboardServer/handlers/MasterPacketHandler.h
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user