Files
DarkflameServer/dNet/CommonPackets.cpp
2025-09-12 23:25:49 -05:00

101 lines
3.3 KiB
C++

#include "CommonPackets.h"
#include "dServer.h"
#include "Logger.h"
#include "Game.h"
#include "dServer.h"
#include "dConfig.h"
#include "StringifiedEnum.h"
#include "GeneralUtils.h"
namespace CommonPackets {
std::map<MessageType::Server, std::function<std::unique_ptr<LUBitStream>()>> g_Handlers = {
{MessageType::Server::VERSION_CONFIRM, []() {
return std::make_unique<VersionConfirm>();
}},
{MessageType::Server::DISCONNECT_NOTIFY, []() {
return std::make_unique<DisconnectNotify>();
}},
{MessageType::Server::GENERAL_NOTIFY, []() {
return std::make_unique<GeneralNotify>();
}}
};
// Struct Functions
void CommonLUBitStream::Serialize(RakNet::BitStream& bitStream) const {
bitStream.Write(this->messageType);
bitStream.Write<uint8_t>(0); // padding
}
bool CommonLUBitStream::Deserialize(RakNet::BitStream& bitStream) {
VALIDATE_READ(bitStream.Read(this->messageType));
uint8_t padding = 0;
VALIDATE_READ(bitStream.Read(padding));
return true;
}
void VersionConfirm::Serialize(RakNet::BitStream& bitStream) const {
CommonLUBitStream::Serialize(bitStream);
bitStream.Write<uint32_t>(netVersion);
bitStream.Write<uint32_t>(861228100);
bitStream.Write(static_cast<uint32_t>(serviceType));
bitStream.Write<uint64_t>(219818307120);
}
bool VersionConfirm::Deserialize(RakNet::BitStream& bitStream) {
VALIDATE_READ(bitStream.Read(netVersion));
uint32_t unknown = 0;
VALIDATE_READ(bitStream.Read(unknown));
VALIDATE_READ(bitStream.Read(serviceType));
uint16_t unknown2 = 0;
VALIDATE_READ(bitStream.Read(unknown2));
VALIDATE_READ(bitStream.Read(processID));
VALIDATE_READ(bitStream.Read(port));
LUString unknownString;
VALIDATE_READ(bitStream.Read(unknownString));
return true;
}
void VersionConfirm::Handle() {
LOG_DEBUG("Client Data [Version: %i, Service: %s, Process: %u, Port: %u, Sysaddr Port: %u]", netVersion, StringifiedEnum::ToString(serviceType).data(), processID, port, sysAddr.port);
VersionConfirm response;
auto& serverNetVersionString = Game::config->GetValue("client_net_version");
const uint32_t serverNetVersion = GeneralUtils::TryParse<uint32_t>(serverNetVersionString).value_or(171022);
response.netVersion = serverNetVersion;
response.serviceType = Game::server->GetServerType();
response.Send(sysAddr);
}
void DisconnectNotify::Serialize(RakNet::BitStream& bitStream) const {
CommonLUBitStream::Serialize(bitStream);
bitStream.Write(disconnectID);
}
void GeneralNotify::Serialize(RakNet::BitStream& bitStream) const {
CommonLUBitStream::Serialize(bitStream);
bitStream.Write(notifyID);
bitStream.Write(notifyUser);
}
}
void CommonPackets::Handle(RakNet::BitStream& inStream, const SystemAddress& sysAddr) {
CommonLUBitStream lubitstream;
if (!lubitstream.Deserialize(inStream)) return;
auto it = g_Handlers.find(lubitstream.messageType);
if (it != g_Handlers.end()) {
auto request = it->second();
request->sysAddr = sysAddr;
if (!request->Deserialize(inStream)) {
LOG_DEBUG("Error Reading Common Packet: %s", StringifiedEnum::ToString(lubitstream.messageType).data());
return;
}
LOG_DEBUG("Received Common Packet: %s", StringifiedEnum::ToString(lubitstream.messageType).data());
request->Handle();
} else {
LOG_DEBUG("Unhandled Common Packet with ID: %i", lubitstream.messageType);
}
}