From d6e4000349b3be58622e0d2e4e78d9b05a788713 Mon Sep 17 00:00:00 2001 From: FileEX Date: Sun, 26 May 2024 17:17:34 +0200 Subject: [PATCH 1/6] Object sync improvments --- Client/mods/deathmatch/logic/CClientCommon.h | 2 + Client/mods/deathmatch/logic/CClientGame.cpp | 8 +- .../mods/deathmatch/logic/CClientObject.cpp | 215 +++++------ Client/mods/deathmatch/logic/CClientObject.h | 38 +- .../deathmatch/logic/CDeathmatchObject.cpp | 2 +- Client/mods/deathmatch/logic/CObjectSync.cpp | 342 ++++++++++++------ Client/mods/deathmatch/logic/CObjectSync.h | 3 +- .../mods/deathmatch/logic/CPacketHandler.cpp | 53 ++- .../logic/CStaticFunctionDefinitions.cpp | 7 + .../logic/lua/CLuaFunctionParseHelpers.cpp | 10 - .../logic/lua/CLuaFunctionParseHelpers.h | 1 - .../logic/luadefs/CLuaObjectDefs.cpp | 16 +- .../deathmatch/logic/luadefs/CLuaObjectDefs.h | 1 + .../mods/deathmatch/logic/rpc/CObjectRPCs.cpp | 73 ++++ .../mods/deathmatch/logic/rpc/CObjectRPCs.h | 3 + Client/sdk/game/Common.h | 4 +- Server/mods/deathmatch/logic/CCommon.h | 2 + Server/mods/deathmatch/logic/CGame.cpp | 5 + Server/mods/deathmatch/logic/CObject.cpp | 118 +++--- Server/mods/deathmatch/logic/CObject.h | 69 +++- Server/mods/deathmatch/logic/CObjectManager.h | 2 + Server/mods/deathmatch/logic/CObjectSync.cpp | 154 +++++--- Server/mods/deathmatch/logic/CObjectSync.h | 2 +- .../logic/CPerfStat.RPCPacketUsage.cpp | 2 + .../logic/CStaticFunctionDefinitions.cpp | 157 +++++++- .../logic/CStaticFunctionDefinitions.h | 4 + .../mods/deathmatch/logic/lua/LuaCommon.cpp | 58 +++ Server/mods/deathmatch/logic/lua/LuaCommon.h | 2 + .../logic/luadefs/CLuaObjectDefs.cpp | 122 +++++++ .../deathmatch/logic/luadefs/CLuaObjectDefs.h | 6 + .../logic/packets/CEntityAddPacket.cpp | 18 + .../logic/packets/CObjectStartSyncPacket.cpp | 10 + .../logic/packets/CObjectSyncPacket.cpp | 163 ++++++++- .../logic/packets/CObjectSyncPacket.h | 13 +- Shared/mods/deathmatch/logic/Enums.cpp | 10 + Shared/mods/deathmatch/logic/Enums.h | 13 + Shared/sdk/net/bitstream.h | 4 + Shared/sdk/net/rpc_enums.h | 4 + 38 files changed, 1317 insertions(+), 399 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientCommon.h b/Client/mods/deathmatch/logic/CClientCommon.h index a01416ac1d..74835677c1 100644 --- a/Client/mods/deathmatch/logic/CClientCommon.h +++ b/Client/mods/deathmatch/logic/CClientCommon.h @@ -41,6 +41,8 @@ // Defines the maximum size for a HTTP Download URL (with file / directory information appended) #define MAX_HTTP_DOWNLOAD_URL_WITH_FILE 768 +#define WITH_OBJECT_SYNC 1 + enum eHTTPDownloadType { HTTP_DOWNLOAD_DISABLED = 0, diff --git a/Client/mods/deathmatch/logic/CClientGame.cpp b/Client/mods/deathmatch/logic/CClientGame.cpp index 73e2b927fe..2358345f4c 100644 --- a/Client/mods/deathmatch/logic/CClientGame.cpp +++ b/Client/mods/deathmatch/logic/CClientGame.cpp @@ -4779,7 +4779,13 @@ bool CClientGame::ObjectDamageHandler(CObjectSAInterface* pObjectInterface, floa else Arguments.PushNil(); - return pClientObject->CallEvent("onClientObjectDamage", Arguments, true); + bool bContinue = pClientObject->CallEvent("onClientObjectDamage", Arguments, true); + if (bContinue && !pClientObject->IsLocalEntity() && pClientAttacker) + { + pClientObject->SetAttackerID(pClientAttacker->GetID()); + } + + return bContinue; } } return true; diff --git a/Client/mods/deathmatch/logic/CClientObject.cpp b/Client/mods/deathmatch/logic/CClientObject.cpp index 27eacc0efa..242b01202f 100644 --- a/Client/mods/deathmatch/logic/CClientObject.cpp +++ b/Client/mods/deathmatch/logic/CClientObject.cpp @@ -14,7 +14,7 @@ #define CCLIENTOBJECT_MAX 250 #ifndef M_PI -#define M_PI 3.14159265358979323846 + #define M_PI 3.14159265358979323846 #endif CClientObject::CClientObject(CClientManager* pManager, ElementID ID, unsigned short usModel, bool bLowLod) @@ -25,12 +25,11 @@ CClientObject::CClientObject(CClientManager* pManager, ElementID ID, unsigned sh m_pObjectManager = pManager->GetObjectManager(); m_pModelRequester = pManager->GetModelRequestManager(); - m_pObject = NULL; + m_pObject = nullptr; m_usModel = usModel; SetTypeName("object"); - m_usModel = usModel; m_bIsVisible = true; m_bIsFrozen = false; m_bUsesCollision = true; @@ -45,6 +44,7 @@ CClientObject::CClientObject(CClientManager* pManager, ElementID ID, unsigned sh m_fElasticity = -1.0f; m_fBuoyancyConstant = -1.0f; m_vecCenterOfMass = CVector(0.0f, 0.0f, 0.0f); + m_bIsStatic = true; m_pModelInfo = g_pGame->GetModelInfo(usModel); @@ -53,6 +53,7 @@ CClientObject::CClientObject(CClientManager* pManager, ElementID ID, unsigned sh if (m_bIsLowLod) m_pManager->OnLowLODElementCreated(); + m_clientModel = pManager->GetModelManager()->FindModelByID(usModel); } @@ -62,7 +63,7 @@ CClientObject::~CClientObject() m_pModelRequester->Cancel(this, false); // Detach us from anything - AttachTo(NULL); + AttachTo(nullptr); // Destroy the object Destroy(); @@ -72,6 +73,7 @@ CClientObject::~CClientObject() if (m_bIsLowLod) m_pManager->OnLowLODElementDestroyed(); + m_clientModel = nullptr; } @@ -81,9 +83,9 @@ void CClientObject::Unlink() g_pClientGame->GetObjectRespawner()->Unreference(this); // Remove LowLod refs in others - SetLowLodObject(NULL); + SetLowLodObject(nullptr); while (!m_HighLodObjectList.empty()) - m_HighLodObjectList[0]->SetLowLodObject(NULL); + m_HighLodObjectList[0]->SetLowLodObject(nullptr); } void CClientObject::GetPosition(CVector& vecPosition) const @@ -136,18 +138,17 @@ void CClientObject::GetRotationDegrees(CVector& vecRotation) const void CClientObject::GetRotationRadians(CVector& vecRotation) const { - if (m_pObject && m_pAttachedToEntity) // Temp fix for static objects-> - { - // We've been returning the rotation that got set last so far (::m_vecRotation).. - // but we need to get the real rotation for when the game moves the objects.. - CMatrix matTemp; - m_pObject->GetMatrix(&matTemp); - vecRotation = matTemp.GetRotation(); - } - else + if (m_pObject && (!IsStatic() || m_pAttachedToEntity)) { - vecRotation = m_vecRotation; + // Get the real rotation (game can moves the non-static objects) + CMatrix matrix; + m_pObject->GetMatrix(&matrix); + vecRotation = matrix.GetRotation(); + + return; } + + vecRotation = m_vecRotation; } void CClientObject::SetRotationDegrees(const CVector& vecRotation) @@ -228,14 +229,7 @@ void CClientObject::ModelRequestCallback(CModelInfo* pModelInfo) float CClientObject::GetDistanceFromCentreOfMassToBaseOfModel() { - if (m_pObject) - { - return m_pObject->GetDistanceFromCentreOfMassToBaseOfModel(); - } - else - { - return 0; - } + return (m_pObject ? m_pObject->GetDistanceFromCentreOfMassToBaseOfModel() : 0.0); } void CClientObject::SetVisible(bool bVisible) @@ -247,10 +241,10 @@ void CClientObject::SetVisible(bool bVisible) // Call this when m_bIsVisible, m_IsHiddenLowLod or m_pObject is changed void CClientObject::UpdateVisibility() { - if (m_pObject) - { - m_pObject->SetVisible(m_bIsVisible && !m_IsHiddenLowLod); - } + if (!m_pObject) + return; + + m_pObject->SetVisible(m_bIsVisible && !m_IsHiddenLowLod); } void CClientObject::SetModel(unsigned short usModel) @@ -265,6 +259,7 @@ void CClientObject::SetModel(unsigned short usModel) m_usModel = usModel; if (m_clientModel && m_clientModel->GetModelID() != m_usModel) m_clientModel = nullptr; + m_pModelInfo = g_pGame->GetModelInfo(usModel); UpdateSpatialData(); @@ -280,11 +275,6 @@ void CClientObject::SetModel(unsigned short usModel) } } -bool CClientObject::IsLowLod() -{ - return m_bIsLowLod; -} - bool CClientObject::SetLowLodObject(CClientObject* pNewLowLodObject) { // This object has to be high lod @@ -303,7 +293,7 @@ bool CClientObject::SetLowLodObject(CClientObject* pNewLowLodObject) // Clear there and here ListRemove(m_pLowLodObject->m_HighLodObjectList, this); - m_pLowLodObject = NULL; + m_pLowLodObject = nullptr; return true; } else @@ -313,7 +303,7 @@ bool CClientObject::SetLowLodObject(CClientObject* pNewLowLodObject) return false; // Remove any previous link - SetLowLodObject(NULL); + SetLowLodObject(nullptr); // Make new link m_pLowLodObject = pNewLowLodObject; @@ -324,17 +314,13 @@ bool CClientObject::SetLowLodObject(CClientObject* pNewLowLodObject) CClientObject* CClientObject::GetLowLodObject() { - if (m_bIsLowLod) - return NULL; - return m_pLowLodObject; + return (m_bIsLowLod ? nullptr : m_pLowLodObject); } void CClientObject::Render() { if (m_pObject) - { m_pObject->Render(); - } } void CClientObject::SetFrozen(bool bFrozen) @@ -342,9 +328,7 @@ void CClientObject::SetFrozen(bool bFrozen) m_bIsFrozen = bFrozen; if (m_pObject) - { m_pObject->SetFrozen(bFrozen); - } // Reset speed if we frozing object if (bFrozen) @@ -355,74 +339,52 @@ void CClientObject::SetFrozen(bool bFrozen) GetMoveSpeed(vecSpeed); if (vecZero != vecSpeed) - { SetMoveSpeed(vecZero); - } GetTurnSpeed(vecSpeed); if (vecZero != vecSpeed) - { SetTurnSpeed(vecZero); - } } } void CClientObject::SetAlpha(unsigned char ucAlpha) { if (m_pObject) - { m_pObject->SetAlpha(ucAlpha); - } + m_ucAlpha = ucAlpha; } void CClientObject::GetScale(CVector& vecScale) const { - if (m_pObject) - { - vecScale = *m_pObject->GetScale(); - } - else - { - vecScale = m_vecScale; - } + vecScale = (m_pObject ? *m_pObject->GetScale() : m_vecScale); } void CClientObject::SetScale(const CVector& vecScale) { if (m_pObject) - { m_pObject->SetScale(vecScale.fX, vecScale.fY, vecScale.fZ); - } + m_vecScale = vecScale; } void CClientObject::SetCollisionEnabled(bool bCollisionEnabled) { if (m_pObject) - { m_pObject->SetUsesCollision(bCollisionEnabled); - } m_bUsesCollision = bCollisionEnabled; } float CClientObject::GetHealth() { - if (m_pObject) - { - return m_pObject->GetHealth(); - } - - return m_fHealth; + return (m_pObject ? m_pObject->GetHealth() : m_fHealth); } void CClientObject::SetHealth(float fHealth) { if (m_pObject) - { m_pObject->SetHealth(fHealth); - } m_fHealth = fHealth; } @@ -438,10 +400,8 @@ void CClientObject::StreamIn(bool bInstantly) { // Request the model blocking if (m_pModelRequester->RequestBlocking(m_usModel, "CClientObject::StreamIn - bInstantly")) - { // Create us Create(); - } else NotifyUnableToCreate(); } @@ -449,10 +409,8 @@ void CClientObject::StreamIn(bool bInstantly) { // Request the model async if (m_pModelRequester->Request(m_usModel, this)) - { // Create us now if we already had it loaded Create(); - } else NotifyUnableToCreate(); } @@ -517,9 +475,9 @@ void CClientObject::Create() // Apply our data to the object m_pObject->Teleport(m_vecPosition.fX, m_vecPosition.fY, m_vecPosition.fZ); m_pObject->SetOrientation(m_vecRotation.fX, m_vecRotation.fY, m_vecRotation.fZ); - #ifndef MTA_BUILDINGS +#ifndef MTA_BUILDINGS m_pObject->ProcessCollision(); - #endif +#endif m_pObject->SetupLighting(); m_pObject->SetFrozen(m_bIsFrozen); @@ -572,21 +530,20 @@ void CClientObject::Create() void CClientObject::Destroy() { - // If the object exists - if (m_pObject) - { - // Invalidate - m_pManager->InvalidateEntity(this); + if (!m_pObject) + return; - // Destroy the object - g_pGame->GetPools()->RemoveObject(m_pObject); - m_pObject = NULL; + // Invalidate + m_pManager->InvalidateEntity(this); - // Remove our reference to its model - m_pModelInfo->RemoveRef(); + // Destroy the object + g_pGame->GetPools()->RemoveObject(m_pObject); + m_pObject = nullptr; - NotifyDestroy(); - } + // Remove our reference to its model + m_pModelInfo->RemoveRef(); + + NotifyDestroy(); } void CClientObject::NotifyCreate() @@ -628,9 +585,7 @@ void CClientObject::StreamedInPulse() { // Fixed attachment bug #9339 where [object1] -> [object2] -> [vehicle] causes positional lag for [object1] if (m_pAttachedToEntity && m_pAttachedToEntity->GetAttachedTo()) - { DoAttaching(); - } } // Are we not frozen @@ -653,43 +608,36 @@ void CClientObject::StreamedInPulse() void CClientObject::GetMoveSpeed(CVector& vecMoveSpeed) const { if (m_pObject) - { m_pObject->GetMoveSpeed(&vecMoveSpeed); - } else - { vecMoveSpeed = m_vecMoveSpeed; - } } void CClientObject::SetMoveSpeed(const CVector& vecMoveSpeed) { if (m_pObject) - { m_pObject->SetMoveSpeed(const_cast(&vecMoveSpeed)); - } + m_vecMoveSpeed = vecMoveSpeed; + SetStatic(false); } void CClientObject::GetTurnSpeed(CVector& vecTurnSpeed) const { if (m_pObject) - { m_pObject->GetTurnSpeed(&vecTurnSpeed); - } else - { vecTurnSpeed = m_vecTurnSpeed; - } } void CClientObject::SetTurnSpeed(const CVector& vecTurnSpeed) { if (m_pObject) - { m_pObject->SetTurnSpeed(const_cast(&vecTurnSpeed)); - } + m_vecTurnSpeed = vecTurnSpeed; + + SetStatic(false); } CSphere CClientObject::GetWorldBoundingSphere() @@ -733,21 +681,16 @@ bool CClientObject::SetBreakable(bool bBreakable) bool CClientObject::Break() { - // Are we breakable? - if (m_pObject && CClientObjectManager::IsBreakableModel(m_usModel) && !m_bBreakingDisabled) - { - m_pObject->Break(); - return true; - } - return false; + if (!m_pObject || m_bBreakingDisabled || !CClientObjectManager::IsBreakableModel(m_usModel)) + return false; + + m_pObject->Break(); + return true; } float CClientObject::GetMass() { - if (m_pObject) - return m_pObject->GetMass(); - - return m_fMass; + return (m_pObject ? m_pObject->GetMass() : m_fMass); } void CClientObject::SetMass(float fMass) @@ -760,10 +703,7 @@ void CClientObject::SetMass(float fMass) float CClientObject::GetTurnMass() { - if (m_pObject) - return m_pObject->GetTurnMass(); - - return m_fTurnMass; + return (m_pObject ? m_pObject->GetTurnMass() : m_fTurnMass); } void CClientObject::SetTurnMass(float fTurnMass) @@ -776,10 +716,7 @@ void CClientObject::SetTurnMass(float fTurnMass) float CClientObject::GetAirResistance() { - if (m_pObject) - return m_pObject->GetAirResistance(); - - return m_fAirResistance; + return (m_pObject ? m_pObject->GetAirResistance() : m_fAirResistance); } void CClientObject::SetAirResistance(float fAirResistance) @@ -792,10 +729,7 @@ void CClientObject::SetAirResistance(float fAirResistance) float CClientObject::GetElasticity() { - if (m_pObject) - return m_pObject->GetElasticity(); - - return m_fElasticity; + return (m_pObject ? m_pObject->GetElasticity() : m_fElasticity); } void CClientObject::SetElasticity(float fElasticity) @@ -808,10 +742,7 @@ void CClientObject::SetElasticity(float fElasticity) float CClientObject::GetBuoyancyConstant() { - if (m_pObject) - return m_pObject->GetBuoyancyConstant(); - - return m_fBuoyancyConstant; + return (m_pObject ? m_pObject->GetBuoyancyConstant() : m_fBuoyancyConstant); } void CClientObject::SetBuoyancyConstant(float fBuoyancyConstant) @@ -846,12 +777,34 @@ void CClientObject::SetVisibleInAllDimensions(bool bVisible, unsigned short usNe if (bVisible) { if (g_pClientGame->GetLocalPlayer()) - { SetDimension(g_pClientGame->GetLocalPlayer()->GetDimension()); - } } else - { SetDimension(usNewDimension); - } +} + +bool CClientObject::IsInWater() +{ + if (!m_pModelInfo) + return false; + + // Get object bounding box + CBoundingBox* pBoundingBox = m_pModelInfo->GetBoundingBox(); + if (!pBoundingBox) + return false; + + // Get bounding box min. Z position + CVector vecMin = pBoundingBox->vecBoundMin; + vecMin.fZ += pBoundingBox->vecBoundOffset.fZ; + + CVector vecPosition, vecUnknown; + GetPosition(vecPosition); + + // Get water level + float fWaterLevel; + if (!g_pGame->GetWaterManager()->GetWaterLevel(vecPosition, &fWaterLevel, true, &vecUnknown)) + return false; + + // Check if min. Z is in the water + return (vecPosition.fZ + vecMin.fZ <= fWaterLevel); } diff --git a/Client/mods/deathmatch/logic/CClientObject.h b/Client/mods/deathmatch/logic/CClientObject.h index a016facd5c..bca77bf63a 100644 --- a/Client/mods/deathmatch/logic/CClientObject.h +++ b/Client/mods/deathmatch/logic/CClientObject.h @@ -20,7 +20,16 @@ struct SLastSyncedObjectData { CVector vecPosition; CVector vecRotation; + CVector vecVelocity; + CVector vecTurnVelocity; float fHealth; + bool bIsInWater; + float fMass; + float fTurnMass; + float fAirResistance; + float fElasticity; + float fBuoyancyConstant; + CVector vecCenterOfMass; }; class CClientObject : public CClientStreamElement @@ -37,8 +46,7 @@ class CClientObject : public CClientStreamElement eClientEntityType GetType() const { return CCLIENTOBJECT; }; - CObject* GetGameObject() { return m_pObject; } - CEntity* GetGameEntity() { return m_pObject; } + CObject* GetGameObject() const { return m_pObject; } const CEntity* GetGameEntity() const { return m_pObject; } void GetPosition(CVector& vecPosition) const; @@ -65,22 +73,22 @@ class CClientObject : public CClientStreamElement float GetDistanceFromCentreOfMassToBaseOfModel(); - bool IsVisible() { return m_bIsVisible; }; + bool IsVisible() const { return m_bIsVisible; }; void SetVisible(bool bVisible); - unsigned short GetModel() const { return m_usModel; }; + unsigned short GetModel() const const { return m_usModel; }; void SetModel(unsigned short usModel); - bool IsLowLod(); + bool IsLowLod() const { return m_bIsLowLod; } bool SetLowLodObject(CClientObject* pLowLodObject); CClientObject* GetLowLodObject(); void Render(); - bool IsFrozen() { return m_bIsFrozen; } + bool IsFrozen() const { return m_bIsFrozen; } void SetFrozen(bool bFrozen); - unsigned char GetAlpha() { return m_ucAlpha; } + unsigned char GetAlpha() const { return m_ucAlpha; } void SetAlpha(unsigned char ucAlpha); void GetScale(CVector& vecScale) const; void SetScale(const CVector& vecScale); @@ -104,21 +112,28 @@ class CClientObject : public CClientStreamElement bool IsBreakable(bool bCheckModelList = true); bool SetBreakable(bool bBreakable); bool Break(); - bool IsRespawnEnabled() { return m_bRespawnEnabled; }; + bool IsRespawnEnabled() const { return m_bRespawnEnabled; }; void SetRespawnEnabled(bool bRespawnEnabled) { m_bRespawnEnabled = bRespawnEnabled; }; float GetMass(); void SetMass(float fMass); - bool IsVisibleInAllDimensions() { return m_bVisibleInAllDimensions; }; + bool IsVisibleInAllDimensions() const { return m_bVisibleInAllDimensions; }; void SetVisibleInAllDimensions(bool bVisible, unsigned short usNewDimension = 0); void ReCreate(); void UpdateVisibility(); - bool IsBeingRespawned() { return m_bBeingRespawned; }; + bool IsBeingRespawned() const { return m_bBeingRespawned; }; void SetBeingRespawned(bool bBeingRespawned) { m_bBeingRespawned = bBeingRespawned; }; + bool IsInWater(); + + bool IsStatic() const { return m_bIsStatic; } + void SetStatic(bool isStatic) { m_bIsStatic = isStatic; } + + ElementID GetAttackerID() const { return m_AttackerID; } + void SetAttackerID(ElementID attackerID) { m_AttackerID = attackerID; } protected: void StreamIn(bool bInstantly); void StreamOut(); @@ -154,10 +169,13 @@ class CClientObject : public CClientStreamElement float m_fBuoyancyConstant; CVector m_vecCenterOfMass; bool m_bVisibleInAllDimensions = false; + bool m_bIsStatic; // true if the object never moved using setElementVelocity/setElementAngularVelocity CVector m_vecMoveSpeed; CVector m_vecTurnSpeed; + ElementID m_AttackerID = INVALID_ELEMENT_ID; + const bool m_bIsLowLod; // true if this object is low LOD CClientObject* m_pLowLodObject; // Pointer to low LOD version of this object std::vector m_HighLodObjectList; // List of objects that use this object as a low LOD version diff --git a/Client/mods/deathmatch/logic/CDeathmatchObject.cpp b/Client/mods/deathmatch/logic/CDeathmatchObject.cpp index c1712246fb..7729cebbb9 100644 --- a/Client/mods/deathmatch/logic/CDeathmatchObject.cpp +++ b/Client/mods/deathmatch/logic/CDeathmatchObject.cpp @@ -18,7 +18,7 @@ extern CClientGame* g_pClientGame; #ifdef WITH_OBJECT_SYNC CDeathmatchObject::CDeathmatchObject(CClientManager* pManager, CMovingObjectsManager* pMovingObjectsManager, CObjectSync* pObjectSync, ElementID ID, unsigned short usModel) - : ClassInit(this), CClientObject(pManager, ID, usModel) + : ClassInit(this), CClientObject(pManager, ID, usModel, false) { m_pMovingObjectsManager = pMovingObjectsManager; m_pObjectSync = pObjectSync; diff --git a/Client/mods/deathmatch/logic/CObjectSync.cpp b/Client/mods/deathmatch/logic/CObjectSync.cpp index 9ec862c148..8cd9032751 100644 --- a/Client/mods/deathmatch/logic/CObjectSync.cpp +++ b/Client/mods/deathmatch/logic/CObjectSync.cpp @@ -10,39 +10,35 @@ *****************************************************************************/ #include "StdInc.h" -#include "net/SyncStructures.h" - -#ifdef WITH_OBJECT_SYNC using std::list; +extern CClientGame* g_pClientGame; -#define OBJECT_SYNC_RATE ( g_TickRateSettings.iObjectSync ) +#define OBJECT_SYNC_RATE (g_TickRateSettings.iObjectSync) -CObjectSync::CObjectSync(CClientObjectManager* pObjectManager) +CObjectSync::CObjectSync(CClientObjectManager* pObjectManager) : m_pObjectManager(pObjectManager), m_ulLastSyncTime(0) { - m_pObjectManager = pObjectManager; - m_ulLastSyncTime = 0; } -bool CObjectSync::ProcessPacket(unsigned char ucPacketID, NetBitStreamInterface& BitStream) +bool CObjectSync::ProcessPacket(unsigned char ucPacketID, NetBitStreamInterface& bitStream) { switch (ucPacketID) { case PACKET_ID_OBJECT_STARTSYNC: { - Packet_ObjectStartSync(BitStream); + Packet_ObjectStartSync(bitStream); return true; } case PACKET_ID_OBJECT_STOPSYNC: { - Packet_ObjectStopSync(BitStream); + Packet_ObjectStopSync(bitStream); return true; } case PACKET_ID_OBJECT_SYNC: { - Packet_ObjectSync(BitStream); + Packet_ObjectSync(bitStream); return true; } } @@ -52,11 +48,10 @@ bool CObjectSync::ProcessPacket(unsigned char ucPacketID, NetBitStreamInterface& void CObjectSync::DoPulse() { - // Has it been long enough since our last state's sync? unsigned long ulCurrentTime = CClientTime::GetTime(); if (ulCurrentTime >= m_ulLastSyncTime + OBJECT_SYNC_RATE) { - Sync(); + Update(); m_ulLastSyncTime = ulCurrentTime; } } @@ -72,199 +67,330 @@ void CObjectSync::RemoveObject(CDeathmatchObject* pObject) m_List.remove(pObject); } -void CObjectSync::ClearObjects() -{ - m_List.clear(); -} - bool CObjectSync::Exists(CDeathmatchObject* pObject) { return m_List.Contains(pObject); } -void CObjectSync::Packet_ObjectStartSync(NetBitStreamInterface& BitStream) +void CObjectSync::Packet_ObjectStartSync(NetBitStreamInterface& bitStream) { - // Read out the ID + // Read out the element ID ElementID ID; - if (BitStream.Read(ID)) - { - // Grab the object - CDeathmatchObject* pObject = static_cast(m_pObjectManager->Get(ID)); - if (pObject) - { - // Read out the position and rotation - SPositionSync position; - SRotationRadiansSync rotation; - if (BitStream.Read(&position) && BitStream.Read(&rotation)) - { - // Disabled due to problem when attached in the editor - issue #5886 - #if 0 - pObject->SetOrientation ( position.data.vecPosition, rotation.data.vecRotation ); - #endif - } - // No velocity due to issue #3522 - - // Read out the health - SObjectHealthSync health; - if (BitStream.Read(&health)) - { - pObject->SetHealth(health.data.fValue); - } - - AddObject(pObject); - } - } + if (!bitStream.Read(ID)) + return; + + // Grab the object + auto pObject = static_cast(m_pObjectManager->Get(ID)); + if (!pObject) + return; + + // Read out the data + SPositionSync position; + SRotationRadiansSync rotation; + SVelocitySync velocity; + SVelocitySync angularVelocity; + SObjectHealthSync health; + + if (!bitStream.Read(&position) || !bitStream.Read(&rotation) || !bitStream.Read(&velocity) || !bitStream.Read(&angularVelocity) || !bitStream.Read(&health)) + return; + + // Set data from the server + pObject->SetOrientation(position.data.vecPosition, rotation.data.vecRotation); + pObject->SetHealth(health.data.fValue); + pObject->SetMoveSpeed(velocity.data.vecVelocity); + pObject->SetTurnSpeed(angularVelocity.data.vecVelocity); + + // Add object to the sync list + AddObject(pObject); } -void CObjectSync::Packet_ObjectStopSync(NetBitStreamInterface& BitStream) +void CObjectSync::Packet_ObjectStopSync(NetBitStreamInterface& bitStream) { - // Read out the ID + // Read out the element ID ElementID ID; - if (BitStream.Read(ID)) - { - // Grab the object - CDeathmatchObject* pObject = static_cast(m_pObjectManager->Get(ID)); - if (pObject) - { - RemoveObject(pObject); - } - } + if (!bitStream.Read(ID)) + return; + + // Grab the object + auto* pObject = static_cast(m_pObjectManager->Get(ID)); + if (!pObject) + return; + + // Remove object from the sync list + RemoveObject(pObject); } -void CObjectSync::Packet_ObjectSync(NetBitStreamInterface& BitStream) +void CObjectSync::Packet_ObjectSync(NetBitStreamInterface& bitStream) { // While we're not out of bytes - while (BitStream.GetNumberOfUnreadBits() > 8) + while (bitStream.GetNumberOfUnreadBits() > 8) { - // Read out the ID + // Read out the element ID ElementID ID; - if (!BitStream.Read(ID)) + if (!bitStream.Read(ID)) return; - // Read out the sync time context. See CClientEntity for documentation on that. + // Read out the sync time context unsigned char ucSyncTimeContext; - if (!BitStream.Read(ucSyncTimeContext)) + if (!bitStream.Read(ucSyncTimeContext)) return; - // Read out flags - SIntegerSync flags(0); - if (!BitStream.Read(&flags)) + // Read out the flags + SIntegerSync ucFlags(0); + if (!bitStream.Read(&ucFlags)) return; - // Read out the position if we need + // Read out the position SPositionSync position; - if (flags & 0x1) + if (ucFlags & 0x1) { - if (!BitStream.Read(&position)) + if (!bitStream.Read(&position)) return; } // Read out the rotation SRotationRadiansSync rotation; - if (flags & 0x2) + if (ucFlags & 0x2) + { + if (!bitStream.Read(&rotation)) + return; + } + + // Read out the velocity + SVelocitySync velocity; + if (ucFlags & 0x4) { - if (!BitStream.Read(&rotation)) + if (!bitStream.Read(&velocity)) + return; + } + + // Read out the angular velocity + SVelocitySync angularVelocity; + if (ucFlags & 0x8) + { + if (!bitStream.Read(&angularVelocity)) return; } // Read out the health SObjectHealthSync health; - if (flags & 0x4) + if (ucFlags & 0x10) { - if (!BitStream.Read(&health)) + if (!bitStream.Read(&health)) return; } - // Grab the object - CDeathmatchObject* pObject = static_cast(m_pObjectManager->Get(ID)); + // Grab the object. + auto* pObject = static_cast(m_pObjectManager->Get(ID)); + // Only update the sync if this packet is from the same context - if (pObject && pObject->CanUpdateSync(ucSyncTimeContext)) - { - if (flags & 0x1) - pObject->SetPosition(position.data.vecPosition); - if (flags & 0x2) - pObject->SetRotationRadians(rotation.data.vecRotation); - if (flags & 0x4) - pObject->SetHealth(health.data.fValue); - } + if (!pObject || !pObject->CanUpdateSync(ucSyncTimeContext)) + return; + + // Set data + if (ucFlags & 0x1) + pObject->SetPosition(position.data.vecPosition); + if (ucFlags & 0x2) + pObject->SetRotationRadians(rotation.data.vecRotation); + if (ucFlags & 0x4) + pObject->SetMoveSpeed(velocity.data.vecVelocity); + if (ucFlags & 0x8) + pObject->SetTurnSpeed(angularVelocity.data.vecVelocity); + if (ucFlags & 0x10) + pObject->SetHealth(health.data.fValue); } } -void CObjectSync::Sync() +void CObjectSync::Update() { - // Got any items? + // Got any objects to sync? if (m_List.size() > 0) { - // Write each object to packet - CBitStream bitStream; + // Create packet + NetBitStreamInterface* pBitStream = g_pNet->AllocateNetBitStream(); + if (!pBitStream) + return; + + // Write object information list::const_iterator iter = m_List.begin(); for (; iter != m_List.end(); iter++) { - WriteObjectInformation(bitStream.pBitStream, *iter); + WriteObjectInformation(pBitStream, *iter); } - // Send the packet - g_pNet->SendPacket(PACKET_ID_OBJECT_SYNC, bitStream.pBitStream, PACKET_PRIORITY_MEDIUM, PACKET_RELIABILITY_UNRELIABLE_SEQUENCED); + // Send and destroy the packet + g_pNet->SendPacket(PACKET_ID_OBJECT_SYNC, pBitStream, PACKET_PRIORITY_MEDIUM, PACKET_RELIABILITY_UNRELIABLE_SEQUENCED); + g_pNet->DeallocateNetBitStream(pBitStream); } } void CObjectSync::WriteObjectInformation(NetBitStreamInterface* pBitStream, CDeathmatchObject* pObject) { - unsigned char ucFlags = 0; - - // What's changed? - CVector vecPosition, vecRotation; + CVector vecPosition, vecRotation, vecVelocity, vecAngularVelocity, vecCenterOfMass; pObject->GetPosition(vecPosition); pObject->GetRotationRadians(vecRotation); + pObject->GetMoveSpeed(vecVelocity); + pObject->GetTurnSpeed(vecAngularVelocity); + pObject->GetCenterOfMass(vecCenterOfMass); + + unsigned int ucFlags = 0; if (vecPosition != pObject->m_LastSyncedData.vecPosition) ucFlags |= 0x1; if (vecRotation != pObject->m_LastSyncedData.vecRotation) ucFlags |= 0x2; - if (pObject->GetHealth() != pObject->m_LastSyncedData.fHealth) + if (vecVelocity != pObject->m_LastSyncedData.vecVelocity) ucFlags |= 0x4; + if (vecAngularVelocity != pObject->m_LastSyncedData.vecTurnVelocity) + ucFlags |= 0x8; + if (pObject->GetHealth() != pObject->m_LastSyncedData.fHealth) + ucFlags |= 0x10; + if (pObject->IsInWater() != pObject->m_LastSyncedData.bIsInWater) + ucFlags |= 0x20; + if (pObject->GetMass() != pObject->m_LastSyncedData.fMass) + ucFlags |= 0x40; + if (pObject->GetTurnMass() != pObject->m_LastSyncedData.fTurnMass) + ucFlags |= 0x80; + if (pObject->GetAirResistance() != pObject->m_LastSyncedData.fAirResistance) + ucFlags |= 0x100; + if (pObject->GetElasticity() != pObject->m_LastSyncedData.fElasticity) + ucFlags |= 0x200; + if (pObject->GetBuoyancyConstant() != pObject->m_LastSyncedData.fBuoyancyConstant) + ucFlags |= 0x400; + if (vecCenterOfMass != pObject->m_LastSyncedData.vecCenterOfMass) + ucFlags |= 0x800; // Don't sync if nothing changed if (ucFlags == 0) return; - // Write the ID + // Write the object ID pBitStream->Write(pObject->GetID()); // Write the sync time context pBitStream->Write(pObject->GetSyncTimeContext()); // Write flags - SIntegerSync flags(ucFlags); - pBitStream->Write(&flags); + //SIntegerSync flags(ucFlags); + pBitStream->Write(ucFlags); - // Write changed stuff - // Position + // Write position if (ucFlags & 0x1) { - SPositionSync position; + SPositionSync position(false); pObject->GetPosition(position.data.vecPosition); pBitStream->Write(&position); + pObject->m_LastSyncedData.vecPosition = position.data.vecPosition; } - // Rotation + // Write rotation if (ucFlags & 0x2) { SRotationRadiansSync rotation; pObject->GetRotationRadians(rotation.data.vecRotation); pBitStream->Write(&rotation); + pObject->m_LastSyncedData.vecRotation = rotation.data.vecRotation; } - // Health + // Write velocity if (ucFlags & 0x4) + { + SVelocitySync velocity; + pObject->GetMoveSpeed(velocity.data.vecVelocity); + pBitStream->Write(&velocity); + + pObject->m_LastSyncedData.vecVelocity = velocity.data.vecVelocity; + } + + // Write angular velocity + if (ucFlags & 0x8) + { + SVelocitySync angularVelocity; + pObject->GetTurnSpeed(angularVelocity.data.vecVelocity); + pBitStream->Write(&angularVelocity); + + pObject->m_LastSyncedData.vecTurnVelocity = angularVelocity.data.vecVelocity; + } + + // Write health & attacker + if (ucFlags & 0x10) { SObjectHealthSync health; health.data.fValue = pObject->GetHealth(); pBitStream->Write(&health); + pBitStream->Write(pObject->GetAttackerID()); + pObject->m_LastSyncedData.fHealth = health.data.fValue; } -} -#endif \ No newline at end of file + // Write inWater state + if (ucFlags & 0x20) + { + bool bIsInWater = pObject->IsInWater(); + pBitStream->WriteBit(bIsInWater); + + pObject->m_LastSyncedData.bIsInWater = bIsInWater; + } + + // Write properties + + // Write mass + if (ucFlags & 0x40) + { + float fMass = pObject->GetMass(); + pBitStream->Write(fMass); + + pObject->m_LastSyncedData.fMass = fMass; + } + + // Write turn mass + if (ucFlags & 0x80) + { + float fTurnMass = pObject->GetTurnMass(); + pBitStream->Write(fTurnMass); + + pObject->m_LastSyncedData.fTurnMass = fTurnMass; + } + + // Write air resistance + if (ucFlags & 0x100) + { + float fAirResistance = pObject->GetAirResistance(); + pBitStream->Write(fAirResistance); + + pObject->m_LastSyncedData.fAirResistance = fAirResistance; + } + + // Write elasiticy + if (ucFlags & 0x200) + { + float fElasticity = pObject->GetElasticity(); + pBitStream->Write(fElasticity); + + pObject->m_LastSyncedData.fElasticity = fElasticity; + } + + // Write buoyancy constant + if (ucFlags & 0x400) + { + float fBuoyancyConstant = pObject->GetBuoyancyConstant(); + pBitStream->Write(fBuoyancyConstant); + + pObject->m_LastSyncedData.fBuoyancyConstant = fBuoyancyConstant; + } + + // Write center of mass + if (ucFlags & 0x800) + { + CVector vecCenterOfMass; + pObject->GetCenterOfMass(vecCenterOfMass); + + pBitStream->Write(vecCenterOfMass.fX); + pBitStream->Write(vecCenterOfMass.fY); + pBitStream->Write(vecCenterOfMass.fZ); + + pObject->m_LastSyncedData.vecCenterOfMass = vecCenterOfMass; + } +} diff --git a/Client/mods/deathmatch/logic/CObjectSync.h b/Client/mods/deathmatch/logic/CObjectSync.h index 73fa400a8b..d987791aef 100644 --- a/Client/mods/deathmatch/logic/CObjectSync.h +++ b/Client/mods/deathmatch/logic/CObjectSync.h @@ -26,7 +26,6 @@ class CObjectSync void AddObject(CDeathmatchObject* pObject); void RemoveObject(CDeathmatchObject* pObject); - void ClearObjects(); std::list::const_iterator IterBegin() { return m_List.begin(); }; std::list::const_iterator IterEnd() { return m_List.end(); }; @@ -38,7 +37,7 @@ class CObjectSync void Packet_ObjectStopSync(NetBitStreamInterface& BitStream); void Packet_ObjectSync(NetBitStreamInterface& BitStream); - void Sync(); + void Update(); void WriteObjectInformation(NetBitStreamInterface* pBitStream, CDeathmatchObject* pObject); CClientObjectManager* m_pObjectManager; diff --git a/Client/mods/deathmatch/logic/CPacketHandler.cpp b/Client/mods/deathmatch/logic/CPacketHandler.cpp index a0df3d5849..c7b38ad67c 100644 --- a/Client/mods/deathmatch/logic/CPacketHandler.cpp +++ b/Client/mods/deathmatch/logic/CPacketHandler.cpp @@ -2711,13 +2711,24 @@ void CPacketHandler::Packet_EntityAdd(NetBitStreamInterface& bitStream) // ??? (?) - custom data // Objects: - // CVector (12) - position - // CVector (12) - rotation - // unsigned short (2) - object model id - // unsigned char (1) - alpha - // CVector (12) - scale - // bool (1) - static - // SObjectHealthSync (?) - health + // CVector (12) - position + // CVector (12) - rotation + // unsigned short (2) - object model id + // unsigned char (1) - alpha + // bool (1) - is low lod + // ElementID (2) - low lod object id + // bool (1) - doublesided + // bool (1) - breakable + // bool (1) - visible in all dimensions + // bool (1) - moving + // CPositionRotationAnimation (?) - Moving animation data + // CVector (12) - scale + // bool (1) - frozen + // SObjectHealthSync (?) - health + // bool (1) - static flag + // bool (1) - respawnEnabled + // float (4) - properties (mass, turnMass etc) + // CVector (12) - center_of_mass property // Pickups: // CVector (12) - position @@ -3078,6 +3089,34 @@ void CPacketHandler::Packet_EntityAdd(NetBitStreamInterface& bitStream) if (bitStream.Read(&health)) pObject->SetHealth(health.data.fValue); + // Set static, respawnable & properties + if (bitStream.Can(eBitStreamVersion::ObjectSync_FixAndUpdate)) + { + pObject->SetStatic(bitStream.ReadBit()); + pObject->SetRespawnEnabled(bitStream.ReadBit()); + + float fMass, fTurnMass, fAirResistance, fElasticity, fBuoyancy; + CVector centerOfMass; + + if (bitStream.Read(fMass)) + pObject->SetMass(fMass); + + if (bitStream.Read(fTurnMass)) + pObject->SetTurnMass(fTurnMass); + + if (bitStream.Read(fAirResistance)) + pObject->SetAirResistance(fAirResistance); + + if (bitStream.Read(fElasticity)) + pObject->SetElasticity(fElasticity); + + if (bitStream.Read(fBuoyancy)) + pObject->SetBuoyancyConstant(fBuoyancy); + + if (bitStream.Read(centerOfMass.fX) && bitStream.Read(centerOfMass.fY) && bitStream.Read(centerOfMass.fZ)) + pObject->SetCenterOfMass(centerOfMass); + } + pObject->SetCollisionEnabled(bCollisonsEnabled); if (ucEntityTypeID == CClientGame::WEAPON) { diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index cacd3290ad..56e2ae0b11 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -815,6 +815,13 @@ bool CStaticFunctionDefinitions::IsElementInWater(CClientEntity& Entity, bool& b bInWater = Vehicle.IsInWater(); break; } + case CCLIENTOBJECT: + case CCLIENTWEAPON: + { + CClientObject& Object = static_cast(Entity); + bInWater = Object.IsInWater(); + break; + } default: return false; } diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp index 5ee0b062b1..e637b8b668 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp @@ -372,16 +372,6 @@ ADD_ENUM(VEHICLE_COMPONENT_EXTRA_1, "extra_1") ADD_ENUM(VEHICLE_COMPONENT_EXTRA_2, "extra_2") IMPLEMENT_ENUM_END("vehicle-component") -IMPLEMENT_ENUM_BEGIN(eObjectProperty) -ADD_ENUM(OBJECT_PROPERTY_ALL, "all") -ADD_ENUM(OBJECT_PROPERTY_MASS, "mass") -ADD_ENUM(OBJECT_PROPERTY_TURNMASS, "turn_mass") -ADD_ENUM(OBJECT_PROPERTY_AIRRESISTANCE, "air_resistance") -ADD_ENUM(OBJECT_PROPERTY_ELASTICITY, "elasticity") -ADD_ENUM(OBJECT_PROPERTY_CENTEROFMASS, "center_of_mass") -ADD_ENUM(OBJECT_PROPERTY_BUOYANCY, "buoyancy") -IMPLEMENT_ENUM_END("object-property") - IMPLEMENT_ENUM_BEGIN(eObjectGroup::Modifiable) ADD_ENUM(eObjectGroup::Modifiable::MASS, "mass") ADD_ENUM(eObjectGroup::Modifiable::TURNMASS, "turn_mass") diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h index 078c798934..49e6a89a10 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h @@ -42,7 +42,6 @@ DECLARE_ENUM(EEntityTypeMask); DECLARE_ENUM(eWeaponState); DECLARE_ENUM(eWeaponFlags); DECLARE_ENUM(eVehicleComponent); -DECLARE_ENUM(eObjectProperty); DECLARE_ENUM(eObjectGroup::Modifiable); DECLARE_ENUM(eObjectGroup::DamageEffect); DECLARE_ENUM(eObjectGroup::CollisionResponse); diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp index c47934bc07..41346efd7d 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp @@ -25,6 +25,7 @@ void CLuaObjectDefs::LoadFunctions() {"getObjectMass", GetObjectMass}, {"getObjectProperty", GetObjectProperty}, {"isObjectMoving", ArgumentParser}, + {"isObjectRespawnEnabled", ArgumentParser}, // Object set funcs {"moveObject", MoveObject}, @@ -61,6 +62,7 @@ void CLuaObjectDefs::AddClass(lua_State* luaVM) lua_classfunction(luaVM, "getProperties", GetObjectProperties); lua_classfunction(luaVM, "getProperty", "getObjectProperty"); lua_classfunction(luaVM, "isMoving", "isObjectMoving"); + lua_classfunction(luaVM, "isRespawnEnabled", "isObjectRespawnEnabled"); lua_classfunction(luaVM, "setScale", "setObjectScale"); lua_classfunction(luaVM, "setBreakable", "setObjectBreakable"); @@ -272,7 +274,7 @@ int CLuaObjectDefs::GetObjectProperty(lua_State* luaVM) lua_setfield(luaVM, -2, EnumToString(eObjectProperty::OBJECT_PROPERTY_TURNMASS)); lua_pushnumber(luaVM, pObject->GetAirResistance()); - lua_setfield(luaVM, -2, EnumToString(eObjectProperty::OBJECT_PROPERTY_TURNMASS)); + lua_setfield(luaVM, -2, EnumToString(eObjectProperty::OBJECT_PROPERTY_AIRRESISTANCE)); lua_pushnumber(luaVM, pObject->GetElasticity()); lua_setfield(luaVM, -2, EnumToString(eObjectProperty::OBJECT_PROPERTY_ELASTICITY)); @@ -707,3 +709,15 @@ int CLuaObjectDefs::SetObjectProperty(lua_State* luaVM) lua_pushboolean(luaVM, false); return 1; } + +bool CLuaObjectDefs::IsObjectRespawnEnabled(CClientEntity* pEntity) +{ + if (!IS_OBJECT(pEntity)) + return false; + + auto* pObject = static_cast(pEntity); + if (!pObject) + return false; + + return pObject->IsRespawnEnabled(); +} diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h index e614ef9f29..1d5ede3492 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h @@ -29,6 +29,7 @@ class CLuaObjectDefs : public CLuaDefs LUA_DECLARE(GetObjectMass); LUA_DECLARE(GetObjectProperty); LUA_DECLARE(GetObjectProperties); + static bool IsObjectRespawnEnabled(CClientEntity* pEntity); // Object set funcs LUA_DECLARE(SetObjectRotation); diff --git a/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp b/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp index 217cd9adcf..a6dbf6595b 100644 --- a/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp +++ b/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp @@ -21,6 +21,9 @@ void CObjectRPCs::LoadFunctions() AddHandler(SET_OBJECT_SCALE, SetObjectScale, "SetObjectScale"); AddHandler(SET_OBJECT_VISIBLE_IN_ALL_DIMENSIONS, SetObjectVisibleInAllDimensions, "SetObjectVisibleInAllDimensions"); AddHandler(SET_OBJECT_BREAKABLE, SetObjectBreakable, "SetObjectBreakable"); + AddHandler(RESPAWN_OBJECT, RespawnObject, "RespawnObject"); + AddHandler(TOGGLE_OBJECT_RESPAWN, ToggleObjectRespawn, "ToggleObjectRespawn"); + AddHandler(SET_OBJECT_PROPERTY, SetObjectProperty, "SetObjectProperty"); } void CObjectRPCs::DestroyAllObjects(NetBitStreamInterface& bitStream) @@ -126,3 +129,73 @@ void CObjectRPCs::SetObjectBreakable(CClientEntity* pSource, NetBitStreamInterfa pObject->SetBreakable(bitStream.ReadBit()); } } + +void CObjectRPCs::RespawnObject(CClientEntity* pSource, NetBitStreamInterface& bitStream) +{ + auto* pObject = static_cast(m_pObjectManager->Get(pSource->GetID())); + + if (pObject) + g_pClientGame->GetObjectRespawner()->Respawn(pObject); +} + +void CObjectRPCs::ToggleObjectRespawn(CClientEntity* pSource, NetBitStreamInterface& bitStream) +{ + auto* pObject = static_cast(m_pObjectManager->Get(pSource->GetID())); + + if (pObject) + pObject->SetRespawnEnabled(bitStream.ReadBit()); +} + +void CObjectRPCs::SetObjectProperty(CClientEntity* pSource, NetBitStreamInterface& bitStream) +{ + auto* pObject = static_cast(m_pObjectManager->Get(pSource->GetID())); + if (!pObject) + return; + + SString sProperty; + if (!bitStream.ReadString(sProperty)) + return; + + float fValue; + CVector vecValue; + if (!bitStream.Read(fValue) && (!bitStream.Read(vecValue.fX) || !bitStream.Read(vecValue.fY) || !bitStream.Read(vecValue.fZ))) + return; + + eObjectProperty eProperty; + if (!StringToEnum(sProperty, eProperty)) + return; + + switch (eProperty) + { + case OBJECT_PROPERTY_MASS: + { + pObject->SetMass(fValue); + break; + } + case OBJECT_PROPERTY_TURNMASS: + { + pObject->SetTurnMass(fValue); + break; + } + case OBJECT_PROPERTY_AIRRESISTANCE: + { + pObject->SetAirResistance(fValue); + break; + } + case OBJECT_PROPERTY_ELASTICITY: + { + pObject->SetElasticity(fValue); + break; + } + case OBJECT_PROPERTY_CENTEROFMASS: + { + pObject->SetCenterOfMass(vecValue); + break; + } + case OBJECT_PROPERTY_BUOYANCY: + { + pObject->SetBuoyancyConstant(fValue); + break; + } + } +} diff --git a/Client/mods/deathmatch/logic/rpc/CObjectRPCs.h b/Client/mods/deathmatch/logic/rpc/CObjectRPCs.h index 26f2219d67..e79836a735 100644 --- a/Client/mods/deathmatch/logic/rpc/CObjectRPCs.h +++ b/Client/mods/deathmatch/logic/rpc/CObjectRPCs.h @@ -26,4 +26,7 @@ class CObjectRPCs : public CRPCFunctions DECLARE_ELEMENT_RPC(SetObjectScale); DECLARE_ELEMENT_RPC(SetObjectVisibleInAllDimensions); DECLARE_ELEMENT_RPC(SetObjectBreakable); + DECLARE_ELEMENT_RPC(RespawnObject); + DECLARE_ELEMENT_RPC(ToggleObjectRespawn); + DECLARE_ELEMENT_RPC(SetObjectProperty); }; diff --git a/Client/sdk/game/Common.h b/Client/sdk/game/Common.h index 503f4c9021..6a44cafffd 100644 --- a/Client/sdk/game/Common.h +++ b/Client/sdk/game/Common.h @@ -1429,7 +1429,7 @@ enum class eResizableVehicleWheelGroup REAR_AXLE, ALL_WHEELS = 0xFF, }; - +/* enum eObjectProperty { OBJECT_PROPERTY_ALL, @@ -1441,7 +1441,7 @@ enum eObjectProperty OBJECT_PROPERTY_BUOYANCY, OBJECT_PROPERTY_MAX, }; - +*/ namespace eObjectGroup { enum Modifiable diff --git a/Server/mods/deathmatch/logic/CCommon.h b/Server/mods/deathmatch/logic/CCommon.h index 2138fadbf7..221a678fc4 100644 --- a/Server/mods/deathmatch/logic/CCommon.h +++ b/Server/mods/deathmatch/logic/CCommon.h @@ -798,3 +798,5 @@ DECLARE_ENUM(eJSONPrettyType); #define WEAPONTYPE_RANDOM_SPEED (0x020000) // #define WEAPONTYPE_FORCE_FINISH_ANIM (0x040000) // force the anim to finish player after aim/fire rather than blending out #define WEAPONTYPE_EXPANDS (0x080000) // + +#define WITH_OBJECT_SYNC 1 diff --git a/Server/mods/deathmatch/logic/CGame.cpp b/Server/mods/deathmatch/logic/CGame.cpp index 2d38b37e3a..2c7caa4f5e 100644 --- a/Server/mods/deathmatch/logic/CGame.cpp +++ b/Server/mods/deathmatch/logic/CGame.cpp @@ -28,6 +28,7 @@ #include "lua/CLuaCallback.h" #include "CWeaponStatManager.h" #include "CPedSync.h" +#include "CObjectSync.h" #include "CHTTPD.h" #include "CBan.h" #include "CPlayerCamera.h" @@ -1548,6 +1549,10 @@ void CGame::AddBuiltInEvents() m_Events.AddEvent("onPlayerVoiceStop", "", NULL, false); // Object events + m_Events.AddEvent("onObjectDamage", "loss, attacker", nullptr, false); + m_Events.AddEvent("onObjectBreak", "attacker", nullptr, false); + m_Events.AddEvent("onObjectMoveStart", "", nullptr, false); + m_Events.AddEvent("onObjectMoveStop", "", nullptr, false); // Pickup events m_Events.AddEvent("onPickupHit", "player", NULL, false); diff --git a/Server/mods/deathmatch/logic/CObject.cpp b/Server/mods/deathmatch/logic/CObject.cpp index c88dbf3e60..554773813f 100644 --- a/Server/mods/deathmatch/logic/CObject.cpp +++ b/Server/mods/deathmatch/logic/CObject.cpp @@ -16,7 +16,7 @@ extern CGame* g_pGame; -CObject::CObject(CElement* pParent, CObjectManager* pObjectManager, bool bIsLowLod) : CElement(pParent), m_bIsLowLod(bIsLowLod), m_pLowLodObject(NULL) +CObject::CObject(CElement* pParent, CObjectManager* pObjectManager, bool bIsLowLod) : CElement(pParent), m_bIsLowLod(bIsLowLod), m_pLowLodObject(nullptr) { // Init m_iType = CElement::OBJECT; @@ -24,15 +24,26 @@ CObject::CObject(CElement* pParent, CObjectManager* pObjectManager, bool bIsLowL m_pObjectManager = pObjectManager; m_usModel = 0xFFFF; - m_pMoveAnimation = NULL; + m_pMoveAnimation = nullptr; m_ucAlpha = 255; m_vecScale = CVector(1.0f, 1.0f, 1.0f); m_fHealth = 1000.0f; m_bSyncable = true; - m_pSyncer = NULL; + m_pSyncer = nullptr; m_bIsFrozen = false; m_bDoubleSided = false; m_bBreakable = false; + m_bInWater = false; + m_bIsStatic = true; + m_bRespawnEnabled = false; + m_bIsMoving = false; + + m_fMass = -1.0f; + m_fTurnMass = -1.0f; + m_fAirResistance = -1.0f; + m_fElasticity = -1.0f; + m_fBuoyancyConstant = -1.0f; + m_vecCenterOfMass = CVector(0.0f, 0.0f, 0.0f); m_bCollisionsEnabled = true; @@ -58,9 +69,12 @@ CObject::CObject(const CObject& Copy) : CElement(Copy.m_pParent), m_bIsLowLod(Co m_bBreakable = Copy.m_bBreakable; m_vecPosition = Copy.m_vecPosition; m_vecRotation = Copy.m_vecRotation; + m_bInWater = Copy.m_bInWater; + m_bIsStatic = Copy.m_bIsStatic; + m_bIsMoving = Copy.m_bIsMoving; - m_pMoveAnimation = NULL; - if (Copy.m_pMoveAnimation != NULL) + m_pMoveAnimation = nullptr; + if (Copy.m_pMoveAnimation != nullptr) { m_pMoveAnimation = new CPositionRotationAnimation(*Copy.m_pMoveAnimation); } @@ -74,14 +88,14 @@ CObject::CObject(const CObject& Copy) : CElement(Copy.m_pParent), m_bIsLowLod(Co CObject::~CObject() { - if (m_pMoveAnimation != NULL) + if (m_pMoveAnimation != nullptr) { delete m_pMoveAnimation; - m_pMoveAnimation = NULL; + m_pMoveAnimation = nullptr; } // Remove syncer - SetSyncer(NULL); + SetSyncer(nullptr); // Unlink us from manager Unlink(); @@ -98,9 +112,9 @@ void CObject::Unlink() m_pObjectManager->RemoveFromList(this); // Remove LowLod refs in others - SetLowLodObject(NULL); + SetLowLodObject(nullptr); while (!m_HighLodObjectList.empty()) - m_HighLodObjectList[0]->SetLowLodObject(NULL); + m_HighLodObjectList[0]->SetLowLodObject(nullptr); } bool CObject::ReadSpecialData(const int iLine) @@ -229,17 +243,15 @@ const CVector& CObject::GetPosition() // Are we attached to something? if (m_pAttachedTo) GetAttachedPosition(m_vecPosition); - // Are we moving? else if (IsMoving()) { SPositionRotation positionRotation; bool bStillRunning = m_pMoveAnimation->GetValue(positionRotation); m_vecPosition = positionRotation.m_vecPosition; + if (!bStillRunning) - { StopMoving(); - } } if (vecOldPosition != m_vecPosition) @@ -274,17 +286,16 @@ void CObject::GetRotation(CVector& vecRotation) // Are we attached to something? if (m_pAttachedTo) GetAttachedRotation(vecRotation); - // Are we moving? else if (IsMoving()) { SPositionRotation positionRotation; bool bStillRunning = m_pMoveAnimation->GetValue(positionRotation); m_vecRotation = positionRotation.m_vecRotation; + if (!bStillRunning) - { StopMoving(); - } + vecRotation = m_vecRotation; } } @@ -301,36 +312,31 @@ void CObject::SetRotation(const CVector& vecRotation) // Different rotation? if (m_vecRotation != vecRotation) - { // Set the new rotation m_vecRotation = vecRotation; - } } bool CObject::IsMoving() { // Are we currently moving? - if (m_pMoveAnimation != NULL) + if (m_pMoveAnimation != nullptr) { // Should we have stopped moving by now? if (!m_pMoveAnimation->IsRunning()) - { // Stop our movement StopMoving(); - } } + // Are we still moving after the above check? - return (m_pMoveAnimation != NULL); + return (m_pMoveAnimation != nullptr); } void CObject::Move(const CPositionRotationAnimation& a_rMoveAnimation) { // Are we already moving? if (IsMoving()) - { // Stop our current movement StopMoving(); - } if (a_rMoveAnimation.IsRunning()) { @@ -346,35 +352,34 @@ void CObject::Move(const CPositionRotationAnimation& a_rMoveAnimation) SetPosition(positionRotation.m_vecPosition); SetRotation(positionRotation.m_vecRotation); } + + CLuaArguments Arguments; + CallEvent("onObjectMoveStart", Arguments); + + m_bIsMoving = true; } void CObject::StopMoving() { + if (!m_pMoveAnimation) + return; + // Were we moving in the first place - if (m_pMoveAnimation != NULL) - { - SPositionRotation positionRotation; - m_pMoveAnimation->GetValue(positionRotation); - m_vecPosition = positionRotation.m_vecPosition; - m_vecRotation = positionRotation.m_vecRotation; + SPositionRotation positionRotation; + m_pMoveAnimation->GetValue(positionRotation); + m_vecPosition = positionRotation.m_vecPosition; + m_vecRotation = positionRotation.m_vecRotation; - delete m_pMoveAnimation; - m_pMoveAnimation = NULL; + delete m_pMoveAnimation; + m_pMoveAnimation = nullptr; - UpdateSpatialData(); - } + UpdateSpatialData(); } const CPositionRotationAnimation* CObject::GetMoveAnimation() { - if (IsMoving()) // Call IsMoving since it will make sure the anim is stopped if it's finished - { - return m_pMoveAnimation; - } - else - { - return NULL; - } + // Call IsMoving since it will make sure the anim is stopped if it's finished + return (IsMoving() ? m_pMoveAnimation : nullptr); } void CObject::SetSyncer(CPlayer* pPlayer) @@ -386,15 +391,12 @@ void CObject::SetSyncer(CPlayer* pPlayer) // Update the last player if any bAlreadyIn = true; if (m_pSyncer) - { m_pSyncer->RemoveSyncingObject(this); - } // Update the new player if (pPlayer) - { pPlayer->AddSyncingObject(this); - } + bAlreadyIn = false; // Set it @@ -425,7 +427,7 @@ bool CObject::SetLowLodObject(CObject* pNewLowLodObject) // Clear there and here ListRemove(m_pLowLodObject->m_HighLodObjectList, this); - m_pLowLodObject = NULL; + m_pLowLodObject = nullptr; return true; } else @@ -435,7 +437,7 @@ bool CObject::SetLowLodObject(CObject* pNewLowLodObject) return false; // Remove any previous link - SetLowLodObject(NULL); + SetLowLodObject(nullptr); // Make new link m_pLowLodObject = pNewLowLodObject; @@ -446,7 +448,21 @@ bool CObject::SetLowLodObject(CObject* pNewLowLodObject) CObject* CObject::GetLowLodObject() { - if (m_bIsLowLod) - return NULL; - return m_pLowLodObject; + return (m_bIsLowLod ? nullptr : m_pLowLodObject); +} + +void CObject::SetMoveSpeed(CVector vecMoveSpeed) +{ + m_vecMoveSpeed = vecMoveSpeed; + + // Mark an object as non-static + SetStatic(false); +} + +void CObject::SetTurnSpeed(CVector vecTurnSpeed) +{ + m_vecTurnSpeed = vecTurnSpeed; + + // Mark an object as non-static + SetStatic(false); } diff --git a/Server/mods/deathmatch/logic/CObject.h b/Server/mods/deathmatch/logic/CObject.h index 9e2c23c360..1b259ea978 100644 --- a/Server/mods/deathmatch/logic/CObject.h +++ b/Server/mods/deathmatch/logic/CObject.h @@ -47,41 +47,74 @@ class CObject : public CElement void StopMoving(); const CPositionRotationAnimation* GetMoveAnimation(); - unsigned char GetAlpha() { return m_ucAlpha; } + unsigned char GetAlpha() const { return m_ucAlpha; } void SetAlpha(unsigned char ucAlpha) { m_ucAlpha = ucAlpha; } - unsigned short GetModel() { return m_usModel; } + unsigned short GetModel() const { return m_usModel; } void SetModel(unsigned short usModel) { m_usModel = usModel; } - const CVector& GetScale() { return m_vecScale; } + const CVector& GetScale() const { return m_vecScale; } void SetScale(const CVector& vecScale) { m_vecScale = vecScale; } - bool GetCollisionEnabled() { return m_bCollisionsEnabled; } + bool GetCollisionEnabled() const { return m_bCollisionsEnabled; } void SetCollisionEnabled(bool bCollisionEnabled) { m_bCollisionsEnabled = bCollisionEnabled; } - bool IsFrozen() { return m_bIsFrozen; } + bool IsFrozen() const { return m_bIsFrozen; } void SetFrozen(bool bFrozen) { m_bIsFrozen = bFrozen; } - float GetHealth() { return m_fHealth; } + float GetHealth() const { return m_fHealth; } void SetHealth(float fHealth) { m_fHealth = fHealth; } - bool IsSyncable() { return m_bSyncable; } + bool IsSyncable() const { return m_bSyncable; } void SetSyncable(bool bSyncable) { m_bSyncable = bSyncable; } - CPlayer* GetSyncer() { return m_pSyncer; } + CPlayer* GetSyncer() const { return m_pSyncer; } void SetSyncer(CPlayer* pPlayer); bool IsLowLod(); bool SetLowLodObject(CObject* pLowLodObject); CObject* GetLowLodObject(); - bool IsVisibleInAllDimensions() { return m_bVisibleInAllDimensions; }; + bool IsVisibleInAllDimensions() const { return m_bVisibleInAllDimensions; }; void SetVisibleInAllDimensions(bool bVisible) { m_bVisibleInAllDimensions = bVisible; }; - bool IsBreakable() { return m_bBreakable; } + bool IsBreakable() const { return m_bBreakable; } void SetBreakable(bool bBreakable) { m_bBreakable = bBreakable; } -protected: + CVector GetMoveSpeed() const { return m_vecMoveSpeed; } + void SetMoveSpeed(CVector vecMoveSpeed); + + CVector GetTurnSpeed() const { return m_vecTurnSpeed; } + void SetTurnSpeed(CVector vecTurnSpeed); + + bool IsStatic() const { return m_bIsStatic; } + void SetStatic(bool bStatic) { m_bIsStatic = bStatic; } + + bool IsInWater() const { return m_bInWater; } + void SetInWater(bool bInWater) { m_bInWater = bInWater; } + + bool IsRespawnEnabled() const { return m_bRespawnEnabled; } + void SetRespawnEnabled(bool bEnabled) { m_bRespawnEnabled = bEnabled; } + + float GetMass() const { return m_fMass; } + void SetMass(float fMass) { m_fMass = fMass; }; + + float GetTurnMass() const { return m_fTurnMass; } + void SetTurnMass(float fTurnMass) { m_fTurnMass = fTurnMass; } + + float GetAirResistance() const { return m_fAirResistance; } + void SetAirResistance(float fResistance) { m_fAirResistance = fResistance; } + + float GetElasticity() const { return m_fElasticity; } + void SetElasticity(float fElasticity) { m_fElasticity = fElasticity; } + + float GetBuoyancyConstant() const { return m_fBuoyancyConstant; } + void SetBuoyancyConstant(float fBuoyancy) { m_fBuoyancyConstant = fBuoyancy; } + + CVector GetCenterOfMass() const { return m_vecCenterOfMass; } + void SetCenterOfMass(CVector vecCenterOfMass) { m_vecCenterOfMass = vecCenterOfMass; } + + protected: bool ReadSpecialData(const int iLine) override; private: @@ -96,6 +129,19 @@ class CObject : public CElement bool m_bSyncable; CPlayer* m_pSyncer; bool m_bVisibleInAllDimensions = false; + CVector m_vecMoveSpeed; + CVector m_vecTurnSpeed; + bool m_bInWater; + bool m_bIsStatic; // true if the object never moved using setElementVelocity/setElementAngularVelocity + bool m_bRespawnEnabled; + + // Properties + float m_fMass; + float m_fTurnMass; + float m_fAirResistance; + float m_fElasticity; + float m_fBuoyancyConstant; + CVector m_vecCenterOfMass; protected: bool m_bCollisionsEnabled; @@ -106,4 +152,5 @@ class CObject : public CElement public: CPositionRotationAnimation* m_pMoveAnimation; + bool m_bIsMoving; // Value for the onObjectMoveStop event }; diff --git a/Server/mods/deathmatch/logic/CObjectManager.h b/Server/mods/deathmatch/logic/CObjectManager.h index 1f975cf26f..8654eb3018 100644 --- a/Server/mods/deathmatch/logic/CObjectManager.h +++ b/Server/mods/deathmatch/logic/CObjectManager.h @@ -14,6 +14,8 @@ #include "CObject.h" #include +#define WITH_OBJECT_SYNC 1 + using std::list; class CObject; diff --git a/Server/mods/deathmatch/logic/CObjectSync.cpp b/Server/mods/deathmatch/logic/CObjectSync.cpp index f17f640675..71cb06a76d 100644 --- a/Server/mods/deathmatch/logic/CObjectSync.cpp +++ b/Server/mods/deathmatch/logic/CObjectSync.cpp @@ -11,16 +11,20 @@ #include "StdInc.h" #include "CObjectSync.h" +#include +#include "CElementIDs.h" +#include "packets/CObjectStartSyncPacket.h" +#include "packets/CObjectStopSyncPacket.h" +#include "CGame.h" +#include "CColManager.h" #ifdef WITH_OBJECT_SYNC -#define SYNC_RATE 500 -#define MAX_PLAYER_SYNC_DISTANCE 100.0f + #define SYNC_RATE 500 + #define MAX_PLAYER_SYNC_DISTANCE 100.0f -CObjectSync::CObjectSync(CPlayerManager* pPlayerManager, CObjectManager* pObjectManager) +CObjectSync::CObjectSync(CPlayerManager* pPlayerManager, CObjectManager* pObjectManager) : m_pPlayerManager(pPlayerManager), m_pObjectManager(pObjectManager) { - m_pPlayerManager = pPlayerManager; - m_pObjectManager = pObjectManager; } void CObjectSync::DoPulse() @@ -53,9 +57,7 @@ void CObjectSync::OverrideSyncer(CObject* pObject, CPlayer* pPlayer, bool bPersi if (pSyncer == pPlayer) { if (bPersist == false) - { SetSyncerAsPersistent(false); - } return; } @@ -73,7 +75,7 @@ void CObjectSync::OverrideSyncer(CObject* pObject, CPlayer* pPlayer, bool bPersi void CObjectSync::Update() { // Update all objects - list::const_iterator iter = m_pObjectManager->IterBegin(); + CFastList::const_iterator iter = m_pObjectManager->IterBegin(); for (; iter != m_pObjectManager->IterEnd(); iter++) { UpdateObject(*iter); @@ -85,14 +87,13 @@ void CObjectSync::UpdateObject(CObject* pObject) CPlayer* pSyncer = pObject->GetSyncer(); // Does the object need to be synced? - // We have no reason to sync static and unbreakable objects - if (!pObject->IsSyncable() || (pObject->IsStatic() && !pObject->IsBreakable())) + // We have no reason to sync frozen and unbreakable objects + if (!pObject->IsSyncable() || (pObject->IsFrozen() && !pObject->IsBreakable())) { if (pSyncer) - { // Tell the syncer to stop syncing StopSync(pObject); - } + return; } @@ -101,7 +102,7 @@ void CObjectSync::UpdateObject(CObject* pObject) { // Does the syncer still near the object? if (!IsSyncerPersistent() && !IsPointNearPoint3D(pSyncer->GetPosition(), pObject->GetPosition(), MAX_PLAYER_SYNC_DISTANCE) || - (pObject->GetDimension() != pSyncer->GetDimension())) + (pObject->GetDimension() != pSyncer->GetDimension()) || (pObject->GetInterior() != pSyncer->GetInterior())) { // Stop him from syncing it StopSync(pObject); @@ -111,21 +112,19 @@ void CObjectSync::UpdateObject(CObject* pObject) } } else - { // Try to find a syncer FindSyncer(pObject); - } } void CObjectSync::FindSyncer(CObject* pObject) { // Find a player close enough to it CPlayer* pPlayer = FindPlayerCloseToObject(pObject, MAX_PLAYER_SYNC_DISTANCE); - if (pPlayer) - { - // Tell him to start syncing it - StartSync(pPlayer, pObject); - } + if (!pPlayer) + return; + + // Tell him to start syncing it + StartSync(pPlayer, pObject); } void CObjectSync::StartSync(CPlayer* pPlayer, CObject* pObject) @@ -152,7 +151,7 @@ void CObjectSync::StopSync(CObject* pObject) pSyncer->Send(CObjectStopSyncPacket(pObject)); // Unmark him as the syncing player - pObject->SetSyncer(NULL); + pObject->SetSyncer(nullptr); SetSyncerAsPersistent(false); @@ -168,7 +167,7 @@ CPlayer* CObjectSync::FindPlayerCloseToObject(CObject* pObject, float fMaxDistan CVector vecPosition = pObject->GetPosition(); // See if any players are close enough - CPlayer* pSyncer = NULL; + CPlayer* pSyncer = nullptr; list::const_iterator iter = m_pPlayerManager->IterBegin(); for (; iter != m_pPlayerManager->IterEnd(); iter++) { @@ -181,9 +180,7 @@ CPlayer* CObjectSync::FindPlayerCloseToObject(CObject* pObject, float fMaxDistan { // Prefer a player that syncs less objects if (!pSyncer || pPlayer->CountSyncingObjects() < pSyncer->CountSyncingObjects()) - { pSyncer = pPlayer; - } } } } @@ -196,43 +193,106 @@ void CObjectSync::Packet_ObjectSync(CObjectSyncPacket& Packet) { // Grab the player CPlayer* pPlayer = Packet.GetSourcePlayer(); - if (pPlayer && pPlayer->IsJoined()) + if (!pPlayer || !pPlayer->IsJoined()) + return; + + // Apply the data for each object in the packet + std::vector::const_iterator iter = Packet.IterBegin(); + for (; iter != Packet.IterEnd(); iter++) { - // Apply the data for each object in the packet - vector::const_iterator iter = Packet.IterBegin(); - for (; iter != Packet.IterEnd(); iter++) + CObjectSyncPacket::SyncData* pData = *iter; + + // Grab the element + CElement* pElement = CElementIDs::GetElement(pData->ID); + if (!pElement || !IS_OBJECT(pElement)) + continue; + + // Is the player syncing this object? + CObject* pObject = static_cast(pElement); + if (!pObject || pObject->GetSyncer() != pPlayer || !pObject->CanUpdateSync(pData->ucSyncTimeContext)) + continue; + + // Apply the data to the object + if (pData->ucFlags & 0x1) { - CObjectSyncPacket::SyncData* pData = *iter; + pObject->SetPosition(pData->vecPosition); + g_pGame->GetColManager()->DoHitDetection(pObject->GetPosition(), pObject); + } + if (pData->ucFlags & 0x2) + pObject->SetRotation(pData->vecRotation); + if (pData->ucFlags & 0x4) + pObject->SetMoveSpeed(pData->vecVelocity); // Sync velocity from client + if (pData->ucFlags & 0x8) + pObject->SetTurnSpeed(pData->vecTurnVelocity); // Sync angular velocity from client + if (pData->ucFlags & 0x10) + { + float fPreviousHealth = pObject->GetHealth(); + pObject->SetHealth(pData->fHealth); - // Grab the element - CElement* pElement = CElementIDs::GetElement(pData->ID); - if (pElement && IS_OBJECT(pElement)) + if (pData->fHealth < fPreviousHealth) { - CObject* pObject = static_cast(pElement); + CElement* pAttacker = CElementIDs::GetElement(pData->attackerID); - // Is the player syncing this object? - if ((pObject->GetSyncer() == pPlayer) && pObject->CanUpdateSync(pData->ucSyncTimeContext)) + if (pData->fHealth > 0) { - // Apply the data to the object - if (pData->ucFlags & 0x1) + float fLoss = fPreviousHealth - pData->fHealth; + + if (fLoss > 0) { - pObject->SetPosition(pData->vecPosition); - g_pGame->GetColManager()->DoHitDetection(pObject->GetPosition(), pObject); + CLuaArguments Arguments; + Arguments.PushNumber(fLoss); + + if (pAttacker) + Arguments.PushElement(pAttacker); + else + Arguments.PushNil(); + + pObject->CallEvent("onObjectDamage", Arguments); } - if (pData->ucFlags & 0x2) - pObject->SetRotation(pData->vecRotation); - if (pData->ucFlags & 0x4) - pObject->SetHealth(pData->fHealth); + } + else // object has been break? + { + CLuaArguments Arguments; + if (pAttacker) + Arguments.PushElement(pAttacker); + else + Arguments.PushNil(); - // Send this sync - pData->bSend = true; + pObject->CallEvent("onObjectBreak", Arguments); } } } + if (pData->ucFlags & 0x20) // Sync inWater state from client + pObject->SetInWater(pData->bIsInWater); + // Sync properties + if (pData->ucFlags & 0x40) + pObject->SetMass(pData->fMass); + if (pData->ucFlags & 0x80) + pObject->SetTurnMass(pData->fTurnMass); + if (pData->ucFlags & 0x100) + pObject->SetAirResistance(pData->fAirResistance); + if (pData->ucFlags & 0x200) + pObject->SetElasticity(pData->fElasticity); + if (pData->ucFlags & 0x400) + pObject->SetBuoyancyConstant(pData->fBuoyancyConstant); + if (pData->ucFlags & 0x800) + pObject->SetCenterOfMass(pData->vecCenterOfMass); + + // We check whether the object is marked as "moving" and whether it is actually still moving + if (pObject->m_bIsMoving && !pObject->IsMoving()) + { + CLuaArguments Arguments; + pObject->CallEvent("onObjectMoveStop", Arguments); - // Tell everyone - m_pPlayerManager->BroadcastOnlyJoined(Packet, pPlayer); + pObject->m_bIsMoving = false; + } + + // Send this sync + pData->bSend = true; } + + // Tell everyone + m_pPlayerManager->BroadcastOnlyJoined(Packet, pPlayer); } #endif diff --git a/Server/mods/deathmatch/logic/CObjectSync.h b/Server/mods/deathmatch/logic/CObjectSync.h index 09b7166d8b..26cff826d3 100644 --- a/Server/mods/deathmatch/logic/CObjectSync.h +++ b/Server/mods/deathmatch/logic/CObjectSync.h @@ -10,11 +10,11 @@ *****************************************************************************/ #pragma once +#include "CObjectManager.h" #ifdef WITH_OBJECT_SYNC #include "CPlayerManager.h" -#include "CObjectManager.h" #include "packets/CObjectSyncPacket.h" class CObjectSync diff --git a/Server/mods/deathmatch/logic/CPerfStat.RPCPacketUsage.cpp b/Server/mods/deathmatch/logic/CPerfStat.RPCPacketUsage.cpp index 1e02f4abad..0b1cf9d0a3 100644 --- a/Server/mods/deathmatch/logic/CPerfStat.RPCPacketUsage.cpp +++ b/Server/mods/deathmatch/logic/CPerfStat.RPCPacketUsage.cpp @@ -224,6 +224,8 @@ ADD_ENUM1(UPDATE_COLPOLYGON_POINT) ADD_ENUM1(SET_DISCORD_JOIN_PARAMETERS) ADD_ENUM1(SET_COLPOLYGON_HEIGHT) ADD_ENUM1(SET_OBJECT_BREAKABLE) +ADD_ENUM1(RESPAWN_OBJECT) +ADD_ENUM1(TOGGLE_OBJECT_RESPAWN) IMPLEMENT_ENUM_END("eElementRPCFunctions") DECLARE_ENUM(CRPCFunctions::eRPCFunctions); diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 9c1853c21c..4ec954ffb7 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -32,6 +32,7 @@ #include "CColPolygon.h" #include "CColSphere.h" #include "CPedSync.h" +#include "CObjectSync.h" #include "CZoneNames.h" #include "CKeyBinds.h" #include "CAccountManager.h" @@ -906,6 +907,13 @@ bool CStaticFunctionDefinitions::IsElementInWater(CElement* pElement, bool& bInW bInWater = pVehicle->IsInWater(); break; } + case CElement::OBJECT: + case CElement::WEAPON: + { + CObject* pObject = static_cast(pElement); + bInWater = pObject->IsInWater(); + break; + } default: return false; } @@ -1193,6 +1201,14 @@ bool CStaticFunctionDefinitions::GetElementVelocity(CElement* pElement, CVector& break; } + case CElement::OBJECT: + case CElement::WEAPON: + { + CObject* pObject = static_cast(pElement); + vecVelocity = pObject->GetMoveSpeed(); + + break; + } default: return false; } @@ -1214,6 +1230,13 @@ bool CStaticFunctionDefinitions::GetElementTurnVelocity(CElement* pElement, CVec break; } + case CElement::WEAPON: + case CElement::OBJECT: + { + CObject* pObject = static_cast(pElement); + vecTurnVelocity = pObject->GetTurnSpeed(); + break; + } default: return false; } @@ -1360,7 +1383,8 @@ bool CStaticFunctionDefinitions::SetElementVelocity(CElement* pElement, const CV case CElement::OBJECT: case CElement::WEAPON: { - // Don't store velocity serverside (requires potentially needless additional sizeof(CVector) bytes per object) + CObject* pObject = static_cast(pElement); + pObject->SetMoveSpeed(vecVelocity); break; } default: @@ -1400,7 +1424,9 @@ bool CStaticFunctionDefinitions::SetElementAngularVelocity(CElement* pElement, c case CElement::OBJECT: case CElement::WEAPON: { - // Don't store velocity serverside (requires potentially needless additional sizeof(CVector) bytes per object) + CObject* pObject = static_cast(pElement); + pObject->SetTurnSpeed(vecTurnVelocity); + break; } default: @@ -12414,3 +12440,130 @@ bool CStaticFunctionDefinitions::SetColPolygonHeight(CColPolygon* pColPolygon, f return false; } + +bool CStaticFunctionDefinitions::ToggleObjectRespawn(CElement* pElement, bool enableRespawn) +{ + RUN_CHILDREN(ToggleObjectRespawn(*iter, enableRespawn)) + + if (!IS_OBJECT(pElement)) + return false; + + CObject* pObject = static_cast(pElement); + if (!pObject || pObject->IsRespawnEnabled() == enableRespawn) + return false; + + pObject->SetRespawnEnabled(enableRespawn); + + CBitStream bitStream; + bitStream->WriteBit(enableRespawn); + m_pPlayerManager->BroadcastOnlyJoined(CElementRPCPacket(pObject, TOGGLE_OBJECT_RESPAWN, *bitStream.pBitStream)); + + return true; +} + +bool CStaticFunctionDefinitions::RespawnObject(CElement* pElement) +{ + RUN_CHILDREN(RespawnObject(*iter)) + + if (!IS_OBJECT(pElement)) + return false; + + CObject* pObject = static_cast(pElement); + if (!pObject) + return false; + + CBitStream bitStream; + m_pPlayerManager->BroadcastOnlyJoined(CElementRPCPacket(pObject, RESPAWN_OBJECT, *bitStream.pBitStream)); + + return true; +} + +bool CStaticFunctionDefinitions::SetObjectProperty(CElement* pElement, std::string sProperty, std::variant vValue) +{ + RUN_CHILDREN(SetObjectProperty(*iter, sProperty, vValue)) + + if (!IS_OBJECT(pElement)) + return false; + + CObject* pObject = static_cast(pElement); + if (!pObject) + return false; + + eObjectProperty eProperty; + if (!StringToEnum(sProperty, eProperty)) + return false; + + switch (eProperty) + { + case OBJECT_PROPERTY_MASS: + { + if (auto pMass = std::get_if(&vValue)) + pObject->SetMass(*pMass); + else + return false; + + break; + } + case OBJECT_PROPERTY_TURNMASS: + { + if (auto pTurnMass = std::get_if(&vValue)) + pObject->SetTurnMass(*pTurnMass); + else + return false; + + break; + } + case OBJECT_PROPERTY_AIRRESISTANCE: + { + if (auto pAirRes = std::get_if(&vValue)) + pObject->SetAirResistance(*pAirRes); + else + return false; + + break; + } + case OBJECT_PROPERTY_ELASTICITY: + { + if (auto pElasticity = std::get_if(&vValue)) + pObject->SetElasticity(*pElasticity); + else + return false; + + break; + } + case OBJECT_PROPERTY_CENTEROFMASS: + { + if (auto pVec = std::get_if(&vValue)) + pObject->SetCenterOfMass(*pVec); + else + return false; + + break; + } + case OBJECT_PROPERTY_BUOYANCY: + { + if (auto pBuo = std::get_if(&vValue)) + pObject->SetBuoyancyConstant(*pBuo); + else + return false; + + break; + } + } + + CBitStream bitStream; + bitStream->WriteString(sProperty); + if (std::holds_alternative(vValue)) + bitStream->Write(std::get(vValue)); + else if (std::holds_alternative(vValue)) + { + CVector vecValue = std::get(vValue); + bitStream->Write(vecValue.fX); + bitStream->Write(vecValue.fY); + bitStream->Write(vecValue.fZ); + } + + m_pPlayerManager->BroadcastOnlyJoined(CElementRPCPacket(pObject, SET_OBJECT_PROPERTY, *bitStream.pBitStream)); + + return true; +} diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h index fe9d20ebf8..4c544ddf9d 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h @@ -17,6 +17,7 @@ class CStaticFunctionDefinitions; #include "CRegistry.h" #include "lua/CLuaFunctionParseHelpers.h" #include +#include class CVector2D; struct SLineOfSightFlags; @@ -407,6 +408,7 @@ class CStaticFunctionDefinitions // Object create/destroy functions static CObject* CreateObject(CResource* pResource, unsigned short usModelID, const CVector& vecPosition, const CVector& vecRotation, bool bIsLowLod); + static bool RespawnObject(CElement* pElement); // Object get functions static bool GetObjectRotation(CObject* pObject, CVector& vecRotation); @@ -421,6 +423,8 @@ class CStaticFunctionDefinitions static bool StopObject(CElement* pElement); static bool SetObjectVisibleInAllDimensions(CElement* pElement, bool bVisible, unsigned short usNewDimension = 0); static bool SetObjectBreakable(CElement* pElement, const bool bBreakable); + static bool ToggleObjectRespawn(CElement* pElement, const bool bEnable); + static bool SetObjectProperty(CElement* pElement, const std::string sProperty, std::variant vValue); // Radar area create/destroy funcs static CRadarArea* CreateRadarArea(CResource* pResource, const CVector2D& vecPosition, const CVector2D& vecSize, const SColor color, CElement* pVisibleTo); diff --git a/Server/mods/deathmatch/logic/lua/LuaCommon.cpp b/Server/mods/deathmatch/logic/lua/LuaCommon.cpp index 553121be40..ee22dd678a 100644 --- a/Server/mods/deathmatch/logic/lua/LuaCommon.cpp +++ b/Server/mods/deathmatch/logic/lua/LuaCommon.cpp @@ -441,6 +441,22 @@ void lua_classfunction(lua_State* luaVM, const char* szFunction, const char* fn) dassert(false); } +void lua_classfunction(lua_State* luaVM, const char* szFunction, lua_CFunction fn) +{ + if (fn) + { + lua_pushstring(luaVM, "__class"); + lua_rawget(luaVM, -2); + + lua_pushstring(luaVM, szFunction); + lua_pushstring(luaVM, szFunction); + lua_pushcclosure(luaVM, fn, 1); + lua_rawset(luaVM, -3); + + lua_pop(luaVM, 1); + } +} + void lua_classvariable(lua_State* luaVM, const char* szVariable, const char* szACLNameSet, const char* szACLNameGet, lua_CFunction set, lua_CFunction get, bool bACLIgnore) { @@ -488,6 +504,48 @@ void lua_classvariable(lua_State* luaVM, const char* szVariable, const char* szA lua_pop(luaVM, 1); } +void lua_classvariable(lua_State* luaVM, const char* szVariable, lua_CFunction set, lua_CFunction get) +{ + lua_pushstring(luaVM, "__set"); + lua_rawget(luaVM, -2); + + if (!set) + { + lua_pushstring(luaVM, szVariable); + lua_pushstring(luaVM, szVariable); + lua_pushcclosure(luaVM, CLuaClassDefs::ReadOnly, 1); + lua_rawset(luaVM, -3); + } + else + { + lua_pushstring(luaVM, szVariable); + lua_pushstring(luaVM, szVariable); + lua_pushcclosure(luaVM, set, 1); + lua_rawset(luaVM, -3); + } + lua_pop(luaVM, 1); + + // Get + lua_pushstring(luaVM, "__get"); + lua_rawget(luaVM, -2); + + if (!get) + { + lua_pushstring(luaVM, szVariable); + lua_pushstring(luaVM, szVariable); + lua_pushcclosure(luaVM, CLuaClassDefs::WriteOnly, 1); + lua_rawset(luaVM, -3); + } + else + { + lua_pushstring(luaVM, szVariable); + lua_pushstring(luaVM, szVariable); + lua_pushcclosure(luaVM, get, 1); + lua_rawset(luaVM, -3); + } + lua_pop(luaVM, 1); +} + void lua_classvariable(lua_State* luaVM, const char* szVariable, const char* set, const char* get) { lua_CFunction fnSet = NULL; diff --git a/Server/mods/deathmatch/logic/lua/LuaCommon.h b/Server/mods/deathmatch/logic/lua/LuaCommon.h index d5489c3997..f3ac10130e 100644 --- a/Server/mods/deathmatch/logic/lua/LuaCommon.h +++ b/Server/mods/deathmatch/logic/lua/LuaCommon.h @@ -61,8 +61,10 @@ void lua_registerclass(lua_State* luaVM, const char* szName, const char* szParen void lua_registerstaticclass(lua_State* luaVM, const char* szName); void lua_classfunction(lua_State* luaVM, const char* szFunction, const char* szACLName, lua_CFunction fn); void lua_classfunction(lua_State* luaVM, const char* szFunction, const char* fn); +void lua_classfunction(lua_State* luaVM, const char* szFunction, lua_CFunction fn); void lua_classvariable(lua_State* luaVM, const char* szVariable, const char* szACLNameSet, const char* szACLNameGet, lua_CFunction set, lua_CFunction get, bool bACLIgnore = true); +void lua_classvariable(lua_State* luaVM, const char* szVariable, lua_CFunction set, lua_CFunction get); void lua_classvariable(lua_State* luaVM, const char* szVariable, const char* set, const char* get); void lua_classmetamethod(lua_State* luaVM, const char* szName, lua_CFunction fn); diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp index e07f5c7655..4757335678 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp @@ -19,12 +19,15 @@ void CLuaObjectDefs::LoadFunctions() constexpr static const std::pair functions[]{ // Object create/destroy funcs {"createObject", CreateObject}, + {"respawnObject", ArgumentParser}, // Object get funcs {"getObjectRotation", GetObjectRotation}, {"getObjectScale", GetObjectScale}, {"isObjectBreakable", ArgumentParser}, {"isObjectMoving", ArgumentParser}, + {"isObjectRespawnEnabled", ArgumentParser}, + {"getObjectProperty", GetObjectProperty}, // Object set funcs {"setObjectRotation", SetObjectRotation}, @@ -32,6 +35,8 @@ void CLuaObjectDefs::LoadFunctions() {"setObjectBreakable", ArgumentParser}, {"moveObject", MoveObject}, {"stopObject", StopObject}, + {"toggleObjectRespawn", ArgumentParser}, + {"setObjectProperty", ArgumentParser}, }; // Add functions @@ -46,16 +51,23 @@ void CLuaObjectDefs::AddClass(lua_State* luaVM) lua_classfunction(luaVM, "create", "createObject"); lua_classfunction(luaVM, "move", "moveObject"); lua_classfunction(luaVM, "stop", "stopObject"); + lua_classfunction(luaVM, "respawn", "respawnObject"); lua_classfunction(luaVM, "getScale", "getObjectScale"); lua_classfunction(luaVM, "setScale", "setObjectScale"); lua_classfunction(luaVM, "isBreakable", "isObjectBreakable"); lua_classfunction(luaVM, "setBreakable", "setObjectBreakable"); lua_classfunction(luaVM, "isMoving", "isObjectMoving"); + lua_classfunction(luaVM, "toggleRespawn", "toggleObjectRespawn"); + lua_classfunction(luaVM, "isRespawnEnabled", "isObjectRespawnEnabled"); + lua_classfunction(luaVM, "getProperties", GetObjectProperties); + lua_classfunction(luaVM, "getProperty", "getObjectProperty"); + lua_classfunction(luaVM, "setProperty", "setObjectProperty"); lua_classvariable(luaVM, "scale", "setObjectScale", "getObjectScale"); lua_classvariable(luaVM, "breakable", "setObjectBreakable", "isObjectBreakable"); lua_classvariable(luaVM, "moving", nullptr, "isObjectMoving"); + lua_classvariable(luaVM, "properties", nullptr, GetObjectProperties); lua_registerclass(luaVM, "Object", "Element"); } @@ -305,3 +317,113 @@ bool CLuaObjectDefs::SetObjectBreakable(CObject* const pObject, const bool bBrea { return CStaticFunctionDefinitions::SetObjectBreakable(pObject, bBreakable); } + +bool CLuaObjectDefs::RespawnObject(CObject* const pObject) +{ + return CStaticFunctionDefinitions::RespawnObject(pObject); +} + +bool CLuaObjectDefs::ToggleObjectRespawn(CObject* const pObject, const bool bEnable) +{ + return CStaticFunctionDefinitions::ToggleObjectRespawn(pObject, bEnable); +} + +bool CLuaObjectDefs::IsObjectRespawnEnabled(CObject* const pObject) +{ + return pObject->IsRespawnEnabled(); +} + +int CLuaObjectDefs::GetObjectProperties(lua_State* luaVM) +{ + lua_pushstring(luaVM, "all"); + return GetObjectProperty(luaVM); +} + +int CLuaObjectDefs::GetObjectProperty(lua_State* luaVM) +{ + CObject* pObject; + eObjectProperty eProperty; + + CScriptArgReader argStream(luaVM); + argStream.ReadUserData(pObject); + argStream.ReadEnumString(eProperty, eObjectProperty::OBJECT_PROPERTY_MAX); + + if (argStream.HasErrors()) + { + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } + + switch (eProperty) + { + case OBJECT_PROPERTY_ALL: + { + lua_newtable(luaVM); + + lua_pushnumber(luaVM, pObject->GetMass()); + lua_setfield(luaVM, -2, EnumToString(eObjectProperty::OBJECT_PROPERTY_MASS)); + + lua_pushnumber(luaVM, pObject->GetTurnMass()); + lua_setfield(luaVM, -2, EnumToString(eObjectProperty::OBJECT_PROPERTY_TURNMASS)); + + lua_pushnumber(luaVM, pObject->GetAirResistance()); + lua_setfield(luaVM, -2, EnumToString(eObjectProperty::OBJECT_PROPERTY_AIRRESISTANCE)); + + lua_pushnumber(luaVM, pObject->GetElasticity()); + lua_setfield(luaVM, -2, EnumToString(eObjectProperty::OBJECT_PROPERTY_ELASTICITY)); + + lua_pushvector(luaVM, pObject->GetCenterOfMass()); + lua_setfield(luaVM, -2, EnumToString(eObjectProperty::OBJECT_PROPERTY_CENTEROFMASS)); + + lua_pushnumber(luaVM, pObject->GetBuoyancyConstant()); + lua_setfield(luaVM, -2, EnumToString(eObjectProperty::OBJECT_PROPERTY_BUOYANCY)); + return 1; + break; + } + case OBJECT_PROPERTY_MASS: + { + lua_pushnumber(luaVM, pObject->GetMass()); + return 1; + break; + } + case OBJECT_PROPERTY_TURNMASS: + { + lua_pushnumber(luaVM, pObject->GetTurnMass()); + return 1; + break; + } + case OBJECT_PROPERTY_AIRRESISTANCE: + { + lua_pushnumber(luaVM, pObject->GetAirResistance()); + return 1; + break; + } + case OBJECT_PROPERTY_ELASTICITY: + { + lua_pushnumber(luaVM, pObject->GetElasticity()); + return 1; + } + case OBJECT_PROPERTY_CENTEROFMASS: + { + CVector vecCenterOfMass = pObject->GetCenterOfMass(); + lua_pushnumber(luaVM, vecCenterOfMass.fX); + lua_pushnumber(luaVM, vecCenterOfMass.fY); + lua_pushnumber(luaVM, vecCenterOfMass.fZ); + + return 1; + break; + } + case OBJECT_PROPERTY_BUOYANCY: + { + lua_pushnumber(luaVM, pObject->GetBuoyancyConstant()); + return 1; + break; + } + } +} + +bool CLuaObjectDefs::SetObjectProperty(CObject* const pObject, const std::string sProperty, const std::variant vValue) +{ + return CStaticFunctionDefinitions::SetObjectProperty(pObject, sProperty, vValue); +} diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h b/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h index bef8a4af45..628280c5f4 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h +++ b/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h @@ -20,6 +20,7 @@ class CLuaObjectDefs : public CLuaDefs // Object create/destroy functions LUA_DECLARE(CreateObject); + static bool RespawnObject(CObject* const pObject); // Object get functions LUA_DECLARE(GetObjectName); @@ -27,6 +28,9 @@ class CLuaObjectDefs : public CLuaDefs LUA_DECLARE(GetObjectScale); static bool IsObjectBreakable(CObject* const pObject); static bool IsObjectMoving(CObject* const pObject); + static bool IsObjectRespawnEnabled(CObject* const pObject); + LUA_DECLARE(GetObjectProperty); + LUA_DECLARE(GetObjectProperties); // Object set functions LUA_DECLARE(SetObjectName); @@ -35,4 +39,6 @@ class CLuaObjectDefs : public CLuaDefs static bool SetObjectBreakable(CObject* const pObject, const bool bBreakable); LUA_DECLARE(MoveObject); LUA_DECLARE(StopObject); + static bool ToggleObjectRespawn(CObject* const pObject, const bool bEnabled); + static bool SetObjectProperty(CObject* const pObject, const std::string sProperty, const std::variant vValue); }; diff --git a/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp b/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp index 858cf5c56b..0a1cfc14fa 100644 --- a/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp @@ -297,6 +297,24 @@ bool CEntityAddPacket::Write(NetBitStreamInterface& BitStream) const health.data.fValue = pObject->GetHealth(); BitStream.Write(&health); + // Static, respawnable & properties + if (BitStream.Can(eBitStreamVersion::ObjectSync_FixAndUpdate)) + { + BitStream.WriteBit(pObject->IsStatic()); + BitStream.WriteBit(pObject->IsRespawnEnabled()); + + BitStream.Write(pObject->GetMass()); + BitStream.Write(pObject->GetTurnMass()); + BitStream.Write(pObject->GetAirResistance()); + BitStream.Write(pObject->GetElasticity()); + BitStream.Write(pObject->GetBuoyancyConstant()); + + CVector vecCenterOfMass = pObject->GetCenterOfMass(); + BitStream.Write(vecCenterOfMass.fX); + BitStream.Write(vecCenterOfMass.fY); + BitStream.Write(vecCenterOfMass.fZ); + } + if (ucEntityTypeID == CElement::WEAPON) { CCustomWeapon* pWeapon = static_cast(pElement); diff --git a/Server/mods/deathmatch/logic/packets/CObjectStartSyncPacket.cpp b/Server/mods/deathmatch/logic/packets/CObjectStartSyncPacket.cpp index 6bd5c2ee54..cdfbf3809b 100644 --- a/Server/mods/deathmatch/logic/packets/CObjectStartSyncPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CObjectStartSyncPacket.cpp @@ -32,6 +32,16 @@ bool CObjectStartSyncPacket::Write(NetBitStreamInterface& BitStream) const m_pObject->GetRotation(rotation.data.vecRotation); BitStream.Write(&rotation); + // Write the velocity + SVelocitySync velocity; + velocity.data.vecVelocity = m_pObject->GetMoveSpeed(); + BitStream.Write(&velocity); + + // Write the angular velocity + SVelocitySync turnVelocity; + turnVelocity.data.vecVelocity = m_pObject->GetTurnSpeed(); + BitStream.Write(&turnVelocity); + // Write the health SObjectHealthSync health; health.data.fValue = m_pObject->GetHealth(); diff --git a/Server/mods/deathmatch/logic/packets/CObjectSyncPacket.cpp b/Server/mods/deathmatch/logic/packets/CObjectSyncPacket.cpp index 28f6dfae0d..64905e1ce8 100644 --- a/Server/mods/deathmatch/logic/packets/CObjectSyncPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CObjectSyncPacket.cpp @@ -40,13 +40,14 @@ bool CObjectSyncPacket::Read(NetBitStreamInterface& BitStream) if (!BitStream.Read(pData->ucSyncTimeContext)) return false; - // Read out flags - SIntegerSync flags; - if (!BitStream.Read(&flags)) + // Read out the flags + //SIntegerSync flags; + unsigned int flags; + if (!BitStream.Read(flags)) return false; pData->ucFlags = flags; - // Read out the position if we need + // Read out the position if (flags & 0x1) { SPositionSync position; @@ -64,15 +65,100 @@ bool CObjectSyncPacket::Read(NetBitStreamInterface& BitStream) pData->vecRotation = rotation.data.vecRotation; } - // Read out the health + // Read out the velocity if (flags & 0x4) + { + SVelocitySync velocity; + if (!BitStream.Read(&velocity)) + return false; + + pData->vecVelocity = velocity.data.vecVelocity; + } + + // Read out the angular velocity + if (flags & 0x8) + { + SVelocitySync angularVelocity; + if (!BitStream.Read(&angularVelocity)) + return false; + + pData->vecTurnVelocity = angularVelocity.data.vecVelocity; + } + + // Read out the health & attacker + if (flags & 0x10) { SObjectHealthSync health; - if (!BitStream.Read(&health)) + if (!BitStream.Read(&health) || !BitStream.Read(pData->attackerID)) return false; pData->fHealth = health.data.fValue; } + // Read out inWater state + if (flags & 0x20) + pData->bIsInWater = BitStream.ReadBit(); + + // Read properties + // Read mass + if (flags & 0x40) + { + float fMass; + if (!BitStream.Read(fMass)) + return false; + + pData->fMass = fMass; + } + + // Read turn mass + if (flags & 0x80) + { + float fTurnMass; + if (!BitStream.Read(fTurnMass)) + return false; + + pData->fTurnMass = fTurnMass; + } + + // Read air resistance + if (flags & 0x100) + { + float fAirResistance; + if (!BitStream.Read(fAirResistance)) + return false; + + pData->fAirResistance = fAirResistance; + } + + // Read elasticity + if (flags & 0x200) + { + float fElasticity; + if (!BitStream.Read(fElasticity)) + return false; + + pData->fElasticity = fElasticity; + } + + // Read Buoyancy Constant + if (flags & 0x400) + { + float fBuoyancyConstant; + if (!BitStream.Read(fBuoyancyConstant)) + return false; + + pData->fBuoyancyConstant = fBuoyancyConstant; + } + + // Read center of mass + if (flags & 0x800) + { + CVector centerOfMass; + if (!BitStream.Read(centerOfMass.fX) || !BitStream.Read(centerOfMass.fY) || !BitStream.Read(centerOfMass.fZ)) + return false; + + pData->vecCenterOfMass = centerOfMass; + } + // Add it to our list m_Syncs.push_back(pData); } @@ -97,11 +183,12 @@ bool CObjectSyncPacket::Write(NetBitStreamInterface& BitStream) const // Write the sync time context BitStream.Write(pData->ucSyncTimeContext); - // Write flags - SIntegerSync flags(pData->ucFlags); - BitStream.Write(&flags); + // Write the flags + //SIntegerSync flags(pData->ucFlags); + unsigned int flags = pData->ucFlags; + BitStream.Write(flags); - // Write position if we need + // Write the position if (flags & 0x1) { SPositionSync position; @@ -109,7 +196,7 @@ bool CObjectSyncPacket::Write(NetBitStreamInterface& BitStream) const BitStream.Write(&position); } - // Write rotation + // Write the rotation if (flags & 0x2) { SRotationRadiansSync rotation; @@ -117,11 +204,63 @@ bool CObjectSyncPacket::Write(NetBitStreamInterface& BitStream) const BitStream.Write(&rotation); } - // Write health + // Write the velocity if (flags & 0x4) + { + SVelocitySync velocity; + velocity.data.vecVelocity = pData->vecVelocity; + BitStream.Write(&velocity); + } + + // Write the angular velocity + if (flags & 0x8) + { + SVelocitySync angularVelocity; + angularVelocity.data.vecVelocity = pData->vecTurnVelocity; + BitStream.Write(&angularVelocity); + } + + // Write the health & attacker + if (flags & 0x10) { SObjectHealthSync health; health.data.fValue = pData->fHealth; + BitStream.Write(&health); + BitStream.Write(pData->attackerID); + } + + // Write the inWater state + if (flags & 0x20) + BitStream.WriteBit(pData->bIsInWater); + + // Write the properties + // Write mass + if (flags & 0x40) + BitStream.Write(pData->fMass); + + // Write turn mass + if (flags & 0x80) + BitStream.Write(pData->fTurnMass); + + // Write air resistance + if (flags & 0x100) + BitStream.Write(pData->fAirResistance); + + // Write elasticity + if (flags & 0x200) + BitStream.Write(pData->fElasticity); + + // Write buoyancy constant + if (flags & 0x400) + BitStream.Write(pData->fBuoyancyConstant); + + // Write center of mass + if (flags & 0x800) + { + CVector centerOfMass = pData->vecCenterOfMass; + BitStream.Write(centerOfMass.fX); + BitStream.Write(centerOfMass.fY); + BitStream.Write(centerOfMass.fZ); } // We've sent atleast one sync diff --git a/Server/mods/deathmatch/logic/packets/CObjectSyncPacket.h b/Server/mods/deathmatch/logic/packets/CObjectSyncPacket.h index e5db9bbe00..7cebfb7180 100644 --- a/Server/mods/deathmatch/logic/packets/CObjectSyncPacket.h +++ b/Server/mods/deathmatch/logic/packets/CObjectSyncPacket.h @@ -23,9 +23,20 @@ class CObjectSyncPacket final : public CPacket ElementID ID; CVector vecPosition; CVector vecRotation; + CVector vecVelocity; + CVector vecTurnVelocity; float fHealth; + bool bIsInWater; + ElementID attackerID; + float fMass; + float fTurnMass; + float fAirResistance; + float fElasticity; + float fBuoyancyConstant; + CVector vecCenterOfMass; + unsigned char ucSyncTimeContext; - unsigned char ucFlags; + unsigned int ucFlags; bool bSend; }; diff --git a/Shared/mods/deathmatch/logic/Enums.cpp b/Shared/mods/deathmatch/logic/Enums.cpp index cfac0aaf54..83f2fb2957 100644 --- a/Shared/mods/deathmatch/logic/Enums.cpp +++ b/Shared/mods/deathmatch/logic/Enums.cpp @@ -212,3 +212,13 @@ ADD_ENUM1(PACKET_ID_SERVER_INFO_SYNC) ADD_ENUM1(PACKET_ID_DISCORD_JOIN) ADD_ENUM1(PACKET_ID_PLAYER_RESOURCE_START) IMPLEMENT_ENUM_END("ePacketID") + +IMPLEMENT_ENUM_BEGIN(eObjectProperty) +ADD_ENUM(OBJECT_PROPERTY_ALL, "all") +ADD_ENUM(OBJECT_PROPERTY_MASS, "mass") +ADD_ENUM(OBJECT_PROPERTY_TURNMASS, "turn_mass") +ADD_ENUM(OBJECT_PROPERTY_AIRRESISTANCE, "air_resistance") +ADD_ENUM(OBJECT_PROPERTY_ELASTICITY, "elasticity") +ADD_ENUM(OBJECT_PROPERTY_CENTEROFMASS, "center_of_mass") +ADD_ENUM(OBJECT_PROPERTY_BUOYANCY, "buoyancy") +IMPLEMENT_ENUM_END("object-property") diff --git a/Shared/mods/deathmatch/logic/Enums.h b/Shared/mods/deathmatch/logic/Enums.h index c57480b5fd..8f9566f9c7 100644 --- a/Shared/mods/deathmatch/logic/Enums.h +++ b/Shared/mods/deathmatch/logic/Enums.h @@ -93,3 +93,16 @@ enum class WorldSpecialProperty DECLARE_ENUM_CLASS(WorldSpecialProperty); DECLARE_ENUM(ePacketID); + +enum eObjectProperty +{ + OBJECT_PROPERTY_ALL, + OBJECT_PROPERTY_MASS, + OBJECT_PROPERTY_TURNMASS, + OBJECT_PROPERTY_AIRRESISTANCE, + OBJECT_PROPERTY_ELASTICITY, + OBJECT_PROPERTY_CENTEROFMASS, + OBJECT_PROPERTY_BUOYANCY, + OBJECT_PROPERTY_MAX, +}; +DECLARE_ENUM(eObjectProperty); diff --git a/Shared/sdk/net/bitstream.h b/Shared/sdk/net/bitstream.h index 099946e473..8a559d7537 100644 --- a/Shared/sdk/net/bitstream.h +++ b/Shared/sdk/net/bitstream.h @@ -544,6 +544,10 @@ enum class eBitStreamVersion : unsigned short // 2024-05-17 WorldSpecialProperty_RoadSignsText, + // Object sync fix & improvments + // 2024-05-21 + ObjectSync_FixAndUpdate, + // This allows us to automatically increment the BitStreamVersion when things are added to this enum. // Make sure you only add things above this comment. Next, diff --git a/Shared/sdk/net/rpc_enums.h b/Shared/sdk/net/rpc_enums.h index 2749267f09..5624ab79d7 100644 --- a/Shared/sdk/net/rpc_enums.h +++ b/Shared/sdk/net/rpc_enums.h @@ -277,5 +277,9 @@ enum eElementRPCFunctions SET_WORLD_SPECIAL_PROPERTY, + TOGGLE_OBJECT_RESPAWN, + RESPAWN_OBJECT, + SET_OBJECT_PROPERTY, + NUM_RPC_FUNCS // Add above this line }; From 6c555e0af0707c3ca714eebfc3c4f370e79319a3 Mon Sep 17 00:00:00 2001 From: FileEX Date: Tue, 11 Jun 2024 17:07:43 +0200 Subject: [PATCH 2/6] Remove spawn functions --- .../mods/deathmatch/logic/CPacketHandler.cpp | 4 +- .../logic/luadefs/CLuaObjectDefs.cpp | 15 -------- .../deathmatch/logic/luadefs/CLuaObjectDefs.h | 1 - .../mods/deathmatch/logic/rpc/CObjectRPCs.cpp | 18 --------- .../mods/deathmatch/logic/rpc/CObjectRPCs.h | 2 - Server/mods/deathmatch/logic/CObject.cpp | 1 - Server/mods/deathmatch/logic/CObject.h | 4 -- .../logic/CStaticFunctionDefinitions.cpp | 37 ------------------- .../logic/CStaticFunctionDefinitions.h | 2 - .../logic/luadefs/CLuaObjectDefs.cpp | 21 ----------- .../deathmatch/logic/luadefs/CLuaObjectDefs.h | 3 -- .../logic/packets/CEntityAddPacket.cpp | 3 +- Shared/sdk/net/bitstream.h | 8 ++-- Shared/sdk/net/rpc_enums.h | 3 -- 14 files changed, 6 insertions(+), 116 deletions(-) diff --git a/Client/mods/deathmatch/logic/CPacketHandler.cpp b/Client/mods/deathmatch/logic/CPacketHandler.cpp index 2030d8e0f0..7b4431be7f 100644 --- a/Client/mods/deathmatch/logic/CPacketHandler.cpp +++ b/Client/mods/deathmatch/logic/CPacketHandler.cpp @@ -2728,7 +2728,6 @@ void CPacketHandler::Packet_EntityAdd(NetBitStreamInterface& bitStream) // SObjectHealthSync (?) - health // bool (1) - is break // bool (1) - static flag - // bool (1) - respawnEnabled // float (4) - properties (mass, turnMass etc) // CVector (12) - center_of_mass property @@ -3097,11 +3096,10 @@ void CPacketHandler::Packet_EntityAdd(NetBitStreamInterface& bitStream) pObject->Break(); } - // Set static, respawnable & properties + // Set static & properties if (bitStream.Can(eBitStreamVersion::ObjectSync_FixAndUpdate)) { pObject->SetStatic(bitStream.ReadBit()); - pObject->SetRespawnEnabled(bitStream.ReadBit()); float fMass, fTurnMass, fAirResistance, fElasticity, fBuoyancy; CVector centerOfMass; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp index 41346efd7d..3514e9d773 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp @@ -25,7 +25,6 @@ void CLuaObjectDefs::LoadFunctions() {"getObjectMass", GetObjectMass}, {"getObjectProperty", GetObjectProperty}, {"isObjectMoving", ArgumentParser}, - {"isObjectRespawnEnabled", ArgumentParser}, // Object set funcs {"moveObject", MoveObject}, @@ -54,7 +53,6 @@ void CLuaObjectDefs::AddClass(lua_State* luaVM) lua_classfunction(luaVM, "stop", "stopObject"); lua_classfunction(luaVM, "break", "breakObject"); lua_classfunction(luaVM, "respawn", "respawnObject"); - lua_classfunction(luaVM, "toggleRespawn", "toggleObjectRespawn"); lua_classfunction(luaVM, "getScale", "getObjectScale"); lua_classfunction(luaVM, "isBreakable", "isObjectBreakable"); @@ -62,7 +60,6 @@ void CLuaObjectDefs::AddClass(lua_State* luaVM) lua_classfunction(luaVM, "getProperties", GetObjectProperties); lua_classfunction(luaVM, "getProperty", "getObjectProperty"); lua_classfunction(luaVM, "isMoving", "isObjectMoving"); - lua_classfunction(luaVM, "isRespawnEnabled", "isObjectRespawnEnabled"); lua_classfunction(luaVM, "setScale", "setObjectScale"); lua_classfunction(luaVM, "setBreakable", "setObjectBreakable"); @@ -709,15 +706,3 @@ int CLuaObjectDefs::SetObjectProperty(lua_State* luaVM) lua_pushboolean(luaVM, false); return 1; } - -bool CLuaObjectDefs::IsObjectRespawnEnabled(CClientEntity* pEntity) -{ - if (!IS_OBJECT(pEntity)) - return false; - - auto* pObject = static_cast(pEntity); - if (!pObject) - return false; - - return pObject->IsRespawnEnabled(); -} diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h index 1d5ede3492..e614ef9f29 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h @@ -29,7 +29,6 @@ class CLuaObjectDefs : public CLuaDefs LUA_DECLARE(GetObjectMass); LUA_DECLARE(GetObjectProperty); LUA_DECLARE(GetObjectProperties); - static bool IsObjectRespawnEnabled(CClientEntity* pEntity); // Object set funcs LUA_DECLARE(SetObjectRotation); diff --git a/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp b/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp index 334fce77fd..cb7d5cde4d 100644 --- a/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp +++ b/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp @@ -22,8 +22,6 @@ void CObjectRPCs::LoadFunctions() AddHandler(SET_OBJECT_VISIBLE_IN_ALL_DIMENSIONS, SetObjectVisibleInAllDimensions, "SetObjectVisibleInAllDimensions"); AddHandler(SET_OBJECT_BREAKABLE, SetObjectBreakable, "SetObjectBreakable"); AddHandler(BREAK_OBJECT, BreakObject, "BreakObject"); - AddHandler(RESPAWN_OBJECT, RespawnObject, "RespawnObject"); - AddHandler(TOGGLE_OBJECT_RESPAWN, ToggleObjectRespawn, "ToggleObjectRespawn"); AddHandler(SET_OBJECT_PROPERTY, SetObjectProperty, "SetObjectProperty"); } @@ -139,22 +137,6 @@ void CObjectRPCs::BreakObject(CClientEntity* pSource, NetBitStreamInterface& bit pObject->Break(); } -void CObjectRPCs::RespawnObject(CClientEntity* pSource, NetBitStreamInterface& bitStream) -{ - auto* pObject = static_cast(m_pObjectManager->Get(pSource->GetID())); - - if (pObject) - g_pClientGame->GetObjectRespawner()->Respawn(pObject); -} - -void CObjectRPCs::ToggleObjectRespawn(CClientEntity* pSource, NetBitStreamInterface& bitStream) -{ - auto* pObject = static_cast(m_pObjectManager->Get(pSource->GetID())); - - if (pObject) - pObject->SetRespawnEnabled(bitStream.ReadBit()); -} - void CObjectRPCs::SetObjectProperty(CClientEntity* pSource, NetBitStreamInterface& bitStream) { auto* pObject = static_cast(m_pObjectManager->Get(pSource->GetID())); diff --git a/Client/mods/deathmatch/logic/rpc/CObjectRPCs.h b/Client/mods/deathmatch/logic/rpc/CObjectRPCs.h index 813fead942..3ac3929a4e 100644 --- a/Client/mods/deathmatch/logic/rpc/CObjectRPCs.h +++ b/Client/mods/deathmatch/logic/rpc/CObjectRPCs.h @@ -27,7 +27,5 @@ class CObjectRPCs : public CRPCFunctions DECLARE_ELEMENT_RPC(SetObjectVisibleInAllDimensions); DECLARE_ELEMENT_RPC(SetObjectBreakable); DECLARE_ELEMENT_RPC(BreakObject); - DECLARE_ELEMENT_RPC(RespawnObject); - DECLARE_ELEMENT_RPC(ToggleObjectRespawn); DECLARE_ELEMENT_RPC(SetObjectProperty); }; diff --git a/Server/mods/deathmatch/logic/CObject.cpp b/Server/mods/deathmatch/logic/CObject.cpp index 554773813f..ff4e633f9f 100644 --- a/Server/mods/deathmatch/logic/CObject.cpp +++ b/Server/mods/deathmatch/logic/CObject.cpp @@ -35,7 +35,6 @@ CObject::CObject(CElement* pParent, CObjectManager* pObjectManager, bool bIsLowL m_bBreakable = false; m_bInWater = false; m_bIsStatic = true; - m_bRespawnEnabled = false; m_bIsMoving = false; m_fMass = -1.0f; diff --git a/Server/mods/deathmatch/logic/CObject.h b/Server/mods/deathmatch/logic/CObject.h index 1b259ea978..f1f9dfe99a 100644 --- a/Server/mods/deathmatch/logic/CObject.h +++ b/Server/mods/deathmatch/logic/CObject.h @@ -93,9 +93,6 @@ class CObject : public CElement bool IsInWater() const { return m_bInWater; } void SetInWater(bool bInWater) { m_bInWater = bInWater; } - bool IsRespawnEnabled() const { return m_bRespawnEnabled; } - void SetRespawnEnabled(bool bEnabled) { m_bRespawnEnabled = bEnabled; } - float GetMass() const { return m_fMass; } void SetMass(float fMass) { m_fMass = fMass; }; @@ -133,7 +130,6 @@ class CObject : public CElement CVector m_vecTurnSpeed; bool m_bInWater; bool m_bIsStatic; // true if the object never moved using setElementVelocity/setElementAngularVelocity - bool m_bRespawnEnabled; // Properties float m_fMass; diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 669b8b6fa1..c82b0a49e0 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -12463,43 +12463,6 @@ bool CStaticFunctionDefinitions::SetColPolygonHeight(CColPolygon* pColPolygon, f return false; } -bool CStaticFunctionDefinitions::ToggleObjectRespawn(CElement* pElement, bool enableRespawn) -{ - RUN_CHILDREN(ToggleObjectRespawn(*iter, enableRespawn)) - - if (!IS_OBJECT(pElement)) - return false; - - CObject* pObject = static_cast(pElement); - if (!pObject || pObject->IsRespawnEnabled() == enableRespawn) - return false; - - pObject->SetRespawnEnabled(enableRespawn); - - CBitStream bitStream; - bitStream->WriteBit(enableRespawn); - m_pPlayerManager->BroadcastOnlyJoined(CElementRPCPacket(pObject, TOGGLE_OBJECT_RESPAWN, *bitStream.pBitStream)); - - return true; -} - -bool CStaticFunctionDefinitions::RespawnObject(CElement* pElement) -{ - RUN_CHILDREN(RespawnObject(*iter)) - - if (!IS_OBJECT(pElement)) - return false; - - CObject* pObject = static_cast(pElement); - if (!pObject) - return false; - - CBitStream bitStream; - m_pPlayerManager->BroadcastOnlyJoined(CElementRPCPacket(pObject, RESPAWN_OBJECT, *bitStream.pBitStream)); - - return true; -} - bool CStaticFunctionDefinitions::SetObjectProperty(CElement* pElement, std::string sProperty, std::variant vValue) { RUN_CHILDREN(SetObjectProperty(*iter, sProperty, vValue)) diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h index 7f02445e03..3ffc32b34f 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h @@ -408,7 +408,6 @@ class CStaticFunctionDefinitions // Object create/destroy functions static CObject* CreateObject(CResource* pResource, unsigned short usModelID, const CVector& vecPosition, const CVector& vecRotation, bool bIsLowLod); - static bool RespawnObject(CElement* pElement); // Object get functions static bool GetObjectRotation(CObject* pObject, CVector& vecRotation); @@ -424,7 +423,6 @@ class CStaticFunctionDefinitions static bool BreakObject(CElement* pElement); static bool SetObjectVisibleInAllDimensions(CElement* pElement, bool bVisible, unsigned short usNewDimension = 0); static bool SetObjectBreakable(CElement* pElement, const bool bBreakable); - static bool ToggleObjectRespawn(CElement* pElement, const bool bEnable); static bool SetObjectProperty(CElement* pElement, const std::string sProperty, std::variant vValue); // Radar area create/destroy funcs diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp index a80ed8e62e..2920ebf2fd 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp @@ -19,14 +19,12 @@ void CLuaObjectDefs::LoadFunctions() constexpr static const std::pair functions[]{ // Object create/destroy funcs {"createObject", CreateObject}, - {"respawnObject", ArgumentParser}, // Object get funcs {"getObjectRotation", GetObjectRotation}, {"getObjectScale", GetObjectScale}, {"isObjectBreakable", ArgumentParser}, {"isObjectMoving", ArgumentParser}, - {"isObjectRespawnEnabled", ArgumentParser}, {"getObjectProperty", GetObjectProperty}, // Object set funcs @@ -36,7 +34,6 @@ void CLuaObjectDefs::LoadFunctions() {"moveObject", MoveObject}, {"stopObject", StopObject}, {"breakObject", ArgumentParser}, - {"toggleObjectRespawn", ArgumentParser}, {"setObjectProperty", ArgumentParser}, }; @@ -53,15 +50,12 @@ void CLuaObjectDefs::AddClass(lua_State* luaVM) lua_classfunction(luaVM, "move", "moveObject"); lua_classfunction(luaVM, "stop", "stopObject"); lua_classfunction(luaVM, "break", "breakObject"); - lua_classfunction(luaVM, "respawn", "respawnObject"); lua_classfunction(luaVM, "getScale", "getObjectScale"); lua_classfunction(luaVM, "setScale", "setObjectScale"); lua_classfunction(luaVM, "isBreakable", "isObjectBreakable"); lua_classfunction(luaVM, "setBreakable", "setObjectBreakable"); lua_classfunction(luaVM, "isMoving", "isObjectMoving"); - lua_classfunction(luaVM, "toggleRespawn", "toggleObjectRespawn"); - lua_classfunction(luaVM, "isRespawnEnabled", "isObjectRespawnEnabled"); lua_classfunction(luaVM, "getProperties", GetObjectProperties); lua_classfunction(luaVM, "getProperty", "getObjectProperty"); lua_classfunction(luaVM, "setProperty", "setObjectProperty"); @@ -325,21 +319,6 @@ bool CLuaObjectDefs::BreakObject(CObject* const pObject) return CStaticFunctionDefinitions::BreakObject(pObject); } -bool CLuaObjectDefs::RespawnObject(CObject* const pObject) -{ - return CStaticFunctionDefinitions::RespawnObject(pObject); -} - -bool CLuaObjectDefs::ToggleObjectRespawn(CObject* const pObject, const bool bEnable) -{ - return CStaticFunctionDefinitions::ToggleObjectRespawn(pObject, bEnable); -} - -bool CLuaObjectDefs::IsObjectRespawnEnabled(CObject* const pObject) -{ - return pObject->IsRespawnEnabled(); -} - int CLuaObjectDefs::GetObjectProperties(lua_State* luaVM) { lua_pushstring(luaVM, "all"); diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h b/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h index deb4c2dec6..4cf017d28d 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h +++ b/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h @@ -20,7 +20,6 @@ class CLuaObjectDefs : public CLuaDefs // Object create/destroy functions LUA_DECLARE(CreateObject); - static bool RespawnObject(CObject* const pObject); // Object get functions LUA_DECLARE(GetObjectName); @@ -28,7 +27,6 @@ class CLuaObjectDefs : public CLuaDefs LUA_DECLARE(GetObjectScale); static bool IsObjectBreakable(CObject* const pObject); static bool IsObjectMoving(CObject* const pObject); - static bool IsObjectRespawnEnabled(CObject* const pObject); LUA_DECLARE(GetObjectProperty); LUA_DECLARE(GetObjectProperties); @@ -40,6 +38,5 @@ class CLuaObjectDefs : public CLuaDefs LUA_DECLARE(MoveObject); LUA_DECLARE(StopObject); static bool BreakObject(CObject* const pObject); - static bool ToggleObjectRespawn(CObject* const pObject, const bool bEnabled); static bool SetObjectProperty(CObject* const pObject, const std::string sProperty, const std::variant vValue); }; diff --git a/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp b/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp index 068836b5c1..9984a5de69 100644 --- a/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp @@ -301,11 +301,10 @@ bool CEntityAddPacket::Write(NetBitStreamInterface& BitStream) const if (BitStream.Can(eBitStreamVersion::BreakObject_Serverside)) BitStream.WriteBit(pObject->GetHealth() <= 0); - // Static, respawnable & properties + // Static & properties if (BitStream.Can(eBitStreamVersion::ObjectSync_FixAndUpdate)) { BitStream.WriteBit(pObject->IsStatic()); - BitStream.WriteBit(pObject->IsRespawnEnabled()); BitStream.Write(pObject->GetMass()); BitStream.Write(pObject->GetTurnMass()); diff --git a/Shared/sdk/net/bitstream.h b/Shared/sdk/net/bitstream.h index e2d474ab49..e850d5624c 100644 --- a/Shared/sdk/net/bitstream.h +++ b/Shared/sdk/net/bitstream.h @@ -544,10 +544,6 @@ enum class eBitStreamVersion : unsigned short // 2024-05-17 WorldSpecialProperty_RoadSignsText, - // Object sync fix & improvments - // 2024-05-21 - ObjectSync_FixAndUpdate, - // Add "extendedwatercannons" to setWorldSpecialPropertyEnabled // 2024-05-23 WorldSpecialProperty_ExtendedWaterCannons, @@ -556,6 +552,10 @@ enum class eBitStreamVersion : unsigned short // 2024-05-31 BreakObject_Serverside, + // Object sync fix & improvments + // 2024-06-11 + ObjectSync_FixAndUpdate, + // This allows us to automatically increment the BitStreamVersion when things are added to this enum. // Make sure you only add things above this comment. Next, diff --git a/Shared/sdk/net/rpc_enums.h b/Shared/sdk/net/rpc_enums.h index ac9639af41..ee2096c552 100644 --- a/Shared/sdk/net/rpc_enums.h +++ b/Shared/sdk/net/rpc_enums.h @@ -278,9 +278,6 @@ enum eElementRPCFunctions SET_WORLD_SPECIAL_PROPERTY, BREAK_OBJECT, - - TOGGLE_OBJECT_RESPAWN, - RESPAWN_OBJECT, SET_OBJECT_PROPERTY, NUM_RPC_FUNCS // Add above this line From e435ef0d7194bfd2ce139dc84c9bc7e65972c79a Mon Sep 17 00:00:00 2001 From: FileEX Date: Tue, 11 Jun 2024 17:35:52 +0200 Subject: [PATCH 3/6] Fix build --- Server/mods/deathmatch/logic/CPerfStat.RPCPacketUsage.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Server/mods/deathmatch/logic/CPerfStat.RPCPacketUsage.cpp b/Server/mods/deathmatch/logic/CPerfStat.RPCPacketUsage.cpp index ebca153e14..8ba4a7573f 100644 --- a/Server/mods/deathmatch/logic/CPerfStat.RPCPacketUsage.cpp +++ b/Server/mods/deathmatch/logic/CPerfStat.RPCPacketUsage.cpp @@ -225,8 +225,6 @@ ADD_ENUM1(SET_DISCORD_JOIN_PARAMETERS) ADD_ENUM1(SET_COLPOLYGON_HEIGHT) ADD_ENUM1(SET_OBJECT_BREAKABLE) ADD_ENUM1(BREAK_OBJECT) -ADD_ENUM1(RESPAWN_OBJECT) -ADD_ENUM1(TOGGLE_OBJECT_RESPAWN) IMPLEMENT_ENUM_END("eElementRPCFunctions") DECLARE_ENUM(CRPCFunctions::eRPCFunctions); From c856dd991136dba1e2c27eb699a631f43bd8c694 Mon Sep 17 00:00:00 2001 From: FileEX Date: Tue, 11 Jun 2024 17:45:18 +0200 Subject: [PATCH 4/6] Restored accidentally deleted --- Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp index 3514e9d773..b49490d613 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp @@ -53,6 +53,7 @@ void CLuaObjectDefs::AddClass(lua_State* luaVM) lua_classfunction(luaVM, "stop", "stopObject"); lua_classfunction(luaVM, "break", "breakObject"); lua_classfunction(luaVM, "respawn", "respawnObject"); + lua_classfunction(luaVM, "toggleRespawn", "toggleObjectRespawn"); lua_classfunction(luaVM, "getScale", "getObjectScale"); lua_classfunction(luaVM, "isBreakable", "isObjectBreakable"); From 843af2d030042c413f6f8d855396fccf8359fd1c Mon Sep 17 00:00:00 2001 From: FileEX Date: Tue, 11 Jun 2024 18:40:16 +0200 Subject: [PATCH 5/6] New logic for onObjectMoveStop --- Server/mods/deathmatch/logic/CObject.cpp | 7 ++++--- Server/mods/deathmatch/logic/CObject.h | 2 +- Server/mods/deathmatch/logic/CObjectSync.cpp | 18 +++++++++--------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/Server/mods/deathmatch/logic/CObject.cpp b/Server/mods/deathmatch/logic/CObject.cpp index ff4e633f9f..d6d4755225 100644 --- a/Server/mods/deathmatch/logic/CObject.cpp +++ b/Server/mods/deathmatch/logic/CObject.cpp @@ -70,12 +70,12 @@ CObject::CObject(const CObject& Copy) : CElement(Copy.m_pParent), m_bIsLowLod(Co m_vecRotation = Copy.m_vecRotation; m_bInWater = Copy.m_bInWater; m_bIsStatic = Copy.m_bIsStatic; - m_bIsMoving = Copy.m_bIsMoving; m_pMoveAnimation = nullptr; if (Copy.m_pMoveAnimation != nullptr) { m_pMoveAnimation = new CPositionRotationAnimation(*Copy.m_pMoveAnimation); + m_bIsMoving = true; } m_bCollisionsEnabled = Copy.m_bCollisionsEnabled; @@ -352,10 +352,11 @@ void CObject::Move(const CPositionRotationAnimation& a_rMoveAnimation) SetRotation(positionRotation.m_vecRotation); } + // Mark object as moving + m_bIsMoving = true; + CLuaArguments Arguments; CallEvent("onObjectMoveStart", Arguments); - - m_bIsMoving = true; } void CObject::StopMoving() diff --git a/Server/mods/deathmatch/logic/CObject.h b/Server/mods/deathmatch/logic/CObject.h index f1f9dfe99a..c4e324da9e 100644 --- a/Server/mods/deathmatch/logic/CObject.h +++ b/Server/mods/deathmatch/logic/CObject.h @@ -148,5 +148,5 @@ class CObject : public CElement public: CPositionRotationAnimation* m_pMoveAnimation; - bool m_bIsMoving; // Value for the onObjectMoveStop event + bool m_bIsMoving; // Variable for onObjectMoveStop event }; diff --git a/Server/mods/deathmatch/logic/CObjectSync.cpp b/Server/mods/deathmatch/logic/CObjectSync.cpp index 71cb06a76d..bfe8912efd 100644 --- a/Server/mods/deathmatch/logic/CObjectSync.cpp +++ b/Server/mods/deathmatch/logic/CObjectSync.cpp @@ -114,6 +114,15 @@ void CObjectSync::UpdateObject(CObject* pObject) else // Try to find a syncer FindSyncer(pObject); + + // If an object is marked as moving, is it really still moving? + if (pObject->m_bIsMoving && !pObject->IsMoving()) + { + pObject->m_bIsMoving = false; + + CLuaArguments Arguments; + pObject->CallEvent("onObjectMoveStop", Arguments); + } } void CObjectSync::FindSyncer(CObject* pObject) @@ -278,15 +287,6 @@ void CObjectSync::Packet_ObjectSync(CObjectSyncPacket& Packet) if (pData->ucFlags & 0x800) pObject->SetCenterOfMass(pData->vecCenterOfMass); - // We check whether the object is marked as "moving" and whether it is actually still moving - if (pObject->m_bIsMoving && !pObject->IsMoving()) - { - CLuaArguments Arguments; - pObject->CallEvent("onObjectMoveStop", Arguments); - - pObject->m_bIsMoving = false; - } - // Send this sync pData->bSend = true; } From dbf9748a36f1a1544bc7054e09ddda9441a96b17 Mon Sep 17 00:00:00 2001 From: FileEX Date: Fri, 13 Sep 2024 19:30:50 +0200 Subject: [PATCH 6/6] Remove properties sync --- Client/mods/deathmatch/logic/CClientObject.h | 12 +-- Client/mods/deathmatch/logic/CObjectSync.cpp | 75 +------------ .../mods/deathmatch/logic/CPacketHandler.cpp | 27 +---- .../mods/deathmatch/logic/rpc/CObjectRPCs.cpp | 55 ---------- .../mods/deathmatch/logic/rpc/CObjectRPCs.h | 1 - Client/sdk/game/Common.h | 14 +-- Server/mods/deathmatch/logic/CObject.cpp | 7 -- Server/mods/deathmatch/logic/CObject.h | 26 ----- Server/mods/deathmatch/logic/CObjectSync.cpp | 13 --- .../logic/CStaticFunctionDefinitions.cpp | 90 ---------------- .../logic/CStaticFunctionDefinitions.h | 2 - .../mods/deathmatch/logic/lua/LuaCommon.cpp | 58 ---------- Server/mods/deathmatch/logic/lua/LuaCommon.h | 2 - .../logic/luadefs/CLuaObjectDefs.cpp | 102 ------------------ .../deathmatch/logic/luadefs/CLuaObjectDefs.h | 4 - .../logic/packets/CEntityAddPacket.cpp | 13 +-- .../logic/packets/CObjectSyncPacket.cpp | 91 ---------------- .../logic/packets/CObjectSyncPacket.h | 6 -- Shared/mods/deathmatch/logic/Enums.cpp | 20 ++-- Shared/mods/deathmatch/logic/Enums.h | 4 +- Shared/sdk/net/rpc_enums.h | 1 - 21 files changed, 21 insertions(+), 602 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientObject.h b/Client/mods/deathmatch/logic/CClientObject.h index bca77bf63a..77f9b7e4eb 100644 --- a/Client/mods/deathmatch/logic/CClientObject.h +++ b/Client/mods/deathmatch/logic/CClientObject.h @@ -24,11 +24,6 @@ struct SLastSyncedObjectData CVector vecTurnVelocity; float fHealth; bool bIsInWater; - float fMass; - float fTurnMass; - float fAirResistance; - float fElasticity; - float fBuoyancyConstant; CVector vecCenterOfMass; }; @@ -44,10 +39,11 @@ class CClientObject : public CClientStreamElement void Unlink(); - eClientEntityType GetType() const { return CCLIENTOBJECT; }; + eClientEntityType GetType() const { return CCLIENTOBJECT; } - CObject* GetGameObject() const { return m_pObject; } - const CEntity* GetGameEntity() const { return m_pObject; } + CObject* GetGameObject() const noexcept { return m_pObject; } + CEntity* GetGameEntity() noexcept { return m_pObject; } + const CEntity* GetGameEntity() const noexcept { return m_pObject; } void GetPosition(CVector& vecPosition) const; void SetPosition(const CVector& vecPosition); diff --git a/Client/mods/deathmatch/logic/CObjectSync.cpp b/Client/mods/deathmatch/logic/CObjectSync.cpp index 8cd9032751..4ac4b63a79 100644 --- a/Client/mods/deathmatch/logic/CObjectSync.cpp +++ b/Client/mods/deathmatch/logic/CObjectSync.cpp @@ -226,12 +226,11 @@ void CObjectSync::Update() void CObjectSync::WriteObjectInformation(NetBitStreamInterface* pBitStream, CDeathmatchObject* pObject) { - CVector vecPosition, vecRotation, vecVelocity, vecAngularVelocity, vecCenterOfMass; + CVector vecPosition, vecRotation, vecVelocity, vecAngularVelocity; pObject->GetPosition(vecPosition); pObject->GetRotationRadians(vecRotation); pObject->GetMoveSpeed(vecVelocity); pObject->GetTurnSpeed(vecAngularVelocity); - pObject->GetCenterOfMass(vecCenterOfMass); unsigned int ucFlags = 0; @@ -247,18 +246,6 @@ void CObjectSync::WriteObjectInformation(NetBitStreamInterface* pBitStream, CDea ucFlags |= 0x10; if (pObject->IsInWater() != pObject->m_LastSyncedData.bIsInWater) ucFlags |= 0x20; - if (pObject->GetMass() != pObject->m_LastSyncedData.fMass) - ucFlags |= 0x40; - if (pObject->GetTurnMass() != pObject->m_LastSyncedData.fTurnMass) - ucFlags |= 0x80; - if (pObject->GetAirResistance() != pObject->m_LastSyncedData.fAirResistance) - ucFlags |= 0x100; - if (pObject->GetElasticity() != pObject->m_LastSyncedData.fElasticity) - ucFlags |= 0x200; - if (pObject->GetBuoyancyConstant() != pObject->m_LastSyncedData.fBuoyancyConstant) - ucFlags |= 0x400; - if (vecCenterOfMass != pObject->m_LastSyncedData.vecCenterOfMass) - ucFlags |= 0x800; // Don't sync if nothing changed if (ucFlags == 0) @@ -333,64 +320,4 @@ void CObjectSync::WriteObjectInformation(NetBitStreamInterface* pBitStream, CDea pObject->m_LastSyncedData.bIsInWater = bIsInWater; } - - // Write properties - - // Write mass - if (ucFlags & 0x40) - { - float fMass = pObject->GetMass(); - pBitStream->Write(fMass); - - pObject->m_LastSyncedData.fMass = fMass; - } - - // Write turn mass - if (ucFlags & 0x80) - { - float fTurnMass = pObject->GetTurnMass(); - pBitStream->Write(fTurnMass); - - pObject->m_LastSyncedData.fTurnMass = fTurnMass; - } - - // Write air resistance - if (ucFlags & 0x100) - { - float fAirResistance = pObject->GetAirResistance(); - pBitStream->Write(fAirResistance); - - pObject->m_LastSyncedData.fAirResistance = fAirResistance; - } - - // Write elasiticy - if (ucFlags & 0x200) - { - float fElasticity = pObject->GetElasticity(); - pBitStream->Write(fElasticity); - - pObject->m_LastSyncedData.fElasticity = fElasticity; - } - - // Write buoyancy constant - if (ucFlags & 0x400) - { - float fBuoyancyConstant = pObject->GetBuoyancyConstant(); - pBitStream->Write(fBuoyancyConstant); - - pObject->m_LastSyncedData.fBuoyancyConstant = fBuoyancyConstant; - } - - // Write center of mass - if (ucFlags & 0x800) - { - CVector vecCenterOfMass; - pObject->GetCenterOfMass(vecCenterOfMass); - - pBitStream->Write(vecCenterOfMass.fX); - pBitStream->Write(vecCenterOfMass.fY); - pBitStream->Write(vecCenterOfMass.fZ); - - pObject->m_LastSyncedData.vecCenterOfMass = vecCenterOfMass; - } } diff --git a/Client/mods/deathmatch/logic/CPacketHandler.cpp b/Client/mods/deathmatch/logic/CPacketHandler.cpp index 14e4092413..4996e3835c 100644 --- a/Client/mods/deathmatch/logic/CPacketHandler.cpp +++ b/Client/mods/deathmatch/logic/CPacketHandler.cpp @@ -2731,10 +2731,8 @@ void CPacketHandler::Packet_EntityAdd(NetBitStreamInterface& bitStream) // bool (1) - frozen // SObjectHealthSync (?) - health // bool (1) - is break - // bool (1) - respawnable + // bool (1) - respawnable // bool (1) - static flag - // float (4) - properties (mass, turnMass etc) - // CVector (12) - center_of_mass property // Pickups: // CVector (12) - position @@ -3104,31 +3102,10 @@ void CPacketHandler::Packet_EntityAdd(NetBitStreamInterface& bitStream) if (bitStream.Can(eBitStreamVersion::RespawnObject_Serverside)) pObject->SetRespawnEnabled(bitStream.ReadBit()); - // Set static & properties + // Set static flag if (bitStream.Can(eBitStreamVersion::ObjectSync_FixAndUpdate)) { pObject->SetStatic(bitStream.ReadBit()); - - float fMass, fTurnMass, fAirResistance, fElasticity, fBuoyancy; - CVector centerOfMass; - - if (bitStream.Read(fMass)) - pObject->SetMass(fMass); - - if (bitStream.Read(fTurnMass)) - pObject->SetTurnMass(fTurnMass); - - if (bitStream.Read(fAirResistance)) - pObject->SetAirResistance(fAirResistance); - - if (bitStream.Read(fElasticity)) - pObject->SetElasticity(fElasticity); - - if (bitStream.Read(fBuoyancy)) - pObject->SetBuoyancyConstant(fBuoyancy); - - if (bitStream.Read(centerOfMass.fX) && bitStream.Read(centerOfMass.fY) && bitStream.Read(centerOfMass.fZ)) - pObject->SetCenterOfMass(centerOfMass); } pObject->SetCollisionEnabled(bCollisonsEnabled); diff --git a/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp b/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp index 24a9e1a358..40984f5892 100644 --- a/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp +++ b/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp @@ -24,7 +24,6 @@ void CObjectRPCs::LoadFunctions() AddHandler(BREAK_OBJECT, BreakObject, "BreakObject"); AddHandler(RESPAWN_OBJECT, RespawnObject, "RespawnObject"); AddHandler(TOGGLE_OBJECT_RESPAWN, ToggleObjectRespawn, "ToggleObjectRespawn"); - AddHandler(SET_OBJECT_PROPERTY, SetObjectProperty, "SetObjectProperty"); } void CObjectRPCs::DestroyAllObjects(NetBitStreamInterface& bitStream) @@ -154,57 +153,3 @@ void CObjectRPCs::ToggleObjectRespawn(CClientEntity* pSource, NetBitStreamInterf if (pObject) pObject->SetRespawnEnabled(bitStream.ReadBit()); } - -void CObjectRPCs::SetObjectProperty(CClientEntity* pSource, NetBitStreamInterface& bitStream) -{ - auto* pObject = static_cast(m_pObjectManager->Get(pSource->GetID())); - if (!pObject) - return; - - SString sProperty; - if (!bitStream.ReadString(sProperty)) - return; - - float fValue; - CVector vecValue; - if (!bitStream.Read(fValue) && (!bitStream.Read(vecValue.fX) || !bitStream.Read(vecValue.fY) || !bitStream.Read(vecValue.fZ))) - return; - - eObjectProperty eProperty; - if (!StringToEnum(sProperty, eProperty)) - return; - - switch (eProperty) - { - case OBJECT_PROPERTY_MASS: - { - pObject->SetMass(fValue); - break; - } - case OBJECT_PROPERTY_TURNMASS: - { - pObject->SetTurnMass(fValue); - break; - } - case OBJECT_PROPERTY_AIRRESISTANCE: - { - pObject->SetAirResistance(fValue); - break; - } - case OBJECT_PROPERTY_ELASTICITY: - { - pObject->SetElasticity(fValue); - break; - } - case OBJECT_PROPERTY_CENTEROFMASS: - { - pObject->SetCenterOfMass(vecValue); - break; - } - case OBJECT_PROPERTY_BUOYANCY: - { - pObject->SetBuoyancyConstant(fValue); - break; - } - } -} diff --git a/Client/mods/deathmatch/logic/rpc/CObjectRPCs.h b/Client/mods/deathmatch/logic/rpc/CObjectRPCs.h index 813fead942..5a342b743b 100644 --- a/Client/mods/deathmatch/logic/rpc/CObjectRPCs.h +++ b/Client/mods/deathmatch/logic/rpc/CObjectRPCs.h @@ -29,5 +29,4 @@ class CObjectRPCs : public CRPCFunctions DECLARE_ELEMENT_RPC(BreakObject); DECLARE_ELEMENT_RPC(RespawnObject); DECLARE_ELEMENT_RPC(ToggleObjectRespawn); - DECLARE_ELEMENT_RPC(SetObjectProperty); }; diff --git a/Client/sdk/game/Common.h b/Client/sdk/game/Common.h index ad81a3b953..47161fde67 100644 --- a/Client/sdk/game/Common.h +++ b/Client/sdk/game/Common.h @@ -1430,19 +1430,7 @@ enum class eResizableVehicleWheelGroup REAR_AXLE, ALL_WHEELS = 0xFF, }; -/* -enum eObjectProperty -{ - OBJECT_PROPERTY_ALL, - OBJECT_PROPERTY_MASS, - OBJECT_PROPERTY_TURNMASS, - OBJECT_PROPERTY_AIRRESISTANCE, - OBJECT_PROPERTY_ELASTICITY, - OBJECT_PROPERTY_CENTEROFMASS, - OBJECT_PROPERTY_BUOYANCY, - OBJECT_PROPERTY_MAX, -}; -*/ + namespace eObjectGroup { enum Modifiable diff --git a/Server/mods/deathmatch/logic/CObject.cpp b/Server/mods/deathmatch/logic/CObject.cpp index dc97755baf..6a41e89709 100644 --- a/Server/mods/deathmatch/logic/CObject.cpp +++ b/Server/mods/deathmatch/logic/CObject.cpp @@ -38,13 +38,6 @@ CObject::CObject(CElement* pParent, CObjectManager* pObjectManager, bool bIsLowL m_bIsStatic = true; m_bIsMoving = false; - m_fMass = -1.0f; - m_fTurnMass = -1.0f; - m_fAirResistance = -1.0f; - m_fElasticity = -1.0f; - m_fBuoyancyConstant = -1.0f; - m_vecCenterOfMass = CVector(0.0f, 0.0f, 0.0f); - m_bCollisionsEnabled = true; // Add us to the manager's list diff --git a/Server/mods/deathmatch/logic/CObject.h b/Server/mods/deathmatch/logic/CObject.h index 2d33c81d4d..85f10a6f04 100644 --- a/Server/mods/deathmatch/logic/CObject.h +++ b/Server/mods/deathmatch/logic/CObject.h @@ -96,24 +96,6 @@ class CObject : public CElement bool IsInWater() const { return m_bInWater; } void SetInWater(bool bInWater) { m_bInWater = bInWater; } - float GetMass() const { return m_fMass; } - void SetMass(float fMass) { m_fMass = fMass; }; - - float GetTurnMass() const { return m_fTurnMass; } - void SetTurnMass(float fTurnMass) { m_fTurnMass = fTurnMass; } - - float GetAirResistance() const { return m_fAirResistance; } - void SetAirResistance(float fResistance) { m_fAirResistance = fResistance; } - - float GetElasticity() const { return m_fElasticity; } - void SetElasticity(float fElasticity) { m_fElasticity = fElasticity; } - - float GetBuoyancyConstant() const { return m_fBuoyancyConstant; } - void SetBuoyancyConstant(float fBuoyancy) { m_fBuoyancyConstant = fBuoyancy; } - - CVector GetCenterOfMass() const { return m_vecCenterOfMass; } - void SetCenterOfMass(CVector vecCenterOfMass) { m_vecCenterOfMass = vecCenterOfMass; } - protected: bool ReadSpecialData(const int iLine) override; @@ -135,14 +117,6 @@ class CObject : public CElement bool m_bInWater; bool m_bIsStatic; // true if the object never moved using setElementVelocity/setElementAngularVelocity - // Properties - float m_fMass; - float m_fTurnMass; - float m_fAirResistance; - float m_fElasticity; - float m_fBuoyancyConstant; - CVector m_vecCenterOfMass; - protected: bool m_bCollisionsEnabled; diff --git a/Server/mods/deathmatch/logic/CObjectSync.cpp b/Server/mods/deathmatch/logic/CObjectSync.cpp index bfe8912efd..6b6813b841 100644 --- a/Server/mods/deathmatch/logic/CObjectSync.cpp +++ b/Server/mods/deathmatch/logic/CObjectSync.cpp @@ -273,19 +273,6 @@ void CObjectSync::Packet_ObjectSync(CObjectSyncPacket& Packet) } if (pData->ucFlags & 0x20) // Sync inWater state from client pObject->SetInWater(pData->bIsInWater); - // Sync properties - if (pData->ucFlags & 0x40) - pObject->SetMass(pData->fMass); - if (pData->ucFlags & 0x80) - pObject->SetTurnMass(pData->fTurnMass); - if (pData->ucFlags & 0x100) - pObject->SetAirResistance(pData->fAirResistance); - if (pData->ucFlags & 0x200) - pObject->SetElasticity(pData->fElasticity); - if (pData->ucFlags & 0x400) - pObject->SetBuoyancyConstant(pData->fBuoyancyConstant); - if (pData->ucFlags & 0x800) - pObject->SetCenterOfMass(pData->vecCenterOfMass); // Send this sync pData->bSend = true; diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 5a9b1a2bc7..28d2496bcf 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -12514,93 +12514,3 @@ bool CStaticFunctionDefinitions::SetColPolygonHeight(CColPolygon* pColPolygon, f return false; } - -bool CStaticFunctionDefinitions::SetObjectProperty(CElement* pElement, std::string sProperty, std::variant vValue) -{ - RUN_CHILDREN(SetObjectProperty(*iter, sProperty, vValue)) - - if (!IS_OBJECT(pElement)) - return false; - - CObject* pObject = static_cast(pElement); - if (!pObject) - return false; - - eObjectProperty eProperty; - if (!StringToEnum(sProperty, eProperty)) - return false; - - switch (eProperty) - { - case OBJECT_PROPERTY_MASS: - { - if (auto pMass = std::get_if(&vValue)) - pObject->SetMass(*pMass); - else - return false; - - break; - } - case OBJECT_PROPERTY_TURNMASS: - { - if (auto pTurnMass = std::get_if(&vValue)) - pObject->SetTurnMass(*pTurnMass); - else - return false; - - break; - } - case OBJECT_PROPERTY_AIRRESISTANCE: - { - if (auto pAirRes = std::get_if(&vValue)) - pObject->SetAirResistance(*pAirRes); - else - return false; - - break; - } - case OBJECT_PROPERTY_ELASTICITY: - { - if (auto pElasticity = std::get_if(&vValue)) - pObject->SetElasticity(*pElasticity); - else - return false; - - break; - } - case OBJECT_PROPERTY_CENTEROFMASS: - { - if (auto pVec = std::get_if(&vValue)) - pObject->SetCenterOfMass(*pVec); - else - return false; - - break; - } - case OBJECT_PROPERTY_BUOYANCY: - { - if (auto pBuo = std::get_if(&vValue)) - pObject->SetBuoyancyConstant(*pBuo); - else - return false; - - break; - } - } - - CBitStream bitStream; - bitStream->WriteString(sProperty); - if (std::holds_alternative(vValue)) - bitStream->Write(std::get(vValue)); - else if (std::holds_alternative(vValue)) - { - CVector vecValue = std::get(vValue); - bitStream->Write(vecValue.fX); - bitStream->Write(vecValue.fY); - bitStream->Write(vecValue.fZ); - } - - m_pPlayerManager->BroadcastOnlyJoined(CElementRPCPacket(pObject, SET_OBJECT_PROPERTY, *bitStream.pBitStream)); - - return true; -} diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h index 39a3529d8b..bb0e99c0ee 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h @@ -17,7 +17,6 @@ class CStaticFunctionDefinitions; #include "CRegistry.h" #include "lua/CLuaFunctionParseHelpers.h" #include -#include class CVector2D; struct SLineOfSightFlags; @@ -427,7 +426,6 @@ class CStaticFunctionDefinitions static bool SetObjectBreakable(CElement* pElement, const bool bBreakable); static bool RespawnObject(CElement* const pElement) noexcept; static bool ToggleObjectRespawn(CElement* const pElement, const bool bRespawn) noexcept; - static bool SetObjectProperty(CElement* pElement, const std::string sProperty, std::variant vValue); // Radar area create/destroy funcs static CRadarArea* CreateRadarArea(CResource* pResource, const CVector2D& vecPosition, const CVector2D& vecSize, const SColor color, CElement* pVisibleTo); diff --git a/Server/mods/deathmatch/logic/lua/LuaCommon.cpp b/Server/mods/deathmatch/logic/lua/LuaCommon.cpp index ee22dd678a..553121be40 100644 --- a/Server/mods/deathmatch/logic/lua/LuaCommon.cpp +++ b/Server/mods/deathmatch/logic/lua/LuaCommon.cpp @@ -441,22 +441,6 @@ void lua_classfunction(lua_State* luaVM, const char* szFunction, const char* fn) dassert(false); } -void lua_classfunction(lua_State* luaVM, const char* szFunction, lua_CFunction fn) -{ - if (fn) - { - lua_pushstring(luaVM, "__class"); - lua_rawget(luaVM, -2); - - lua_pushstring(luaVM, szFunction); - lua_pushstring(luaVM, szFunction); - lua_pushcclosure(luaVM, fn, 1); - lua_rawset(luaVM, -3); - - lua_pop(luaVM, 1); - } -} - void lua_classvariable(lua_State* luaVM, const char* szVariable, const char* szACLNameSet, const char* szACLNameGet, lua_CFunction set, lua_CFunction get, bool bACLIgnore) { @@ -504,48 +488,6 @@ void lua_classvariable(lua_State* luaVM, const char* szVariable, const char* szA lua_pop(luaVM, 1); } -void lua_classvariable(lua_State* luaVM, const char* szVariable, lua_CFunction set, lua_CFunction get) -{ - lua_pushstring(luaVM, "__set"); - lua_rawget(luaVM, -2); - - if (!set) - { - lua_pushstring(luaVM, szVariable); - lua_pushstring(luaVM, szVariable); - lua_pushcclosure(luaVM, CLuaClassDefs::ReadOnly, 1); - lua_rawset(luaVM, -3); - } - else - { - lua_pushstring(luaVM, szVariable); - lua_pushstring(luaVM, szVariable); - lua_pushcclosure(luaVM, set, 1); - lua_rawset(luaVM, -3); - } - lua_pop(luaVM, 1); - - // Get - lua_pushstring(luaVM, "__get"); - lua_rawget(luaVM, -2); - - if (!get) - { - lua_pushstring(luaVM, szVariable); - lua_pushstring(luaVM, szVariable); - lua_pushcclosure(luaVM, CLuaClassDefs::WriteOnly, 1); - lua_rawset(luaVM, -3); - } - else - { - lua_pushstring(luaVM, szVariable); - lua_pushstring(luaVM, szVariable); - lua_pushcclosure(luaVM, get, 1); - lua_rawset(luaVM, -3); - } - lua_pop(luaVM, 1); -} - void lua_classvariable(lua_State* luaVM, const char* szVariable, const char* set, const char* get) { lua_CFunction fnSet = NULL; diff --git a/Server/mods/deathmatch/logic/lua/LuaCommon.h b/Server/mods/deathmatch/logic/lua/LuaCommon.h index f3ac10130e..d5489c3997 100644 --- a/Server/mods/deathmatch/logic/lua/LuaCommon.h +++ b/Server/mods/deathmatch/logic/lua/LuaCommon.h @@ -61,10 +61,8 @@ void lua_registerclass(lua_State* luaVM, const char* szName, const char* szParen void lua_registerstaticclass(lua_State* luaVM, const char* szName); void lua_classfunction(lua_State* luaVM, const char* szFunction, const char* szACLName, lua_CFunction fn); void lua_classfunction(lua_State* luaVM, const char* szFunction, const char* fn); -void lua_classfunction(lua_State* luaVM, const char* szFunction, lua_CFunction fn); void lua_classvariable(lua_State* luaVM, const char* szVariable, const char* szACLNameSet, const char* szACLNameGet, lua_CFunction set, lua_CFunction get, bool bACLIgnore = true); -void lua_classvariable(lua_State* luaVM, const char* szVariable, lua_CFunction set, lua_CFunction get); void lua_classvariable(lua_State* luaVM, const char* szVariable, const char* set, const char* get); void lua_classmetamethod(lua_State* luaVM, const char* szName, lua_CFunction fn); diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp index b26a4b3e6e..898825673c 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp @@ -27,7 +27,6 @@ void CLuaObjectDefs::LoadFunctions() {"isObjectBreakable", ArgumentParser}, {"isObjectMoving", ArgumentParser}, {"isObjectRespawnable", ArgumentParser}, - {"getObjectProperty", GetObjectProperty}, // Object set funcs {"setObjectRotation", SetObjectRotation}, @@ -37,7 +36,6 @@ void CLuaObjectDefs::LoadFunctions() {"stopObject", StopObject}, {"breakObject", ArgumentParser}, {"toggleObjectRespawn", ArgumentParser}, - {"setObjectProperty", ArgumentParser}, }; // Add functions @@ -61,16 +59,11 @@ void CLuaObjectDefs::AddClass(lua_State* luaVM) lua_classfunction(luaVM, "setBreakable", "setObjectBreakable"); lua_classfunction(luaVM, "isMoving", "isObjectMoving"); lua_classfunction(luaVM, "toggleRespawn", "toggleObjectRespawn"); - lua_classfunction(luaVM, "getProperties", GetObjectProperties); - lua_classfunction(luaVM, "getProperty", "getObjectProperty"); - lua_classfunction(luaVM, "setProperty", "setObjectProperty"); - lua_classvariable(luaVM, "scale", "setObjectScale", "getObjectScale"); lua_classvariable(luaVM, "breakable", "setObjectBreakable", "isObjectBreakable"); lua_classvariable(luaVM, "moving", nullptr, "isObjectMoving"); lua_classvariable(luaVM, "isRespawnable", nullptr, "isObjectRespawnable"); - lua_classvariable(luaVM, "properties", nullptr, GetObjectProperties); lua_registerclass(luaVM, "Object", "Element"); } @@ -326,101 +319,6 @@ bool CLuaObjectDefs::BreakObject(CObject* const pObject) return CStaticFunctionDefinitions::BreakObject(pObject); } -int CLuaObjectDefs::GetObjectProperties(lua_State* luaVM) -{ - lua_pushstring(luaVM, "all"); - return GetObjectProperty(luaVM); -} - -int CLuaObjectDefs::GetObjectProperty(lua_State* luaVM) -{ - CObject* pObject; - eObjectProperty eProperty; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pObject); - argStream.ReadEnumString(eProperty, eObjectProperty::OBJECT_PROPERTY_MAX); - - if (argStream.HasErrors()) - { - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - - switch (eProperty) - { - case OBJECT_PROPERTY_ALL: - { - lua_newtable(luaVM); - - lua_pushnumber(luaVM, pObject->GetMass()); - lua_setfield(luaVM, -2, EnumToString(eObjectProperty::OBJECT_PROPERTY_MASS)); - - lua_pushnumber(luaVM, pObject->GetTurnMass()); - lua_setfield(luaVM, -2, EnumToString(eObjectProperty::OBJECT_PROPERTY_TURNMASS)); - - lua_pushnumber(luaVM, pObject->GetAirResistance()); - lua_setfield(luaVM, -2, EnumToString(eObjectProperty::OBJECT_PROPERTY_AIRRESISTANCE)); - - lua_pushnumber(luaVM, pObject->GetElasticity()); - lua_setfield(luaVM, -2, EnumToString(eObjectProperty::OBJECT_PROPERTY_ELASTICITY)); - - lua_pushvector(luaVM, pObject->GetCenterOfMass()); - lua_setfield(luaVM, -2, EnumToString(eObjectProperty::OBJECT_PROPERTY_CENTEROFMASS)); - - lua_pushnumber(luaVM, pObject->GetBuoyancyConstant()); - lua_setfield(luaVM, -2, EnumToString(eObjectProperty::OBJECT_PROPERTY_BUOYANCY)); - return 1; - break; - } - case OBJECT_PROPERTY_MASS: - { - lua_pushnumber(luaVM, pObject->GetMass()); - return 1; - break; - } - case OBJECT_PROPERTY_TURNMASS: - { - lua_pushnumber(luaVM, pObject->GetTurnMass()); - return 1; - break; - } - case OBJECT_PROPERTY_AIRRESISTANCE: - { - lua_pushnumber(luaVM, pObject->GetAirResistance()); - return 1; - break; - } - case OBJECT_PROPERTY_ELASTICITY: - { - lua_pushnumber(luaVM, pObject->GetElasticity()); - return 1; - } - case OBJECT_PROPERTY_CENTEROFMASS: - { - CVector vecCenterOfMass = pObject->GetCenterOfMass(); - lua_pushnumber(luaVM, vecCenterOfMass.fX); - lua_pushnumber(luaVM, vecCenterOfMass.fY); - lua_pushnumber(luaVM, vecCenterOfMass.fZ); - - return 1; - break; - } - case OBJECT_PROPERTY_BUOYANCY: - { - lua_pushnumber(luaVM, pObject->GetBuoyancyConstant()); - return 1; - break; - } - } -} - -bool CLuaObjectDefs::SetObjectProperty(CObject* const pObject, const std::string sProperty, const std::variant vValue) -{ - return CStaticFunctionDefinitions::SetObjectProperty(pObject, sProperty, vValue); -} - bool CLuaObjectDefs::RespawnObject(CObject* const pObject) noexcept { return CStaticFunctionDefinitions::RespawnObject(pObject); diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h b/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h index 8eb5d24be2..76a96a982b 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h +++ b/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h @@ -29,9 +29,6 @@ class CLuaObjectDefs : public CLuaDefs static bool IsObjectBreakable(CObject* const pObject); static bool IsObjectMoving(CObject* const pObject); static bool IsObjectRespawnable(CObject* const pObject) noexcept; - LUA_DECLARE(GetObjectProperty); - LUA_DECLARE(GetObjectProperties); - // Object set functions LUA_DECLARE(SetObjectName); @@ -42,5 +39,4 @@ class CLuaObjectDefs : public CLuaDefs LUA_DECLARE(StopObject); static bool BreakObject(CObject* const pObject); static bool ToggleObjectRespawn(CObject* const pObject, const bool bRespawn) noexcept; - static bool SetObjectProperty(CObject* const pObject, const std::string sProperty, const std::variant vValue); }; diff --git a/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp b/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp index 19be3a7252..4b657e2dc9 100644 --- a/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp @@ -301,21 +301,10 @@ bool CEntityAddPacket::Write(NetBitStreamInterface& BitStream) const if (BitStream.Can(eBitStreamVersion::BreakObject_Serverside)) BitStream.WriteBit(pObject->GetHealth() <= 0); - // Static & properties + // Static flag if (BitStream.Can(eBitStreamVersion::ObjectSync_FixAndUpdate)) { BitStream.WriteBit(pObject->IsStatic()); - - BitStream.Write(pObject->GetMass()); - BitStream.Write(pObject->GetTurnMass()); - BitStream.Write(pObject->GetAirResistance()); - BitStream.Write(pObject->GetElasticity()); - BitStream.Write(pObject->GetBuoyancyConstant()); - - CVector vecCenterOfMass = pObject->GetCenterOfMass(); - BitStream.Write(vecCenterOfMass.fX); - BitStream.Write(vecCenterOfMass.fY); - BitStream.Write(vecCenterOfMass.fZ); } // Respawnable diff --git a/Server/mods/deathmatch/logic/packets/CObjectSyncPacket.cpp b/Server/mods/deathmatch/logic/packets/CObjectSyncPacket.cpp index 64905e1ce8..b48b53f998 100644 --- a/Server/mods/deathmatch/logic/packets/CObjectSyncPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CObjectSyncPacket.cpp @@ -98,67 +98,6 @@ bool CObjectSyncPacket::Read(NetBitStreamInterface& BitStream) if (flags & 0x20) pData->bIsInWater = BitStream.ReadBit(); - // Read properties - // Read mass - if (flags & 0x40) - { - float fMass; - if (!BitStream.Read(fMass)) - return false; - - pData->fMass = fMass; - } - - // Read turn mass - if (flags & 0x80) - { - float fTurnMass; - if (!BitStream.Read(fTurnMass)) - return false; - - pData->fTurnMass = fTurnMass; - } - - // Read air resistance - if (flags & 0x100) - { - float fAirResistance; - if (!BitStream.Read(fAirResistance)) - return false; - - pData->fAirResistance = fAirResistance; - } - - // Read elasticity - if (flags & 0x200) - { - float fElasticity; - if (!BitStream.Read(fElasticity)) - return false; - - pData->fElasticity = fElasticity; - } - - // Read Buoyancy Constant - if (flags & 0x400) - { - float fBuoyancyConstant; - if (!BitStream.Read(fBuoyancyConstant)) - return false; - - pData->fBuoyancyConstant = fBuoyancyConstant; - } - - // Read center of mass - if (flags & 0x800) - { - CVector centerOfMass; - if (!BitStream.Read(centerOfMass.fX) || !BitStream.Read(centerOfMass.fY) || !BitStream.Read(centerOfMass.fZ)) - return false; - - pData->vecCenterOfMass = centerOfMass; - } - // Add it to our list m_Syncs.push_back(pData); } @@ -233,36 +172,6 @@ bool CObjectSyncPacket::Write(NetBitStreamInterface& BitStream) const if (flags & 0x20) BitStream.WriteBit(pData->bIsInWater); - // Write the properties - // Write mass - if (flags & 0x40) - BitStream.Write(pData->fMass); - - // Write turn mass - if (flags & 0x80) - BitStream.Write(pData->fTurnMass); - - // Write air resistance - if (flags & 0x100) - BitStream.Write(pData->fAirResistance); - - // Write elasticity - if (flags & 0x200) - BitStream.Write(pData->fElasticity); - - // Write buoyancy constant - if (flags & 0x400) - BitStream.Write(pData->fBuoyancyConstant); - - // Write center of mass - if (flags & 0x800) - { - CVector centerOfMass = pData->vecCenterOfMass; - BitStream.Write(centerOfMass.fX); - BitStream.Write(centerOfMass.fY); - BitStream.Write(centerOfMass.fZ); - } - // We've sent atleast one sync bSent = true; } diff --git a/Server/mods/deathmatch/logic/packets/CObjectSyncPacket.h b/Server/mods/deathmatch/logic/packets/CObjectSyncPacket.h index 7cebfb7180..6973cce0e7 100644 --- a/Server/mods/deathmatch/logic/packets/CObjectSyncPacket.h +++ b/Server/mods/deathmatch/logic/packets/CObjectSyncPacket.h @@ -28,12 +28,6 @@ class CObjectSyncPacket final : public CPacket float fHealth; bool bIsInWater; ElementID attackerID; - float fMass; - float fTurnMass; - float fAirResistance; - float fElasticity; - float fBuoyancyConstant; - CVector vecCenterOfMass; unsigned char ucSyncTimeContext; unsigned int ucFlags; diff --git a/Shared/mods/deathmatch/logic/Enums.cpp b/Shared/mods/deathmatch/logic/Enums.cpp index 293c4cfd90..2063cf35b9 100644 --- a/Shared/mods/deathmatch/logic/Enums.cpp +++ b/Shared/mods/deathmatch/logic/Enums.cpp @@ -103,6 +103,16 @@ ADD_ENUM(WorldSpecialProperty::ROADSIGNSTEXT, "roadsignstext") ADD_ENUM(WorldSpecialProperty::TUNNELWEATHERBLEND, "tunnelweatherblend") IMPLEMENT_ENUM_CLASS_END("world-special-property") +IMPLEMENT_ENUM_BEGIN(eObjectProperty) +ADD_ENUM(OBJECT_PROPERTY_ALL, "all") +ADD_ENUM(OBJECT_PROPERTY_MASS, "mass") +ADD_ENUM(OBJECT_PROPERTY_TURNMASS, "turn_mass") +ADD_ENUM(OBJECT_PROPERTY_AIRRESISTANCE, "air_resistance") +ADD_ENUM(OBJECT_PROPERTY_ELASTICITY, "elasticity") +ADD_ENUM(OBJECT_PROPERTY_CENTEROFMASS, "center_of_mass") +ADD_ENUM(OBJECT_PROPERTY_BUOYANCY, "buoyancy") +IMPLEMENT_ENUM_END("object-property") + IMPLEMENT_ENUM_BEGIN(ePacketID) ADD_ENUM1(PACKET_ID_SERVER_JOIN) ADD_ENUM1(PACKET_ID_SERVER_JOIN_DATA) @@ -214,13 +224,3 @@ ADD_ENUM1(PACKET_ID_SERVER_INFO_SYNC) ADD_ENUM1(PACKET_ID_DISCORD_JOIN) ADD_ENUM1(PACKET_ID_PLAYER_RESOURCE_START) IMPLEMENT_ENUM_END("ePacketID") - -IMPLEMENT_ENUM_BEGIN(eObjectProperty) -ADD_ENUM(OBJECT_PROPERTY_ALL, "all") -ADD_ENUM(OBJECT_PROPERTY_MASS, "mass") -ADD_ENUM(OBJECT_PROPERTY_TURNMASS, "turn_mass") -ADD_ENUM(OBJECT_PROPERTY_AIRRESISTANCE, "air_resistance") -ADD_ENUM(OBJECT_PROPERTY_ELASTICITY, "elasticity") -ADD_ENUM(OBJECT_PROPERTY_CENTEROFMASS, "center_of_mass") -ADD_ENUM(OBJECT_PROPERTY_BUOYANCY, "buoyancy") -IMPLEMENT_ENUM_END("object-property") diff --git a/Shared/mods/deathmatch/logic/Enums.h b/Shared/mods/deathmatch/logic/Enums.h index c795d89d43..e18aafbece 100644 --- a/Shared/mods/deathmatch/logic/Enums.h +++ b/Shared/mods/deathmatch/logic/Enums.h @@ -94,8 +94,6 @@ enum class WorldSpecialProperty }; DECLARE_ENUM_CLASS(WorldSpecialProperty); -DECLARE_ENUM(ePacketID); - enum eObjectProperty { OBJECT_PROPERTY_ALL, @@ -108,3 +106,5 @@ enum eObjectProperty OBJECT_PROPERTY_MAX, }; DECLARE_ENUM(eObjectProperty); + +DECLARE_ENUM(ePacketID); diff --git a/Shared/sdk/net/rpc_enums.h b/Shared/sdk/net/rpc_enums.h index 7247745536..6f63818b46 100644 --- a/Shared/sdk/net/rpc_enums.h +++ b/Shared/sdk/net/rpc_enums.h @@ -278,7 +278,6 @@ enum eElementRPCFunctions SET_WORLD_SPECIAL_PROPERTY, BREAK_OBJECT, - SET_OBJECT_PROPERTY, SET_PLAYER_SCRIPT_DEBUG_LEVEL,