|
|
@ -81,7 +81,7 @@ public class Bounds { |
|
|
|
Bounds identityBounds = Bounds.borrow(); |
|
|
|
Bounds identityBounds = Bounds.borrow(); |
|
|
|
identityBounds.setBounds(location); |
|
|
|
identityBounds.setBounds(location); |
|
|
|
|
|
|
|
|
|
|
|
collisionState = collide(targetBounds, identityBounds, 0.0f); |
|
|
|
collisionState = collide(targetBounds, identityBounds, 0.1f); |
|
|
|
identityBounds.release(); |
|
|
|
identityBounds.release(); |
|
|
|
return collisionState; |
|
|
|
return collisionState; |
|
|
|
} |
|
|
|
} |
|
|
@ -267,6 +267,45 @@ public class Bounds { |
|
|
|
return collidePoint; |
|
|
|
return collidePoint; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static Vector3fImmutable PlayerCollisionPoint(PlayerCharacter player, Vector3fImmutable start, Vector3fImmutable end) { |
|
|
|
|
|
|
|
Vector3fImmutable collidePoint = null; |
|
|
|
|
|
|
|
float distance = player.getLoc().distance2D(end); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Check for building collisions first
|
|
|
|
|
|
|
|
collidePoint = PlayerBuildingCollisionPoint(player, start, end); |
|
|
|
|
|
|
|
if (collidePoint != null) { |
|
|
|
|
|
|
|
return collidePoint; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Now check for player collisions
|
|
|
|
|
|
|
|
HashSet<AbstractWorldObject> nearbyPlayers = WorldGrid.getObjectsInRangePartial(player, distance + 2, MBServerStatics.MASK_PLAYER); |
|
|
|
|
|
|
|
float minDistance = 5.0f; // Minimum distance between players
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (AbstractWorldObject awo : nearbyPlayers) { |
|
|
|
|
|
|
|
PlayerCharacter otherPlayer = (PlayerCharacter) awo; |
|
|
|
|
|
|
|
if (otherPlayer == player) continue; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Vector3fImmutable otherLoc = otherPlayer.getLoc(); |
|
|
|
|
|
|
|
Vector3fImmutable closestPoint = getClosestPointOnLine(start, end, otherLoc); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (closestPoint.distance2D(otherLoc) < minDistance) { |
|
|
|
|
|
|
|
// Collision detected, adjust end point
|
|
|
|
|
|
|
|
Vector3fImmutable pushVector = closestPoint.subtract(otherLoc).normalize(); |
|
|
|
|
|
|
|
collidePoint = closestPoint.add(pushVector.scaleAdd(minDistance, Vector3fImmutable.ZERO)); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return collidePoint != null ? collidePoint : end; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static Vector3fImmutable getClosestPointOnLine(Vector3fImmutable lineStart, Vector3fImmutable lineEnd, Vector3fImmutable point) { |
|
|
|
|
|
|
|
Vector3fImmutable line = lineEnd.subtract(lineStart); |
|
|
|
|
|
|
|
float t = point.subtract(lineStart).dot(line) / line.dot(line); |
|
|
|
|
|
|
|
t = Math.max(0, Math.min(1, t)); |
|
|
|
|
|
|
|
return lineStart.add(line.scaleAdd(t, Vector3fImmutable.ZERO)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static boolean linesTouching(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) { |
|
|
|
public static boolean linesTouching(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) { |
|
|
|
float denominator = ((x2 - x1) * (y4 - y3)) - ((y2 - y1) * (x4 - x3)); |
|
|
|
float denominator = ((x2 - x1) * (y4 - y3)) - ((y2 - y1) * (x4 - x3)); |
|
|
|
float numerator1 = ((y1 - y3) * (x4 - x3)) - ((x1 - x3) * (y4 - y3)); |
|
|
|
float numerator1 = ((y1 - y3) * (x4 - x3)) - ((x1 - x3) * (y4 - y3)); |
|
|
|