Fix goto() with multiple objects at the exact same position (#732)
parent
88c6818cfd
commit
eb2a1857dc
|
@ -1072,7 +1072,49 @@ Error CTaskGoto::IsEnded()
|
||||||
|
|
||||||
CObject* CTaskGoto::SearchTarget(Math::Vector pos, float margin)
|
CObject* CTaskGoto::SearchTarget(Math::Vector pos, float margin)
|
||||||
{
|
{
|
||||||
return CObjectManager::GetInstancePointer()->FindNearest(nullptr, pos, OBJECT_NULL, margin/g_unit);
|
//return CObjectManager::GetInstancePointer()->FindNearest(nullptr, pos, OBJECT_NULL, margin/g_unit);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO: FindNearest() can't be used here. Reverted to code from before 4fef3af9ef1fbe61a0c4c3f5c176f56257428efb
|
||||||
|
*
|
||||||
|
* The reason is that in the case of multiple objects being placed at the same position,
|
||||||
|
* this function needs to return the last one in order of creation. FindNearest() does the opposite.
|
||||||
|
*
|
||||||
|
* Whoever designed goto() so that it has to guess which object the user wants based only on position - thanks
|
||||||
|
* for making it so confusing :/
|
||||||
|
*
|
||||||
|
* This works well enough assuming that portable objects from the level file are always created after the objects
|
||||||
|
* they are placed on, for example BlackBox is created after GoalArea, TitaniumOre is created after Converter etc.
|
||||||
|
* This is probably required anyway to prevent them from sinking into the ground.
|
||||||
|
*
|
||||||
|
* User-created objects don't make a difference because there is no way you can place them precisely enough
|
||||||
|
* for floats to compare with ==.
|
||||||
|
*
|
||||||
|
* See issue #732
|
||||||
|
*/
|
||||||
|
|
||||||
|
CObject *pBest;
|
||||||
|
Math::Vector oPos;
|
||||||
|
float dist, min;
|
||||||
|
|
||||||
|
pBest = 0;
|
||||||
|
min = 1000000.0f;
|
||||||
|
for ( CObject* pObj : CObjectManager::GetInstancePointer()->GetAllObjects() )
|
||||||
|
{
|
||||||
|
if ( !pObj->GetActive() ) continue;
|
||||||
|
if ( IsObjectBeingTransported(pObj) ) continue; // object transtorted?
|
||||||
|
|
||||||
|
oPos = pObj->GetPosition();
|
||||||
|
dist = Math::DistanceProjected(pos, oPos);
|
||||||
|
|
||||||
|
if ( dist <= margin && dist <= min )
|
||||||
|
{
|
||||||
|
min = dist;
|
||||||
|
pBest = pObj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pBest;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adjusts the target as a function of the object.
|
// Adjusts the target as a function of the object.
|
||||||
|
|
Loading…
Reference in New Issue