From d477a6e8552132dc529b5319c381bb03264eb785 Mon Sep 17 00:00:00 2001 From: Nikita Obrekht Date: Sat, 18 Jan 2020 18:39:25 +0200 Subject: [PATCH 1/2] Make col shapes cloneable --- Server/mods/deathmatch/logic/CColCircle.cpp | 6 ++++++ Server/mods/deathmatch/logic/CColCircle.h | 1 + Server/mods/deathmatch/logic/CColCuboid.cpp | 6 ++++++ Server/mods/deathmatch/logic/CColCuboid.h | 1 + Server/mods/deathmatch/logic/CColPolygon.cpp | 7 +++++++ Server/mods/deathmatch/logic/CColPolygon.h | 1 + Server/mods/deathmatch/logic/CColRectangle.cpp | 6 ++++++ Server/mods/deathmatch/logic/CColRectangle.h | 1 + Server/mods/deathmatch/logic/CColShape.h | 2 +- Server/mods/deathmatch/logic/CColSphere.cpp | 6 ++++++ Server/mods/deathmatch/logic/CColSphere.h | 1 + Server/mods/deathmatch/logic/CColTube.cpp | 6 ++++++ Server/mods/deathmatch/logic/CColTube.h | 1 + Server/mods/deathmatch/logic/CElement.cpp | 1 + 14 files changed, 45 insertions(+), 1 deletion(-) diff --git a/Server/mods/deathmatch/logic/CColCircle.cpp b/Server/mods/deathmatch/logic/CColCircle.cpp index 0e5fce25593..101d696fdb8 100644 --- a/Server/mods/deathmatch/logic/CColCircle.cpp +++ b/Server/mods/deathmatch/logic/CColCircle.cpp @@ -23,6 +23,12 @@ CColCircle::CColCircle(CColManager* pManager, CElement* pParent, const CVector2D UpdateSpatialData(); } +CElement* CColCircle::Clone(bool* bAddEntity, CResource* pResource) +{ + CColCircle* pColCircle = new CColCircle(m_pManager, GetParentEntity(), m_vecPosition, m_fRadius); + return pColCircle; +} + bool CColCircle::DoHitDetection(const CVector& vecNowPosition) { // Do a simple distance check between now position and our position diff --git a/Server/mods/deathmatch/logic/CColCircle.h b/Server/mods/deathmatch/logic/CColCircle.h index 28eaf55069e..2f351d9403c 100644 --- a/Server/mods/deathmatch/logic/CColCircle.h +++ b/Server/mods/deathmatch/logic/CColCircle.h @@ -17,6 +17,7 @@ class CColCircle : public CColShape { public: CColCircle(CColManager* pManager, CElement* pParent, const CVector2D& vecPosition, float fRadius, bool bIsPartnered = false); + CElement* Clone(bool* bAddEntity, CResource* pResource) override; virtual CSphere GetWorldBoundingSphere(); diff --git a/Server/mods/deathmatch/logic/CColCuboid.cpp b/Server/mods/deathmatch/logic/CColCuboid.cpp index c299bf11b73..8f1522908ff 100644 --- a/Server/mods/deathmatch/logic/CColCuboid.cpp +++ b/Server/mods/deathmatch/logic/CColCuboid.cpp @@ -19,6 +19,12 @@ CColCuboid::CColCuboid(CColManager* pManager, CElement* pParent, const CVector& UpdateSpatialData(); } +CElement* CColCuboid::Clone(bool* bAddEntity, CResource* pResource) +{ + CColCuboid* pColCuboid = new CColCuboid(m_pManager, GetParentEntity(), m_vecPosition, m_vecSize); + return pColCuboid; +} + bool CColCuboid::DoHitDetection(const CVector& vecNowPosition) { // FIXME: What about radius? diff --git a/Server/mods/deathmatch/logic/CColCuboid.h b/Server/mods/deathmatch/logic/CColCuboid.h index a4c235326f8..5061da5cf93 100644 --- a/Server/mods/deathmatch/logic/CColCuboid.h +++ b/Server/mods/deathmatch/logic/CColCuboid.h @@ -17,6 +17,7 @@ class CColCuboid : public CColShape { public: CColCuboid(CColManager* pManager, CElement* pParent, const CVector& vecPosition, const CVector& vecSize); + CElement* Clone(bool* bAddEntity, CResource* pResource) override; virtual CSphere GetWorldBoundingSphere(); diff --git a/Server/mods/deathmatch/logic/CColPolygon.cpp b/Server/mods/deathmatch/logic/CColPolygon.cpp index 80fb4754fd9..279bdadf859 100644 --- a/Server/mods/deathmatch/logic/CColPolygon.cpp +++ b/Server/mods/deathmatch/logic/CColPolygon.cpp @@ -20,6 +20,13 @@ CColPolygon::CColPolygon(CColManager* pManager, CElement* pParent, const CVector m_fRadius = 0.0f; } +CElement* CColPolygon::Clone(bool* bAddEntity, CResource* pResource) +{ + CColPolygon* pColPolygon = new CColPolygon(m_pManager, GetParentEntity(), m_vecPosition); + pColPolygon->m_Points = m_Points; + return pColPolygon; +} + bool CColPolygon::DoHitDetection(const CVector& vecNowPosition) { if (!IsInBounds(vecNowPosition)) diff --git a/Server/mods/deathmatch/logic/CColPolygon.h b/Server/mods/deathmatch/logic/CColPolygon.h index fe97ea79504..a58e263aed6 100644 --- a/Server/mods/deathmatch/logic/CColPolygon.h +++ b/Server/mods/deathmatch/logic/CColPolygon.h @@ -19,6 +19,7 @@ class CColPolygon : public CColShape { public: CColPolygon(CColManager* pManager, CElement* pParent, const CVector& vecPosition); + CElement* Clone(bool* bAddEntity, CResource* pResource) override; virtual CSphere GetWorldBoundingSphere(); diff --git a/Server/mods/deathmatch/logic/CColRectangle.cpp b/Server/mods/deathmatch/logic/CColRectangle.cpp index ad36b40cbc7..69ed2bdd645 100644 --- a/Server/mods/deathmatch/logic/CColRectangle.cpp +++ b/Server/mods/deathmatch/logic/CColRectangle.cpp @@ -21,6 +21,12 @@ CColRectangle::CColRectangle(CColManager* pManager, CElement* pParent, const CVe UpdateSpatialData(); } +CElement* CColRectangle::Clone(bool* bAddEntity, CResource* pResource) +{ + CColRectangle* pColRectangle = new CColRectangle(m_pManager, GetParentEntity(), m_vecPosition, m_vecSize); + return pColRectangle; +} + bool CColRectangle::DoHitDetection(const CVector& vecNowPosition) { // FIXME: What about radius? diff --git a/Server/mods/deathmatch/logic/CColRectangle.h b/Server/mods/deathmatch/logic/CColRectangle.h index 968252c5fe4..89df1b55461 100644 --- a/Server/mods/deathmatch/logic/CColRectangle.h +++ b/Server/mods/deathmatch/logic/CColRectangle.h @@ -18,6 +18,7 @@ class CColRectangle : public CColShape { public: CColRectangle(CColManager* pManager, CElement* pParent, const CVector2D& vecPosition, const CVector2D& vecSize); + CElement* Clone(bool* bAddEntity, CResource* pResource) override; virtual CSphere GetWorldBoundingSphere(); diff --git a/Server/mods/deathmatch/logic/CColShape.h b/Server/mods/deathmatch/logic/CColShape.h index de75405b7af..926fd760356 100644 --- a/Server/mods/deathmatch/logic/CColShape.h +++ b/Server/mods/deathmatch/logic/CColShape.h @@ -61,10 +61,10 @@ class CColShape : public CElement protected: CVector m_vecPosition; + class CColManager* m_pManager; private: bool m_bIsEnabled; - class CColManager* m_pManager; class CColCallback* m_pCallback; bool m_bAutoCallEvent; diff --git a/Server/mods/deathmatch/logic/CColSphere.cpp b/Server/mods/deathmatch/logic/CColSphere.cpp index ed47b47f4ba..3fc4c43abe1 100644 --- a/Server/mods/deathmatch/logic/CColSphere.cpp +++ b/Server/mods/deathmatch/logic/CColSphere.cpp @@ -21,6 +21,12 @@ CColSphere::CColSphere(CColManager* pManager, CElement* pParent, const CVector& UpdateSpatialData(); } +CElement* CColSphere::Clone(bool* bAddEntity, CResource* pResource) +{ + CColSphere* pColSphere = new CColSphere(m_pManager, GetParentEntity(), m_vecPosition, m_fRadius, IsPartnered()); + return pColSphere; +} + bool CColSphere::DoHitDetection(const CVector& vecNowPosition) { // Do a simple distance check between now position and our position diff --git a/Server/mods/deathmatch/logic/CColSphere.h b/Server/mods/deathmatch/logic/CColSphere.h index 8a39ab91ff4..b1850b06cd4 100644 --- a/Server/mods/deathmatch/logic/CColSphere.h +++ b/Server/mods/deathmatch/logic/CColSphere.h @@ -17,6 +17,7 @@ class CColSphere : public CColShape { public: CColSphere(CColManager* pManager, CElement* pParent, const CVector& vecPosition, float fRadius, bool bIsPartnered = false); + CElement* Clone(bool* bAddEntity, CResource* pResource) override; virtual CSphere GetWorldBoundingSphere(); diff --git a/Server/mods/deathmatch/logic/CColTube.cpp b/Server/mods/deathmatch/logic/CColTube.cpp index e87b9226cd6..75346052421 100644 --- a/Server/mods/deathmatch/logic/CColTube.cpp +++ b/Server/mods/deathmatch/logic/CColTube.cpp @@ -19,6 +19,12 @@ CColTube::CColTube(CColManager* pManager, CElement* pParent, const CVector& vecP UpdateSpatialData(); } +CElement* CColTube::Clone(bool* bAddEntity, CResource* pResource) +{ + CColTube* pColTube = new CColTube(m_pManager, GetParentEntity(), m_vecPosition, m_fRadius, m_fHeight); + return pColTube; +} + bool CColTube::DoHitDetection(const CVector& vecNowPosition) { // FIXME: What about radius in height? diff --git a/Server/mods/deathmatch/logic/CColTube.h b/Server/mods/deathmatch/logic/CColTube.h index d6472d778ac..e30b5a96c66 100644 --- a/Server/mods/deathmatch/logic/CColTube.h +++ b/Server/mods/deathmatch/logic/CColTube.h @@ -17,6 +17,7 @@ class CColTube : public CColShape { public: CColTube(CColManager* pManager, CElement* pParent, const CVector& vecPosition, float fRadius, float fHeight); + CElement* Clone(bool* bAddEntity, CResource* pResource) override; virtual CSphere GetWorldBoundingSphere(); diff --git a/Server/mods/deathmatch/logic/CElement.cpp b/Server/mods/deathmatch/logic/CElement.cpp index 4dca6b0c4f1..f2e11b6d9e6 100644 --- a/Server/mods/deathmatch/logic/CElement.cpp +++ b/Server/mods/deathmatch/logic/CElement.cpp @@ -138,6 +138,7 @@ bool CElement::IsCloneable() case CElement::PICKUP: case CElement::RADAR_AREA: case CElement::PATH_NODE_UNUSED: + case CElement::COLSHAPE: return true; default: return false; From d2dbc79e808abcb798645a4588eef9ea8e461298 Mon Sep 17 00:00:00 2001 From: Nikita Obrekht Date: Sat, 18 Jan 2020 19:39:32 +0200 Subject: [PATCH 2/2] Fix col polygon cloning --- Server/mods/deathmatch/logic/CColPolygon.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Server/mods/deathmatch/logic/CColPolygon.cpp b/Server/mods/deathmatch/logic/CColPolygon.cpp index 279bdadf859..aaf8d3dca17 100644 --- a/Server/mods/deathmatch/logic/CColPolygon.cpp +++ b/Server/mods/deathmatch/logic/CColPolygon.cpp @@ -24,6 +24,8 @@ CElement* CColPolygon::Clone(bool* bAddEntity, CResource* pResource) { CColPolygon* pColPolygon = new CColPolygon(m_pManager, GetParentEntity(), m_vecPosition); pColPolygon->m_Points = m_Points; + pColPolygon->m_fRadius = m_fRadius; + pColPolygon->SizeChanged(); return pColPolygon; }