forked from 0ad/0ad
fix UnitMotion when inside the obstruction, refs #4278
This was SVN commit r18921.
This commit is contained in:
parent
fe01a710a5
commit
3e59ac76ee
@ -1571,14 +1571,15 @@ bool CCmpUnitMotion::MoveToTargetRange(entity_id_t target, entity_pos_t minRange
|
|||||||
goal.x = obstruction.x;
|
goal.x = obstruction.x;
|
||||||
goal.z = obstruction.z;
|
goal.z = obstruction.z;
|
||||||
|
|
||||||
entity_pos_t distance = Geometry::DistanceToSquare(pos - CFixedVector2D(obstruction.x, obstruction.z), obstruction.u, obstruction.v, halfSize);
|
entity_pos_t distance = Geometry::DistanceToSquare(pos - CFixedVector2D(obstruction.x, obstruction.z), obstruction.u, obstruction.v, halfSize, true);
|
||||||
|
|
||||||
// Compare with previous obstruction
|
// Compare with previous obstruction
|
||||||
ICmpObstructionManager::ObstructionSquare previousObstruction;
|
ICmpObstructionManager::ObstructionSquare previousObstruction;
|
||||||
cmpObstruction->GetPreviousObstructionSquare(previousObstruction);
|
cmpObstruction->GetPreviousObstructionSquare(previousObstruction);
|
||||||
entity_pos_t previousDistance = Geometry::DistanceToSquare(pos - CFixedVector2D(previousObstruction.x, previousObstruction.z), obstruction.u, obstruction.v, halfSize);
|
entity_pos_t previousDistance = Geometry::DistanceToSquare(pos - CFixedVector2D(previousObstruction.x, previousObstruction.z), obstruction.u, obstruction.v, halfSize, true);
|
||||||
|
|
||||||
if (distance < minRange && previousDistance < minRange)
|
bool inside = distance.IsZero() && !Geometry::DistanceToSquare(pos - CFixedVector2D(obstruction.x, obstruction.z), obstruction.u, obstruction.v, halfSize).IsZero();
|
||||||
|
if (distance < minRange && previousDistance < minRange || inside)
|
||||||
{
|
{
|
||||||
// Too close to the square - need to move away
|
// Too close to the square - need to move away
|
||||||
|
|
||||||
@ -1691,15 +1692,16 @@ bool CCmpUnitMotion::IsInTargetRange(entity_id_t target, entity_pos_t minRange,
|
|||||||
if (hasObstruction)
|
if (hasObstruction)
|
||||||
{
|
{
|
||||||
CFixedVector2D halfSize(obstruction.hw, obstruction.hh);
|
CFixedVector2D halfSize(obstruction.hw, obstruction.hh);
|
||||||
entity_pos_t distance = Geometry::DistanceToSquare(pos - CFixedVector2D(obstruction.x, obstruction.z), obstruction.u, obstruction.v, halfSize);
|
entity_pos_t distance = Geometry::DistanceToSquare(pos - CFixedVector2D(obstruction.x, obstruction.z), obstruction.u, obstruction.v, halfSize, true);
|
||||||
|
|
||||||
// Compare with previous obstruction
|
// Compare with previous obstruction
|
||||||
ICmpObstructionManager::ObstructionSquare previousObstruction;
|
ICmpObstructionManager::ObstructionSquare previousObstruction;
|
||||||
cmpObstruction->GetPreviousObstructionSquare(previousObstruction);
|
cmpObstruction->GetPreviousObstructionSquare(previousObstruction);
|
||||||
entity_pos_t previousDistance = Geometry::DistanceToSquare(pos - CFixedVector2D(previousObstruction.x, previousObstruction.z), obstruction.u, obstruction.v, halfSize);
|
entity_pos_t previousDistance = Geometry::DistanceToSquare(pos - CFixedVector2D(previousObstruction.x, previousObstruction.z), obstruction.u, obstruction.v, halfSize, true);
|
||||||
|
|
||||||
// See if we're too close to the target square
|
// See if we're too close to the target square
|
||||||
if (distance < minRange && previousDistance < minRange)
|
bool inside = distance.IsZero() && !Geometry::DistanceToSquare(pos - CFixedVector2D(obstruction.x, obstruction.z), obstruction.u, obstruction.v, halfSize).IsZero();
|
||||||
|
if (distance < minRange && previousDistance < minRange || inside)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// See if we're close enough to the target square
|
// See if we're close enough to the target square
|
||||||
|
Loading…
Reference in New Issue
Block a user