From 0e045424fac689dc5469c75c00c09b4c54efd794 Mon Sep 17 00:00:00 2001 From: Uladzislau Nikalayevich Date: Thu, 12 Dec 2024 17:08:53 +0300 Subject: [PATCH 01/16] serversice createBuilding --- Client/mods/deathmatch/logic/CClientGame.h | 6 +- .../mods/deathmatch/logic/CPacketHandler.cpp | 36 ++- .../deathmatch/logic/rpc/CElementRPCs.cpp | 13 ++ Server/mods/deathmatch/logic/CBuilding.cpp | 212 ++++++++++++++++++ Server/mods/deathmatch/logic/CBuilding.h | 74 ++++++ .../deathmatch/logic/CBuildingManager.cpp | 79 +++++++ .../mods/deathmatch/logic/CBuildingManager.h | 45 ++++ Server/mods/deathmatch/logic/CElement.h | 2 + Server/mods/deathmatch/logic/CGame.cpp | 3 + Server/mods/deathmatch/logic/CGame.h | 3 + .../deathmatch/logic/CResourceMapItem.cpp | 57 ++--- .../mods/deathmatch/logic/CResourceMapItem.h | 2 + .../logic/CStaticFunctionDefinitions.cpp | 30 +++ .../logic/lua/CLuaFunctionParseHelpers.cpp | 1 + Server/mods/deathmatch/logic/lua/CLuaMain.cpp | 2 + .../mods/deathmatch/logic/lua/CLuaManager.cpp | 2 + .../logic/luadefs/CLuaBuildingDefs.cpp | 76 +++++++ .../logic/luadefs/CLuaBuildingDefs.h | 23 ++ .../logic/luadefs/CLuaClassDefs.cpp | 2 + .../deathmatch/logic/luadefs/CLuaDefs.cpp | 2 + .../mods/deathmatch/logic/luadefs/CLuaDefs.h | 2 + .../logic/packets/CEntityAddPacket.cpp | 32 +++ 22 files changed, 664 insertions(+), 40 deletions(-) create mode 100644 Server/mods/deathmatch/logic/CBuilding.cpp create mode 100644 Server/mods/deathmatch/logic/CBuilding.h create mode 100644 Server/mods/deathmatch/logic/CBuildingManager.cpp create mode 100644 Server/mods/deathmatch/logic/CBuildingManager.h create mode 100644 Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp create mode 100644 Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.h diff --git a/Client/mods/deathmatch/logic/CClientGame.h b/Client/mods/deathmatch/logic/CClientGame.h index e887199fcd..89a224fa4c 100644 --- a/Client/mods/deathmatch/logic/CClientGame.h +++ b/Client/mods/deathmatch/logic/CClientGame.h @@ -129,8 +129,12 @@ class CClientGame SCRIPTFILE, WATER, WEAPON, - POINTLIGHTS, + _DATABASE_CONNECTION, // server only + TRAIN_TRACK, + ROOT, UNKNOWN, + BUILDING, + POINTLIGHTS, }; enum diff --git a/Client/mods/deathmatch/logic/CPacketHandler.cpp b/Client/mods/deathmatch/logic/CPacketHandler.cpp index 787cd4c239..c780c89f20 100644 --- a/Client/mods/deathmatch/logic/CPacketHandler.cpp +++ b/Client/mods/deathmatch/logic/CPacketHandler.cpp @@ -4179,6 +4179,26 @@ void CPacketHandler::Packet_EntityAdd(NetBitStreamInterface& bitStream) break; } + case CClientGame::BUILDING: + { + std::uint16_t modelId; + SRotationRadiansSync rotationRadians(false); + + // Read out the position, rotation, object ID + bitStream.Read(&position); + bitStream.Read(&rotationRadians); + bitStream.ReadCompressed(modelId); + + if (!CClientBuildingManager::IsValidModel(modelId)) + modelId = 1700; + + bitStream.Read(LowLodObjectID); + CClientBuilding* pBuilding = new CClientBuilding(g_pClientGame->m_pManager, EntityID, modelId, position.data.vecPosition, rotationRadians.data.vecRotation, ucInterior); + + pBuilding->SetUsesCollision(bCollisonsEnabled); + break; + } + default: { assert(0); @@ -4248,10 +4268,18 @@ void CPacketHandler::Packet_EntityAdd(NetBitStreamInterface& bitStream) if (TempLowLodObjectID != INVALID_ELEMENT_ID) { - CClientObject* pTempObject = DynamicCast(pTempEntity); - CClientObject* pLowLodObject = DynamicCast(CElementIDs::GetElement(TempLowLodObjectID)); - if (pTempObject) - pTempObject->SetLowLodObject(pLowLodObject); + if (CClientObject* pTempObject = DynamicCast(pTempEntity)) + { + CClientObject* pLowLodObject = DynamicCast(CElementIDs::GetElement(TempLowLodObjectID)); + if (pTempObject) + pTempObject->SetLowLodObject(pLowLodObject); + } + else if (CClientBuilding* pTempObject = DynamicCast(pTempEntity)) + { + CClientBuilding* pLowLod = DynamicCast(CElementIDs::GetElement(TempLowLodObjectID)); + if (pTempObject) + pTempObject->SetLowLodBuilding(pLowLod); + } } delete pEntityStuff; diff --git a/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp b/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp index 31fa52cae2..ec397b7ec5 100644 --- a/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp +++ b/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp @@ -542,6 +542,12 @@ void CElementRPCs::SetElementCollisionsEnabled(CClientEntity* pSource, NetBitStr pObject->SetCollisionEnabled(bEnable); break; } + + case CCLIENTBUILDING: + { + static_cast(pSource)->SetUsesCollision(bEnable); + break; + } } } } @@ -593,6 +599,13 @@ void CElementRPCs::SetLowLodElement(CClientEntity* pSource, NetBitStreamInterfac pObject->SetLowLodObject(pLowLodObject); break; } + case CCLIENTBUILDING: + { + CClientBuilding* pLowLodObject = DynamicCast(CElementIDs::GetElement(LowLodObjectID)); + CClientBuilding* pObject = static_cast(pSource); + pObject->SetLowLodBuilding(pLowLodObject); + break; + } } } } diff --git a/Server/mods/deathmatch/logic/CBuilding.cpp b/Server/mods/deathmatch/logic/CBuilding.cpp new file mode 100644 index 0000000000..4b9cdfd52e --- /dev/null +++ b/Server/mods/deathmatch/logic/CBuilding.cpp @@ -0,0 +1,212 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto v1.0 + * LICENSE: See LICENSE in the top level directory + * FILE: mods/deathmatch/logic/CBuilding.cpp + * PURPOSE: Object entity class + * + * Multi Theft Auto is available from http://www.multitheftauto.com/ + * + *****************************************************************************/ + +#include "StdInc.h" +#include "CBuilding.h" +#include "CLogger.h" +#include "Utils.h" + +extern CGame* g_pGame; + +CBuilding::CBuilding(CElement* pParent, CBuildingManager* pBuildingManager) : CElement(pParent), m_pLowLodObject(NULL) +{ + // Init + m_iType = CElement::BUILDING; + SetTypeName("buidling"); + + m_pObjectManager = pBuildingManager; + m_usModel = 0xFFFF; + m_ucAlpha = 255; + m_bDoubleSided = false; + m_bCollisionsEnabled = true; + + // Add us to the manager's list + pBuildingManager->AddToList(this); +} + +CBuilding::CBuilding(const CBuilding& Copy) : CElement(Copy.m_pParent), m_pLowLodObject(Copy.m_pLowLodObject) +{ + // Init + m_iType = CElement::BUILDING; + SetTypeName("buidling"); + + m_pObjectManager = Copy.m_pObjectManager; + m_usModel = Copy.m_usModel; + m_ucAlpha = Copy.m_ucAlpha; + m_bDoubleSided = Copy.m_bDoubleSided; + m_vecPosition = Copy.m_vecPosition; + m_vecRotation = Copy.m_vecRotation; + m_bCollisionsEnabled = Copy.m_bCollisionsEnabled; + + // Add us to the manager's list + m_pObjectManager->AddToList(this); + UpdateSpatialData(); +} + +CBuilding::~CBuilding() +{ + // Unlink us from manager + Unlink(); +} + +CElement* CBuilding::Clone(bool* bAddEntity, CResource* pResource) +{ + return new CBuilding(*this); +} + +void CBuilding::Unlink() +{ + // Remove us from the manager's list + m_pObjectManager->RemoveFromList(this); + + // Remove LowLod refs in others + SetLowLodObject(nullptr); + + if (m_HighLodObject) + m_HighLodObject->SetLowLodObject(nullptr); +} + +bool CBuilding::ReadSpecialData(const int iLine) +{ + // Grab the "posX" data + if (!GetCustomDataFloat("posX", m_vecPosition.fX, true)) + { + CLogger::ErrorPrintf("Bad/missing 'posX' attribute in (line %d)\n", iLine); + return false; + } + + // Grab the "posY" data + if (!GetCustomDataFloat("posY", m_vecPosition.fY, true)) + { + CLogger::ErrorPrintf("Bad/missing 'posY' attribute in (line %d)\n", iLine); + return false; + } + + // Grab the "posZ" data + if (!GetCustomDataFloat("posZ", m_vecPosition.fZ, true)) + { + CLogger::ErrorPrintf("Bad/missing 'posZ' attribute in (line %d)\n", iLine); + return false; + } + + // Grab the "rotX", "rotY" and "rotZ" data + GetCustomDataFloat("rotX", m_vecRotation.fX, true); + GetCustomDataFloat("rotY", m_vecRotation.fY, true); + GetCustomDataFloat("rotZ", m_vecRotation.fZ, true); + // We store radians, but load degrees + ConvertDegreesToRadians(m_vecRotation); + + // Grab the "model" data + int iTemp; + if (GetCustomDataInt("model", iTemp, true)) + { + // Valid id? + if (CBuildingManager::IsValidModel(iTemp)) + { + // Set the building id + m_usModel = static_cast(iTemp); + } + else + { + CLogger::ErrorPrintf("Bad 'model' (%d) id specified in (line %d)\n", iTemp, iLine); + return false; + } + } + else + { + CLogger::ErrorPrintf("Bad/missing 'model' attribute in (line %d)\n", iLine); + return false; + } + + if (GetCustomDataInt("interior", iTemp, true)) + m_ucInterior = static_cast(iTemp); + + if (!GetCustomDataBool("collisions", m_bCollisionsEnabled, true)) + m_bCollisionsEnabled = true; + + return true; +} + +void CBuilding::GetMatrix(CMatrix& matrix) +{ + matrix.vPos = GetPosition(); + CVector vecRotation; + GetRotation(vecRotation); + + // Do extra calculation to change rotation order if it will make a difference + if (vecRotation.fX != 0 && vecRotation.fY != 0) + { + ConvertRadiansToDegreesNoWrap(vecRotation); + vecRotation = ConvertEulerRotationOrder(vecRotation, EULER_ZXY, EULER_ZYX); + ConvertDegreesToRadiansNoWrap(vecRotation); + } + matrix.SetRotation(vecRotation); +} + +void CBuilding::SetMatrix(const CMatrix& matrix) +{ + // Set position and rotation from matrix + SetPosition(matrix.vPos); + CVector vecRotation = matrix.GetRotation(); + SetRotation(vecRotation); +} + +const CVector& CBuilding::GetPosition() +{ + return m_vecPosition; +} + +void CBuilding::SetPosition(const CVector& vecPosition) +{ + // Different position? + if (m_vecPosition != vecPosition) + { + // Update our vectors + m_vecPosition = vecPosition; + UpdateSpatialData(); + } +} + +void CBuilding::GetRotation(CVector& vecRotation) +{ + vecRotation = m_vecRotation; +} + +void CBuilding::SetRotation(const CVector& vecRotation) +{ + m_vecRotation = vecRotation; +} + +bool CBuilding::SetLowLodObject(CBuilding* pNewLowLodObject) +{ + // Set or clear? + if (!pNewLowLodObject) + { + if (m_pLowLodObject) + { + m_pLowLodObject->SetHighLodObject(nullptr); + m_pLowLodObject = nullptr; + } + m_pLowLodObject = nullptr; + return true; + } + else + { + // Remove any previous link + SetLowLodObject(nullptr); + + // Make new link + m_pLowLodObject = pNewLowLodObject; + pNewLowLodObject->SetHighLodObject(this); + return true; + } +} + diff --git a/Server/mods/deathmatch/logic/CBuilding.h b/Server/mods/deathmatch/logic/CBuilding.h new file mode 100644 index 0000000000..96e00710ba --- /dev/null +++ b/Server/mods/deathmatch/logic/CBuilding.h @@ -0,0 +1,74 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto v1.0 + * LICENSE: See LICENSE in the top level directory + * FILE: mods/deathmatch/logic/CBuilding.h + * PURPOSE: Object entity class + * + * Multi Theft Auto is available from http://www.multitheftauto.com/ + * + *****************************************************************************/ +#pragma once + +// Kayl: There is now too many includes here, try to make it work with StdInc.h if possible +#include "CElement.h" +#include "CEvents.h" +#include "CBuildingManager.h" + +#include "CEasingCurve.h" +#include "TInterpolation.h" +#include "CPositionRotationAnimation.h" + +class CBuilding final : public CElement +{ + friend class CPlayer; + +public: + explicit CBuilding(CElement* pParent, class CBuildingManager* pObjectManager); + explicit CBuilding(const CBuilding& Copy); + ~CBuilding(); + CElement* Clone(bool* bAddEntity, CResource* pResource) override; + + bool IsEntity() override { return true; } + + void Unlink() override; + + const CVector& GetPosition() override; + void SetPosition(const CVector& vecPosition) override; + + void GetRotation(CVector& vecRotation) override; + void SetRotation(const CVector& vecRotation); + + void GetMatrix(CMatrix& matrix); + void SetMatrix(const CMatrix& matrix); + + unsigned char GetAlpha() { return m_ucAlpha; } + void SetAlpha(unsigned char ucAlpha) { m_ucAlpha = ucAlpha; } + + unsigned short GetModel() { return m_usModel; } + void SetModel(unsigned short usModel) { m_usModel = usModel; } + + bool GetCollisionEnabled() { return m_bCollisionsEnabled; } + void SetCollisionEnabled(bool bCollisionEnabled) { m_bCollisionsEnabled = bCollisionEnabled; } + + bool SetLowLodObject(CBuilding* pLowLodObject); + CBuilding* GetLowLodElement() const { return m_pLowLodObject; }; + + CBuilding* GetHighLodObject() const { return m_HighLodObject; }; + void SetHighLodObject(CBuilding* pHighLodObject) { m_HighLodObject = pHighLodObject; }; + +protected: + bool ReadSpecialData(const int iLine) override; + +private: + CBuildingManager* m_pObjectManager; + CVector m_vecRotation; + unsigned char m_ucAlpha; + unsigned short m_usModel; + +protected: + bool m_bCollisionsEnabled; + + CBuilding* m_pLowLodObject; + CBuilding* m_HighLodObject; +}; diff --git a/Server/mods/deathmatch/logic/CBuildingManager.cpp b/Server/mods/deathmatch/logic/CBuildingManager.cpp new file mode 100644 index 0000000000..335111983a --- /dev/null +++ b/Server/mods/deathmatch/logic/CBuildingManager.cpp @@ -0,0 +1,79 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto v1.0 + * LICENSE: See LICENSE in the top level directory + * FILE: mods/deathmatch/logic/CBuildingManager.cpp + * PURPOSE: Building entity manager class + * + * Multi Theft Auto is available from http://www.multitheftauto.com/ + * + *****************************************************************************/ + +#include "StdInc.h" +#include "CBuildingManager.h" +#include "Utils.h" + +constexpr float WORLD_DISTANCE_FROM_CENTER = 3000.0f; + +CBuildingManager::CBuildingManager() +{ +} + +CBuildingManager::~CBuildingManager() +{ + DeleteAll(); +} + +CBuilding* CBuildingManager::Create(CElement* pParent) +{ + CBuilding* pBuilding = new CBuilding(pParent, this); + + if (pBuilding->GetID() == INVALID_ELEMENT_ID) + { + delete pBuilding; + return nullptr; + } + + return pBuilding; +} + +CBuilding* CBuildingManager::CreateFromXML(CElement* pParent, CXMLNode& Node, CEvents* pEvents) +{ + CBuilding* pBuilding = new CBuilding(pParent, this); + + if (pBuilding->GetID() == INVALID_ELEMENT_ID || !pBuilding->LoadFromCustomData(pEvents, Node)) + { + delete pBuilding; + return nullptr; + } + + return pBuilding; +} + +void CBuildingManager::DeleteAll() +{ + // Delete all objects, make sure they dont remove themselves from our list (would make this damn slow) + DeletePointersAndClearList(m_List); +} + +bool CBuildingManager::Exists(CBuilding* pBuilding) const +{ + return ListContains(m_List, pBuilding); +} + +bool CBuildingManager::IsValidModel(unsigned long ulObjectModel) +{ + // We are using the same list + return CObjectManager::IsValidModel(ulObjectModel); +} + +void CBuildingManager::RemoveFromList(CBuilding* pBuilding) +{ + m_List.remove(pBuilding); +} + +bool CBuildingManager::IsValidPosition(const CVector& pos) noexcept +{ + return (pos.fX >= -WORLD_DISTANCE_FROM_CENTER && pos.fX <= WORLD_DISTANCE_FROM_CENTER && pos.fY >= -WORLD_DISTANCE_FROM_CENTER && + pos.fY <= WORLD_DISTANCE_FROM_CENTER); +} diff --git a/Server/mods/deathmatch/logic/CBuildingManager.h b/Server/mods/deathmatch/logic/CBuildingManager.h new file mode 100644 index 0000000000..82281a54dc --- /dev/null +++ b/Server/mods/deathmatch/logic/CBuildingManager.h @@ -0,0 +1,45 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto v1.0 + * LICENSE: See LICENSE in the top level directory + * FILE: mods/deathmatch/logic/CBuildingManager.h + * PURPOSE: Building entity manager class + * + * Multi Theft Auto is available from http://www.multitheftauto.com/ + * + *****************************************************************************/ + +#pragma once + +#include "CBuilding.h" +#include + +using std::list; + +class CBuildingManager +{ + friend class CBuilding; +public: + CBuildingManager(); + ~CBuildingManager(); + + CBuilding* Create(CElement* pParent); + CBuilding* CreateFromXML(CElement* pParent, CXMLNode& Node, CEvents* pEvents); + void DeleteAll(); + + unsigned int Count() { return static_cast(m_List.size()); }; + bool Exists(CBuilding* pObject) const; + + using CBuildingListType = CFastList; + CBuildingListType::const_iterator IterBegin() const { return m_List.begin(); }; + CBuildingListType::const_iterator IterEnd() const { return m_List.end(); }; + + static bool IsValidModel(unsigned long ulObjectModel); + static bool IsValidPosition(const CVector& pos) noexcept; + +private: + void AddToList(CBuilding* pObject) { m_List.push_back(pObject); }; + void RemoveFromList(CBuilding* pObject); + + CBuildingListType m_List; +}; diff --git a/Server/mods/deathmatch/logic/CElement.h b/Server/mods/deathmatch/logic/CElement.h index 802981cd5a..79140e6c82 100644 --- a/Server/mods/deathmatch/logic/CElement.h +++ b/Server/mods/deathmatch/logic/CElement.h @@ -82,6 +82,8 @@ class CElement TRAIN_TRACK, ROOT, UNKNOWN, + BUILDING, + _POINTLIGHTS, // client only }; public: diff --git a/Server/mods/deathmatch/logic/CGame.cpp b/Server/mods/deathmatch/logic/CGame.cpp index b1a2ca18d6..c24b68c8f9 100644 --- a/Server/mods/deathmatch/logic/CGame.cpp +++ b/Server/mods/deathmatch/logic/CGame.cpp @@ -176,6 +176,7 @@ CGame::CGame() : m_FloodProtect(4, 30000, 30000) // Max of 4 connecti m_pVehicleManager = NULL; m_pPickupManager = NULL; m_pObjectManager = NULL; + m_pBuildingManager = nullptr; m_pColManager = NULL; m_pBlipManager = NULL; m_pClock = NULL; @@ -377,6 +378,7 @@ CGame::~CGame() SAFE_DELETE(m_pHandlingManager); SAFE_DELETE(m_pPickupManager); SAFE_DELETE(m_pObjectManager); + SAFE_DELETE(m_pBuildingManager); SAFE_DELETE(m_pColManager); SAFE_DELETE(m_pBlipManager); SAFE_DELETE(m_pClock); @@ -586,6 +588,7 @@ bool CGame::Start(int iArgumentCount, char* szArguments[]) m_pBlipManager = new CBlipManager; m_pColManager = new CColManager; m_pObjectManager = new CObjectManager; + m_pBuildingManager = new CBuildingManager(); m_pPickupManager = new CPickupManager(m_pColManager); m_pPlayerManager = new CPlayerManager; m_pRadarAreaManager = new CRadarAreaManager; diff --git a/Server/mods/deathmatch/logic/CGame.h b/Server/mods/deathmatch/logic/CGame.h index e6bd4dfccf..d807ae9484 100644 --- a/Server/mods/deathmatch/logic/CGame.h +++ b/Server/mods/deathmatch/logic/CGame.h @@ -76,6 +76,7 @@ class CMainConfig; class CMapManager; class CMarkerManager; class CObjectManager; +class CBuildingManager; class CPacket; class CPacketTranslator; class CLatentTransferManager; @@ -220,6 +221,7 @@ class CGame CMapManager* GetMapManager() { return m_pMapManager; } CPlayerManager* GetPlayerManager() { return m_pPlayerManager; } CObjectManager* GetObjectManager() { return m_pObjectManager; } + CBuildingManager* GetBuildingManager() const { return m_pBuildingManager; } CVehicleManager* GetVehicleManager() { return m_pVehicleManager; } CTeamManager* GetTeamManager() { return m_pTeamManager; } CUnoccupiedVehicleSync* GetUnoccupiedVehicleSync() { return m_pUnoccupiedVehicleSync; } @@ -537,6 +539,7 @@ class CGame CGroups* m_pGroups; CColManager* m_pColManager; CObjectManager* m_pObjectManager; + CBuildingManager* m_pBuildingManager; CPickupManager* m_pPickupManager; CPlayerManager* m_pPlayerManager; CRadarAreaManager* m_pRadarAreaManager; diff --git a/Server/mods/deathmatch/logic/CResourceMapItem.cpp b/Server/mods/deathmatch/logic/CResourceMapItem.cpp index 653d192ac2..96c9c50c78 100644 --- a/Server/mods/deathmatch/logic/CResourceMapItem.cpp +++ b/Server/mods/deathmatch/logic/CResourceMapItem.cpp @@ -20,6 +20,7 @@ #include "CWaterManager.h" #include "CMarkerManager.h" #include "CVehicleManager.h" +#include "CBuildingManager.h" #include "CBlipManager.h" #include "Enums.h" #include "lua/CLuaFunctionParseHelpers.h" @@ -34,6 +35,7 @@ CResourceMapItem::CResourceMapItem(CResource* pResource, const char* szShortName m_pMarkerManager = g_pGame->GetMarkerManager(); m_pBlipManager = g_pGame->GetBlipManager(); m_pObjectManager = g_pGame->GetObjectManager(); + m_pBuildingManager = g_pGame->GetBuildingManager(); m_pPickupManager = g_pGame->GetPickupManager(); m_pPlayerManager = g_pGame->GetPlayerManager(); m_pRadarAreaManager = g_pGame->GetRadarAreaManager(); @@ -188,6 +190,11 @@ void CResourceMapItem::HandleNode(CXMLNode& Node, CElement* pParent) pNode = m_pWaterManager->CreateFromXML(pParent, Node, m_pEvents); break; } + case CElement::BUILDING: + { + pNode = m_pBuildingManager->CreateFromXML(pParent, Node, m_pEvents); + break; + } default: { pNode = m_pGroups->CreateFromXML(pParent, Node, m_pEvents); @@ -226,45 +233,25 @@ void CResourceMapItem::LinkupElements() } } - for (auto iter = m_pPlayerManager->IterBegin(); iter != m_pPlayerManager->IterEnd(); ++iter) + auto linkupElementsInManager = [pRootElement](auto* pManager) { - CPlayer* const pPlayer = *iter; - const char* szAttachToID = pPlayer->GetAttachToID(); - - if (szAttachToID[0]) + for (auto iter = pManager->IterBegin(); iter != pManager->IterEnd(); ++iter) { - CElement* const pElement = pRootElement->FindChild(szAttachToID, 0, true); + auto* pIterElement = *iter; + const char* szAttachToID = pIterElement->GetAttachToID(); - if (pElement && !pElement->IsAttachedToElement(pPlayer)) - pPlayer->AttachTo(pElement); - } - } - - for (auto iter = m_pObjectManager->IterBegin(); iter != m_pObjectManager->IterEnd(); ++iter) - { - CObject* const pObject = *iter; - const char* szAttachToID = pObject->GetAttachToID(); + if (szAttachToID[0]) + { + CElement* const pElement = pRootElement->FindChild(szAttachToID, 0, true); - if (szAttachToID[0]) - { - CElement* const pElement = pRootElement->FindChild(szAttachToID, 0, true); - - if (pElement && !pElement->IsAttachedToElement(pObject)) - pObject->AttachTo(pElement); + if (pElement && !pElement->IsAttachedToElement(pIterElement)) + pIterElement->AttachTo(pElement); + } } - } + }; - for (auto iter = m_pBlipManager->IterBegin(); iter != m_pBlipManager->IterEnd(); ++iter) - { - CBlip* const pBlip = *iter; - const char* szAttachToID = pBlip->GetAttachToID(); - - if (szAttachToID[0]) - { - CElement* const pElement = pRootElement->FindChild(szAttachToID, 0, true); - - if (pElement && !pElement->IsAttachedToElement(pBlip)) - pBlip->AttachTo(pElement); - } - } + linkupElementsInManager(m_pPlayerManager); + linkupElementsInManager(m_pObjectManager); + linkupElementsInManager(m_pBlipManager); + linkupElementsInManager(m_pBuildingManager); } diff --git a/Server/mods/deathmatch/logic/CResourceMapItem.h b/Server/mods/deathmatch/logic/CResourceMapItem.h index 823ca008d0..86591fbb4d 100644 --- a/Server/mods/deathmatch/logic/CResourceMapItem.h +++ b/Server/mods/deathmatch/logic/CResourceMapItem.h @@ -22,6 +22,7 @@ class CGroups; class CMarkerManager; class CBlipManager; class CObjectManager; +class CBuildingManager; class CPickupManager; class CPlayerManager; class CRadarAreaManager; @@ -58,6 +59,7 @@ class CResourceMapItem : public CResourceFile CMarkerManager* m_pMarkerManager; CBlipManager* m_pBlipManager; CObjectManager* m_pObjectManager; + CBuildingManager* m_pBuildingManager; CPickupManager* m_pPickupManager; CPlayerManager* m_pPlayerManager; CRadarAreaManager* m_pRadarAreaManager; diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 24c9ff6edc..c79bcc829c 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -21,6 +21,7 @@ #include "CClock.h" #include "CBlip.h" #include "CWater.h" +#include "CBuilding.h" #include "CPlayerCamera.h" #include "CElementDeleter.h" #include "CMainConfig.h" @@ -773,6 +774,10 @@ bool CStaticFunctionDefinitions::GetElementCollisionsEnabled(CElement* pElement) CPed* pPed = static_cast(pElement); return pPed->GetCollisionEnabled(); } + case CElement::BUILDING: + { + return static_cast(pElement)->GetCollisionEnabled(); + } default: return false; } @@ -828,6 +833,16 @@ bool CStaticFunctionDefinitions::SetLowLodElement(CElement* pElement, CElement* return false; break; } + case CElement::BUILDING: + { + CBuilding* pBuilding = static_cast(pElement); + CBuilding* pLowLodObject = nullptr; + if (pLowLodElement && pLowLodElement->GetType() == CElement::BUILDING) + pLowLodObject = static_cast(pLowLodElement); + if (!pBuilding->SetLowLodObject(pLowLodObject)) + return false; + break; + } default: return false; } @@ -853,6 +868,11 @@ bool CStaticFunctionDefinitions::GetLowLodElement(CElement* pElement, CElement*& pOutLowLodElement = pObject->GetLowLodObject(); break; } + case CElement::BUILDING: + { + pOutLowLodElement = static_cast(pElement)->GetLowLodElement(); + break; + } default: return false; } @@ -872,6 +892,11 @@ bool CStaticFunctionDefinitions::IsElementLowLod(CElement* pElement, bool& bOutI bOutIsLowLod = pObject->IsLowLod(); break; } + case CElement::BUILDING: + { + bOutIsLowLod = static_cast(pElement)->GetHighLodObject() ? true : false; + break; + } default: return false; } @@ -1914,6 +1939,11 @@ bool CStaticFunctionDefinitions::SetElementCollisionsEnabled(CElement* pElement, pPed->SetCollisionEnabled(bEnable); break; } + case CElement::BUILDING: + { + static_cast(pElement)->SetCollisionEnabled(bEnable); + break; + } default: return false; } diff --git a/Server/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp b/Server/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp index 76540327af..e470a37646 100644 --- a/Server/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp +++ b/Server/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp @@ -271,6 +271,7 @@ ADD_ENUM(CElement::WATER, "water") ADD_ENUM(CElement::DATABASE_CONNECTION, "db-connection") ADD_ENUM(CElement::ROOT, "root") ADD_ENUM(CElement::UNKNOWN, "unknown") +ADD_ENUM(CElement::BUILDING, "building") IMPLEMENT_ENUM_END_DEFAULTS("element-type", CElement::UNKNOWN, "unknown") IMPLEMENT_ENUM_BEGIN(CAccountPassword::EAccountPasswordType) diff --git a/Server/mods/deathmatch/logic/lua/CLuaMain.cpp b/Server/mods/deathmatch/logic/lua/CLuaMain.cpp index 189d204c57..2346c8986d 100644 --- a/Server/mods/deathmatch/logic/lua/CLuaMain.cpp +++ b/Server/mods/deathmatch/logic/lua/CLuaMain.cpp @@ -20,6 +20,7 @@ #include "luadefs/CLuaACLDefs.h" #include "luadefs/CLuaBanDefs.h" #include "luadefs/CLuaBlipDefs.h" +#include "luadefs/CLuaBuildingDefs.h" #include "luadefs/CLuaColShapeDefs.h" #include "luadefs/CLuaDatabaseDefs.h" #include "luadefs/CLuaMarkerDefs.h" @@ -176,6 +177,7 @@ void CLuaMain::InitClasses(lua_State* luaVM) CLuaACLDefs ::AddClass(luaVM); CLuaBanDefs ::AddClass(luaVM); CLuaBlipDefs ::AddClass(luaVM); + CLuaBuildingDefs ::AddClass(luaVM); CLuaColShapeDefs ::AddClass(luaVM); CLuaDatabaseDefs ::AddClass(luaVM); CLuaMarkerDefs ::AddClass(luaVM); diff --git a/Server/mods/deathmatch/logic/lua/CLuaManager.cpp b/Server/mods/deathmatch/logic/lua/CLuaManager.cpp index 52d25e8b8f..90362c02fd 100644 --- a/Server/mods/deathmatch/logic/lua/CLuaManager.cpp +++ b/Server/mods/deathmatch/logic/lua/CLuaManager.cpp @@ -22,6 +22,7 @@ #include "luadefs/CLuaACLDefs.h" #include "luadefs/CLuaBanDefs.h" #include "luadefs/CLuaBlipDefs.h" +#include "luadefs/CLuaBuildingDefs.h" #include "luadefs/CLuaColShapeDefs.h" #include "luadefs/CLuaDatabaseDefs.h" #include "luadefs/CLuaMarkerDefs.h" @@ -191,6 +192,7 @@ void CLuaManager::LoadCFunctions() CLuaAccountDefs::LoadFunctions(); CLuaBanDefs::LoadFunctions(); CLuaBlipDefs::LoadFunctions(); + CLuaBuildingDefs::LoadFunctions(); CLuaCameraDefs::LoadFunctions(); CLuaColShapeDefs::LoadFunctions(); CLuaDatabaseDefs::LoadFunctions(); diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp new file mode 100644 index 0000000000..da49a2dae9 --- /dev/null +++ b/Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp @@ -0,0 +1,76 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto v1.x + * LICENSE: See LICENSE in the top level directory + * FILE: mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp + * PURPOSE: Lua function definitions class + * + * Multi Theft Auto is available from http://www.multitheftauto.com/ + * + *****************************************************************************/ + +#include "StdInc.h" +#include "CLuaBuildingDefs.h" +#include "Utils.h" +#include "CDummy.h" +#include + +void CLuaBuildingDefs::LoadFunctions() +{ + constexpr static const std::pair functions[]{ + {"createBuilding", ArgumentParser}, + }; + + // Add functions + for (const auto& [name, func] : functions) + CLuaCFunctions::AddFunction(name, func); +} + +void CLuaBuildingDefs::AddClass(lua_State* luaVM) +{ + lua_newclass(luaVM); + + lua_classfunction(luaVM, "create", "createBuilding"); + + lua_registerclass(luaVM, "Building", "Element"); +} + +CBuilding* CLuaBuildingDefs::CreateBuilding(lua_State* const luaVM, std::uint16_t modelId, CVector pos, std::optional rot, + std::optional interior) +{ + CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(luaVM); + + // Get the resource we belong to + CResource* pResource = pLuaMain->GetResource(); + if (!pResource) + return false; + + if (!CBuildingManager::IsValidModel(modelId)) + throw std::invalid_argument("Invalid building model id"); + + if (!CBuildingManager::IsValidPosition(pos)) + throw std::invalid_argument("Position is outside of game world"); + + if (rot.has_value()) + ConvertDegreesToRadians(rot.value()); + else + rot.emplace(CVector(0, 0, 0)); + + CBuilding* pBuilding = m_pBuildingManager->Create(pResource->GetDynamicElementRoot()); + + if (!pBuilding) + return nullptr; + + pBuilding->SetPosition(pos); + pBuilding->SetRotation(rot.value()); + pBuilding->SetModel(modelId); + + if (pResource->IsClientSynced()) + { + CEntityAddPacket Packet; + Packet.Add(pBuilding); + m_pPlayerManager->BroadcastOnlyJoined(Packet); + } + + return pBuilding; +} diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.h b/Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.h new file mode 100644 index 0000000000..e85353dec2 --- /dev/null +++ b/Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.h @@ -0,0 +1,23 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto v1.0 + * LICENSE: See LICENSE in the top level directory + * FILE: mods/deathmatch/logic/luadefs/CLuaObjectDefs.h + * PURPOSE: Lua function definitions class + * + * Multi Theft Auto is available from http://www.multitheftauto.com/ + * + *****************************************************************************/ + +#pragma once +#include "CLuaDefs.h" + +class CLuaBuildingDefs : public CLuaDefs +{ +public: + static void LoadFunctions(); + static void AddClass(lua_State* luaVM); + + static CBuilding* CreateBuilding(lua_State* const luaVM, std::uint16_t modelId, CVector pos, std::optional rot, + std::optional interior); +}; diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaClassDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaClassDefs.cpp index b617381c57..de202c4c0b 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaClassDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaClassDefs.cpp @@ -323,6 +323,8 @@ const char* CLuaClassDefs::GetElementClass(CElement* pElement) return "Blip"; case CElement::OBJECT: return "Object"; + case CElement::BUILDING: + return "Building"; case CElement::PICKUP: return "Pickup"; case CElement::RADAR_AREA: diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaDefs.cpp index 8d8e3a3646..7edf48cabb 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaDefs.cpp @@ -44,6 +44,7 @@ CHandlingManager* CLuaDefs::m_pHandlingManager = NULL; CLuaManager* CLuaDefs::m_pLuaManager = NULL; CMarkerManager* CLuaDefs::m_pMarkerManager = NULL; CObjectManager* CLuaDefs::m_pObjectManager = NULL; +CBuildingManager* CLuaDefs::m_pBuildingManager = nullptr; CPickupManager* CLuaDefs::m_pPickupManager = NULL; CPlayerManager* CLuaDefs::m_pPlayerManager = NULL; CRadarAreaManager* CLuaDefs::m_pRadarAreaManager = NULL; @@ -67,6 +68,7 @@ void CLuaDefs::Initialize(CGame* pGame) m_pLuaManager = pGame->GetLuaManager(); m_pMarkerManager = pGame->GetMarkerManager(); m_pObjectManager = pGame->GetObjectManager(); + m_pBuildingManager = pGame->GetBuildingManager(); m_pPickupManager = pGame->GetPickupManager(); m_pPlayerManager = pGame->GetPlayerManager(); m_pRadarAreaManager = pGame->GetRadarAreaManager(); diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaDefs.h b/Server/mods/deathmatch/logic/luadefs/CLuaDefs.h index ae81ecdf4e..e74b057560 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaDefs.h +++ b/Server/mods/deathmatch/logic/luadefs/CLuaDefs.h @@ -21,6 +21,7 @@ #include "../CMainConfig.h" #include "../CMarkerManager.h" #include "../CObjectManager.h" +#include "../CBuildingManager.h" #include "../CPickupManager.h" #include "../CPlayerManager.h" #include "../CRadarAreaManager.h" @@ -72,6 +73,7 @@ class CLuaDefs static CLuaManager* m_pLuaManager; static CMarkerManager* m_pMarkerManager; static CObjectManager* m_pObjectManager; + static CBuildingManager* m_pBuildingManager; static CPickupManager* m_pPickupManager; static CPlayerManager* m_pPlayerManager; static CRadarAreaManager* m_pRadarAreaManager; diff --git a/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp b/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp index a001ba518f..0e9c1fd4f4 100644 --- a/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp @@ -18,6 +18,7 @@ #include "CColRectangle.h" #include "CColTube.h" #include "CDummy.h" +#include "CBuilding.h" #include "CPickup.h" #include "CMarker.h" #include "CBlip.h" @@ -153,6 +154,12 @@ bool CEntityAddPacket::Write(NetBitStreamInterface& BitStream) const bCollisionsEnabled = pObject->GetCollisionEnabled(); break; } + case CElement::BUILDING: + { + CBuilding* pBuilding = static_cast(pElement); + bCollisionsEnabled = pBuilding->GetCollisionEnabled(); + break; + } case CElement::PED: case CElement::PLAYER: { @@ -1118,6 +1125,31 @@ bool CEntityAddPacket::Write(NetBitStreamInterface& BitStream) const break; } + case CElement::BUILDING: + { + CBuilding* pBuilding = static_cast(pElement); + + // Position + position.data.vecPosition = pBuilding->GetPosition(); + BitStream.Write(&position); + + // Rotation + SRotationRadiansSync rotationRadians(false); + pBuilding->GetRotation(rotationRadians.data.vecRotation); + BitStream.Write(&rotationRadians); + + // Model id + BitStream.WriteCompressed(pBuilding->GetModel()); + + // Interior + BitStream.WriteCompressed(pBuilding->GetInterior()); + + CBuilding* pLowLodBuilding = pBuilding->GetLowLodElement(); + ElementID LowLodObjectID = pLowLodBuilding ? pLowLodBuilding->GetID() : INVALID_ELEMENT_ID; + BitStream.Write(LowLodObjectID); + break; + } + default: { assert(0); From 07701c8d92456ce80a4530cbcc356c68d1af95f7 Mon Sep 17 00:00:00 2001 From: Uladzislau Nikalayevich Date: Thu, 12 Dec 2024 19:03:53 +0300 Subject: [PATCH 02/16] setelemntmodel rpc --- .../mods/deathmatch/logic/rpc/CElementRPCs.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp b/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp index ec397b7ec5..816adf72d9 100644 --- a/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp +++ b/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp @@ -498,6 +498,22 @@ void CElementRPCs::SetElementModel(CClientEntity* pSource, NetBitStreamInterface pObject->CallEvent("onClientElementModelChange", Arguments, true); } + break; + } + case CCLIENTBUILDING: + { + CClientBuilding* pBuilding = static_cast(pSource); + const unsigned short usCurrentModel = pBuilding->GetModel(); + + if (usCurrentModel != usModel) + { + pBuilding->SetModel(usModel); + CLuaArguments Arguments; + Arguments.PushNumber(usCurrentModel); + Arguments.PushNumber(usModel); + pBuilding->CallEvent("onClientElementModelChange", Arguments, true); + } + break; } } From 3eb590b11f8c770bea952c1064f1dc39a9868744 Mon Sep 17 00:00:00 2001 From: Uladzislau Nikalayevich Date: Sun, 22 Dec 2024 18:24:29 +0300 Subject: [PATCH 03/16] Add client version check --- Server/mods/deathmatch/logic/CBuilding.h | 3 ++- Server/mods/deathmatch/logic/CResourceMapItem.cpp | 9 +++++++++ .../mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp | 5 +++++ .../mods/deathmatch/logic/packets/CEntityAddPacket.cpp | 6 ++++++ Shared/sdk/net/bitstream.h | 4 ++++ 5 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Server/mods/deathmatch/logic/CBuilding.h b/Server/mods/deathmatch/logic/CBuilding.h index 96e00710ba..527a1670a6 100644 --- a/Server/mods/deathmatch/logic/CBuilding.h +++ b/Server/mods/deathmatch/logic/CBuilding.h @@ -10,7 +10,6 @@ *****************************************************************************/ #pragma once -// Kayl: There is now too many includes here, try to make it work with StdInc.h if possible #include "CElement.h" #include "CEvents.h" #include "CBuildingManager.h" @@ -19,6 +18,8 @@ #include "TInterpolation.h" #include "CPositionRotationAnimation.h" +#define SERVERSIDE_BUILDING_MIN_CLIENT_VERSION "1.6.0-9.22824" + class CBuilding final : public CElement { friend class CPlayer; diff --git a/Server/mods/deathmatch/logic/CResourceMapItem.cpp b/Server/mods/deathmatch/logic/CResourceMapItem.cpp index 96c9c50c78..c43b5dc9ed 100644 --- a/Server/mods/deathmatch/logic/CResourceMapItem.cpp +++ b/Server/mods/deathmatch/logic/CResourceMapItem.cpp @@ -192,6 +192,15 @@ void CResourceMapItem::HandleNode(CXMLNode& Node, CElement* pParent) } case CElement::BUILDING: { + const CMtaVersion& minClientVersion = m_resource->GetMinClientFromMetaXml(); + + if (minClientVersion < CMtaVersion(SERVERSIDE_BUILDING_MIN_CLIENT_VERSION)) + { + CLogger::LogPrintf("Resource %s should have client min_mta_version higher or equal than %s\n", m_resource->GetName(), + SERVERSIDE_BUILDING_MIN_CLIENT_VERSION); + break; + } + pNode = m_pBuildingManager->CreateFromXML(pParent, Node, m_pEvents); break; } diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp index da49a2dae9..3342f69e4a 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp @@ -45,6 +45,11 @@ CBuilding* CLuaBuildingDefs::CreateBuilding(lua_State* const luaVM, std::uint16_ if (!pResource) return false; + const CMtaVersion& minClientVersion = pResource->GetMinClientFromMetaXml(); + + if (minClientVersion < CMtaVersion(SERVERSIDE_BUILDING_MIN_CLIENT_VERSION)) + throw std::exception("Expected client min_mta_version in meta.xml hinger or equal than " SERVERSIDE_BUILDING_MIN_CLIENT_VERSION); + if (!CBuildingManager::IsValidModel(modelId)) throw std::invalid_argument("Invalid building model id"); diff --git a/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp b/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp index 0e9c1fd4f4..52af5d5f49 100644 --- a/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp @@ -1127,6 +1127,12 @@ bool CEntityAddPacket::Write(NetBitStreamInterface& BitStream) const case CElement::BUILDING: { + if (!BitStream.Can(eBitStreamVersion::ServersideBuildingElement)) + { + CLogger::LogPrintf("not sending this element - id: %i\n", pElement->GetType()); + break; + } + CBuilding* pBuilding = static_cast(pElement); // Position diff --git a/Shared/sdk/net/bitstream.h b/Shared/sdk/net/bitstream.h index f422739ad4..6bf48bd073 100644 --- a/Shared/sdk/net/bitstream.h +++ b/Shared/sdk/net/bitstream.h @@ -588,6 +588,10 @@ enum class eBitStreamVersion : unsigned short // 2024-11-26 WorldSpecialPropertyEvent, + // Add serverside building support + // 2024-12-? + ServersideBuildingElement, + // 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, From 1ce76e54f44081444c4ddf453461c305ab63ace3 Mon Sep 17 00:00:00 2001 From: Uladzislau Nikalayevich Date: Sun, 22 Dec 2024 20:04:31 +0300 Subject: [PATCH 04/16] Fix copypaste --- .../deathmatch/logic/rpc/CElementRPCs.cpp | 4 +-- Server/mods/deathmatch/logic/CBuilding.cpp | 36 +++++++++---------- Server/mods/deathmatch/logic/CBuilding.h | 26 +++++++------- .../logic/packets/CEntityAddPacket.cpp | 4 +-- 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp b/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp index 816adf72d9..03e50bc01b 100644 --- a/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp +++ b/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp @@ -617,9 +617,9 @@ void CElementRPCs::SetLowLodElement(CClientEntity* pSource, NetBitStreamInterfac } case CCLIENTBUILDING: { - CClientBuilding* pLowLodObject = DynamicCast(CElementIDs::GetElement(LowLodObjectID)); + CClientBuilding* pLowLodBuilding = DynamicCast(CElementIDs::GetElement(LowLodObjectID)); CClientBuilding* pObject = static_cast(pSource); - pObject->SetLowLodBuilding(pLowLodObject); + pObject->SetLowLodBuilding(pLowLodBuilding); break; } } diff --git a/Server/mods/deathmatch/logic/CBuilding.cpp b/Server/mods/deathmatch/logic/CBuilding.cpp index 4b9cdfd52e..457368d87f 100644 --- a/Server/mods/deathmatch/logic/CBuilding.cpp +++ b/Server/mods/deathmatch/logic/CBuilding.cpp @@ -16,13 +16,13 @@ extern CGame* g_pGame; -CBuilding::CBuilding(CElement* pParent, CBuildingManager* pBuildingManager) : CElement(pParent), m_pLowLodObject(NULL) +CBuilding::CBuilding(CElement* pParent, CBuildingManager* pBuildingManager) : CElement(pParent), m_pLowLodBuilding(NULL) { // Init m_iType = CElement::BUILDING; SetTypeName("buidling"); - m_pObjectManager = pBuildingManager; + m_pBuildingManager = pBuildingManager; m_usModel = 0xFFFF; m_ucAlpha = 255; m_bDoubleSided = false; @@ -32,13 +32,13 @@ CBuilding::CBuilding(CElement* pParent, CBuildingManager* pBuildingManager) : CE pBuildingManager->AddToList(this); } -CBuilding::CBuilding(const CBuilding& Copy) : CElement(Copy.m_pParent), m_pLowLodObject(Copy.m_pLowLodObject) +CBuilding::CBuilding(const CBuilding& Copy) : CElement(Copy.m_pParent), m_pLowLodBuilding(Copy.m_pLowLodBuilding) { // Init m_iType = CElement::BUILDING; SetTypeName("buidling"); - m_pObjectManager = Copy.m_pObjectManager; + m_pBuildingManager = Copy.m_pBuildingManager; m_usModel = Copy.m_usModel; m_ucAlpha = Copy.m_ucAlpha; m_bDoubleSided = Copy.m_bDoubleSided; @@ -47,7 +47,7 @@ CBuilding::CBuilding(const CBuilding& Copy) : CElement(Copy.m_pParent), m_pLowLo m_bCollisionsEnabled = Copy.m_bCollisionsEnabled; // Add us to the manager's list - m_pObjectManager->AddToList(this); + m_pBuildingManager->AddToList(this); UpdateSpatialData(); } @@ -65,13 +65,13 @@ CElement* CBuilding::Clone(bool* bAddEntity, CResource* pResource) void CBuilding::Unlink() { // Remove us from the manager's list - m_pObjectManager->RemoveFromList(this); + m_pBuildingManager->RemoveFromList(this); // Remove LowLod refs in others - SetLowLodObject(nullptr); + SetLowLodBuilding(nullptr); - if (m_HighLodObject) - m_HighLodObject->SetLowLodObject(nullptr); + if (m_HighLodBuilding) + m_HighLodBuilding->SetLowLodBuilding(nullptr); } bool CBuilding::ReadSpecialData(const int iLine) @@ -185,27 +185,27 @@ void CBuilding::SetRotation(const CVector& vecRotation) m_vecRotation = vecRotation; } -bool CBuilding::SetLowLodObject(CBuilding* pNewLowLodObject) +bool CBuilding::SetLowLodBuilding(CBuilding* pNewLowLodBuilding) { // Set or clear? - if (!pNewLowLodObject) + if (!pNewLowLodBuilding) { - if (m_pLowLodObject) + if (m_pLowLodBuilding) { - m_pLowLodObject->SetHighLodObject(nullptr); - m_pLowLodObject = nullptr; + m_pLowLodBuilding->SetHighLodObject(nullptr); + m_pLowLodBuilding = nullptr; } - m_pLowLodObject = nullptr; + m_pLowLodBuilding = nullptr; return true; } else { // Remove any previous link - SetLowLodObject(nullptr); + SetLowLodBuilding(nullptr); // Make new link - m_pLowLodObject = pNewLowLodObject; - pNewLowLodObject->SetHighLodObject(this); + m_pLowLodBuilding = pNewLowLodBuilding; + pNewLowLodBuilding->SetHighLodObject(this); return true; } } diff --git a/Server/mods/deathmatch/logic/CBuilding.h b/Server/mods/deathmatch/logic/CBuilding.h index 527a1670a6..7c18026d18 100644 --- a/Server/mods/deathmatch/logic/CBuilding.h +++ b/Server/mods/deathmatch/logic/CBuilding.h @@ -40,36 +40,36 @@ class CBuilding final : public CElement void GetRotation(CVector& vecRotation) override; void SetRotation(const CVector& vecRotation); - void GetMatrix(CMatrix& matrix); - void SetMatrix(const CMatrix& matrix); + void GetMatrix(CMatrix& matrix) override; + void SetMatrix(const CMatrix& matrix) override; unsigned char GetAlpha() { 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; } bool GetCollisionEnabled() { return m_bCollisionsEnabled; } void SetCollisionEnabled(bool bCollisionEnabled) { m_bCollisionsEnabled = bCollisionEnabled; } - bool SetLowLodObject(CBuilding* pLowLodObject); - CBuilding* GetLowLodElement() const { return m_pLowLodObject; }; + bool SetLowLodBuilding(CBuilding* pLowLodBuilding); + CBuilding* GetLowLodElement() const { return m_pLowLodBuilding; }; - CBuilding* GetHighLodObject() const { return m_HighLodObject; }; - void SetHighLodObject(CBuilding* pHighLodObject) { m_HighLodObject = pHighLodObject; }; + CBuilding* GetHighLodBuilding() const { return m_HighLodBuilding; }; + void SetHighLodObject(CBuilding* pHighLodObject) { m_HighLodBuilding = pHighLodObject; }; protected: bool ReadSpecialData(const int iLine) override; private: - CBuildingManager* m_pObjectManager; - CVector m_vecRotation; - unsigned char m_ucAlpha; - unsigned short m_usModel; + CBuildingManager* m_pBuildingManager; + CVector m_vecRotation; + unsigned char m_ucAlpha; + unsigned short m_usModel; protected: bool m_bCollisionsEnabled; - CBuilding* m_pLowLodObject; - CBuilding* m_HighLodObject; + CBuilding* m_pLowLodBuilding; + CBuilding* m_HighLodBuilding; }; diff --git a/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp b/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp index 52af5d5f49..bb2af878f8 100644 --- a/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp @@ -1151,8 +1151,8 @@ bool CEntityAddPacket::Write(NetBitStreamInterface& BitStream) const BitStream.WriteCompressed(pBuilding->GetInterior()); CBuilding* pLowLodBuilding = pBuilding->GetLowLodElement(); - ElementID LowLodObjectID = pLowLodBuilding ? pLowLodBuilding->GetID() : INVALID_ELEMENT_ID; - BitStream.Write(LowLodObjectID); + ElementID lowLodBuildingID = pLowLodBuilding ? pLowLodBuilding->GetID() : INVALID_ELEMENT_ID; + BitStream.Write(lowLodBuildingID); break; } From 604ece2d5016cc126577fd48939ee4d3cb802e63 Mon Sep 17 00:00:00 2001 From: Uladzislau Nikalayevich Date: Sun, 22 Dec 2024 20:18:41 +0300 Subject: [PATCH 05/16] fixup --- Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp b/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp index 03e50bc01b..01994238ee 100644 --- a/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp +++ b/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp @@ -618,8 +618,8 @@ void CElementRPCs::SetLowLodElement(CClientEntity* pSource, NetBitStreamInterfac case CCLIENTBUILDING: { CClientBuilding* pLowLodBuilding = DynamicCast(CElementIDs::GetElement(LowLodObjectID)); - CClientBuilding* pObject = static_cast(pSource); - pObject->SetLowLodBuilding(pLowLodBuilding); + CClientBuilding* pBuilding = static_cast(pSource); + pBuilding->SetLowLodBuilding(pLowLodBuilding); break; } } From d059b6ed003210918751308b8041f4dd719a396d Mon Sep 17 00:00:00 2001 From: Uladzislau Nikalayevich Date: Tue, 24 Dec 2024 00:27:52 +0300 Subject: [PATCH 06/16] Update Server/mods/deathmatch/logic/CBuilding.cpp --- Server/mods/deathmatch/logic/CBuilding.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/mods/deathmatch/logic/CBuilding.cpp b/Server/mods/deathmatch/logic/CBuilding.cpp index 457368d87f..f737d33f3a 100644 --- a/Server/mods/deathmatch/logic/CBuilding.cpp +++ b/Server/mods/deathmatch/logic/CBuilding.cpp @@ -16,7 +16,7 @@ extern CGame* g_pGame; -CBuilding::CBuilding(CElement* pParent, CBuildingManager* pBuildingManager) : CElement(pParent), m_pLowLodBuilding(NULL) +CBuilding::CBuilding(CElement* pParent, CBuildingManager* pBuildingManager) : CElement(pParent), m_pLowLodBuilding(nullptr) { // Init m_iType = CElement::BUILDING; From 9879361639f4819db617d81f23e2f44f41e196c0 Mon Sep 17 00:00:00 2001 From: Uladzislau Nikalayevich Date: Sat, 28 Dec 2024 21:38:58 +0300 Subject: [PATCH 07/16] Add std::exception("Cannot be done in current environment"); --- Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp index 3342f69e4a..8eeb7caac7 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp @@ -43,7 +43,7 @@ CBuilding* CLuaBuildingDefs::CreateBuilding(lua_State* const luaVM, std::uint16_ // Get the resource we belong to CResource* pResource = pLuaMain->GetResource(); if (!pResource) - return false; + throw std::exception("Cannot be done in current environment"); const CMtaVersion& minClientVersion = pResource->GetMinClientFromMetaXml(); From 9dbb7a31aaa7586937f7b01dfba74cf8ccbe73a3 Mon Sep 17 00:00:00 2001 From: Uladzislau Nikalayevich Date: Sat, 28 Dec 2024 21:55:15 +0300 Subject: [PATCH 08/16] some CBuildingManager fixes --- Server/mods/deathmatch/logic/CBuildingManager.cpp | 5 ----- Server/mods/deathmatch/logic/CBuildingManager.h | 14 ++++++-------- Server/mods/deathmatch/logic/CGame.h | 2 +- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/Server/mods/deathmatch/logic/CBuildingManager.cpp b/Server/mods/deathmatch/logic/CBuildingManager.cpp index 335111983a..33fbb9596b 100644 --- a/Server/mods/deathmatch/logic/CBuildingManager.cpp +++ b/Server/mods/deathmatch/logic/CBuildingManager.cpp @@ -56,11 +56,6 @@ void CBuildingManager::DeleteAll() DeletePointersAndClearList(m_List); } -bool CBuildingManager::Exists(CBuilding* pBuilding) const -{ - return ListContains(m_List, pBuilding); -} - bool CBuildingManager::IsValidModel(unsigned long ulObjectModel) { // We are using the same list diff --git a/Server/mods/deathmatch/logic/CBuildingManager.h b/Server/mods/deathmatch/logic/CBuildingManager.h index 82281a54dc..b546c0fce3 100644 --- a/Server/mods/deathmatch/logic/CBuildingManager.h +++ b/Server/mods/deathmatch/logic/CBuildingManager.h @@ -19,27 +19,25 @@ using std::list; class CBuildingManager { friend class CBuilding; + public: CBuildingManager(); ~CBuildingManager(); CBuilding* Create(CElement* pParent); CBuilding* CreateFromXML(CElement* pParent, CXMLNode& Node, CEvents* pEvents); - void DeleteAll(); - - unsigned int Count() { return static_cast(m_List.size()); }; - bool Exists(CBuilding* pObject) const; + void DeleteAll(); using CBuildingListType = CFastList; - CBuildingListType::const_iterator IterBegin() const { return m_List.begin(); }; - CBuildingListType::const_iterator IterEnd() const { return m_List.end(); }; + CBuildingListType::const_iterator IterBegin() const noexcept { return m_List.begin(); } + CBuildingListType::const_iterator IterEnd() const noexcept { return m_List.end(); } static bool IsValidModel(unsigned long ulObjectModel); static bool IsValidPosition(const CVector& pos) noexcept; private: - void AddToList(CBuilding* pObject) { m_List.push_back(pObject); }; - void RemoveFromList(CBuilding* pObject); + void AddToList(CBuilding* pBuilding) { m_List.push_back(pBuilding); }; + void RemoveFromList(CBuilding* pBuilding); CBuildingListType m_List; }; diff --git a/Server/mods/deathmatch/logic/CGame.h b/Server/mods/deathmatch/logic/CGame.h index d807ae9484..2f4441ddc6 100644 --- a/Server/mods/deathmatch/logic/CGame.h +++ b/Server/mods/deathmatch/logic/CGame.h @@ -221,7 +221,7 @@ class CGame CMapManager* GetMapManager() { return m_pMapManager; } CPlayerManager* GetPlayerManager() { return m_pPlayerManager; } CObjectManager* GetObjectManager() { return m_pObjectManager; } - CBuildingManager* GetBuildingManager() const { return m_pBuildingManager; } + CBuildingManager* GetBuildingManager() const noexcept { return m_pBuildingManager; } CVehicleManager* GetVehicleManager() { return m_pVehicleManager; } CTeamManager* GetTeamManager() { return m_pTeamManager; } CUnoccupiedVehicleSync* GetUnoccupiedVehicleSync() { return m_pUnoccupiedVehicleSync; } From 13e726c3f3f88b6bf8e0f9141c32960cb4655e6f Mon Sep 17 00:00:00 2001 From: Uladzislau Nikalayevich Date: Sat, 28 Dec 2024 22:14:57 +0300 Subject: [PATCH 09/16] Apply some suggestions --- .../deathmatch/logic/rpc/CElementRPCs.cpp | 12 ++++----- Server/mods/deathmatch/logic/CBuilding.cpp | 26 +++++++++---------- Server/mods/deathmatch/logic/CBuilding.h | 26 +++++++++---------- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp b/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp index 01994238ee..a0447c5994 100644 --- a/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp +++ b/Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp @@ -502,16 +502,16 @@ void CElementRPCs::SetElementModel(CClientEntity* pSource, NetBitStreamInterface } case CCLIENTBUILDING: { - CClientBuilding* pBuilding = static_cast(pSource); - const unsigned short usCurrentModel = pBuilding->GetModel(); + CClientBuilding* building = static_cast(pSource); + const auto currentModel = building->GetModel(); - if (usCurrentModel != usModel) + if (currentModel != usModel) { - pBuilding->SetModel(usModel); + building->SetModel(usModel); CLuaArguments Arguments; - Arguments.PushNumber(usCurrentModel); + Arguments.PushNumber(currentModel); Arguments.PushNumber(usModel); - pBuilding->CallEvent("onClientElementModelChange", Arguments, true); + building->CallEvent("onClientElementModelChange", Arguments, true); } break; diff --git a/Server/mods/deathmatch/logic/CBuilding.cpp b/Server/mods/deathmatch/logic/CBuilding.cpp index f737d33f3a..3f1d4ba861 100644 --- a/Server/mods/deathmatch/logic/CBuilding.cpp +++ b/Server/mods/deathmatch/logic/CBuilding.cpp @@ -16,17 +16,19 @@ extern CGame* g_pGame; -CBuilding::CBuilding(CElement* pParent, CBuildingManager* pBuildingManager) : CElement(pParent), m_pLowLodBuilding(nullptr) +CBuilding::CBuilding(CElement* pParent, CBuildingManager* pBuildingManager) : CElement(pParent) { // Init m_iType = CElement::BUILDING; SetTypeName("buidling"); m_pBuildingManager = pBuildingManager; - m_usModel = 0xFFFF; - m_ucAlpha = 255; + m_model = 0xFFFF; + m_alpha = 255; m_bDoubleSided = false; m_bCollisionsEnabled = true; + m_pLowLodBuilding = nullptr; + m_pHighLodBuilding = nullptr; // Add us to the manager's list pBuildingManager->AddToList(this); @@ -39,8 +41,8 @@ CBuilding::CBuilding(const CBuilding& Copy) : CElement(Copy.m_pParent), m_pLowLo SetTypeName("buidling"); m_pBuildingManager = Copy.m_pBuildingManager; - m_usModel = Copy.m_usModel; - m_ucAlpha = Copy.m_ucAlpha; + m_model = Copy.m_model; + m_alpha = Copy.m_alpha; m_bDoubleSided = Copy.m_bDoubleSided; m_vecPosition = Copy.m_vecPosition; m_vecRotation = Copy.m_vecRotation; @@ -70,8 +72,8 @@ void CBuilding::Unlink() // Remove LowLod refs in others SetLowLodBuilding(nullptr); - if (m_HighLodBuilding) - m_HighLodBuilding->SetLowLodBuilding(nullptr); + if (m_pHighLodBuilding) + m_pHighLodBuilding->SetLowLodBuilding(nullptr); } bool CBuilding::ReadSpecialData(const int iLine) @@ -109,16 +111,14 @@ bool CBuilding::ReadSpecialData(const int iLine) if (GetCustomDataInt("model", iTemp, true)) { // Valid id? - if (CBuildingManager::IsValidModel(iTemp)) - { - // Set the building id - m_usModel = static_cast(iTemp); - } - else + if (!CBuildingManager::IsValidModel(iTemp)) { CLogger::ErrorPrintf("Bad 'model' (%d) id specified in (line %d)\n", iTemp, iLine); return false; } + + // Set the building id + m_model = static_cast(iTemp); } else { diff --git a/Server/mods/deathmatch/logic/CBuilding.h b/Server/mods/deathmatch/logic/CBuilding.h index 7c18026d18..8122e5ad6a 100644 --- a/Server/mods/deathmatch/logic/CBuilding.h +++ b/Server/mods/deathmatch/logic/CBuilding.h @@ -43,20 +43,20 @@ class CBuilding final : public CElement void GetMatrix(CMatrix& matrix) override; void SetMatrix(const CMatrix& matrix) override; - unsigned char GetAlpha() { return m_ucAlpha; } - void SetAlpha(unsigned char ucAlpha) { m_ucAlpha = ucAlpha; } + std::uint8_t GetAlpha() const noexcept { return m_alpha; } + void SetAlpha(std::uint8_t ucAlpha) noexcept { m_alpha = ucAlpha; } - unsigned short GetModel() const { return m_usModel; } - void SetModel(unsigned short usModel) { m_usModel = usModel; } + std::uint16_t GetModel() const noexcept { return m_model; } + void SetModel(std::uint16_t model) noexcept { m_model = model; } - bool GetCollisionEnabled() { return m_bCollisionsEnabled; } - void SetCollisionEnabled(bool bCollisionEnabled) { m_bCollisionsEnabled = bCollisionEnabled; } + bool GetCollisionEnabled() const noexcept { return m_bCollisionsEnabled; } + void SetCollisionEnabled(bool bCollisionEnabled) noexcept { m_bCollisionsEnabled = bCollisionEnabled; } - bool SetLowLodBuilding(CBuilding* pLowLodBuilding); - CBuilding* GetLowLodElement() const { return m_pLowLodBuilding; }; + bool SetLowLodBuilding(CBuilding* pLowLodBuilding) noexcept; + CBuilding* GetLowLodElement() const noexcept { return m_pLowLodBuilding; } - CBuilding* GetHighLodBuilding() const { return m_HighLodBuilding; }; - void SetHighLodObject(CBuilding* pHighLodObject) { m_HighLodBuilding = pHighLodObject; }; + CBuilding* GetHighLodBuilding() const { return m_pHighLodBuilding; } + void SetHighLodObject(CBuilding* pHighLodObject) { m_pHighLodBuilding = pHighLodObject; } protected: bool ReadSpecialData(const int iLine) override; @@ -64,12 +64,12 @@ class CBuilding final : public CElement private: CBuildingManager* m_pBuildingManager; CVector m_vecRotation; - unsigned char m_ucAlpha; - unsigned short m_usModel; + std::uint8_t m_alpha; + std::uint16_t m_model; protected: bool m_bCollisionsEnabled; CBuilding* m_pLowLodBuilding; - CBuilding* m_HighLodBuilding; + CBuilding* m_pHighLodBuilding; }; From e301a4481c7a242c3196ae700a598ff211b52ecb Mon Sep 17 00:00:00 2001 From: Uladzislau Nikalayevich Date: Sat, 28 Dec 2024 22:23:54 +0300 Subject: [PATCH 10/16] Fix compile --- Server/mods/deathmatch/logic/CBuilding.cpp | 2 +- Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Server/mods/deathmatch/logic/CBuilding.cpp b/Server/mods/deathmatch/logic/CBuilding.cpp index 3f1d4ba861..51ed9607d1 100644 --- a/Server/mods/deathmatch/logic/CBuilding.cpp +++ b/Server/mods/deathmatch/logic/CBuilding.cpp @@ -185,7 +185,7 @@ void CBuilding::SetRotation(const CVector& vecRotation) m_vecRotation = vecRotation; } -bool CBuilding::SetLowLodBuilding(CBuilding* pNewLowLodBuilding) +bool CBuilding::SetLowLodBuilding(CBuilding* pNewLowLodBuilding) noexcept { // Set or clear? if (!pNewLowLodBuilding) diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index c79bcc829c..9c3a8081e4 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -839,7 +839,7 @@ bool CStaticFunctionDefinitions::SetLowLodElement(CElement* pElement, CElement* CBuilding* pLowLodObject = nullptr; if (pLowLodElement && pLowLodElement->GetType() == CElement::BUILDING) pLowLodObject = static_cast(pLowLodElement); - if (!pBuilding->SetLowLodObject(pLowLodObject)) + if (!pBuilding->SetLowLodBuilding(pLowLodObject)) return false; break; } @@ -894,7 +894,7 @@ bool CStaticFunctionDefinitions::IsElementLowLod(CElement* pElement, bool& bOutI } case CElement::BUILDING: { - bOutIsLowLod = static_cast(pElement)->GetHighLodObject() ? true : false; + bOutIsLowLod = static_cast(pElement)->GetHighLodBuilding() ? true : false; break; } default: From 19068551e7bb0d4fab5cd9ff34b8442833a47f08 Mon Sep 17 00:00:00 2001 From: Uladzislau Nikalayevich Date: Mon, 6 Jan 2025 13:02:21 +0300 Subject: [PATCH 11/16] Fix compiler? --- Server/mods/deathmatch/logic/CBuildingManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/mods/deathmatch/logic/CBuildingManager.h b/Server/mods/deathmatch/logic/CBuildingManager.h index b546c0fce3..845a185778 100644 --- a/Server/mods/deathmatch/logic/CBuildingManager.h +++ b/Server/mods/deathmatch/logic/CBuildingManager.h @@ -15,6 +15,7 @@ #include using std::list; +using CBuildingListType = CFastList; class CBuildingManager { @@ -28,7 +29,6 @@ class CBuildingManager CBuilding* CreateFromXML(CElement* pParent, CXMLNode& Node, CEvents* pEvents); void DeleteAll(); - using CBuildingListType = CFastList; CBuildingListType::const_iterator IterBegin() const noexcept { return m_List.begin(); } CBuildingListType::const_iterator IterEnd() const noexcept { return m_List.end(); } From a6f1ceeb6efebeed3c5bd17a5546162728610c75 Mon Sep 17 00:00:00 2001 From: Uladzislau Nikalayevich Date: Mon, 6 Jan 2025 13:26:23 +0300 Subject: [PATCH 12/16] bad design --- Server/mods/deathmatch/logic/CBuilding.cpp | 1 + Server/mods/deathmatch/logic/CBuilding.h | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Server/mods/deathmatch/logic/CBuilding.cpp b/Server/mods/deathmatch/logic/CBuilding.cpp index 51ed9607d1..855cabddc1 100644 --- a/Server/mods/deathmatch/logic/CBuilding.cpp +++ b/Server/mods/deathmatch/logic/CBuilding.cpp @@ -11,6 +11,7 @@ #include "StdInc.h" #include "CBuilding.h" +#include "CBuildingManager.h" #include "CLogger.h" #include "Utils.h" diff --git a/Server/mods/deathmatch/logic/CBuilding.h b/Server/mods/deathmatch/logic/CBuilding.h index 8122e5ad6a..5c4fb219fe 100644 --- a/Server/mods/deathmatch/logic/CBuilding.h +++ b/Server/mods/deathmatch/logic/CBuilding.h @@ -12,12 +12,13 @@ #include "CElement.h" #include "CEvents.h" -#include "CBuildingManager.h" #include "CEasingCurve.h" #include "TInterpolation.h" #include "CPositionRotationAnimation.h" +class CBuildingManager; + #define SERVERSIDE_BUILDING_MIN_CLIENT_VERSION "1.6.0-9.22824" class CBuilding final : public CElement From 9fdb186e739724e980990417c80d6d156d281ce4 Mon Sep 17 00:00:00 2001 From: Uladzislau Nikalayevich Date: Mon, 6 Jan 2025 16:58:52 +0300 Subject: [PATCH 13/16] Use logic_error --- Server/mods/deathmatch/logic/CBuilding.cpp | 1 + Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Server/mods/deathmatch/logic/CBuilding.cpp b/Server/mods/deathmatch/logic/CBuilding.cpp index 855cabddc1..1e2b074206 100644 --- a/Server/mods/deathmatch/logic/CBuilding.cpp +++ b/Server/mods/deathmatch/logic/CBuilding.cpp @@ -48,6 +48,7 @@ CBuilding::CBuilding(const CBuilding& Copy) : CElement(Copy.m_pParent), m_pLowLo m_vecPosition = Copy.m_vecPosition; m_vecRotation = Copy.m_vecRotation; m_bCollisionsEnabled = Copy.m_bCollisionsEnabled; + m_pHighLodBuilding = nullptr; // Add us to the manager's list m_pBuildingManager->AddToList(this); diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp index 8eeb7caac7..a9f907e41d 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp @@ -43,12 +43,12 @@ CBuilding* CLuaBuildingDefs::CreateBuilding(lua_State* const luaVM, std::uint16_ // Get the resource we belong to CResource* pResource = pLuaMain->GetResource(); if (!pResource) - throw std::exception("Cannot be done in current environment"); + throw std::logic_error("Cannot be done in current environment"); const CMtaVersion& minClientVersion = pResource->GetMinClientFromMetaXml(); if (minClientVersion < CMtaVersion(SERVERSIDE_BUILDING_MIN_CLIENT_VERSION)) - throw std::exception("Expected client min_mta_version in meta.xml hinger or equal than " SERVERSIDE_BUILDING_MIN_CLIENT_VERSION); + throw std::logic_error("Expected client min_mta_version in meta.xml hinger or equal than " SERVERSIDE_BUILDING_MIN_CLIENT_VERSION); if (!CBuildingManager::IsValidModel(modelId)) throw std::invalid_argument("Invalid building model id"); From 326bfa574ccc2cac65bb25ccc29f9cc6a9e8eee7 Mon Sep 17 00:00:00 2001 From: Uladzislau Nikalayevich Date: Wed, 8 Jan 2025 16:26:07 +0300 Subject: [PATCH 14/16] fix mac --- Server/mods/deathmatch/logic/CResourceMapItem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/mods/deathmatch/logic/CResourceMapItem.cpp b/Server/mods/deathmatch/logic/CResourceMapItem.cpp index c43b5dc9ed..92523d2a2a 100644 --- a/Server/mods/deathmatch/logic/CResourceMapItem.cpp +++ b/Server/mods/deathmatch/logic/CResourceMapItem.cpp @@ -196,7 +196,7 @@ void CResourceMapItem::HandleNode(CXMLNode& Node, CElement* pParent) if (minClientVersion < CMtaVersion(SERVERSIDE_BUILDING_MIN_CLIENT_VERSION)) { - CLogger::LogPrintf("Resource %s should have client min_mta_version higher or equal than %s\n", m_resource->GetName(), + CLogger::LogPrintf("Resource %s should have client min_mta_version higher or equal than %s\n", m_resource->GetName().c_str(), SERVERSIDE_BUILDING_MIN_CLIENT_VERSION); break; } From 49161678b475e0a74013cef7aa037c103035daaf Mon Sep 17 00:00:00 2001 From: Uladzislau Nikalayevich Date: Sun, 2 Feb 2025 18:56:21 +0300 Subject: [PATCH 15/16] Buildings don't have alpha --- Server/mods/deathmatch/logic/CBuilding.cpp | 2 -- Server/mods/deathmatch/logic/CBuilding.h | 4 ---- 2 files changed, 6 deletions(-) diff --git a/Server/mods/deathmatch/logic/CBuilding.cpp b/Server/mods/deathmatch/logic/CBuilding.cpp index 1e2b074206..72afed4f39 100644 --- a/Server/mods/deathmatch/logic/CBuilding.cpp +++ b/Server/mods/deathmatch/logic/CBuilding.cpp @@ -25,7 +25,6 @@ CBuilding::CBuilding(CElement* pParent, CBuildingManager* pBuildingManager) : CE m_pBuildingManager = pBuildingManager; m_model = 0xFFFF; - m_alpha = 255; m_bDoubleSided = false; m_bCollisionsEnabled = true; m_pLowLodBuilding = nullptr; @@ -43,7 +42,6 @@ CBuilding::CBuilding(const CBuilding& Copy) : CElement(Copy.m_pParent), m_pLowLo m_pBuildingManager = Copy.m_pBuildingManager; m_model = Copy.m_model; - m_alpha = Copy.m_alpha; m_bDoubleSided = Copy.m_bDoubleSided; m_vecPosition = Copy.m_vecPosition; m_vecRotation = Copy.m_vecRotation; diff --git a/Server/mods/deathmatch/logic/CBuilding.h b/Server/mods/deathmatch/logic/CBuilding.h index 5c4fb219fe..5ffeb1af12 100644 --- a/Server/mods/deathmatch/logic/CBuilding.h +++ b/Server/mods/deathmatch/logic/CBuilding.h @@ -44,9 +44,6 @@ class CBuilding final : public CElement void GetMatrix(CMatrix& matrix) override; void SetMatrix(const CMatrix& matrix) override; - std::uint8_t GetAlpha() const noexcept { return m_alpha; } - void SetAlpha(std::uint8_t ucAlpha) noexcept { m_alpha = ucAlpha; } - std::uint16_t GetModel() const noexcept { return m_model; } void SetModel(std::uint16_t model) noexcept { m_model = model; } @@ -65,7 +62,6 @@ class CBuilding final : public CElement private: CBuildingManager* m_pBuildingManager; CVector m_vecRotation; - std::uint8_t m_alpha; std::uint16_t m_model; protected: From fbaff85d8126bed30278dd2038cad613157aef31 Mon Sep 17 00:00:00 2001 From: Uladzislau Nikalayevich Date: Sun, 2 Feb 2025 19:07:39 +0300 Subject: [PATCH 16/16] Fix possible crash --- Client/mods/deathmatch/logic/CClientBuildingManager.h | 6 +++++- Client/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp | 2 -- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientBuildingManager.h b/Client/mods/deathmatch/logic/CClientBuildingManager.h index d44cc7d70f..11cc759e8d 100644 --- a/Client/mods/deathmatch/logic/CClientBuildingManager.h +++ b/Client/mods/deathmatch/logic/CClientBuildingManager.h @@ -40,7 +40,11 @@ class CClientBuildingManager private: bool DoPoolResize(size_t newCapacity); - void AddToList(CClientBuilding* pBuilding) { m_List.push_back(pBuilding); } + void AddToList(CClientBuilding* pBuilding) + { + ResizePoolIfNeeds(); + m_List.push_back(pBuilding); + } void RemoveFromList(CClientBuilding* pBuilding); std::list m_List; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp index a622b3c54d..c374e169e6 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp @@ -53,8 +53,6 @@ CClientBuilding* CLuaBuildingDefs::CreateBuilding(lua_State* const luaVM, std::u else rot.emplace(CVector(0, 0, 0)); - m_pBuildingManager->ResizePoolIfNeeds(); - CClientBuilding* pBuilding = new CClientBuilding(m_pManager, INVALID_ELEMENT_ID, modelId, pos, rot.value() , interior.value_or(0)); CClientEntity* pRoot = pResource->GetResourceDynamicEntity();