From 56286640606f756294a2d52d4d77d6bb61518191 Mon Sep 17 00:00:00 2001 From: Aronwk Date: Fri, 16 May 2025 18:17:28 -0500 Subject: [PATCH] things switched, just gotta move the handle's --- dCommon/PositionUpdate.h | 36 ------ dGame/Entity.cpp | 6 +- dGame/Entity.h | 7 +- .../HavokVehiclePhysicsComponent.cpp | 2 +- .../HavokVehiclePhysicsComponent.h | 6 +- dNet/ClientPackets.cpp | 109 ----------------- dNet/ClientPackets.h | 18 --- dNet/WorldPackets.cpp | 112 +++++++++++++++++- dNet/WorldPackets.h | 50 ++++++++ dWorldServer/WorldServer.cpp | 12 +- 10 files changed, 179 insertions(+), 179 deletions(-) delete mode 100644 dCommon/PositionUpdate.h diff --git a/dCommon/PositionUpdate.h b/dCommon/PositionUpdate.h deleted file mode 100644 index f28c682d..00000000 --- a/dCommon/PositionUpdate.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef __POSITIONUPDATE__H__ -#define __POSITIONUPDATE__H__ - -#include "NiPoint3.h" -#include "NiQuaternion.h" - - -struct RemoteInputInfo { - bool operator==(const RemoteInputInfo& other) { - return m_RemoteInputX == other.m_RemoteInputX && m_RemoteInputY == other.m_RemoteInputY && m_IsPowersliding == other.m_IsPowersliding && m_IsModified == other.m_IsModified; - } - - float m_RemoteInputX = 0; - float m_RemoteInputY = 0; - bool m_IsPowersliding = false; - bool m_IsModified = false; -}; - -struct LocalSpaceInfo { - LWOOBJID objectId = LWOOBJID_EMPTY; - NiPoint3 position = NiPoint3Constant::ZERO; - NiPoint3 linearVelocity = NiPoint3Constant::ZERO; -}; - -struct PositionUpdate { - NiPoint3 position = NiPoint3Constant::ZERO; - NiQuaternion rotation = NiQuaternionConstant::IDENTITY; - bool onGround = false; - bool onRail = false; - NiPoint3 velocity = NiPoint3Constant::ZERO; - NiPoint3 angularVelocity = NiPoint3Constant::ZERO; - LocalSpaceInfo localSpaceInfo; - RemoteInputInfo remoteInputInfo; -}; - -#endif //!__POSITIONUPDATE__H__ diff --git a/dGame/Entity.cpp b/dGame/Entity.cpp index 35cd10fb..226a7eeb 100644 --- a/dGame/Entity.cpp +++ b/dGame/Entity.cpp @@ -23,9 +23,9 @@ #include "eMissionTaskType.h" #include "eTriggerEventType.h" #include "eObjectBits.h" -#include "PositionUpdate.h" #include "MessageType/Chat.h" #include "PlayerManager.h" +#include "WorldPackets.h" //Component includes: #include "Component.h" @@ -99,7 +99,7 @@ #include -Observable Entity::OnPlayerPositionUpdate; +Observable Entity::OnPlayerPositionUpdate; Entity::Entity(const LWOOBJID& objectID, EntityInfo info, User* parentUser, Entity* parentEntity) { m_ObjectID = objectID; @@ -2112,7 +2112,7 @@ uint8_t Entity::GetCollectibleID() const { return collectible ? collectible->GetCollectibleId() : 0; } -void Entity::ProcessPositionUpdate(PositionUpdate& update) { +void Entity::ProcessPositionUpdate(WorldPackets::PositionUpdate& update) { if (!IsPlayer()) return; auto* controllablePhysicsComponent = GetComponent(); if (!controllablePhysicsComponent) return; diff --git a/dGame/Entity.h b/dGame/Entity.h index 700672c3..b3d3e500 100644 --- a/dGame/Entity.h +++ b/dGame/Entity.h @@ -20,6 +20,9 @@ namespace GameMessages { struct ChildLoaded; struct PlayerResurrectionFinished; }; +namespace WorldPackets { + struct PositionUpdate; +}; namespace MessageType { enum class Game : uint16_t; @@ -316,7 +319,7 @@ public: Entity* GetScheduledKiller() { return m_ScheduleKiller; } - void ProcessPositionUpdate(PositionUpdate& update); + void ProcessPositionUpdate(WorldPackets::PositionUpdate& update); // Scale will only be communicated to the client when the construction packet is sent void SetScale(const float scale) { m_Scale = scale; }; @@ -328,7 +331,7 @@ public: /** * @brief The observable for player entity position updates. */ - static Observable OnPlayerPositionUpdate; + static Observable OnPlayerPositionUpdate; protected: LWOOBJID m_ObjectID; diff --git a/dGame/dComponents/HavokVehiclePhysicsComponent.cpp b/dGame/dComponents/HavokVehiclePhysicsComponent.cpp index e977f952..4b3c70ce 100644 --- a/dGame/dComponents/HavokVehiclePhysicsComponent.cpp +++ b/dGame/dComponents/HavokVehiclePhysicsComponent.cpp @@ -34,7 +34,7 @@ void HavokVehiclePhysicsComponent::SetIsOnRail(bool val) { m_IsOnRail = val; } -void HavokVehiclePhysicsComponent::SetRemoteInputInfo(const RemoteInputInfo& remoteInputInfo) { +void HavokVehiclePhysicsComponent::SetRemoteInputInfo(const WorldPackets::PositionUpdate::RemoteInputInfo& remoteInputInfo) { if (remoteInputInfo == m_RemoteInputInfo) return; this->m_RemoteInputInfo = remoteInputInfo; m_DirtyPosition = true; diff --git a/dGame/dComponents/HavokVehiclePhysicsComponent.h b/dGame/dComponents/HavokVehiclePhysicsComponent.h index ad6087a7..f25930a9 100644 --- a/dGame/dComponents/HavokVehiclePhysicsComponent.h +++ b/dGame/dComponents/HavokVehiclePhysicsComponent.h @@ -4,7 +4,7 @@ #include "Entity.h" #include "PhysicsComponent.h" #include "eReplicaComponentType.h" -#include "PositionUpdate.h" +#include "WorldPackets.h" /** * Physics component for vehicles. @@ -65,7 +65,7 @@ public: */ const bool GetIsOnRail() const { return m_IsOnRail; } - void SetRemoteInputInfo(const RemoteInputInfo&); + void SetRemoteInputInfo(const WorldPackets::PositionUpdate::RemoteInputInfo& remoteInputInfo); private: NiPoint3 m_Velocity; @@ -76,5 +76,5 @@ private: float m_SoftUpdate = 0; uint32_t m_EndBehavior; - RemoteInputInfo m_RemoteInputInfo; + WorldPackets::PositionUpdate::RemoteInputInfo m_RemoteInputInfo; }; diff --git a/dNet/ClientPackets.cpp b/dNet/ClientPackets.cpp index 016884f6..232c41d7 100644 --- a/dNet/ClientPackets.cpp +++ b/dNet/ClientPackets.cpp @@ -5,7 +5,6 @@ #include "ClientPackets.h" #include "dCommonVars.h" -#include "PositionUpdate.h" #include "LDFFormat.h" #include "ZCompression.h" @@ -139,111 +138,3 @@ namespace ClientPackets { bitStream.Write(supportsObjects); } } - -ChatMessage ClientPackets::HandleChatMessage(Packet* packet) { - CINSTREAM_SKIP_HEADER; - - ChatMessage message; - uint32_t messageLength; - - inStream.Read(message.chatChannel); - inStream.Read(message.unknown); - inStream.Read(messageLength); - - for (uint32_t i = 0; i < (messageLength - 1); ++i) { - uint16_t character; - inStream.Read(character); - message.message.push_back(character); - } - - return message; -} - -PositionUpdate ClientPackets::HandleClientPositionUpdate(Packet* packet) { - PositionUpdate update; - CINSTREAM_SKIP_HEADER; - - inStream.Read(update.position.x); - inStream.Read(update.position.y); - inStream.Read(update.position.z); - - inStream.Read(update.rotation.x); - inStream.Read(update.rotation.y); - inStream.Read(update.rotation.z); - inStream.Read(update.rotation.w); - - inStream.Read(update.onGround); - inStream.Read(update.onRail); - - bool velocityFlag = false; - inStream.Read(velocityFlag); - if (velocityFlag) { - inStream.Read(update.velocity.x); - inStream.Read(update.velocity.y); - inStream.Read(update.velocity.z); - } - - bool angVelocityFlag = false; - inStream.Read(angVelocityFlag); - if (angVelocityFlag) { - inStream.Read(update.angularVelocity.x); - inStream.Read(update.angularVelocity.y); - inStream.Read(update.angularVelocity.z); - } - - // TODO figure out how to use these. Ignoring for now, but reading in if they exist. - bool hasLocalSpaceInfo{}; - if (inStream.Read(hasLocalSpaceInfo) && hasLocalSpaceInfo) { - inStream.Read(update.localSpaceInfo.objectId); - inStream.Read(update.localSpaceInfo.position.x); - inStream.Read(update.localSpaceInfo.position.y); - inStream.Read(update.localSpaceInfo.position.z); - bool hasLinearVelocity = false; - if (inStream.Read(hasLinearVelocity) && hasLinearVelocity) { - inStream.Read(update.localSpaceInfo.linearVelocity.x); - inStream.Read(update.localSpaceInfo.linearVelocity.y); - inStream.Read(update.localSpaceInfo.linearVelocity.z); - } - } - - bool hasRemoteInputInfo{}; - if (inStream.Read(hasRemoteInputInfo) && hasRemoteInputInfo) { - inStream.Read(update.remoteInputInfo.m_RemoteInputX); - inStream.Read(update.remoteInputInfo.m_RemoteInputY); - inStream.Read(update.remoteInputInfo.m_IsPowersliding); - inStream.Read(update.remoteInputInfo.m_IsModified); - } - - return update; -} - -ChatModerationRequest ClientPackets::HandleChatModerationRequest(Packet* packet) { - CINSTREAM_SKIP_HEADER; - - ChatModerationRequest request; - - inStream.Read(request.chatLevel); - inStream.Read(request.requestID); - - for (uint32_t i = 0; i < 42; ++i) { - uint16_t character; - inStream.Read(character); - request.receiver.push_back(static_cast(character)); - } - - if (!request.receiver.empty()) { - if (std::string(request.receiver.c_str(), 4) == "[GM]") { // Shift the string forward if we are speaking to a GM as the client appends "[GM]" if they are - request.receiver = std::string(request.receiver.c_str() + 4, request.receiver.size() - 4); - } - } - - uint16_t messageLength; - inStream.Read(messageLength); - for (uint32_t i = 0; i < messageLength; ++i) { - uint16_t character; - inStream.Read(character); - request.message.push_back(static_cast(character)); - } - - return request; -} diff --git a/dNet/ClientPackets.h b/dNet/ClientPackets.h index 0cd35245..30455cf0 100644 --- a/dNet/ClientPackets.h +++ b/dNet/ClientPackets.h @@ -17,30 +17,12 @@ class PositionUpdate; struct Packet; -struct ChatMessage { - uint8_t chatChannel = 0; - uint16_t unknown = 0; - std::u16string message; -}; - -struct ChatModerationRequest { - uint8_t chatLevel = 0; - uint8_t requestID = 0; - std::string receiver; - std::string message; -}; - - class User; struct SystemAddress; enum class eCharacterCreationResponse : uint8_t; enum class eRenameResponse : uint8_t; namespace ClientPackets { - ChatMessage HandleChatMessage(Packet* packet); - PositionUpdate HandleClientPositionUpdate(Packet* packet); - ChatModerationRequest HandleChatModerationRequest(Packet* packet); - struct LoadStaticZone : public LUBitStream { LWOZONEID zoneID; uint32_t checksum = 0; diff --git a/dNet/WorldPackets.cpp b/dNet/WorldPackets.cpp index ebc760c5..6f356803 100644 --- a/dNet/WorldPackets.cpp +++ b/dNet/WorldPackets.cpp @@ -30,13 +30,123 @@ namespace WorldPackets { data.Insert("Description4", Game::config->GetValue("help_4_description")); break; case eLanguageCodeID::PL_US: + [[fallthrough]]; case eLanguageCodeID::DE_DE: + [[fallthrough]]; case eLanguageCodeID::EN_GB: + [[fallthrough]]; default: break; } GameMessages::SendUIMessageServerToSingleClient(player, sysAddr, "UIHelpTop5", data); } - + + bool GeneralChatMessage::Deserialize(RakNet::BitStream& bitStream) { + VALIDATE_READ(bitStream.Read(chatChannel)); + VALIDATE_READ(bitStream.Read(unknown)); + + uint32_t messageLength; + VALIDATE_READ(bitStream.Read(messageLength)); + + for (uint32_t i = 0; i < (messageLength - 1); ++i) { + uint16_t character; + VALIDATE_READ(bitStream.Read(character)); + message.push_back(character); + } + + return true; + } + + void GeneralChatMessage::Handle() { + } + + bool PositionUpdate::Deserialize(RakNet::BitStream& bitStream) { + VALIDATE_READ(bitStream.Read(position.x)); + VALIDATE_READ(bitStream.Read(position.y)); + VALIDATE_READ(bitStream.Read(position.z)); + + VALIDATE_READ(bitStream.Read(rotation.x)); + VALIDATE_READ(bitStream.Read(rotation.y)); + VALIDATE_READ(bitStream.Read(rotation.z)); + VALIDATE_READ(bitStream.Read(rotation.w)); + + VALIDATE_READ(bitStream.Read(onGround)); + VALIDATE_READ(bitStream.Read(onRail)); + + bool velocityFlag = false; + if (bitStream.Read(velocityFlag) && velocityFlag) { + VALIDATE_READ(bitStream.Read(velocity.x)); + VALIDATE_READ(bitStream.Read(velocity.y)); + VALIDATE_READ(bitStream.Read(velocity.z)); + } + + bool angVelocityFlag = false; + if (bitStream.Read(angVelocityFlag) && angVelocityFlag) { + VALIDATE_READ(bitStream.Read(angularVelocity.x)); + VALIDATE_READ(bitStream.Read(angularVelocity.y)); + VALIDATE_READ(bitStream.Read(angularVelocity.z)); + } + + // TODO figure out how to use these. Ignoring for now, but reading in if they exist. + bool hasLocalSpaceInfo{}; + VALIDATE_READ(bitStream.Read(hasLocalSpaceInfo)); + if (hasLocalSpaceInfo) { + VALIDATE_READ(bitStream.Read(localSpaceInfo.objectId)); + VALIDATE_READ(bitStream.Read(localSpaceInfo.position.x)); + VALIDATE_READ(bitStream.Read(localSpaceInfo.position.y)); + VALIDATE_READ(bitStream.Read(localSpaceInfo.position.z)); + + bool hasLinearVelocity = false; + if (bitStream.Read(hasLinearVelocity) && hasLinearVelocity) { + VALIDATE_READ(bitStream.Read(localSpaceInfo.linearVelocity.x)); + VALIDATE_READ(bitStream.Read(localSpaceInfo.linearVelocity.y)); + VALIDATE_READ(bitStream.Read(localSpaceInfo.linearVelocity.z)); + } + } + bool hasRemoteInputInfo{}; + VALIDATE_READ(bitStream.Read(hasRemoteInputInfo)); + if (hasRemoteInputInfo) { + VALIDATE_READ(bitStream.Read(remoteInputInfo.m_RemoteInputX)); + VALIDATE_READ(bitStream.Read(remoteInputInfo.m_RemoteInputY)); + VALIDATE_READ(bitStream.Read(remoteInputInfo.m_IsPowersliding)); + VALIDATE_READ(bitStream.Read(remoteInputInfo.m_IsModified)); + } + + return true; + } + + void PositionUpdate::Handle() { + + } + + bool StringCheck::Deserialize(RakNet::BitStream& bitStream) { + VALIDATE_READ(bitStream.Read(chatLevel)); + VALIDATE_READ(bitStream.Read(requestID)); + + for (uint32_t i = 0; i < 42; ++i) { + uint16_t character; + VALIDATE_READ(bitStream.Read(character)); + receiver.push_back(static_cast(character)); + } + + if (!receiver.empty()) { + if (std::string(receiver.c_str(), 4) == "[GM]") { // Shift the string forward if we are speaking to a GM as the client appends "[GM]" if they are + receiver = std::string(receiver.c_str() + 4, receiver.size() - 4); + } + } + + uint32_t messageLength; + VALIDATE_READ(bitStream.Read(messageLength)); + for (uint32_t i = 0; i < messageLength; ++i) { + uint16_t character; + VALIDATE_READ(bitStream.Read(character)); + message.push_back(static_cast(character)); + } + + return true; + } + + void StringCheck::Handle() { + } } diff --git a/dNet/WorldPackets.h b/dNet/WorldPackets.h index 7495932b..768d0674 100644 --- a/dNet/WorldPackets.h +++ b/dNet/WorldPackets.h @@ -26,6 +26,56 @@ namespace WorldPackets { bool Deserialize(RakNet::BitStream& bitStream) override; void Handle() override; }; + + struct GeneralChatMessage : public LUBitStream { + uint8_t chatChannel = 0; + uint16_t unknown = 0; + std::u16string message; + + GeneralChatMessage() : LUBitStream(eConnectionType::WORLD, MessageType::World::GENERAL_CHAT_MESSAGE) {}; + bool Deserialize(RakNet::BitStream& bitStream) override; + void Handle() override; + }; + + struct PositionUpdate : public LUBitStream { + NiPoint3 position = NiPoint3Constant::ZERO; + NiQuaternion rotation = NiQuaternionConstant::IDENTITY; + bool onGround = false; + bool onRail = false; + NiPoint3 velocity = NiPoint3Constant::ZERO; + NiPoint3 angularVelocity = NiPoint3Constant::ZERO; + struct LocalSpaceInfo { + LWOOBJID objectId = LWOOBJID_EMPTY; + NiPoint3 position = NiPoint3Constant::ZERO; + NiPoint3 linearVelocity = NiPoint3Constant::ZERO; + }; + LocalSpaceInfo localSpaceInfo; + struct RemoteInputInfo { + bool operator==(const RemoteInputInfo& other) { + return m_RemoteInputX == other.m_RemoteInputX && m_RemoteInputY == other.m_RemoteInputY && m_IsPowersliding == other.m_IsPowersliding && m_IsModified == other.m_IsModified; + } + float m_RemoteInputX = 0; + float m_RemoteInputY = 0; + bool m_IsPowersliding = false; + bool m_IsModified = false; + }; + RemoteInputInfo remoteInputInfo; + + PositionUpdate() : LUBitStream(eConnectionType::WORLD, MessageType::World::POSITION_UPDATE) {}; + bool Deserialize(RakNet::BitStream& bitStream) override; + void Handle() override; + }; + + struct StringCheck : public LUBitStream { + uint8_t chatLevel = 0; + uint8_t requestID = 0; + std::string receiver; + std::string message; + + StringCheck() : LUBitStream(eConnectionType::WORLD, MessageType::World::STRING_CHECK) {}; + bool Deserialize(RakNet::BitStream& bitStream) override; + void Handle() override; + }; } #endif // WORLDPACKETS_H diff --git a/dWorldServer/WorldServer.cpp b/dWorldServer/WorldServer.cpp index 30b71a9a..764f9b68 100644 --- a/dWorldServer/WorldServer.cpp +++ b/dWorldServer/WorldServer.cpp @@ -77,7 +77,6 @@ #include "eGameMasterLevel.h" #include "StringifiedEnum.h" #include "Server.h" -#include "PositionUpdate.h" #include "PlayerManager.h" #include "eLoginResponse.h" #include "MissionComponent.h" @@ -1223,8 +1222,8 @@ void HandlePacket(Packet* packet) { } case MessageType::World::POSITION_UPDATE: { - auto positionUpdate = ClientPackets::HandleClientPositionUpdate(packet); - + WorldPackets::PositionUpdate positionUpdate; + positionUpdate.Deserialize(inStream); User* user = UserManager::Instance()->GetUser(packet->systemAddress); if (!user) { LOG("Unable to get user to parse position update"); @@ -1276,7 +1275,8 @@ void HandlePacket(Packet* packet) { } case MessageType::World::STRING_CHECK: { - auto request = ClientPackets::HandleChatModerationRequest(packet); + WorldPackets::StringCheck request; + request.Deserialize(inStream); // TODO: Find a good home for the logic in this case. User* user = UserManager::Instance()->GetUser(packet->systemAddress); @@ -1354,7 +1354,8 @@ void HandlePacket(Packet* packet) { if (g_ChatDisabled) { ChatPackets::SendMessageFail(packet->systemAddress); } else { - auto chatMessage = ClientPackets::HandleChatMessage(packet); + WorldPackets::GeneralChatMessage chatMessage; + chatMessage.Deserialize(inStream); // TODO: Find a good home for the logic in this case. User* user = UserManager::Instance()->GetUser(packet->systemAddress); @@ -1400,7 +1401,6 @@ void HandlePacket(Packet* packet) { break; } - case MessageType::World::UI_HELP_TOP_5: { WorldPackets::UIHelpTop5 help; help.Deserialize(inStream);