From ad8eb2f2e2ad6a30674af755a756241c997c4b19 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sat, 30 Jun 2018 20:38:23 +0200 Subject: [PATCH 01/50] test 1 --- .../mods/deathmatch/logic/lua/CLuaManager.cpp | 2 + .../logic/luadefs/CLuaPathFindDefs.cpp | 62 +++++++++++++++++++ .../logic/luadefs/CLuaPathFindDefs.h | 21 +++++++ 3 files changed, 85 insertions(+) create mode 100644 Client/mods/deathmatch/logic/luadefs/CLuaPathFindDefs.cpp create mode 100644 Client/mods/deathmatch/logic/luadefs/CLuaPathFindDefs.h diff --git a/Client/mods/deathmatch/logic/lua/CLuaManager.cpp b/Client/mods/deathmatch/logic/lua/CLuaManager.cpp index 54ac8e964c9..e9fb248e16d 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaManager.cpp +++ b/Client/mods/deathmatch/logic/lua/CLuaManager.cpp @@ -11,6 +11,7 @@ #include "StdInc.h" #include "../luadefs/CLuaFireDefs.h" +#include "../luadefs/CLuaPathFindDefs.h" using std::list; @@ -420,4 +421,5 @@ void CLuaManager::LoadCFunctions(void) CLuaWaterDefs::LoadFunctions(); CLuaWeaponDefs::LoadFunctions(); CLuaXMLDefs::LoadFunctions(); + CLuaPathFindDefs::LoadFunctions(); } diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaPathFindDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaPathFindDefs.cpp new file mode 100644 index 00000000000..01fb85c20fd --- /dev/null +++ b/Client/mods/deathmatch/logic/luadefs/CLuaPathFindDefs.cpp @@ -0,0 +1,62 @@ +/***************************************************************************** +* +* PROJECT: Multi Theft Auto +* LICENSE: See LICENSE in the top level directory +* FILE: Client/mods/deathmatch/logic/luadefs/CLuaFireDefs.cpp +* +* Multi Theft Auto is available from http://www.multitheftauto.com/ +* +*****************************************************************************/ +#include "StdInc.h" +#include "CLuaPathFindDefs.h" +#include "d:\mtasa-blue_cr95\Client\game_sa\CPathFindSA.h" + +void CLuaPathFindDefs::LoadFunctions(void) +{ + CLuaCFunctions::AddFunction("findClosestNode", CLuaPathFindDefs::FindNodeClosestToCoords); +} +void CLuaPathFindDefs::AddClass(lua_State* luaVM) +{ + lua_newclass(luaVM); + + //lua_classfunction(luaVM, "create", "createWater"); + + //lua_classvariable(luaVM, "level", "setWaterLevel", "getWaterLevel"); + + lua_registerclass(luaVM, "PathFind", "Element"); +} + +int CLuaPathFindDefs::FindNodeClosestToCoords(lua_State* luaVM) +{ + // bool findNodeClosestToCoords ( float x, float y, float z [, float size = 1.8 ] ) + + CVector vecPosition; + int iNodeNumber; + int iType; + float fDistance; + + CScriptArgReader argStream(luaVM); + argStream.ReadVector3D(vecPosition); + argStream.ReadNumber(iNodeNumber, 0); + argStream.ReadNumber(iType, 0); + argStream.ReadNumber(fDistance, 9999.0f); + + if (!argStream.HasErrors()) + { + CPathFind* asdf = g_pGame->GetPathFind(); + CNodeAddress* found; + auto as = asdf->FindNthNodeClosestToCoors(&vecPosition, iNodeNumber, iType, found, fDistance); + if ( true ) + { + lua_pushboolean(luaVM, true); + return 1; + } + lua_pushboolean(luaVM, true); + return 1; + } + else + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + + lua_pushboolean(luaVM, false); + return 1; +} diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaPathFindDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaPathFindDefs.h new file mode 100644 index 00000000000..8009af85b53 --- /dev/null +++ b/Client/mods/deathmatch/logic/luadefs/CLuaPathFindDefs.h @@ -0,0 +1,21 @@ +/***************************************************************************** +* +* PROJECT: Multi Theft Auto +* LICENSE: See LICENSE in the top level directory +* FILE: Client/mods/deathmatch/logic/luadefs/CLuaFireDefs.h +* +* Multi Theft Auto is available from http://www.multitheftauto.com/ +* +*****************************************************************************/ +#pragma once + +#include "CLuaDefs.h" + +class CLuaPathFindDefs : public CLuaDefs +{ +public: + static void LoadFunctions(void); + static void AddClass(lua_State* luaVM); + + LUA_DECLARE(FindNodeClosestToCoords); +}; From 86baf91d7de7bde60ab802de6fc90babda1b4b28 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Wed, 4 Jul 2018 17:56:20 +0200 Subject: [PATCH 02/50] removed pathfinding from master --- .../mods/deathmatch/logic/lua/CLuaManager.cpp | 2 - .../logic/luadefs/CLuaPathFindDefs.cpp | 62 ------------------- .../logic/luadefs/CLuaPathFindDefs.h | 21 ------- 3 files changed, 85 deletions(-) delete mode 100644 Client/mods/deathmatch/logic/luadefs/CLuaPathFindDefs.cpp delete mode 100644 Client/mods/deathmatch/logic/luadefs/CLuaPathFindDefs.h diff --git a/Client/mods/deathmatch/logic/lua/CLuaManager.cpp b/Client/mods/deathmatch/logic/lua/CLuaManager.cpp index e9fb248e16d..54ac8e964c9 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaManager.cpp +++ b/Client/mods/deathmatch/logic/lua/CLuaManager.cpp @@ -11,7 +11,6 @@ #include "StdInc.h" #include "../luadefs/CLuaFireDefs.h" -#include "../luadefs/CLuaPathFindDefs.h" using std::list; @@ -421,5 +420,4 @@ void CLuaManager::LoadCFunctions(void) CLuaWaterDefs::LoadFunctions(); CLuaWeaponDefs::LoadFunctions(); CLuaXMLDefs::LoadFunctions(); - CLuaPathFindDefs::LoadFunctions(); } diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaPathFindDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaPathFindDefs.cpp deleted file mode 100644 index 01fb85c20fd..00000000000 --- a/Client/mods/deathmatch/logic/luadefs/CLuaPathFindDefs.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/***************************************************************************** -* -* PROJECT: Multi Theft Auto -* LICENSE: See LICENSE in the top level directory -* FILE: Client/mods/deathmatch/logic/luadefs/CLuaFireDefs.cpp -* -* Multi Theft Auto is available from http://www.multitheftauto.com/ -* -*****************************************************************************/ -#include "StdInc.h" -#include "CLuaPathFindDefs.h" -#include "d:\mtasa-blue_cr95\Client\game_sa\CPathFindSA.h" - -void CLuaPathFindDefs::LoadFunctions(void) -{ - CLuaCFunctions::AddFunction("findClosestNode", CLuaPathFindDefs::FindNodeClosestToCoords); -} -void CLuaPathFindDefs::AddClass(lua_State* luaVM) -{ - lua_newclass(luaVM); - - //lua_classfunction(luaVM, "create", "createWater"); - - //lua_classvariable(luaVM, "level", "setWaterLevel", "getWaterLevel"); - - lua_registerclass(luaVM, "PathFind", "Element"); -} - -int CLuaPathFindDefs::FindNodeClosestToCoords(lua_State* luaVM) -{ - // bool findNodeClosestToCoords ( float x, float y, float z [, float size = 1.8 ] ) - - CVector vecPosition; - int iNodeNumber; - int iType; - float fDistance; - - CScriptArgReader argStream(luaVM); - argStream.ReadVector3D(vecPosition); - argStream.ReadNumber(iNodeNumber, 0); - argStream.ReadNumber(iType, 0); - argStream.ReadNumber(fDistance, 9999.0f); - - if (!argStream.HasErrors()) - { - CPathFind* asdf = g_pGame->GetPathFind(); - CNodeAddress* found; - auto as = asdf->FindNthNodeClosestToCoors(&vecPosition, iNodeNumber, iType, found, fDistance); - if ( true ) - { - lua_pushboolean(luaVM, true); - return 1; - } - lua_pushboolean(luaVM, true); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; -} diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaPathFindDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaPathFindDefs.h deleted file mode 100644 index 8009af85b53..00000000000 --- a/Client/mods/deathmatch/logic/luadefs/CLuaPathFindDefs.h +++ /dev/null @@ -1,21 +0,0 @@ -/***************************************************************************** -* -* PROJECT: Multi Theft Auto -* LICENSE: See LICENSE in the top level directory -* FILE: Client/mods/deathmatch/logic/luadefs/CLuaFireDefs.h -* -* Multi Theft Auto is available from http://www.multitheftauto.com/ -* -*****************************************************************************/ -#pragma once - -#include "CLuaDefs.h" - -class CLuaPathFindDefs : public CLuaDefs -{ -public: - static void LoadFunctions(void); - static void AddClass(lua_State* luaVM); - - LUA_DECLARE(FindNodeClosestToCoords); -}; From f29ae6d1512d101bc36ccb22e270409ffbeceba7 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sun, 23 Sep 2018 16:22:40 +0200 Subject: [PATCH 03/50] engineGetModelCollisionProperties and engineGetModelCollisionData --- Client/game_sa/CColModelSA.h | 23 +- .../logic/lua/CLuaFunctionParseHelpers.cpp | 6 + .../logic/lua/CLuaFunctionParseHelpers.h | 14 ++ .../logic/luadefs/CLuaEngineDefs.cpp | 208 ++++++++++++++++++ .../deathmatch/logic/luadefs/CLuaEngineDefs.h | 2 + 5 files changed, 248 insertions(+), 5 deletions(-) diff --git a/Client/game_sa/CColModelSA.h b/Client/game_sa/CColModelSA.h index e03232bef48..834e0570da8 100644 --- a/Client/game_sa/CColModelSA.h +++ b/Client/game_sa/CColModelSA.h @@ -27,14 +27,16 @@ typedef struct typedef struct { - CVector vecCenter; - float fRadius; + CVector vecCenter; + float fRadius; + EColSurface material; } CColSphereSA; typedef struct { - CVector min; - CVector max; + CVector min; + CVector max; + EColSurface material; } CColBoxSA; typedef struct @@ -58,6 +60,13 @@ typedef struct char name[0x18]; } ColModelFileHeader; +typedef struct +{ + signed __int16 x; + signed __int16 y; + signed __int16 z; +} CompressedVector; + typedef struct { WORD numColSpheres; @@ -68,9 +77,13 @@ typedef struct CColSphereSA* pColSpheres; CColBoxSA* pColBoxes; void* pSuspensionLines; - void* pUnknown; + CompressedVector* pVertices; CColTriangleSA* pColTriangles; CColTrianglePlaneSA* pColTrianglePlanes; + unsigned int m_nNumShadowTriangles; + unsigned int m_nNumShadowVertices; + CompressedVector* m_pShadowVertices; + CColTriangleSA* m_pShadowTriangles; } CColDataSA; class CColModelSAInterface diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp index b344555b27a..4e8464f417c 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp @@ -524,6 +524,12 @@ ADD_ENUM(WING_AIRTRAIL, "wing_airtrail") ADD_ENUM(VEH_GUN, "veh_gun") IMPLEMENT_ENUM_END("vehicle-dummy") +IMPLEMENT_ENUM_BEGIN(eCollisionShapes) +ADD_ENUM(COLLISION_BOX, "box") +ADD_ENUM(COLLISION_SPHERE, "sphere") +ADD_ENUM(COLLISION_TRIANGLE, "triangle") +IMPLEMENT_ENUM_END("collision-shape") + // // Get best guess at name of userdata type // diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h index 303dc00e0da..e0afbee6b2e 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h @@ -90,6 +90,16 @@ enum eJSONPrettyType }; DECLARE_ENUM(eJSONPrettyType); +enum eCollisionShapes +{ + COLLISION_BOX, + COLLISION_SPHERE, + COLLISION_TRIANGLE, + COLLISION_VERTEX, +}; +DECLARE_ENUM(eCollisionShapes); + + // class -> class type inline eCGUIType GetClassType(CGUIButton*) { @@ -379,6 +389,10 @@ inline SString GetClassTypeName(eVehicleDummies*) { return "vehicle-dummy"; } +inline SString GetClassTypeName(eCollisionShapes*) +{ + return "collision-shape"; +} // // CResource from userdata diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index d23582d8ff0..66d800dfa86 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -11,6 +11,9 @@ #include "StdInc.h" +#include "../Client/game_sa/CModelInfoSA.h" +CBaseModelInfoSAInterface** ppModelInfo = (CBaseModelInfoSAInterface**)ARRAY_ModelInfo; + void CLuaEngineDefs::LoadFunctions(void) { std::map functions{ @@ -34,6 +37,8 @@ void CLuaEngineDefs::LoadFunctions(void) {"engineGetModelIDFromName", EngineGetModelIDFromName}, {"engineGetModelTextureNames", EngineGetModelTextureNames}, {"engineGetVisibleTextureNames", EngineGetVisibleTextureNames}, + {"engineGetModelCollisionProperties", EngineGetModelCollisionProperties }, + {"engineGetModelCollisionData", EngineGetModelCollisionData}, // CLuaCFunctions::AddFunction ( "engineReplaceMatchingAtomics", EngineReplaceMatchingAtomics ); // CLuaCFunctions::AddFunction ( "engineReplaceWheelAtomics", EngineReplaceWheelAtomics ); @@ -913,3 +918,206 @@ int CLuaEngineDefs::EngineGetVisibleTextureNames(lua_State* luaVM) lua_pushboolean(luaVM, false); return 1; } + +int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) +{ + ushort usModel; + CScriptArgReader argStream(luaVM); + argStream.ReadNumber(usModel); + + if (!argStream.HasErrors()) + { + if (CClientObjectManager::IsValidModel(usModel)) + { + CBaseModelInfoSAInterface* pModelInfo = ppModelInfo[usModel]; + if (pModelInfo != nullptr) + { + CColModelSAInterface* pCol = pModelInfo->pColModel; + if (pCol) + { + lua_newtable(luaVM); + lua_pushstring(luaVM, "boundingBox"); + lua_newtable(luaVM); + lua_pushstring(luaVM, "vecMin"); + lua_newtable(luaVM); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pCol->boundingBox.vecMin.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pCol->boundingBox.vecMin.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pCol->boundingBox.vecMin.fZ); + lua_settable(luaVM, -3); + lua_settable(luaVM, -3); + + lua_pushstring(luaVM, "vecMax"); + lua_newtable(luaVM); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pCol->boundingBox.vecMax.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pCol->boundingBox.vecMax.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pCol->boundingBox.vecMax.fZ); + lua_settable(luaVM, -3); + lua_settable(luaVM, -3); + lua_pushstring(luaVM, "vecOffset"); + lua_newtable(luaVM); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pCol->boundingBox.vecOffset.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pCol->boundingBox.vecOffset.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pCol->boundingBox.vecOffset.fZ); + lua_settable(luaVM, -3); + lua_settable(luaVM, -3); + lua_pushstring(luaVM, "radius"); + lua_pushnumber(luaVM, pCol->boundingBox.fRadius); + lua_settable(luaVM, -3); + + CColDataSA* pColData = pCol->pColData; + lua_settable(luaVM, -3); + lua_pushstring(luaVM, "colBoxes"); + lua_pushnumber(luaVM, pColData->numColBoxes); + lua_settable(luaVM, -3); + lua_pushstring(luaVM, "colSpheres"); + lua_pushnumber(luaVM, pColData->numColSpheres); + lua_settable(luaVM, -3); + lua_pushstring(luaVM, "colTriangles"); + lua_pushnumber(luaVM, pColData->numColTriangles); + lua_settable(luaVM, -3); + lua_pushstring(luaVM, "colVertices"); + lua_pushnumber(luaVM, 0); + lua_settable(luaVM, -3); + + return 1; + } + } + } + } + if (argStream.HasErrors()) + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + + lua_pushboolean(luaVM, false); + return 1; +} + + +int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) +{ + ushort usModel; + eCollisionShapes eCollisionShape; + CScriptArgReader argStream(luaVM); + argStream.ReadNumber(usModel); + argStream.ReadEnumString(eCollisionShape); + if (!argStream.HasErrors()) + { + if (CClientObjectManager::IsValidModel(usModel)) + { + CBaseModelInfoSAInterface* pModelInfo = ppModelInfo[usModel]; + if (pModelInfo != nullptr) + { + CColModelSAInterface* pCol = pModelInfo->pColModel; + if (pCol) + { + CColDataSA* pColData = pCol->pColData; + lua_newtable(luaVM); + switch (eCollisionShape) + { + case COLLISION_BOX: + for (uint i = 0; pColData->numColBoxes > i; i++) + { + lua_pushnumber(luaVM, i + 1); + CColBoxSA pBox = pColData->pColBoxes[i]; + lua_newtable(luaVM); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pBox.min.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pBox.min.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pBox.min.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pBox.max.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pBox.max.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pBox.max.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 7); + lua_pushnumber(luaVM, pBox.material); + lua_settable(luaVM, -3); + lua_settable(luaVM, -3); + } + break; + case COLLISION_SPHERE: + for (uint i = 0; pColData->numColSpheres > i; i++) + { + lua_pushnumber(luaVM, i + 1); + CColSphereSA pSphere = pColData->pColSpheres[i]; + lua_newtable(luaVM); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pSphere.vecCenter.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pSphere.vecCenter.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pSphere.vecCenter.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pSphere.fRadius); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pSphere.material); + lua_settable(luaVM, -3); + lua_settable(luaVM, -3); + } + break; + case COLLISION_VERTEX: + for (uint i = 0; pColData->numColTriangles > i; i++) + { + lua_pushnumber(luaVM, i + 1); + CColTriangleSA pTriangle = pColData->pColTriangles[i]; + lua_newtable(luaVM); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pTriangle.v1); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pTriangle.v2); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pTriangle.v3); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pTriangle.material); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pTriangle.lighting.day); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pTriangle.lighting.night); + lua_settable(luaVM, -3); + lua_settable(luaVM, -3); + } + break; + } + return 1; + } + } + } + } + if (argStream.HasErrors()) + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + + lua_pushboolean(luaVM, false); + return 1; +} diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h index 4e99d482ee4..047f5839909 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h @@ -44,6 +44,8 @@ class CLuaEngineDefs : public CLuaDefs LUA_DECLARE(EngineGetModelIDFromName); LUA_DECLARE(EngineGetModelTextureNames); LUA_DECLARE(EngineGetVisibleTextureNames); + LUA_DECLARE(EngineGetModelCollisionProperties); + LUA_DECLARE(EngineGetModelCollisionData); private: static void AddEngineColClass(lua_State* luaVM); From af03ec536fd966c3e9a871370b6503a62d919146 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sun, 23 Sep 2018 22:42:39 +0200 Subject: [PATCH 04/50] set and get function almost done, beginnings of creating new shapes --- Client/game_sa/CColModelSA.h | 25 +- .../logic/lua/CLuaFunctionParseHelpers.cpp | 16 +- .../logic/lua/CLuaFunctionParseHelpers.h | 16 + .../logic/luadefs/CLuaEngineDefs.cpp | 292 +++++++++++++++++- .../deathmatch/logic/luadefs/CLuaEngineDefs.h | 2 + 5 files changed, 337 insertions(+), 14 deletions(-) diff --git a/Client/game_sa/CColModelSA.h b/Client/game_sa/CColModelSA.h index 834e0570da8..dbe18fa9a1c 100644 --- a/Client/game_sa/CColModelSA.h +++ b/Client/game_sa/CColModelSA.h @@ -29,22 +29,20 @@ typedef struct { CVector vecCenter; float fRadius; - EColSurface material; + uchar material; } CColSphereSA; typedef struct { CVector min; CVector max; - EColSurface material; + uchar material; } CColBoxSA; typedef struct { - unsigned short v1; - unsigned short v2; - unsigned short v3; - EColSurface material; + unsigned short vertex[3]; + uchar material; CColLighting lighting; } CColTriangleSA; @@ -65,6 +63,10 @@ typedef struct signed __int16 x; signed __int16 y; signed __int16 z; + CVector getVector() + { + return CVector(x * 0.0078125f, y * 0.0078125f, z * 0.0078125f); + } } CompressedVector; typedef struct @@ -84,6 +86,17 @@ typedef struct unsigned int m_nNumShadowVertices; CompressedVector* m_pShadowVertices; CColTriangleSA* m_pShadowTriangles; + std::map getAllVertices() + { + std::map vertices; + for (uint i = 0; numColTriangles > i; i++) + { + vertices[pColTriangles[i].vertex[0]] = pVertices[pColTriangles[i].vertex[0]]; + vertices[pColTriangles[i].vertex[1]] = pVertices[pColTriangles[i].vertex[1]]; + vertices[pColTriangles[i].vertex[2]] = pVertices[pColTriangles[i].vertex[2]]; + } + return vertices; + } } CColDataSA; class CColModelSAInterface diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp index 4e8464f417c..fa258f66115 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp @@ -525,11 +525,21 @@ ADD_ENUM(VEH_GUN, "veh_gun") IMPLEMENT_ENUM_END("vehicle-dummy") IMPLEMENT_ENUM_BEGIN(eCollisionShapes) -ADD_ENUM(COLLISION_BOX, "box") -ADD_ENUM(COLLISION_SPHERE, "sphere") -ADD_ENUM(COLLISION_TRIANGLE, "triangle") +ADD_ENUM(COLLISION_BOX, "boxes") +ADD_ENUM(COLLISION_SPHERE, "spheres") +ADD_ENUM(COLLISION_TRIANGLE, "triangles") +ADD_ENUM(COLLISION_VERTEX, "vertices") IMPLEMENT_ENUM_END("collision-shape") +IMPLEMENT_ENUM_BEGIN(eCollisionKey) +ADD_ENUM(COLLISION_KEY_SIZE, "size") +ADD_ENUM(COLLISION_KEY_MATERIAL, "material") +ADD_ENUM(COLLISION_KEY_POSITION, "position") +ADD_ENUM(COLLISION_KEY_RADIUS, "radius") +ADD_ENUM(COLLISION_KEY_LIGHTING, "lighting") +ADD_ENUM(COLLISION_KEY_VERTICES, "vertices") +IMPLEMENT_ENUM_END("collision-key") + // // Get best guess at name of userdata type // diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h index e0afbee6b2e..554ccf044cd 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h @@ -99,6 +99,18 @@ enum eCollisionShapes }; DECLARE_ENUM(eCollisionShapes); +enum eCollisionKey +{ + COLLISION_KEY_SIZE, + COLLISION_KEY_MATERIAL, + COLLISION_KEY_POSITION, + COLLISION_KEY_RADIUS, + COLLISION_KEY_LIGHTING, + COLLISION_KEY_VERTICES, + +}; +DECLARE_ENUM(eCollisionKey); + // class -> class type inline eCGUIType GetClassType(CGUIButton*) @@ -393,6 +405,10 @@ inline SString GetClassTypeName(eCollisionShapes*) { return "collision-shape"; } +inline SString GetClassTypeName(eCollisionKey*) +{ + return "collision-key"; +} // // CResource from userdata diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 66d800dfa86..83a057439b8 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -39,6 +39,8 @@ void CLuaEngineDefs::LoadFunctions(void) {"engineGetVisibleTextureNames", EngineGetVisibleTextureNames}, {"engineGetModelCollisionProperties", EngineGetModelCollisionProperties }, {"engineGetModelCollisionData", EngineGetModelCollisionData}, + {"engineSetModelCollisionData", EngineSetModelCollisionData}, + {"engineModelCollisionCreateShape", EngineModelCollisionCreateShape }, // CLuaCFunctions::AddFunction ( "engineReplaceMatchingAtomics", EngineReplaceMatchingAtomics ); // CLuaCFunctions::AddFunction ( "engineReplaceWheelAtomics", EngineReplaceWheelAtomics ); @@ -1006,7 +1008,6 @@ int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) return 1; } - int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { ushort usModel; @@ -1082,20 +1083,20 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) lua_settable(luaVM, -3); } break; - case COLLISION_VERTEX: + case COLLISION_TRIANGLE: for (uint i = 0; pColData->numColTriangles > i; i++) { lua_pushnumber(luaVM, i + 1); CColTriangleSA pTriangle = pColData->pColTriangles[i]; lua_newtable(luaVM); lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pTriangle.v1); + lua_pushnumber(luaVM, pTriangle.vertex[0]); lua_settable(luaVM, -3); lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pTriangle.v2); + lua_pushnumber(luaVM, pTriangle.vertex[1]); lua_settable(luaVM, -3); lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pTriangle.v3); + lua_pushnumber(luaVM, pTriangle.vertex[2]); lua_settable(luaVM, -3); lua_pushnumber(luaVM, 4); lua_pushnumber(luaVM, pTriangle.material); @@ -1109,6 +1110,287 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) lua_settable(luaVM, -3); } break; + case COLLISION_VERTEX: + std::map vecVertices = pColData->getAllVertices(); + lua_newtable(luaVM); + + std::map::iterator it; + for (it = vecVertices.begin(); it != vecVertices.end(); it++) + { + lua_pushnumber(luaVM, it->first); + CVector vec = it->second.getVector(); + lua_newtable(luaVM); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, vec.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, vec.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, vec.fZ); + lua_settable(luaVM, -3); + lua_settable(luaVM, -3); + } + break; + } + return 1; + } + } + } + } + if (argStream.HasErrors()) + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + + lua_pushboolean(luaVM, false); + return 1; +} + +int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) +{ + ushort usModel; + ushort usShapeId; + eCollisionShapes eCollisionShape; + eCollisionKey eCollisionKey; + CVector vec1, vec2; + uchar cSurface; + float fNumber; + uchar cDay,cNight; + ushort sVertex[3]; + float fPosition[3]; + CScriptArgReader argStream(luaVM); + argStream.ReadNumber(usModel); + argStream.ReadEnumString(eCollisionShape); + argStream.ReadNumber(usShapeId); + argStream.ReadEnumString(eCollisionKey); + if (!argStream.HasErrors()) + { + if (CClientObjectManager::IsValidModel(usModel)) + { + CBaseModelInfoSAInterface* pModelInfo = ppModelInfo[usModel]; + if (pModelInfo != nullptr) + { + CColModelSAInterface* pCol = pModelInfo->pColModel; + if (pCol) + { + CColDataSA* pColData = pCol->pColData; + switch (eCollisionShape) + { + case COLLISION_BOX: + if (usShapeId >= 0 && usShapeId < pColData->numColBoxes) + { + CColBoxSA* pBox = &pColData->pColBoxes[usShapeId]; + switch (eCollisionKey) + { + case COLLISION_KEY_MATERIAL: + argStream.ReadNumber(cSurface); + if (!argStream.HasErrors()) + { + if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) + { + pBox->material = cSurface; + lua_pushboolean(luaVM, true); + return 1; + } + } + case COLLISION_KEY_SIZE: + argStream.ReadVector3D(vec1); + argStream.ReadVector3D(vec2); + if (!argStream.HasErrors()) + { + pBox->min = vec1; + pBox->max = vec2; + lua_pushboolean(luaVM, true); + return 1; + } + + break; + } + } + break; + case COLLISION_SPHERE: + if (usShapeId >= 0 && usShapeId < pColData->numColBoxes) + { + CColSphereSA* pSphere = &pColData->pColSpheres[usShapeId]; + switch (eCollisionKey) + { + case COLLISION_KEY_POSITION: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) + { + pSphere->vecCenter = vec1; + lua_pushboolean(luaVM, true); + return 1; + } + case COLLISION_KEY_RADIUS: + argStream.ReadNumber(fNumber); + if (!argStream.HasErrors()) + { + pSphere->fRadius = fNumber; + lua_pushboolean(luaVM, true); + return 1; + } + + break; + case COLLISION_KEY_MATERIAL: + argStream.ReadNumber(cSurface); + if (!argStream.HasErrors()) + { + if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) + { + pSphere->material = cSurface; + lua_pushboolean(luaVM, true); + return 1; + } + } + } + } + break; + case COLLISION_TRIANGLE: + if (usShapeId >= 0 && usShapeId < pColData->numColTriangles) + { + CColTriangleSA* pTriangle = &pColData->pColTriangles[usShapeId]; + switch (eCollisionKey) + { + case COLLISION_KEY_MATERIAL: + argStream.ReadNumber(cSurface); + if (!argStream.HasErrors()) + { + if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) + { + pTriangle->material = cSurface; + lua_pushboolean(luaVM, true); + return 1; + } + } + case COLLISION_KEY_LIGHTING: + argStream.ReadNumber(cDay); + argStream.ReadNumber(cNight); + if (!argStream.HasErrors()) + { + if (cDay >= 0 && cDay <= 15 && cNight >= 0 && cNight <= 15) + { + pTriangle->lighting.day = cDay; + pTriangle->lighting.night = cNight; + lua_pushboolean(luaVM, true); + return 1; + } + } + + break; + case COLLISION_KEY_VERTICES: + argStream.ReadNumber(sVertex[0]); + argStream.ReadNumber(sVertex[1]); + if (argStream.NextIsNumber()) + { + argStream.ReadNumber(sVertex[2]); + if (!argStream.HasErrors()) + { + pTriangle->vertex[0] = sVertex[0]; + pTriangle->vertex[1] = sVertex[1]; + pTriangle->vertex[2] = sVertex[2]; + lua_pushboolean(luaVM, true); + return 1; + } + } + else + { + if (!argStream.HasErrors()) + { + pTriangle->vertex[sVertex[0]] = sVertex[1]; + lua_pushboolean(luaVM, true); + return 1; + } + } + } + } + break; + case COLLISION_VERTEX: + if (true) + { + CompressedVector* pVector = &pColData->pVertices[usShapeId]; + switch (eCollisionKey) + { + case COLLISION_KEY_POSITION: + argStream.ReadNumber(fPosition[0]); + argStream.ReadNumber(fPosition[1]); + argStream.ReadNumber(fPosition[2]); + if (!argStream.HasErrors()) + { + pVector->x = (signed __int16)(fPosition[0] * 128.0f); + pVector->y = (signed __int16)(fPosition[1] * 128.0f); + pVector->z = (signed __int16)(fPosition[2] * 128.0f); + lua_pushboolean(luaVM, true); + return 1; + } + } + } + break; + } + return 1; + } + } + } + } + if (argStream.HasErrors()) + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + + lua_pushboolean(luaVM, false); + return 1; +} + +int CLuaEngineDefs::EngineModelCollisionCreateShape(lua_State* luaVM) +{ + ushort usModel; + eCollisionShapes eCollisionShape; + CScriptArgReader argStream(luaVM); + argStream.ReadNumber(usModel); + argStream.ReadEnumString(eCollisionShape); + if (!argStream.HasErrors()) + { + if (CClientObjectManager::IsValidModel(usModel)) + { + CBaseModelInfoSAInterface* pModelInfo = ppModelInfo[usModel]; + if (pModelInfo != nullptr) + { + CColModelSAInterface* pCol = pModelInfo->pColModel; + if (pCol) + { + CColDataSA* pColData = pCol->pColData; + + CVector vecMin, vecMax; + uchar cMaterial; + switch (eCollisionShape) + { + case COLLISION_BOX: + argStream.ReadVector3D(vecMin); + argStream.ReadVector3D(vecMax); + argStream.ReadNumber(cMaterial); + if (!argStream.HasErrors()) + { + CColBoxSA* more_boxes = (CColBoxSA*)malloc(sizeof(CColBoxSA) * pColData->numColBoxes + sizeof(CColBoxSA)); + memcpy(more_boxes, pColData->pColBoxes, sizeof(CColBoxSA) * pColData->numColBoxes); + + pColData->numColBoxes++; + + CColBoxSA newBox; + newBox.min = vecMin; + newBox.min = vecMax; + newBox.material = cMaterial; + + memcpy(more_boxes + sizeof(CColBoxSA) * pColData->numColBoxes, &newBox, sizeof(CColBoxSA)); + //more_boxes[pColData->numColBoxes] = newBox; + + pColData->pColBoxes = more_boxes; + lua_pushboolean(luaVM, true); + return 1; + } + break; + case COLLISION_SPHERE: + break; + case COLLISION_TRIANGLE: + break; + case COLLISION_VERTEX: + break; } return 1; } diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h index 047f5839909..3ba53a08ad0 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h @@ -46,6 +46,8 @@ class CLuaEngineDefs : public CLuaDefs LUA_DECLARE(EngineGetVisibleTextureNames); LUA_DECLARE(EngineGetModelCollisionProperties); LUA_DECLARE(EngineGetModelCollisionData); + LUA_DECLARE(EngineSetModelCollisionData); + LUA_DECLARE(EngineModelCollisionCreateShape); private: static void AddEngineColClass(lua_State* luaVM); From 85aecc87a063754327abac2c57d580e81f0db65f Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Mon, 24 Sep 2018 18:43:05 +0200 Subject: [PATCH 05/50] updating bounding box, for now only box collisions --- .../logic/luadefs/CLuaEngineDefs.cpp | 147 ++++++++++++++---- .../deathmatch/logic/luadefs/CLuaEngineDefs.h | 1 + 2 files changed, 116 insertions(+), 32 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 83a057439b8..2c350c91d05 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -40,6 +40,7 @@ void CLuaEngineDefs::LoadFunctions(void) {"engineGetModelCollisionProperties", EngineGetModelCollisionProperties }, {"engineGetModelCollisionData", EngineGetModelCollisionData}, {"engineSetModelCollisionData", EngineSetModelCollisionData}, + {"engineUpdateModelCollisionBoundingBox", EngineUpdateModelCollisionBoundingBox }, {"engineModelCollisionCreateShape", EngineModelCollisionCreateShape }, // CLuaCFunctions::AddFunction ( "engineReplaceMatchingAtomics", EngineReplaceMatchingAtomics ); @@ -982,19 +983,28 @@ int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) lua_settable(luaVM, -3); CColDataSA* pColData = pCol->pColData; - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "colBoxes"); - lua_pushnumber(luaVM, pColData->numColBoxes); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "colSpheres"); - lua_pushnumber(luaVM, pColData->numColSpheres); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "colTriangles"); - lua_pushnumber(luaVM, pColData->numColTriangles); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "colVertices"); - lua_pushnumber(luaVM, 0); - lua_settable(luaVM, -3); + if (pColData != nullptr) + { + lua_settable(luaVM, -3); + lua_pushstring(luaVM, "colBoxes"); + lua_pushnumber(luaVM, pColData->numColBoxes); + lua_settable(luaVM, -3); + lua_pushstring(luaVM, "colSpheres"); + lua_pushnumber(luaVM, pColData->numColSpheres); + lua_settable(luaVM, -3); + lua_pushstring(luaVM, "colTriangles"); + lua_pushnumber(luaVM, pColData->numColTriangles); + lua_settable(luaVM, -3); + lua_pushstring(luaVM, "colVertices"); + lua_pushnumber(luaVM, 0); + lua_settable(luaVM, -3); + lua_pushstring(luaVM, "shadowTriangles"); + lua_pushnumber(luaVM, pColData->m_nNumShadowTriangles); + lua_settable(luaVM, -3); + lua_pushstring(luaVM, "shadowVertices"); + lua_pushnumber(luaVM, pColData->m_nNumShadowVertices); + lua_settable(luaVM, -3); + } return 1; } @@ -1026,9 +1036,11 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) if (pCol) { CColDataSA* pColData = pCol->pColData; - lua_newtable(luaVM); - switch (eCollisionShape) + if (pColData) { + lua_newtable(luaVM); + switch (eCollisionShape) + { case COLLISION_BOX: for (uint i = 0; pColData->numColBoxes > i; i++) { @@ -1058,7 +1070,7 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) lua_settable(luaVM, -3); lua_settable(luaVM, -3); } - break; + break; case COLLISION_SPHERE: for (uint i = 0; pColData->numColSpheres > i; i++) { @@ -1082,7 +1094,7 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) lua_settable(luaVM, -3); lua_settable(luaVM, -3); } - break; + break; case COLLISION_TRIANGLE: for (uint i = 0; pColData->numColTriangles > i; i++) { @@ -1109,7 +1121,7 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) lua_settable(luaVM, -3); lua_settable(luaVM, -3); } - break; + break; case COLLISION_VERTEX: std::map vecVertices = pColData->getAllVertices(); lua_newtable(luaVM); @@ -1132,8 +1144,9 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) lua_settable(luaVM, -3); } break; + } + return 1; } - return 1; } } } @@ -1145,6 +1158,78 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) return 1; } +int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) +{ + ushort usModel; + CScriptArgReader argStream(luaVM); + argStream.ReadNumber(usModel); + if (!argStream.HasErrors()) + { + if (CClientObjectManager::IsValidModel(usModel)) + { + CBaseModelInfoSAInterface* pModelInfo = ppModelInfo[usModel]; + if (pModelInfo != nullptr) + { + CColModelSAInterface* pCol = pModelInfo->pColModel; + if (pCol) + { + CColDataSA* pColData = pCol->pColData; + CBoundingBoxSA* pBoundingBox = &pCol->boundingBox; + float fRadius = 0; + CVector minVec(0, 0, 0); + CVector maxVec(0, 0, 0); + CVector center(0, 0, 0); + CVector pBoxMinVec, pBoxMaxVec; + for (uint i = 0; pColData->numColBoxes > i; i++) + { + CColBoxSA pBox = pColData->pColBoxes[i]; + pBoxMaxVec = pBox.max; + pBoxMinVec = pBox.min; + float fDis = DistanceBetweenPoints3D(pBoxMaxVec, center); + if (fDis > fRadius) + { + fRadius = fDis; + } + + if (minVec.fX > pBoxMinVec.fX) + { + minVec.fX = pBoxMinVec.fX; + } + if (minVec.fY > pBoxMinVec.fY) + { + minVec.fY = pBoxMinVec.fY; + } + if (minVec.fZ > pBoxMinVec.fZ) + { + minVec.fZ = pBoxMinVec.fZ; + } + + if (maxVec.fX < pBoxMaxVec.fX) + { + maxVec.fX = pBoxMaxVec.fX; + } + if (maxVec.fY < pBoxMaxVec.fY) + { + maxVec.fY = pBoxMaxVec.fY; + } + if (maxVec.fZ < pBoxMaxVec.fZ) + { + maxVec.fZ = pBoxMaxVec.fZ; + } + } + pBoundingBox->fRadius = fRadius; + pBoundingBox->vecOffset = center; + pBoundingBox->vecMax = maxVec; + pBoundingBox->vecMin = minVec; + lua_pushboolean(luaVM, true); + return 1; + } + } + } + } + lua_pushboolean(luaVM, false); + return 1; +} int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) { ushort usModel; @@ -1367,21 +1452,19 @@ int CLuaEngineDefs::EngineModelCollisionCreateShape(lua_State* luaVM) argStream.ReadNumber(cMaterial); if (!argStream.HasErrors()) { - CColBoxSA* more_boxes = (CColBoxSA*)malloc(sizeof(CColBoxSA) * pColData->numColBoxes + sizeof(CColBoxSA)); - memcpy(more_boxes, pColData->pColBoxes, sizeof(CColBoxSA) * pColData->numColBoxes); - - pColData->numColBoxes++; + CColBoxSA* newArr = new CColBoxSA[pColData->numColBoxes + 1]; + memcpy(newArr, pColData->pColBoxes, sizeof(CColBoxSA) * pColData->numColBoxes); - CColBoxSA newBox; - newBox.min = vecMin; - newBox.min = vecMax; - newBox.material = cMaterial; + CColBoxSA* newBox = new CColBoxSA; + newBox->min = vecMin; + newBox->min = vecMax; + newBox->material = cMaterial; - memcpy(more_boxes + sizeof(CColBoxSA) * pColData->numColBoxes, &newBox, sizeof(CColBoxSA)); - //more_boxes[pColData->numColBoxes] = newBox; - - pColData->pColBoxes = more_boxes; - lua_pushboolean(luaVM, true); + //memcpy(newArr + sizeof(CColBoxSA) * pColData->numColBoxes, &newBox, sizeof(CColBoxSA)); + newArr[pColData->numColBoxes] = *newBox; + pColData->numColBoxes++; + pColData->pColBoxes = newArr; + lua_pushnumber(luaVM, pColData->numColBoxes); return 1; } break; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h index 3ba53a08ad0..a731044e3dd 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h @@ -48,6 +48,7 @@ class CLuaEngineDefs : public CLuaDefs LUA_DECLARE(EngineGetModelCollisionData); LUA_DECLARE(EngineSetModelCollisionData); LUA_DECLARE(EngineModelCollisionCreateShape); + LUA_DECLARE(EngineUpdateModelCollisionBoundingBox); private: static void AddEngineColClass(lua_State* luaVM); From ebf9905a576b91b3fad2c6e7cb095f72cf29dc2c Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Tue, 25 Sep 2018 20:31:11 +0200 Subject: [PATCH 06/50] bounding box function improved --- .../logic/luadefs/CLuaEngineDefs.cpp | 128 +++++++++++++----- 1 file changed, 94 insertions(+), 34 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 2c350c91d05..b5d7e470dab 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -1129,7 +1129,7 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) std::map::iterator it; for (it = vecVertices.begin(); it != vecVertices.end(); it++) { - lua_pushnumber(luaVM, it->first); + lua_pushnumber(luaVM, it->first + 1); CVector vec = it->second.getVector(); lua_newtable(luaVM); lua_pushnumber(luaVM, 1); @@ -1158,6 +1158,22 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) return 1; } +void VectorAlign(CVector& destMin, CVector& destMax, CVector& src) +{ + if (src.fX < destMax.fX) + destMax.fX = src.fX; + if (src.fY < destMax.fY) + destMax.fY = src.fY; + if (src.fZ < destMax.fZ) + destMax.fZ = src.fZ; + + if (src.fX > destMin.fX) + destMin.fX = src.fX; + if (src.fY > destMin.fY) + destMin.fY = src.fY; + if (src.fZ > destMin.fZ) + destMin.fZ = src.fZ; +} int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) { ushort usModel; @@ -1180,41 +1196,46 @@ int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) CVector maxVec(0, 0, 0); CVector center(0, 0, 0); CVector pBoxMinVec, pBoxMaxVec; + + CColSphereSA pSphere; + CColBoxSA pBox; + float fDis; for (uint i = 0; pColData->numColBoxes > i; i++) { - CColBoxSA pBox = pColData->pColBoxes[i]; + pBox = pColData->pColBoxes[i]; pBoxMaxVec = pBox.max; pBoxMinVec = pBox.min; - float fDis = DistanceBetweenPoints3D(pBoxMaxVec, center); + fDis = DistanceBetweenPoints3D(pBoxMaxVec, center); if (fDis > fRadius) { fRadius = fDis; } - - if (minVec.fX > pBoxMinVec.fX) - { - minVec.fX = pBoxMinVec.fX; - } - if (minVec.fY > pBoxMinVec.fY) - { - minVec.fY = pBoxMinVec.fY; - } - if (minVec.fZ > pBoxMinVec.fZ) - { - minVec.fZ = pBoxMinVec.fZ; - } + VectorAlign(maxVec, minVec, pBoxMinVec); + VectorAlign(maxVec, minVec, pBoxMaxVec); + } - if (maxVec.fX < pBoxMaxVec.fX) - { - maxVec.fX = pBoxMaxVec.fX; - } - if (maxVec.fY < pBoxMaxVec.fY) + for (uint i = 0; pColData->numColSpheres > i; i++) + { + pSphere = pColData->pColSpheres[i]; + pBoxMaxVec = pSphere.vecCenter; + VectorAlign(maxVec, minVec, pBoxMaxVec); + pBoxMaxVec.fX += pSphere.fRadius; + pBoxMaxVec.fY += pSphere.fRadius; + pBoxMaxVec.fZ += pSphere.fRadius; + VectorAlign(maxVec, minVec, pBoxMaxVec); + fDis = DistanceBetweenPoints3D(pBoxMaxVec, center); + if (fDis > fRadius) { - maxVec.fY = pBoxMaxVec.fY; + fRadius = fDis; } - if (maxVec.fZ < pBoxMaxVec.fZ) + pBoxMaxVec.fX -= pSphere.fRadius * 2; + pBoxMaxVec.fY -= pSphere.fRadius * 2; + pBoxMaxVec.fZ -= pSphere.fRadius * 2; + VectorAlign(maxVec, minVec, pBoxMaxVec); + fDis = DistanceBetweenPoints3D(pBoxMaxVec, center); + if (fDis > fRadius) { - maxVec.fZ = pBoxMaxVec.fZ; + fRadius = fDis; } } pBoundingBox->fRadius = fRadius; @@ -1260,6 +1281,7 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) CColDataSA* pColData = pCol->pColData; switch (eCollisionShape) { + usShapeId--; case COLLISION_BOX: if (usShapeId >= 0 && usShapeId < pColData->numColBoxes) { @@ -1287,13 +1309,31 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) lua_pushboolean(luaVM, true); return 1; } + case COLLISION_KEY_POSITION: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) + { + vec2 = CVector(pBox->min.fX + pBox->max.fX, pBox->min.fY + pBox->max.fY, pBox->min.fZ + pBox->max.fZ); + vec2.fX = sqrt(vec2.fX); + vec2.fY = sqrt(vec2.fY); + vec2.fZ = sqrt(vec2.fZ); + pBox->min -= vec1 + vec2; + vec2 = CVector(pBox->max.fX * pBox->max.fX, pBox->max.fY * pBox->max.fY, pBox->max.fZ * pBox->max.fZ); + vec2.fX = sqrt(vec2.fX); + vec2.fY = sqrt(vec2.fY); + vec2.fZ = sqrt(vec2.fZ); + pBox->max -= vec1 + vec2; + + lua_pushboolean(luaVM, true); + return 1; + } break; } } break; case COLLISION_SPHERE: - if (usShapeId >= 0 && usShapeId < pColData->numColBoxes) + if (usShapeId >= 0 && usShapeId < pColData->numColSpheres) { CColSphereSA* pSphere = &pColData->pColSpheres[usShapeId]; switch (eCollisionKey) @@ -1390,7 +1430,7 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) } break; case COLLISION_VERTEX: - if (true) + if (false) { CompressedVector* pVector = &pColData->pVertices[usShapeId]; switch (eCollisionKey) @@ -1411,7 +1451,6 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) } break; } - return 1; } } } @@ -1426,6 +1465,7 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) int CLuaEngineDefs::EngineModelCollisionCreateShape(lua_State* luaVM) { ushort usModel; + float fRadius; eCollisionShapes eCollisionShape; CScriptArgReader argStream(luaVM); argStream.ReadNumber(usModel); @@ -1442,26 +1482,26 @@ int CLuaEngineDefs::EngineModelCollisionCreateShape(lua_State* luaVM) { CColDataSA* pColData = pCol->pColData; - CVector vecMin, vecMax; + CVector vecMin, vecMax, vecPosition; uchar cMaterial; switch (eCollisionShape) { case COLLISION_BOX: argStream.ReadVector3D(vecMin); argStream.ReadVector3D(vecMax); - argStream.ReadNumber(cMaterial); + argStream.ReadNumber(cMaterial, 0); if (!argStream.HasErrors()) { CColBoxSA* newArr = new CColBoxSA[pColData->numColBoxes + 1]; memcpy(newArr, pColData->pColBoxes, sizeof(CColBoxSA) * pColData->numColBoxes); CColBoxSA* newBox = new CColBoxSA; - newBox->min = vecMin; - newBox->min = vecMax; - newBox->material = cMaterial; + memcpy(newArr + sizeof(CColBoxSA) * pColData->numColBoxes, newBox, sizeof(CColBoxSA)); - //memcpy(newArr + sizeof(CColBoxSA) * pColData->numColBoxes, &newBox, sizeof(CColBoxSA)); - newArr[pColData->numColBoxes] = *newBox; + CColBoxSA* lastBox = &newArr[pColData->numColBoxes]; + lastBox->min = vecMin; + lastBox->max = vecMax; + lastBox->material = cMaterial; pColData->numColBoxes++; pColData->pColBoxes = newArr; lua_pushnumber(luaVM, pColData->numColBoxes); @@ -1469,6 +1509,26 @@ int CLuaEngineDefs::EngineModelCollisionCreateShape(lua_State* luaVM) } break; case COLLISION_SPHERE: + argStream.ReadVector3D(vecPosition); + argStream.ReadNumber(fRadius); + argStream.ReadNumber(cMaterial, 0); + if (!argStream.HasErrors()) + { + CColSphereSA* newArr = new CColSphereSA[pColData->numColSpheres + 1]; + memcpy(newArr, pColData->pColSpheres, sizeof(CColBoxSA) * pColData->numColSpheres); + + CColSphereSA* newSphere = new CColSphereSA; + memcpy(newArr + sizeof(CColSphereSA) * pColData->numColSpheres, newSphere, sizeof(CColSphereSA)); + + CColSphereSA* lastSphere = &newArr[pColData->numColSpheres]; + lastSphere->vecCenter = vecPosition; + lastSphere->material = cMaterial; + lastSphere->fRadius = fRadius; + pColData->numColSpheres++; + pColData->pColSpheres = newArr; + lua_pushnumber(luaVM, pColData->numColSpheres); + return 1; + } break; case COLLISION_TRIANGLE: break; From 4ea64d48867c584f392bc972e7ca47f2e12cee09 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Wed, 26 Sep 2018 21:18:15 +0200 Subject: [PATCH 07/50] a bit refactor --- Client/game_sa/CColModelSA.h | 88 +++++++++++++++++++ .../logic/luadefs/CLuaEngineDefs.cpp | 48 +++++----- 2 files changed, 110 insertions(+), 26 deletions(-) diff --git a/Client/game_sa/CColModelSA.h b/Client/game_sa/CColModelSA.h index dbe18fa9a1c..a9a08203081 100644 --- a/Client/game_sa/CColModelSA.h +++ b/Client/game_sa/CColModelSA.h @@ -67,6 +67,13 @@ typedef struct { return CVector(x * 0.0078125f, y * 0.0078125f, z * 0.0078125f); } + void setVector(CVector vec) + { + x = vec.fX * 128; + y = vec.fY * 128; + z = vec.fZ * 128; + } + } CompressedVector; typedef struct @@ -86,6 +93,75 @@ typedef struct unsigned int m_nNumShadowVertices; CompressedVector* m_pShadowVertices; CColTriangleSA* m_pShadowTriangles; + + ushort createCollisionBox(CVector vecMin, CVector vecMax, uchar cMaterial = 0) + { + CColBoxSA* newArr = new CColBoxSA[numColBoxes + 1]; + memcpy(newArr, pColBoxes, sizeof(CColBoxSA) * numColBoxes); + + CColBoxSA* newBox = new CColBoxSA; + memcpy(newArr + sizeof(CColBoxSA) * numColBoxes, newBox, sizeof(CColBoxSA)); + + CColBoxSA* lastBox = &newArr[numColBoxes]; + lastBox->min = vecMin; + lastBox->max = vecMax; + lastBox->material = cMaterial; + numColBoxes++; + pColBoxes = newArr; + return numColBoxes; + } + + ushort createCollisionSphere(CVector vecPosition, float fRadius, uchar cMaterial = 0) + { + CColSphereSA* newArr = new CColSphereSA[numColSpheres + 1]; + memcpy(newArr, pColSpheres, sizeof(CColSphereSA) * numColSpheres); + + CColSphereSA* newSphere = new CColSphereSA; + memcpy(newArr + sizeof(CColSphereSA) * numColSpheres, newSphere, sizeof(CColSphereSA)); + + CColSphereSA* lastSphere = &newArr[numColSpheres]; + lastSphere->vecCenter = vecPosition; + lastSphere->material = cMaterial; + lastSphere->fRadius = fRadius; + numColSpheres++; + pColSpheres = newArr; + return numColSpheres; + } + + ushort createCollisionTriangle(CVector vecVertices, CColLighting cLighting, uchar cMaterial = 0) + { + CColTriangleSA* newArr = new CColTriangleSA[numColTriangles + 1]; + memcpy(newArr, pColSpheres, sizeof(CColTriangleSA) * numColTriangles); + + CColTriangleSA* newSphere = new CColTriangleSA; + memcpy(newArr + sizeof(CColTriangleSA) * numColTriangles, newSphere, sizeof(CColTriangleSA)); + + CColTriangleSA* lastTriangle = &newArr[numColTriangles]; + lastTriangle->vertex[0] = vecVertices.fX; + lastTriangle->vertex[1] = vecVertices.fY; + lastTriangle->vertex[2] = vecVertices.fZ; + lastTriangle->lighting = cLighting; + lastTriangle->material = cMaterial; + numColTriangles++; + pColTriangles = newArr; + return numColTriangles; + } + + ushort createCollisionVertex(CVector vecPosition) + { + ushort numVertices = getNumVertices(); + CompressedVector* newArr = new CompressedVector[numVertices + 1]; + memcpy(newArr, pColSpheres, sizeof(CompressedVector) * numVertices); + + CompressedVector* newVertex = new CompressedVector; + memcpy(newArr + sizeof(CompressedVector) * numVertices, newVertex, sizeof(CompressedVector)); + + CompressedVector* lastVertex = &newArr[numVertices]; + lastVertex->setVector(vecPosition); + pVertices = newArr; + return numVertices + 1; + } + std::map getAllVertices() { std::map vertices; @@ -97,6 +173,18 @@ typedef struct } return vertices; } + ushort getNumVertices() + { + std::map vertices; + for (uint i = 0; numColTriangles > i; i++) + { + vertices[pColTriangles[i].vertex[0]] = true; + vertices[pColTriangles[i].vertex[1]] = true; + vertices[pColTriangles[i].vertex[2]] = true; + } + return vertices.size(); + } + } CColDataSA; class CColModelSAInterface diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index b5d7e470dab..2b40767fe23 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -985,6 +985,11 @@ int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) CColDataSA* pColData = pCol->pColData; if (pColData != nullptr) { + int i = 0; + while (pColData->pVertices[i].x != 0 || 100 > i) + { + i++; + } lua_settable(luaVM, -3); lua_pushstring(luaVM, "colBoxes"); lua_pushnumber(luaVM, pColData->numColBoxes); @@ -1004,6 +1009,9 @@ int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) lua_pushstring(luaVM, "shadowVertices"); lua_pushnumber(luaVM, pColData->m_nNumShadowVertices); lua_settable(luaVM, -3); + lua_pushstring(luaVM, "test"); + lua_pushnumber(luaVM, i); + lua_settable(luaVM, -3); } return 1; @@ -1492,19 +1500,7 @@ int CLuaEngineDefs::EngineModelCollisionCreateShape(lua_State* luaVM) argStream.ReadNumber(cMaterial, 0); if (!argStream.HasErrors()) { - CColBoxSA* newArr = new CColBoxSA[pColData->numColBoxes + 1]; - memcpy(newArr, pColData->pColBoxes, sizeof(CColBoxSA) * pColData->numColBoxes); - - CColBoxSA* newBox = new CColBoxSA; - memcpy(newArr + sizeof(CColBoxSA) * pColData->numColBoxes, newBox, sizeof(CColBoxSA)); - - CColBoxSA* lastBox = &newArr[pColData->numColBoxes]; - lastBox->min = vecMin; - lastBox->max = vecMax; - lastBox->material = cMaterial; - pColData->numColBoxes++; - pColData->pColBoxes = newArr; - lua_pushnumber(luaVM, pColData->numColBoxes); + lua_pushnumber(luaVM, pColData->createCollisionBox(vecMin, vecMax, cMaterial)); return 1; } break; @@ -1514,25 +1510,25 @@ int CLuaEngineDefs::EngineModelCollisionCreateShape(lua_State* luaVM) argStream.ReadNumber(cMaterial, 0); if (!argStream.HasErrors()) { - CColSphereSA* newArr = new CColSphereSA[pColData->numColSpheres + 1]; - memcpy(newArr, pColData->pColSpheres, sizeof(CColBoxSA) * pColData->numColSpheres); - - CColSphereSA* newSphere = new CColSphereSA; - memcpy(newArr + sizeof(CColSphereSA) * pColData->numColSpheres, newSphere, sizeof(CColSphereSA)); - - CColSphereSA* lastSphere = &newArr[pColData->numColSpheres]; - lastSphere->vecCenter = vecPosition; - lastSphere->material = cMaterial; - lastSphere->fRadius = fRadius; - pColData->numColSpheres++; - pColData->pColSpheres = newArr; - lua_pushnumber(luaVM, pColData->numColSpheres); + lua_pushnumber(luaVM, pColData->createCollisionSphere(vecPosition, fRadius, cMaterial)); return 1; } break; case COLLISION_TRIANGLE: + argStream.ReadVector3D(vecPosition); + if (!argStream.HasErrors()) + { + lua_pushnumber(luaVM, pColData->createCollisionVertex(vecPosition)); + return 1; + } break; case COLLISION_VERTEX: + argStream.ReadVector3D(vecPosition); + if (!argStream.HasErrors()) + { + lua_pushnumber(luaVM, pColData->createCollisionVertex(vecPosition)); + return 1; + } break; } return 1; From dccdec22d2e429cb97c51a2861d28ec58aa71174 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Thu, 27 Sep 2018 22:24:35 +0200 Subject: [PATCH 08/50] creating triangle for now, a bit unstable --- Client/game_sa/CColModelSA.h | 25 +-- .../logic/lua/CLuaFunctionParseHelpers.cpp | 8 +- .../logic/luadefs/CLuaEngineDefs.cpp | 158 ++++++++++++++++-- Shared/sdk/CScriptArgReader.h | 6 +- 4 files changed, 162 insertions(+), 35 deletions(-) diff --git a/Client/game_sa/CColModelSA.h b/Client/game_sa/CColModelSA.h index a9a08203081..0553344c506 100644 --- a/Client/game_sa/CColModelSA.h +++ b/Client/game_sa/CColModelSA.h @@ -128,18 +128,18 @@ typedef struct return numColSpheres; } - ushort createCollisionTriangle(CVector vecVertices, CColLighting cLighting, uchar cMaterial = 0) + ushort createCollisionTriangle(ushort usVertex1, ushort usVertex2, ushort usVertex3, CColLighting cLighting, uchar cMaterial = 0) { CColTriangleSA* newArr = new CColTriangleSA[numColTriangles + 1]; - memcpy(newArr, pColSpheres, sizeof(CColTriangleSA) * numColTriangles); + memcpy(newArr, pColTriangles, sizeof(CColTriangleSA) * numColTriangles); - CColTriangleSA* newSphere = new CColTriangleSA; - memcpy(newArr + sizeof(CColTriangleSA) * numColTriangles, newSphere, sizeof(CColTriangleSA)); + CColTriangleSA* newTriangle = new CColTriangleSA; + memcpy(newArr + sizeof(CColTriangleSA) * numColTriangles, newTriangle, sizeof(CColTriangleSA)); CColTriangleSA* lastTriangle = &newArr[numColTriangles]; - lastTriangle->vertex[0] = vecVertices.fX; - lastTriangle->vertex[1] = vecVertices.fY; - lastTriangle->vertex[2] = vecVertices.fZ; + lastTriangle->vertex[0] = usVertex1; + lastTriangle->vertex[1] = usVertex2; + lastTriangle->vertex[2] = usVertex3; lastTriangle->lighting = cLighting; lastTriangle->material = cMaterial; numColTriangles++; @@ -147,11 +147,11 @@ typedef struct return numColTriangles; } - ushort createCollisionVertex(CVector vecPosition) + ushort createCollisionVertex(CVector vecPosition, uchar ucAddedSize = 0) // we don't know how many vertices already is { - ushort numVertices = getNumVertices(); + ushort numVertices = getNumVertices() + ucAddedSize; CompressedVector* newArr = new CompressedVector[numVertices + 1]; - memcpy(newArr, pColSpheres, sizeof(CompressedVector) * numVertices); + memcpy(newArr, pVertices, sizeof(CompressedVector) * numVertices); CompressedVector* newVertex = new CompressedVector; memcpy(newArr + sizeof(CompressedVector) * numVertices, newVertex, sizeof(CompressedVector)); @@ -185,6 +185,11 @@ typedef struct return vertices.size(); } + inline bool checkVector(CVector &vecVector) + { + return ((128 < vecVector.fX > -128) && (128 < vecVector.fY > -128) && (128 < vecVector.fZ > -128)); + } + } CColDataSA; class CColModelSAInterface diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp index fa258f66115..e6451043529 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp @@ -525,10 +525,10 @@ ADD_ENUM(VEH_GUN, "veh_gun") IMPLEMENT_ENUM_END("vehicle-dummy") IMPLEMENT_ENUM_BEGIN(eCollisionShapes) -ADD_ENUM(COLLISION_BOX, "boxes") -ADD_ENUM(COLLISION_SPHERE, "spheres") -ADD_ENUM(COLLISION_TRIANGLE, "triangles") -ADD_ENUM(COLLISION_VERTEX, "vertices") +ADD_ENUM(COLLISION_BOX, "box") +ADD_ENUM(COLLISION_SPHERE, "sphere") +ADD_ENUM(COLLISION_TRIANGLE, "triangle") +ADD_ENUM(COLLISION_VERTEX, "vertex") IMPLEMENT_ENUM_END("collision-shape") IMPLEMENT_ENUM_BEGIN(eCollisionKey) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 2b40767fe23..e361625eee2 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -1110,13 +1110,13 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) CColTriangleSA pTriangle = pColData->pColTriangles[i]; lua_newtable(luaVM); lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pTriangle.vertex[0]); + lua_pushnumber(luaVM, pTriangle.vertex[0] + 1); lua_settable(luaVM, -3); lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pTriangle.vertex[1]); + lua_pushnumber(luaVM, pTriangle.vertex[1] + 1); lua_settable(luaVM, -3); lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pTriangle.vertex[2]); + lua_pushnumber(luaVM, pTriangle.vertex[2] + 1); lua_settable(luaVM, -3); lua_pushnumber(luaVM, 4); lua_pushnumber(luaVM, pTriangle.material); @@ -1246,6 +1246,19 @@ int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) fRadius = fDis; } } + + std::map vecVertices = pColData->getAllVertices(); + std::map::iterator it; + for (it = vecVertices.begin(); it != vecVertices.end(); it++) + { + pBoxMaxVec = it->second.getVector(); + VectorAlign(maxVec, minVec, pBoxMaxVec); + fDis = DistanceBetweenPoints3D(pBoxMaxVec, center); + if (fDis > fRadius) + { + fRadius = fDis; + } + } pBoundingBox->fRadius = fRadius; pBoundingBox->vecOffset = center; pBoundingBox->vecMax = maxVec; @@ -1490,48 +1503,157 @@ int CLuaEngineDefs::EngineModelCollisionCreateShape(lua_State* luaVM) { CColDataSA* pColData = pCol->pColData; - CVector vecMin, vecMax, vecPosition; + CVector vecArray[3]; + ushort usArray[3]; uchar cMaterial; + char cLighting[2]; switch (eCollisionShape) { case COLLISION_BOX: - argStream.ReadVector3D(vecMin); - argStream.ReadVector3D(vecMax); + argStream.ReadVector3D(vecArray[0]); + argStream.ReadVector3D(vecArray[1]); argStream.ReadNumber(cMaterial, 0); if (!argStream.HasErrors()) { - lua_pushnumber(luaVM, pColData->createCollisionBox(vecMin, vecMax, cMaterial)); + for (int i = 0; i < 2; i++) + { + if (!pColData->checkVector(vecArray[i])) + { + argStream.SetCustomError(SString("Position at argument %i is out of bounding.", i + 2)); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } + } + lua_pushnumber(luaVM, pColData->createCollisionBox(vecArray[0], vecArray[1], cMaterial)); return 1; } break; case COLLISION_SPHERE: - argStream.ReadVector3D(vecPosition); + argStream.ReadVector3D(vecArray[0]); argStream.ReadNumber(fRadius); argStream.ReadNumber(cMaterial, 0); if (!argStream.HasErrors()) { - lua_pushnumber(luaVM, pColData->createCollisionSphere(vecPosition, fRadius, cMaterial)); + if (!pColData->checkVector(vecArray[0])) + { + argStream.SetCustomError("Position at argument 3 is out of bounding."); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } + lua_pushnumber(luaVM, pColData->createCollisionSphere(vecArray[0], fRadius, cMaterial)); return 1; } break; case COLLISION_TRIANGLE: - argStream.ReadVector3D(vecPosition); - if (!argStream.HasErrors()) + // vertex, vertex, vertex[, material = 0, dayLight = 12, nightLight = 6] + // vertex is number ( vertex id ), or vector3d + // if is used second verion, there is another argument ( by default = 0 ) determining distance to nearest vertex + + bool bVersion = false; // true = 3x ushort, false = 3x CVector + if (argStream.NextIsVector3D() && argStream.NextIsVector3D(1) && argStream.NextIsVector3D(2)) + { + argStream.ReadVector3D(vecArray[0]); + argStream.ReadVector3D(vecArray[1]); + argStream.ReadVector3D(vecArray[2]); + bVersion = true; + } + else if (argStream.NextIsNumber() && argStream.NextIsNumber(1) && argStream.NextIsNumber(2)) + { + argStream.ReadNumber(usArray[0]); + argStream.ReadNumber(usArray[1]); + argStream.ReadNumber(usArray[2]); + bVersion = false; + } + else { - lua_pushnumber(luaVM, pColData->createCollisionVertex(vecPosition)); + argStream.SetCustomError("Expected 3 times vector3d or integers at arguments 3, 4 and 5."); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); return 1; } - break; - case COLLISION_VERTEX: - argStream.ReadVector3D(vecPosition); + + argStream.ReadNumber(cMaterial, 0); + argStream.ReadNumber(cLighting[0], 12); // @todo, find best values + argStream.ReadNumber(cLighting[1], 6); // @todo, find best values + argStream.ReadNumber(fRadius, 0); // ignored for 3x vertices + if (!argStream.HasErrors()) { - lua_pushnumber(luaVM, pColData->createCollisionVertex(vecPosition)); - return 1; + if (cMaterial < EColSurfaceValue::DEFAULT || cMaterial > EColSurfaceValue::RAILTRACK) + { + argStream.SetCustomError("Expected valid material id between 0 and 178"); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } + + if (cLighting[0] < 0 || cLighting[0] > 15) + { + argStream.SetCustomError("Expected valid day lighting between 0 and 15"); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } + if (cLighting[1] < 0 || cLighting[1] > 15) + { + argStream.SetCustomError("Expected valid night lighting between 0 and 15"); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } + + if (bVersion) + { + for (int i = 0; i < 3; i++) // check vectors + { + if (!pColData->checkVector(vecArray[i])) + { + argStream.SetCustomError(SString("Position at argument %i is out of bounding.", argStream.m_iIndex + i)); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } + } + + ushort usVertices[3]; + usVertices[0] = pColData->createCollisionVertex(vecArray[0]); + usVertices[1] = pColData->createCollisionVertex(vecArray[1], 1); + usVertices[2] = pColData->createCollisionVertex(vecArray[2], 2); + CColLighting colLighting; + colLighting.day = cLighting[0]; + colLighting.night = cLighting[1]; + lua_pushnumber(luaVM, pColData->createCollisionTriangle(usVertices[0] - 1, usVertices[1] - 1, usVertices[2] - 1, colLighting, cMaterial)); + return 1; + } + else + { + ushort usNumVertices = pColData->getNumVertices(); + + for (int i = 0; i < 3; i++) // 0-X instead of 1-X & check vertices + { + usArray[i]--; + if (usArray[0] < 0 || usArray[0] > usNumVertices) + { + argStream.SetCustomError(SString("Vertex id at argument %i", i + 2 )); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } + } + + if (fRadius < 0 || fRadius > 500) // this make no sense if someone pass others values + { + argStream.SetCustomError("Expected valid distance between 0 and 500"); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } + } } break; } - return 1; } } } diff --git a/Shared/sdk/CScriptArgReader.h b/Shared/sdk/CScriptArgReader.h index 39b912d65c0..3f3a0e04a83 100644 --- a/Shared/sdk/CScriptArgReader.h +++ b/Shared/sdk/CScriptArgReader.h @@ -1163,10 +1163,10 @@ class CScriptArgReader return (NextCouldBeNumber() && NextCouldBeNumber(1) && NextCouldBeNumber(2) && NextCouldBeNumber(3)) || NextIsUserDataOfType(); } - bool NextIsVector3D(void) const + bool NextIsVector3D(int iOffset = 0) const { - return (NextCouldBeNumber() && NextCouldBeNumber(1) && NextCouldBeNumber(2)) || NextIsUserDataOfType() || - NextIsUserDataOfType(); + return (NextCouldBeNumber(iOffset * 3) && NextCouldBeNumber(iOffset * 3 + 1) && NextCouldBeNumber(iOffset * 3 + 2)) || NextIsUserDataOfType(iOffset * 3) || + NextIsUserDataOfType(iOffset * 3); } bool NextIsVector2D(void) const From 1037be45ef5a3d0208e027d707eca36c6772630d Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Fri, 28 Sep 2018 15:35:17 +0200 Subject: [PATCH 09/50] update --- Client/game_sa/CColModelSA.h | 20 +++++++++++++------ .../logic/luadefs/CLuaEngineDefs.cpp | 2 +- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Client/game_sa/CColModelSA.h b/Client/game_sa/CColModelSA.h index 0553344c506..e2f85451622 100644 --- a/Client/game_sa/CColModelSA.h +++ b/Client/game_sa/CColModelSA.h @@ -17,6 +17,11 @@ #define FUNC_CColModel_Constructor 0x40FB60 #define FUNC_CColModel_Destructor 0x40F700 +typedef void *(__cdecl * hCMemoryMgr_Malloc) (unsigned int size); +auto CMemoryMgr_Malloc = (hCMemoryMgr_Malloc)0x72F420; +typedef void(__cdecl * hCMemoryMgr_Free) (void *memory); +auto CMemoryMgr_Free = (hCMemoryMgr_Free)0x72F430; + typedef struct { CVector vecMin; @@ -130,7 +135,8 @@ typedef struct ushort createCollisionTriangle(ushort usVertex1, ushort usVertex2, ushort usVertex3, CColLighting cLighting, uchar cMaterial = 0) { - CColTriangleSA* newArr = new CColTriangleSA[numColTriangles + 1]; + CColTriangleSA* newArr = reinterpret_cast(CMemoryMgr_Malloc(sizeof(CColTriangleSA) * numColTriangles + sizeof(CColTriangleSA))); + memcpy(newArr, pColTriangles, sizeof(CColTriangleSA) * numColTriangles); CColTriangleSA* newTriangle = new CColTriangleSA; @@ -143,6 +149,7 @@ typedef struct lastTriangle->lighting = cLighting; lastTriangle->material = cMaterial; numColTriangles++; + //CMemoryMgr_Free(reinterpret_cast(pColTriangles)); pColTriangles = newArr; return numColTriangles; } @@ -150,15 +157,16 @@ typedef struct ushort createCollisionVertex(CVector vecPosition, uchar ucAddedSize = 0) // we don't know how many vertices already is { ushort numVertices = getNumVertices() + ucAddedSize; - CompressedVector* newArr = new CompressedVector[numVertices + 1]; - memcpy(newArr, pVertices, sizeof(CompressedVector) * numVertices); + CompressedVector* newPVertices = reinterpret_cast(CMemoryMgr_Malloc(sizeof(CompressedVector) * numVertices + sizeof(CompressedVector))); + memcpy(newPVertices, pVertices, sizeof(CompressedVector) * numVertices); CompressedVector* newVertex = new CompressedVector; - memcpy(newArr + sizeof(CompressedVector) * numVertices, newVertex, sizeof(CompressedVector)); + memcpy(newPVertices + sizeof(CompressedVector) * numVertices, newVertex, sizeof(CompressedVector)); - CompressedVector* lastVertex = &newArr[numVertices]; + CompressedVector* lastVertex = &newPVertices[numVertices]; lastVertex->setVector(vecPosition); - pVertices = newArr; + //CMemoryMgr_Free(reinterpret_cast(pColTriangles)); + pVertices = newPVertices; return numVertices + 1; } diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index e361625eee2..803d48dd392 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -1568,7 +1568,7 @@ int CLuaEngineDefs::EngineModelCollisionCreateShape(lua_State* luaVM) } else { - argStream.SetCustomError("Expected 3 times vector3d or integers at arguments 3, 4 and 5."); + argStream.SetCustomError("Expected 3 vector3d or integers at arguments 3, 4 and 5."); m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); lua_pushboolean(luaVM, false); return 1; From 9c58e5205061a908f53b26dc0c06d1bacb53746f Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Fri, 28 Sep 2018 21:56:50 +0200 Subject: [PATCH 10/50] index argument for engineGetModelCollisionData --- Client/game_sa/CColModelSA.h | 33 ++ .../logic/luadefs/CLuaEngineDefs.cpp | 329 +++++++++++++----- 2 files changed, 268 insertions(+), 94 deletions(-) diff --git a/Client/game_sa/CColModelSA.h b/Client/game_sa/CColModelSA.h index e2f85451622..095f6129bd0 100644 --- a/Client/game_sa/CColModelSA.h +++ b/Client/game_sa/CColModelSA.h @@ -197,6 +197,39 @@ typedef struct { return ((128 < vecVector.fX > -128) && (128 < vecVector.fY > -128) && (128 < vecVector.fZ > -128)); } + /* + enum eCollisionShapes +{ + COLLISION_BOX, + COLLISION_SPHERE, + COLLISION_TRIANGLE, + COLLISION_VERTEX, +}; + +WORD numColSpheres; +WORD numColBoxes; +WORD numColTriangles; + */ + bool isValidIndex(char eShape, ushort usIndex) + { + switch (eShape) + { + case 0: + return (usIndex >= 0 && usIndex < numColBoxes); + break; + case 1: + return (usIndex >= 0 && usIndex < numColSpheres); + break; + case 2: + return (usIndex >= 0 && usIndex < numColTriangles); + break; + case 3: + ushort numVertices = getNumVertices(); + return (usIndex >= 0 && usIndex < numVertices); + break; + } + return false; + } } CColDataSA; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 803d48dd392..a9ee47b1994 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -985,11 +985,6 @@ int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) CColDataSA* pColData = pCol->pColData; if (pColData != nullptr) { - int i = 0; - while (pColData->pVertices[i].x != 0 || 100 > i) - { - i++; - } lua_settable(luaVM, -3); lua_pushstring(luaVM, "colBoxes"); lua_pushnumber(luaVM, pColData->numColBoxes); @@ -1009,9 +1004,6 @@ int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) lua_pushstring(luaVM, "shadowVertices"); lua_pushnumber(luaVM, pColData->m_nNumShadowVertices); lua_settable(luaVM, -3); - lua_pushstring(luaVM, "test"); - lua_pushnumber(luaVM, i); - lua_settable(luaVM, -3); } return 1; @@ -1028,11 +1020,12 @@ int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { - ushort usModel; + ushort usModel, usIndex; eCollisionShapes eCollisionShape; CScriptArgReader argStream(luaVM); argStream.ReadNumber(usModel); argStream.ReadEnumString(eCollisionShape); + argStream.ReadNumber(usIndex, 0); if (!argStream.HasErrors()) { if (CClientObjectManager::IsValidModel(usModel)) @@ -1046,114 +1039,262 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) CColDataSA* pColData = pCol->pColData; if (pColData) { - lua_newtable(luaVM); switch (eCollisionShape) { case COLLISION_BOX: - for (uint i = 0; pColData->numColBoxes > i; i++) + if (usIndex > 0) + { + usIndex--; + if (pColData->isValidIndex(COLLISION_BOX, usIndex)) + { + CColBoxSA pBox = pColData->pColBoxes[usIndex]; + lua_newtable(luaVM); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pBox.min.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pBox.min.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pBox.min.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pBox.max.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pBox.max.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pBox.max.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 7); + lua_pushnumber(luaVM, pBox.material); + lua_settable(luaVM, -3); + return 1; + } + else + { + argStream.SetCustomError("Invalid box index."); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + } + } + else { - lua_pushnumber(luaVM, i + 1); - CColBoxSA pBox = pColData->pColBoxes[i]; lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pBox.min.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pBox.min.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pBox.min.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pBox.max.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pBox.max.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pBox.max.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 7); - lua_pushnumber(luaVM, pBox.material); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); + for (uint i = 0; pColData->numColBoxes > i; i++) + { + lua_pushnumber(luaVM, i + 1); + CColBoxSA pBox = pColData->pColBoxes[i]; + lua_newtable(luaVM); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pBox.min.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pBox.min.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pBox.min.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pBox.max.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pBox.max.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pBox.max.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 7); + lua_pushnumber(luaVM, pBox.material); + lua_settable(luaVM, -3); + lua_settable(luaVM, -3); + } + return 1; } break; case COLLISION_SPHERE: - for (uint i = 0; pColData->numColSpheres > i; i++) + if (usIndex > 0) + { + usIndex--; + if (pColData->isValidIndex(COLLISION_SPHERE, usIndex)) + { + CColSphereSA pSphere = pColData->pColSpheres[usIndex]; + lua_newtable(luaVM); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pSphere.vecCenter.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pSphere.vecCenter.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pSphere.vecCenter.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pSphere.fRadius); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pSphere.material); + lua_settable(luaVM, -3); + return 1; + } + else + { + argStream.SetCustomError("Invalid sphere index."); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } + } + else { - lua_pushnumber(luaVM, i + 1); - CColSphereSA pSphere = pColData->pColSpheres[i]; lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pSphere.vecCenter.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pSphere.vecCenter.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pSphere.vecCenter.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pSphere.fRadius); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pSphere.material); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); + for (uint i = 0; pColData->numColSpheres > i; i++) + { + lua_pushnumber(luaVM, i + 1); + CColSphereSA pSphere = pColData->pColSpheres[i]; + lua_newtable(luaVM); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pSphere.vecCenter.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pSphere.vecCenter.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pSphere.vecCenter.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pSphere.fRadius); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pSphere.material); + lua_settable(luaVM, -3); + lua_settable(luaVM, -3); + } + return 1; } break; case COLLISION_TRIANGLE: - for (uint i = 0; pColData->numColTriangles > i; i++) + if (usIndex > 0) + { + usIndex--; + if (pColData->isValidIndex(COLLISION_TRIANGLE, usIndex)) + { + CColTriangleSA pTriangle = pColData->pColTriangles[usIndex]; + lua_newtable(luaVM); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pTriangle.vertex[0] + 1); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pTriangle.vertex[1] + 1); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pTriangle.vertex[2] + 1); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pTriangle.material); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pTriangle.lighting.day); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pTriangle.lighting.night); + lua_settable(luaVM, -3); + return 1; + } + else + { + argStream.SetCustomError("Invalid triangle index."); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } + } + else { - lua_pushnumber(luaVM, i + 1); - CColTriangleSA pTriangle = pColData->pColTriangles[i]; lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pTriangle.vertex[0] + 1); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pTriangle.vertex[1] + 1); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pTriangle.vertex[2] + 1); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pTriangle.material); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pTriangle.lighting.day); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pTriangle.lighting.night); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); + for (uint i = 0; pColData->numColTriangles > i; i++) + { + lua_pushnumber(luaVM, i + 1); + CColTriangleSA pTriangle = pColData->pColTriangles[i]; + lua_newtable(luaVM); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pTriangle.vertex[0] + 1); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pTriangle.vertex[1] + 1); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pTriangle.vertex[2] + 1); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pTriangle.material); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pTriangle.lighting.day); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pTriangle.lighting.night); + lua_settable(luaVM, -3); + lua_settable(luaVM, -3); + } + return 1; } break; case COLLISION_VERTEX: - std::map vecVertices = pColData->getAllVertices(); - lua_newtable(luaVM); - - std::map::iterator it; - for (it = vecVertices.begin(); it != vecVertices.end(); it++) + if (usIndex > 0) { - lua_pushnumber(luaVM, it->first + 1); - CVector vec = it->second.getVector(); + usIndex--; + if (pColData->isValidIndex(COLLISION_VERTEX, usIndex)) + { + CompressedVector pTriangle = pColData->pVertices[usIndex]; + lua_newtable(luaVM); + CVector vec = pTriangle.getVector(); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, vec.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, vec.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, vec.fZ); + lua_settable(luaVM, -3); + return 1; + } + else + { + argStream.SetCustomError("Invalid vertex index."); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } + } + else + { + std::map vecVertices = pColData->getAllVertices(); lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, vec.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, vec.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, vec.fZ); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); + + std::map::iterator it; + for (it = vecVertices.begin(); it != vecVertices.end(); it++) + { + lua_pushnumber(luaVM, it->first + 1); + lua_newtable(luaVM); + CVector vec = it->second.getVector(); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, vec.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, vec.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, vec.fZ); + lua_settable(luaVM, -3); + lua_settable(luaVM, -3); + } + return 1; } break; } - return 1; } } } From a6a2ce43782d939c725a1f20e5b324f12a813bba Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sat, 29 Sep 2018 14:25:39 +0200 Subject: [PATCH 11/50] upgraded, added many check for arguments --- Client/game_sa/CColModelSA.h | 24 +- .../logic/lua/CLuaFunctionParseHelpers.cpp | 1 + .../logic/lua/CLuaFunctionParseHelpers.h | 1 + .../logic/luadefs/CLuaEngineDefs.cpp | 334 ++++++++++++------ Shared/sdk/CScriptArgReader.h | 3 +- 5 files changed, 242 insertions(+), 121 deletions(-) diff --git a/Client/game_sa/CColModelSA.h b/Client/game_sa/CColModelSA.h index 095f6129bd0..29efa9c86cc 100644 --- a/Client/game_sa/CColModelSA.h +++ b/Client/game_sa/CColModelSA.h @@ -135,12 +135,13 @@ typedef struct ushort createCollisionTriangle(ushort usVertex1, ushort usVertex2, ushort usVertex3, CColLighting cLighting, uchar cMaterial = 0) { - CColTriangleSA* newArr = reinterpret_cast(CMemoryMgr_Malloc(sizeof(CColTriangleSA) * numColTriangles + sizeof(CColTriangleSA))); + DWORD dwSizeInBytes = sizeof(CColTriangleSA) * numColTriangles; + CColTriangleSA* newArr = reinterpret_cast(CMemoryMgr_Malloc(dwSizeInBytes + sizeof(CColTriangleSA))); - memcpy(newArr, pColTriangles, sizeof(CColTriangleSA) * numColTriangles); + memcpy(newArr, pColTriangles, dwSizeInBytes); CColTriangleSA* newTriangle = new CColTriangleSA; - memcpy(newArr + sizeof(CColTriangleSA) * numColTriangles, newTriangle, sizeof(CColTriangleSA)); + memcpy((unsigned char*)newArr + dwSizeInBytes, newTriangle, sizeof(CColTriangleSA)); CColTriangleSA* lastTriangle = &newArr[numColTriangles]; lastTriangle->vertex[0] = usVertex1; @@ -193,23 +194,6 @@ typedef struct return vertices.size(); } - inline bool checkVector(CVector &vecVector) - { - return ((128 < vecVector.fX > -128) && (128 < vecVector.fY > -128) && (128 < vecVector.fZ > -128)); - } - /* - enum eCollisionShapes -{ - COLLISION_BOX, - COLLISION_SPHERE, - COLLISION_TRIANGLE, - COLLISION_VERTEX, -}; - -WORD numColSpheres; -WORD numColBoxes; -WORD numColTriangles; - */ bool isValidIndex(char eShape, ushort usIndex) { switch (eShape) diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp index e6451043529..6c13d87cba7 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp @@ -538,6 +538,7 @@ ADD_ENUM(COLLISION_KEY_POSITION, "position") ADD_ENUM(COLLISION_KEY_RADIUS, "radius") ADD_ENUM(COLLISION_KEY_LIGHTING, "lighting") ADD_ENUM(COLLISION_KEY_VERTICES, "vertices") +ADD_ENUM(COLLISION_KEY_MOVE, "move") IMPLEMENT_ENUM_END("collision-key") // diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h index 554ccf044cd..44765250aad 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h @@ -107,6 +107,7 @@ enum eCollisionKey COLLISION_KEY_RADIUS, COLLISION_KEY_LIGHTING, COLLISION_KEY_VERTICES, + COLLISION_KEY_MOVE, }; DECLARE_ENUM(eCollisionKey); diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index a9ee47b1994..cab54a929ff 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -1018,6 +1018,36 @@ int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) return 1; } +void VectorAlign(CVector& destMin, CVector& destMax, CVector& src) +{ + if (src.fX < destMax.fX) + destMax.fX = src.fX; + if (src.fY < destMax.fY) + destMax.fY = src.fY; + if (src.fZ < destMax.fZ) + destMax.fZ = src.fZ; + + if (src.fX > destMin.fX) + destMin.fX = src.fX; + if (src.fY > destMin.fY) + destMin.fY = src.fY; + if (src.fZ > destMin.fZ) + destMin.fZ = src.fZ; +} + +bool checkVector(CVector& vec, float fRadius = 0) +{ + if (fRadius > 0) + { + return (128 > vec.fX + fRadius > -128 && 128 > vec.fY + fRadius > -128 && 128 > vec.fZ + fRadius > -128) + && (128 > vec.fX - fRadius > -128 && 128 > vec.fY - fRadius > -128 && 128 > vec.fZ - fRadius > -128); + } + else + { + return (128 > vec.fX > -128 && 128 > vec.fY > -128 && 128 > vec.fZ > -128); + } +} + int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { ushort usModel, usIndex; @@ -1307,27 +1337,13 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) return 1; } -void VectorAlign(CVector& destMin, CVector& destMax, CVector& src) -{ - if (src.fX < destMax.fX) - destMax.fX = src.fX; - if (src.fY < destMax.fY) - destMax.fY = src.fY; - if (src.fZ < destMax.fZ) - destMax.fZ = src.fZ; - - if (src.fX > destMin.fX) - destMin.fX = src.fX; - if (src.fY > destMin.fY) - destMin.fY = src.fY; - if (src.fZ > destMin.fZ) - destMin.fZ = src.fZ; -} int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) { ushort usModel; CScriptArgReader argStream(luaVM); + CVector center; argStream.ReadNumber(usModel); + argStream.ReadVector3D(center, CVector(0,0,0)); if (!argStream.HasErrors()) { if (CClientObjectManager::IsValidModel(usModel)) @@ -1343,7 +1359,6 @@ int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) float fRadius = 0; CVector minVec(0, 0, 0); CVector maxVec(0, 0, 0); - CVector center(0, 0, 0); CVector pBoxMinVec, pBoxMaxVec; CColSphereSA pSphere; @@ -1417,9 +1432,10 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) { ushort usModel; ushort usShapeId; + std::vector vecShapeId; eCollisionShapes eCollisionShape; eCollisionKey eCollisionKey; - CVector vec1, vec2; + CVector vec1, vec2, vec3; uchar cSurface; float fNumber; uchar cDay,cNight; @@ -1428,7 +1444,14 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) CScriptArgReader argStream(luaVM); argStream.ReadNumber(usModel); argStream.ReadEnumString(eCollisionShape); - argStream.ReadNumber(usShapeId); + if (argStream.NextIsNumber()) + { + argStream.ReadNumber(usShapeId); + vecShapeId.push_back(usShapeId); + } + else + argStream.ReadNumberTable(vecShapeId); + argStream.ReadEnumString(eCollisionKey); if (!argStream.HasErrors()) { @@ -1441,70 +1464,138 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) if (pCol) { CColDataSA* pColData = pCol->pColData; + for (int i = 0; i != vecShapeId.size(); i++) { + vecShapeId[i]--; + if (!pColData->isValidIndex(eCollisionShape, vecShapeId[i])) + { + lua_pushboolean(luaVM, false); + lua_pushnumber(luaVM, vecShapeId[i]); // return which is invalid + return 2; + } + } + switch (eCollisionShape) { - usShapeId--; case COLLISION_BOX: - if (usShapeId >= 0 && usShapeId < pColData->numColBoxes) + CColBoxSA* pBox; + switch (eCollisionKey) { - CColBoxSA* pBox = &pColData->pColBoxes[usShapeId]; - switch (eCollisionKey) + case COLLISION_KEY_MATERIAL: + argStream.ReadNumber(cSurface); + if (!argStream.HasErrors()) { - case COLLISION_KEY_MATERIAL: - argStream.ReadNumber(cSurface); - if (!argStream.HasErrors()) + if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) + { + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { - if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) - { - pBox->material = cSurface; - lua_pushboolean(luaVM, true); - return 1; - } + pBox = &pColData->pColBoxes[*it]; + pBox->material = cSurface; } - case COLLISION_KEY_SIZE: - argStream.ReadVector3D(vec1); - argStream.ReadVector3D(vec2); - if (!argStream.HasErrors()) + lua_pushboolean(luaVM, true); + return 1; + } + } + case COLLISION_KEY_SIZE: + argStream.ReadVector3D(vec1); + argStream.ReadVector3D(vec2); + if (!argStream.HasErrors()) + { + if (checkVector(vec1) && checkVector(vec2)) + { + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { + pBox = &pColData->pColBoxes[*it]; pBox->min = vec1; pBox->max = vec2; - lua_pushboolean(luaVM, true); - return 1; } - case COLLISION_KEY_POSITION: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) + lua_pushboolean(luaVM, true); + return 1; + } + } + case COLLISION_KEY_POSITION: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) + { + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + { + pBox = &pColData->pColBoxes[*it]; + vec2 = CVector(pBox->min.fX + pBox->max.fX, pBox->min.fY + pBox->max.fY, pBox->min.fZ + pBox->max.fZ); + vec2.fX = sqrt(vec2.fX); + vec2.fY = sqrt(vec2.fY); + vec2.fZ = sqrt(vec2.fZ); + vec3 = pBox->min - (vec1 + vec2); + if (checkVector(vec3)) { - vec2 = CVector(pBox->min.fX + pBox->max.fX, pBox->min.fY + pBox->max.fY, pBox->min.fZ + pBox->max.fZ); - vec2.fX = sqrt(vec2.fX); - vec2.fY = sqrt(vec2.fY); - vec2.fZ = sqrt(vec2.fZ); pBox->min -= vec1 + vec2; vec2 = CVector(pBox->max.fX * pBox->max.fX, pBox->max.fY * pBox->max.fY, pBox->max.fZ * pBox->max.fZ); vec2.fX = sqrt(vec2.fX); vec2.fY = sqrt(vec2.fY); vec2.fZ = sqrt(vec2.fZ); - pBox->max -= vec1 + vec2; - - lua_pushboolean(luaVM, true); - return 1; + if (checkVector(pBox->max - (vec1 + vec2))) + { + pBox->min = vec3; + pBox->max -= vec1 + vec2; + } } - - break; + } + lua_pushboolean(luaVM, true); + return 1; + } + break; + case COLLISION_KEY_MOVE: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) + { + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + { + pBox = &pColData->pColBoxes[*it]; + if (checkVector(pBox->min + vec1) && checkVector(pBox->max + vec1)) + { + pBox->min += vec1; + pBox->max += vec1; + } + } + lua_pushboolean(luaVM, true); + return 1; } + break; + } break; case COLLISION_SPHERE: if (usShapeId >= 0 && usShapeId < pColData->numColSpheres) { - CColSphereSA* pSphere = &pColData->pColSpheres[usShapeId]; + CColSphereSA* pSphere; switch (eCollisionKey) { case COLLISION_KEY_POSITION: argStream.ReadVector3D(vec1); if (!argStream.HasErrors()) { - pSphere->vecCenter = vec1; + if (checkVector(vec1)) + { + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + { + pSphere = &pColData->pColSpheres[*it]; + if (checkVector(vec1, pSphere->fRadius)) + { + pSphere->vecCenter = vec1; + } + } + lua_pushboolean(luaVM, true); + return 1; + } + } + case COLLISION_KEY_MOVE: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) + { + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + { + pSphere = &pColData->pColSpheres[*it]; + if (checkVector(pSphere->vecCenter + vec1, pSphere->fRadius)) + pSphere->vecCenter += vec1; + } lua_pushboolean(luaVM, true); return 1; } @@ -1512,9 +1603,17 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) argStream.ReadNumber(fNumber); if (!argStream.HasErrors()) { - pSphere->fRadius = fNumber; - lua_pushboolean(luaVM, true); - return 1; + if (fNumber >= 0 && fNumber <= 256) // bigger than 256 are sure that are outside bounding + { + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + { + pSphere = &pColData->pColSpheres[*it]; + if (checkVector(pSphere->vecCenter, fNumber)) + pSphere->fRadius = fNumber; + } + lua_pushboolean(luaVM, true); + return 1; + } } break; @@ -1524,7 +1623,11 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) { if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) { - pSphere->material = cSurface; + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + { + pSphere = &pColData->pColSpheres[*it]; + pSphere->material = cSurface; + } lua_pushboolean(luaVM, true); return 1; } @@ -1533,57 +1636,72 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) } break; case COLLISION_TRIANGLE: - if (usShapeId >= 0 && usShapeId < pColData->numColTriangles) + CColTriangleSA* pTriangle; + switch (eCollisionKey) { - CColTriangleSA* pTriangle = &pColData->pColTriangles[usShapeId]; - switch (eCollisionKey) + case COLLISION_KEY_MATERIAL: + argStream.ReadNumber(cSurface); + if (!argStream.HasErrors()) { - case COLLISION_KEY_MATERIAL: - argStream.ReadNumber(cSurface); - if (!argStream.HasErrors()) + if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) { - if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { + pTriangle = &pColData->pColTriangles[*it]; pTriangle->material = cSurface; - lua_pushboolean(luaVM, true); - return 1; } + lua_pushboolean(luaVM, true); + return 1; } - case COLLISION_KEY_LIGHTING: - argStream.ReadNumber(cDay); - argStream.ReadNumber(cNight); - if (!argStream.HasErrors()) + } + case COLLISION_KEY_LIGHTING: + argStream.ReadNumber(cDay); + argStream.ReadNumber(cNight); + if (!argStream.HasErrors()) + { + if (cDay >= 0 && cDay <= 15 && cNight >= 0 && cNight <= 15) { - if (cDay >= 0 && cDay <= 15 && cNight >= 0 && cNight <= 15) + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { + pTriangle = &pColData->pColTriangles[*it]; pTriangle->lighting.day = cDay; pTriangle->lighting.night = cNight; - lua_pushboolean(luaVM, true); - return 1; } + lua_pushboolean(luaVM, true); + return 1; } - - break; - case COLLISION_KEY_VERTICES: - argStream.ReadNumber(sVertex[0]); - argStream.ReadNumber(sVertex[1]); - if (argStream.NextIsNumber()) + } + break; + case COLLISION_KEY_VERTICES: + argStream.ReadNumber(sVertex[0]); + argStream.ReadNumber(sVertex[1]); + if (argStream.NextIsNumber()) + { + argStream.ReadNumber(sVertex[2]); + if (!argStream.HasErrors()) { - argStream.ReadNumber(sVertex[2]); - if (!argStream.HasErrors()) + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { + pTriangle = &pColData->pColTriangles[*it]; pTriangle->vertex[0] = sVertex[0]; pTriangle->vertex[1] = sVertex[1]; pTriangle->vertex[2] = sVertex[2]; - lua_pushboolean(luaVM, true); - return 1; } + lua_pushboolean(luaVM, true); + return 1; } - else + } + else + { + if (!argStream.HasErrors()) { - if (!argStream.HasErrors()) + if (sVertex[0] > 0 && sVertex[0] < 3) { - pTriangle->vertex[sVertex[0]] = sVertex[1]; + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + { + pTriangle = &pColData->pColTriangles[*it]; + pTriangle->vertex[sVertex[0]] = sVertex[1]; + } lua_pushboolean(luaVM, true); return 1; } @@ -1592,24 +1710,40 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) } break; case COLLISION_VERTEX: - if (false) + CompressedVector* pVertex; + switch (eCollisionKey) { - CompressedVector* pVector = &pColData->pVertices[usShapeId]; - switch (eCollisionKey) + case COLLISION_KEY_POSITION: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) { - case COLLISION_KEY_POSITION: - argStream.ReadNumber(fPosition[0]); - argStream.ReadNumber(fPosition[1]); - argStream.ReadNumber(fPosition[2]); - if (!argStream.HasErrors()) + if (checkVector(vec1)) { - pVector->x = (signed __int16)(fPosition[0] * 128.0f); - pVector->y = (signed __int16)(fPosition[1] * 128.0f); - pVector->z = (signed __int16)(fPosition[2] * 128.0f); + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + { + pVertex = &pColData->pVertices[*it]; + pVertex->setVector(vec1); + } lua_pushboolean(luaVM, true); return 1; } } + case COLLISION_KEY_MOVE: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) + { + if (checkVector(vec1)) + { + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + { + pVertex = &pColData->pVertices[*it]; + pVertex->setVector(vec1 + pVertex->getVector()); + } + lua_pushboolean(luaVM, true); + return 1; + } + } + } break; } @@ -1658,7 +1792,7 @@ int CLuaEngineDefs::EngineModelCollisionCreateShape(lua_State* luaVM) { for (int i = 0; i < 2; i++) { - if (!pColData->checkVector(vecArray[i])) + if (!checkVector(vecArray[i])) { argStream.SetCustomError(SString("Position at argument %i is out of bounding.", i + 2)); m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); @@ -1676,7 +1810,7 @@ int CLuaEngineDefs::EngineModelCollisionCreateShape(lua_State* luaVM) argStream.ReadNumber(cMaterial, 0); if (!argStream.HasErrors()) { - if (!pColData->checkVector(vecArray[0])) + if (!checkVector(vecArray[0])) { argStream.SetCustomError("Position at argument 3 is out of bounding."); m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); @@ -1749,7 +1883,7 @@ int CLuaEngineDefs::EngineModelCollisionCreateShape(lua_State* luaVM) { for (int i = 0; i < 3; i++) // check vectors { - if (!pColData->checkVector(vecArray[i])) + if (!checkVector(vecArray[i])) { argStream.SetCustomError(SString("Position at argument %i is out of bounding.", argStream.m_iIndex + i)); m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); diff --git a/Shared/sdk/CScriptArgReader.h b/Shared/sdk/CScriptArgReader.h index 3f3a0e04a83..67d358a4783 100644 --- a/Shared/sdk/CScriptArgReader.h +++ b/Shared/sdk/CScriptArgReader.h @@ -1005,7 +1005,8 @@ class CScriptArgReader // Reads a table of floating point numbers // Taken from CrosRoad95 dxDrawPrimitive pull request // - void ReadNumberTable(std::vector& outList) + template + void ReadNumberTable(std::vector& outList) { outList.clear(); int iArgument = lua_type(m_luaVM, m_iIndex); From bada30aea564585e3090658f4a0ff006389289a0 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sat, 29 Sep 2018 19:04:09 +0200 Subject: [PATCH 12/50] added function for getting model collision --- .../logic/luadefs/CLuaEngineDefs.cpp | 1402 ++++++++--------- 1 file changed, 695 insertions(+), 707 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index cab54a929ff..1a6a4f7ba75 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -1018,6 +1018,22 @@ int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) return 1; } +bool GetModelCollisionInterface(ushort usModel, CColModelSAInterface* &pColModelInterface) +{ + if (CClientObjectManager::IsValidModel(usModel)) + { + CBaseModelInfoSAInterface* pModelInfo = ppModelInfo[usModel]; + if (pModelInfo != nullptr) + { + pColModelInterface = pModelInfo->pColModel; + if (pColModelInterface) + { + return true; + } + } + } + return false; +} void VectorAlign(CVector& destMin, CVector& destMax, CVector& src) { if (src.fX < destMax.fX) @@ -1058,274 +1074,267 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) argStream.ReadNumber(usIndex, 0); if (!argStream.HasErrors()) { - if (CClientObjectManager::IsValidModel(usModel)) + CColModelSAInterface* pCol; + if (GetModelCollisionInterface(usModel, pCol)) { - CBaseModelInfoSAInterface* pModelInfo = ppModelInfo[usModel]; - if (pModelInfo != nullptr) + CColDataSA* pColData = pCol->pColData; + if (pColData) { - CColModelSAInterface* pCol = pModelInfo->pColModel; - if (pCol) + switch (eCollisionShape) { - CColDataSA* pColData = pCol->pColData; - if (pColData) + case COLLISION_BOX: + if (usIndex > 0) { - switch (eCollisionShape) + usIndex--; + if (pColData->isValidIndex(COLLISION_BOX, usIndex)) { - case COLLISION_BOX: - if (usIndex > 0) - { - usIndex--; - if (pColData->isValidIndex(COLLISION_BOX, usIndex)) - { - CColBoxSA pBox = pColData->pColBoxes[usIndex]; - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pBox.min.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pBox.min.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pBox.min.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pBox.max.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pBox.max.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pBox.max.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 7); - lua_pushnumber(luaVM, pBox.material); - lua_settable(luaVM, -3); - return 1; - } - else - { - argStream.SetCustomError("Invalid box index."); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - } - } - else - { - lua_newtable(luaVM); - for (uint i = 0; pColData->numColBoxes > i; i++) - { - lua_pushnumber(luaVM, i + 1); - CColBoxSA pBox = pColData->pColBoxes[i]; - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pBox.min.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pBox.min.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pBox.min.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pBox.max.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pBox.max.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pBox.max.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 7); - lua_pushnumber(luaVM, pBox.material); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - } - return 1; - } - break; - case COLLISION_SPHERE: - if (usIndex > 0) - { - usIndex--; - if (pColData->isValidIndex(COLLISION_SPHERE, usIndex)) - { - CColSphereSA pSphere = pColData->pColSpheres[usIndex]; - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pSphere.vecCenter.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pSphere.vecCenter.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pSphere.vecCenter.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pSphere.fRadius); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pSphere.material); - lua_settable(luaVM, -3); - return 1; - } - else - { - argStream.SetCustomError("Invalid sphere index."); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - } - else - { - lua_newtable(luaVM); - for (uint i = 0; pColData->numColSpheres > i; i++) - { - lua_pushnumber(luaVM, i + 1); - CColSphereSA pSphere = pColData->pColSpheres[i]; - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pSphere.vecCenter.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pSphere.vecCenter.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pSphere.vecCenter.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pSphere.fRadius); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pSphere.material); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - } - return 1; - } - break; - case COLLISION_TRIANGLE: - if (usIndex > 0) - { - usIndex--; - if (pColData->isValidIndex(COLLISION_TRIANGLE, usIndex)) - { - CColTriangleSA pTriangle = pColData->pColTriangles[usIndex]; - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pTriangle.vertex[0] + 1); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pTriangle.vertex[1] + 1); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pTriangle.vertex[2] + 1); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pTriangle.material); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pTriangle.lighting.day); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pTriangle.lighting.night); - lua_settable(luaVM, -3); - return 1; - } - else - { - argStream.SetCustomError("Invalid triangle index."); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - } - else - { - lua_newtable(luaVM); - for (uint i = 0; pColData->numColTriangles > i; i++) - { - lua_pushnumber(luaVM, i + 1); - CColTriangleSA pTriangle = pColData->pColTriangles[i]; - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pTriangle.vertex[0] + 1); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pTriangle.vertex[1] + 1); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pTriangle.vertex[2] + 1); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pTriangle.material); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pTriangle.lighting.day); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pTriangle.lighting.night); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - } - return 1; - } - break; - case COLLISION_VERTEX: - if (usIndex > 0) - { - usIndex--; - if (pColData->isValidIndex(COLLISION_VERTEX, usIndex)) - { - CompressedVector pTriangle = pColData->pVertices[usIndex]; - lua_newtable(luaVM); - CVector vec = pTriangle.getVector(); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, vec.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, vec.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, vec.fZ); - lua_settable(luaVM, -3); - return 1; - } - else - { - argStream.SetCustomError("Invalid vertex index."); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - } - else - { - std::map vecVertices = pColData->getAllVertices(); - lua_newtable(luaVM); + CColBoxSA pBox = pColData->pColBoxes[usIndex]; + lua_newtable(luaVM); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pBox.min.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pBox.min.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pBox.min.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pBox.max.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pBox.max.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pBox.max.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 7); + lua_pushnumber(luaVM, pBox.material); + lua_settable(luaVM, -3); + return 1; + } + else + { + argStream.SetCustomError("Invalid box index."); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + } + } + else + { + lua_newtable(luaVM); + for (uint i = 0; pColData->numColBoxes > i; i++) + { + lua_pushnumber(luaVM, i + 1); + CColBoxSA pBox = pColData->pColBoxes[i]; + lua_newtable(luaVM); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pBox.min.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pBox.min.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pBox.min.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pBox.max.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pBox.max.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pBox.max.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 7); + lua_pushnumber(luaVM, pBox.material); + lua_settable(luaVM, -3); + lua_settable(luaVM, -3); + } + return 1; + } + break; + case COLLISION_SPHERE: + if (usIndex > 0) + { + usIndex--; + if (pColData->isValidIndex(COLLISION_SPHERE, usIndex)) + { + CColSphereSA pSphere = pColData->pColSpheres[usIndex]; + lua_newtable(luaVM); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pSphere.vecCenter.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pSphere.vecCenter.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pSphere.vecCenter.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pSphere.fRadius); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pSphere.material); + lua_settable(luaVM, -3); + return 1; + } + else + { + argStream.SetCustomError("Invalid sphere index."); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } + } + else + { + lua_newtable(luaVM); + for (uint i = 0; pColData->numColSpheres > i; i++) + { + lua_pushnumber(luaVM, i + 1); + CColSphereSA pSphere = pColData->pColSpheres[i]; + lua_newtable(luaVM); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pSphere.vecCenter.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pSphere.vecCenter.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pSphere.vecCenter.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pSphere.fRadius); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pSphere.material); + lua_settable(luaVM, -3); + lua_settable(luaVM, -3); + } + return 1; + } + break; + case COLLISION_TRIANGLE: + if (usIndex > 0) + { + usIndex--; + if (pColData->isValidIndex(COLLISION_TRIANGLE, usIndex)) + { + CColTriangleSA pTriangle = pColData->pColTriangles[usIndex]; + lua_newtable(luaVM); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pTriangle.vertex[0] + 1); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pTriangle.vertex[1] + 1); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pTriangle.vertex[2] + 1); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pTriangle.material); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pTriangle.lighting.day); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pTriangle.lighting.night); + lua_settable(luaVM, -3); + return 1; + } + else + { + argStream.SetCustomError("Invalid triangle index."); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } + } + else + { + lua_newtable(luaVM); + for (uint i = 0; pColData->numColTriangles > i; i++) + { + lua_pushnumber(luaVM, i + 1); + CColTriangleSA pTriangle = pColData->pColTriangles[i]; + lua_newtable(luaVM); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pTriangle.vertex[0] + 1); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pTriangle.vertex[1] + 1); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pTriangle.vertex[2] + 1); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pTriangle.material); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pTriangle.lighting.day); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pTriangle.lighting.night); + lua_settable(luaVM, -3); + lua_settable(luaVM, -3); + } + return 1; + } + break; + case COLLISION_VERTEX: + if (usIndex > 0) + { + usIndex--; + if (pColData->isValidIndex(COLLISION_VERTEX, usIndex)) + { + CompressedVector pTriangle = pColData->pVertices[usIndex]; + lua_newtable(luaVM); + CVector vec = pTriangle.getVector(); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, vec.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, vec.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, vec.fZ); + lua_settable(luaVM, -3); + return 1; + } + else + { + argStream.SetCustomError("Invalid vertex index."); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } + } + else + { + std::map vecVertices = pColData->getAllVertices(); + lua_newtable(luaVM); - std::map::iterator it; - for (it = vecVertices.begin(); it != vecVertices.end(); it++) - { - lua_pushnumber(luaVM, it->first + 1); - lua_newtable(luaVM); - CVector vec = it->second.getVector(); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, vec.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, vec.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, vec.fZ); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - } - return 1; - } - break; + std::map::iterator it; + for (it = vecVertices.begin(); it != vecVertices.end(); it++) + { + lua_pushnumber(luaVM, it->first + 1); + lua_newtable(luaVM); + CVector vec = it->second.getVector(); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, vec.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, vec.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, vec.fZ); + lua_settable(luaVM, -3); + lua_settable(luaVM, -3); } + return 1; } + break; } } } @@ -1346,83 +1355,76 @@ int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) argStream.ReadVector3D(center, CVector(0,0,0)); if (!argStream.HasErrors()) { - if (CClientObjectManager::IsValidModel(usModel)) + CColModelSAInterface* pCol; + if (GetModelCollisionInterface(usModel, pCol)) { - CBaseModelInfoSAInterface* pModelInfo = ppModelInfo[usModel]; - if (pModelInfo != nullptr) + CColDataSA* pColData = pCol->pColData; + CBoundingBoxSA* pBoundingBox = &pCol->boundingBox; + float fRadius = 0; + CVector minVec(0, 0, 0); + CVector maxVec(0, 0, 0); + CVector pBoxMinVec, pBoxMaxVec; + + CColSphereSA pSphere; + CColBoxSA pBox; + float fDis; + for (uint i = 0; pColData->numColBoxes > i; i++) { - CColModelSAInterface* pCol = pModelInfo->pColModel; - if (pCol) + pBox = pColData->pColBoxes[i]; + pBoxMaxVec = pBox.max; + pBoxMinVec = pBox.min; + fDis = DistanceBetweenPoints3D(pBoxMaxVec, center); + if (fDis > fRadius) { - CColDataSA* pColData = pCol->pColData; - CBoundingBoxSA* pBoundingBox = &pCol->boundingBox; - float fRadius = 0; - CVector minVec(0, 0, 0); - CVector maxVec(0, 0, 0); - CVector pBoxMinVec, pBoxMaxVec; - - CColSphereSA pSphere; - CColBoxSA pBox; - float fDis; - for (uint i = 0; pColData->numColBoxes > i; i++) - { - pBox = pColData->pColBoxes[i]; - pBoxMaxVec = pBox.max; - pBoxMinVec = pBox.min; - fDis = DistanceBetweenPoints3D(pBoxMaxVec, center); - if (fDis > fRadius) - { - fRadius = fDis; - } - VectorAlign(maxVec, minVec, pBoxMinVec); - VectorAlign(maxVec, minVec, pBoxMaxVec); - } + fRadius = fDis; + } + VectorAlign(maxVec, minVec, pBoxMinVec); + VectorAlign(maxVec, minVec, pBoxMaxVec); + } - for (uint i = 0; pColData->numColSpheres > i; i++) - { - pSphere = pColData->pColSpheres[i]; - pBoxMaxVec = pSphere.vecCenter; - VectorAlign(maxVec, minVec, pBoxMaxVec); - pBoxMaxVec.fX += pSphere.fRadius; - pBoxMaxVec.fY += pSphere.fRadius; - pBoxMaxVec.fZ += pSphere.fRadius; - VectorAlign(maxVec, minVec, pBoxMaxVec); - fDis = DistanceBetweenPoints3D(pBoxMaxVec, center); - if (fDis > fRadius) - { - fRadius = fDis; - } - pBoxMaxVec.fX -= pSphere.fRadius * 2; - pBoxMaxVec.fY -= pSphere.fRadius * 2; - pBoxMaxVec.fZ -= pSphere.fRadius * 2; - VectorAlign(maxVec, minVec, pBoxMaxVec); - fDis = DistanceBetweenPoints3D(pBoxMaxVec, center); - if (fDis > fRadius) - { - fRadius = fDis; - } - } + for (uint i = 0; pColData->numColSpheres > i; i++) + { + pSphere = pColData->pColSpheres[i]; + pBoxMaxVec = pSphere.vecCenter; + VectorAlign(maxVec, minVec, pBoxMaxVec); + pBoxMaxVec.fX += pSphere.fRadius; + pBoxMaxVec.fY += pSphere.fRadius; + pBoxMaxVec.fZ += pSphere.fRadius; + VectorAlign(maxVec, minVec, pBoxMaxVec); + fDis = DistanceBetweenPoints3D(pBoxMaxVec, center); + if (fDis > fRadius) + { + fRadius = fDis; + } + pBoxMaxVec.fX -= pSphere.fRadius * 2; + pBoxMaxVec.fY -= pSphere.fRadius * 2; + pBoxMaxVec.fZ -= pSphere.fRadius * 2; + VectorAlign(maxVec, minVec, pBoxMaxVec); + fDis = DistanceBetweenPoints3D(pBoxMaxVec, center); + if (fDis > fRadius) + { + fRadius = fDis; + } + } - std::map vecVertices = pColData->getAllVertices(); - std::map::iterator it; - for (it = vecVertices.begin(); it != vecVertices.end(); it++) - { - pBoxMaxVec = it->second.getVector(); - VectorAlign(maxVec, minVec, pBoxMaxVec); - fDis = DistanceBetweenPoints3D(pBoxMaxVec, center); - if (fDis > fRadius) - { - fRadius = fDis; - } - } - pBoundingBox->fRadius = fRadius; - pBoundingBox->vecOffset = center; - pBoundingBox->vecMax = maxVec; - pBoundingBox->vecMin = minVec; - lua_pushboolean(luaVM, true); - return 1; + std::map vecVertices = pColData->getAllVertices(); + std::map::iterator it; + for (it = vecVertices.begin(); it != vecVertices.end(); it++) + { + pBoxMaxVec = it->second.getVector(); + VectorAlign(maxVec, minVec, pBoxMaxVec); + fDis = DistanceBetweenPoints3D(pBoxMaxVec, center); + if (fDis > fRadius) + { + fRadius = fDis; } } + pBoundingBox->fRadius = fRadius; + pBoundingBox->vecOffset = center; + pBoundingBox->vecMax = maxVec; + pBoundingBox->vecMin = minVec; + lua_pushboolean(luaVM, true); + return 1; } } lua_pushboolean(luaVM, false); @@ -1455,299 +1457,292 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) argStream.ReadEnumString(eCollisionKey); if (!argStream.HasErrors()) { - if (CClientObjectManager::IsValidModel(usModel)) + CColModelSAInterface* pCol; + if (GetModelCollisionInterface(usModel, pCol)) { - CBaseModelInfoSAInterface* pModelInfo = ppModelInfo[usModel]; - if (pModelInfo != nullptr) - { - CColModelSAInterface* pCol = pModelInfo->pColModel; - if (pCol) + CColDataSA* pColData = pCol->pColData; + for (int i = 0; i != vecShapeId.size(); i++) { + vecShapeId[i]--; + if (!pColData->isValidIndex(eCollisionShape, vecShapeId[i])) { - CColDataSA* pColData = pCol->pColData; - for (int i = 0; i != vecShapeId.size(); i++) { - vecShapeId[i]--; - if (!pColData->isValidIndex(eCollisionShape, vecShapeId[i])) - { - lua_pushboolean(luaVM, false); - lua_pushnumber(luaVM, vecShapeId[i]); // return which is invalid - return 2; - } - } + lua_pushboolean(luaVM, false); + lua_pushnumber(luaVM, vecShapeId[i]); // return which is invalid + return 2; + } + } - switch (eCollisionShape) + switch (eCollisionShape) + { + case COLLISION_BOX: + CColBoxSA* pBox; + switch (eCollisionKey) { - case COLLISION_BOX: - CColBoxSA* pBox; - switch (eCollisionKey) + case COLLISION_KEY_MATERIAL: + argStream.ReadNumber(cSurface); + if (!argStream.HasErrors()) + { + if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) { - case COLLISION_KEY_MATERIAL: - argStream.ReadNumber(cSurface); - if (!argStream.HasErrors()) + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { - if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) - { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) - { - pBox = &pColData->pColBoxes[*it]; - pBox->material = cSurface; - } - lua_pushboolean(luaVM, true); - return 1; - } + pBox = &pColData->pColBoxes[*it]; + pBox->material = cSurface; + } + lua_pushboolean(luaVM, true); + return 1; + } + } + case COLLISION_KEY_SIZE: + argStream.ReadVector3D(vec1); + argStream.ReadVector3D(vec2); + if (!argStream.HasErrors()) + { + if (checkVector(vec1) && checkVector(vec2)) + { + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + { + pBox = &pColData->pColBoxes[*it]; + pBox->min = vec1; + pBox->max = vec2; } - case COLLISION_KEY_SIZE: - argStream.ReadVector3D(vec1); - argStream.ReadVector3D(vec2); - if (!argStream.HasErrors()) + lua_pushboolean(luaVM, true); + return 1; + } + } + case COLLISION_KEY_POSITION: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) + { + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + { + pBox = &pColData->pColBoxes[*it]; + vec2 = CVector(pBox->min.fX + pBox->max.fX, pBox->min.fY + pBox->max.fY, pBox->min.fZ + pBox->max.fZ); + vec2.fX = sqrt(vec2.fX); + vec2.fY = sqrt(vec2.fY); + vec2.fZ = sqrt(vec2.fZ); + vec3 = pBox->min - (vec1 + vec2); + if (checkVector(vec3)) { - if (checkVector(vec1) && checkVector(vec2)) + pBox->min -= vec1 + vec2; + vec2 = CVector(pBox->max.fX * pBox->max.fX, pBox->max.fY * pBox->max.fY, pBox->max.fZ * pBox->max.fZ); + vec2.fX = sqrt(vec2.fX); + vec2.fY = sqrt(vec2.fY); + vec2.fZ = sqrt(vec2.fZ); + if (checkVector(pBox->max - (vec1 + vec2))) { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) - { - pBox = &pColData->pColBoxes[*it]; - pBox->min = vec1; - pBox->max = vec2; - } - lua_pushboolean(luaVM, true); - return 1; + pBox->min = vec3; + pBox->max -= vec1 + vec2; } } - case COLLISION_KEY_POSITION: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) + } + lua_pushboolean(luaVM, true); + return 1; + } + break; + case COLLISION_KEY_MOVE: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) + { + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + { + pBox = &pColData->pColBoxes[*it]; + if (checkVector(pBox->min + vec1) && checkVector(pBox->max + vec1)) + { + pBox->min += vec1; + pBox->max += vec1; + } + } + lua_pushboolean(luaVM, true); + return 1; + } + break; + + } + break; + case COLLISION_SPHERE: + if (usShapeId >= 0 && usShapeId < pColData->numColSpheres) + { + CColSphereSA* pSphere; + switch (eCollisionKey) + { + case COLLISION_KEY_POSITION: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) + { + if (checkVector(vec1)) { for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { - pBox = &pColData->pColBoxes[*it]; - vec2 = CVector(pBox->min.fX + pBox->max.fX, pBox->min.fY + pBox->max.fY, pBox->min.fZ + pBox->max.fZ); - vec2.fX = sqrt(vec2.fX); - vec2.fY = sqrt(vec2.fY); - vec2.fZ = sqrt(vec2.fZ); - vec3 = pBox->min - (vec1 + vec2); - if (checkVector(vec3)) + pSphere = &pColData->pColSpheres[*it]; + if (checkVector(vec1, pSphere->fRadius)) { - pBox->min -= vec1 + vec2; - vec2 = CVector(pBox->max.fX * pBox->max.fX, pBox->max.fY * pBox->max.fY, pBox->max.fZ * pBox->max.fZ); - vec2.fX = sqrt(vec2.fX); - vec2.fY = sqrt(vec2.fY); - vec2.fZ = sqrt(vec2.fZ); - if (checkVector(pBox->max - (vec1 + vec2))) - { - pBox->min = vec3; - pBox->max -= vec1 + vec2; - } + pSphere->vecCenter = vec1; } } lua_pushboolean(luaVM, true); return 1; } - break; - case COLLISION_KEY_MOVE: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) + } + case COLLISION_KEY_MOVE: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) + { + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + { + pSphere = &pColData->pColSpheres[*it]; + if (checkVector(pSphere->vecCenter + vec1, pSphere->fRadius)) + pSphere->vecCenter += vec1; + } + lua_pushboolean(luaVM, true); + return 1; + } + case COLLISION_KEY_RADIUS: + argStream.ReadNumber(fNumber); + if (!argStream.HasErrors()) + { + if (fNumber >= 0 && fNumber <= 256) // bigger than 256 are sure that are outside bounding { for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { - pBox = &pColData->pColBoxes[*it]; - if (checkVector(pBox->min + vec1) && checkVector(pBox->max + vec1)) - { - pBox->min += vec1; - pBox->max += vec1; - } + pSphere = &pColData->pColSpheres[*it]; + if (checkVector(pSphere->vecCenter, fNumber)) + pSphere->fRadius = fNumber; } lua_pushboolean(luaVM, true); return 1; } - break; - } - break; - case COLLISION_SPHERE: - if (usShapeId >= 0 && usShapeId < pColData->numColSpheres) + + break; + case COLLISION_KEY_MATERIAL: + argStream.ReadNumber(cSurface); + if (!argStream.HasErrors()) { - CColSphereSA* pSphere; - switch (eCollisionKey) + if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) { - case COLLISION_KEY_POSITION: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) - { - if (checkVector(vec1)) - { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) - { - pSphere = &pColData->pColSpheres[*it]; - if (checkVector(vec1, pSphere->fRadius)) - { - pSphere->vecCenter = vec1; - } - } - lua_pushboolean(luaVM, true); - return 1; - } - } - case COLLISION_KEY_MOVE: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) - { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) - { - pSphere = &pColData->pColSpheres[*it]; - if (checkVector(pSphere->vecCenter + vec1, pSphere->fRadius)) - pSphere->vecCenter += vec1; - } - lua_pushboolean(luaVM, true); - return 1; - } - case COLLISION_KEY_RADIUS: - argStream.ReadNumber(fNumber); - if (!argStream.HasErrors()) - { - if (fNumber >= 0 && fNumber <= 256) // bigger than 256 are sure that are outside bounding - { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) - { - pSphere = &pColData->pColSpheres[*it]; - if (checkVector(pSphere->vecCenter, fNumber)) - pSphere->fRadius = fNumber; - } - lua_pushboolean(luaVM, true); - return 1; - } - } - - break; - case COLLISION_KEY_MATERIAL: - argStream.ReadNumber(cSurface); - if (!argStream.HasErrors()) + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { - if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) - { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) - { - pSphere = &pColData->pColSpheres[*it]; - pSphere->material = cSurface; - } - lua_pushboolean(luaVM, true); - return 1; - } + pSphere = &pColData->pColSpheres[*it]; + pSphere->material = cSurface; } + lua_pushboolean(luaVM, true); + return 1; } } - break; - case COLLISION_TRIANGLE: - CColTriangleSA* pTriangle; - switch (eCollisionKey) + } + } + break; + case COLLISION_TRIANGLE: + CColTriangleSA* pTriangle; + switch (eCollisionKey) + { + case COLLISION_KEY_MATERIAL: + argStream.ReadNumber(cSurface); + if (!argStream.HasErrors()) + { + if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) { - case COLLISION_KEY_MATERIAL: - argStream.ReadNumber(cSurface); - if (!argStream.HasErrors()) + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { - if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) - { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) - { - pTriangle = &pColData->pColTriangles[*it]; - pTriangle->material = cSurface; - } - lua_pushboolean(luaVM, true); - return 1; - } + pTriangle = &pColData->pColTriangles[*it]; + pTriangle->material = cSurface; } - case COLLISION_KEY_LIGHTING: - argStream.ReadNumber(cDay); - argStream.ReadNumber(cNight); - if (!argStream.HasErrors()) + lua_pushboolean(luaVM, true); + return 1; + } + } + case COLLISION_KEY_LIGHTING: + argStream.ReadNumber(cDay); + argStream.ReadNumber(cNight); + if (!argStream.HasErrors()) + { + if (cDay >= 0 && cDay <= 15 && cNight >= 0 && cNight <= 15) + { + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { - if (cDay >= 0 && cDay <= 15 && cNight >= 0 && cNight <= 15) - { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) - { - pTriangle = &pColData->pColTriangles[*it]; - pTriangle->lighting.day = cDay; - pTriangle->lighting.night = cNight; - } - lua_pushboolean(luaVM, true); - return 1; - } + pTriangle = &pColData->pColTriangles[*it]; + pTriangle->lighting.day = cDay; + pTriangle->lighting.night = cNight; } - break; - case COLLISION_KEY_VERTICES: - argStream.ReadNumber(sVertex[0]); - argStream.ReadNumber(sVertex[1]); - if (argStream.NextIsNumber()) + lua_pushboolean(luaVM, true); + return 1; + } + } + break; + case COLLISION_KEY_VERTICES: + argStream.ReadNumber(sVertex[0]); + argStream.ReadNumber(sVertex[1]); + if (argStream.NextIsNumber()) + { + argStream.ReadNumber(sVertex[2]); + if (!argStream.HasErrors()) + { + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { - argStream.ReadNumber(sVertex[2]); - if (!argStream.HasErrors()) - { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) - { - pTriangle = &pColData->pColTriangles[*it]; - pTriangle->vertex[0] = sVertex[0]; - pTriangle->vertex[1] = sVertex[1]; - pTriangle->vertex[2] = sVertex[2]; - } - lua_pushboolean(luaVM, true); - return 1; - } + pTriangle = &pColData->pColTriangles[*it]; + pTriangle->vertex[0] = sVertex[0]; + pTriangle->vertex[1] = sVertex[1]; + pTriangle->vertex[2] = sVertex[2]; } - else + lua_pushboolean(luaVM, true); + return 1; + } + } + else + { + if (!argStream.HasErrors()) + { + if (sVertex[0] > 0 && sVertex[0] < 3) { - if (!argStream.HasErrors()) + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { - if (sVertex[0] > 0 && sVertex[0] < 3) - { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) - { - pTriangle = &pColData->pColTriangles[*it]; - pTriangle->vertex[sVertex[0]] = sVertex[1]; - } - lua_pushboolean(luaVM, true); - return 1; - } + pTriangle = &pColData->pColTriangles[*it]; + pTriangle->vertex[sVertex[0]] = sVertex[1]; } + lua_pushboolean(luaVM, true); + return 1; } } - break; - case COLLISION_VERTEX: - CompressedVector* pVertex; - switch (eCollisionKey) + } + } + break; + case COLLISION_VERTEX: + CompressedVector* pVertex; + switch (eCollisionKey) + { + case COLLISION_KEY_POSITION: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) + { + if (checkVector(vec1)) { - case COLLISION_KEY_POSITION: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { - if (checkVector(vec1)) - { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) - { - pVertex = &pColData->pVertices[*it]; - pVertex->setVector(vec1); - } - lua_pushboolean(luaVM, true); - return 1; - } + pVertex = &pColData->pVertices[*it]; + pVertex->setVector(vec1); } - case COLLISION_KEY_MOVE: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) + lua_pushboolean(luaVM, true); + return 1; + } + } + case COLLISION_KEY_MOVE: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) + { + if (checkVector(vec1)) + { + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { - if (checkVector(vec1)) - { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) - { - pVertex = &pColData->pVertices[*it]; - pVertex->setVector(vec1 + pVertex->getVector()); - } - lua_pushboolean(luaVM, true); - return 1; - } + pVertex = &pColData->pVertices[*it]; + pVertex->setVector(vec1 + pVertex->getVector()); } - + lua_pushboolean(luaVM, true); + return 1; } - break; + } + } - } + break; } } } @@ -1768,168 +1763,161 @@ int CLuaEngineDefs::EngineModelCollisionCreateShape(lua_State* luaVM) argStream.ReadEnumString(eCollisionShape); if (!argStream.HasErrors()) { - if (CClientObjectManager::IsValidModel(usModel)) + CColModelSAInterface* pCol; + if (GetModelCollisionInterface(usModel, pCol)) { - CBaseModelInfoSAInterface* pModelInfo = ppModelInfo[usModel]; - if (pModelInfo != nullptr) - { - CColModelSAInterface* pCol = pModelInfo->pColModel; - if (pCol) - { - CColDataSA* pColData = pCol->pColData; + CColDataSA* pColData = pCol->pColData; - CVector vecArray[3]; - ushort usArray[3]; - uchar cMaterial; - char cLighting[2]; - switch (eCollisionShape) + CVector vecArray[3]; + ushort usArray[3]; + uchar cMaterial; + char cLighting[2]; + switch (eCollisionShape) + { + case COLLISION_BOX: + argStream.ReadVector3D(vecArray[0]); + argStream.ReadVector3D(vecArray[1]); + argStream.ReadNumber(cMaterial, 0); + if (!argStream.HasErrors()) { - case COLLISION_BOX: - argStream.ReadVector3D(vecArray[0]); - argStream.ReadVector3D(vecArray[1]); - argStream.ReadNumber(cMaterial, 0); - if (!argStream.HasErrors()) - { - for (int i = 0; i < 2; i++) - { - if (!checkVector(vecArray[i])) - { - argStream.SetCustomError(SString("Position at argument %i is out of bounding.", i + 2)); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - } - lua_pushnumber(luaVM, pColData->createCollisionBox(vecArray[0], vecArray[1], cMaterial)); - return 1; - } - break; - case COLLISION_SPHERE: - argStream.ReadVector3D(vecArray[0]); - argStream.ReadNumber(fRadius); - argStream.ReadNumber(cMaterial, 0); - if (!argStream.HasErrors()) - { - if (!checkVector(vecArray[0])) - { - argStream.SetCustomError("Position at argument 3 is out of bounding."); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - lua_pushnumber(luaVM, pColData->createCollisionSphere(vecArray[0], fRadius, cMaterial)); - return 1; - } - break; - case COLLISION_TRIANGLE: - // vertex, vertex, vertex[, material = 0, dayLight = 12, nightLight = 6] - // vertex is number ( vertex id ), or vector3d - // if is used second verion, there is another argument ( by default = 0 ) determining distance to nearest vertex - - bool bVersion = false; // true = 3x ushort, false = 3x CVector - if (argStream.NextIsVector3D() && argStream.NextIsVector3D(1) && argStream.NextIsVector3D(2)) - { - argStream.ReadVector3D(vecArray[0]); - argStream.ReadVector3D(vecArray[1]); - argStream.ReadVector3D(vecArray[2]); - bVersion = true; - } - else if (argStream.NextIsNumber() && argStream.NextIsNumber(1) && argStream.NextIsNumber(2)) - { - argStream.ReadNumber(usArray[0]); - argStream.ReadNumber(usArray[1]); - argStream.ReadNumber(usArray[2]); - bVersion = false; - } - else + for (int i = 0; i < 2; i++) + { + if (!checkVector(vecArray[i])) { - argStream.SetCustomError("Expected 3 vector3d or integers at arguments 3, 4 and 5."); + argStream.SetCustomError(SString("Position at argument %i is out of bounding.", i + 2)); m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); lua_pushboolean(luaVM, false); return 1; } + } + lua_pushnumber(luaVM, pColData->createCollisionBox(vecArray[0], vecArray[1], cMaterial)); + return 1; + } + break; + case COLLISION_SPHERE: + argStream.ReadVector3D(vecArray[0]); + argStream.ReadNumber(fRadius); + argStream.ReadNumber(cMaterial, 0); + if (!argStream.HasErrors()) + { + if (!checkVector(vecArray[0])) + { + argStream.SetCustomError("Position at argument 3 is out of bounding."); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } + lua_pushnumber(luaVM, pColData->createCollisionSphere(vecArray[0], fRadius, cMaterial)); + return 1; + } + break; + case COLLISION_TRIANGLE: + // vertex, vertex, vertex[, material = 0, dayLight = 12, nightLight = 6] + // vertex is number ( vertex id ), or vector3d + // if is used second verion, there is another argument ( by default = 0 ) determining distance to nearest vertex + + bool bVersion = false; // true = 3x ushort, false = 3x CVector + if (argStream.NextIsVector3D() && argStream.NextIsVector3D(1) && argStream.NextIsVector3D(2)) + { + argStream.ReadVector3D(vecArray[0]); + argStream.ReadVector3D(vecArray[1]); + argStream.ReadVector3D(vecArray[2]); + bVersion = true; + } + else if (argStream.NextIsNumber() && argStream.NextIsNumber(1) && argStream.NextIsNumber(2)) + { + argStream.ReadNumber(usArray[0]); + argStream.ReadNumber(usArray[1]); + argStream.ReadNumber(usArray[2]); + bVersion = false; + } + else + { + argStream.SetCustomError("Expected 3 vector3d or integers at arguments 3, 4 and 5."); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } - argStream.ReadNumber(cMaterial, 0); - argStream.ReadNumber(cLighting[0], 12); // @todo, find best values - argStream.ReadNumber(cLighting[1], 6); // @todo, find best values - argStream.ReadNumber(fRadius, 0); // ignored for 3x vertices + argStream.ReadNumber(cMaterial, 0); + argStream.ReadNumber(cLighting[0], 12); // @todo, find best values + argStream.ReadNumber(cLighting[1], 6); // @todo, find best values + argStream.ReadNumber(fRadius, 0); // ignored for 3x vertices - if (!argStream.HasErrors()) + if (!argStream.HasErrors()) + { + if (cMaterial < EColSurfaceValue::DEFAULT || cMaterial > EColSurfaceValue::RAILTRACK) + { + argStream.SetCustomError("Expected valid material id between 0 and 178"); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } + + if (cLighting[0] < 0 || cLighting[0] > 15) + { + argStream.SetCustomError("Expected valid day lighting between 0 and 15"); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } + if (cLighting[1] < 0 || cLighting[1] > 15) + { + argStream.SetCustomError("Expected valid night lighting between 0 and 15"); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } + + if (bVersion) + { + for (int i = 0; i < 3; i++) // check vectors { - if (cMaterial < EColSurfaceValue::DEFAULT || cMaterial > EColSurfaceValue::RAILTRACK) + if (!checkVector(vecArray[i])) { - argStream.SetCustomError("Expected valid material id between 0 and 178"); + argStream.SetCustomError(SString("Position at argument %i is out of bounding.", argStream.m_iIndex + i)); m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); lua_pushboolean(luaVM, false); return 1; } + } - if (cLighting[0] < 0 || cLighting[0] > 15) - { - argStream.SetCustomError("Expected valid day lighting between 0 and 15"); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - if (cLighting[1] < 0 || cLighting[1] > 15) + ushort usVertices[3]; + usVertices[0] = pColData->createCollisionVertex(vecArray[0]); + usVertices[1] = pColData->createCollisionVertex(vecArray[1], 1); + usVertices[2] = pColData->createCollisionVertex(vecArray[2], 2); + CColLighting colLighting; + colLighting.day = cLighting[0]; + colLighting.night = cLighting[1]; + lua_pushnumber(luaVM, pColData->createCollisionTriangle(usVertices[0] - 1, usVertices[1] - 1, usVertices[2] - 1, colLighting, cMaterial)); + return 1; + } + else + { + ushort usNumVertices = pColData->getNumVertices(); + + for (int i = 0; i < 3; i++) // 0-X instead of 1-X & check vertices + { + usArray[i]--; + if (usArray[0] < 0 || usArray[0] > usNumVertices) { - argStream.SetCustomError("Expected valid night lighting between 0 and 15"); + argStream.SetCustomError(SString("Vertex id at argument %i", i + 2 )); m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); lua_pushboolean(luaVM, false); return 1; } + } - if (bVersion) - { - for (int i = 0; i < 3; i++) // check vectors - { - if (!checkVector(vecArray[i])) - { - argStream.SetCustomError(SString("Position at argument %i is out of bounding.", argStream.m_iIndex + i)); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - } - - ushort usVertices[3]; - usVertices[0] = pColData->createCollisionVertex(vecArray[0]); - usVertices[1] = pColData->createCollisionVertex(vecArray[1], 1); - usVertices[2] = pColData->createCollisionVertex(vecArray[2], 2); - CColLighting colLighting; - colLighting.day = cLighting[0]; - colLighting.night = cLighting[1]; - lua_pushnumber(luaVM, pColData->createCollisionTriangle(usVertices[0] - 1, usVertices[1] - 1, usVertices[2] - 1, colLighting, cMaterial)); - return 1; - } - else - { - ushort usNumVertices = pColData->getNumVertices(); - - for (int i = 0; i < 3; i++) // 0-X instead of 1-X & check vertices - { - usArray[i]--; - if (usArray[0] < 0 || usArray[0] > usNumVertices) - { - argStream.SetCustomError(SString("Vertex id at argument %i", i + 2 )); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - } - - if (fRadius < 0 || fRadius > 500) // this make no sense if someone pass others values - { - argStream.SetCustomError("Expected valid distance between 0 and 500"); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - } + if (fRadius < 0 || fRadius > 500) // this make no sense if someone pass others values + { + argStream.SetCustomError("Expected valid distance between 0 and 500"); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; } - break; + } } - } + break; } } } From 55eacc9b4d867ce1df6d69df04cf0adfbef94bfd Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sat, 29 Sep 2018 20:47:57 +0200 Subject: [PATCH 13/50] engineModelIsCollisionLoaded function --- .../logic/luadefs/CLuaEngineDefs.cpp | 21 +++++++++++++++++++ .../deathmatch/logic/luadefs/CLuaEngineDefs.h | 1 + 2 files changed, 22 insertions(+) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 1a6a4f7ba75..58979c4e9c0 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -42,6 +42,7 @@ void CLuaEngineDefs::LoadFunctions(void) {"engineSetModelCollisionData", EngineSetModelCollisionData}, {"engineUpdateModelCollisionBoundingBox", EngineUpdateModelCollisionBoundingBox }, {"engineModelCollisionCreateShape", EngineModelCollisionCreateShape }, + {"engineModelIsCollisionLoaded", EngineModelIsCollisionLoaded }, // CLuaCFunctions::AddFunction ( "engineReplaceMatchingAtomics", EngineReplaceMatchingAtomics ); // CLuaCFunctions::AddFunction ( "engineReplaceWheelAtomics", EngineReplaceWheelAtomics ); @@ -1064,6 +1065,26 @@ bool checkVector(CVector& vec, float fRadius = 0) } } + +int CLuaEngineDefs::EngineModelIsCollisionLoaded(lua_State* luaVM) +{ + ushort usModel; + CScriptArgReader argStream(luaVM); + argStream.ReadNumber(usModel); + if (!argStream.HasErrors()) + { + CColModelSAInterface* pCol; + lua_pushboolean(luaVM, GetModelCollisionInterface(usModel, pCol)); + return 1; + } + if (argStream.HasErrors()) + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + + lua_pushnil(luaVM); + return 1; +} + + int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { ushort usModel, usIndex; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h index a731044e3dd..bbf8934e838 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h @@ -49,6 +49,7 @@ class CLuaEngineDefs : public CLuaDefs LUA_DECLARE(EngineSetModelCollisionData); LUA_DECLARE(EngineModelCollisionCreateShape); LUA_DECLARE(EngineUpdateModelCollisionBoundingBox); + LUA_DECLARE(EngineModelIsCollisionLoaded); private: static void AddEngineColClass(lua_State* luaVM); From 9ce7e11c389b1d01ecfaaa5869e33a3d0b6d75df Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sun, 30 Sep 2018 07:48:03 +0200 Subject: [PATCH 14/50] renemed function for checking collision --- Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp | 4 ++-- Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 58979c4e9c0..03e4ec3374b 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -42,7 +42,7 @@ void CLuaEngineDefs::LoadFunctions(void) {"engineSetModelCollisionData", EngineSetModelCollisionData}, {"engineUpdateModelCollisionBoundingBox", EngineUpdateModelCollisionBoundingBox }, {"engineModelCollisionCreateShape", EngineModelCollisionCreateShape }, - {"engineModelIsCollisionLoaded", EngineModelIsCollisionLoaded }, + {"isModelCollisionLoaded", IsModelCollisionLoaded }, // CLuaCFunctions::AddFunction ( "engineReplaceMatchingAtomics", EngineReplaceMatchingAtomics ); // CLuaCFunctions::AddFunction ( "engineReplaceWheelAtomics", EngineReplaceWheelAtomics ); @@ -1066,7 +1066,7 @@ bool checkVector(CVector& vec, float fRadius = 0) } -int CLuaEngineDefs::EngineModelIsCollisionLoaded(lua_State* luaVM) +int CLuaEngineDefs::IsModelCollisionLoaded(lua_State* luaVM) { ushort usModel; CScriptArgReader argStream(luaVM); diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h index bbf8934e838..9677e3bdfbd 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h @@ -49,7 +49,7 @@ class CLuaEngineDefs : public CLuaDefs LUA_DECLARE(EngineSetModelCollisionData); LUA_DECLARE(EngineModelCollisionCreateShape); LUA_DECLARE(EngineUpdateModelCollisionBoundingBox); - LUA_DECLARE(EngineModelIsCollisionLoaded); + LUA_DECLARE(IsModelCollisionLoaded); private: static void AddEngineColClass(lua_State* luaVM); From 08bb12717e633cb928e5d785b7c802d77a763bec Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sun, 30 Sep 2018 13:06:30 +0200 Subject: [PATCH 15/50] removed unnecessary condition --- .../logic/luadefs/CLuaEngineDefs.cpp | 94 +++++++++---------- 1 file changed, 46 insertions(+), 48 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 03e4ec3374b..eeb9421649f 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -1581,74 +1581,72 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) } break; case COLLISION_SPHERE: - if (usShapeId >= 0 && usShapeId < pColData->numColSpheres) + CColSphereSA* pSphere; + switch (eCollisionKey) { - CColSphereSA* pSphere; - switch (eCollisionKey) + case COLLISION_KEY_POSITION: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) { - case COLLISION_KEY_POSITION: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) + if (checkVector(vec1)) { - if (checkVector(vec1)) + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + ushort val = *it; + pSphere = &pColData->pColSpheres[*it]; + if (checkVector(vec1, pSphere->fRadius)) { - pSphere = &pColData->pColSpheres[*it]; - if (checkVector(vec1, pSphere->fRadius)) - { - pSphere->vecCenter = vec1; - } + pSphere->vecCenter = vec1; } - lua_pushboolean(luaVM, true); - return 1; } + lua_pushboolean(luaVM, true); + return 1; } - case COLLISION_KEY_MOVE: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) + } + case COLLISION_KEY_MOVE: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) + { + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + { + pSphere = &pColData->pColSpheres[*it]; + if (checkVector(pSphere->vecCenter + vec1, pSphere->fRadius)) + pSphere->vecCenter += vec1; + } + lua_pushboolean(luaVM, true); + return 1; + } + case COLLISION_KEY_RADIUS: + argStream.ReadNumber(fNumber); + if (!argStream.HasErrors()) + { + if (fNumber >= 0 && fNumber <= 256) // bigger than 256 are sure that are outside bounding { for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { pSphere = &pColData->pColSpheres[*it]; - if (checkVector(pSphere->vecCenter + vec1, pSphere->fRadius)) - pSphere->vecCenter += vec1; + if (checkVector(pSphere->vecCenter, fNumber)) + pSphere->fRadius = fNumber; } lua_pushboolean(luaVM, true); return 1; } - case COLLISION_KEY_RADIUS: - argStream.ReadNumber(fNumber); - if (!argStream.HasErrors()) - { - if (fNumber >= 0 && fNumber <= 256) // bigger than 256 are sure that are outside bounding - { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) - { - pSphere = &pColData->pColSpheres[*it]; - if (checkVector(pSphere->vecCenter, fNumber)) - pSphere->fRadius = fNumber; - } - lua_pushboolean(luaVM, true); - return 1; - } - } + } - break; - case COLLISION_KEY_MATERIAL: - argStream.ReadNumber(cSurface); - if (!argStream.HasErrors()) + break; + case COLLISION_KEY_MATERIAL: + argStream.ReadNumber(cSurface); + if (!argStream.HasErrors()) + { + if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) { - if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) - { - pSphere = &pColData->pColSpheres[*it]; - pSphere->material = cSurface; - } - lua_pushboolean(luaVM, true); - return 1; + pSphere = &pColData->pColSpheres[*it]; + pSphere->material = cSurface; } + lua_pushboolean(luaVM, true); + return 1; } } } From 74233e1f8150219151f469aa4c34c8cd2c271a57 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sun, 30 Sep 2018 18:42:26 +0200 Subject: [PATCH 16/50] a bit refactor, and test of restoring collision --- .../logic/luadefs/CLuaEngineDefs.cpp | 50 +++++++++++++++++-- .../deathmatch/logic/luadefs/CLuaEngineDefs.h | 3 +- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index eeb9421649f..a98e57db751 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -41,8 +41,10 @@ void CLuaEngineDefs::LoadFunctions(void) {"engineGetModelCollisionData", EngineGetModelCollisionData}, {"engineSetModelCollisionData", EngineSetModelCollisionData}, {"engineUpdateModelCollisionBoundingBox", EngineUpdateModelCollisionBoundingBox }, - {"engineModelCollisionCreateShape", EngineModelCollisionCreateShape }, + {"engineModelCollisionCreate", EngineModelCollisionCreate }, + {"engineModelCollisionRemove", EngineModelCollisionRemove }, {"isModelCollisionLoaded", IsModelCollisionLoaded }, + {"engineRestoreOriginalCollision", EngineRestoreOriginalCollision }, // CLuaCFunctions::AddFunction ( "engineReplaceMatchingAtomics", EngineReplaceMatchingAtomics ); // CLuaCFunctions::AddFunction ( "engineReplaceWheelAtomics", EngineReplaceWheelAtomics ); @@ -1024,6 +1026,7 @@ bool GetModelCollisionInterface(ushort usModel, CColModelSAInterface* &pColModel if (CClientObjectManager::IsValidModel(usModel)) { CBaseModelInfoSAInterface* pModelInfo = ppModelInfo[usModel]; + pModelInfo->bDontCastShadowsOn = 0; if (pModelInfo != nullptr) { pColModelInterface = pModelInfo->pColModel; @@ -1065,6 +1068,37 @@ bool checkVector(CVector& vec, float fRadius = 0) } } +//CColStore::RemoveAllCollision(void).text 00410E00 00000060 00000004 00000000 R . . . . . . + +typedef void(__cdecl * hRemoveModel) (void); +auto cRemoveModel = (hRemoveModel)0x410E00; + +int CLuaEngineDefs::EngineRestoreOriginalCollision(lua_State* luaVM) +{ + ushort usModel; + CScriptArgReader argStream(luaVM); + argStream.ReadNumber(usModel); + if (!argStream.HasErrors()) + { + CColModelSAInterface* pCol; + if (GetModelCollisionInterface(usModel, pCol)) + { + cRemoveModel(); + lua_pushboolean(luaVM, true); + return 1; + } + else + { + lua_pushboolean(luaVM, false); + return 1; + } + } + if (argStream.HasErrors()) + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + + lua_pushboolean(luaVM, false); + return 1; +} int CLuaEngineDefs::IsModelCollisionLoaded(lua_State* luaVM) { @@ -1084,7 +1118,6 @@ int CLuaEngineDefs::IsModelCollisionLoaded(lua_State* luaVM) return 1; } - int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { ushort usModel, usIndex; @@ -1772,14 +1805,23 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) return 1; } -int CLuaEngineDefs::EngineModelCollisionCreateShape(lua_State* luaVM) +int CLuaEngineDefs::EngineModelCollisionCreate(lua_State* luaVM) { - ushort usModel; + ushort usModel,usIndex; float fRadius; + std::vector vecIndexes; eCollisionShapes eCollisionShape; CScriptArgReader argStream(luaVM); argStream.ReadNumber(usModel); argStream.ReadEnumString(eCollisionShape); + if (argStream.NextIsNumber()) + { + argStream.ReadNumber(usIndex); + vecIndexes.push_back(usIndex); + } + else + argStream.ReadNumberTable(vecIndexes); + if (!argStream.HasErrors()) { CColModelSAInterface* pCol; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h index 9677e3bdfbd..8e0262a3715 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h @@ -47,9 +47,10 @@ class CLuaEngineDefs : public CLuaDefs LUA_DECLARE(EngineGetModelCollisionProperties); LUA_DECLARE(EngineGetModelCollisionData); LUA_DECLARE(EngineSetModelCollisionData); - LUA_DECLARE(EngineModelCollisionCreateShape); + LUA_DECLARE(EngineModelCollisionCreate); LUA_DECLARE(EngineUpdateModelCollisionBoundingBox); LUA_DECLARE(IsModelCollisionLoaded); + LUA_DECLARE(EngineRestoreOriginalCollision); private: static void AddEngineColClass(lua_State* luaVM); From 03ca694c31bf2b121261f963b5ddb2d657910d18 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sun, 30 Sep 2018 22:23:38 +0200 Subject: [PATCH 17/50] removing collision boxes only boxes for now --- Client/game_sa/CColModelSA.h | 7 +- .../logic/luadefs/CLuaEngineDefs.cpp | 77 +++++++++++++++++-- .../deathmatch/logic/luadefs/CLuaEngineDefs.h | 1 + 3 files changed, 78 insertions(+), 7 deletions(-) diff --git a/Client/game_sa/CColModelSA.h b/Client/game_sa/CColModelSA.h index 29efa9c86cc..ceed04da845 100644 --- a/Client/game_sa/CColModelSA.h +++ b/Client/game_sa/CColModelSA.h @@ -194,7 +194,7 @@ typedef struct return vertices.size(); } - bool isValidIndex(char eShape, ushort usIndex) + bool isValidIndex(char eShape, ushort usIndex, ushort numVertices = 0) { switch (eShape) { @@ -208,7 +208,10 @@ typedef struct return (usIndex >= 0 && usIndex < numColTriangles); break; case 3: - ushort numVertices = getNumVertices(); + if (numVertices == 0) + { + numVertices = getNumVertices(); + } return (usIndex >= 0 && usIndex < numVertices); break; } diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index a98e57db751..7ad9c5d49b2 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -12,6 +12,7 @@ #include "StdInc.h" #include "../Client/game_sa/CModelInfoSA.h" +#include "../Client/game_sa/CColModelSA.h" CBaseModelInfoSAInterface** ppModelInfo = (CBaseModelInfoSAInterface**)ARRAY_ModelInfo; void CLuaEngineDefs::LoadFunctions(void) @@ -999,7 +1000,7 @@ int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) lua_pushnumber(luaVM, pColData->numColTriangles); lua_settable(luaVM, -3); lua_pushstring(luaVM, "colVertices"); - lua_pushnumber(luaVM, 0); + lua_pushnumber(luaVM, pColData->getNumVertices()); lua_settable(luaVM, -3); lua_pushstring(luaVM, "shadowTriangles"); lua_pushnumber(luaVM, pColData->m_nNumShadowTriangles); @@ -1026,7 +1027,6 @@ bool GetModelCollisionInterface(ushort usModel, CColModelSAInterface* &pColModel if (CClientObjectManager::IsValidModel(usModel)) { CBaseModelInfoSAInterface* pModelInfo = ppModelInfo[usModel]; - pModelInfo->bDontCastShadowsOn = 0; if (pModelInfo != nullptr) { pColModelInterface = pModelInfo->pColModel; @@ -1515,9 +1515,10 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) if (GetModelCollisionInterface(usModel, pCol)) { CColDataSA* pColData = pCol->pColData; + ushort numVertices = pColData->getNumVertices(); for (int i = 0; i != vecShapeId.size(); i++) { vecShapeId[i]--; - if (!pColData->isValidIndex(eCollisionShape, vecShapeId[i])) + if (!pColData->isValidIndex(eCollisionShape, vecShapeId[i], numVertices)) { lua_pushboolean(luaVM, false); lua_pushnumber(luaVM, vecShapeId[i]); // return which is invalid @@ -1805,9 +1806,9 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) return 1; } -int CLuaEngineDefs::EngineModelCollisionCreate(lua_State* luaVM) +int CLuaEngineDefs::EngineModelCollisionRemove(lua_State* luaVM) { - ushort usModel,usIndex; + ushort usModel, usIndex; float fRadius; std::vector vecIndexes; eCollisionShapes eCollisionShape; @@ -1822,6 +1823,72 @@ int CLuaEngineDefs::EngineModelCollisionCreate(lua_State* luaVM) else argStream.ReadNumberTable(vecIndexes); + if (!argStream.HasErrors()) + { + CColModelSAInterface* pCol; + if (GetModelCollisionInterface(usModel, pCol)) + { + CColDataSA* pColData = pCol->pColData; + ushort numVertices = pColData->getNumVertices(); + for (int i = 0; i != vecIndexes.size(); i++) { + vecIndexes[i]--; + if (!pColData->isValidIndex(eCollisionShape, vecIndexes[i], numVertices)) + { + lua_pushboolean(luaVM, false); + lua_pushnumber(luaVM, vecIndexes[i]); // return which is invalid + return 2; + } + } + + sort(vecIndexes.begin(), vecIndexes.end()); + vecIndexes.erase(unique(vecIndexes.begin(), vecIndexes.end()), vecIndexes.end()); + + CColBoxSA* pBox; + CColBoxSA* newArr; + ushort usIndex; + switch (eCollisionShape) + { + case COLLISION_BOX: + newArr = new CColBoxSA[pColData->numColBoxes - vecIndexes.size()]; + usIndex = 0; + for (ushort i = 0; i < pColData->numColBoxes; i++) + { + if ( std::find(vecIndexes.begin(), vecIndexes.end(), i) == vecIndexes.end()) + { + pBox = &pColData->pColBoxes[i]; + newArr[usIndex] = *pBox; + usIndex++; + } + } + pColData->numColBoxes -= vecIndexes.size(); + pColData->pColBoxes = newArr; + lua_pushboolean(luaVM, true); + lua_pushnumber(luaVM, usIndex); + return 2; + break; + case COLLISION_SPHERE: + break; + case COLLISION_TRIANGLE: + break; + } + } + } + if (argStream.HasErrors()) + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + + lua_pushboolean(luaVM, false); + return 1; +} + +int CLuaEngineDefs::EngineModelCollisionCreate(lua_State* luaVM) +{ + ushort usModel; + float fRadius; + eCollisionShapes eCollisionShape; + CScriptArgReader argStream(luaVM); + argStream.ReadNumber(usModel); + argStream.ReadEnumString(eCollisionShape); + if (!argStream.HasErrors()) { CColModelSAInterface* pCol; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h index 8e0262a3715..ee4cffcc5e6 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h @@ -48,6 +48,7 @@ class CLuaEngineDefs : public CLuaDefs LUA_DECLARE(EngineGetModelCollisionData); LUA_DECLARE(EngineSetModelCollisionData); LUA_DECLARE(EngineModelCollisionCreate); + LUA_DECLARE(EngineModelCollisionRemove); LUA_DECLARE(EngineUpdateModelCollisionBoundingBox); LUA_DECLARE(IsModelCollisionLoaded); LUA_DECLARE(EngineRestoreOriginalCollision); From acf7efa4943d7ca9109487aed1d4c92db4555229 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Thu, 4 Oct 2018 07:02:36 +0200 Subject: [PATCH 18/50] removing triangles and vertices test --- Client/game_sa/CColModelSA.h | 139 ++++++++++++++++++ .../logic/luadefs/CLuaEngineDefs.cpp | 34 +++-- 2 files changed, 157 insertions(+), 16 deletions(-) diff --git a/Client/game_sa/CColModelSA.h b/Client/game_sa/CColModelSA.h index ceed04da845..09b88bb4760 100644 --- a/Client/game_sa/CColModelSA.h +++ b/Client/game_sa/CColModelSA.h @@ -218,6 +218,145 @@ typedef struct return false; } + std::vector getTrianglesByVertex(ushort usVertex) + { + std::vector vecTriangles; + CColTriangleSA colTriangle; + for (ushort i = 0; i < numColTriangles; i++) + { + colTriangle = pColTriangles[i]; + if (colTriangle.vertex[0] == usVertex || colTriangle.vertex[1] == usVertex || colTriangle.vertex[2] == usVertex) + vecTriangles.push_back(i); + } + return vecTriangles; + } + + void removeColBoxes(std::vector vecIndexes) + { + CColBoxSA* pBoxArray = new CColBoxSA[numColBoxes - vecIndexes.size()]; + ushort usIndex = 0; + for (ushort i = 0; i < numColBoxes; i++) + { + if (std::find(vecIndexes.begin(), vecIndexes.end(), i) == vecIndexes.end()) + { + pBoxArray[usIndex++] = pColBoxes[i]; + } + } + numColBoxes -= vecIndexes.size(); + pColBoxes = pBoxArray; + } + void removeColSpheres(std::vector vecIndexes) + { + CColSphereSA* pSphereArray = new CColSphereSA[numColSpheres - vecIndexes.size()]; + ushort usIndex = 0; + for (ushort i = 0; i < numColBoxes; i++) + { + if (std::find(vecIndexes.begin(), vecIndexes.end(), i) == vecIndexes.end()) + { + pSphereArray[usIndex++] = pColSpheres[i]; + } + } + numColSpheres -= vecIndexes.size(); + pColSpheres = pSphereArray; + } + void removeColTriangles(std::vector vecIndexes, bool removeVertices = true) + { + CColTriangleSA colTriangle; + if (removeVertices) + { + std::vector usIndexVertices; + for (ushort i = 0; i < numColTriangles; i++) + { + if (std::find(vecIndexes.begin(), vecIndexes.end(), i) != vecIndexes.end()) + { + colTriangle = pColTriangles[i]; + for (char k = 0; k < 3; k++) + { + if (getTrianglesByVertex(colTriangle.vertex[k]).size() <= 1) // remove if is used only by this triangle + { + usIndexVertices.push_back(colTriangle.vertex[k]); + } + } + } + } + if (usIndexVertices.size() > 0) + { + sort(usIndexVertices.begin(), usIndexVertices.end()); + usIndexVertices.erase(unique(usIndexVertices.begin(), usIndexVertices.end()), usIndexVertices.end()); + + removeColVertices(usIndexVertices, false); + } + } + + CColTriangleSA* pTriangleArray = reinterpret_cast(CMemoryMgr_Malloc((numColTriangles - vecIndexes.size()) * sizeof(CColTriangleSA))); + //new CColTriangleSA[numColTriangles - vecIndexes.size()]; + ushort usIndex = 0; + for (ushort i = 0; i < numColTriangles; i++) + { + if (std::find(vecIndexes.begin(), vecIndexes.end(), i) == vecIndexes.end()) + { + pTriangleArray[i] = pColTriangles[i]; + } + } + + + numColTriangles -= vecIndexes.size(); + pColTriangles = pTriangleArray; + } + + void removeColVertices(std::vector vecIndexes, bool removeTriangles = true) + { + ushort usVertices, usTotalVertices; + ushort usNumVertices = getNumVertices(); + usVertices = usNumVertices - vecIndexes.size(); + if (removeTriangles) + { + std::vector vecTriangles; + std::vector vecVertexTriangles; + for (ushort i = 0; i < usNumVertices; i++) + { + if (std::find(vecIndexes.begin(), vecIndexes.end(), i) != vecIndexes.end()) + { + vecVertexTriangles = getTrianglesByVertex(i); + vecTriangles.insert(vecTriangles.end(), vecVertexTriangles.begin(), vecVertexTriangles.end()); + } + } + sort(vecTriangles.begin(), vecTriangles.end()); + vecTriangles.erase(unique(vecTriangles.begin(), vecTriangles.end()), vecTriangles.end()); + removeColTriangles(vecTriangles, false); + } + + CompressedVector* pVerticesArray = reinterpret_cast(CMemoryMgr_Malloc((usNumVertices - vecIndexes.size()) * sizeof(CompressedVector))); + + //new CompressedVector[usVertices]; + + ushort usIndex = 0; + CColTriangleSA* colTriangle; + for (ushort i = 0; i < usNumVertices; i++) + { + if (std::find(vecIndexes.begin(), vecIndexes.end(), i) == vecIndexes.end()) + { + pVerticesArray[usIndex++] = pVertices[i]; + } + else + { + for (ushort triangleIndex = 0; triangleIndex < numColTriangles; triangleIndex++) + { + colTriangle = &pColTriangles[triangleIndex]; + for (char k = 0; k < 3; k++) + { + if (colTriangle->vertex[k] > i) + { + colTriangle->vertex[k]--; + } + } + } + } + } + + pVertices = pVerticesArray; + } + } CColDataSA; class CColModelSAInterface diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 7ad9c5d49b2..a93b1465080 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -1844,31 +1844,33 @@ int CLuaEngineDefs::EngineModelCollisionRemove(lua_State* luaVM) vecIndexes.erase(unique(vecIndexes.begin(), vecIndexes.end()), vecIndexes.end()); CColBoxSA* pBox; - CColBoxSA* newArr; + CColBoxSA* pBoxArray; + + CColSphereSA* pSphere; + CColSphereSA* pSphereArray; + ushort usIndex; switch (eCollisionShape) { case COLLISION_BOX: - newArr = new CColBoxSA[pColData->numColBoxes - vecIndexes.size()]; - usIndex = 0; - for (ushort i = 0; i < pColData->numColBoxes; i++) - { - if ( std::find(vecIndexes.begin(), vecIndexes.end(), i) == vecIndexes.end()) - { - pBox = &pColData->pColBoxes[i]; - newArr[usIndex] = *pBox; - usIndex++; - } - } - pColData->numColBoxes -= vecIndexes.size(); - pColData->pColBoxes = newArr; + pColData->removeColBoxes(vecIndexes); lua_pushboolean(luaVM, true); - lua_pushnumber(luaVM, usIndex); - return 2; + return 1; break; case COLLISION_SPHERE: + pColData->removeColSpheres(vecIndexes); + lua_pushboolean(luaVM, true); + return 1; break; case COLLISION_TRIANGLE: + pColData->removeColTriangles(vecIndexes); + lua_pushboolean(luaVM, true); + return 1; + break; + case COLLISION_VERTEX: + pColData->removeColVertices(vecIndexes); + lua_pushboolean(luaVM, true); + return 1; break; } } From b940020484317021e4bd5944fcdddff93bc7bb64 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sat, 6 Oct 2018 15:31:08 +0200 Subject: [PATCH 19/50] almost finished restoring, test for removing collision only removing boxes and spheres working --- Client/game_sa/CColModelSA.h | 128 +++++++++--------- .../logic/luadefs/CLuaEngineDefs.cpp | 48 ++++--- .../deathmatch/logic/luadefs/CLuaEngineDefs.h | 2 +- 3 files changed, 93 insertions(+), 85 deletions(-) diff --git a/Client/game_sa/CColModelSA.h b/Client/game_sa/CColModelSA.h index 09b88bb4760..21f4e592bc6 100644 --- a/Client/game_sa/CColModelSA.h +++ b/Client/game_sa/CColModelSA.h @@ -231,6 +231,19 @@ typedef struct return vecTriangles; } + std::map getVerticesUsage() + { + std::map verticesUsage; + for (ushort i = 0; i < numColTriangles; i++) + { + for (char cVertex = 0; cVertex < 3; cVertex++) + { + verticesUsage[pColTriangles[i].vertex[cVertex]]++; + } + } + return verticesUsage; + } + void removeColBoxes(std::vector vecIndexes) { CColBoxSA* pBoxArray = new CColBoxSA[numColBoxes - vecIndexes.size()]; @@ -259,52 +272,73 @@ typedef struct numColSpheres -= vecIndexes.size(); pColSpheres = pSphereArray; } - void removeColTriangles(std::vector vecIndexes, bool removeVertices = true) + void removeColTriangles(std::vector vecIndexes) { - CColTriangleSA colTriangle; - if (removeVertices) + CColTriangleSA* pTriangleArray = reinterpret_cast(CMemoryMgr_Malloc((numColTriangles - vecIndexes.size()) * sizeof(CColTriangleSA))); + ushort usIndex = 0; + for (ushort i = 0; i < numColTriangles; i++) { - std::vector usIndexVertices; - for (ushort i = 0; i < numColTriangles; i++) - { - if (std::find(vecIndexes.begin(), vecIndexes.end(), i) != vecIndexes.end()) - { - colTriangle = pColTriangles[i]; - for (char k = 0; k < 3; k++) - { - if (getTrianglesByVertex(colTriangle.vertex[k]).size() <= 1) // remove if is used only by this triangle - { - usIndexVertices.push_back(colTriangle.vertex[k]); - } - } - } - } - if (usIndexVertices.size() > 0) + if (std::find(vecIndexes.begin(), vecIndexes.end(), i) == vecIndexes.end()) { - sort(usIndexVertices.begin(), usIndexVertices.end()); - usIndexVertices.erase(unique(usIndexVertices.begin(), usIndexVertices.end()), usIndexVertices.end()); - - removeColVertices(usIndexVertices, false); + pTriangleArray[usIndex++] = pColTriangles[i]; } } - CColTriangleSA* pTriangleArray = reinterpret_cast(CMemoryMgr_Malloc((numColTriangles - vecIndexes.size()) * sizeof(CColTriangleSA))); - //new CColTriangleSA[numColTriangles - vecIndexes.size()]; + numColTriangles -= vecIndexes.size(); + pColTriangles = pTriangleArray; + + } + void removeColVertices(std::vector vecIndexes) + { + ushort usNumVertices = getNumVertices(); + CompressedVector* pVerticesArray = reinterpret_cast(CMemoryMgr_Malloc((usNumVertices - vecIndexes.size()) * sizeof(CompressedVector))); + ushort usIndex = 0; - for (ushort i = 0; i < numColTriangles; i++) + for (ushort i = 0; i < usNumVertices; i++) { if (std::find(vecIndexes.begin(), vecIndexes.end(), i) == vecIndexes.end()) { - pTriangleArray[i] = pColTriangles[i]; + pVerticesArray[usIndex++] = pVertices[i]; + } + else + { + } } - - numColTriangles -= vecIndexes.size(); - pColTriangles = pTriangleArray; + pVertices = pVerticesArray; } - void removeColVertices(std::vector vecIndexes, bool removeTriangles = true) + void removeColTriangles_(std::vector vecIndexes) + { + CColTriangleSA colTriangle; + std::vector usIndexVertices; + std::map verticesUsage = getVerticesUsage(); + for (ushort i = 0; i < numColTriangles; i++) + { + if (std::find(vecIndexes.begin(), vecIndexes.end(), i) != vecIndexes.end()) + { + colTriangle = pColTriangles[i]; + for (char k = 0; k < 3; k++) + { + if (verticesUsage[colTriangle.vertex[k]] <= 1) // remove if is used only by this triangle + { + usIndexVertices.push_back(colTriangle.vertex[k]); + verticesUsage[colTriangle.vertex[k]]--; + } + } + } + } + if (usIndexVertices.size() > 0) + { + sort(usIndexVertices.begin(), usIndexVertices.end()); + usIndexVertices.erase(unique(usIndexVertices.begin(), usIndexVertices.end()), usIndexVertices.end()); + removeColVertices(usIndexVertices); + } + removeColTriangles(vecIndexes); + } + /* + void removeColVertices_(std::vector vecIndexes) { ushort usVertices, usTotalVertices; ushort usNumVertices = getNumVertices(); @@ -325,37 +359,7 @@ typedef struct vecTriangles.erase(unique(vecTriangles.begin(), vecTriangles.end()), vecTriangles.end()); removeColTriangles(vecTriangles, false); } - - CompressedVector* pVerticesArray = reinterpret_cast(CMemoryMgr_Malloc((usNumVertices - vecIndexes.size()) * sizeof(CompressedVector))); - - //new CompressedVector[usVertices]; - - ushort usIndex = 0; - CColTriangleSA* colTriangle; - for (ushort i = 0; i < usNumVertices; i++) - { - if (std::find(vecIndexes.begin(), vecIndexes.end(), i) == vecIndexes.end()) - { - pVerticesArray[usIndex++] = pVertices[i]; - } - else - { - for (ushort triangleIndex = 0; triangleIndex < numColTriangles; triangleIndex++) - { - colTriangle = &pColTriangles[triangleIndex]; - for (char k = 0; k < 3; k++) - { - if (colTriangle->vertex[k] > i) - { - colTriangle->vertex[k]--; - } - } - } - } - } - - pVertices = pVerticesArray; - } + }*/ } CColDataSA; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index a93b1465080..f3e240cbb8e 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -45,7 +45,7 @@ void CLuaEngineDefs::LoadFunctions(void) {"engineModelCollisionCreate", EngineModelCollisionCreate }, {"engineModelCollisionRemove", EngineModelCollisionRemove }, {"isModelCollisionLoaded", IsModelCollisionLoaded }, - {"engineRestoreOriginalCollision", EngineRestoreOriginalCollision }, + {"engineRestoreOriginalCollisions", EngineRestoreOriginalCollisions }, // CLuaCFunctions::AddFunction ( "engineReplaceMatchingAtomics", EngineReplaceMatchingAtomics ); // CLuaCFunctions::AddFunction ( "engineReplaceWheelAtomics", EngineReplaceWheelAtomics ); @@ -1069,29 +1069,31 @@ bool checkVector(CVector& vec, float fRadius = 0) } //CColStore::RemoveAllCollision(void).text 00410E00 00000060 00000004 00000000 R . . . . . . - -typedef void(__cdecl * hRemoveModel) (void); -auto cRemoveModel = (hRemoveModel)0x410E00; - -int CLuaEngineDefs::EngineRestoreOriginalCollision(lua_State* luaVM) +//CStreaming::RemoveModel(int) .text 004089A0 000002C4 00000004 00000004 R . . . . T . + +typedef void(__cdecl * hRemoveAllCollision) (void); +auto cRemoveAllCollision = (hRemoveAllCollision)0x410E00; +typedef void(__cdecl * hRemoveModel) (int index); // index from 0 to 254 + 25000 ( 25000 - 25255 are collisions ) +auto cRemoveModel = (hRemoveModel)0x4089A0; + +struct CLASS_CColModelPoolStruct { + int m_pObjects; + int m_byteMap; + int m_nSize; + int top; + char m_bOwnsAllocations; + char bLocked; + char _pad[2]; +}; + +int CLuaEngineDefs::EngineRestoreOriginalCollisions(lua_State* luaVM) { - ushort usModel; CScriptArgReader argStream(luaVM); - argStream.ReadNumber(usModel); if (!argStream.HasErrors()) { - CColModelSAInterface* pCol; - if (GetModelCollisionInterface(usModel, pCol)) - { - cRemoveModel(); - lua_pushboolean(luaVM, true); - return 1; - } - else - { - lua_pushboolean(luaVM, false); - return 1; - } + cRemoveAllCollision(); + lua_pushboolean(luaVM, true); + return 1; } if (argStream.HasErrors()) m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); @@ -1863,12 +1865,14 @@ int CLuaEngineDefs::EngineModelCollisionRemove(lua_State* luaVM) return 1; break; case COLLISION_TRIANGLE: - pColData->removeColTriangles(vecIndexes); + pColData->removeColTriangles_(vecIndexes); + m_pManager->GetObjectManager()->RestreamObjects(usModel); + g_pGame->GetModelInfo(usModel)->RestreamIPL(); lua_pushboolean(luaVM, true); return 1; break; case COLLISION_VERTEX: - pColData->removeColVertices(vecIndexes); + //pColData->removeColVertices(vecIndexes); lua_pushboolean(luaVM, true); return 1; break; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h index ee4cffcc5e6..e6b530e7548 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h @@ -51,7 +51,7 @@ class CLuaEngineDefs : public CLuaDefs LUA_DECLARE(EngineModelCollisionRemove); LUA_DECLARE(EngineUpdateModelCollisionBoundingBox); LUA_DECLARE(IsModelCollisionLoaded); - LUA_DECLARE(EngineRestoreOriginalCollision); + LUA_DECLARE(EngineRestoreOriginalCollisions); private: static void AddEngineColClass(lua_State* luaVM); From 5e98d3c63e46d9fa45fe4b7e9d5355557b9ea009 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Wed, 21 Nov 2018 16:12:16 +0100 Subject: [PATCH 20/50] fix and removed create & destroy functions for future pr --- Client/game_sa/CColModelSA.h | 30 +- .../mods/deathmatch/logic/CClientColModel.cpp | 43 + .../mods/deathmatch/logic/CClientColModel.h | 5 + .../logic/luadefs/CLuaEngineDefs.cpp | 856 +++++------------- .../deathmatch/logic/luadefs/CLuaEngineDefs.h | 2 - vendor/lua/src/lapi.c | 8 + vendor/lua/src/lua.h | 1 + 7 files changed, 329 insertions(+), 616 deletions(-) diff --git a/Client/game_sa/CColModelSA.h b/Client/game_sa/CColModelSA.h index 21f4e592bc6..4c22d4b174a 100644 --- a/Client/game_sa/CColModelSA.h +++ b/Client/game_sa/CColModelSA.h @@ -35,6 +35,9 @@ typedef struct CVector vecCenter; float fRadius; uchar material; + uchar flags; + CColLighting lighting; + uchar light; } CColSphereSA; typedef struct @@ -42,6 +45,9 @@ typedef struct CVector min; CVector max; uchar material; + uchar flags; + CColLighting lighting; + uchar light; } CColBoxSA; typedef struct @@ -63,6 +69,26 @@ typedef struct char name[0x18]; } ColModelFileHeader; +typedef struct +{ + CVector m_vecStart; + float m_fStartSize; + CVector m_vecEnd; + float m_fEndSize; +} CColLine; + +typedef struct +{ + CVector m_vecStart; + float m_fStartRadius; + unsigned char m_nMaterial; + unsigned char m_nPiece; + unsigned char m_nLighting; + char _pad13; + CVector m_vecEnd; + float m_fEndRadius; +} CColDisk; + typedef struct { signed __int16 x; @@ -87,9 +113,9 @@ typedef struct WORD numColBoxes; WORD numColTriangles; BYTE ucNumWheels; - BYTE pad3; + BYTE m_nFlags; CColSphereSA* pColSpheres; - CColBoxSA* pColBoxes; + CColBoxSA* pColBoxes; void* pSuspensionLines; CompressedVector* pVertices; CColTriangleSA* pColTriangles; diff --git a/Client/mods/deathmatch/logic/CClientColModel.cpp b/Client/mods/deathmatch/logic/CClientColModel.cpp index 57d9ce27cdc..209852ac0f2 100644 --- a/Client/mods/deathmatch/logic/CClientColModel.cpp +++ b/Client/mods/deathmatch/logic/CClientColModel.cpp @@ -148,3 +148,46 @@ bool CClientColModel::IsCOLData(const SString& strData) { return strData.length() > 32 && memcmp(strData, "COL", 3) == 0 && strData[7] == 0; } + +CColModelSAInterface* CClientColModel::GetColModelInterface() +{ + if (m_pColModel) + { + return m_pColModel->GetInterface(); + } + return nullptr; +} + +bool CClientColModel::CheckVector(CVector& vec, float fRadius) +{ + if (fRadius > 0) + { + return (128 > vec.fX + fRadius > -128 && 128 > vec.fY + fRadius > -128 && 128 > vec.fZ + fRadius > -128) + && (128 > vec.fX - fRadius > -128 && 128 > vec.fY - fRadius > -128 && 128 > vec.fZ - fRadius > -128); + } + else + { + return (128 > vec.fX && vec.fX > -128 && 128 > vec.fY && vec.fY > -128 && 128 > vec.fZ && vec.fZ > -128); + } +} + +bool CClientColModel::CompareVector(CVector& vecMin, CVector& vecMax) +{ + return vecMax.fX >= vecMin.fX && vecMax.fY >= vecMin.fY && vecMax.fZ >= vecMin.fZ; +} +void CClientColModel::AlignVector(CVector& destMin, CVector& destMax, CVector& src) +{ + if (src.fX < destMax.fX) + destMax.fX = src.fX; + if (src.fY < destMax.fY) + destMax.fY = src.fY; + if (src.fZ < destMax.fZ) + destMax.fZ = src.fZ; + + if (src.fX > destMin.fX) + destMin.fX = src.fX; + if (src.fY > destMin.fY) + destMin.fY = src.fY; + if (src.fZ > destMin.fZ) + destMin.fZ = src.fZ; +} diff --git a/Client/mods/deathmatch/logic/CClientColModel.h b/Client/mods/deathmatch/logic/CClientColModel.h index 7a77cf6d2ee..e78f4a30617 100644 --- a/Client/mods/deathmatch/logic/CClientColModel.h +++ b/Client/mods/deathmatch/logic/CClientColModel.h @@ -31,6 +31,11 @@ class CClientColModel : public CClientEntity bool HasReplaced(unsigned short usModel); static bool IsCOLData(const SString& strData); + static bool CheckVector(CVector& vec, float fRadius = 0); + static bool CompareVector(CVector& vecMin, CVector& vecMax); + static void AlignVector(CVector& destMin, CVector& destMax, CVector& src); + + CColModelSAInterface* GetColModelInterface(); // Sorta a hack that these are required by CClientEntity... void Unlink(void){}; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index f3e240cbb8e..7969909b507 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -42,10 +42,7 @@ void CLuaEngineDefs::LoadFunctions(void) {"engineGetModelCollisionData", EngineGetModelCollisionData}, {"engineSetModelCollisionData", EngineSetModelCollisionData}, {"engineUpdateModelCollisionBoundingBox", EngineUpdateModelCollisionBoundingBox }, - {"engineModelCollisionCreate", EngineModelCollisionCreate }, - {"engineModelCollisionRemove", EngineModelCollisionRemove }, {"isModelCollisionLoaded", IsModelCollisionLoaded }, - {"engineRestoreOriginalCollisions", EngineRestoreOriginalCollisions }, // CLuaCFunctions::AddFunction ( "engineReplaceMatchingAtomics", EngineReplaceMatchingAtomics ); // CLuaCFunctions::AddFunction ( "engineReplaceWheelAtomics", EngineReplaceWheelAtomics ); @@ -926,174 +923,91 @@ int CLuaEngineDefs::EngineGetVisibleTextureNames(lua_State* luaVM) return 1; } -int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) -{ - ushort usModel; - CScriptArgReader argStream(luaVM); - argStream.ReadNumber(usModel); - - if (!argStream.HasErrors()) - { - if (CClientObjectManager::IsValidModel(usModel)) - { - CBaseModelInfoSAInterface* pModelInfo = ppModelInfo[usModel]; - if (pModelInfo != nullptr) - { - CColModelSAInterface* pCol = pModelInfo->pColModel; - if (pCol) - { - lua_newtable(luaVM); - lua_pushstring(luaVM, "boundingBox"); - lua_newtable(luaVM); - lua_pushstring(luaVM, "vecMin"); - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pCol->boundingBox.vecMin.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pCol->boundingBox.vecMin.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pCol->boundingBox.vecMin.fZ); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - - lua_pushstring(luaVM, "vecMax"); - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pCol->boundingBox.vecMax.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pCol->boundingBox.vecMax.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pCol->boundingBox.vecMax.fZ); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "vecOffset"); - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pCol->boundingBox.vecOffset.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pCol->boundingBox.vecOffset.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pCol->boundingBox.vecOffset.fZ); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "radius"); - lua_pushnumber(luaVM, pCol->boundingBox.fRadius); - lua_settable(luaVM, -3); - - CColDataSA* pColData = pCol->pColData; - if (pColData != nullptr) - { - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "colBoxes"); - lua_pushnumber(luaVM, pColData->numColBoxes); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "colSpheres"); - lua_pushnumber(luaVM, pColData->numColSpheres); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "colTriangles"); - lua_pushnumber(luaVM, pColData->numColTriangles); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "colVertices"); - lua_pushnumber(luaVM, pColData->getNumVertices()); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "shadowTriangles"); - lua_pushnumber(luaVM, pColData->m_nNumShadowTriangles); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "shadowVertices"); - lua_pushnumber(luaVM, pColData->m_nNumShadowVertices); - lua_settable(luaVM, -3); - } - - return 1; - } - } - } - } - if (argStream.HasErrors()) - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; -} - -bool GetModelCollisionInterface(ushort usModel, CColModelSAInterface* &pColModelInterface) +CColModelSAInterface* GetModelCollisionInterface(ushort usModel) { if (CClientObjectManager::IsValidModel(usModel)) { CBaseModelInfoSAInterface* pModelInfo = ppModelInfo[usModel]; if (pModelInfo != nullptr) { - pColModelInterface = pModelInfo->pColModel; + CColModelSAInterface* pColModelInterface = pModelInfo->pColModel; if (pColModelInterface) { - return true; + return pColModelInterface; } } } return false; } -void VectorAlign(CVector& destMin, CVector& destMax, CVector& src) -{ - if (src.fX < destMax.fX) - destMax.fX = src.fX; - if (src.fY < destMax.fY) - destMax.fY = src.fY; - if (src.fZ < destMax.fZ) - destMax.fZ = src.fZ; - - if (src.fX > destMin.fX) - destMin.fX = src.fX; - if (src.fY > destMin.fY) - destMin.fY = src.fY; - if (src.fZ > destMin.fZ) - destMin.fZ = src.fZ; -} -bool checkVector(CVector& vec, float fRadius = 0) +int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) { - if (fRadius > 0) - { - return (128 > vec.fX + fRadius > -128 && 128 > vec.fY + fRadius > -128 && 128 > vec.fZ + fRadius > -128) - && (128 > vec.fX - fRadius > -128 && 128 > vec.fY - fRadius > -128 && 128 > vec.fZ - fRadius > -128); - } + CClientColModel* pCol = NULL; + unsigned short usModel = 0; + CScriptArgReader argStream(luaVM); + // Grab the COL or model ID + // If COL element then read custom collision, otherwise read original collision + if( argStream.NextIsNumber()) + argStream.ReadNumber(usModel); else - { - return (128 > vec.fX > -128 && 128 > vec.fY > -128 && 128 > vec.fZ > -128); - } -} + argStream.ReadUserData(pCol); -//CColStore::RemoveAllCollision(void).text 00410E00 00000060 00000004 00000000 R . . . . . . -//CStreaming::RemoveModel(int) .text 004089A0 000002C4 00000004 00000004 R . . . . T . - -typedef void(__cdecl * hRemoveAllCollision) (void); -auto cRemoveAllCollision = (hRemoveAllCollision)0x410E00; -typedef void(__cdecl * hRemoveModel) (int index); // index from 0 to 254 + 25000 ( 25000 - 25255 are collisions ) -auto cRemoveModel = (hRemoveModel)0x4089A0; - -struct CLASS_CColModelPoolStruct { - int m_pObjects; - int m_byteMap; - int m_nSize; - int top; - char m_bOwnsAllocations; - char bLocked; - char _pad[2]; -}; - -int CLuaEngineDefs::EngineRestoreOriginalCollisions(lua_State* luaVM) -{ - CScriptArgReader argStream(luaVM); if (!argStream.HasErrors()) { - cRemoveAllCollision(); - lua_pushboolean(luaVM, true); - return 1; + CColModelSAInterface* pColModelSAInterface; + if (pCol) + pColModelSAInterface = pCol->GetColModelInterface(); + else + pColModelSAInterface = GetModelCollisionInterface(usModel); + + if (pColModelSAInterface) + { + lua_newtable(luaVM); + lua_pushstring(luaVM, "boundingBox"); + lua_newtable(luaVM); + lua_pushstring(luaVM, "vecMin"); + lua_newtable(luaVM); + lua_pushtablevalue(luaVM, 1, pColModelSAInterface->boundingBox.vecMin.fX); + lua_pushtablevalue(luaVM, 2, pColModelSAInterface->boundingBox.vecMin.fY); + lua_pushtablevalue(luaVM, 3, pColModelSAInterface->boundingBox.vecMin.fZ); + lua_settable(luaVM, -3); + + lua_pushstring(luaVM, "vecMax"); + lua_newtable(luaVM); + lua_pushtablevalue(luaVM, 1, pColModelSAInterface->boundingBox.vecMax.fX); + lua_pushtablevalue(luaVM, 2, pColModelSAInterface->boundingBox.vecMax.fY); + lua_pushtablevalue(luaVM, 3, pColModelSAInterface->boundingBox.vecMax.fZ); + lua_settable(luaVM, -3); + lua_pushstring(luaVM, "vecOffset"); + lua_newtable(luaVM); + lua_pushtablevalue(luaVM, 1, pColModelSAInterface->boundingBox.vecOffset.fX); + lua_pushtablevalue(luaVM, 2, pColModelSAInterface->boundingBox.vecOffset.fY); + lua_pushtablevalue(luaVM, 3, pColModelSAInterface->boundingBox.vecOffset.fZ); + lua_settable(luaVM, -3); + lua_pushstring(luaVM, "radius"); + lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.fRadius); + lua_settable(luaVM, -3); + + CColDataSA* pColData = pColModelSAInterface->pColData; + if (pColData != nullptr) + { + lua_settable(luaVM, -3); + lua_pushstring(luaVM, "colBoxes"); + lua_pushnumber(luaVM, pColData->numColBoxes); + lua_settable(luaVM, -3); + lua_pushstring(luaVM, "colSpheres"); + lua_pushnumber(luaVM, pColData->numColSpheres); + lua_settable(luaVM, -3); + lua_pushstring(luaVM, "colTriangles"); + lua_pushnumber(luaVM, pColData->numColTriangles); + lua_settable(luaVM, -3); + lua_pushstring(luaVM, "colVertices"); + lua_pushnumber(luaVM, pColData->getNumVertices()); + lua_settable(luaVM, -3); + } + + return 1; + } } if (argStream.HasErrors()) m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); @@ -1109,8 +1023,7 @@ int CLuaEngineDefs::IsModelCollisionLoaded(lua_State* luaVM) argStream.ReadNumber(usModel); if (!argStream.HasErrors()) { - CColModelSAInterface* pCol; - lua_pushboolean(luaVM, GetModelCollisionInterface(usModel, pCol)); + lua_pushboolean(luaVM, GetModelCollisionInterface(usModel) != nullptr); return 1; } if (argStream.HasErrors()) @@ -1122,18 +1035,32 @@ int CLuaEngineDefs::IsModelCollisionLoaded(lua_State* luaVM) int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { - ushort usModel, usIndex; - eCollisionShapes eCollisionShape; + CClientColModel* pCol = NULL; + unsigned short usModel = 0; CScriptArgReader argStream(luaVM); - argStream.ReadNumber(usModel); - argStream.ReadEnumString(eCollisionShape); - argStream.ReadNumber(usIndex, 0); + // Grab the COL or model ID + // If COL element then read custom collision, otherwise read original collision + if (argStream.NextIsNumber()) + argStream.ReadNumber(usModel); + else + argStream.ReadUserData(pCol); + if (!argStream.HasErrors()) { - CColModelSAInterface* pCol; - if (GetModelCollisionInterface(usModel, pCol)) + CColModelSAInterface* pColModelSAInterface; + if (pCol) + pColModelSAInterface = pCol->GetColModelInterface(); + else + pColModelSAInterface = GetModelCollisionInterface(usModel); + + if (pColModelSAInterface) { - CColDataSA* pColData = pCol->pColData; + + ushort usIndex; + eCollisionShapes eCollisionShape; + argStream.ReadEnumString(eCollisionShape); + argStream.ReadNumber(usIndex, 0); + CColDataSA* pColData = pColModelSAInterface->pColData; if (pColData) { switch (eCollisionShape) @@ -1146,26 +1073,15 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { CColBoxSA pBox = pColData->pColBoxes[usIndex]; lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pBox.min.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pBox.min.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pBox.min.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pBox.max.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pBox.max.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pBox.max.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 7); - lua_pushnumber(luaVM, pBox.material); + lua_pushtablevalue(luaVM, 1, pBox.min.fX); + lua_pushtablevalue(luaVM, 2, pBox.min.fY); + lua_pushtablevalue(luaVM, 3, pBox.min.fZ); + lua_pushtablevalue(luaVM, 4, pBox.max.fX); + lua_pushtablevalue(luaVM, 5, pBox.max.fY); + lua_pushtablevalue(luaVM, 6, pBox.max.fZ); + lua_pushtablevalue(luaVM, 7, pBox.material); + lua_pushtablevalue(luaVM, 8, pBox.lighting.day); + lua_pushtablevalue(luaVM, 9, pBox.lighting.night); lua_settable(luaVM, -3); return 1; } @@ -1184,27 +1100,15 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) lua_pushnumber(luaVM, i + 1); CColBoxSA pBox = pColData->pColBoxes[i]; lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pBox.min.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pBox.min.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pBox.min.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pBox.max.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pBox.max.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pBox.max.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 7); - lua_pushnumber(luaVM, pBox.material); - lua_settable(luaVM, -3); + lua_pushtablevalue(luaVM, 1, pBox.min.fX); + lua_pushtablevalue(luaVM, 2, pBox.min.fY); + lua_pushtablevalue(luaVM, 3, pBox.min.fZ); + lua_pushtablevalue(luaVM, 4, pBox.max.fX); + lua_pushtablevalue(luaVM, 5, pBox.max.fY); + lua_pushtablevalue(luaVM, 6, pBox.max.fZ); + lua_pushtablevalue(luaVM, 7, pBox.material); + lua_pushtablevalue(luaVM, 8, pBox.lighting.day); + lua_pushtablevalue(luaVM, 9, pBox.lighting.night); lua_settable(luaVM, -3); } return 1; @@ -1218,20 +1122,13 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { CColSphereSA pSphere = pColData->pColSpheres[usIndex]; lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pSphere.vecCenter.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pSphere.vecCenter.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pSphere.vecCenter.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pSphere.fRadius); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pSphere.material); + lua_pushtablevalue(luaVM, 1, pSphere.vecCenter.fX); + lua_pushtablevalue(luaVM, 2, pSphere.vecCenter.fY); + lua_pushtablevalue(luaVM, 3, pSphere.vecCenter.fZ); + lua_pushtablevalue(luaVM, 4, pSphere.fRadius); + lua_pushtablevalue(luaVM, 5, pSphere.material); + lua_pushtablevalue(luaVM, 6, pSphere.lighting.day); + lua_pushtablevalue(luaVM, 7, pSphere.lighting.night); lua_settable(luaVM, -3); return 1; } @@ -1246,26 +1143,19 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) else { lua_newtable(luaVM); + CColSphereSA pSphere; for (uint i = 0; pColData->numColSpheres > i; i++) { lua_pushnumber(luaVM, i + 1); - CColSphereSA pSphere = pColData->pColSpheres[i]; + pSphere = pColData->pColSpheres[i]; lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pSphere.vecCenter.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pSphere.vecCenter.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pSphere.vecCenter.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pSphere.fRadius); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pSphere.material); - lua_settable(luaVM, -3); + lua_pushtablevalue(luaVM, 1, pSphere.vecCenter.fX); + lua_pushtablevalue(luaVM, 2, pSphere.vecCenter.fY); + lua_pushtablevalue(luaVM, 3, pSphere.vecCenter.fZ); + lua_pushtablevalue(luaVM, 4, pSphere.fRadius); + lua_pushtablevalue(luaVM, 5, pSphere.material); + lua_pushtablevalue(luaVM, 6, pSphere.lighting.day); + lua_pushtablevalue(luaVM, 7, pSphere.lighting.night); lua_settable(luaVM, -3); } return 1; @@ -1279,23 +1169,12 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { CColTriangleSA pTriangle = pColData->pColTriangles[usIndex]; lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pTriangle.vertex[0] + 1); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pTriangle.vertex[1] + 1); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pTriangle.vertex[2] + 1); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pTriangle.material); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pTriangle.lighting.day); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pTriangle.lighting.night); + lua_pushtablevalue(luaVM, 1, pTriangle.vertex[0] + 1); + lua_pushtablevalue(luaVM, 2, pTriangle.vertex[1] + 1); + lua_pushtablevalue(luaVM, 3, pTriangle.vertex[2] + 1); + lua_pushtablevalue(luaVM, 4, pTriangle.material); + lua_pushtablevalue(luaVM, 5, pTriangle.lighting.day); + lua_pushtablevalue(luaVM, 6, pTriangle.lighting.night); lua_settable(luaVM, -3); return 1; } @@ -1310,29 +1189,18 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) else { lua_newtable(luaVM); + CColTriangleSA pTriangle; for (uint i = 0; pColData->numColTriangles > i; i++) { lua_pushnumber(luaVM, i + 1); - CColTriangleSA pTriangle = pColData->pColTriangles[i]; + pTriangle = pColData->pColTriangles[i]; lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pTriangle.vertex[0] + 1); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pTriangle.vertex[1] + 1); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pTriangle.vertex[2] + 1); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pTriangle.material); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pTriangle.lighting.day); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pTriangle.lighting.night); - lua_settable(luaVM, -3); + lua_pushtablevalue(luaVM, 1, pTriangle.vertex[0] + 1); + lua_pushtablevalue(luaVM, 2, pTriangle.vertex[1] + 1); + lua_pushtablevalue(luaVM, 3, pTriangle.vertex[2] + 1); + lua_pushtablevalue(luaVM, 4, pTriangle.material); + lua_pushtablevalue(luaVM, 5, pTriangle.lighting.day); + lua_pushtablevalue(luaVM, 6, pTriangle.lighting.night); lua_settable(luaVM, -3); } return 1; @@ -1347,14 +1215,9 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) CompressedVector pTriangle = pColData->pVertices[usIndex]; lua_newtable(luaVM); CVector vec = pTriangle.getVector(); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, vec.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, vec.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, vec.fZ); + lua_pushtablevalue(luaVM, 1, vec.fX); + lua_pushtablevalue(luaVM, 2, vec.fY); + lua_pushtablevalue(luaVM, 3, vec.fZ); lua_settable(luaVM, -3); return 1; } @@ -1372,20 +1235,15 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) lua_newtable(luaVM); std::map::iterator it; + CVector vec; for (it = vecVertices.begin(); it != vecVertices.end(); it++) { lua_pushnumber(luaVM, it->first + 1); lua_newtable(luaVM); - CVector vec = it->second.getVector(); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, vec.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, vec.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, vec.fZ); - lua_settable(luaVM, -3); + vec = it->second.getVector(); + lua_pushtablevalue(luaVM, 1, vec.fX); + lua_pushtablevalue(luaVM, 2, vec.fY); + lua_pushtablevalue(luaVM, 3, vec.fZ); lua_settable(luaVM, -3); } return 1; @@ -1404,18 +1262,22 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) { - ushort usModel; + CClientColModel* pCol = NULL; + CVector vecCenter; CScriptArgReader argStream(luaVM); - CVector center; - argStream.ReadNumber(usModel); - argStream.ReadVector3D(center, CVector(0,0,0)); + argStream.ReadUserData(pCol); + argStream.ReadVector3D(vecCenter, CVector(0, 0, 0)); + if (!argStream.HasErrors()) { - CColModelSAInterface* pCol; - if (GetModelCollisionInterface(usModel, pCol)) + CColModelSAInterface* pColModelSAInterface; + if (pCol) + pColModelSAInterface = pCol->GetColModelInterface(); + + if (pColModelSAInterface) { - CColDataSA* pColData = pCol->pColData; - CBoundingBoxSA* pBoundingBox = &pCol->boundingBox; + CColDataSA* pColData = pColModelSAInterface->pColData; + CBoundingBoxSA* pBoundingBox = &pColModelSAInterface->boundingBox; float fRadius = 0; CVector minVec(0, 0, 0); CVector maxVec(0, 0, 0); @@ -1429,38 +1291,28 @@ int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) pBox = pColData->pColBoxes[i]; pBoxMaxVec = pBox.max; pBoxMinVec = pBox.min; - fDis = DistanceBetweenPoints3D(pBoxMaxVec, center); - if (fDis > fRadius) - { - fRadius = fDis; - } - VectorAlign(maxVec, minVec, pBoxMinVec); - VectorAlign(maxVec, minVec, pBoxMaxVec); + fRadius = std::max(DistanceBetweenPoints3D(pBoxMaxVec, vecCenter), fRadius); + + CClientColModel::AlignVector(maxVec, minVec, pBoxMinVec); + CClientColModel::AlignVector(maxVec, minVec, pBoxMaxVec); } for (uint i = 0; pColData->numColSpheres > i; i++) { pSphere = pColData->pColSpheres[i]; pBoxMaxVec = pSphere.vecCenter; - VectorAlign(maxVec, minVec, pBoxMaxVec); + CClientColModel::AlignVector(maxVec, minVec, pBoxMaxVec); pBoxMaxVec.fX += pSphere.fRadius; pBoxMaxVec.fY += pSphere.fRadius; pBoxMaxVec.fZ += pSphere.fRadius; - VectorAlign(maxVec, minVec, pBoxMaxVec); - fDis = DistanceBetweenPoints3D(pBoxMaxVec, center); - if (fDis > fRadius) - { - fRadius = fDis; - } + CClientColModel::AlignVector(maxVec, minVec, pBoxMaxVec); + fRadius = std::max(DistanceBetweenPoints3D(pBoxMaxVec, vecCenter), fRadius); + pBoxMaxVec.fX -= pSphere.fRadius * 2; pBoxMaxVec.fY -= pSphere.fRadius * 2; pBoxMaxVec.fZ -= pSphere.fRadius * 2; - VectorAlign(maxVec, minVec, pBoxMaxVec); - fDis = DistanceBetweenPoints3D(pBoxMaxVec, center); - if (fDis > fRadius) - { - fRadius = fDis; - } + CClientColModel::AlignVector(maxVec, minVec, pBoxMaxVec); + fRadius = std::max(DistanceBetweenPoints3D(pBoxMaxVec, vecCenter), fRadius); } std::map vecVertices = pColData->getAllVertices(); @@ -1468,15 +1320,11 @@ int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) for (it = vecVertices.begin(); it != vecVertices.end(); it++) { pBoxMaxVec = it->second.getVector(); - VectorAlign(maxVec, minVec, pBoxMaxVec); - fDis = DistanceBetweenPoints3D(pBoxMaxVec, center); - if (fDis > fRadius) - { - fRadius = fDis; - } + CClientColModel::AlignVector(maxVec, minVec, pBoxMaxVec); + fRadius = std::max(DistanceBetweenPoints3D(pBoxMaxVec, vecCenter), fRadius); } pBoundingBox->fRadius = fRadius; - pBoundingBox->vecOffset = center; + pBoundingBox->vecOffset = vecCenter; pBoundingBox->vecMax = maxVec; pBoundingBox->vecMin = minVec; lua_pushboolean(luaVM, true); @@ -1488,7 +1336,7 @@ int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) } int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) { - ushort usModel; + CClientColModel* pCol = NULL; ushort usShapeId; std::vector vecShapeId; eCollisionShapes eCollisionShape; @@ -1496,12 +1344,14 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) CVector vec1, vec2, vec3; uchar cSurface; float fNumber; + bool bBool; uchar cDay,cNight; ushort sVertex[3]; float fPosition[3]; CScriptArgReader argStream(luaVM); - argStream.ReadNumber(usModel); + argStream.ReadUserData(pCol); argStream.ReadEnumString(eCollisionShape); + argStream.ReadEnumString(eCollisionKey); if (argStream.NextIsNumber()) { argStream.ReadNumber(usShapeId); @@ -1510,13 +1360,16 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) else argStream.ReadNumberTable(vecShapeId); - argStream.ReadEnumString(eCollisionKey); + if (!argStream.HasErrors()) { - CColModelSAInterface* pCol; - if (GetModelCollisionInterface(usModel, pCol)) + CColModelSAInterface* pColModelSAInterface; + if (pCol) + pColModelSAInterface = pCol->GetColModelInterface(); + + if (pColModelSAInterface) { - CColDataSA* pColData = pCol->pColData; + CColDataSA* pColData = pColModelSAInterface->pColData; ushort numVertices = pColData->getNumVertices(); for (int i = 0; i != vecShapeId.size(); i++) { vecShapeId[i]--; @@ -1550,20 +1403,61 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) } } case COLLISION_KEY_SIZE: - argStream.ReadVector3D(vec1); - argStream.ReadVector3D(vec2); - if (!argStream.HasErrors()) + if (argStream.NextIsBool()) { - if (checkVector(vec1) && checkVector(vec2)) + argStream.ReadBool(bBool); // true = min, false = max + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + if (CClientColModel::CheckVector(vec1)) { - pBox = &pColData->pColBoxes[*it]; - pBox->min = vec1; - pBox->max = vec2; + if (bBool) + { + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + { + pBox = &pColData->pColBoxes[*it]; + if (CClientColModel::CompareVector(vec1, pBox->max)) + { + pBox->min = vec1; + } + } + } + else + { + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + { + pBox = &pColData->pColBoxes[*it]; + if (CClientColModel::CompareVector(pBox->min, vec1)) + { + pBox->max = vec1; + } + } + } + lua_pushboolean(luaVM, true); + return 1; + } + } + } + else + { + argStream.ReadVector3D(vec1); + argStream.ReadVector3D(vec2); + if (!argStream.HasErrors()) + { + if (CClientColModel::CheckVector(vec1) && CClientColModel::CheckVector(vec2)) + { + if (CClientColModel::CompareVector(vec1, vec2)) + { + for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + { + pBox = &pColData->pColBoxes[*it]; + pBox->min = vec1; + pBox->max = vec2; + } + lua_pushboolean(luaVM, true); + return 1; + } } - lua_pushboolean(luaVM, true); - return 1; } } case COLLISION_KEY_POSITION: @@ -1573,22 +1467,14 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { pBox = &pColData->pColBoxes[*it]; - vec2 = CVector(pBox->min.fX + pBox->max.fX, pBox->min.fY + pBox->max.fY, pBox->min.fZ + pBox->max.fZ); - vec2.fX = sqrt(vec2.fX); - vec2.fY = sqrt(vec2.fY); - vec2.fZ = sqrt(vec2.fZ); - vec3 = pBox->min - (vec1 + vec2); - if (checkVector(vec3)) + vec2 = CVector(pBox->min.fX + pBox->max.fX, pBox->min.fY + pBox->max.fY, pBox->min.fZ + pBox->max.fZ) / 2; + vec3 = pBox->min + (vec1 - vec2); + if (CClientColModel::CheckVector(vec3)) { - pBox->min -= vec1 + vec2; - vec2 = CVector(pBox->max.fX * pBox->max.fX, pBox->max.fY * pBox->max.fY, pBox->max.fZ * pBox->max.fZ); - vec2.fX = sqrt(vec2.fX); - vec2.fY = sqrt(vec2.fY); - vec2.fZ = sqrt(vec2.fZ); - if (checkVector(pBox->max - (vec1 + vec2))) + if (CClientColModel::CheckVector(pBox->max + (vec1 - vec2))) { pBox->min = vec3; - pBox->max -= vec1 + vec2; + pBox->max += (vec1 - vec2); } } } @@ -1603,7 +1489,7 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { pBox = &pColData->pColBoxes[*it]; - if (checkVector(pBox->min + vec1) && checkVector(pBox->max + vec1)) + if (CClientColModel::CheckVector(pBox->min + vec1) && CClientColModel::CheckVector(pBox->max + vec1)) { pBox->min += vec1; pBox->max += vec1; @@ -1624,13 +1510,13 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) argStream.ReadVector3D(vec1); if (!argStream.HasErrors()) { - if (checkVector(vec1)) + if (CClientColModel::CheckVector(vec1)) { for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { ushort val = *it; pSphere = &pColData->pColSpheres[*it]; - if (checkVector(vec1, pSphere->fRadius)) + if (CClientColModel::CheckVector(vec1, pSphere->fRadius)) { pSphere->vecCenter = vec1; } @@ -1646,7 +1532,7 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { pSphere = &pColData->pColSpheres[*it]; - if (checkVector(pSphere->vecCenter + vec1, pSphere->fRadius)) + if (CClientColModel::CheckVector(pSphere->vecCenter + vec1, pSphere->fRadius)) pSphere->vecCenter += vec1; } lua_pushboolean(luaVM, true); @@ -1661,7 +1547,7 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { pSphere = &pColData->pColSpheres[*it]; - if (checkVector(pSphere->vecCenter, fNumber)) + if (CClientColModel::CheckVector(pSphere->vecCenter, fNumber)) pSphere->fRadius = fNumber; } lua_pushboolean(luaVM, true); @@ -1769,7 +1655,7 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) argStream.ReadVector3D(vec1); if (!argStream.HasErrors()) { - if (checkVector(vec1)) + if (CClientColModel::CheckVector(vec1)) { for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { @@ -1784,7 +1670,7 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) argStream.ReadVector3D(vec1); if (!argStream.HasErrors()) { - if (checkVector(vec1)) + if (CClientColModel::CheckVector(vec1)) { for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) { @@ -1807,257 +1693,3 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) lua_pushboolean(luaVM, false); return 1; } - -int CLuaEngineDefs::EngineModelCollisionRemove(lua_State* luaVM) -{ - ushort usModel, usIndex; - float fRadius; - std::vector vecIndexes; - eCollisionShapes eCollisionShape; - CScriptArgReader argStream(luaVM); - argStream.ReadNumber(usModel); - argStream.ReadEnumString(eCollisionShape); - if (argStream.NextIsNumber()) - { - argStream.ReadNumber(usIndex); - vecIndexes.push_back(usIndex); - } - else - argStream.ReadNumberTable(vecIndexes); - - if (!argStream.HasErrors()) - { - CColModelSAInterface* pCol; - if (GetModelCollisionInterface(usModel, pCol)) - { - CColDataSA* pColData = pCol->pColData; - ushort numVertices = pColData->getNumVertices(); - for (int i = 0; i != vecIndexes.size(); i++) { - vecIndexes[i]--; - if (!pColData->isValidIndex(eCollisionShape, vecIndexes[i], numVertices)) - { - lua_pushboolean(luaVM, false); - lua_pushnumber(luaVM, vecIndexes[i]); // return which is invalid - return 2; - } - } - - sort(vecIndexes.begin(), vecIndexes.end()); - vecIndexes.erase(unique(vecIndexes.begin(), vecIndexes.end()), vecIndexes.end()); - - CColBoxSA* pBox; - CColBoxSA* pBoxArray; - - CColSphereSA* pSphere; - CColSphereSA* pSphereArray; - - ushort usIndex; - switch (eCollisionShape) - { - case COLLISION_BOX: - pColData->removeColBoxes(vecIndexes); - lua_pushboolean(luaVM, true); - return 1; - break; - case COLLISION_SPHERE: - pColData->removeColSpheres(vecIndexes); - lua_pushboolean(luaVM, true); - return 1; - break; - case COLLISION_TRIANGLE: - pColData->removeColTriangles_(vecIndexes); - m_pManager->GetObjectManager()->RestreamObjects(usModel); - g_pGame->GetModelInfo(usModel)->RestreamIPL(); - lua_pushboolean(luaVM, true); - return 1; - break; - case COLLISION_VERTEX: - //pColData->removeColVertices(vecIndexes); - lua_pushboolean(luaVM, true); - return 1; - break; - } - } - } - if (argStream.HasErrors()) - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; -} - -int CLuaEngineDefs::EngineModelCollisionCreate(lua_State* luaVM) -{ - ushort usModel; - float fRadius; - eCollisionShapes eCollisionShape; - CScriptArgReader argStream(luaVM); - argStream.ReadNumber(usModel); - argStream.ReadEnumString(eCollisionShape); - - if (!argStream.HasErrors()) - { - CColModelSAInterface* pCol; - if (GetModelCollisionInterface(usModel, pCol)) - { - CColDataSA* pColData = pCol->pColData; - - CVector vecArray[3]; - ushort usArray[3]; - uchar cMaterial; - char cLighting[2]; - switch (eCollisionShape) - { - case COLLISION_BOX: - argStream.ReadVector3D(vecArray[0]); - argStream.ReadVector3D(vecArray[1]); - argStream.ReadNumber(cMaterial, 0); - if (!argStream.HasErrors()) - { - for (int i = 0; i < 2; i++) - { - if (!checkVector(vecArray[i])) - { - argStream.SetCustomError(SString("Position at argument %i is out of bounding.", i + 2)); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - } - lua_pushnumber(luaVM, pColData->createCollisionBox(vecArray[0], vecArray[1], cMaterial)); - return 1; - } - break; - case COLLISION_SPHERE: - argStream.ReadVector3D(vecArray[0]); - argStream.ReadNumber(fRadius); - argStream.ReadNumber(cMaterial, 0); - if (!argStream.HasErrors()) - { - if (!checkVector(vecArray[0])) - { - argStream.SetCustomError("Position at argument 3 is out of bounding."); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - lua_pushnumber(luaVM, pColData->createCollisionSphere(vecArray[0], fRadius, cMaterial)); - return 1; - } - break; - case COLLISION_TRIANGLE: - // vertex, vertex, vertex[, material = 0, dayLight = 12, nightLight = 6] - // vertex is number ( vertex id ), or vector3d - // if is used second verion, there is another argument ( by default = 0 ) determining distance to nearest vertex - - bool bVersion = false; // true = 3x ushort, false = 3x CVector - if (argStream.NextIsVector3D() && argStream.NextIsVector3D(1) && argStream.NextIsVector3D(2)) - { - argStream.ReadVector3D(vecArray[0]); - argStream.ReadVector3D(vecArray[1]); - argStream.ReadVector3D(vecArray[2]); - bVersion = true; - } - else if (argStream.NextIsNumber() && argStream.NextIsNumber(1) && argStream.NextIsNumber(2)) - { - argStream.ReadNumber(usArray[0]); - argStream.ReadNumber(usArray[1]); - argStream.ReadNumber(usArray[2]); - bVersion = false; - } - else - { - argStream.SetCustomError("Expected 3 vector3d or integers at arguments 3, 4 and 5."); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - - argStream.ReadNumber(cMaterial, 0); - argStream.ReadNumber(cLighting[0], 12); // @todo, find best values - argStream.ReadNumber(cLighting[1], 6); // @todo, find best values - argStream.ReadNumber(fRadius, 0); // ignored for 3x vertices - - if (!argStream.HasErrors()) - { - if (cMaterial < EColSurfaceValue::DEFAULT || cMaterial > EColSurfaceValue::RAILTRACK) - { - argStream.SetCustomError("Expected valid material id between 0 and 178"); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - - if (cLighting[0] < 0 || cLighting[0] > 15) - { - argStream.SetCustomError("Expected valid day lighting between 0 and 15"); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - if (cLighting[1] < 0 || cLighting[1] > 15) - { - argStream.SetCustomError("Expected valid night lighting between 0 and 15"); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - - if (bVersion) - { - for (int i = 0; i < 3; i++) // check vectors - { - if (!checkVector(vecArray[i])) - { - argStream.SetCustomError(SString("Position at argument %i is out of bounding.", argStream.m_iIndex + i)); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - } - - ushort usVertices[3]; - usVertices[0] = pColData->createCollisionVertex(vecArray[0]); - usVertices[1] = pColData->createCollisionVertex(vecArray[1], 1); - usVertices[2] = pColData->createCollisionVertex(vecArray[2], 2); - CColLighting colLighting; - colLighting.day = cLighting[0]; - colLighting.night = cLighting[1]; - lua_pushnumber(luaVM, pColData->createCollisionTriangle(usVertices[0] - 1, usVertices[1] - 1, usVertices[2] - 1, colLighting, cMaterial)); - return 1; - } - else - { - ushort usNumVertices = pColData->getNumVertices(); - - for (int i = 0; i < 3; i++) // 0-X instead of 1-X & check vertices - { - usArray[i]--; - if (usArray[0] < 0 || usArray[0] > usNumVertices) - { - argStream.SetCustomError(SString("Vertex id at argument %i", i + 2 )); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - } - - if (fRadius < 0 || fRadius > 500) // this make no sense if someone pass others values - { - argStream.SetCustomError("Expected valid distance between 0 and 500"); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - } - } - break; - } - } - } - if (argStream.HasErrors()) - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; -} diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h index e6b530e7548..ec6c236bee0 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h @@ -47,8 +47,6 @@ class CLuaEngineDefs : public CLuaDefs LUA_DECLARE(EngineGetModelCollisionProperties); LUA_DECLARE(EngineGetModelCollisionData); LUA_DECLARE(EngineSetModelCollisionData); - LUA_DECLARE(EngineModelCollisionCreate); - LUA_DECLARE(EngineModelCollisionRemove); LUA_DECLARE(EngineUpdateModelCollisionBoundingBox); LUA_DECLARE(IsModelCollisionLoaded); LUA_DECLARE(EngineRestoreOriginalCollisions); diff --git a/vendor/lua/src/lapi.c b/vendor/lua/src/lapi.c index 88b1a8ac6a4..2b2cc305b1c 100644 --- a/vendor/lua/src/lapi.c +++ b/vendor/lua/src/lapi.c @@ -1134,3 +1134,11 @@ LUA_API void lua_addtotalbytes(lua_State *L, int n) global_State *g = G(L); g->totalbytes += n; } + +// MTA addition to shorten the code mainly for collision functions +LUA_API void lua_pushtablevalue(lua_State *L, int n, float v) +{ + lua_pushnumber(L, n); + lua_pushnumber(L, v); + lua_settable(L, -3); +} diff --git a/vendor/lua/src/lua.h b/vendor/lua/src/lua.h index 8223e5792d1..514e89a9bef 100644 --- a/vendor/lua/src/lua.h +++ b/vendor/lua/src/lua.h @@ -185,6 +185,7 @@ LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n); LUA_API void (lua_pushboolean) (lua_State *L, int b); LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p); LUA_API int (lua_pushthread) (lua_State *L); +LUA_API void (lua_pushtablevalue) (lua_State *L, int n, float v); /* ** get functions (Lua -> stack) From 82f9dfa8fd9c02919ac64f775910c24740e175ad Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sun, 25 Nov 2018 19:00:39 +0100 Subject: [PATCH 21/50] refactor, updated each function, removed create/remove functions --- Client/game_sa/CColModelSA.h | 209 +------- .../mods/deathmatch/logic/CClientColModel.cpp | 36 +- .../mods/deathmatch/logic/CClientColModel.h | 17 +- .../logic/luadefs/CLuaEngineDefs.cpp | 452 +++++++++++------- vendor/lua/src/lapi.c | 1 + 5 files changed, 318 insertions(+), 397 deletions(-) diff --git a/Client/game_sa/CColModelSA.h b/Client/game_sa/CColModelSA.h index 4c22d4b174a..9b3bfe63588 100644 --- a/Client/game_sa/CColModelSA.h +++ b/Client/game_sa/CColModelSA.h @@ -17,11 +17,6 @@ #define FUNC_CColModel_Constructor 0x40FB60 #define FUNC_CColModel_Destructor 0x40F700 -typedef void *(__cdecl * hCMemoryMgr_Malloc) (unsigned int size); -auto CMemoryMgr_Malloc = (hCMemoryMgr_Malloc)0x72F420; -typedef void(__cdecl * hCMemoryMgr_Free) (void *memory); -auto CMemoryMgr_Free = (hCMemoryMgr_Free)0x72F430; - typedef struct { CVector vecMin; @@ -100,9 +95,9 @@ typedef struct } void setVector(CVector vec) { - x = vec.fX * 128; - y = vec.fY * 128; - z = vec.fZ * 128; + x = static_cast(vec.fX * 128); + y = static_cast(vec.fY * 128); + z = static_cast(vec.fZ * 128); } } CompressedVector; @@ -125,78 +120,6 @@ typedef struct CompressedVector* m_pShadowVertices; CColTriangleSA* m_pShadowTriangles; - ushort createCollisionBox(CVector vecMin, CVector vecMax, uchar cMaterial = 0) - { - CColBoxSA* newArr = new CColBoxSA[numColBoxes + 1]; - memcpy(newArr, pColBoxes, sizeof(CColBoxSA) * numColBoxes); - - CColBoxSA* newBox = new CColBoxSA; - memcpy(newArr + sizeof(CColBoxSA) * numColBoxes, newBox, sizeof(CColBoxSA)); - - CColBoxSA* lastBox = &newArr[numColBoxes]; - lastBox->min = vecMin; - lastBox->max = vecMax; - lastBox->material = cMaterial; - numColBoxes++; - pColBoxes = newArr; - return numColBoxes; - } - - ushort createCollisionSphere(CVector vecPosition, float fRadius, uchar cMaterial = 0) - { - CColSphereSA* newArr = new CColSphereSA[numColSpheres + 1]; - memcpy(newArr, pColSpheres, sizeof(CColSphereSA) * numColSpheres); - - CColSphereSA* newSphere = new CColSphereSA; - memcpy(newArr + sizeof(CColSphereSA) * numColSpheres, newSphere, sizeof(CColSphereSA)); - - CColSphereSA* lastSphere = &newArr[numColSpheres]; - lastSphere->vecCenter = vecPosition; - lastSphere->material = cMaterial; - lastSphere->fRadius = fRadius; - numColSpheres++; - pColSpheres = newArr; - return numColSpheres; - } - - ushort createCollisionTriangle(ushort usVertex1, ushort usVertex2, ushort usVertex3, CColLighting cLighting, uchar cMaterial = 0) - { - DWORD dwSizeInBytes = sizeof(CColTriangleSA) * numColTriangles; - CColTriangleSA* newArr = reinterpret_cast(CMemoryMgr_Malloc(dwSizeInBytes + sizeof(CColTriangleSA))); - - memcpy(newArr, pColTriangles, dwSizeInBytes); - - CColTriangleSA* newTriangle = new CColTriangleSA; - memcpy((unsigned char*)newArr + dwSizeInBytes, newTriangle, sizeof(CColTriangleSA)); - - CColTriangleSA* lastTriangle = &newArr[numColTriangles]; - lastTriangle->vertex[0] = usVertex1; - lastTriangle->vertex[1] = usVertex2; - lastTriangle->vertex[2] = usVertex3; - lastTriangle->lighting = cLighting; - lastTriangle->material = cMaterial; - numColTriangles++; - //CMemoryMgr_Free(reinterpret_cast(pColTriangles)); - pColTriangles = newArr; - return numColTriangles; - } - - ushort createCollisionVertex(CVector vecPosition, uchar ucAddedSize = 0) // we don't know how many vertices already is - { - ushort numVertices = getNumVertices() + ucAddedSize; - CompressedVector* newPVertices = reinterpret_cast(CMemoryMgr_Malloc(sizeof(CompressedVector) * numVertices + sizeof(CompressedVector))); - memcpy(newPVertices, pVertices, sizeof(CompressedVector) * numVertices); - - CompressedVector* newVertex = new CompressedVector; - memcpy(newPVertices + sizeof(CompressedVector) * numVertices, newVertex, sizeof(CompressedVector)); - - CompressedVector* lastVertex = &newPVertices[numVertices]; - lastVertex->setVector(vecPosition); - //CMemoryMgr_Free(reinterpret_cast(pColTriangles)); - pVertices = newPVertices; - return numVertices + 1; - } - std::map getAllVertices() { std::map vertices; @@ -208,7 +131,7 @@ typedef struct } return vertices; } - ushort getNumVertices() + size_t getNumVertices() { std::map vertices; for (uint i = 0; numColTriangles > i; i++) @@ -234,11 +157,7 @@ typedef struct return (usIndex >= 0 && usIndex < numColTriangles); break; case 3: - if (numVertices == 0) - { - numVertices = getNumVertices(); - } - return (usIndex >= 0 && usIndex < numVertices); + return (usIndex >= 0 && usIndex < numVertices); break; } return false; @@ -269,124 +188,6 @@ typedef struct } return verticesUsage; } - - void removeColBoxes(std::vector vecIndexes) - { - CColBoxSA* pBoxArray = new CColBoxSA[numColBoxes - vecIndexes.size()]; - ushort usIndex = 0; - for (ushort i = 0; i < numColBoxes; i++) - { - if (std::find(vecIndexes.begin(), vecIndexes.end(), i) == vecIndexes.end()) - { - pBoxArray[usIndex++] = pColBoxes[i]; - } - } - numColBoxes -= vecIndexes.size(); - pColBoxes = pBoxArray; - } - void removeColSpheres(std::vector vecIndexes) - { - CColSphereSA* pSphereArray = new CColSphereSA[numColSpheres - vecIndexes.size()]; - ushort usIndex = 0; - for (ushort i = 0; i < numColBoxes; i++) - { - if (std::find(vecIndexes.begin(), vecIndexes.end(), i) == vecIndexes.end()) - { - pSphereArray[usIndex++] = pColSpheres[i]; - } - } - numColSpheres -= vecIndexes.size(); - pColSpheres = pSphereArray; - } - void removeColTriangles(std::vector vecIndexes) - { - CColTriangleSA* pTriangleArray = reinterpret_cast(CMemoryMgr_Malloc((numColTriangles - vecIndexes.size()) * sizeof(CColTriangleSA))); - ushort usIndex = 0; - for (ushort i = 0; i < numColTriangles; i++) - { - if (std::find(vecIndexes.begin(), vecIndexes.end(), i) == vecIndexes.end()) - { - pTriangleArray[usIndex++] = pColTriangles[i]; - } - } - - numColTriangles -= vecIndexes.size(); - pColTriangles = pTriangleArray; - - } - void removeColVertices(std::vector vecIndexes) - { - ushort usNumVertices = getNumVertices(); - CompressedVector* pVerticesArray = reinterpret_cast(CMemoryMgr_Malloc((usNumVertices - vecIndexes.size()) * sizeof(CompressedVector))); - - ushort usIndex = 0; - for (ushort i = 0; i < usNumVertices; i++) - { - if (std::find(vecIndexes.begin(), vecIndexes.end(), i) == vecIndexes.end()) - { - pVerticesArray[usIndex++] = pVertices[i]; - } - else - { - - } - } - - pVertices = pVerticesArray; - } - - void removeColTriangles_(std::vector vecIndexes) - { - CColTriangleSA colTriangle; - std::vector usIndexVertices; - std::map verticesUsage = getVerticesUsage(); - for (ushort i = 0; i < numColTriangles; i++) - { - if (std::find(vecIndexes.begin(), vecIndexes.end(), i) != vecIndexes.end()) - { - colTriangle = pColTriangles[i]; - for (char k = 0; k < 3; k++) - { - if (verticesUsage[colTriangle.vertex[k]] <= 1) // remove if is used only by this triangle - { - usIndexVertices.push_back(colTriangle.vertex[k]); - verticesUsage[colTriangle.vertex[k]]--; - } - } - } - } - if (usIndexVertices.size() > 0) - { - sort(usIndexVertices.begin(), usIndexVertices.end()); - usIndexVertices.erase(unique(usIndexVertices.begin(), usIndexVertices.end()), usIndexVertices.end()); - removeColVertices(usIndexVertices); - } - removeColTriangles(vecIndexes); - } - /* - void removeColVertices_(std::vector vecIndexes) - { - ushort usVertices, usTotalVertices; - ushort usNumVertices = getNumVertices(); - usVertices = usNumVertices - vecIndexes.size(); - if (removeTriangles) - { - std::vector vecTriangles; - std::vector vecVertexTriangles; - for (ushort i = 0; i < usNumVertices; i++) - { - if (std::find(vecIndexes.begin(), vecIndexes.end(), i) != vecIndexes.end()) - { - vecVertexTriangles = getTrianglesByVertex(i); - vecTriangles.insert(vecTriangles.end(), vecVertexTriangles.begin(), vecVertexTriangles.end()); - } - } - sort(vecTriangles.begin(), vecTriangles.end()); - vecTriangles.erase(unique(vecTriangles.begin(), vecTriangles.end()), vecTriangles.end()); - removeColTriangles(vecTriangles, false); - } - }*/ - } CColDataSA; class CColModelSAInterface diff --git a/Client/mods/deathmatch/logic/CClientColModel.cpp b/Client/mods/deathmatch/logic/CClientColModel.cpp index 209852ac0f2..7174ce86f32 100644 --- a/Client/mods/deathmatch/logic/CClientColModel.cpp +++ b/Client/mods/deathmatch/logic/CClientColModel.cpp @@ -9,6 +9,10 @@ *****************************************************************************/ #include "StdInc.h" +#include "../Client/game_sa/CModelInfoSA.h" +#include "../Client/game_sa/CColModelSA.h" +#define MAX_COLLISION_SIZE 128 // collision bounding box in each axis +#define MAX_COLLISION_SIZE2 256 // twice bigger than MAX_COLLISION_SIZE CClientColModel::CClientColModel(CClientManager* pManager, ElementID ID) : ClassInit(this), CClientEntity(ID) { @@ -162,12 +166,25 @@ bool CClientColModel::CheckVector(CVector& vec, float fRadius) { if (fRadius > 0) { - return (128 > vec.fX + fRadius > -128 && 128 > vec.fY + fRadius > -128 && 128 > vec.fZ + fRadius > -128) - && (128 > vec.fX - fRadius > -128 && 128 > vec.fY - fRadius > -128 && 128 > vec.fZ - fRadius > -128); + return (MAX_COLLISION_SIZE >= vec.fX + fRadius && vec.fX + fRadius >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fY + fRadius && vec.fY + fRadius >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fZ + fRadius && vec.fZ + fRadius >= -MAX_COLLISION_SIZE) + && (MAX_COLLISION_SIZE >= vec.fX - fRadius && vec.fX - fRadius >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fY - fRadius && vec.fY - fRadius >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fZ - fRadius && vec.fZ - fRadius >= -MAX_COLLISION_SIZE); } else { - return (128 > vec.fX && vec.fX > -128 && 128 > vec.fY && vec.fY > -128 && 128 > vec.fZ && vec.fZ > -128); + return (MAX_COLLISION_SIZE >= vec.fX && vec.fX >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fY && vec.fY >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fZ && vec.fZ >= -MAX_COLLISION_SIZE); + } +} + +bool CClientColModel::CheckMoveVector(CVector& vec, float fRadius) +{ + if (fRadius > 0) + { + return ((MAX_COLLISION_SIZE2 >= vec.fX + fRadius >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fY + fRadius >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fZ + fRadius >= -MAX_COLLISION_SIZE2) + && (MAX_COLLISION_SIZE2 >= vec.fX - fRadius >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fY - fRadius >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fZ - fRadius >= -MAX_COLLISION_SIZE2)); + } + else + { + return (MAX_COLLISION_SIZE2 >= vec.fX && vec.fX >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fY && vec.fY >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fZ && vec.fZ >= -MAX_COLLISION_SIZE2); } } @@ -175,6 +192,7 @@ bool CClientColModel::CompareVector(CVector& vecMin, CVector& vecMax) { return vecMax.fX >= vecMin.fX && vecMax.fY >= vecMin.fY && vecMax.fZ >= vecMin.fZ; } + void CClientColModel::AlignVector(CVector& destMin, CVector& destMax, CVector& src) { if (src.fX < destMax.fX) @@ -191,3 +209,15 @@ void CClientColModel::AlignVector(CVector& destMin, CVector& destMax, CVector& s if (src.fZ > destMin.fZ) destMin.fZ = src.fZ; } + +void CClientColModel::UpdateVerticesCount() +{ + CColModelSAInterface* a = GetColModelInterface(); + + CColDataSA* pColData = a->pColData;; + + if (pColData) + { + m_usVerticesCount = static_cast(pColData->getNumVertices()); + } +} diff --git a/Client/mods/deathmatch/logic/CClientColModel.h b/Client/mods/deathmatch/logic/CClientColModel.h index e78f4a30617..022c90d4b4f 100644 --- a/Client/mods/deathmatch/logic/CClientColModel.h +++ b/Client/mods/deathmatch/logic/CClientColModel.h @@ -22,8 +22,11 @@ class CClientColModel : public CClientEntity eClientEntityType GetType(void) const { return CCLIENTCOL; } - bool LoadCol(const SString& strFile, bool bIsRawData); - bool IsLoaded(void) { return m_pColModel != NULL; }; + bool LoadCol(const SString& strFile, bool bIsRawData); + bool IsLoaded(void) { return m_pColModel != NULL; }; + unsigned short GetVerticesCount() { return m_usVerticesCount; }; + void SetCollisionHasChanged(bool bChanged) { b_hasChanged = bChanged; }; + bool HasChanged() { return b_hasChanged; }; bool Replace(unsigned short usModel); void Restore(unsigned short usModel); @@ -32,8 +35,11 @@ class CClientColModel : public CClientEntity bool HasReplaced(unsigned short usModel); static bool IsCOLData(const SString& strData); static bool CheckVector(CVector& vec, float fRadius = 0); + static bool CheckMoveVector(CVector& vec, float fRadius = 0); + static bool CompareVector(CVector& vecMin, CVector& vecMax); static void AlignVector(CVector& destMin, CVector& destMax, CVector& src); + void UpdateVerticesCount(); CColModelSAInterface* GetColModelInterface(); @@ -46,7 +52,8 @@ class CClientColModel : public CClientEntity void InternalRestore(unsigned short usModel); class CClientColModelManager* m_pColModelManager; - - CColModel* m_pColModel; - std::list m_Replaced; + unsigned short m_usVerticesCount; + CColModel* m_pColModel; + std::list m_Replaced; + bool b_hasChanged; // For updating bounding box, update only if necessary. True default due object loaded collision could have wrong bounding box. }; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 7969909b507..5438adc794e 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -13,6 +13,7 @@ #include "../Client/game_sa/CModelInfoSA.h" #include "../Client/game_sa/CColModelSA.h" + CBaseModelInfoSAInterface** ppModelInfo = (CBaseModelInfoSAInterface**)ARRAY_ModelInfo; void CLuaEngineDefs::LoadFunctions(void) @@ -151,6 +152,12 @@ int CLuaEngineDefs::EngineLoadCOL(lua_State* luaVM) // Success. Make it a child of the resource collision root pCol->SetParent(pRoot); + // Calculate amount of vertices for future operations + pCol->UpdateVerticesCount(); + + // Let user update bounding box if default is invalid. + pCol->SetCollisionHasChanged(true); + // Return the created col model lua_pushelement(luaVM, pCol); return 1; @@ -1002,7 +1009,14 @@ int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) lua_pushnumber(luaVM, pColData->numColTriangles); lua_settable(luaVM, -3); lua_pushstring(luaVM, "colVertices"); - lua_pushnumber(luaVM, pColData->getNumVertices()); + if (pCol) + { + lua_pushnumber(luaVM, pCol->GetVerticesCount()); + } + else + { + lua_pushnumber(luaVM, pColData->getNumVertices()); + } lua_settable(luaVM, -3); } @@ -1169,14 +1183,15 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { CColTriangleSA pTriangle = pColData->pColTriangles[usIndex]; lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pTriangle.vertex[0] + 1); - lua_pushtablevalue(luaVM, 2, pTriangle.vertex[1] + 1); - lua_pushtablevalue(luaVM, 3, pTriangle.vertex[2] + 1); - lua_pushtablevalue(luaVM, 4, pTriangle.material); - lua_pushtablevalue(luaVM, 5, pTriangle.lighting.day); - lua_pushtablevalue(luaVM, 6, pTriangle.lighting.night); + lua_pushtablevalue(luaVM, 1, static_cast(pTriangle.vertex[0] + 1)); + lua_pushtablevalue(luaVM, 2, static_cast(pTriangle.vertex[1] + 1)); + lua_pushtablevalue(luaVM, 3, static_cast(pTriangle.vertex[2] + 1)); + lua_pushtablevalue(luaVM, 4, static_cast(pTriangle.material)); + lua_pushtablevalue(luaVM, 5, static_cast(pTriangle.lighting.day)); + lua_pushtablevalue(luaVM, 6, static_cast(pTriangle.lighting.night)); lua_settable(luaVM, -3); return 1; + } else { @@ -1195,9 +1210,9 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) lua_pushnumber(luaVM, i + 1); pTriangle = pColData->pColTriangles[i]; lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pTriangle.vertex[0] + 1); - lua_pushtablevalue(luaVM, 2, pTriangle.vertex[1] + 1); - lua_pushtablevalue(luaVM, 3, pTriangle.vertex[2] + 1); + lua_pushtablevalue(luaVM, 1, static_cast(pTriangle.vertex[0] + 1)); + lua_pushtablevalue(luaVM, 2, static_cast(pTriangle.vertex[1] + 1)); + lua_pushtablevalue(luaVM, 3, static_cast(pTriangle.vertex[2] + 1)); lua_pushtablevalue(luaVM, 4, pTriangle.material); lua_pushtablevalue(luaVM, 5, pTriangle.lighting.day); lua_pushtablevalue(luaVM, 6, pTriangle.lighting.night); @@ -1210,7 +1225,17 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) if (usIndex > 0) { usIndex--; - if (pColData->isValidIndex(COLLISION_VERTEX, usIndex)) + unsigned short usNumVertices; + if (pCol) + { + usNumVertices = pCol->GetVerticesCount(); + } + else + { + usNumVertices = pColData->getNumVertices(); + } + + if (pColData->isValidIndex(COLLISION_VERTEX, usIndex, usNumVertices)) { CompressedVector pTriangle = pColData->pVertices[usIndex]; lua_newtable(luaVM); @@ -1231,16 +1256,26 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) } else { - std::map vecVertices = pColData->getAllVertices(); - lua_newtable(luaVM); + unsigned short usNumVertices; + if (pCol) + { + usNumVertices = pCol->GetVerticesCount(); + } + else + { + usNumVertices = pColData->getNumVertices(); + } - std::map::iterator it; CVector vec; - for (it = vecVertices.begin(); it != vecVertices.end(); it++) + CompressedVector pVertex; + + lua_newtable(luaVM); + for (ushort i = 0; i < usNumVertices; i++) { - lua_pushnumber(luaVM, it->first + 1); + lua_pushnumber(luaVM, i + 1); lua_newtable(luaVM); - vec = it->second.getVector(); + pVertex = pColData->pVertices[i]; + vec = pVertex.getVector(); lua_pushtablevalue(luaVM, 1, vec.fX); lua_pushtablevalue(luaVM, 2, vec.fY); lua_pushtablevalue(luaVM, 3, vec.fZ); @@ -1276,57 +1311,53 @@ int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) if (pColModelSAInterface) { + if (!pCol->HasChanged()) + { + lua_pushboolean(luaVM, true); // bounding box already updated. + return 1; + } CColDataSA* pColData = pColModelSAInterface->pColData; CBoundingBoxSA* pBoundingBox = &pColModelSAInterface->boundingBox; - float fRadius = 0; CVector minVec(0, 0, 0); CVector maxVec(0, 0, 0); CVector pBoxMinVec, pBoxMaxVec; CColSphereSA pSphere; CColBoxSA pBox; - float fDis; for (uint i = 0; pColData->numColBoxes > i; i++) { pBox = pColData->pColBoxes[i]; - pBoxMaxVec = pBox.max; - pBoxMinVec = pBox.min; - fRadius = std::max(DistanceBetweenPoints3D(pBoxMaxVec, vecCenter), fRadius); - - CClientColModel::AlignVector(maxVec, minVec, pBoxMinVec); - CClientColModel::AlignVector(maxVec, minVec, pBoxMaxVec); + CClientColModel::AlignVector(maxVec, minVec, pBox.min); + CClientColModel::AlignVector(maxVec, minVec, pBox.max); } for (uint i = 0; pColData->numColSpheres > i; i++) { pSphere = pColData->pColSpheres[i]; pBoxMaxVec = pSphere.vecCenter; - CClientColModel::AlignVector(maxVec, minVec, pBoxMaxVec); pBoxMaxVec.fX += pSphere.fRadius; pBoxMaxVec.fY += pSphere.fRadius; pBoxMaxVec.fZ += pSphere.fRadius; CClientColModel::AlignVector(maxVec, minVec, pBoxMaxVec); - fRadius = std::max(DistanceBetweenPoints3D(pBoxMaxVec, vecCenter), fRadius); pBoxMaxVec.fX -= pSphere.fRadius * 2; pBoxMaxVec.fY -= pSphere.fRadius * 2; pBoxMaxVec.fZ -= pSphere.fRadius * 2; CClientColModel::AlignVector(maxVec, minVec, pBoxMaxVec); - fRadius = std::max(DistanceBetweenPoints3D(pBoxMaxVec, vecCenter), fRadius); } std::map vecVertices = pColData->getAllVertices(); std::map::iterator it; for (it = vecVertices.begin(); it != vecVertices.end(); it++) { - pBoxMaxVec = it->second.getVector(); - CClientColModel::AlignVector(maxVec, minVec, pBoxMaxVec); - fRadius = std::max(DistanceBetweenPoints3D(pBoxMaxVec, vecCenter), fRadius); + CClientColModel::AlignVector(maxVec, minVec, it->second.getVector()); } - pBoundingBox->fRadius = fRadius; + + pBoundingBox->fRadius = std::max(DistanceBetweenPoints3D(maxVec, vecCenter), DistanceBetweenPoints3D(minVec, vecCenter)); pBoundingBox->vecOffset = vecCenter; pBoundingBox->vecMax = maxVec; pBoundingBox->vecMin = minVec; + pCol->SetCollisionHasChanged(false); lua_pushboolean(luaVM, true); return 1; } @@ -1334,108 +1365,120 @@ int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) lua_pushboolean(luaVM, false); return 1; } + int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) { CClientColModel* pCol = NULL; - ushort usShapeId; - std::vector vecShapeId; + std::vector vecUncheckedShapeId, vecShapeId, vecFailed; eCollisionShapes eCollisionShape; eCollisionKey eCollisionKey; - CVector vec1, vec2, vec3; - uchar cSurface; - float fNumber; - bool bBool; - uchar cDay,cNight; - ushort sVertex[3]; - float fPosition[3]; CScriptArgReader argStream(luaVM); argStream.ReadUserData(pCol); argStream.ReadEnumString(eCollisionShape); argStream.ReadEnumString(eCollisionKey); if (argStream.NextIsNumber()) { + uint usShapeId; argStream.ReadNumber(usShapeId); - vecShapeId.push_back(usShapeId); + vecUncheckedShapeId.push_back(usShapeId); } else - argStream.ReadNumberTable(vecShapeId); - + argStream.ReadNumberTable(vecUncheckedShapeId); + CColModelSAInterface* pColModelSAInterface; if (!argStream.HasErrors()) { - CColModelSAInterface* pColModelSAInterface; if (pCol) pColModelSAInterface = pCol->GetColModelInterface(); if (pColModelSAInterface) { CColDataSA* pColData = pColModelSAInterface->pColData; - ushort numVertices = pColData->getNumVertices(); - for (int i = 0; i != vecShapeId.size(); i++) { - vecShapeId[i]--; - if (!pColData->isValidIndex(eCollisionShape, vecShapeId[i], numVertices)) - { - lua_pushboolean(luaVM, false); - lua_pushnumber(luaVM, vecShapeId[i]); // return which is invalid - return 2; - } + ushort numVertices = pCol->GetVerticesCount(); + for (ushort i = 0; i != vecUncheckedShapeId.size(); i++) { + if (pColData->isValidIndex(eCollisionShape, vecUncheckedShapeId[i] - 1, numVertices)) + vecShapeId.push_back(vecUncheckedShapeId[i] - 1); + else + vecFailed.push_back(vecUncheckedShapeId[i] - 1); } - switch (eCollisionShape) + std::sort(vecShapeId.begin(), vecShapeId.end()); + vecShapeId.erase(unique(vecShapeId.begin(), vecShapeId.end()), vecShapeId.end()); + + if (vecFailed.size() == 0) { + CVector vec1, vec2; + + switch (eCollisionShape) + { case COLLISION_BOX: - CColBoxSA* pBox; + CColBoxSA * pBox; switch (eCollisionKey) { case COLLISION_KEY_MATERIAL: + uint cSurface; argStream.ReadNumber(cSurface); if (!argStream.HasErrors()) { if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + for (unsigned int it : vecShapeId) { - pBox = &pColData->pColBoxes[*it]; + pBox = &pColData->pColBoxes[it]; pBox->material = cSurface; } - lua_pushboolean(luaVM, true); - return 1; } + else + argStream.SetCustomError("Invalid material id."); } + break; case COLLISION_KEY_SIZE: if (argStream.NextIsBool()) { - argStream.ReadBool(bBool); // true = min, false = max + bool bMinVector; + argStream.ReadBool(bMinVector); // true = min, false = max argStream.ReadVector3D(vec1); if (!argStream.HasErrors()) { if (CClientColModel::CheckVector(vec1)) { - if (bBool) + if (bMinVector) { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + for (unsigned int it : vecShapeId) + { + pBox = &pColData->pColBoxes[it]; + if (!CClientColModel::CompareVector(vec1, pBox->max)) + vecFailed.push_back(it); + } + if (vecFailed.size() == 0) { - pBox = &pColData->pColBoxes[*it]; - if (CClientColModel::CompareVector(vec1, pBox->max)) + for (unsigned int it : vecShapeId) { + pBox = &pColData->pColBoxes[it]; pBox->min = vec1; } } } else { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + for (unsigned int it : vecShapeId) + { + pBox = &pColData->pColBoxes[it]; + if (!CClientColModel::CompareVector(pBox->min, vec1)) + vecFailed.push_back(it); + } + if (vecFailed.size() == 0) { - pBox = &pColData->pColBoxes[*it]; - if (CClientColModel::CompareVector(pBox->min, vec1)) + for (unsigned int it : vecShapeId) { + pBox = &pColData->pColBoxes[it]; pBox->max = vec1; } } } - lua_pushboolean(luaVM, true); - return 1; } + else + argStream.SetCustomError("Position is out of bounding box."); } } else @@ -1444,66 +1487,77 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) argStream.ReadVector3D(vec2); if (!argStream.HasErrors()) { - if (CClientColModel::CheckVector(vec1) && CClientColModel::CheckVector(vec2)) + if (CClientColModel::CheckVector(vec1)) { - if (CClientColModel::CompareVector(vec1, vec2)) + if (CClientColModel::CheckVector(vec2)) { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + if (CClientColModel::CompareVector(vec1, vec2)) { - pBox = &pColData->pColBoxes[*it]; - pBox->min = vec1; - pBox->max = vec2; + for (unsigned int it : vecShapeId) + { + pBox = &pColData->pColBoxes[it]; + pBox->min = vec1; + pBox->max = vec2; + } } - lua_pushboolean(luaVM, true); - return 1; + else + argStream.SetCustomError("Second position need to be greater than first."); } + else + argStream.SetCustomError("Second position is out of bounding box."); } + else + argStream.SetCustomError("First position is out of bounding box."); } } + break; case COLLISION_KEY_POSITION: argStream.ReadVector3D(vec1); if (!argStream.HasErrors()) { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + for (unsigned int it : vecShapeId) { - pBox = &pColData->pColBoxes[*it]; + pBox = &pColData->pColBoxes[it]; vec2 = CVector(pBox->min.fX + pBox->max.fX, pBox->min.fY + pBox->max.fY, pBox->min.fZ + pBox->max.fZ) / 2; - vec3 = pBox->min + (vec1 - vec2); - if (CClientColModel::CheckVector(vec3)) + if (!CClientColModel::CheckVector(pBox->min + (vec1 - vec2)) || !CClientColModel::CheckVector(pBox->max + (vec1 - vec2))) + vecFailed.push_back(it); + } + if (vecFailed.size()) + { + for (unsigned int it : vecShapeId) { - if (CClientColModel::CheckVector(pBox->max + (vec1 - vec2))) - { - pBox->min = vec3; - pBox->max += (vec1 - vec2); - } + pBox = &pColData->pColBoxes[it]; + vec2 = CVector(pBox->min.fX + pBox->max.fX, pBox->min.fY + pBox->max.fY, pBox->min.fZ + pBox->max.fZ) / 2; + pBox->min += (vec1 - vec2); + pBox->max += (vec1 - vec2); } } - lua_pushboolean(luaVM, true); - return 1; } break; case COLLISION_KEY_MOVE: argStream.ReadVector3D(vec1); if (!argStream.HasErrors()) { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + for (unsigned int it : vecShapeId) { - pBox = &pColData->pColBoxes[*it]; - if (CClientColModel::CheckVector(pBox->min + vec1) && CClientColModel::CheckVector(pBox->max + vec1)) + pBox = &pColData->pColBoxes[it]; + if (!(CClientColModel::CheckVector(pBox->min + vec1) && CClientColModel::CheckVector(pBox->max + vec1))) + vecFailed.push_back(it); + } + if (vecFailed.size() == 0) + { + for (unsigned int it : vecShapeId) { + pBox = &pColData->pColBoxes[it]; pBox->min += vec1; pBox->max += vec1; } } - lua_pushboolean(luaVM, true); - return 1; } - break; - } - break; + break; case COLLISION_SPHERE: - CColSphereSA* pSphere; + CColSphereSA * pSphere; switch (eCollisionKey) { case COLLISION_KEY_POSITION: @@ -1512,141 +1566,142 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) { if (CClientColModel::CheckVector(vec1)) { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + for (unsigned int it : vecShapeId) { - ushort val = *it; - pSphere = &pColData->pColSpheres[*it]; - if (CClientColModel::CheckVector(vec1, pSphere->fRadius)) + pSphere = &pColData->pColSpheres[it]; + if (!CClientColModel::CheckVector(vec1, pSphere->fRadius)) { + vecFailed.push_back(it); + } + } + + if (vecFailed.size() == 0) + { + for (unsigned int it : vecShapeId) + { + pSphere = &pColData->pColSpheres[it]; pSphere->vecCenter = vec1; } } - lua_pushboolean(luaVM, true); - return 1; } + else + argStream.SetCustomError("First position is out of bounding box."); } + break; case COLLISION_KEY_MOVE: argStream.ReadVector3D(vec1); if (!argStream.HasErrors()) { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + if (CClientColModel::CheckMoveVector(vec1)) { - pSphere = &pColData->pColSpheres[*it]; - if (CClientColModel::CheckVector(pSphere->vecCenter + vec1, pSphere->fRadius)) - pSphere->vecCenter += vec1; + for (unsigned int it : vecShapeId) + { + pSphere = &pColData->pColSpheres[it]; + if (!CClientColModel::CheckVector(pSphere->vecCenter + vec1, pSphere->fRadius)) + vecFailed.push_back(it); + } + if (vecFailed.size() == 0) + { + for (unsigned int it : vecShapeId) + { + pSphere = &pColData->pColSpheres[it]; + pSphere->vecCenter += vec1; + } + } } - lua_pushboolean(luaVM, true); - return 1; + else + argStream.SetCustomError("You can't move furher than 256 units in each axis."); } + break; case COLLISION_KEY_RADIUS: - argStream.ReadNumber(fNumber); + float fRadius; + argStream.ReadNumber(fRadius); if (!argStream.HasErrors()) { - if (fNumber >= 0 && fNumber <= 256) // bigger than 256 are sure that are outside bounding + if (fRadius >= 0 && fRadius <= 256) // bigger than 256 are sure that are outside bounding { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + for (unsigned int it : vecShapeId) { - pSphere = &pColData->pColSpheres[*it]; - if (CClientColModel::CheckVector(pSphere->vecCenter, fNumber)) - pSphere->fRadius = fNumber; + pSphere = &pColData->pColSpheres[it]; + if (!CClientColModel::CheckVector(pSphere->vecCenter, fRadius)) + vecFailed.push_back(it); + } + if (vecFailed.size() == 0) + { + for (unsigned int it : vecShapeId) + { + pSphere = &pColData->pColSpheres[it]; + pSphere->fRadius = fRadius; + } } - lua_pushboolean(luaVM, true); - return 1; } + else + argStream.SetCustomError("Radius must be between 0 and 256."); } - break; case COLLISION_KEY_MATERIAL: + uint cSurface; argStream.ReadNumber(cSurface); if (!argStream.HasErrors()) { if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + for (unsigned int it : vecShapeId) { - pSphere = &pColData->pColSpheres[*it]; + pSphere = &pColData->pColSpheres[it]; pSphere->material = cSurface; } - lua_pushboolean(luaVM, true); - return 1; } + else + argStream.SetCustomError("Invalid material id."); } } - break; + break; case COLLISION_TRIANGLE: - CColTriangleSA* pTriangle; + CColTriangleSA * pTriangle; switch (eCollisionKey) { case COLLISION_KEY_MATERIAL: + uint cSurface; argStream.ReadNumber(cSurface); if (!argStream.HasErrors()) { if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + for (unsigned int it : vecShapeId) { - pTriangle = &pColData->pColTriangles[*it]; + pTriangle = &pColData->pColTriangles[it]; pTriangle->material = cSurface; } - lua_pushboolean(luaVM, true); - return 1; } + else + argStream.SetCustomError("Invalid material id."); } case COLLISION_KEY_LIGHTING: + uint cDay, cNight; argStream.ReadNumber(cDay); argStream.ReadNumber(cNight); if (!argStream.HasErrors()) { - if (cDay >= 0 && cDay <= 15 && cNight >= 0 && cNight <= 15) - { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) - { - pTriangle = &pColData->pColTriangles[*it]; - pTriangle->lighting.day = cDay; - pTriangle->lighting.night = cNight; - } - lua_pushboolean(luaVM, true); - return 1; - } - } - break; - case COLLISION_KEY_VERTICES: - argStream.ReadNumber(sVertex[0]); - argStream.ReadNumber(sVertex[1]); - if (argStream.NextIsNumber()) - { - argStream.ReadNumber(sVertex[2]); - if (!argStream.HasErrors()) + if (cDay >= 0 && cDay <= 15) { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + if (cNight >= 0 && cNight <= 15) { - pTriangle = &pColData->pColTriangles[*it]; - pTriangle->vertex[0] = sVertex[0]; - pTriangle->vertex[1] = sVertex[1]; - pTriangle->vertex[2] = sVertex[2]; - } - lua_pushboolean(luaVM, true); - return 1; - } - } - else - { - if (!argStream.HasErrors()) - { - if (sVertex[0] > 0 && sVertex[0] < 3) - { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + for (unsigned int it : vecShapeId) { - pTriangle = &pColData->pColTriangles[*it]; - pTriangle->vertex[sVertex[0]] = sVertex[1]; + pTriangle = &pColData->pColTriangles[it]; + pTriangle->lighting.day = cDay; + pTriangle->lighting.night = cNight; } - lua_pushboolean(luaVM, true); - return 1; } + else + argStream.SetCustomError("Night light must be in range 0 up to 15."); } + else + argStream.SetCustomError("Day light must be in range 0 up to 15."); } } - break; + break; case COLLISION_VERTEX: CompressedVector* pVertex; switch (eCollisionKey) @@ -1657,39 +1712,66 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) { if (CClientColModel::CheckVector(vec1)) { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + for (unsigned int it : vecShapeId) { - pVertex = &pColData->pVertices[*it]; + pVertex = &pColData->pVertices[it]; pVertex->setVector(vec1); } - lua_pushboolean(luaVM, true); - return 1; } + else + argStream.SetCustomError("Position is out of bounding box."); } + break; case COLLISION_KEY_MOVE: argStream.ReadVector3D(vec1); if (!argStream.HasErrors()) { - if (CClientColModel::CheckVector(vec1)) + for (unsigned int it : vecShapeId) { - for (std::vector::iterator it = vecShapeId.begin(); it != vecShapeId.end(); ++it) + pVertex = &pColData->pVertices[it]; + if (!CClientColModel::CheckVector(vec1 + pVertex->getVector())) + vecFailed.push_back(it); + } + if (vecFailed.size() == 0) + { + for (unsigned int it : vecShapeId) { - pVertex = &pColData->pVertices[*it]; + pVertex = &pColData->pVertices[it]; pVertex->setVector(vec1 + pVertex->getVector()); } - lua_pushboolean(luaVM, true); - return 1; } } - } - break; + } } } } if (argStream.HasErrors()) + { m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + lua_pushboolean(luaVM, false); + return 1; + } + else + { + if (vecFailed.size() > 0) { + unsigned short i = 1; + lua_pushboolean(luaVM, false); + lua_newtable(luaVM); + for (unsigned int it : vecFailed) + { + lua_pushtablevalue(luaVM, i++, it + 1); + } + return 2; + } + else + { + if (pColModelSAInterface != nullptr) + { + pCol->SetCollisionHasChanged(true); + } + lua_pushboolean(luaVM, true); + return 1; + } + } } diff --git a/vendor/lua/src/lapi.c b/vendor/lua/src/lapi.c index 2b2cc305b1c..66ca4357762 100644 --- a/vendor/lua/src/lapi.c +++ b/vendor/lua/src/lapi.c @@ -1136,6 +1136,7 @@ LUA_API void lua_addtotalbytes(lua_State *L, int n) } // MTA addition to shorten the code mainly for collision functions +// working as lua: thisTable[n] = v LUA_API void lua_pushtablevalue(lua_State *L, int n, float v) { lua_pushnumber(L, n); From 454fb1f307e5c3e828a5c8807fc6e1579c5589b9 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Mon, 17 Dec 2018 16:01:40 +0100 Subject: [PATCH 22/50] removed unneded declaration bro --- Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h index ec6c236bee0..91847b1e0ff 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h @@ -49,7 +49,6 @@ class CLuaEngineDefs : public CLuaDefs LUA_DECLARE(EngineSetModelCollisionData); LUA_DECLARE(EngineUpdateModelCollisionBoundingBox); LUA_DECLARE(IsModelCollisionLoaded); - LUA_DECLARE(EngineRestoreOriginalCollisions); private: static void AddEngineColClass(lua_State* luaVM); From 82aa84c905763805c42765454a06b2f46c5b32ed Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Wed, 16 Jan 2019 20:41:34 +0100 Subject: [PATCH 23/50] updated --- .../logic/luadefs/CLuaEngineDefs.cpp | 240 +++++++++++++----- vendor/lua/src/lapi.c | 11 +- 2 files changed, 181 insertions(+), 70 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 5438adc794e..92e19625943 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -974,22 +974,40 @@ int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) lua_newtable(luaVM); lua_pushstring(luaVM, "vecMin"); lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pColModelSAInterface->boundingBox.vecMin.fX); - lua_pushtablevalue(luaVM, 2, pColModelSAInterface->boundingBox.vecMin.fY); - lua_pushtablevalue(luaVM, 3, pColModelSAInterface->boundingBox.vecMin.fZ); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMin.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMin.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMin.fZ); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); lua_pushstring(luaVM, "vecMax"); lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pColModelSAInterface->boundingBox.vecMax.fX); - lua_pushtablevalue(luaVM, 2, pColModelSAInterface->boundingBox.vecMax.fY); - lua_pushtablevalue(luaVM, 3, pColModelSAInterface->boundingBox.vecMax.fZ); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMax.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMax.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMax.fZ); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); lua_pushstring(luaVM, "vecOffset"); lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pColModelSAInterface->boundingBox.vecOffset.fX); - lua_pushtablevalue(luaVM, 2, pColModelSAInterface->boundingBox.vecOffset.fY); - lua_pushtablevalue(luaVM, 3, pColModelSAInterface->boundingBox.vecOffset.fZ); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecOffset.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecOffset.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecOffset.fZ); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); lua_pushstring(luaVM, "radius"); lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.fRadius); @@ -1087,15 +1105,33 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { CColBoxSA pBox = pColData->pColBoxes[usIndex]; lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pBox.min.fX); - lua_pushtablevalue(luaVM, 2, pBox.min.fY); - lua_pushtablevalue(luaVM, 3, pBox.min.fZ); - lua_pushtablevalue(luaVM, 4, pBox.max.fX); - lua_pushtablevalue(luaVM, 5, pBox.max.fY); - lua_pushtablevalue(luaVM, 6, pBox.max.fZ); - lua_pushtablevalue(luaVM, 7, pBox.material); - lua_pushtablevalue(luaVM, 8, pBox.lighting.day); - lua_pushtablevalue(luaVM, 9, pBox.lighting.night); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pBox.min.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pBox.min.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pBox.min.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pBox.max.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pBox.max.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pBox.max.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 7); + lua_pushnumber(luaVM, pBox.material); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 8); + lua_pushnumber(luaVM, pBox.lighting.day); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 9); + lua_pushnumber(luaVM, pBox.lighting.night); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); return 1; } @@ -1114,15 +1150,33 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) lua_pushnumber(luaVM, i + 1); CColBoxSA pBox = pColData->pColBoxes[i]; lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pBox.min.fX); - lua_pushtablevalue(luaVM, 2, pBox.min.fY); - lua_pushtablevalue(luaVM, 3, pBox.min.fZ); - lua_pushtablevalue(luaVM, 4, pBox.max.fX); - lua_pushtablevalue(luaVM, 5, pBox.max.fY); - lua_pushtablevalue(luaVM, 6, pBox.max.fZ); - lua_pushtablevalue(luaVM, 7, pBox.material); - lua_pushtablevalue(luaVM, 8, pBox.lighting.day); - lua_pushtablevalue(luaVM, 9, pBox.lighting.night); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pBox.min.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pBox.min.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pBox.min.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pBox.max.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pBox.max.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pBox.max.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 7); + lua_pushnumber(luaVM, pBox.material); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 8); + lua_pushnumber(luaVM, pBox.lighting.day); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 9); + lua_pushnumber(luaVM, pBox.lighting.night); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); } return 1; @@ -1136,13 +1190,27 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { CColSphereSA pSphere = pColData->pColSpheres[usIndex]; lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pSphere.vecCenter.fX); - lua_pushtablevalue(luaVM, 2, pSphere.vecCenter.fY); - lua_pushtablevalue(luaVM, 3, pSphere.vecCenter.fZ); - lua_pushtablevalue(luaVM, 4, pSphere.fRadius); - lua_pushtablevalue(luaVM, 5, pSphere.material); - lua_pushtablevalue(luaVM, 6, pSphere.lighting.day); - lua_pushtablevalue(luaVM, 7, pSphere.lighting.night); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pSphere.vecCenter.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pSphere.vecCenter.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pSphere.vecCenter.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pSphere.fRadius); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pSphere.material); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pSphere.lighting.day); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 7); + lua_pushnumber(luaVM, pSphere.lighting.night); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); return 1; } @@ -1163,13 +1231,27 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) lua_pushnumber(luaVM, i + 1); pSphere = pColData->pColSpheres[i]; lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pSphere.vecCenter.fX); - lua_pushtablevalue(luaVM, 2, pSphere.vecCenter.fY); - lua_pushtablevalue(luaVM, 3, pSphere.vecCenter.fZ); - lua_pushtablevalue(luaVM, 4, pSphere.fRadius); - lua_pushtablevalue(luaVM, 5, pSphere.material); - lua_pushtablevalue(luaVM, 6, pSphere.lighting.day); - lua_pushtablevalue(luaVM, 7, pSphere.lighting.night); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pSphere.vecCenter.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pSphere.vecCenter.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pSphere.vecCenter.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pSphere.fRadius); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pSphere.material); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pSphere.lighting.day); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 7); + lua_pushnumber(luaVM, pSphere.lighting.night); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); } return 1; @@ -1183,12 +1265,24 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { CColTriangleSA pTriangle = pColData->pColTriangles[usIndex]; lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, static_cast(pTriangle.vertex[0] + 1)); - lua_pushtablevalue(luaVM, 2, static_cast(pTriangle.vertex[1] + 1)); - lua_pushtablevalue(luaVM, 3, static_cast(pTriangle.vertex[2] + 1)); - lua_pushtablevalue(luaVM, 4, static_cast(pTriangle.material)); - lua_pushtablevalue(luaVM, 5, static_cast(pTriangle.lighting.day)); - lua_pushtablevalue(luaVM, 6, static_cast(pTriangle.lighting.night)); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, static_cast(pTriangle.vertex[0] + 1)); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, static_cast(pTriangle.vertex[1] + 1)); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, static_cast(pTriangle.vertex[2] + 1)); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, static_cast(pTriangle.material)); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, static_cast(pTriangle.lighting.day)); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, static_cast(pTriangle.lighting.night)); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); return 1; @@ -1210,12 +1304,24 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) lua_pushnumber(luaVM, i + 1); pTriangle = pColData->pColTriangles[i]; lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, static_cast(pTriangle.vertex[0] + 1)); - lua_pushtablevalue(luaVM, 2, static_cast(pTriangle.vertex[1] + 1)); - lua_pushtablevalue(luaVM, 3, static_cast(pTriangle.vertex[2] + 1)); - lua_pushtablevalue(luaVM, 4, pTriangle.material); - lua_pushtablevalue(luaVM, 5, pTriangle.lighting.day); - lua_pushtablevalue(luaVM, 6, pTriangle.lighting.night); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, static_cast(pTriangle.vertex[0] + 1)); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, static_cast(pTriangle.vertex[1] + 1)); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, static_cast(pTriangle.vertex[2] + 1)); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, static_cast(pTriangle.material)); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, static_cast(pTriangle.lighting.day)); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, static_cast(pTriangle.lighting.night)); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); } return 1; @@ -1240,9 +1346,15 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) CompressedVector pTriangle = pColData->pVertices[usIndex]; lua_newtable(luaVM); CVector vec = pTriangle.getVector(); - lua_pushtablevalue(luaVM, 1, vec.fX); - lua_pushtablevalue(luaVM, 2, vec.fY); - lua_pushtablevalue(luaVM, 3, vec.fZ); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, vec.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, vec.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, vec.fZ); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); return 1; } @@ -1276,9 +1388,15 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) lua_newtable(luaVM); pVertex = pColData->pVertices[i]; vec = pVertex.getVector(); - lua_pushtablevalue(luaVM, 1, vec.fX); - lua_pushtablevalue(luaVM, 2, vec.fY); - lua_pushtablevalue(luaVM, 3, vec.fZ); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, vec.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, vec.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, vec.fZ); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); } return 1; @@ -1760,7 +1878,9 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) lua_newtable(luaVM); for (unsigned int it : vecFailed) { - lua_pushtablevalue(luaVM, i++, it + 1); + lua_pushnumber(luaVM, i++); + lua_pushnumber(luaVM, it + 1); + lua_settable(luaVM, -3); } return 2; } diff --git a/vendor/lua/src/lapi.c b/vendor/lua/src/lapi.c index 66ca4357762..9533b2f262b 100644 --- a/vendor/lua/src/lapi.c +++ b/vendor/lua/src/lapi.c @@ -1133,13 +1133,4 @@ LUA_API void lua_addtotalbytes(lua_State *L, int n) { global_State *g = G(L); g->totalbytes += n; -} - -// MTA addition to shorten the code mainly for collision functions -// working as lua: thisTable[n] = v -LUA_API void lua_pushtablevalue(lua_State *L, int n, float v) -{ - lua_pushnumber(L, n); - lua_pushnumber(L, v); - lua_settable(L, -3); -} +} \ No newline at end of file From 4547c91844b81d31a1643e6bccd1dabef5166284 Mon Sep 17 00:00:00 2001 From: Patrik Juvonen Date: Sun, 24 Feb 2019 01:31:56 +0200 Subject: [PATCH 24/50] Fix formatting --- .../mods/deathmatch/logic/CClientColModel.cpp | 89 +- .../mods/deathmatch/logic/CClientColModel.h | 61 +- .../logic/luadefs/CLuaEngineDefs.cpp | 927 +++++++++--------- .../deathmatch/logic/luadefs/CLuaEngineDefs.h | 2 +- 4 files changed, 527 insertions(+), 552 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientColModel.cpp b/Client/mods/deathmatch/logic/CClientColModel.cpp index 4c11fcce93d..2e276211977 100644 --- a/Client/mods/deathmatch/logic/CClientColModel.cpp +++ b/Client/mods/deathmatch/logic/CClientColModel.cpp @@ -1,9 +1,8 @@ /***************************************************************************** * - * PROJECT: Multi Theft Auto v1.0 - * (Shared logic for modifications) + * PROJECT: Multi Theft Auto * LICENSE: See LICENSE in the top level directory - * FILE: mods/shared_logic/CClientColModel.cpp + * FILE: mods/deathmatch/logic/CClientColModel.cpp * PURPOSE: Model collision (.col file) entity class * *****************************************************************************/ @@ -11,15 +10,12 @@ #include "StdInc.h" #include "../Client/game_sa/CModelInfoSA.h" #include "../Client/game_sa/CColModelSA.h" -#define MAX_COLLISION_SIZE 128 // collision bounding box in each axis -#define MAX_COLLISION_SIZE2 256 // twice bigger than MAX_COLLISION_SIZE -CClientColModel::CClientColModel(CClientManager* pManager, ElementID ID) : ClassInit(this), CClientEntity(ID) +CClientColModel::CClientColModel(CClientManager* pManager, ElementID ID) : ClassInit(this), CClientEntity(ID), m_pColModel(nullptr) { // Init m_pManager = pManager; m_pColModelManager = pManager->GetColModelManager(); - m_pColModel = NULL; SetTypeName("col"); @@ -53,9 +49,7 @@ bool CClientColModel::LoadCol(const SString& strFile, bool bIsRawData) g_pClientGame->GetResourceManager()->ValidateResourceFile(strFilename, buffer); } else - { buffer = CBuffer(strFile, strFile.length()); - } if (!g_pCore->GetNetwork()->CheckFile("col", strFilename, buffer.GetData(), buffer.GetSize())) return false; @@ -64,7 +58,7 @@ bool CClientColModel::LoadCol(const SString& strFile, bool bIsRawData) m_pColModel = g_pGame->GetRenderWare()->ReadCOL(buffer); // Success if the col model is != NULL - return (m_pColModel != NULL); + return (m_pColModel != nullptr); } // Failed. Already loaded @@ -80,9 +74,7 @@ bool CClientColModel::Replace(unsigned short usModel) // it replaced it. We're the new replacer. CClientColModel* pAlready = m_pColModelManager->GetElementThatReplaced(usModel); if (pAlready) - { pAlready->m_Replaced.remove(usModel); - } // Replace the collisions CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModel); @@ -111,12 +103,9 @@ void CClientColModel::Restore(unsigned short usModel) void CClientColModel::RestoreAll() { // Loop through our replaced ids - std::list::iterator iter = m_Replaced.begin(); - for (; iter != m_Replaced.end(); iter++) - { + for (auto& iter : m_Replaced) // Restore this model - InternalRestore(*iter); - } + InternalRestore(iter); // Clear the list m_Replaced.clear(); @@ -125,16 +114,11 @@ void CClientColModel::RestoreAll() bool CClientColModel::HasReplaced(unsigned short usModel) { // Loop through our replaced ids - std::list::iterator iter = m_Replaced.begin(); - for (; iter != m_Replaced.end(); iter++) - { + for (auto& iter : m_Replaced) // Is this the given ID - if (*iter == usModel) - { + if (iter == usModel) // We have replaced it return true; - } - } // We have not replaced it return false; @@ -156,68 +140,15 @@ bool CClientColModel::IsCOLData(const SString& strData) CColModelSAInterface* CClientColModel::GetColModelInterface() { if (m_pColModel) - { return m_pColModel->GetInterface(); - } return nullptr; } -bool CClientColModel::CheckVector(CVector& vec, float fRadius) -{ - if (fRadius > 0) - { - return (MAX_COLLISION_SIZE >= vec.fX + fRadius && vec.fX + fRadius >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fY + fRadius && vec.fY + fRadius >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fZ + fRadius && vec.fZ + fRadius >= -MAX_COLLISION_SIZE) - && (MAX_COLLISION_SIZE >= vec.fX - fRadius && vec.fX - fRadius >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fY - fRadius && vec.fY - fRadius >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fZ - fRadius && vec.fZ - fRadius >= -MAX_COLLISION_SIZE); - } - else - { - return (MAX_COLLISION_SIZE >= vec.fX && vec.fX >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fY && vec.fY >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fZ && vec.fZ >= -MAX_COLLISION_SIZE); - } -} - -bool CClientColModel::CheckMoveVector(CVector& vec, float fRadius) -{ - if (fRadius > 0) - { - return ((MAX_COLLISION_SIZE2 >= vec.fX + fRadius >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fY + fRadius >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fZ + fRadius >= -MAX_COLLISION_SIZE2) - && (MAX_COLLISION_SIZE2 >= vec.fX - fRadius >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fY - fRadius >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fZ - fRadius >= -MAX_COLLISION_SIZE2)); - } - else - { - return (MAX_COLLISION_SIZE2 >= vec.fX && vec.fX >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fY && vec.fY >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fZ && vec.fZ >= -MAX_COLLISION_SIZE2); - } -} - -bool CClientColModel::CompareVector(CVector& vecMin, CVector& vecMax) -{ - return vecMax.fX >= vecMin.fX && vecMax.fY >= vecMin.fY && vecMax.fZ >= vecMin.fZ; -} - -void CClientColModel::AlignVector(CVector& destMin, CVector& destMax, CVector& src) -{ - if (src.fX < destMax.fX) - destMax.fX = src.fX; - if (src.fY < destMax.fY) - destMax.fY = src.fY; - if (src.fZ < destMax.fZ) - destMax.fZ = src.fZ; - - if (src.fX > destMin.fX) - destMin.fX = src.fX; - if (src.fY > destMin.fY) - destMin.fY = src.fY; - if (src.fZ > destMin.fZ) - destMin.fZ = src.fZ; -} - void CClientColModel::UpdateVerticesCount() { - CColModelSAInterface* a = GetColModelInterface(); - - CColDataSA* pColData = a->pColData;; + CColModelSAInterface* pInterface = GetColModelInterface(); + CColDataSA* pColData = pInterface->pColData; if (pColData) - { m_usVerticesCount = static_cast(pColData->getNumVertices()); - } } diff --git a/Client/mods/deathmatch/logic/CClientColModel.h b/Client/mods/deathmatch/logic/CClientColModel.h index 858b54050b4..6b67955cefa 100644 --- a/Client/mods/deathmatch/logic/CClientColModel.h +++ b/Client/mods/deathmatch/logic/CClientColModel.h @@ -1,9 +1,8 @@ /***************************************************************************** * - * PROJECT: Multi Theft Auto v1.0 - * (Shared logic for modifications) + * PROJECT: Multi Theft Auto * LICENSE: See LICENSE in the top level directory - * FILE: mods/shared_logic/CClientColModel.h + * FILE: mods/deathmatch/logic/CClientColModel.h * PURPOSE: Model collision (.col file) entity class * *****************************************************************************/ @@ -13,6 +12,9 @@ #include #include "CClientEntity.h" +#define MAX_COLLISION_SIZE 128 // collision bounding box in each axis +#define MAX_COLLISION_SIZE2 256 // twice bigger than MAX_COLLISION_SIZE + class CClientColModel : public CClientEntity { DECLARE_CLASS(CClientColModel, CClientEntity) @@ -34,12 +36,53 @@ class CClientColModel : public CClientEntity bool HasReplaced(unsigned short usModel); static bool IsCOLData(const SString& strData); - static bool CheckVector(CVector& vec, float fRadius = 0); - static bool CheckMoveVector(CVector& vec, float fRadius = 0); - - static bool CompareVector(CVector& vecMin, CVector& vecMax); - static void AlignVector(CVector& destMin, CVector& destMax, CVector& src); - void UpdateVerticesCount(); + static bool CheckVector(CVector& vec, float fRadius = 0) + { + if (fRadius > 0) + { + return (MAX_COLLISION_SIZE >= vec.fX + fRadius && vec.fX + fRadius >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fY + fRadius && + vec.fY + fRadius >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fZ + fRadius && vec.fZ + fRadius >= -MAX_COLLISION_SIZE) && + (MAX_COLLISION_SIZE >= vec.fX - fRadius && vec.fX - fRadius >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fY - fRadius && + vec.fY - fRadius >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fZ - fRadius && vec.fZ - fRadius >= -MAX_COLLISION_SIZE); + } + else + { + return (MAX_COLLISION_SIZE >= vec.fX && vec.fX >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fY && vec.fY >= -MAX_COLLISION_SIZE && + MAX_COLLISION_SIZE >= vec.fZ && vec.fZ >= -MAX_COLLISION_SIZE); + } + } + static bool CheckMoveVector(CVector& vec, float fRadius = 0) + { + if (fRadius > 0) + { + return ((MAX_COLLISION_SIZE2 >= vec.fX + fRadius >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fY + fRadius >= -MAX_COLLISION_SIZE2 && + MAX_COLLISION_SIZE2 >= vec.fZ + fRadius >= -MAX_COLLISION_SIZE2) && + (MAX_COLLISION_SIZE2 >= vec.fX - fRadius >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fY - fRadius >= -MAX_COLLISION_SIZE2 && + MAX_COLLISION_SIZE2 >= vec.fZ - fRadius >= -MAX_COLLISION_SIZE2)); + } + else + { + return (MAX_COLLISION_SIZE2 >= vec.fX && vec.fX >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fY && vec.fY >= -MAX_COLLISION_SIZE2 && + MAX_COLLISION_SIZE2 >= vec.fZ && vec.fZ >= -MAX_COLLISION_SIZE2); + } + } + static bool CompareVector(CVector& vecMin, CVector& vecMax) { return vecMax.fX >= vecMin.fX && vecMax.fY >= vecMin.fY && vecMax.fZ >= vecMin.fZ; } + static void AlignVector(CVector& destMin, CVector& destMax, CVector& src) + { + if (src.fX < destMax.fX) + destMax.fX = src.fX; + if (src.fY < destMax.fY) + destMax.fY = src.fY; + if (src.fZ < destMax.fZ) + destMax.fZ = src.fZ; + if (src.fX > destMin.fX) + destMin.fX = src.fX; + if (src.fY > destMin.fY) + destMin.fY = src.fY; + if (src.fZ > destMin.fZ) + destMin.fZ = src.fZ; + } + void UpdateVerticesCount(); CColModelSAInterface* GetColModelInterface(); diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 99484916934..9022d417c04 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -2,7 +2,7 @@ * * PROJECT: Multi Theft Auto * LICENSE: See LICENSE in the top level directory - * FILE: mods/shared_logic/luadefs/CLuaEngineDefs.cpp + * FILE: mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp * PURPOSE: Lua definitions class * * Multi Theft Auto is available from http://www.multitheftauto.com/ @@ -324,12 +324,13 @@ int CLuaEngineDefs::EngineLoadIFP(lua_State* luaVM) CResource* pResource = pLuaMain->GetResource(); if (pResource) { - bool bIsRawData = CIFPEngine::IsIFPData(strFile); + bool bIsRawData = CIFPEngine::IsIFPData(strFile); SString strPath; // Is this a legal filepath? if (bIsRawData || CResourceManager::ParseResourcePathInput(strFile, pResource, &strPath)) { - std::shared_ptr pIFP = CIFPEngine::EngineLoadIFP(pResource, m_pManager, bIsRawData ? strFile : strPath, bIsRawData, strBlockName); + std::shared_ptr pIFP = + CIFPEngine::EngineLoadIFP(pResource, m_pManager, bIsRawData ? strFile : strPath, bIsRawData, strBlockName); if (pIFP != nullptr) { // Return the IFP element @@ -354,7 +355,7 @@ int CLuaEngineDefs::EngineLoadIFP(lua_State* luaVM) int CLuaEngineDefs::EngineReplaceCOL(lua_State* luaVM) { - CClientColModel* pCol = NULL; + CClientColModel* pCol = nullptr; unsigned short usModel = 0; CScriptArgReader argStream(luaVM); // Grab the COL and model ID @@ -411,7 +412,7 @@ int CLuaEngineDefs::EngineRestoreCOL(lua_State* luaVM) int CLuaEngineDefs::EngineImportTXD(lua_State* luaVM) { - CClientTXD* pTXD = NULL; + CClientTXD* pTXD = nullptr; SString strModelName; CScriptArgReader argStream(luaVM); argStream.ReadUserData(pTXD); @@ -952,12 +953,12 @@ CColModelSAInterface* GetModelCollisionInterface(ushort usModel) int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) { - CClientColModel* pCol = NULL; + CClientColModel* pCol = nullptr; unsigned short usModel = 0; CScriptArgReader argStream(luaVM); // Grab the COL or model ID // If COL element then read custom collision, otherwise read original collision - if( argStream.NextIsNumber()) + if (argStream.NextIsNumber()) argStream.ReadNumber(usModel); else argStream.ReadUserData(pCol); @@ -1035,7 +1036,7 @@ int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) int CLuaEngineDefs::IsModelCollisionLoaded(lua_State* luaVM) { - ushort usModel; + ushort usModel; CScriptArgReader argStream(luaVM); argStream.ReadNumber(usModel); if (!argStream.HasErrors()) @@ -1052,7 +1053,7 @@ int CLuaEngineDefs::IsModelCollisionLoaded(lua_State* luaVM) int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { - CClientColModel* pCol = NULL; + CClientColModel* pCol = nullptr; unsigned short usModel = 0; CScriptArgReader argStream(luaVM); // Grab the COL or model ID @@ -1072,8 +1073,7 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) if (pColModelSAInterface) { - - ushort usIndex; + ushort usIndex; eCollisionShapes eCollisionShape; argStream.ReadEnumString(eCollisionShape); argStream.ReadNumber(usIndex, 0); @@ -1082,211 +1082,210 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { switch (eCollisionShape) { - case COLLISION_BOX: - if (usIndex > 0) - { - usIndex--; - if (pColData->isValidIndex(COLLISION_BOX, usIndex)) + case COLLISION_BOX: + if (usIndex > 0) { - CColBoxSA pBox = pColData->pColBoxes[usIndex]; - lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pBox.min.fX); - lua_pushtablevalue(luaVM, 2, pBox.min.fY); - lua_pushtablevalue(luaVM, 3, pBox.min.fZ); - lua_pushtablevalue(luaVM, 4, pBox.max.fX); - lua_pushtablevalue(luaVM, 5, pBox.max.fY); - lua_pushtablevalue(luaVM, 6, pBox.max.fZ); - lua_pushtablevalue(luaVM, 7, pBox.material); - lua_pushtablevalue(luaVM, 8, pBox.lighting.day); - lua_pushtablevalue(luaVM, 9, pBox.lighting.night); - lua_settable(luaVM, -3); - return 1; + usIndex--; + if (pColData->isValidIndex(COLLISION_BOX, usIndex)) + { + CColBoxSA pBox = pColData->pColBoxes[usIndex]; + lua_newtable(luaVM); + lua_pushtablevalue(luaVM, 1, pBox.min.fX); + lua_pushtablevalue(luaVM, 2, pBox.min.fY); + lua_pushtablevalue(luaVM, 3, pBox.min.fZ); + lua_pushtablevalue(luaVM, 4, pBox.max.fX); + lua_pushtablevalue(luaVM, 5, pBox.max.fY); + lua_pushtablevalue(luaVM, 6, pBox.max.fZ); + lua_pushtablevalue(luaVM, 7, pBox.material); + lua_pushtablevalue(luaVM, 8, pBox.lighting.day); + lua_pushtablevalue(luaVM, 9, pBox.lighting.night); + lua_settable(luaVM, -3); + return 1; + } + else + { + argStream.SetCustomError("Invalid box index."); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + } } else { - argStream.SetCustomError("Invalid box index."); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - } - } - else - { - lua_newtable(luaVM); - for (uint i = 0; pColData->numColBoxes > i; i++) - { - lua_pushnumber(luaVM, i + 1); - CColBoxSA pBox = pColData->pColBoxes[i]; lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pBox.min.fX); - lua_pushtablevalue(luaVM, 2, pBox.min.fY); - lua_pushtablevalue(luaVM, 3, pBox.min.fZ); - lua_pushtablevalue(luaVM, 4, pBox.max.fX); - lua_pushtablevalue(luaVM, 5, pBox.max.fY); - lua_pushtablevalue(luaVM, 6, pBox.max.fZ); - lua_pushtablevalue(luaVM, 7, pBox.material); - lua_pushtablevalue(luaVM, 8, pBox.lighting.day); - lua_pushtablevalue(luaVM, 9, pBox.lighting.night); - lua_settable(luaVM, -3); - } - return 1; - } - break; - case COLLISION_SPHERE: - if (usIndex > 0) - { - usIndex--; - if (pColData->isValidIndex(COLLISION_SPHERE, usIndex)) - { - CColSphereSA pSphere = pColData->pColSpheres[usIndex]; - lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pSphere.vecCenter.fX); - lua_pushtablevalue(luaVM, 2, pSphere.vecCenter.fY); - lua_pushtablevalue(luaVM, 3, pSphere.vecCenter.fZ); - lua_pushtablevalue(luaVM, 4, pSphere.fRadius); - lua_pushtablevalue(luaVM, 5, pSphere.material); - lua_pushtablevalue(luaVM, 6, pSphere.lighting.day); - lua_pushtablevalue(luaVM, 7, pSphere.lighting.night); - lua_settable(luaVM, -3); - return 1; - } - else - { - argStream.SetCustomError("Invalid sphere index."); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); + for (uint i = 0; pColData->numColBoxes > i; i++) + { + lua_pushnumber(luaVM, i + 1); + CColBoxSA pBox = pColData->pColBoxes[i]; + lua_newtable(luaVM); + lua_pushtablevalue(luaVM, 1, pBox.min.fX); + lua_pushtablevalue(luaVM, 2, pBox.min.fY); + lua_pushtablevalue(luaVM, 3, pBox.min.fZ); + lua_pushtablevalue(luaVM, 4, pBox.max.fX); + lua_pushtablevalue(luaVM, 5, pBox.max.fY); + lua_pushtablevalue(luaVM, 6, pBox.max.fZ); + lua_pushtablevalue(luaVM, 7, pBox.material); + lua_pushtablevalue(luaVM, 8, pBox.lighting.day); + lua_pushtablevalue(luaVM, 9, pBox.lighting.night); + lua_settable(luaVM, -3); + } return 1; } - } - else - { - lua_newtable(luaVM); - CColSphereSA pSphere; - for (uint i = 0; pColData->numColSpheres > i; i++) - { - lua_pushnumber(luaVM, i + 1); - pSphere = pColData->pColSpheres[i]; - lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pSphere.vecCenter.fX); - lua_pushtablevalue(luaVM, 2, pSphere.vecCenter.fY); - lua_pushtablevalue(luaVM, 3, pSphere.vecCenter.fZ); - lua_pushtablevalue(luaVM, 4, pSphere.fRadius); - lua_pushtablevalue(luaVM, 5, pSphere.material); - lua_pushtablevalue(luaVM, 6, pSphere.lighting.day); - lua_pushtablevalue(luaVM, 7, pSphere.lighting.night); - lua_settable(luaVM, -3); - } - return 1; - } - break; - case COLLISION_TRIANGLE: - if (usIndex > 0) - { - usIndex--; - if (pColData->isValidIndex(COLLISION_TRIANGLE, usIndex)) + break; + case COLLISION_SPHERE: + if (usIndex > 0) { - CColTriangleSA pTriangle = pColData->pColTriangles[usIndex]; - lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, static_cast(pTriangle.vertex[0] + 1)); - lua_pushtablevalue(luaVM, 2, static_cast(pTriangle.vertex[1] + 1)); - lua_pushtablevalue(luaVM, 3, static_cast(pTriangle.vertex[2] + 1)); - lua_pushtablevalue(luaVM, 4, static_cast(pTriangle.material)); - lua_pushtablevalue(luaVM, 5, static_cast(pTriangle.lighting.day)); - lua_pushtablevalue(luaVM, 6, static_cast(pTriangle.lighting.night)); - lua_settable(luaVM, -3); - return 1; - + usIndex--; + if (pColData->isValidIndex(COLLISION_SPHERE, usIndex)) + { + CColSphereSA pSphere = pColData->pColSpheres[usIndex]; + lua_newtable(luaVM); + lua_pushtablevalue(luaVM, 1, pSphere.vecCenter.fX); + lua_pushtablevalue(luaVM, 2, pSphere.vecCenter.fY); + lua_pushtablevalue(luaVM, 3, pSphere.vecCenter.fZ); + lua_pushtablevalue(luaVM, 4, pSphere.fRadius); + lua_pushtablevalue(luaVM, 5, pSphere.material); + lua_pushtablevalue(luaVM, 6, pSphere.lighting.day); + lua_pushtablevalue(luaVM, 7, pSphere.lighting.night); + lua_settable(luaVM, -3); + return 1; + } + else + { + argStream.SetCustomError("Invalid sphere index."); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } } else { - argStream.SetCustomError("Invalid triangle index."); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - } - else - { - lua_newtable(luaVM); - CColTriangleSA pTriangle; - for (uint i = 0; pColData->numColTriangles > i; i++) - { - lua_pushnumber(luaVM, i + 1); - pTriangle = pColData->pColTriangles[i]; lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, static_cast(pTriangle.vertex[0] + 1)); - lua_pushtablevalue(luaVM, 2, static_cast(pTriangle.vertex[1] + 1)); - lua_pushtablevalue(luaVM, 3, static_cast(pTriangle.vertex[2] + 1)); - lua_pushtablevalue(luaVM, 4, pTriangle.material); - lua_pushtablevalue(luaVM, 5, pTriangle.lighting.day); - lua_pushtablevalue(luaVM, 6, pTriangle.lighting.night); - lua_settable(luaVM, -3); + CColSphereSA pSphere; + for (uint i = 0; pColData->numColSpheres > i; i++) + { + lua_pushnumber(luaVM, i + 1); + pSphere = pColData->pColSpheres[i]; + lua_newtable(luaVM); + lua_pushtablevalue(luaVM, 1, pSphere.vecCenter.fX); + lua_pushtablevalue(luaVM, 2, pSphere.vecCenter.fY); + lua_pushtablevalue(luaVM, 3, pSphere.vecCenter.fZ); + lua_pushtablevalue(luaVM, 4, pSphere.fRadius); + lua_pushtablevalue(luaVM, 5, pSphere.material); + lua_pushtablevalue(luaVM, 6, pSphere.lighting.day); + lua_pushtablevalue(luaVM, 7, pSphere.lighting.night); + lua_settable(luaVM, -3); + } + return 1; } - return 1; - } - break; - case COLLISION_VERTEX: - if (usIndex > 0) - { - usIndex--; - unsigned short usNumVertices; - if (pCol) + break; + case COLLISION_TRIANGLE: + if (usIndex > 0) { - usNumVertices = pCol->GetVerticesCount(); + usIndex--; + if (pColData->isValidIndex(COLLISION_TRIANGLE, usIndex)) + { + CColTriangleSA pTriangle = pColData->pColTriangles[usIndex]; + lua_newtable(luaVM); + lua_pushtablevalue(luaVM, 1, static_cast(pTriangle.vertex[0] + 1)); + lua_pushtablevalue(luaVM, 2, static_cast(pTriangle.vertex[1] + 1)); + lua_pushtablevalue(luaVM, 3, static_cast(pTriangle.vertex[2] + 1)); + lua_pushtablevalue(luaVM, 4, static_cast(pTriangle.material)); + lua_pushtablevalue(luaVM, 5, static_cast(pTriangle.lighting.day)); + lua_pushtablevalue(luaVM, 6, static_cast(pTriangle.lighting.night)); + lua_settable(luaVM, -3); + return 1; + } + else + { + argStream.SetCustomError("Invalid triangle index."); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } } else { - usNumVertices = pColData->getNumVertices(); - } - - if (pColData->isValidIndex(COLLISION_VERTEX, usIndex, usNumVertices)) - { - CompressedVector pTriangle = pColData->pVertices[usIndex]; lua_newtable(luaVM); - CVector vec = pTriangle.getVector(); - lua_pushtablevalue(luaVM, 1, vec.fX); - lua_pushtablevalue(luaVM, 2, vec.fY); - lua_pushtablevalue(luaVM, 3, vec.fZ); - lua_settable(luaVM, -3); - return 1; - } - else - { - argStream.SetCustomError("Invalid vertex index."); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); + CColTriangleSA pTriangle; + for (uint i = 0; pColData->numColTriangles > i; i++) + { + lua_pushnumber(luaVM, i + 1); + pTriangle = pColData->pColTriangles[i]; + lua_newtable(luaVM); + lua_pushtablevalue(luaVM, 1, static_cast(pTriangle.vertex[0] + 1)); + lua_pushtablevalue(luaVM, 2, static_cast(pTriangle.vertex[1] + 1)); + lua_pushtablevalue(luaVM, 3, static_cast(pTriangle.vertex[2] + 1)); + lua_pushtablevalue(luaVM, 4, pTriangle.material); + lua_pushtablevalue(luaVM, 5, pTriangle.lighting.day); + lua_pushtablevalue(luaVM, 6, pTriangle.lighting.night); + lua_settable(luaVM, -3); + } return 1; } - } - else - { - unsigned short usNumVertices; - if (pCol) + break; + case COLLISION_VERTEX: + if (usIndex > 0) { - usNumVertices = pCol->GetVerticesCount(); + usIndex--; + unsigned short usNumVertices; + if (pCol) + { + usNumVertices = pCol->GetVerticesCount(); + } + else + { + usNumVertices = pColData->getNumVertices(); + } + + if (pColData->isValidIndex(COLLISION_VERTEX, usIndex, usNumVertices)) + { + CompressedVector pTriangle = pColData->pVertices[usIndex]; + lua_newtable(luaVM); + CVector vec = pTriangle.getVector(); + lua_pushtablevalue(luaVM, 1, vec.fX); + lua_pushtablevalue(luaVM, 2, vec.fY); + lua_pushtablevalue(luaVM, 3, vec.fZ); + lua_settable(luaVM, -3); + return 1; + } + else + { + argStream.SetCustomError("Invalid vertex index."); + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + lua_pushboolean(luaVM, false); + return 1; + } } else { - usNumVertices = pColData->getNumVertices(); - } + unsigned short usNumVertices; + if (pCol) + { + usNumVertices = pCol->GetVerticesCount(); + } + else + { + usNumVertices = pColData->getNumVertices(); + } - CVector vec; - CompressedVector pVertex; + CVector vec; + CompressedVector pVertex; - lua_newtable(luaVM); - for (ushort i = 0; i < usNumVertices; i++) - { - lua_pushnumber(luaVM, i + 1); lua_newtable(luaVM); - pVertex = pColData->pVertices[i]; - vec = pVertex.getVector(); - lua_pushtablevalue(luaVM, 1, vec.fX); - lua_pushtablevalue(luaVM, 2, vec.fY); - lua_pushtablevalue(luaVM, 3, vec.fZ); - lua_settable(luaVM, -3); + for (ushort i = 0; i < usNumVertices; i++) + { + lua_pushnumber(luaVM, i + 1); + lua_newtable(luaVM); + pVertex = pColData->pVertices[i]; + vec = pVertex.getVector(); + lua_pushtablevalue(luaVM, 1, vec.fX); + lua_pushtablevalue(luaVM, 2, vec.fY); + lua_pushtablevalue(luaVM, 3, vec.fZ); + lua_settable(luaVM, -3); + } + return 1; } - return 1; - } - break; + break; } } } @@ -1300,8 +1299,8 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) { - CClientColModel* pCol = NULL; - CVector vecCenter; + CClientColModel* pCol = nullptr; + CVector vecCenter; CScriptArgReader argStream(luaVM); argStream.ReadUserData(pCol); argStream.ReadVector3D(vecCenter, CVector(0, 0, 0)); @@ -1316,17 +1315,17 @@ int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) { if (!pCol->HasChanged()) { - lua_pushboolean(luaVM, true); // bounding box already updated. + lua_pushboolean(luaVM, true); // bounding box already updated. return 1; } - CColDataSA* pColData = pColModelSAInterface->pColData; + CColDataSA* pColData = pColModelSAInterface->pColData; CBoundingBoxSA* pBoundingBox = &pColModelSAInterface->boundingBox; - CVector minVec(0, 0, 0); - CVector maxVec(0, 0, 0); - CVector pBoxMinVec, pBoxMaxVec; + CVector minVec(0, 0, 0); + CVector maxVec(0, 0, 0); + CVector pBoxMinVec, pBoxMaxVec; CColSphereSA pSphere; - CColBoxSA pBox; + CColBoxSA pBox; for (uint i = 0; pColData->numColBoxes > i; i++) { pBox = pColData->pColBoxes[i]; @@ -1349,7 +1348,7 @@ int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) CClientColModel::AlignVector(maxVec, minVec, pBoxMaxVec); } - std::map vecVertices = pColData->getAllVertices(); + std::map vecVertices = pColData->getAllVertices(); std::map::iterator it; for (it = vecVertices.begin(); it != vecVertices.end(); it++) { @@ -1371,11 +1370,11 @@ int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) { - CClientColModel* pCol = NULL; + CClientColModel* pCol = nullptr; std::vector vecUncheckedShapeId, vecShapeId, vecFailed; - eCollisionShapes eCollisionShape; - eCollisionKey eCollisionKey; - CScriptArgReader argStream(luaVM); + eCollisionShapes eCollisionShape; + eCollisionKey eCollisionKey; + CScriptArgReader argStream(luaVM); argStream.ReadUserData(pCol); argStream.ReadEnumString(eCollisionShape); argStream.ReadEnumString(eCollisionKey); @@ -1397,8 +1396,9 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) if (pColModelSAInterface) { CColDataSA* pColData = pColModelSAInterface->pColData; - ushort numVertices = pCol->GetVerticesCount(); - for (ushort i = 0; i != vecUncheckedShapeId.size(); i++) { + ushort numVertices = pCol->GetVerticesCount(); + for (ushort i = 0; i != vecUncheckedShapeId.size(); i++) + { if (pColData->isValidIndex(eCollisionShape, vecUncheckedShapeId[i] - 1, numVertices)) vecShapeId.push_back(vecUncheckedShapeId[i] - 1); else @@ -1414,337 +1414,338 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) switch (eCollisionShape) { - case COLLISION_BOX: - CColBoxSA * pBox; - switch (eCollisionKey) - { - case COLLISION_KEY_MATERIAL: - uint cSurface; - argStream.ReadNumber(cSurface); - if (!argStream.HasErrors()) + case COLLISION_BOX: + CColBoxSA* pBox; + switch (eCollisionKey) { - if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) - { - for (unsigned int it : vecShapeId) + case COLLISION_KEY_MATERIAL: + uint cSurface; + argStream.ReadNumber(cSurface); + if (!argStream.HasErrors()) { - pBox = &pColData->pColBoxes[it]; - pBox->material = cSurface; + if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) + { + for (unsigned int it : vecShapeId) + { + pBox = &pColData->pColBoxes[it]; + pBox->material = cSurface; + } + } + else + argStream.SetCustomError("Invalid material id."); + } + break; + case COLLISION_KEY_SIZE: + if (argStream.NextIsBool()) + { + bool bMinVector; + argStream.ReadBool(bMinVector); // true = min, false = max + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) + { + if (CClientColModel::CheckVector(vec1)) + { + if (bMinVector) + { + for (unsigned int it : vecShapeId) + { + pBox = &pColData->pColBoxes[it]; + if (!CClientColModel::CompareVector(vec1, pBox->max)) + vecFailed.push_back(it); + } + if (vecFailed.size() == 0) + { + for (unsigned int it : vecShapeId) + { + pBox = &pColData->pColBoxes[it]; + pBox->min = vec1; + } + } + } + else + { + for (unsigned int it : vecShapeId) + { + pBox = &pColData->pColBoxes[it]; + if (!CClientColModel::CompareVector(pBox->min, vec1)) + vecFailed.push_back(it); + } + if (vecFailed.size() == 0) + { + for (unsigned int it : vecShapeId) + { + pBox = &pColData->pColBoxes[it]; + pBox->max = vec1; + } + } + } + } + else + argStream.SetCustomError("Position is out of bounding box."); + } + } + else + { + argStream.ReadVector3D(vec1); + argStream.ReadVector3D(vec2); + if (!argStream.HasErrors()) + { + if (CClientColModel::CheckVector(vec1)) + { + if (CClientColModel::CheckVector(vec2)) + { + if (CClientColModel::CompareVector(vec1, vec2)) + { + for (unsigned int it : vecShapeId) + { + pBox = &pColData->pColBoxes[it]; + pBox->min = vec1; + pBox->max = vec2; + } + } + else + argStream.SetCustomError("Second position need to be greater than first."); + } + else + argStream.SetCustomError("Second position is out of bounding box."); + } + else + argStream.SetCustomError("First position is out of bounding box."); + } + } + break; + case COLLISION_KEY_POSITION: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) + { + for (unsigned int it : vecShapeId) + { + pBox = &pColData->pColBoxes[it]; + vec2 = CVector(pBox->min.fX + pBox->max.fX, pBox->min.fY + pBox->max.fY, pBox->min.fZ + pBox->max.fZ) / 2; + if (!CClientColModel::CheckVector(pBox->min + (vec1 - vec2)) || + !CClientColModel::CheckVector(pBox->max + (vec1 - vec2))) + vecFailed.push_back(it); + } + if (vecFailed.size()) + { + for (unsigned int it : vecShapeId) + { + pBox = &pColData->pColBoxes[it]; + vec2 = CVector(pBox->min.fX + pBox->max.fX, pBox->min.fY + pBox->max.fY, pBox->min.fZ + pBox->max.fZ) / 2; + pBox->min += (vec1 - vec2); + pBox->max += (vec1 - vec2); + } + } + } + break; + case COLLISION_KEY_MOVE: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) + { + for (unsigned int it : vecShapeId) + { + pBox = &pColData->pColBoxes[it]; + if (!(CClientColModel::CheckVector(pBox->min + vec1) && CClientColModel::CheckVector(pBox->max + vec1))) + vecFailed.push_back(it); + } + if (vecFailed.size() == 0) + { + for (unsigned int it : vecShapeId) + { + pBox = &pColData->pColBoxes[it]; + pBox->min += vec1; + pBox->max += vec1; + } + } } - } - else - argStream.SetCustomError("Invalid material id."); } break; - case COLLISION_KEY_SIZE: - if (argStream.NextIsBool()) + case COLLISION_SPHERE: + CColSphereSA* pSphere; + switch (eCollisionKey) { - bool bMinVector; - argStream.ReadBool(bMinVector); // true = min, false = max - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) - { - if (CClientColModel::CheckVector(vec1)) + case COLLISION_KEY_POSITION: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) { - if (bMinVector) + if (CClientColModel::CheckVector(vec1)) { for (unsigned int it : vecShapeId) { - pBox = &pColData->pColBoxes[it]; - if (!CClientColModel::CompareVector(vec1, pBox->max)) + pSphere = &pColData->pColSpheres[it]; + if (!CClientColModel::CheckVector(vec1, pSphere->fRadius)) + { vecFailed.push_back(it); + } } + if (vecFailed.size() == 0) { for (unsigned int it : vecShapeId) { - pBox = &pColData->pColBoxes[it]; - pBox->min = vec1; + pSphere = &pColData->pColSpheres[it]; + pSphere->vecCenter = vec1; } } } else + argStream.SetCustomError("First position is out of bounding box."); + } + break; + case COLLISION_KEY_MOVE: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) + { + if (CClientColModel::CheckMoveVector(vec1)) { for (unsigned int it : vecShapeId) { - pBox = &pColData->pColBoxes[it]; - if (!CClientColModel::CompareVector(pBox->min, vec1)) + pSphere = &pColData->pColSpheres[it]; + if (!CClientColModel::CheckVector(pSphere->vecCenter + vec1, pSphere->fRadius)) vecFailed.push_back(it); } if (vecFailed.size() == 0) { for (unsigned int it : vecShapeId) { - pBox = &pColData->pColBoxes[it]; - pBox->max = vec1; + pSphere = &pColData->pColSpheres[it]; + pSphere->vecCenter += vec1; } } } + else + argStream.SetCustomError("You can't move furher than 256 units in each axis."); } - else - argStream.SetCustomError("Position is out of bounding box."); - } - } - else - { - argStream.ReadVector3D(vec1); - argStream.ReadVector3D(vec2); - if (!argStream.HasErrors()) - { - if (CClientColModel::CheckVector(vec1)) + break; + case COLLISION_KEY_RADIUS: + float fRadius; + argStream.ReadNumber(fRadius); + if (!argStream.HasErrors()) { - if (CClientColModel::CheckVector(vec2)) + if (fRadius >= 0 && fRadius <= 256) // bigger than 256 are sure that are outside bounding { - if (CClientColModel::CompareVector(vec1, vec2)) + for (unsigned int it : vecShapeId) + { + pSphere = &pColData->pColSpheres[it]; + if (!CClientColModel::CheckVector(pSphere->vecCenter, fRadius)) + vecFailed.push_back(it); + } + if (vecFailed.size() == 0) { for (unsigned int it : vecShapeId) { - pBox = &pColData->pColBoxes[it]; - pBox->min = vec1; - pBox->max = vec2; + pSphere = &pColData->pColSpheres[it]; + pSphere->fRadius = fRadius; } } - else - argStream.SetCustomError("Second position need to be greater than first."); } else - argStream.SetCustomError("Second position is out of bounding box."); + argStream.SetCustomError("Radius must be between 0 and 256."); } - else - argStream.SetCustomError("First position is out of bounding box."); - } - } - break; - case COLLISION_KEY_POSITION: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) - { - for (unsigned int it : vecShapeId) - { - pBox = &pColData->pColBoxes[it]; - vec2 = CVector(pBox->min.fX + pBox->max.fX, pBox->min.fY + pBox->max.fY, pBox->min.fZ + pBox->max.fZ) / 2; - if (!CClientColModel::CheckVector(pBox->min + (vec1 - vec2)) || !CClientColModel::CheckVector(pBox->max + (vec1 - vec2))) - vecFailed.push_back(it); - } - if (vecFailed.size()) - { - for (unsigned int it : vecShapeId) + break; + case COLLISION_KEY_MATERIAL: + uint cSurface; + argStream.ReadNumber(cSurface); + if (!argStream.HasErrors()) { - pBox = &pColData->pColBoxes[it]; - vec2 = CVector(pBox->min.fX + pBox->max.fX, pBox->min.fY + pBox->max.fY, pBox->min.fZ + pBox->max.fZ) / 2; - pBox->min += (vec1 - vec2); - pBox->max += (vec1 - vec2); + if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) + { + for (unsigned int it : vecShapeId) + { + pSphere = &pColData->pColSpheres[it]; + pSphere->material = cSurface; + } + } + else + argStream.SetCustomError("Invalid material id."); } - } } break; - case COLLISION_KEY_MOVE: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) - { - for (unsigned int it : vecShapeId) - { - pBox = &pColData->pColBoxes[it]; - if (!(CClientColModel::CheckVector(pBox->min + vec1) && CClientColModel::CheckVector(pBox->max + vec1))) - vecFailed.push_back(it); - } - if (vecFailed.size() == 0) - { - for (unsigned int it : vecShapeId) - { - pBox = &pColData->pColBoxes[it]; - pBox->min += vec1; - pBox->max += vec1; - } - } - } - } - break; - case COLLISION_SPHERE: - CColSphereSA * pSphere; - switch (eCollisionKey) - { - case COLLISION_KEY_POSITION: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) + case COLLISION_TRIANGLE: + CColTriangleSA* pTriangle; + switch (eCollisionKey) { - if (CClientColModel::CheckVector(vec1)) - { - for (unsigned int it : vecShapeId) + case COLLISION_KEY_MATERIAL: + uint cSurface; + argStream.ReadNumber(cSurface); + if (!argStream.HasErrors()) { - pSphere = &pColData->pColSpheres[it]; - if (!CClientColModel::CheckVector(vec1, pSphere->fRadius)) + if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) { - vecFailed.push_back(it); + for (unsigned int it : vecShapeId) + { + pTriangle = &pColData->pColTriangles[it]; + pTriangle->material = cSurface; + } } + else + argStream.SetCustomError("Invalid material id."); } - - if (vecFailed.size() == 0) + case COLLISION_KEY_LIGHTING: + uint cDay, cNight; + argStream.ReadNumber(cDay); + argStream.ReadNumber(cNight); + if (!argStream.HasErrors()) { - for (unsigned int it : vecShapeId) + if (cDay >= 0 && cDay <= 15) { - pSphere = &pColData->pColSpheres[it]; - pSphere->vecCenter = vec1; + if (cNight >= 0 && cNight <= 15) + { + for (unsigned int it : vecShapeId) + { + pTriangle = &pColData->pColTriangles[it]; + pTriangle->lighting.day = cDay; + pTriangle->lighting.night = cNight; + } + } + else + argStream.SetCustomError("Night light must be in range 0 up to 15."); } + else + argStream.SetCustomError("Day light must be in range 0 up to 15."); } - } - else - argStream.SetCustomError("First position is out of bounding box."); } break; - case COLLISION_KEY_MOVE: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) + case COLLISION_VERTEX: + CompressedVector* pVertex; + switch (eCollisionKey) { - if (CClientColModel::CheckMoveVector(vec1)) - { - for (unsigned int it : vecShapeId) - { - pSphere = &pColData->pColSpheres[it]; - if (!CClientColModel::CheckVector(pSphere->vecCenter + vec1, pSphere->fRadius)) - vecFailed.push_back(it); - } - if (vecFailed.size() == 0) + case COLLISION_KEY_POSITION: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) { - for (unsigned int it : vecShapeId) + if (CClientColModel::CheckVector(vec1)) { - pSphere = &pColData->pColSpheres[it]; - pSphere->vecCenter += vec1; + for (unsigned int it : vecShapeId) + { + pVertex = &pColData->pVertices[it]; + pVertex->setVector(vec1); + } } + else + argStream.SetCustomError("Position is out of bounding box."); } - } - else - argStream.SetCustomError("You can't move furher than 256 units in each axis."); - } - break; - case COLLISION_KEY_RADIUS: - float fRadius; - argStream.ReadNumber(fRadius); - if (!argStream.HasErrors()) - { - if (fRadius >= 0 && fRadius <= 256) // bigger than 256 are sure that are outside bounding - { - for (unsigned int it : vecShapeId) - { - pSphere = &pColData->pColSpheres[it]; - if (!CClientColModel::CheckVector(pSphere->vecCenter, fRadius)) - vecFailed.push_back(it); - } - if (vecFailed.size() == 0) + break; + case COLLISION_KEY_MOVE: + argStream.ReadVector3D(vec1); + if (!argStream.HasErrors()) { for (unsigned int it : vecShapeId) { - pSphere = &pColData->pColSpheres[it]; - pSphere->fRadius = fRadius; + pVertex = &pColData->pVertices[it]; + if (!CClientColModel::CheckVector(vec1 + pVertex->getVector())) + vecFailed.push_back(it); } - } - } - else - argStream.SetCustomError("Radius must be between 0 and 256."); - } - break; - case COLLISION_KEY_MATERIAL: - uint cSurface; - argStream.ReadNumber(cSurface); - if (!argStream.HasErrors()) - { - if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) - { - for (unsigned int it : vecShapeId) - { - pSphere = &pColData->pColSpheres[it]; - pSphere->material = cSurface; - } - } - else - argStream.SetCustomError("Invalid material id."); - } - } - break; - case COLLISION_TRIANGLE: - CColTriangleSA * pTriangle; - switch (eCollisionKey) - { - case COLLISION_KEY_MATERIAL: - uint cSurface; - argStream.ReadNumber(cSurface); - if (!argStream.HasErrors()) - { - if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) - { - for (unsigned int it : vecShapeId) - { - pTriangle = &pColData->pColTriangles[it]; - pTriangle->material = cSurface; - } - } - else - argStream.SetCustomError("Invalid material id."); - } - case COLLISION_KEY_LIGHTING: - uint cDay, cNight; - argStream.ReadNumber(cDay); - argStream.ReadNumber(cNight); - if (!argStream.HasErrors()) - { - if (cDay >= 0 && cDay <= 15) - { - if (cNight >= 0 && cNight <= 15) - { - for (unsigned int it : vecShapeId) + if (vecFailed.size() == 0) { - pTriangle = &pColData->pColTriangles[it]; - pTriangle->lighting.day = cDay; - pTriangle->lighting.night = cNight; + for (unsigned int it : vecShapeId) + { + pVertex = &pColData->pVertices[it]; + pVertex->setVector(vec1 + pVertex->getVector()); + } } } - else - argStream.SetCustomError("Night light must be in range 0 up to 15."); - } - else - argStream.SetCustomError("Day light must be in range 0 up to 15."); - } - } - break; - case COLLISION_VERTEX: - CompressedVector* pVertex; - switch (eCollisionKey) - { - case COLLISION_KEY_POSITION: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) - { - if (CClientColModel::CheckVector(vec1)) - { - for (unsigned int it : vecShapeId) - { - pVertex = &pColData->pVertices[it]; - pVertex->setVector(vec1); - } - } - else - argStream.SetCustomError("Position is out of bounding box."); - } - break; - case COLLISION_KEY_MOVE: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) - { - for (unsigned int it : vecShapeId) - { - pVertex = &pColData->pVertices[it]; - if (!CClientColModel::CheckVector(vec1 + pVertex->getVector())) - vecFailed.push_back(it); - } - if (vecFailed.size() == 0) - { - for (unsigned int it : vecShapeId) - { - pVertex = &pColData->pVertices[it]; - pVertex->setVector(vec1 + pVertex->getVector()); - } - } } - } } } } diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h index d01d0f8409a..c6c3d95258b 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h @@ -2,7 +2,7 @@ * * PROJECT: Multi Theft Auto * LICENSE: See LICENSE in the top level directory - * FILE: mods/shared_logic/luadefs/CLuaEngineDefs.cpp + * FILE: mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp * PURPOSE: Lua definitions class * * Multi Theft Auto is available from http://www.multitheftauto.com/ From f4a70696d3ae43e52fe1152864e78e03022baf60 Mon Sep 17 00:00:00 2001 From: Patrik Juvonen Date: Sun, 24 Feb 2019 01:33:13 +0200 Subject: [PATCH 25/50] Add missing return on error --- Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 9022d417c04..8b067515172 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -1107,6 +1107,7 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) argStream.SetCustomError("Invalid box index."); m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); lua_pushboolean(luaVM, false); + return 1; } } else From b65846c381e6a23fa34f41873c4c061ef48e713b Mon Sep 17 00:00:00 2001 From: Patrik Juvonen Date: Sun, 24 Feb 2019 01:33:54 +0200 Subject: [PATCH 26/50] Return nullptr instead --- Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 8b067515172..9329de6522b 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -948,7 +948,7 @@ CColModelSAInterface* GetModelCollisionInterface(ushort usModel) } } } - return false; + return nullptr; } int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) From 5d8187ff71ebbe7bf68678ee48892fb8aa03e879 Mon Sep 17 00:00:00 2001 From: Patrik Juvonen Date: Sun, 24 Feb 2019 01:36:07 +0200 Subject: [PATCH 27/50] Fix formatting, addendum to 4547c91844b81d31a1643e6bccd1dabef5166284 --- .../logic/luadefs/CLuaEngineDefs.cpp | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 9329de6522b..89b4faa3af4 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -1014,13 +1014,9 @@ int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) lua_settable(luaVM, -3); lua_pushstring(luaVM, "colVertices"); if (pCol) - { lua_pushnumber(luaVM, pCol->GetVerticesCount()); - } else - { lua_pushnumber(luaVM, pColData->getNumVertices()); - } lua_settable(luaVM, -3); } @@ -1230,13 +1226,9 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) usIndex--; unsigned short usNumVertices; if (pCol) - { usNumVertices = pCol->GetVerticesCount(); - } else - { usNumVertices = pColData->getNumVertices(); - } if (pColData->isValidIndex(COLLISION_VERTEX, usIndex, usNumVertices)) { @@ -1261,13 +1253,9 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { unsigned short usNumVertices; if (pCol) - { usNumVertices = pCol->GetVerticesCount(); - } else - { usNumVertices = pColData->getNumVertices(); - } CVector vec; CompressedVector pVertex; @@ -1575,9 +1563,7 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) { pSphere = &pColData->pColSpheres[it]; if (!CClientColModel::CheckVector(vec1, pSphere->fRadius)) - { vecFailed.push_back(it); - } } if (vecFailed.size() == 0) @@ -1765,17 +1751,14 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) lua_pushboolean(luaVM, false); lua_newtable(luaVM); for (unsigned int it : vecFailed) - { lua_pushtablevalue(luaVM, i++, it + 1); - } return 2; } else { if (pColModelSAInterface != nullptr) - { pCol->SetCollisionHasChanged(true); - } + lua_pushboolean(luaVM, true); return 1; } From 50376a8250f73e30edde99cef13f158cb0d87fbc Mon Sep 17 00:00:00 2001 From: Patrik Juvonen Date: Sun, 24 Feb 2019 01:54:27 +0200 Subject: [PATCH 28/50] Use const where possible --- Client/game_sa/CColModelSA.h | 14 +++++++------- Client/mods/deathmatch/logic/CClientColModel.h | 2 +- Client/sdk/game/CColModel.h | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Client/game_sa/CColModelSA.h b/Client/game_sa/CColModelSA.h index c0d78731bf3..b54a51b383d 100644 --- a/Client/game_sa/CColModelSA.h +++ b/Client/game_sa/CColModelSA.h @@ -88,7 +88,7 @@ typedef struct signed __int16 x; signed __int16 y; signed __int16 z; - CVector getVector() { return CVector(x * 0.0078125f, y * 0.0078125f, z * 0.0078125f); } + CVector getVector() const { return CVector(x * 0.0078125f, y * 0.0078125f, z * 0.0078125f); } void setVector(CVector vec) { x = static_cast(vec.fX * 128); @@ -116,7 +116,7 @@ typedef struct CompressedVector* m_pShadowVertices; CColTriangleSA* m_pShadowTriangles; - std::map getAllVertices() + std::map getAllVertices() const { std::map vertices; for (uint i = 0; numColTriangles > i; i++) @@ -127,7 +127,7 @@ typedef struct } return vertices; } - size_t getNumVertices() + size_t getNumVertices() const { std::map vertices; for (uint i = 0; numColTriangles > i; i++) @@ -139,7 +139,7 @@ typedef struct return vertices.size(); } - bool isValidIndex(char eShape, ushort usIndex, ushort numVertices = 0) + bool isValidIndex(char eShape, ushort usIndex, ushort numVertices = 0) const { switch (eShape) { @@ -159,7 +159,7 @@ typedef struct return false; } - std::vector getTrianglesByVertex(ushort usVertex) + std::vector getTrianglesByVertex(ushort usVertex) const { std::vector vecTriangles; CColTriangleSA colTriangle; @@ -172,7 +172,7 @@ typedef struct return vecTriangles; } - std::map getVerticesUsage() + std::map getVerticesUsage() const { std::map verticesUsage; for (ushort i = 0; i < numColTriangles; i++) @@ -203,7 +203,7 @@ class CColModelSA : public CColModel CColModelSA(CColModelSAInterface* pInterface); ~CColModelSA(); - CColModelSAInterface* GetInterface() { return m_pInterface; } + CColModelSAInterface* GetInterface() const { return m_pInterface; } void Destroy() { delete this; } private: diff --git a/Client/mods/deathmatch/logic/CClientColModel.h b/Client/mods/deathmatch/logic/CClientColModel.h index 6b67955cefa..70f2dbe1f4a 100644 --- a/Client/mods/deathmatch/logic/CClientColModel.h +++ b/Client/mods/deathmatch/logic/CClientColModel.h @@ -67,7 +67,7 @@ class CClientColModel : public CClientEntity } } static bool CompareVector(CVector& vecMin, CVector& vecMax) { return vecMax.fX >= vecMin.fX && vecMax.fY >= vecMin.fY && vecMax.fZ >= vecMin.fZ; } - static void AlignVector(CVector& destMin, CVector& destMax, CVector& src) + static void AlignVector(CVector& destMin, CVector& destMax, const CVector& src) { if (src.fX < destMax.fX) destMax.fX = src.fX; diff --git a/Client/sdk/game/CColModel.h b/Client/sdk/game/CColModel.h index fe2ef8bd9ee..d8ffb3cdc1a 100644 --- a/Client/sdk/game/CColModel.h +++ b/Client/sdk/game/CColModel.h @@ -16,6 +16,6 @@ class CColModelSAInterface; class CColModel { public: - virtual CColModelSAInterface* GetInterface() = 0; + virtual CColModelSAInterface* GetInterface() const = 0; virtual void Destroy() = 0; }; From 6f2ea4630ee566c5ff6b8ba31f435190c5e7bbf4 Mon Sep 17 00:00:00 2001 From: Patrik Juvonen Date: Sun, 24 Feb 2019 01:54:32 +0200 Subject: [PATCH 29/50] Use range-based loop --- Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 89b4faa3af4..05ea01742da 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -1337,12 +1337,8 @@ int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) CClientColModel::AlignVector(maxVec, minVec, pBoxMaxVec); } - std::map vecVertices = pColData->getAllVertices(); - std::map::iterator it; - for (it = vecVertices.begin(); it != vecVertices.end(); it++) - { - CClientColModel::AlignVector(maxVec, minVec, it->second.getVector()); - } + for (const auto& pair : pColData->getAllVertices()) + CClientColModel::AlignVector(maxVec, minVec, pair.second.getVector()); pBoundingBox->fRadius = std::max(DistanceBetweenPoints3D(maxVec, vecCenter), DistanceBetweenPoints3D(minVec, vecCenter)); pBoundingBox->vecOffset = vecCenter; From f3d5bc84c5413ccb2929abea69eb7e40dcd5183b Mon Sep 17 00:00:00 2001 From: Patrik Juvonen Date: Sun, 24 Feb 2019 02:05:26 +0200 Subject: [PATCH 30/50] Fix formatting, addendum to 5d8187ff71ebbe7bf68678ee48892fb8aa03e879 --- Client/game_sa/CColModelSA.h | 6 +----- .../mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp | 5 ++--- Client/sdk/game/CColModel.h | 2 +- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/Client/game_sa/CColModelSA.h b/Client/game_sa/CColModelSA.h index b54a51b383d..91964bcfe82 100644 --- a/Client/game_sa/CColModelSA.h +++ b/Client/game_sa/CColModelSA.h @@ -95,7 +95,6 @@ typedef struct y = static_cast(vec.fY * 128); z = static_cast(vec.fZ * 128); } - } CompressedVector; typedef struct @@ -127,6 +126,7 @@ typedef struct } return vertices; } + size_t getNumVertices() const { std::map vertices; @@ -176,12 +176,8 @@ typedef struct { std::map verticesUsage; for (ushort i = 0; i < numColTriangles; i++) - { for (char cVertex = 0; cVertex < 3; cVertex++) - { verticesUsage[pColTriangles[i].vertex[cVertex]]++; - } - } return verticesUsage; } } CColDataSA; diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp index b56117bdc66..bd41e367604 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp @@ -1,9 +1,8 @@ /***************************************************************************** * - * PROJECT: Multi Theft Auto v1.0 - * (Shared logic for modifications) + * PROJECT: Multi Theft Auto * LICENSE: See LICENSE in the top level directory - * FILE: MTA10/mods/shared_logic/lua/CLuaFunctionParseHelpers.cpp + * FILE: mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp * PURPOSE: * *****************************************************************************/ diff --git a/Client/sdk/game/CColModel.h b/Client/sdk/game/CColModel.h index d8ffb3cdc1a..b27d8c6f632 100644 --- a/Client/sdk/game/CColModel.h +++ b/Client/sdk/game/CColModel.h @@ -1,6 +1,6 @@ /***************************************************************************** * - * PROJECT: Multi Theft Auto v1.0 + * PROJECT: Multi Theft Auto * LICENSE: See LICENSE in the top level directory * FILE: sdk/game/CColModel.h * PURPOSE: Collision model entity interface From 4c151d9761ef353df81e236e7452fc9f394e2fcf Mon Sep 17 00:00:00 2001 From: Patrik Juvonen Date: Sun, 24 Feb 2019 02:29:51 +0200 Subject: [PATCH 31/50] Get rid of lua_pushtablevalue --- .../logic/luadefs/CLuaEngineDefs.cpp | 242 +++++++++++++----- vendor/lua/src/lapi.c | 9 - vendor/lua/src/lua.h | 1 - 3 files changed, 182 insertions(+), 70 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 05ea01742da..2e5f99fe0c6 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -978,22 +978,40 @@ int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) lua_newtable(luaVM); lua_pushstring(luaVM, "vecMin"); lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pColModelSAInterface->boundingBox.vecMin.fX); - lua_pushtablevalue(luaVM, 2, pColModelSAInterface->boundingBox.vecMin.fY); - lua_pushtablevalue(luaVM, 3, pColModelSAInterface->boundingBox.vecMin.fZ); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMin.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMin.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMin.fZ); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); lua_pushstring(luaVM, "vecMax"); lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pColModelSAInterface->boundingBox.vecMax.fX); - lua_pushtablevalue(luaVM, 2, pColModelSAInterface->boundingBox.vecMax.fY); - lua_pushtablevalue(luaVM, 3, pColModelSAInterface->boundingBox.vecMax.fZ); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMax.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMax.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMax.fZ); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); lua_pushstring(luaVM, "vecOffset"); lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pColModelSAInterface->boundingBox.vecOffset.fX); - lua_pushtablevalue(luaVM, 2, pColModelSAInterface->boundingBox.vecOffset.fY); - lua_pushtablevalue(luaVM, 3, pColModelSAInterface->boundingBox.vecOffset.fZ); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecOffset.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecOffset.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecOffset.fZ); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); lua_pushstring(luaVM, "radius"); lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.fRadius); @@ -1086,15 +1104,33 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { CColBoxSA pBox = pColData->pColBoxes[usIndex]; lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pBox.min.fX); - lua_pushtablevalue(luaVM, 2, pBox.min.fY); - lua_pushtablevalue(luaVM, 3, pBox.min.fZ); - lua_pushtablevalue(luaVM, 4, pBox.max.fX); - lua_pushtablevalue(luaVM, 5, pBox.max.fY); - lua_pushtablevalue(luaVM, 6, pBox.max.fZ); - lua_pushtablevalue(luaVM, 7, pBox.material); - lua_pushtablevalue(luaVM, 8, pBox.lighting.day); - lua_pushtablevalue(luaVM, 9, pBox.lighting.night); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pBox.min.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pBox.min.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pBox.min.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pBox.max.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pBox.max.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pBox.max.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 7); + lua_pushnumber(luaVM, pBox.material); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 8); + lua_pushnumber(luaVM, pBox.lighting.day); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 9); + lua_pushnumber(luaVM, pBox.lighting.night); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); return 1; } @@ -1114,15 +1150,33 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) lua_pushnumber(luaVM, i + 1); CColBoxSA pBox = pColData->pColBoxes[i]; lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pBox.min.fX); - lua_pushtablevalue(luaVM, 2, pBox.min.fY); - lua_pushtablevalue(luaVM, 3, pBox.min.fZ); - lua_pushtablevalue(luaVM, 4, pBox.max.fX); - lua_pushtablevalue(luaVM, 5, pBox.max.fY); - lua_pushtablevalue(luaVM, 6, pBox.max.fZ); - lua_pushtablevalue(luaVM, 7, pBox.material); - lua_pushtablevalue(luaVM, 8, pBox.lighting.day); - lua_pushtablevalue(luaVM, 9, pBox.lighting.night); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pBox.min.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pBox.min.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pBox.min.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pBox.max.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pBox.max.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pBox.max.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 7); + lua_pushnumber(luaVM, pBox.material); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 8); + lua_pushnumber(luaVM, pBox.lighting.day); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 9); + lua_pushnumber(luaVM, pBox.lighting.night); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); } return 1; @@ -1136,13 +1190,27 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { CColSphereSA pSphere = pColData->pColSpheres[usIndex]; lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pSphere.vecCenter.fX); - lua_pushtablevalue(luaVM, 2, pSphere.vecCenter.fY); - lua_pushtablevalue(luaVM, 3, pSphere.vecCenter.fZ); - lua_pushtablevalue(luaVM, 4, pSphere.fRadius); - lua_pushtablevalue(luaVM, 5, pSphere.material); - lua_pushtablevalue(luaVM, 6, pSphere.lighting.day); - lua_pushtablevalue(luaVM, 7, pSphere.lighting.night); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pSphere.vecCenter.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pSphere.vecCenter.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pSphere.vecCenter.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pSphere.fRadius); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pSphere.material); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pSphere.lighting.day); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 7); + lua_pushnumber(luaVM, pSphere.lighting.night); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); return 1; } @@ -1163,13 +1231,27 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) lua_pushnumber(luaVM, i + 1); pSphere = pColData->pColSpheres[i]; lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, pSphere.vecCenter.fX); - lua_pushtablevalue(luaVM, 2, pSphere.vecCenter.fY); - lua_pushtablevalue(luaVM, 3, pSphere.vecCenter.fZ); - lua_pushtablevalue(luaVM, 4, pSphere.fRadius); - lua_pushtablevalue(luaVM, 5, pSphere.material); - lua_pushtablevalue(luaVM, 6, pSphere.lighting.day); - lua_pushtablevalue(luaVM, 7, pSphere.lighting.night); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, pSphere.vecCenter.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, pSphere.vecCenter.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, pSphere.vecCenter.fZ); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pSphere.fRadius); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pSphere.material); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pSphere.lighting.day); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 7); + lua_pushnumber(luaVM, pSphere.lighting.night); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); } return 1; @@ -1183,12 +1265,24 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { CColTriangleSA pTriangle = pColData->pColTriangles[usIndex]; lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, static_cast(pTriangle.vertex[0] + 1)); - lua_pushtablevalue(luaVM, 2, static_cast(pTriangle.vertex[1] + 1)); - lua_pushtablevalue(luaVM, 3, static_cast(pTriangle.vertex[2] + 1)); - lua_pushtablevalue(luaVM, 4, static_cast(pTriangle.material)); - lua_pushtablevalue(luaVM, 5, static_cast(pTriangle.lighting.day)); - lua_pushtablevalue(luaVM, 6, static_cast(pTriangle.lighting.night)); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, static_cast(pTriangle.vertex[0] + 1)); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, static_cast(pTriangle.vertex[1] + 1)); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, static_cast(pTriangle.vertex[2] + 1)); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pTriangle.material); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pTriangle.lighting.day); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pTriangle.lighting.night); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); return 1; } @@ -1209,12 +1303,24 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) lua_pushnumber(luaVM, i + 1); pTriangle = pColData->pColTriangles[i]; lua_newtable(luaVM); - lua_pushtablevalue(luaVM, 1, static_cast(pTriangle.vertex[0] + 1)); - lua_pushtablevalue(luaVM, 2, static_cast(pTriangle.vertex[1] + 1)); - lua_pushtablevalue(luaVM, 3, static_cast(pTriangle.vertex[2] + 1)); - lua_pushtablevalue(luaVM, 4, pTriangle.material); - lua_pushtablevalue(luaVM, 5, pTriangle.lighting.day); - lua_pushtablevalue(luaVM, 6, pTriangle.lighting.night); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, static_cast(pTriangle.vertex[0] + 1)); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, static_cast(pTriangle.vertex[1] + 1)); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, static_cast(pTriangle.vertex[2] + 1)); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 4); + lua_pushnumber(luaVM, pTriangle.material); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 5); + lua_pushnumber(luaVM, pTriangle.lighting.day); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 6); + lua_pushnumber(luaVM, pTriangle.lighting.night); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); } return 1; @@ -1235,9 +1341,15 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) CompressedVector pTriangle = pColData->pVertices[usIndex]; lua_newtable(luaVM); CVector vec = pTriangle.getVector(); - lua_pushtablevalue(luaVM, 1, vec.fX); - lua_pushtablevalue(luaVM, 2, vec.fY); - lua_pushtablevalue(luaVM, 3, vec.fZ); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, vec.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, vec.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, vec.fZ); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); return 1; } @@ -1267,9 +1379,15 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) lua_newtable(luaVM); pVertex = pColData->pVertices[i]; vec = pVertex.getVector(); - lua_pushtablevalue(luaVM, 1, vec.fX); - lua_pushtablevalue(luaVM, 2, vec.fY); - lua_pushtablevalue(luaVM, 3, vec.fZ); + lua_pushnumber(luaVM, 1); + lua_pushnumber(luaVM, vec.fX); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 2); + lua_pushnumber(luaVM, vec.fY); + lua_settable(luaVM, -3); + lua_pushnumber(luaVM, 3); + lua_pushnumber(luaVM, vec.fZ); + lua_settable(luaVM, -3); lua_settable(luaVM, -3); } return 1; @@ -1747,7 +1865,11 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) lua_pushboolean(luaVM, false); lua_newtable(luaVM); for (unsigned int it : vecFailed) - lua_pushtablevalue(luaVM, i++, it + 1); + { + lua_pushnumber(luaVM, i++); + lua_pushnumber(luaVM, it + 1); + lua_settable(luaVM, -3); + } return 2; } else diff --git a/vendor/lua/src/lapi.c b/vendor/lua/src/lapi.c index 66ca4357762..88b1a8ac6a4 100644 --- a/vendor/lua/src/lapi.c +++ b/vendor/lua/src/lapi.c @@ -1134,12 +1134,3 @@ LUA_API void lua_addtotalbytes(lua_State *L, int n) global_State *g = G(L); g->totalbytes += n; } - -// MTA addition to shorten the code mainly for collision functions -// working as lua: thisTable[n] = v -LUA_API void lua_pushtablevalue(lua_State *L, int n, float v) -{ - lua_pushnumber(L, n); - lua_pushnumber(L, v); - lua_settable(L, -3); -} diff --git a/vendor/lua/src/lua.h b/vendor/lua/src/lua.h index 514e89a9bef..8223e5792d1 100644 --- a/vendor/lua/src/lua.h +++ b/vendor/lua/src/lua.h @@ -185,7 +185,6 @@ LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n); LUA_API void (lua_pushboolean) (lua_State *L, int b); LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p); LUA_API int (lua_pushthread) (lua_State *L); -LUA_API void (lua_pushtablevalue) (lua_State *L, int n, float v); /* ** get functions (Lua -> stack) From c63b525b869765f178ae4b13fd0ddd0011c44a6f Mon Sep 17 00:00:00 2001 From: Sebastian Jura Date: Mon, 4 May 2020 18:51:00 +0200 Subject: [PATCH 32/50] Update Client/mods/deathmatch/logic/CClientColModel.h Co-authored-by: Qais Patankar --- Client/mods/deathmatch/logic/CClientColModel.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientColModel.h b/Client/mods/deathmatch/logic/CClientColModel.h index 653556bf571..5518682ab70 100644 --- a/Client/mods/deathmatch/logic/CClientColModel.h +++ b/Client/mods/deathmatch/logic/CClientColModel.h @@ -61,11 +61,8 @@ class CClientColModel : public CClientEntity (MAX_COLLISION_SIZE2 >= vec.fX - fRadius >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fY - fRadius >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fZ - fRadius >= -MAX_COLLISION_SIZE2)); } - else - { - return (MAX_COLLISION_SIZE2 >= vec.fX && vec.fX >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fY && vec.fY >= -MAX_COLLISION_SIZE2 && + return (MAX_COLLISION_SIZE2 >= vec.fX && vec.fX >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fY && vec.fY >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fZ && vec.fZ >= -MAX_COLLISION_SIZE2); - } } static bool CompareVector(CVector& vecMin, CVector& vecMax) { return vecMax.fX >= vecMin.fX && vecMax.fY >= vecMin.fY && vecMax.fZ >= vecMin.fZ; } static void AlignVector(CVector& destMin, CVector& destMax, const CVector& src) From f46f5296988d4da4ed15e7137f32f5112ec95f1f Mon Sep 17 00:00:00 2001 From: Sebastian Jura Date: Mon, 4 May 2020 18:51:09 +0200 Subject: [PATCH 33/50] Update Client/mods/deathmatch/logic/CClientColModel.h Co-authored-by: Qais Patankar --- Client/mods/deathmatch/logic/CClientColModel.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Client/mods/deathmatch/logic/CClientColModel.h b/Client/mods/deathmatch/logic/CClientColModel.h index 5518682ab70..58692177663 100644 --- a/Client/mods/deathmatch/logic/CClientColModel.h +++ b/Client/mods/deathmatch/logic/CClientColModel.h @@ -99,5 +99,9 @@ class CClientColModel : public CClientEntity unsigned short m_usVerticesCount; CColModel* m_pColModel; std::list m_Replaced; - bool b_hasChanged; // For updating bounding box, update only if necessary. True default due object loaded collision could have wrong bounding box. + + // m_bHasChanged should be set to true when the bounding box has changed. + // This ensures that the bounding box is only recalculated when necessary. + // This is true by default as an object loaded collision could have the wrong bounding box. + bool b_hasChanged = true; }; From 8825887882958f7039d9a162b31c4c4517796979 Mon Sep 17 00:00:00 2001 From: Sebastian Jura Date: Mon, 4 May 2020 18:52:18 +0200 Subject: [PATCH 34/50] Update Client/mods/deathmatch/logic/CClientColModel.h Co-authored-by: Qais Patankar --- Client/mods/deathmatch/logic/CClientColModel.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Client/mods/deathmatch/logic/CClientColModel.h b/Client/mods/deathmatch/logic/CClientColModel.h index 58692177663..d93c50b2146 100644 --- a/Client/mods/deathmatch/logic/CClientColModel.h +++ b/Client/mods/deathmatch/logic/CClientColModel.h @@ -64,7 +64,11 @@ class CClientColModel : public CClientEntity return (MAX_COLLISION_SIZE2 >= vec.fX && vec.fX >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fY && vec.fY >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fZ && vec.fZ >= -MAX_COLLISION_SIZE2); } + + // CompareVector returns true if all points in the second vector are greater than the corresponding points in the first vector static bool CompareVector(CVector& vecMin, CVector& vecMax) { return vecMax.fX >= vecMin.fX && vecMax.fY >= vecMin.fY && vecMax.fZ >= vecMin.fZ; } + + // AlignVector clamps a "source" vector between a min and max vector. Or something like that. I don't know. static void AlignVector(CVector& destMin, CVector& destMax, const CVector& src) { if (src.fX < destMax.fX) From 9ff0ca6e7e03e2d2e3bae67a21d8fbf7b48ae66f Mon Sep 17 00:00:00 2001 From: Sebastian Jura Date: Sun, 24 May 2020 18:11:03 +0200 Subject: [PATCH 35/50] Update Client/mods/deathmatch/logic/CClientColModel.h Co-authored-by: Qais Patankar --- Client/mods/deathmatch/logic/CClientColModel.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientColModel.h b/Client/mods/deathmatch/logic/CClientColModel.h index d93c50b2146..7877c4e261e 100644 --- a/Client/mods/deathmatch/logic/CClientColModel.h +++ b/Client/mods/deathmatch/logic/CClientColModel.h @@ -46,11 +46,8 @@ class CClientColModel : public CClientEntity (MAX_COLLISION_SIZE >= vec.fX - fRadius && vec.fX - fRadius >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fY - fRadius && vec.fY - fRadius >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fZ - fRadius && vec.fZ - fRadius >= -MAX_COLLISION_SIZE); } - else - { - return (MAX_COLLISION_SIZE >= vec.fX && vec.fX >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fY && vec.fY >= -MAX_COLLISION_SIZE && + return (MAX_COLLISION_SIZE >= vec.fX && vec.fX >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fY && vec.fY >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fZ && vec.fZ >= -MAX_COLLISION_SIZE); - } } static bool CheckMoveVector(CVector& vec, float fRadius = 0) { From 31b51a7b4e38f77c552359412c33b6d3dad639f3 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sun, 24 May 2020 18:40:35 +0200 Subject: [PATCH 36/50] fixing conflicts --- .../logic/lua/CLuaFunctionParseHelpers.cpp | 17 - .../logic/lua/CLuaFunctionParseHelpers.h | 8 - .../logic/luadefs/CLuaEngineDefs.cpp | 962 +----------------- 3 files changed, 2 insertions(+), 985 deletions(-) diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp index 7c8de4c26a4..01ae148c31e 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp @@ -580,23 +580,6 @@ ADD_ENUM(WING_AIRTRAIL, "wing_airtrail") ADD_ENUM(VEH_GUN, "veh_gun") IMPLEMENT_ENUM_END("vehicle-dummy") -IMPLEMENT_ENUM_BEGIN(eCollisionShapes) -ADD_ENUM(COLLISION_BOX, "box") -ADD_ENUM(COLLISION_SPHERE, "sphere") -ADD_ENUM(COLLISION_TRIANGLE, "triangle") -ADD_ENUM(COLLISION_VERTEX, "vertex") -IMPLEMENT_ENUM_END("collision-shape") - -IMPLEMENT_ENUM_BEGIN(eCollisionKey) -ADD_ENUM(COLLISION_KEY_SIZE, "size") -ADD_ENUM(COLLISION_KEY_MATERIAL, "material") -ADD_ENUM(COLLISION_KEY_POSITION, "position") -ADD_ENUM(COLLISION_KEY_RADIUS, "radius") -ADD_ENUM(COLLISION_KEY_LIGHTING, "lighting") -ADD_ENUM(COLLISION_KEY_VERTICES, "vertices") -ADD_ENUM(COLLISION_KEY_MOVE, "move") -IMPLEMENT_ENUM_END("collision-key") - IMPLEMENT_ENUM_BEGIN(eSurfaceProperties) ADD_ENUM(SURFACE_PROPERTY_AUDIO, "audio") ADD_ENUM(SURFACE_PROPERTY_STEPWATERSPLASH, "stepwatersplash") diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h index f657386c91d..7d0114062b0 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h @@ -428,14 +428,6 @@ inline SString GetClassTypeName(eVehicleDummies*) { return "vehicle-dummy"; } -inline SString GetClassTypeName(eCollisionShapes*) -{ - return "collision-shape"; -} -inline SString GetClassTypeName(eCollisionKey*) -{ - return "collision-key"; -} inline SString GetClassTypeName(eSurfaceProperties*) { return "surface-property-type"; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 4358bba01f5..aa0204879a4 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -42,13 +42,6 @@ void CLuaEngineDefs::LoadFunctions() {"engineGetModelIDFromName", EngineGetModelIDFromName}, {"engineGetModelTextureNames", EngineGetModelTextureNames}, {"engineGetVisibleTextureNames", EngineGetVisibleTextureNames}, -<<<<<<<<< Temporary merge branch 1 - {"engineGetModelCollisionProperties", EngineGetModelCollisionProperties }, - {"engineGetModelCollisionData", EngineGetModelCollisionData}, - {"engineSetModelCollisionData", EngineSetModelCollisionData}, - {"engineUpdateModelCollisionBoundingBox", EngineUpdateModelCollisionBoundingBox }, - {"isModelCollisionLoaded", IsModelCollisionLoaded }, -========= {"engineSetModelVisibleTime", EngineSetModelVisibleTime}, {"engineGetModelVisibleTime", EngineGetModelVisibleTime}, {"engineGetModelTextures", EngineGetModelTextures}, @@ -60,8 +53,8 @@ void CLuaEngineDefs::LoadFunctions() {"engineRestoreModelPhysicalPropertiesGroup", EngineRestoreModelPhysicalPropertiesGroup}, {"engineSetObjectGroupPhysicalProperty", EngineSetObjectGroupPhysicalProperty}, {"engineGetObjectGroupPhysicalProperty", EngineGetObjectGroupPhysicalProperty}, - {"engineRestoreObjectGroupPhysicalProperties", EngineRestoreObjectGroupPhysicalProperties} - {"engineGetModelCollisionProperties", EngineGetModelCollisionProperties }, + {"engineRestoreObjectGroupPhysicalProperties", EngineRestoreObjectGroupPhysicalProperties}, + {"engineGetModelCollisionProperties", EngineGetModelCollisionProperties}, {"engineGetModelCollisionData", EngineGetModelCollisionData}, {"engineSetModelCollisionData", EngineSetModelCollisionData}, {"engineUpdateModelCollisionBoundingBox", EngineUpdateModelCollisionBoundingBox }, @@ -1127,121 +1120,6 @@ int CLuaEngineDefs::EngineGetVisibleTextureNames(lua_State* luaVM) return 1; } -CColModelSAInterface* GetModelCollisionInterface(ushort usModel) -{ - if (CClientObjectManager::IsValidModel(usModel)) - { - CBaseModelInfoSAInterface* pModelInfo = ppModelInfo[usModel]; - if (pModelInfo != nullptr) - { - CColModelSAInterface* pColModelInterface = pModelInfo->pColModel; - if (pColModelInterface) - { - return pColModelInterface; - } - } - } - return nullptr; -} - -int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) -{ - CClientColModel* pCol = nullptr; - unsigned short usModel = 0; - CScriptArgReader argStream(luaVM); - // Grab the COL or model ID - // If COL element then read custom collision, otherwise read original collision - if (argStream.NextIsNumber()) - argStream.ReadNumber(usModel); - else - argStream.ReadUserData(pCol); - - if (!argStream.HasErrors()) - { - CColModelSAInterface* pColModelSAInterface; - if (pCol) - pColModelSAInterface = pCol->GetColModelInterface(); - else - pColModelSAInterface = GetModelCollisionInterface(usModel); - - if (pColModelSAInterface) - { - lua_newtable(luaVM); - lua_pushstring(luaVM, "boundingBox"); - lua_newtable(luaVM); - lua_pushstring(luaVM, "vecMin"); - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMin.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMin.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMin.fZ); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - - lua_pushstring(luaVM, "vecMax"); - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMax.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMax.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMax.fZ); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "vecOffset"); - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecOffset.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecOffset.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecOffset.fZ); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "radius"); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.fRadius); - lua_settable(luaVM, -3); - - CColDataSA* pColData = pColModelSAInterface->pColData; - if (pColData != nullptr) - { - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "colBoxes"); - lua_pushnumber(luaVM, pColData->numColBoxes); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "colSpheres"); - lua_pushnumber(luaVM, pColData->numColSpheres); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "colTriangles"); - lua_pushnumber(luaVM, pColData->numColTriangles); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "colVertices"); - if (pCol) - lua_pushnumber(luaVM, pCol->GetVerticesCount()); - else - lua_pushnumber(luaVM, pColData->getNumVertices()); - lua_settable(luaVM, -3); - } - - return 1; - } - } - if (argStream.HasErrors()) - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - // Failed - lua_pushboolean(luaVM, false); - return 1; -} - int CLuaEngineDefs::EngineSetModelVisibleTime(lua_State* luaVM) { // bool engineSetModelVisibleTime ( int/string modelID, int hourOn, int hourOff ) @@ -1276,363 +1154,6 @@ int CLuaEngineDefs::EngineSetModelVisibleTime(lua_State* luaVM) return 1; } -int CLuaEngineDefs::IsModelCollisionLoaded(lua_State* luaVM) -{ - ushort usModel; - CScriptArgReader argStream(luaVM); - argStream.ReadNumber(usModel); - if (!argStream.HasErrors()) - { - lua_pushboolean(luaVM, GetModelCollisionInterface(usModel) != nullptr); - return 1; - } - if (argStream.HasErrors()) - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushnil(luaVM); - return 1; -} - -int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) -{ - CClientColModel* pCol = nullptr; - unsigned short usModel = 0; - CScriptArgReader argStream(luaVM); - // Grab the COL or model ID - // If COL element then read custom collision, otherwise read original collision - if (argStream.NextIsNumber()) - argStream.ReadNumber(usModel); - else - argStream.ReadUserData(pCol); - - if (!argStream.HasErrors()) - { - CColModelSAInterface* pColModelSAInterface; - if (pCol) - pColModelSAInterface = pCol->GetColModelInterface(); - else - pColModelSAInterface = GetModelCollisionInterface(usModel); - - if (pColModelSAInterface) - { - ushort usIndex; - eCollisionShapes eCollisionShape; - argStream.ReadEnumString(eCollisionShape); - argStream.ReadNumber(usIndex, 0); - CColDataSA* pColData = pColModelSAInterface->pColData; - if (pColData) - { - switch (eCollisionShape) - { - case COLLISION_BOX: - if (usIndex > 0) - { - usIndex--; - if (pColData->isValidIndex(COLLISION_BOX, usIndex)) - { - CColBoxSA pBox = pColData->pColBoxes[usIndex]; - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pBox.min.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pBox.min.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pBox.min.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pBox.max.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pBox.max.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pBox.max.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 7); - lua_pushnumber(luaVM, pBox.material); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 8); - lua_pushnumber(luaVM, pBox.lighting.day); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 9); - lua_pushnumber(luaVM, pBox.lighting.night); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - return 1; - } - else - { - argStream.SetCustomError("Invalid box index."); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - } - else - { - lua_newtable(luaVM); - for (uint i = 0; pColData->numColBoxes > i; i++) - { - lua_pushnumber(luaVM, i + 1); - CColBoxSA pBox = pColData->pColBoxes[i]; - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pBox.min.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pBox.min.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pBox.min.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pBox.max.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pBox.max.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pBox.max.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 7); - lua_pushnumber(luaVM, pBox.material); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 8); - lua_pushnumber(luaVM, pBox.lighting.day); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 9); - lua_pushnumber(luaVM, pBox.lighting.night); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - } - return 1; - } - break; - case COLLISION_SPHERE: - if (usIndex > 0) - { - usIndex--; - if (pColData->isValidIndex(COLLISION_SPHERE, usIndex)) - { - CColSphereSA pSphere = pColData->pColSpheres[usIndex]; - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pSphere.vecCenter.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pSphere.vecCenter.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pSphere.vecCenter.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pSphere.fRadius); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pSphere.material); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pSphere.lighting.day); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 7); - lua_pushnumber(luaVM, pSphere.lighting.night); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - return 1; - } - else - { - argStream.SetCustomError("Invalid sphere index."); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - } - else - { - lua_newtable(luaVM); - CColSphereSA pSphere; - for (uint i = 0; pColData->numColSpheres > i; i++) - { - lua_pushnumber(luaVM, i + 1); - pSphere = pColData->pColSpheres[i]; - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pSphere.vecCenter.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pSphere.vecCenter.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pSphere.vecCenter.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pSphere.fRadius); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pSphere.material); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pSphere.lighting.day); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 7); - lua_pushnumber(luaVM, pSphere.lighting.night); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - } - return 1; - } - break; - case COLLISION_TRIANGLE: - if (usIndex > 0) - { - usIndex--; - if (pColData->isValidIndex(COLLISION_TRIANGLE, usIndex)) - { - CColTriangleSA pTriangle = pColData->pColTriangles[usIndex]; - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, static_cast(pTriangle.vertex[0] + 1)); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, static_cast(pTriangle.vertex[1] + 1)); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, static_cast(pTriangle.vertex[2] + 1)); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pTriangle.material); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pTriangle.lighting.day); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pTriangle.lighting.night); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - return 1; - } - else - { - argStream.SetCustomError("Invalid triangle index."); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - } - else - { - lua_newtable(luaVM); - CColTriangleSA pTriangle; - for (uint i = 0; pColData->numColTriangles > i; i++) - { - lua_pushnumber(luaVM, i + 1); - pTriangle = pColData->pColTriangles[i]; - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, static_cast(pTriangle.vertex[0] + 1)); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, static_cast(pTriangle.vertex[1] + 1)); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, static_cast(pTriangle.vertex[2] + 1)); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pTriangle.material); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pTriangle.lighting.day); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pTriangle.lighting.night); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - } - return 1; - } - break; - case COLLISION_VERTEX: - if (usIndex > 0) - { - usIndex--; - unsigned short usNumVertices; - if (pCol) - usNumVertices = pCol->GetVerticesCount(); - else - usNumVertices = pColData->getNumVertices(); - - if (pColData->isValidIndex(COLLISION_VERTEX, usIndex, usNumVertices)) - { - CompressedVector pTriangle = pColData->pVertices[usIndex]; - lua_newtable(luaVM); - CVector vec = pTriangle.getVector(); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, vec.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, vec.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, vec.fZ); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - return 1; - } - else - { - argStream.SetCustomError("Invalid vertex index."); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - } - else - { - unsigned short usNumVertices; - if (pCol) - usNumVertices = pCol->GetVerticesCount(); - else - usNumVertices = pColData->getNumVertices(); - - CVector vec; - CompressedVector pVertex; - - lua_newtable(luaVM); - for (ushort i = 0; i < usNumVertices; i++) - { - lua_pushnumber(luaVM, i + 1); - lua_newtable(luaVM); - pVertex = pColData->pVertices[i]; - vec = pVertex.getVector(); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, vec.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, vec.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, vec.fZ); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - } - return 1; - } - break; - } - } - } - } - if (argStream.HasErrors()) - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - // Failed - lua_pushboolean(luaVM, false); - return 1; -} - int CLuaEngineDefs::EngineGetModelVisibleTime(lua_State* luaVM) { // int, int engineGetModelVisibleTime ( int/string modelID ) @@ -1670,485 +1191,6 @@ int CLuaEngineDefs::EngineGetModelVisibleTime(lua_State* luaVM) return 1; } -int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) -{ - CClientColModel* pCol = nullptr; - CVector vecCenter; - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pCol); - argStream.ReadVector3D(vecCenter, CVector(0, 0, 0)); - - if (!argStream.HasErrors()) - { - CColModelSAInterface* pColModelSAInterface; - if (pCol) - pColModelSAInterface = pCol->GetColModelInterface(); - - if (pColModelSAInterface) - { - if (!pCol->HasChanged()) - { - lua_pushboolean(luaVM, true); // bounding box already updated. - return 1; - } - CColDataSA* pColData = pColModelSAInterface->pColData; - CBoundingBoxSA* pBoundingBox = &pColModelSAInterface->boundingBox; - CVector minVec(0, 0, 0); - CVector maxVec(0, 0, 0); - CVector pBoxMinVec, pBoxMaxVec; - - CColSphereSA pSphere; - CColBoxSA pBox; - for (uint i = 0; pColData->numColBoxes > i; i++) - { - pBox = pColData->pColBoxes[i]; - CClientColModel::AlignVector(maxVec, minVec, pBox.min); - CClientColModel::AlignVector(maxVec, minVec, pBox.max); - } - - for (uint i = 0; pColData->numColSpheres > i; i++) - { - pSphere = pColData->pColSpheres[i]; - pBoxMaxVec = pSphere.vecCenter; - pBoxMaxVec.fX += pSphere.fRadius; - pBoxMaxVec.fY += pSphere.fRadius; - pBoxMaxVec.fZ += pSphere.fRadius; - CClientColModel::AlignVector(maxVec, minVec, pBoxMaxVec); - - pBoxMaxVec.fX -= pSphere.fRadius * 2; - pBoxMaxVec.fY -= pSphere.fRadius * 2; - pBoxMaxVec.fZ -= pSphere.fRadius * 2; - CClientColModel::AlignVector(maxVec, minVec, pBoxMaxVec); - } - - for (const auto& pair : pColData->getAllVertices()) - CClientColModel::AlignVector(maxVec, minVec, pair.second.getVector()); - - pBoundingBox->fRadius = std::max(DistanceBetweenPoints3D(maxVec, vecCenter), DistanceBetweenPoints3D(minVec, vecCenter)); - pBoundingBox->vecOffset = vecCenter; - pBoundingBox->vecMax = maxVec; - pBoundingBox->vecMin = minVec; - pCol->SetCollisionHasChanged(false); - lua_pushboolean(luaVM, true); - return 1; - } - } - lua_pushboolean(luaVM, false); - return 1; -} - -int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) -{ - CClientColModel* pCol = nullptr; - std::vector vecUncheckedShapeId, vecShapeId, vecFailed; - eCollisionShapes eCollisionShape; - eCollisionKey eCollisionKey; - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pCol); - argStream.ReadEnumString(eCollisionShape); - argStream.ReadEnumString(eCollisionKey); - if (argStream.NextIsNumber()) - { - uint usShapeId; - argStream.ReadNumber(usShapeId); - vecUncheckedShapeId.push_back(usShapeId); - } - else - argStream.ReadNumberTable(vecUncheckedShapeId); - - CColModelSAInterface* pColModelSAInterface; - if (!argStream.HasErrors()) - { - if (pCol) - pColModelSAInterface = pCol->GetColModelInterface(); - - if (pColModelSAInterface) - { - CColDataSA* pColData = pColModelSAInterface->pColData; - ushort numVertices = pCol->GetVerticesCount(); - for (ushort i = 0; i != vecUncheckedShapeId.size(); i++) - { - if (pColData->isValidIndex(eCollisionShape, vecUncheckedShapeId[i] - 1, numVertices)) - vecShapeId.push_back(vecUncheckedShapeId[i] - 1); - else - vecFailed.push_back(vecUncheckedShapeId[i] - 1); - } - - std::sort(vecShapeId.begin(), vecShapeId.end()); - vecShapeId.erase(unique(vecShapeId.begin(), vecShapeId.end()), vecShapeId.end()); - - if (vecFailed.size() == 0) - { - CVector vec1, vec2; - - switch (eCollisionShape) - { - case COLLISION_BOX: - CColBoxSA* pBox; - switch (eCollisionKey) - { - case COLLISION_KEY_MATERIAL: - uint cSurface; - argStream.ReadNumber(cSurface); - if (!argStream.HasErrors()) - { - if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) - { - for (unsigned int it : vecShapeId) - { - pBox = &pColData->pColBoxes[it]; - pBox->material = cSurface; - } - } - else - argStream.SetCustomError("Invalid material id."); - } - break; - case COLLISION_KEY_SIZE: - if (argStream.NextIsBool()) - { - bool bMinVector; - argStream.ReadBool(bMinVector); // true = min, false = max - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) - { - if (CClientColModel::CheckVector(vec1)) - { - if (bMinVector) - { - for (unsigned int it : vecShapeId) - { - pBox = &pColData->pColBoxes[it]; - if (!CClientColModel::CompareVector(vec1, pBox->max)) - vecFailed.push_back(it); - } - if (vecFailed.size() == 0) - { - for (unsigned int it : vecShapeId) - { - pBox = &pColData->pColBoxes[it]; - pBox->min = vec1; - } - } - } - else - { - for (unsigned int it : vecShapeId) - { - pBox = &pColData->pColBoxes[it]; - if (!CClientColModel::CompareVector(pBox->min, vec1)) - vecFailed.push_back(it); - } - if (vecFailed.size() == 0) - { - for (unsigned int it : vecShapeId) - { - pBox = &pColData->pColBoxes[it]; - pBox->max = vec1; - } - } - } - } - else - argStream.SetCustomError("Position is out of bounding box."); - } - } - else - { - argStream.ReadVector3D(vec1); - argStream.ReadVector3D(vec2); - if (!argStream.HasErrors()) - { - if (CClientColModel::CheckVector(vec1)) - { - if (CClientColModel::CheckVector(vec2)) - { - if (CClientColModel::CompareVector(vec1, vec2)) - { - for (unsigned int it : vecShapeId) - { - pBox = &pColData->pColBoxes[it]; - pBox->min = vec1; - pBox->max = vec2; - } - } - else - argStream.SetCustomError("Second position need to be greater than first."); - } - else - argStream.SetCustomError("Second position is out of bounding box."); - } - else - argStream.SetCustomError("First position is out of bounding box."); - } - } - break; - case COLLISION_KEY_POSITION: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) - { - for (unsigned int it : vecShapeId) - { - pBox = &pColData->pColBoxes[it]; - vec2 = CVector(pBox->min.fX + pBox->max.fX, pBox->min.fY + pBox->max.fY, pBox->min.fZ + pBox->max.fZ) / 2; - if (!CClientColModel::CheckVector(pBox->min + (vec1 - vec2)) || - !CClientColModel::CheckVector(pBox->max + (vec1 - vec2))) - vecFailed.push_back(it); - } - if (vecFailed.size()) - { - for (unsigned int it : vecShapeId) - { - pBox = &pColData->pColBoxes[it]; - vec2 = CVector(pBox->min.fX + pBox->max.fX, pBox->min.fY + pBox->max.fY, pBox->min.fZ + pBox->max.fZ) / 2; - pBox->min += (vec1 - vec2); - pBox->max += (vec1 - vec2); - } - } - } - break; - case COLLISION_KEY_MOVE: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) - { - for (unsigned int it : vecShapeId) - { - pBox = &pColData->pColBoxes[it]; - if (!(CClientColModel::CheckVector(pBox->min + vec1) && CClientColModel::CheckVector(pBox->max + vec1))) - vecFailed.push_back(it); - } - if (vecFailed.size() == 0) - { - for (unsigned int it : vecShapeId) - { - pBox = &pColData->pColBoxes[it]; - pBox->min += vec1; - pBox->max += vec1; - } - } - } - } - break; - case COLLISION_SPHERE: - CColSphereSA* pSphere; - switch (eCollisionKey) - { - case COLLISION_KEY_POSITION: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) - { - if (CClientColModel::CheckVector(vec1)) - { - for (unsigned int it : vecShapeId) - { - pSphere = &pColData->pColSpheres[it]; - if (!CClientColModel::CheckVector(vec1, pSphere->fRadius)) - vecFailed.push_back(it); - } - - if (vecFailed.size() == 0) - { - for (unsigned int it : vecShapeId) - { - pSphere = &pColData->pColSpheres[it]; - pSphere->vecCenter = vec1; - } - } - } - else - argStream.SetCustomError("First position is out of bounding box."); - } - break; - case COLLISION_KEY_MOVE: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) - { - if (CClientColModel::CheckMoveVector(vec1)) - { - for (unsigned int it : vecShapeId) - { - pSphere = &pColData->pColSpheres[it]; - if (!CClientColModel::CheckVector(pSphere->vecCenter + vec1, pSphere->fRadius)) - vecFailed.push_back(it); - } - if (vecFailed.size() == 0) - { - for (unsigned int it : vecShapeId) - { - pSphere = &pColData->pColSpheres[it]; - pSphere->vecCenter += vec1; - } - } - } - else - argStream.SetCustomError("You can't move furher than 256 units in each axis."); - } - break; - case COLLISION_KEY_RADIUS: - float fRadius; - argStream.ReadNumber(fRadius); - if (!argStream.HasErrors()) - { - if (fRadius >= 0 && fRadius <= 256) // bigger than 256 are sure that are outside bounding - { - for (unsigned int it : vecShapeId) - { - pSphere = &pColData->pColSpheres[it]; - if (!CClientColModel::CheckVector(pSphere->vecCenter, fRadius)) - vecFailed.push_back(it); - } - if (vecFailed.size() == 0) - { - for (unsigned int it : vecShapeId) - { - pSphere = &pColData->pColSpheres[it]; - pSphere->fRadius = fRadius; - } - } - } - else - argStream.SetCustomError("Radius must be between 0 and 256."); - } - break; - case COLLISION_KEY_MATERIAL: - uint cSurface; - argStream.ReadNumber(cSurface); - if (!argStream.HasErrors()) - { - if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) - { - for (unsigned int it : vecShapeId) - { - pSphere = &pColData->pColSpheres[it]; - pSphere->material = cSurface; - } - } - else - argStream.SetCustomError("Invalid material id."); - } - } - break; - case COLLISION_TRIANGLE: - CColTriangleSA* pTriangle; - switch (eCollisionKey) - { - case COLLISION_KEY_MATERIAL: - uint cSurface; - argStream.ReadNumber(cSurface); - if (!argStream.HasErrors()) - { - if (cSurface >= EColSurfaceValue::DEFAULT && cSurface <= EColSurfaceValue::RAILTRACK) - { - for (unsigned int it : vecShapeId) - { - pTriangle = &pColData->pColTriangles[it]; - pTriangle->material = cSurface; - } - } - else - argStream.SetCustomError("Invalid material id."); - } - case COLLISION_KEY_LIGHTING: - uint cDay, cNight; - argStream.ReadNumber(cDay); - argStream.ReadNumber(cNight); - if (!argStream.HasErrors()) - { - if (cDay >= 0 && cDay <= 15) - { - if (cNight >= 0 && cNight <= 15) - { - for (unsigned int it : vecShapeId) - { - pTriangle = &pColData->pColTriangles[it]; - pTriangle->lighting.day = cDay; - pTriangle->lighting.night = cNight; - } - } - else - argStream.SetCustomError("Night light must be in range 0 up to 15."); - } - else - argStream.SetCustomError("Day light must be in range 0 up to 15."); - } - } - break; - case COLLISION_VERTEX: - CompressedVector* pVertex; - switch (eCollisionKey) - { - case COLLISION_KEY_POSITION: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) - { - if (CClientColModel::CheckVector(vec1)) - { - for (unsigned int it : vecShapeId) - { - pVertex = &pColData->pVertices[it]; - pVertex->setVector(vec1); - } - } - else - argStream.SetCustomError("Position is out of bounding box."); - } - break; - case COLLISION_KEY_MOVE: - argStream.ReadVector3D(vec1); - if (!argStream.HasErrors()) - { - for (unsigned int it : vecShapeId) - { - pVertex = &pColData->pVertices[it]; - if (!CClientColModel::CheckVector(vec1 + pVertex->getVector())) - vecFailed.push_back(it); - } - if (vecFailed.size() == 0) - { - for (unsigned int it : vecShapeId) - { - pVertex = &pColData->pVertices[it]; - pVertex->setVector(vec1 + pVertex->getVector()); - } - } - } - } - } - } - } - } - if (argStream.HasErrors()) - { - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - else - { - if (vecFailed.size() > 0) - { - unsigned short i = 1; - lua_pushboolean(luaVM, false); - lua_newtable(luaVM); - for (unsigned int it : vecFailed) - { - lua_pushnumber(luaVM, i++); - lua_pushnumber(luaVM, it + 1); - lua_settable(luaVM, -3); - } - return 2; - } - else - { - if (pColModelSAInterface != nullptr) - pCol->SetCollisionHasChanged(true); - - lua_pushboolean(luaVM, true); - return 1; - } - } -} - int CLuaEngineDefs::EngineGetModelTextures(lua_State* luaVM) { // table engineGetModelTextures ( string/int modelName/modelID, string/table textureNames ) From ad3152498910e2f53b595ca18d25ef3cc2e6373f Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sun, 24 May 2020 20:48:23 +0200 Subject: [PATCH 37/50] try to change to enumclass --- Client/game_sa/CColModelSA.h | 12 +++-- .../mods/deathmatch/logic/CClientColModel.cpp | 4 +- .../logic/lua/CLuaFunctionParseHelpers.cpp | 26 +++++----- .../logic/lua/CLuaFunctionParseHelpers.h | 34 ++++++------ .../logic/luadefs/CLuaEngineDefs.cpp | 52 +++++++++---------- 5 files changed, 66 insertions(+), 62 deletions(-) diff --git a/Client/game_sa/CColModelSA.h b/Client/game_sa/CColModelSA.h index a8974663da7..d4c6b2b7379 100644 --- a/Client/game_sa/CColModelSA.h +++ b/Client/game_sa/CColModelSA.h @@ -16,6 +16,8 @@ #define FUNC_CColModel_Constructor 0x40FB60 #define FUNC_CColModel_Destructor 0x40F700 +enum class eCollisionShape; + typedef struct { CVector vecMin; @@ -139,20 +141,20 @@ typedef struct return vertices.size(); } - bool isValidIndex(char eShape, ushort usIndex, ushort numVertices = 0) const + bool isValidIndex(eCollisionShape eShape, ushort usIndex, ushort numVertices = 0) const { switch (eShape) { - case 0: + case eCollisionShape::BOX: return (usIndex >= 0 && usIndex < numColBoxes); break; - case 1: + case eCollisionShape::SPHERE: return (usIndex >= 0 && usIndex < numColSpheres); break; - case 2: + case eCollisionShape::TRIANGLE: return (usIndex >= 0 && usIndex < numColTriangles); break; - case 3: + case eCollisionShape::VERTEX: return (usIndex >= 0 && usIndex < numVertices); break; } diff --git a/Client/mods/deathmatch/logic/CClientColModel.cpp b/Client/mods/deathmatch/logic/CClientColModel.cpp index 747443736d4..24ef15d7162 100644 --- a/Client/mods/deathmatch/logic/CClientColModel.cpp +++ b/Client/mods/deathmatch/logic/CClientColModel.cpp @@ -11,7 +11,7 @@ #include "../Client/game_sa/CModelInfoSA.h" #include "../Client/game_sa/CColModelSA.h" -CClientColModel::CClientColModel(CClientManager* pManager, ElementID ID) : ClassInit(this), CClientEntity(ID), m_pColModel(nullptr) +CClientColModel::CClientColModel(CClientManager* pManager, ElementID ID) : ClassInit(this), CClientEntity(ID) { // Init m_pManager = pManager; @@ -19,6 +19,8 @@ CClientColModel::CClientColModel(CClientManager* pManager, ElementID ID) : Class SetTypeName("col"); + m_pColModel = nullptr; + // Add us to DFF manager's list m_pColModelManager->AddToList(this); } diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp index 01ae148c31e..804c98203dc 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp @@ -653,21 +653,21 @@ ADD_ENUM(SURFACE_ADHESION_GROUP_SAND, "sand") ADD_ENUM(SURFACE_ADHESION_GROUP_WET, "wet") IMPLEMENT_ENUM_END("surface-adhesion-group") -IMPLEMENT_ENUM_BEGIN(eCollisionShapes) -ADD_ENUM(COLLISION_BOX, "box") -ADD_ENUM(COLLISION_SPHERE, "sphere") -ADD_ENUM(COLLISION_TRIANGLE, "triangle") -ADD_ENUM(COLLISION_VERTEX, "vertex") +IMPLEMENT_ENUM_CLASS_BEGIN(eCollisionShape) +ADD_ENUM(eCollisionShape::BOX, "box") +ADD_ENUM(eCollisionShape::SPHERE, "sphere") +ADD_ENUM(eCollisionShape::TRIANGLE, "triangle") +ADD_ENUM(eCollisionShape::VERTEX, "vertex") IMPLEMENT_ENUM_END("collision-shape") -IMPLEMENT_ENUM_BEGIN(eCollisionKey) -ADD_ENUM(COLLISION_KEY_SIZE, "size") -ADD_ENUM(COLLISION_KEY_MATERIAL, "material") -ADD_ENUM(COLLISION_KEY_POSITION, "position") -ADD_ENUM(COLLISION_KEY_RADIUS, "radius") -ADD_ENUM(COLLISION_KEY_LIGHTING, "lighting") -ADD_ENUM(COLLISION_KEY_VERTICES, "vertices") -ADD_ENUM(COLLISION_KEY_MOVE, "move") +IMPLEMENT_ENUM_CLASS_BEGIN(eCollisionKey) +ADD_ENUM(eCollisionKey::SIZE, "size") +ADD_ENUM(eCollisionKey::MATERIAL, "material") +ADD_ENUM(eCollisionKey::POSITION, "position") +ADD_ENUM(eCollisionKey::RADIUS, "radius") +ADD_ENUM(eCollisionKey::LIGHTING, "lighting") +ADD_ENUM(eCollisionKey::VERTICES, "vertices") +ADD_ENUM(eCollisionKey::MOVE, "move") IMPLEMENT_ENUM_END("collision-key") // diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h index 7d0114062b0..275dad532a5 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h @@ -102,26 +102,26 @@ enum eJSONPrettyType }; DECLARE_ENUM(eJSONPrettyType); -enum eCollisionShapes +enum class eCollisionShape { - COLLISION_BOX, - COLLISION_SPHERE, - COLLISION_TRIANGLE, - COLLISION_VERTEX, + BOX, + SPHERE, + TRIANGLE, + VERTEX, }; -DECLARE_ENUM(eCollisionShapes); +DECLARE_ENUM_CLASS(eCollisionShape); -enum eCollisionKey -{ - COLLISION_KEY_SIZE, - COLLISION_KEY_MATERIAL, - COLLISION_KEY_POSITION, - COLLISION_KEY_RADIUS, - COLLISION_KEY_LIGHTING, - COLLISION_KEY_VERTICES, - COLLISION_KEY_MOVE, +enum class eCollisionKey +{ + SIZE, + MATERIAL, + POSITION, + RADIUS, + LIGHTING, + VERTICES, + MOVE, }; -DECLARE_ENUM(eCollisionKey); +DECLARE_ENUM_CLASS(eCollisionKey); // class -> class type inline eCGUIType GetClassType(CGUIButton*) @@ -472,7 +472,7 @@ inline SString GetClassByTypeName(eObjectGroup::BreakMode*) { return "objectgroup-breakmode"; } -inline SString GetClassTypeName(eCollisionShapes*) +inline SString GetClassTypeName(eCollisionShape*) { return "collision-shape"; } diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index aa0204879a4..1b4bd7f4a01 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -2224,7 +2224,7 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { ushort usIndex; - eCollisionShapes eCollisionShape; + eCollisionShape eCollisionShape; argStream.ReadEnumString(eCollisionShape); argStream.ReadNumber(usIndex, 0); CColDataSA* pColData = pColModelSAInterface->pColData; @@ -2232,11 +2232,11 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) { switch (eCollisionShape) { - case COLLISION_BOX: + case eCollisionShape::BOX: if (usIndex > 0) { usIndex--; - if (pColData->isValidIndex(COLLISION_BOX, usIndex)) + if (pColData->isValidIndex(eCollisionShape::BOX, usIndex)) { CColBoxSA pBox = pColData->pColBoxes[usIndex]; lua_newtable(luaVM); @@ -2317,11 +2317,11 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) return 1; } break; - case COLLISION_SPHERE: + case eCollisionShape::SPHERE: if (usIndex > 0) { usIndex--; - if (pColData->isValidIndex(COLLISION_SPHERE, usIndex)) + if (pColData->isValidIndex(eCollisionShape::SPHERE, usIndex)) { CColSphereSA pSphere = pColData->pColSpheres[usIndex]; lua_newtable(luaVM); @@ -2392,11 +2392,11 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) return 1; } break; - case COLLISION_TRIANGLE: + case eCollisionShape::TRIANGLE: if (usIndex > 0) { usIndex--; - if (pColData->isValidIndex(COLLISION_TRIANGLE, usIndex)) + if (pColData->isValidIndex(eCollisionShape::TRIANGLE, usIndex)) { CColTriangleSA pTriangle = pColData->pColTriangles[usIndex]; lua_newtable(luaVM); @@ -2462,7 +2462,7 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) return 1; } break; - case COLLISION_VERTEX: + case eCollisionShape::VERTEX: if (usIndex > 0) { usIndex--; @@ -2476,7 +2476,7 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) usNumVertices = pColData->getNumVertices(); } - if (pColData->isValidIndex(COLLISION_VERTEX, usIndex, usNumVertices)) + if (pColData->isValidIndex(eCollisionShape::VERTEX, usIndex, usNumVertices)) { CompressedVector pTriangle = pColData->pVertices[usIndex]; lua_newtable(luaVM); @@ -2623,7 +2623,7 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) { CClientColModel* pCol = NULL; std::vector vecUncheckedShapeId, vecShapeId, vecFailed; - eCollisionShapes eCollisionShape; + eCollisionShape eCollisionShape; eCollisionKey eCollisionKey; CScriptArgReader argStream(luaVM); argStream.ReadUserData(pCol); @@ -2664,11 +2664,11 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) switch (eCollisionShape) { - case COLLISION_BOX: + case eCollisionShape::BOX: CColBoxSA * pBox; switch (eCollisionKey) { - case COLLISION_KEY_MATERIAL: + case eCollisionKey::MATERIAL: uint cSurface; argStream.ReadNumber(cSurface); if (!argStream.HasErrors()) @@ -2685,7 +2685,7 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) argStream.SetCustomError("Invalid material id."); } break; - case COLLISION_KEY_SIZE: + case eCollisionKey::SIZE: if (argStream.NextIsBool()) { bool bMinVector; @@ -2764,7 +2764,7 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) } } break; - case COLLISION_KEY_POSITION: + case eCollisionKey::POSITION: argStream.ReadVector3D(vec1); if (!argStream.HasErrors()) { @@ -2787,7 +2787,7 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) } } break; - case COLLISION_KEY_MOVE: + case eCollisionKey::MOVE: argStream.ReadVector3D(vec1); if (!argStream.HasErrors()) { @@ -2809,11 +2809,11 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) } } break; - case COLLISION_SPHERE: + case eCollisionShape::SPHERE: CColSphereSA * pSphere; switch (eCollisionKey) { - case COLLISION_KEY_POSITION: + case eCollisionKey::POSITION: argStream.ReadVector3D(vec1); if (!argStream.HasErrors()) { @@ -2841,7 +2841,7 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) argStream.SetCustomError("First position is out of bounding box."); } break; - case COLLISION_KEY_MOVE: + case eCollisionKey::MOVE: argStream.ReadVector3D(vec1); if (!argStream.HasErrors()) { @@ -2866,7 +2866,7 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) argStream.SetCustomError("You can't move furher than 256 units in each axis."); } break; - case COLLISION_KEY_RADIUS: + case eCollisionKey::RADIUS: float fRadius; argStream.ReadNumber(fRadius); if (!argStream.HasErrors()) @@ -2892,7 +2892,7 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) argStream.SetCustomError("Radius must be between 0 and 256."); } break; - case COLLISION_KEY_MATERIAL: + case eCollisionKey::MATERIAL: uint cSurface; argStream.ReadNumber(cSurface); if (!argStream.HasErrors()) @@ -2910,11 +2910,11 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) } } break; - case COLLISION_TRIANGLE: + case eCollisionShape::TRIANGLE: CColTriangleSA * pTriangle; switch (eCollisionKey) { - case COLLISION_KEY_MATERIAL: + case eCollisionKey::MATERIAL: uint cSurface; argStream.ReadNumber(cSurface); if (!argStream.HasErrors()) @@ -2930,7 +2930,7 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) else argStream.SetCustomError("Invalid material id."); } - case COLLISION_KEY_LIGHTING: + case eCollisionKey::LIGHTING: uint cDay, cNight; argStream.ReadNumber(cDay); argStream.ReadNumber(cNight); @@ -2955,11 +2955,11 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) } } break; - case COLLISION_VERTEX: + case eCollisionShape::VERTEX: CompressedVector* pVertex; switch (eCollisionKey) { - case COLLISION_KEY_POSITION: + case eCollisionKey::POSITION: argStream.ReadVector3D(vec1); if (!argStream.HasErrors()) { @@ -2975,7 +2975,7 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) argStream.SetCustomError("Position is out of bounding box."); } break; - case COLLISION_KEY_MOVE: + case eCollisionKey::MOVE: argStream.ReadVector3D(vec1); if (!argStream.HasErrors()) { From d1c36e8a5e17721cb4d21b1dfe22a860b871d000 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sun, 31 May 2020 18:26:45 +0200 Subject: [PATCH 38/50] not working --- Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp index 804c98203dc..e84dd4ee203 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp @@ -658,7 +658,7 @@ ADD_ENUM(eCollisionShape::BOX, "box") ADD_ENUM(eCollisionShape::SPHERE, "sphere") ADD_ENUM(eCollisionShape::TRIANGLE, "triangle") ADD_ENUM(eCollisionShape::VERTEX, "vertex") -IMPLEMENT_ENUM_END("collision-shape") +IMPLEMENT_ENUM_CLASS_END("collision-shape") IMPLEMENT_ENUM_CLASS_BEGIN(eCollisionKey) ADD_ENUM(eCollisionKey::SIZE, "size") @@ -668,7 +668,7 @@ ADD_ENUM(eCollisionKey::RADIUS, "radius") ADD_ENUM(eCollisionKey::LIGHTING, "lighting") ADD_ENUM(eCollisionKey::VERTICES, "vertices") ADD_ENUM(eCollisionKey::MOVE, "move") -IMPLEMENT_ENUM_END("collision-key") +IMPLEMENT_ENUM_CLASS_END("collision-key") // // Get best guess at name of userdata type From c508ac36c8ee7b9e65e1c7e810bfe86cc5929db0 Mon Sep 17 00:00:00 2001 From: Nikita Obrekht Date: Sun, 18 Oct 2020 03:03:34 +0200 Subject: [PATCH 39/50] Fix eCollisionShape enum --- .../deathmatch/logic/lua/CLuaFunctionParseHelpers.h | 10 +--------- Client/sdk/game/Common.h | 8 ++++++++ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h index 3963ca1815e..df9f1ed308d 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h @@ -63,6 +63,7 @@ DECLARE_ENUM(eSurfaceBulletEffect); DECLARE_ENUM(eSurfaceWheelEffect); DECLARE_ENUM(eSurfaceSkidMarkType); DECLARE_ENUM(eSurfaceAdhesionGroup); +DECLARE_ENUM_CLASS(eCollisionShape); class CRemoteCall; @@ -103,15 +104,6 @@ enum eJSONPrettyType }; DECLARE_ENUM(eJSONPrettyType); -enum class eCollisionShape -{ - BOX, - SPHERE, - TRIANGLE, - VERTEX, -}; -DECLARE_ENUM_CLASS(eCollisionShape); - enum class eCollisionKey { SIZE, diff --git a/Client/sdk/game/Common.h b/Client/sdk/game/Common.h index 4c277582383..c3b8beb2a6e 100644 --- a/Client/sdk/game/Common.h +++ b/Client/sdk/game/Common.h @@ -1619,3 +1619,11 @@ namespace eObjectGroup SMASHABLE, }; } + +enum class eCollisionShape +{ + BOX, + SPHERE, + TRIANGLE, + VERTEX, +}; From 236bc9132f747974d42da5e74f5825b6a2a1d3f0 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sun, 1 Nov 2020 22:37:27 +0100 Subject: [PATCH 40/50] use new parser in progresss --- .../mods/deathmatch/logic/CClientColModel.cpp | 2 +- .../mods/deathmatch/logic/CClientColModel.h | 4 +- .../logic/luadefs/CLuaEngineDefs.cpp | 241 ++++++------------ .../deathmatch/logic/luadefs/CLuaEngineDefs.h | 7 +- 4 files changed, 88 insertions(+), 166 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientColModel.cpp b/Client/mods/deathmatch/logic/CClientColModel.cpp index 24ef15d7162..40b2dab2334 100644 --- a/Client/mods/deathmatch/logic/CClientColModel.cpp +++ b/Client/mods/deathmatch/logic/CClientColModel.cpp @@ -164,5 +164,5 @@ void CClientColModel::UpdateVerticesCount() CColDataSA* pColData = pInterface->pColData; if (pColData) - m_usVerticesCount = static_cast(pColData->getNumVertices()); + m_iVerticesCount = static_cast(pColData->getNumVertices()); } diff --git a/Client/mods/deathmatch/logic/CClientColModel.h b/Client/mods/deathmatch/logic/CClientColModel.h index 7877c4e261e..d181a7f41fd 100644 --- a/Client/mods/deathmatch/logic/CClientColModel.h +++ b/Client/mods/deathmatch/logic/CClientColModel.h @@ -26,7 +26,7 @@ class CClientColModel : public CClientEntity bool LoadCol(const SString& strFile, bool bIsRawData); bool Load(bool isRaw, SString input); - unsigned short GetVerticesCount() const { return m_usVerticesCount; }; + unsigned short GetVerticesCount() const { return m_iVerticesCount; }; void SetCollisionHasChanged(bool bChanged) { b_hasChanged = bChanged; }; bool HasChanged() const { return b_hasChanged; }; bool IsLoaded() { return m_pColModel != NULL; }; @@ -97,7 +97,7 @@ class CClientColModel : public CClientEntity void InternalRestore(unsigned short usModel); class CClientColModelManager* m_pColModelManager; - unsigned short m_usVerticesCount; + int m_iVerticesCount; CColModel* m_pColModel; std::list m_Replaced; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 7271452852f..65a56d7338a 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -57,11 +57,11 @@ void CLuaEngineDefs::LoadFunctions() {"engineRestoreObjectGroupPhysicalProperties", EngineRestoreObjectGroupPhysicalProperties}, {"engineRestreamWorld", ArgumentParser}, {"engineRestoreObjectGroupPhysicalProperties", EngineRestoreObjectGroupPhysicalProperties}, - {"engineGetModelCollisionProperties", EngineGetModelCollisionProperties}, + {"engineGetModelCollisionProperties", ArgumentParser}, {"engineGetModelCollisionData", EngineGetModelCollisionData}, {"engineSetModelCollisionData", EngineSetModelCollisionData}, {"engineUpdateModelCollisionBoundingBox", EngineUpdateModelCollisionBoundingBox }, - {"isModelCollisionLoaded", IsModelCollisionLoaded }, + {"isModelCollisionLoaded", ArgumentParser }, // CLuaCFunctions::AddFunction ( "engineReplaceMatchingAtomics", EngineReplaceMatchingAtomics ); // CLuaCFunctions::AddFunction ( "engineReplaceWheelAtomics", EngineReplaceWheelAtomics ); @@ -2057,7 +2057,7 @@ CColModelSAInterface* GetModelCollisionInterface(ushort usModel) return false; } -int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) +std::map> CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) { CClientColModel* pCol = NULL; unsigned short usModel = 0; @@ -2069,110 +2069,43 @@ int CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) else argStream.ReadUserData(pCol); - if (!argStream.HasErrors()) + CColModelSAInterface* pColModelSAInterface; + if (pCol != nullptr) + pColModelSAInterface = pCol->GetColModelInterface(); + else + pColModelSAInterface = GetModelCollisionInterface(usModel); + + if (pColModelSAInterface == nullptr) + throw new std::invalid_argument("Invalid model or collision element"); + + std::map> map; + map["vecMin"] = pColModelSAInterface->boundingBox.vecMin; + map["vecMax"] = pColModelSAInterface->boundingBox.vecMax; + map["vecOffset"] = pColModelSAInterface->boundingBox.vecOffset; + map["radius"] = pColModelSAInterface->boundingBox.fRadius; + + CColDataSA* pColData = pColModelSAInterface->pColData; + if (pColData != nullptr) { - CColModelSAInterface* pColModelSAInterface; - if (pCol) - pColModelSAInterface = pCol->GetColModelInterface(); + map["colBoxes"] = pColData->numColBoxes; + map["colSpheres"] = pColData->numColSpheres; + map["colTriangles"] = pColData->numColTriangles; + if (pCol != nullptr) + { + map["colVertices"] = pCol->GetVerticesCount(); + } else - pColModelSAInterface = GetModelCollisionInterface(usModel); - - if (pColModelSAInterface) { - lua_newtable(luaVM); - lua_pushstring(luaVM, "boundingBox"); - lua_newtable(luaVM); - lua_pushstring(luaVM, "vecMin"); - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMin.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMin.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMin.fZ); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - - lua_pushstring(luaVM, "vecMax"); - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMax.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMax.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecMax.fZ); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "vecOffset"); - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecOffset.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecOffset.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.vecOffset.fZ); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "radius"); - lua_pushnumber(luaVM, pColModelSAInterface->boundingBox.fRadius); - lua_settable(luaVM, -3); - - CColDataSA* pColData = pColModelSAInterface->pColData; - if (pColData != nullptr) - { - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "colBoxes"); - lua_pushnumber(luaVM, pColData->numColBoxes); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "colSpheres"); - lua_pushnumber(luaVM, pColData->numColSpheres); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "colTriangles"); - lua_pushnumber(luaVM, pColData->numColTriangles); - lua_settable(luaVM, -3); - lua_pushstring(luaVM, "colVertices"); - if (pCol) - { - lua_pushnumber(luaVM, pCol->GetVerticesCount()); - } - else - { - lua_pushnumber(luaVM, pColData->getNumVertices()); - } - lua_settable(luaVM, -3); - } - - return 1; + map["colVertices"] = (int)pColData->getNumVertices(); } } - if (argStream.HasErrors()) - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; + return map; } -int CLuaEngineDefs::IsModelCollisionLoaded(lua_State* luaVM) + bool CLuaEngineDefs::IsModelCollisionLoaded(ushort usModel) { - ushort usModel; - CScriptArgReader argStream(luaVM); - argStream.ReadNumber(usModel); - if (!argStream.HasErrors()) - { - lua_pushboolean(luaVM, GetModelCollisionInterface(usModel) != nullptr); - return 1; - } - if (argStream.HasErrors()) - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushnil(luaVM); - return 1; + return GetModelCollisionInterface(usModel) != nullptr; } int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) @@ -2523,80 +2456,68 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) return 1; } -int CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(lua_State* luaVM) +bool CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(CClientColModel* pColModel, std::optional vecCenter) { - CClientColModel* pCol = NULL; - CVector vecCenter; - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pCol); - argStream.ReadVector3D(vecCenter, CVector(0, 0, 0)); + if (!pColModel->HasChanged()) + return true; // bounding box already updated. - if (!argStream.HasErrors()) - { - CColModelSAInterface* pColModelSAInterface; - if (pCol) - pColModelSAInterface = pCol->GetColModelInterface(); + CColModelSAInterface* pColModelSAInterface = nullptr; + if (pColModel) + pColModelSAInterface = pColModel->GetColModelInterface(); - if (pColModelSAInterface) + if (pColModelSAInterface != nullptr) + { + CColDataSA* pColData = pColModelSAInterface->pColData; + CBoundingBoxSA* pBoundingBox = &pColModelSAInterface->boundingBox; + CVector minVec(0, 0, 0); + CVector maxVec(0, 0, 0); + CVector pBoxMinVec, pBoxMaxVec; + + CColSphereSA pSphere; + CColBoxSA pBox; + for (uint i = 0; pColData->numColBoxes > i; i++) { - if (!pCol->HasChanged()) - { - lua_pushboolean(luaVM, true); // bounding box already updated. - return 1; - } - CColDataSA* pColData = pColModelSAInterface->pColData; - CBoundingBoxSA* pBoundingBox = &pColModelSAInterface->boundingBox; - CVector minVec(0, 0, 0); - CVector maxVec(0, 0, 0); - CVector pBoxMinVec, pBoxMaxVec; - - CColSphereSA pSphere; - CColBoxSA pBox; - for (uint i = 0; pColData->numColBoxes > i; i++) - { - pBox = pColData->pColBoxes[i]; - CClientColModel::AlignVector(maxVec, minVec, pBox.min); - CClientColModel::AlignVector(maxVec, minVec, pBox.max); - } - - for (uint i = 0; pColData->numColSpheres > i; i++) - { - pSphere = pColData->pColSpheres[i]; - pBoxMaxVec = pSphere.vecCenter; - pBoxMaxVec.fX += pSphere.fRadius; - pBoxMaxVec.fY += pSphere.fRadius; - pBoxMaxVec.fZ += pSphere.fRadius; - CClientColModel::AlignVector(maxVec, minVec, pBoxMaxVec); - - pBoxMaxVec.fX -= pSphere.fRadius * 2; - pBoxMaxVec.fY -= pSphere.fRadius * 2; - pBoxMaxVec.fZ -= pSphere.fRadius * 2; - CClientColModel::AlignVector(maxVec, minVec, pBoxMaxVec); - } + pBox = pColData->pColBoxes[i]; + CClientColModel::AlignVector(maxVec, minVec, pBox.min); + CClientColModel::AlignVector(maxVec, minVec, pBox.max); + } - std::map vecVertices = pColData->getAllVertices(); - std::map::iterator it; - for (it = vecVertices.begin(); it != vecVertices.end(); it++) - { - CClientColModel::AlignVector(maxVec, minVec, it->second.getVector()); - } + for (uint i = 0; pColData->numColSpheres > i; i++) + { + pSphere = pColData->pColSpheres[i]; + pBoxMaxVec = pSphere.vecCenter; + pBoxMaxVec.fX += pSphere.fRadius; + pBoxMaxVec.fY += pSphere.fRadius; + pBoxMaxVec.fZ += pSphere.fRadius; + CClientColModel::AlignVector(maxVec, minVec, pBoxMaxVec); + + pBoxMaxVec.fX -= pSphere.fRadius * 2; + pBoxMaxVec.fY -= pSphere.fRadius * 2; + pBoxMaxVec.fZ -= pSphere.fRadius * 2; + CClientColModel::AlignVector(maxVec, minVec, pBoxMaxVec); + } - pBoundingBox->fRadius = std::max(DistanceBetweenPoints3D(maxVec, vecCenter), DistanceBetweenPoints3D(minVec, vecCenter)); - pBoundingBox->vecOffset = vecCenter; - pBoundingBox->vecMax = maxVec; - pBoundingBox->vecMin = minVec; - pCol->SetCollisionHasChanged(false); - lua_pushboolean(luaVM, true); - return 1; + std::map vecVertices = pColData->getAllVertices(); + std::map::iterator it; + for (it = vecVertices.begin(); it != vecVertices.end(); it++) + { + CClientColModel::AlignVector(maxVec, minVec, it->second.getVector()); } + + pBoundingBox->fRadius = std::max(DistanceBetweenPoints3D(maxVec, vecCenter.value_or(CVector(0, 0, 0))), + DistanceBetweenPoints3D(minVec, vecCenter.value_or(CVector(0, 0, 0)))); + pBoundingBox->vecOffset = vecCenter.value_or(CVector(0,0,0)); + pBoundingBox->vecMax = maxVec; + pBoundingBox->vecMin = minVec; + pColModel->SetCollisionHasChanged(false); + return true; } - lua_pushboolean(luaVM, false); - return 1; + return false; } int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) { - CClientColModel* pCol = NULL; + CClientColModel* pCol = nullptr; std::vector vecUncheckedShapeId, vecShapeId, vecFailed; eCollisionShape eCollisionShape; eCollisionKey eCollisionKey; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h index c93c4665708..751a58bcfca 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h @@ -59,12 +59,13 @@ class CLuaEngineDefs : public CLuaDefs LUA_DECLARE(EngineRestoreObjectGroupPhysicalProperties) static bool CLuaEngineDefs::EngineRestreamWorld(lua_State* const luaVM); static bool EngineSetModelVisibleTime(std::string strModelId, char cHourOn, char cHourOff); - static std::variant> EngineGetModelVisibleTime(std::string strModelId); - LUA_DECLARE(EngineGetModelCollisionProperties); + static std::variant> EngineGetModelVisibleTime(std::string strModelId); + static std::map> EngineGetModelCollisionProperties(lua_State* luaVM); LUA_DECLARE(EngineGetModelCollisionData); LUA_DECLARE(EngineSetModelCollisionData); LUA_DECLARE(EngineUpdateModelCollisionBoundingBox); - LUA_DECLARE(IsModelCollisionLoaded); + static bool IsModelCollisionLoaded(ushort usModel); + static bool EngineUpdateModelCollisionBoundingBox(CClientColModel* pColModel, std::optional vecCenter); private: static void AddEngineColClass(lua_State* luaVM); From 41e7ef3573dfa075c4735b90534915105288e70d Mon Sep 17 00:00:00 2001 From: sbx320 Date: Mon, 2 Nov 2020 00:48:25 +0100 Subject: [PATCH 41/50] Fix arg parser compilation --- Shared/mods/deathmatch/logic/lua/LuaBasic.h | 25 ++++++++++----------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/Shared/mods/deathmatch/logic/lua/LuaBasic.h b/Shared/mods/deathmatch/logic/lua/LuaBasic.h index 0c1844f94f0..b83d0087d7e 100644 --- a/Shared/mods/deathmatch/logic/lua/LuaBasic.h +++ b/Shared/mods/deathmatch/logic/lua/LuaBasic.h @@ -27,7 +27,6 @@ namespace lua template inline T PopPrimitive(lua_State* L, std::size_t& index); - // Push should push a value of type T to the Lua Stack // The return value must be the net amount of items pushed to the stack, which should // be 1 for most types (e.g. Push) but may be any number for special cases @@ -87,9 +86,9 @@ namespace lua } template - int Push(lua_State* L, const std::variant&& val) + int Push(lua_State* L, const std::variant& val) { - return std::visit([L](auto&& value) -> int { return Push(L, std::move(value)); }, val); + return std::visit([L](auto& value) -> int { return Push(L, std::move(value)); }, val); } template @@ -99,7 +98,7 @@ namespace lua return Push(L, val.value()); else return Push(L, nullptr); - } + } inline int Push(lua_State* L, const CVector2D& value) { @@ -126,11 +125,11 @@ namespace lua } template - int Push(lua_State* L, const std::vector&& val) + int Push(lua_State* L, const std::vector& val) { lua_newtable(L); int i = 1; - for (auto&& v : val) + for (auto& v : val) { Push(L, i++); Push(L, v); @@ -142,13 +141,13 @@ namespace lua } template - int Push(lua_State* L, const std::unordered_map&& val) + int Push(lua_State* L, const std::unordered_map& val) { lua_newtable(L); - for (auto&& [k, v] : val) + for (auto& [k, v] : val) { Push(L, k); - Push(L, v); + Push(L, v); lua_settable(L, -3); } @@ -157,8 +156,8 @@ namespace lua } // Tuples can be used to return multiple results - template - int Push(lua_State* L, const std::tuple&& tuple) + template + int Push(lua_State* L, const std::tuple& tuple) { // Call Push on each element of the tuple std::apply([L](const auto&... value) { (Push(L, value), ...); }, tuple); @@ -167,7 +166,7 @@ namespace lua // Overload for enum types only template - typename std::enable_if_t, int> Push(lua_State* L, const T&& val) + typename std::enable_if_t, int> Push(lua_State* L, const T& val) { return Push(L, EnumToString(val)); } @@ -180,4 +179,4 @@ namespace lua return 1; } -} +} // namespace lua From 505c11d604cea3bfb875f150d263175c1335ad58 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Mon, 2 Nov 2020 06:32:59 +0100 Subject: [PATCH 42/50] fix compilation --- Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp | 6 +++--- Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 65a56d7338a..4b92648f535 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -60,7 +60,7 @@ void CLuaEngineDefs::LoadFunctions() {"engineGetModelCollisionProperties", ArgumentParser}, {"engineGetModelCollisionData", EngineGetModelCollisionData}, {"engineSetModelCollisionData", EngineSetModelCollisionData}, - {"engineUpdateModelCollisionBoundingBox", EngineUpdateModelCollisionBoundingBox }, + {"engineUpdateModelCollisionBoundingBox", ArgumentParser}, {"isModelCollisionLoaded", ArgumentParser }, // CLuaCFunctions::AddFunction ( "engineReplaceMatchingAtomics", EngineReplaceMatchingAtomics ); @@ -2057,7 +2057,7 @@ CColModelSAInterface* GetModelCollisionInterface(ushort usModel) return false; } -std::map> CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) +std::unordered_map> CLuaEngineDefs::EngineGetModelCollisionProperties(lua_State* luaVM) { CClientColModel* pCol = NULL; unsigned short usModel = 0; @@ -2078,7 +2078,7 @@ std::map> CLuaEngineDefs::EngineG if (pColModelSAInterface == nullptr) throw new std::invalid_argument("Invalid model or collision element"); - std::map> map; + std::unordered_map> map; map["vecMin"] = pColModelSAInterface->boundingBox.vecMin; map["vecMax"] = pColModelSAInterface->boundingBox.vecMax; map["vecOffset"] = pColModelSAInterface->boundingBox.vecOffset; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h index 751a58bcfca..c4e1a0ec276 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h @@ -60,12 +60,11 @@ class CLuaEngineDefs : public CLuaDefs static bool CLuaEngineDefs::EngineRestreamWorld(lua_State* const luaVM); static bool EngineSetModelVisibleTime(std::string strModelId, char cHourOn, char cHourOff); static std::variant> EngineGetModelVisibleTime(std::string strModelId); - static std::map> EngineGetModelCollisionProperties(lua_State* luaVM); + static std::unordered_map> EngineGetModelCollisionProperties(lua_State* luaVM); LUA_DECLARE(EngineGetModelCollisionData); LUA_DECLARE(EngineSetModelCollisionData); - LUA_DECLARE(EngineUpdateModelCollisionBoundingBox); - static bool IsModelCollisionLoaded(ushort usModel); static bool EngineUpdateModelCollisionBoundingBox(CClientColModel* pColModel, std::optional vecCenter); + static bool IsModelCollisionLoaded(ushort usModel); private: static void AddEngineColClass(lua_State* luaVM); From 6c3ba180bec80835bccaca34d5f40aa6ec30e184 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Tue, 3 Nov 2020 15:39:09 +0100 Subject: [PATCH 43/50] rename variables --- Client/mods/deathmatch/logic/CClientColModel.h | 2 +- .../mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientColModel.h b/Client/mods/deathmatch/logic/CClientColModel.h index d181a7f41fd..2d19bc1a3bd 100644 --- a/Client/mods/deathmatch/logic/CClientColModel.h +++ b/Client/mods/deathmatch/logic/CClientColModel.h @@ -26,7 +26,7 @@ class CClientColModel : public CClientEntity bool LoadCol(const SString& strFile, bool bIsRawData); bool Load(bool isRaw, SString input); - unsigned short GetVerticesCount() const { return m_iVerticesCount; }; + int GetVerticesCount() const { return m_iVerticesCount; }; void SetCollisionHasChanged(bool bChanged) { b_hasChanged = bChanged; }; bool HasChanged() const { return b_hasChanged; }; bool IsLoaded() { return m_pColModel != NULL; }; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 4b92648f535..aa2945e05f4 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -2411,21 +2411,21 @@ int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) } else { - unsigned short usNumVertices; + int iNumVertices; if (pCol) { - usNumVertices = pCol->GetVerticesCount(); + iNumVertices = pCol->GetVerticesCount(); } else { - usNumVertices = pColData->getNumVertices(); + iNumVertices = pColData->getNumVertices(); } CVector vec; CompressedVector pVertex; lua_newtable(luaVM); - for (ushort i = 0; i < usNumVertices; i++) + for (int i = 0; i < iNumVertices; i++) { lua_pushnumber(luaVM, i + 1); lua_newtable(luaVM); @@ -2543,7 +2543,7 @@ int CLuaEngineDefs::EngineSetModelCollisionData(lua_State* luaVM) if (pColModelSAInterface) { CColDataSA* pColData = pColModelSAInterface->pColData; - ushort numVertices = pCol->GetVerticesCount(); + int numVertices = pCol->GetVerticesCount(); for (ushort i = 0; i != vecUncheckedShapeId.size(); i++) { if (pColData->isValidIndex(eCollisionShape, vecUncheckedShapeId[i] - 1, numVertices)) vecShapeId.push_back(vecUncheckedShapeId[i] - 1); From 671268bda342f8fabd7d7c8aa6239e68dc99dcef Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sun, 25 Apr 2021 09:11:48 +0200 Subject: [PATCH 44/50] revert some unnecessary changes --- Client/game_sa/CColModelSA.h | 7 +++-- .../mods/deathmatch/logic/CClientColModel.cpp | 18 ++++++++---- .../mods/deathmatch/logic/CClientColModel.h | 28 +++++++++---------- .../logic/lua/CLuaFunctionParseHelpers.cpp | 5 ++-- .../logic/lua/CLuaFunctionParseHelpers.h | 5 ++-- .../deathmatch/logic/luadefs/CLuaEngineDefs.h | 2 +- Client/sdk/game/CColModel.h | 4 +-- Shared/mods/deathmatch/logic/lua/LuaBasic.h | 2 +- 8 files changed, 41 insertions(+), 30 deletions(-) diff --git a/Client/game_sa/CColModelSA.h b/Client/game_sa/CColModelSA.h index d4c6b2b7379..56139e1f8e3 100644 --- a/Client/game_sa/CColModelSA.h +++ b/Client/game_sa/CColModelSA.h @@ -1,6 +1,6 @@ /***************************************************************************** * - * PROJECT: Multi Theft Auto + * PROJECT: Multi Theft Auto v1.0 * LICENSE: See LICENSE in the top level directory * FILE: game_sa/CColModelSA.h * PURPOSE: Header file for collision model entity class @@ -11,10 +11,11 @@ #pragma once +#include #include #define FUNC_CColModel_Constructor 0x40FB60 -#define FUNC_CColModel_Destructor 0x40F700 +#define FUNC_CColModel_Destructor 0x40F700 enum class eCollisionShape; @@ -201,7 +202,7 @@ class CColModelSA : public CColModel CColModelSA(CColModelSAInterface* pInterface); ~CColModelSA(); - CColModelSAInterface* GetInterface() const { return m_pInterface; } + CColModelSAInterface* GetInterface() { return m_pInterface; } void Destroy() { delete this; } private: diff --git a/Client/mods/deathmatch/logic/CClientColModel.cpp b/Client/mods/deathmatch/logic/CClientColModel.cpp index 40b2dab2334..849e0150e49 100644 --- a/Client/mods/deathmatch/logic/CClientColModel.cpp +++ b/Client/mods/deathmatch/logic/CClientColModel.cpp @@ -16,10 +16,10 @@ CClientColModel::CClientColModel(CClientManager* pManager, ElementID ID) : Class // Init m_pManager = pManager; m_pColModelManager = pManager->GetColModelManager(); + m_pColModel = NULL; SetTypeName("col"); - m_pColModel = nullptr; // Add us to DFF manager's list m_pColModelManager->AddToList(this); @@ -88,7 +88,9 @@ bool CClientColModel::Replace(unsigned short usModel) // it replaced it. We're the new replacer. CClientColModel* pAlready = m_pColModelManager->GetElementThatReplaced(usModel); if (pAlready) + { pAlready->m_Replaced.remove(usModel); + } // Replace the collisions CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModel); @@ -117,9 +119,12 @@ void CClientColModel::Restore(unsigned short usModel) void CClientColModel::RestoreAll() { // Loop through our replaced ids - for (auto& iter : m_Replaced) + std::list::iterator iter = m_Replaced.begin(); + for (; iter != m_Replaced.end(); iter++) + { // Restore this model - InternalRestore(iter); + InternalRestore(*iter); + } // Clear the list m_Replaced.clear(); @@ -128,11 +133,14 @@ void CClientColModel::RestoreAll() bool CClientColModel::HasReplaced(unsigned short usModel) { // Loop through our replaced ids - for (auto& iter : m_Replaced) + std::list::iterator iter = m_Replaced.begin(); + for (; iter != m_Replaced.end(); iter++) + { // Is this the given ID - if (iter == usModel) + if (*iter == usModel) // We have replaced it return true; + } // We have not replaced it return false; diff --git a/Client/mods/deathmatch/logic/CClientColModel.h b/Client/mods/deathmatch/logic/CClientColModel.h index 2d19bc1a3bd..7552aea16fd 100644 --- a/Client/mods/deathmatch/logic/CClientColModel.h +++ b/Client/mods/deathmatch/logic/CClientColModel.h @@ -12,8 +12,8 @@ #include #include "CClientEntity.h" -#define MAX_COLLISION_SIZE 128 // collision bounding box in each axis -#define MAX_COLLISION_SIZE2 256 // twice bigger than MAX_COLLISION_SIZE +constexpr int MaxCollisionSize = 128; // collision bounding box in each axis +constexpr int MaxCollisionSize2 = MaxCollisionSize * 2; class CClientColModel : public CClientEntity { @@ -41,25 +41,25 @@ class CClientColModel : public CClientEntity { if (fRadius > 0) { - return (MAX_COLLISION_SIZE >= vec.fX + fRadius && vec.fX + fRadius >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fY + fRadius && - vec.fY + fRadius >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fZ + fRadius && vec.fZ + fRadius >= -MAX_COLLISION_SIZE) && - (MAX_COLLISION_SIZE >= vec.fX - fRadius && vec.fX - fRadius >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fY - fRadius && - vec.fY - fRadius >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fZ - fRadius && vec.fZ - fRadius >= -MAX_COLLISION_SIZE); + return (MaxCollisionSize >= vec.fX + fRadius && vec.fX + fRadius >= -MaxCollisionSize && MaxCollisionSize >= vec.fY + fRadius && + vec.fY + fRadius >= -MaxCollisionSize && MaxCollisionSize >= vec.fZ + fRadius && vec.fZ + fRadius >= -MaxCollisionSize) && + (MaxCollisionSize >= vec.fX - fRadius && vec.fX - fRadius >= -MaxCollisionSize && MaxCollisionSize >= vec.fY - fRadius && + vec.fY - fRadius >= -MaxCollisionSize && MaxCollisionSize >= vec.fZ - fRadius && vec.fZ - fRadius >= -MaxCollisionSize); } - return (MAX_COLLISION_SIZE >= vec.fX && vec.fX >= -MAX_COLLISION_SIZE && MAX_COLLISION_SIZE >= vec.fY && vec.fY >= -MAX_COLLISION_SIZE && - MAX_COLLISION_SIZE >= vec.fZ && vec.fZ >= -MAX_COLLISION_SIZE); + return (MaxCollisionSize >= vec.fX && vec.fX >= -MaxCollisionSize && MaxCollisionSize >= vec.fY && vec.fY >= -MaxCollisionSize && + MaxCollisionSize >= vec.fZ && vec.fZ >= -MaxCollisionSize); } static bool CheckMoveVector(CVector& vec, float fRadius = 0) { if (fRadius > 0) { - return ((MAX_COLLISION_SIZE2 >= vec.fX + fRadius >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fY + fRadius >= -MAX_COLLISION_SIZE2 && - MAX_COLLISION_SIZE2 >= vec.fZ + fRadius >= -MAX_COLLISION_SIZE2) && - (MAX_COLLISION_SIZE2 >= vec.fX - fRadius >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fY - fRadius >= -MAX_COLLISION_SIZE2 && - MAX_COLLISION_SIZE2 >= vec.fZ - fRadius >= -MAX_COLLISION_SIZE2)); + return ((MaxCollisionSize2 >= vec.fX + fRadius >= -MaxCollisionSize2 && MaxCollisionSize2 >= vec.fY + fRadius >= -MaxCollisionSize2 && + MaxCollisionSize2 >= vec.fZ + fRadius >= -MaxCollisionSize2) && + (MaxCollisionSize2 >= vec.fX - fRadius >= -MaxCollisionSize2 && MaxCollisionSize2 >= vec.fY - fRadius >= -MaxCollisionSize2 && + MaxCollisionSize2 >= vec.fZ - fRadius >= -MaxCollisionSize2)); } - return (MAX_COLLISION_SIZE2 >= vec.fX && vec.fX >= -MAX_COLLISION_SIZE2 && MAX_COLLISION_SIZE2 >= vec.fY && vec.fY >= -MAX_COLLISION_SIZE2 && - MAX_COLLISION_SIZE2 >= vec.fZ && vec.fZ >= -MAX_COLLISION_SIZE2); + return (MaxCollisionSize2 >= vec.fX && vec.fX >= -MaxCollisionSize2 && MaxCollisionSize2 >= vec.fY && vec.fY >= -MaxCollisionSize2 && + MaxCollisionSize2 >= vec.fZ && vec.fZ >= -MaxCollisionSize2); } // CompareVector returns true if all points in the second vector are greater than the corresponding points in the first vector diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp index b26d96cc765..25e2cf1420f 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp @@ -1,8 +1,9 @@ /***************************************************************************** * - * PROJECT: Multi Theft Auto + * PROJECT: Multi Theft Auto v1.0 + * (Shared logic for modifications) * LICENSE: See LICENSE in the top level directory - * FILE: mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp + * FILE: MTA10/mods/shared_logic/lua/CLuaFunctionParseHelpers.cpp * PURPOSE: * *****************************************************************************/ diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h index e2834d67aea..f5f9765577d 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h @@ -1,8 +1,9 @@ /***************************************************************************** * - * PROJECT: Multi Theft Auto + * PROJECT: Multi Theft Auto v1.0 + * (Shared logic for modifications) * LICENSE: See LICENSE in the top level directory - * FILE: mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h + * FILE: MTA10/mods/shared_logic/lua/CLuaFunctionParseHelpers.h * PURPOSE: * *****************************************************************************/ diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h index 7f85bc897ad..1d261e26e4a 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h @@ -2,7 +2,7 @@ * * PROJECT: Multi Theft Auto * LICENSE: See LICENSE in the top level directory - * FILE: mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp + * FILE: mods/shared_logic/luadefs/CLuaEngineDefs.cpp * PURPOSE: Lua definitions class * * Multi Theft Auto is available from http://www.multitheftauto.com/ diff --git a/Client/sdk/game/CColModel.h b/Client/sdk/game/CColModel.h index 8f0ed51c44d..f847aad21a3 100644 --- a/Client/sdk/game/CColModel.h +++ b/Client/sdk/game/CColModel.h @@ -1,6 +1,6 @@ /***************************************************************************** * - * PROJECT: Multi Theft Auto + * PROJECT: Multi Theft Auto v1.0 * LICENSE: See LICENSE in the top level directory * FILE: sdk/game/CColModel.h * PURPOSE: Collision model entity interface @@ -16,6 +16,6 @@ class CColModelSAInterface; class CColModel { public: - virtual CColModelSAInterface* GetInterface() const = 0; + virtual CColModelSAInterface* GetInterface() = 0; virtual void Destroy() = 0; }; diff --git a/Shared/mods/deathmatch/logic/lua/LuaBasic.h b/Shared/mods/deathmatch/logic/lua/LuaBasic.h index 97d13a71916..e73fc6b3f7d 100644 --- a/Shared/mods/deathmatch/logic/lua/LuaBasic.h +++ b/Shared/mods/deathmatch/logic/lua/LuaBasic.h @@ -220,7 +220,7 @@ namespace lua for (const auto& [k, v] : val) { Push(L, k); - Push(L, v); + Push(L, v); lua_settable(L, -3); } } From d6fd63b3c5a98492cad894a7c6fa842134903167 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sun, 25 Apr 2021 09:14:52 +0200 Subject: [PATCH 45/50] remove even more unnecessary changes --- Client/mods/deathmatch/logic/CClientColModel.h | 5 +++-- Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp | 3 +-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientColModel.h b/Client/mods/deathmatch/logic/CClientColModel.h index 7552aea16fd..ed60bb756ed 100644 --- a/Client/mods/deathmatch/logic/CClientColModel.h +++ b/Client/mods/deathmatch/logic/CClientColModel.h @@ -1,8 +1,9 @@ /***************************************************************************** * - * PROJECT: Multi Theft Auto + * PROJECT: Multi Theft Auto v1.0 + * (Shared logic for modifications) * LICENSE: See LICENSE in the top level directory - * FILE: mods/deathmatch/logic/CClientColModel.h + * FILE: mods/shared_logic/CClientColModel.h * PURPOSE: Model collision (.col file) entity class * *****************************************************************************/ diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 3f9b3f0661e..a539a4748e1 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -2,7 +2,7 @@ * * PROJECT: Multi Theft Auto * LICENSE: See LICENSE in the top level directory - * FILE: mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp + * FILE: mods/shared_logic/luadefs/CLuaEngineDefs.cpp * PURPOSE: Lua definitions class * * Multi Theft Auto is available from http://www.multitheftauto.com/ @@ -54,7 +54,6 @@ void CLuaEngineDefs::LoadFunctions() {"engineRestoreModelPhysicalPropertiesGroup", EngineRestoreModelPhysicalPropertiesGroup}, {"engineSetObjectGroupPhysicalProperty", EngineSetObjectGroupPhysicalProperty}, {"engineGetObjectGroupPhysicalProperty", EngineGetObjectGroupPhysicalProperty}, - {"engineRestoreObjectGroupPhysicalProperties", EngineRestoreObjectGroupPhysicalProperties}, {"engineRestreamWorld", ArgumentParser}, {"engineRestoreObjectGroupPhysicalProperties", EngineRestoreObjectGroupPhysicalProperties}, {"engineGetModelCollisionProperties", ArgumentParser}, From d430db0fa7cd711f57168deb6f536c44bf7c60fb Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sun, 25 Apr 2021 10:56:54 +0200 Subject: [PATCH 46/50] refactor getData to use new parser --- Client/game_sa/CColModelSA.h | 10 +- .../logic/luadefs/CLuaEngineDefs.cpp | 387 +++--------------- .../deathmatch/logic/luadefs/CLuaEngineDefs.h | 2 +- 3 files changed, 52 insertions(+), 347 deletions(-) diff --git a/Client/game_sa/CColModelSA.h b/Client/game_sa/CColModelSA.h index 56139e1f8e3..4a68cad7c9e 100644 --- a/Client/game_sa/CColModelSA.h +++ b/Client/game_sa/CColModelSA.h @@ -130,16 +130,14 @@ typedef struct return vertices; } - size_t getNumVertices() const + unsigned short getNumVertices() const { - std::map vertices; + unsigned short numVertices = 0; for (uint i = 0; numColTriangles > i; i++) { - vertices[pColTriangles[i].vertex[0]] = true; - vertices[pColTriangles[i].vertex[1]] = true; - vertices[pColTriangles[i].vertex[2]] = true; + numVertices = std::max(std::max(numVertices, pColTriangles[i].vertex[0]), std::max(pColTriangles[i].vertex[1], pColTriangles[i].vertex[2])); } - return vertices.size(); + return numVertices; } bool isValidIndex(eCollisionShape eShape, ushort usIndex, ushort numVertices = 0) const diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index a539a4748e1..63e4bafcf55 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -57,7 +57,7 @@ void CLuaEngineDefs::LoadFunctions() {"engineRestreamWorld", ArgumentParser}, {"engineRestoreObjectGroupPhysicalProperties", EngineRestoreObjectGroupPhysicalProperties}, {"engineGetModelCollisionProperties", ArgumentParser}, - {"engineGetModelCollisionData", EngineGetModelCollisionData}, + {"engineGetModelCollisionData", ArgumentParser}, {"engineSetModelCollisionData", EngineSetModelCollisionData}, {"engineUpdateModelCollisionBoundingBox", ArgumentParser}, {"isModelCollisionLoaded", ArgumentParser }, @@ -429,7 +429,7 @@ int CLuaEngineDefs::EngineLoadIFP(lua_State* luaVM) int CLuaEngineDefs::EngineReplaceCOL(lua_State* luaVM) { - CClientColModel* pCol = nullptr; + CClientColModel* pCol = NULL; unsigned short usModel = 0; CScriptArgReader argStream(luaVM); // Grab the COL and model ID @@ -486,7 +486,7 @@ int CLuaEngineDefs::EngineRestoreCOL(lua_State* luaVM) int CLuaEngineDefs::EngineImportTXD(lua_State* luaVM) { - CClientTXD* pTXD = nullptr; + CClientTXD* pTXD = NULL; SString strModelName; CScriptArgReader argStream(luaVM); argStream.ReadUserData(pTXD); @@ -2113,357 +2113,64 @@ std::unordered_map> CLuaEngineDef return map; } - bool CLuaEngineDefs::IsModelCollisionLoaded(ushort usModel) +bool CLuaEngineDefs::IsModelCollisionLoaded(ushort usModel) { return GetModelCollisionInterface(usModel) != nullptr; } -int CLuaEngineDefs::EngineGetModelCollisionData(lua_State* luaVM) +int CLuaEngineDefs::EngineGetModelCollisionData(std::variant model, eCollisionShape eShape) { - CClientColModel* pCol = NULL; - unsigned short usModel = 0; - CScriptArgReader argStream(luaVM); - // Grab the COL or model ID - // If COL element then read custom collision, otherwise read original collision - if (argStream.NextIsNumber()) - argStream.ReadNumber(usModel); + CColModelSAInterface* pColModelSAInterface; + if (std::holds_alternative(model)) + pColModelSAInterface = std::get(model)->GetColModelInterface(); else - argStream.ReadUserData(pCol); + pColModelSAInterface = GetModelCollisionInterface(std::get(model)); - if (!argStream.HasErrors()) - { - CColModelSAInterface* pColModelSAInterface; - if (pCol) - pColModelSAInterface = pCol->GetColModelInterface(); - else - pColModelSAInterface = GetModelCollisionInterface(usModel); + if (!pColModelSAInterface) + throw std::invalid_argument("Invalid or not loaded in model."); - if (pColModelSAInterface) - { + std::vector> collisionData; - ushort usIndex; - eCollisionShape eCollisionShape; - argStream.ReadEnumString(eCollisionShape); - argStream.ReadNumber(usIndex, 0); - CColDataSA* pColData = pColModelSAInterface->pColData; - if (pColData) + switch (eShape) + { + case eCollisionShape::BOX: + collisionData.reserve(pColModelSAInterface->pColData->numColBoxes); + for (int i = 0; i < pColModelSAInterface->pColData->numColBoxes; i++) { - switch (eCollisionShape) + CColBoxSA* pBox = pColModelSAInterface->pColData->pColBoxes + i; + collisionData.push_back({pBox->min.fX, pBox->min.fY, pBox->min.fZ, pBox->max.fX, pBox->max.fY, pBox->max.fZ, (float)pBox->material, + (float)pBox->lighting.day, (float)pBox->lighting.night}); + } + case eCollisionShape::SPHERE: + collisionData.reserve(pColModelSAInterface->pColData->numColSpheres); + for (int i = 0; i < pColModelSAInterface->pColData->numColSpheres; i++) + { + CColSphereSA* pSphere = pColModelSAInterface->pColData->pColSpheres + i; + collisionData.push_back({pSphere->vecCenter.fX, pSphere->vecCenter.fY, pSphere->vecCenter.fZ, (float)pSphere->material, + (float)pSphere->lighting.day, + (float)pSphere->lighting.night}); + } + case eCollisionShape::TRIANGLE: + collisionData.reserve(pColModelSAInterface->pColData->numColTriangles); + for (int i = 0; i < pColModelSAInterface->pColData->numColTriangles; i++) + { + CColTriangleSA* pTriangle = pColModelSAInterface->pColData->pColTriangles + i; + collisionData.push_back({pTriangle->vertex[0] + 1.0f, pTriangle->vertex[1] + 1.0f, pTriangle->vertex[2] + 1.0f, (float)pTriangle->material, + (float)pTriangle->lighting.day, + (float)pTriangle->lighting.night}); + } + case eCollisionShape::VERTEX: + { + collisionData.reserve(pColModelSAInterface->pColData->getNumVertices()); + CVector vector; + for (int i = 0; i < pColModelSAInterface->pColData->numColTriangles; i++) { - case eCollisionShape::BOX: - if (usIndex > 0) - { - usIndex--; - if (pColData->isValidIndex(eCollisionShape::BOX, usIndex)) - { - CColBoxSA pBox = pColData->pColBoxes[usIndex]; - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pBox.min.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pBox.min.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pBox.min.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pBox.max.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pBox.max.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pBox.max.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 7); - lua_pushnumber(luaVM, pBox.material); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 8); - lua_pushnumber(luaVM, pBox.lighting.day); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 9); - lua_pushnumber(luaVM, pBox.lighting.night); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - return 1; - } - else - { - argStream.SetCustomError("Invalid box index."); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - } - } - else - { - lua_newtable(luaVM); - for (uint i = 0; pColData->numColBoxes > i; i++) - { - lua_pushnumber(luaVM, i + 1); - CColBoxSA pBox = pColData->pColBoxes[i]; - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pBox.min.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pBox.min.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pBox.min.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pBox.max.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pBox.max.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pBox.max.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 7); - lua_pushnumber(luaVM, pBox.material); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 8); - lua_pushnumber(luaVM, pBox.lighting.day); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 9); - lua_pushnumber(luaVM, pBox.lighting.night); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - } - return 1; - } - break; - case eCollisionShape::SPHERE: - if (usIndex > 0) - { - usIndex--; - if (pColData->isValidIndex(eCollisionShape::SPHERE, usIndex)) - { - CColSphereSA pSphere = pColData->pColSpheres[usIndex]; - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pSphere.vecCenter.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pSphere.vecCenter.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pSphere.vecCenter.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pSphere.fRadius); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pSphere.material); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pSphere.lighting.day); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 7); - lua_pushnumber(luaVM, pSphere.lighting.night); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - return 1; - } - else - { - argStream.SetCustomError("Invalid sphere index."); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - } - else - { - lua_newtable(luaVM); - CColSphereSA pSphere; - for (uint i = 0; pColData->numColSpheres > i; i++) - { - lua_pushnumber(luaVM, i + 1); - pSphere = pColData->pColSpheres[i]; - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, pSphere.vecCenter.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, pSphere.vecCenter.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, pSphere.vecCenter.fZ); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, pSphere.fRadius); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, pSphere.material); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, pSphere.lighting.day); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 7); - lua_pushnumber(luaVM, pSphere.lighting.night); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - } - return 1; - } - break; - case eCollisionShape::TRIANGLE: - if (usIndex > 0) - { - usIndex--; - if (pColData->isValidIndex(eCollisionShape::TRIANGLE, usIndex)) - { - CColTriangleSA pTriangle = pColData->pColTriangles[usIndex]; - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, static_cast(pTriangle.vertex[0] + 1)); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, static_cast(pTriangle.vertex[1] + 1)); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, static_cast(pTriangle.vertex[2] + 1)); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, static_cast(pTriangle.material)); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, static_cast(pTriangle.lighting.day)); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, static_cast(pTriangle.lighting.night)); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - return 1; - - } - else - { - argStream.SetCustomError("Invalid triangle index."); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - } - else - { - lua_newtable(luaVM); - CColTriangleSA pTriangle; - for (uint i = 0; pColData->numColTriangles > i; i++) - { - lua_pushnumber(luaVM, i + 1); - pTriangle = pColData->pColTriangles[i]; - lua_newtable(luaVM); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, static_cast(pTriangle.vertex[0] + 1)); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, static_cast(pTriangle.vertex[1] + 1)); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, static_cast(pTriangle.vertex[2] + 1)); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 4); - lua_pushnumber(luaVM, static_cast(pTriangle.material)); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 5); - lua_pushnumber(luaVM, static_cast(pTriangle.lighting.day)); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 6); - lua_pushnumber(luaVM, static_cast(pTriangle.lighting.night)); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - } - return 1; - } - break; - case eCollisionShape::VERTEX: - if (usIndex > 0) - { - usIndex--; - unsigned short usNumVertices; - if (pCol) - { - usNumVertices = pCol->GetVerticesCount(); - } - else - { - usNumVertices = pColData->getNumVertices(); - } - - if (pColData->isValidIndex(eCollisionShape::VERTEX, usIndex, usNumVertices)) - { - CompressedVector pTriangle = pColData->pVertices[usIndex]; - lua_newtable(luaVM); - CVector vec = pTriangle.getVector(); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, vec.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, vec.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, vec.fZ); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - return 1; - } - else - { - argStream.SetCustomError("Invalid vertex index."); - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; - } - } - else - { - int iNumVertices; - if (pCol) - { - iNumVertices = pCol->GetVerticesCount(); - } - else - { - iNumVertices = pColData->getNumVertices(); - } - - CVector vec; - CompressedVector pVertex; - - lua_newtable(luaVM); - for (int i = 0; i < iNumVertices; i++) - { - lua_pushnumber(luaVM, i + 1); - lua_newtable(luaVM); - pVertex = pColData->pVertices[i]; - vec = pVertex.getVector(); - lua_pushnumber(luaVM, 1); - lua_pushnumber(luaVM, vec.fX); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 2); - lua_pushnumber(luaVM, vec.fY); - lua_settable(luaVM, -3); - lua_pushnumber(luaVM, 3); - lua_pushnumber(luaVM, vec.fZ); - lua_settable(luaVM, -3); - lua_settable(luaVM, -3); - } - return 1; - } - break; + vector = pColModelSAInterface->pColData->pVertices[i].getVector(); + collisionData.push_back({vector.fX, vector.fY, vector.fZ}); } + break; } - } } - if (argStream.HasErrors()) - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; } bool CLuaEngineDefs::EngineUpdateModelCollisionBoundingBox(CClientColModel* pColModel, std::optional vecCenter) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h index 1d261e26e4a..5765a1b08dc 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h @@ -62,7 +62,7 @@ class CLuaEngineDefs : public CLuaDefs static bool EngineSetModelVisibleTime(std::string strModelId, char cHourOn, char cHourOff); static std::variant> EngineGetModelVisibleTime(std::string strModelId); static std::unordered_map> EngineGetModelCollisionProperties(lua_State* luaVM); - LUA_DECLARE(EngineGetModelCollisionData); + static int EngineGetModelCollisionData(std::variant model, eCollisionShape eShape); LUA_DECLARE(EngineSetModelCollisionData); static bool EngineUpdateModelCollisionBoundingBox(CClientColModel* pColModel, std::optional vecCenter); static bool IsModelCollisionLoaded(ushort usModel); From 75e1d8dc54ad446a76801a5b3dccc88f2373888e Mon Sep 17 00:00:00 2001 From: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com> Date: Wed, 4 Aug 2021 23:05:01 +0300 Subject: [PATCH 47/50] Update CColModelSA.h --- Client/game_sa/CColModelSA.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/game_sa/CColModelSA.h b/Client/game_sa/CColModelSA.h index 4a68cad7c9e..a6107166bfb 100644 --- a/Client/game_sa/CColModelSA.h +++ b/Client/game_sa/CColModelSA.h @@ -108,7 +108,7 @@ typedef struct BYTE ucNumWheels; BYTE m_nFlags; CColSphereSA* pColSpheres; - CColBoxSA* pColBoxes; + CColBoxSA* pColBoxes; void* pSuspensionLines; CompressedVector* pVertices; CColTriangleSA* pColTriangles; From ac881debff4507e8274677dfeeed9c52db7ecbc6 Mon Sep 17 00:00:00 2001 From: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com> Date: Wed, 4 Aug 2021 23:06:53 +0300 Subject: [PATCH 48/50] Update CClientColModel.cpp --- Client/mods/deathmatch/logic/CClientColModel.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Client/mods/deathmatch/logic/CClientColModel.cpp b/Client/mods/deathmatch/logic/CClientColModel.cpp index 849e0150e49..53aef6b75bb 100644 --- a/Client/mods/deathmatch/logic/CClientColModel.cpp +++ b/Client/mods/deathmatch/logic/CClientColModel.cpp @@ -20,7 +20,6 @@ CClientColModel::CClientColModel(CClientManager* pManager, ElementID ID) : Class SetTypeName("col"); - // Add us to DFF manager's list m_pColModelManager->AddToList(this); } @@ -138,8 +137,10 @@ bool CClientColModel::HasReplaced(unsigned short usModel) { // Is this the given ID if (*iter == usModel) + { // We have replaced it return true; + } } // We have not replaced it From eb8557e6369357f9f91896ab0ac2a95342506c4d Mon Sep 17 00:00:00 2001 From: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com> Date: Wed, 4 Aug 2021 23:10:54 +0300 Subject: [PATCH 49/50] Update CLuaEngineDefs.cpp --- Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 1e3c16bfa0c..04040e21289 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -72,7 +72,7 @@ void CLuaEngineDefs::LoadFunctions() {"engineGetModelCollisionData", ArgumentParser}, {"engineSetModelCollisionData", EngineSetModelCollisionData}, {"engineUpdateModelCollisionBoundingBox", ArgumentParser}, - {"isModelCollisionLoaded", ArgumentParser }, + {"isModelCollisionLoaded", ArgumentParser}, // CLuaCFunctions::AddFunction ( "engineReplaceMatchingAtomics", EngineReplaceMatchingAtomics ); // CLuaCFunctions::AddFunction ( "engineReplaceWheelAtomics", EngineReplaceWheelAtomics ); @@ -2086,7 +2086,7 @@ std::unordered_map> CLuaEngineDef CScriptArgReader argStream(luaVM); // Grab the COL or model ID // If COL element then read custom collision, otherwise read original collision - if( argStream.NextIsNumber()) + if (argStream.NextIsNumber()) argStream.ReadNumber(usModel); else argStream.ReadUserData(pCol); From b0946218cae5d2009637c8432e047d364f44adb2 Mon Sep 17 00:00:00 2001 From: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com> Date: Wed, 4 Aug 2021 23:11:38 +0300 Subject: [PATCH 50/50] Update CLuaEngineDefs.cpp --- Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 04040e21289..4d0c6e4a1f5 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -64,10 +64,10 @@ void CLuaEngineDefs::LoadFunctions() {"engineRestoreModelPhysicalPropertiesGroup", EngineRestoreModelPhysicalPropertiesGroup}, {"engineSetObjectGroupPhysicalProperty", EngineSetObjectGroupPhysicalProperty}, {"engineGetObjectGroupPhysicalProperty", EngineGetObjectGroupPhysicalProperty}, + {"engineRestoreObjectGroupPhysicalProperties", EngineRestoreObjectGroupPhysicalProperties}, {"engineRestreamWorld", ArgumentParser}, {"engineStreamingFreeUpMemory", ArgumentParser}, {"engineStreamingGetUsedMemory", ArgumentParser}, - {"engineRestoreObjectGroupPhysicalProperties", EngineRestoreObjectGroupPhysicalProperties}, {"engineGetModelCollisionProperties", ArgumentParser}, {"engineGetModelCollisionData", ArgumentParser}, {"engineSetModelCollisionData", EngineSetModelCollisionData},