Skip to content

Commit 3b2b8fa

Browse files
authored
Add proper 3D radius check to getElementsWithinRange (PR #1994)
1 parent 1205788 commit 3b2b8fa

File tree

2 files changed

+29
-22
lines changed

2 files changed

+29
-22
lines changed

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

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -967,20 +967,24 @@ CClientEntityResult CLuaElementDefs::GetElementsWithinRange(CVector pos, float r
967967
// Remove elements that do not match the criterias
968968
if (interior || dimension || typeHash)
969969
{
970-
result.erase(std::remove_if(result.begin(), result.end(),
971-
[&](CElement* pElement) {
972-
if (typeHash && typeHash != pElement->GetTypeHash())
973-
return true;
970+
result.erase(std::remove_if(result.begin(), result.end(), [&, radiusSq = radius * radius](CElement* pElement) {
971+
if (typeHash && typeHash != pElement->GetTypeHash())
972+
return true;
974973

975-
if (interior.has_value() && interior != pElement->GetInterior())
976-
return true;
974+
if (interior.has_value() && interior != pElement->GetInterior())
975+
return true;
977976

978-
if (dimension.has_value() && dimension != pElement->GetDimension())
979-
return true;
977+
if (dimension.has_value() && dimension != pElement->GetDimension())
978+
return true;
980979

981-
return pElement->IsBeingDeleted();
982-
}),
983-
result.end());
980+
// Check if element is within the sphere, because the spatial database is 2D
981+
CVector elementPos;
982+
pElement->GetPosition(elementPos);
983+
if ((elementPos - pos).LengthSquared() > radiusSq)
984+
return true;
985+
986+
return pElement->IsBeingDeleted();
987+
}), result.end());
984988
}
985989

986990
return result;

Server/mods/deathmatch/logic/luadefs/CLuaElementDefs.cpp

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,22 +1026,25 @@ CElementResult CLuaElementDefs::getElementsWithinRange(CVector pos, float radius
10261026
CElementResult result;
10271027
GetSpatialDatabase()->SphereQuery(result, CSphere{pos, radius});
10281028

1029+
// Remove elements that do not match the criterias
10291030
if (interior || dimension || typeHash)
10301031
{
1031-
result.erase(std::remove_if(result.begin(), result.end(),
1032-
[&](CElement* pElement) {
1033-
if (typeHash && typeHash != pElement->GetTypeHash())
1034-
return true;
1032+
result.erase(std::remove_if(result.begin(), result.end(), [&, radiusSq = radius * radius](CElement* pElement) {
1033+
if (typeHash && typeHash != pElement->GetTypeHash())
1034+
return true;
10351035

1036-
if (interior.has_value() && interior != pElement->GetInterior())
1037-
return true;
1036+
if (interior.has_value() && interior != pElement->GetInterior())
1037+
return true;
10381038

1039-
if (dimension.has_value() && dimension != pElement->GetDimension())
1040-
return true;
1039+
if (dimension.has_value() && dimension != pElement->GetDimension())
1040+
return true;
10411041

1042-
return pElement->IsBeingDeleted();
1043-
}),
1044-
result.end());
1042+
// Check if element is within the sphere, because the spatial database is 2D
1043+
if ((pElement->GetPosition() - pos).LengthSquared() > radiusSq)
1044+
return true;
1045+
1046+
return pElement->IsBeingDeleted();
1047+
}), result.end());
10451048
}
10461049

10471050
return result;

0 commit comments

Comments
 (0)