#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()>> g_Handlers = { {MessageType::Server::VERSION_CONFIRM, []() { return std::make_unique(); }}, {MessageType::Server::DISCONNECT_NOTIFY, []() { return std::make_unique(); }}, {MessageType::Server::GENERAL_NOTIFY, []() { return std::make_unique(); }} }; // Struct Functions void CommonLUBitStream::Serialize(RakNet::BitStream& bitStream) const { bitStream.Write(this->messageType); bitStream.Write(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(netVersion); bitStream.Write(861228100); bitStream.Write(static_cast(serviceType)); bitStream.Write(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(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); } }