Skip to content

Commit ad9f763

Browse files
committed
testSphereAgainstWorld
1 parent 4e18928 commit ad9f763

File tree

5 files changed

+35
-2
lines changed

5 files changed

+35
-2
lines changed

Client/game_sa/CWorldSA.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,19 @@ bool CWorldSA::ResetSurfaceInfo(short sSurfaceID)
7777
return false;
7878
}
7979

80+
CEntity* CWorldSA::TestSphereAgainstWorld(const CVector& sphereCenter, float radius, CEntity* ignoredEntity, bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies, bool cameraIgnore, bool& collisionDetectedOut)
81+
{
82+
auto entity = ((CEntitySAInterface*(__cdecl*)(CVector, float, CEntitySAInterface*, bool, bool, bool, bool, bool, bool))FUNC_CWorld_TestSphereAgainstWorld)(sphereCenter, radius, ignoredEntity ? ignoredEntity->GetInterface() : nullptr, checkBuildings, checkVehicles, checkPeds, checkObjects, checkDummies, cameraIgnore);
83+
if (!entity)
84+
{
85+
collisionDetectedOut = false;
86+
return nullptr;
87+
}
88+
89+
collisionDetectedOut = true;
90+
return pGame->GetPools()->GetEntity(reinterpret_cast<DWORD*>(entity));
91+
}
92+
8093
void HOOK_FallenPeds();
8194
void HOOK_FallenCars();
8295

Client/game_sa/CWorldSA.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#define VAR_COcclusion_NumActiveOccluders 0xC73CC0
2626
#define CALL_CCullZones_FindTunnelAttributesForCoors 0x55570D
2727
#define FUNC_CWorld_FindPositionForTrackPosition 0x6F59E0
28+
#define FUNC_CWorld_TestSphereAgainstWorld 0x569E20
2829

2930
#define VAR_IgnoredEntity 0xB7CD68
3031
#define VAR_currArea 0xB72914
@@ -74,6 +75,8 @@ class CWorldSA : public CWorld
7475
void ResetAllSurfaceInfo() override;
7576
bool ResetSurfaceInfo(short sSurfaceID) override;
7677

78+
CEntity* TestSphereAgainstWorld(const CVector& sphereCenter, float radius, CEntity* ignoredEntity, bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies, bool cameraIgnore, bool& collisionDetectedOut) override;
79+
7780
private:
7881
float m_fAircraftMaxHeight;
7982
CSurfaceType* m_pSurfaceInfo;

Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,8 @@ void CLuaWorldDefs::LoadFunctions()
139139
{"isWorldSpecialPropertyEnabled", ArgumentParserWarn<false, IsWorldSpecialPropertyEnabled>},
140140
{"isGarageOpen", IsGarageOpen},
141141
{"isTimeFrozen", ArgumentParser<IsTimeFrozen>},
142-
{"isVolumetricShadowsEnabled", ArgumentParser<IsVolumetricShadowsEnabled>}};
142+
{"isVolumetricShadowsEnabled", ArgumentParser<IsVolumetricShadowsEnabled>},
143+
{"testSphereAgainstWorld", ArgumentParser<TestSphereAgainstWorld>}};
143144

144145
// Add functions
145146
for (const auto& [name, func] : functions)
@@ -2278,3 +2279,15 @@ void CLuaWorldDefs::ResetWorldProperties(std::optional<bool> resetSpecialWorldPr
22782279
{
22792280
g_pClientGame->ResetWorldProperties(ResetWorldPropsInfo{resetSpecialWorldProperties.value_or(true), resetWorldProperties.value_or(true), resetWeatherProperties.value_or(true), resetLODs.value_or(true), resetSounds.value_or(true)});
22802281
}
2282+
2283+
CLuaMultiReturn<bool, std::variant<CClientEntity*, std::nullptr_t>> CLuaWorldDefs::TestSphereAgainstWorld(CVector sphereCenter, float radius, std::optional<CClientEntity*> ignoredEntity, std::optional<bool> checkBuildings, std::optional<bool> checkVehicles, std::optional<bool> checkPeds, std::optional<bool> checkObjects, std::optional<bool> checkDummies, std::optional<bool> cameraIgnore)
2284+
{
2285+
bool collisionDetected = false;
2286+
CClientEntity* collidedEntity = nullptr;
2287+
2288+
CEntity* entity = g_pGame->GetWorld()->TestSphereAgainstWorld(sphereCenter, radius, ignoredEntity.has_value() ? ignoredEntity.value()->GetGameEntity() : nullptr, checkBuildings.value_or(true), checkVehicles.value_or(true), checkPeds.value_or(true), checkObjects.value_or(true), checkDummies.value_or(true), cameraIgnore.value_or(false), collisionDetected);
2289+
if (entity)
2290+
collidedEntity = reinterpret_cast<CClientEntity*>(entity->GetStoredPointer());
2291+
2292+
return {collisionDetected, collidedEntity};
2293+
}

Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ class CLuaWorldDefs : public CLuaDefs
140140
static bool ResetVolumetricShadows() noexcept;
141141

142142
static void ResetWorldProperties(std::optional<bool> resetSpecialWorldProperties, std::optional<bool> resetWorldProperties, std::optional<bool> resetWeatherProperties, std::optional<bool> resetLODs, std::optional<bool> resetSounds) noexcept;
143-
143+
144+
static CLuaMultiReturn<bool, std::variant<CClientEntity*, std::nullptr_t>> TestSphereAgainstWorld(CVector sphereCenter, float radius, std::optional<CClientEntity*> ignoredEntity, std::optional<bool> checkBuildings, std::optional<bool> checkVehicles, std::optional<bool> checkPeds, std::optional<bool> checkObjects, std::optional<bool> checkDummies, std::optional<bool> cameraIgnore);
145+
144146
};
145147

Client/sdk/game/CWorld.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,4 +274,6 @@ class CWorld
274274
virtual CSurfaceType* GetSurfaceInfo() = 0;
275275
virtual void ResetAllSurfaceInfo() = 0;
276276
virtual bool ResetSurfaceInfo(short sSurfaceID) = 0;
277+
278+
virtual CEntity* TestSphereAgainstWorld(const CVector& sphereCenter, float radius, CEntity* ignoredEntity, bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies, bool cameraIgnore, bool& collisionDetectedOut) = 0;
277279
};

0 commit comments

Comments
 (0)