Ticket #4278: ticket4278-v2.patch

File ticket4278-v2.patch, 2.8 KB (added by mimo, 8 years ago)
  • source/simulation2/components/CCmpUnitMotion.cpp

     
    15711571    goal.x = obstruction.x;
    15721572    goal.z = obstruction.z;
    15731573
    1574     entity_pos_t distance = Geometry::DistanceToSquare(pos - CFixedVector2D(obstruction.x, obstruction.z), obstruction.u, obstruction.v, halfSize);
     1574    entity_pos_t distance = Geometry::DistanceToSquare(pos - CFixedVector2D(obstruction.x, obstruction.z), obstruction.u, obstruction.v, halfSize, true);
    15751575
    15761576    // Compare with previous obstruction
    15771577    ICmpObstructionManager::ObstructionSquare previousObstruction;
    15781578    cmpObstruction->GetPreviousObstructionSquare(previousObstruction);
    1579     entity_pos_t previousDistance = Geometry::DistanceToSquare(pos - CFixedVector2D(previousObstruction.x, previousObstruction.z), obstruction.u, obstruction.v, halfSize);
     1579    entity_pos_t previousDistance = Geometry::DistanceToSquare(pos - CFixedVector2D(previousObstruction.x, previousObstruction.z), obstruction.u, obstruction.v, halfSize, true);
    15801580
    1581     if (distance < minRange && previousDistance < minRange)
     1581    bool inside = distance.IsZero() && !Geometry::DistanceToSquare(pos - CFixedVector2D(obstruction.x, obstruction.z), obstruction.u, obstruction.v, halfSize).IsZero();
     1582    if (distance < minRange && previousDistance < minRange || inside)
    15821583    {
    15831584        // Too close to the square - need to move away
    15841585
     
    16911692    if (hasObstruction)
    16921693    {
    16931694        CFixedVector2D halfSize(obstruction.hw, obstruction.hh);
    1694         entity_pos_t distance = Geometry::DistanceToSquare(pos - CFixedVector2D(obstruction.x, obstruction.z), obstruction.u, obstruction.v, halfSize);
     1695        entity_pos_t distance = Geometry::DistanceToSquare(pos - CFixedVector2D(obstruction.x, obstruction.z), obstruction.u, obstruction.v, halfSize, true);
    16951696
    16961697        // Compare with previous obstruction
    16971698        ICmpObstructionManager::ObstructionSquare previousObstruction;
    16981699        cmpObstruction->GetPreviousObstructionSquare(previousObstruction);
    1699         entity_pos_t previousDistance = Geometry::DistanceToSquare(pos - CFixedVector2D(previousObstruction.x, previousObstruction.z), obstruction.u, obstruction.v, halfSize);
     1700        entity_pos_t previousDistance = Geometry::DistanceToSquare(pos - CFixedVector2D(previousObstruction.x, previousObstruction.z), obstruction.u, obstruction.v, halfSize, true);
    17001701
    17011702        // See if we're too close to the target square
    1702         if (distance < minRange && previousDistance < minRange)
     1703        bool inside = distance.IsZero() && !Geometry::DistanceToSquare(pos - CFixedVector2D(obstruction.x, obstruction.z), obstruction.u, obstruction.v, halfSize).IsZero();
     1704        if (distance < minRange && previousDistance < minRange || inside)
    17031705            return false;
    17041706
    17051707        // See if we're close enough to the target square