fix(navigation): hide guidance near base
This commit is contained in:
@@ -10,6 +10,7 @@ final class BaseNavigationController implements Runnable {
|
||||
private final Server server;
|
||||
private final BaseStateManager stateManager;
|
||||
private final PluginSettingsProvider settings;
|
||||
private final BaseBoundsService boundsService;
|
||||
|
||||
BaseNavigationController(
|
||||
Server server,
|
||||
@@ -19,6 +20,7 @@ final class BaseNavigationController implements Runnable {
|
||||
this.server = server;
|
||||
this.stateManager = stateManager;
|
||||
this.settings = settings;
|
||||
this.boundsService = new BaseBoundsService(settings);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -32,7 +34,16 @@ final class BaseNavigationController implements Runnable {
|
||||
if (!player.getWorld().getUID().equals(base.worldId())) {
|
||||
continue;
|
||||
}
|
||||
Location origin = player.getLocation().clone().add(0.0, 0.15, 0.0);
|
||||
Location playerLocation = player.getLocation();
|
||||
if (!BaseNavigationVisibility.isBeyondBorderBuffer(
|
||||
base,
|
||||
boundsService.radius(state),
|
||||
playerLocation.getX(),
|
||||
playerLocation.getZ()
|
||||
)) {
|
||||
continue;
|
||||
}
|
||||
Location origin = playerLocation.clone().add(0.0, 0.15, 0.0);
|
||||
Vector direction = new Vector(
|
||||
base.x() + 0.5 - origin.getX(),
|
||||
0.0,
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
package games.dmg.spigotbase;
|
||||
|
||||
final class BaseNavigationVisibility {
|
||||
static final int BORDER_BUFFER = 25;
|
||||
|
||||
private BaseNavigationVisibility() {
|
||||
}
|
||||
|
||||
static boolean isBeyondBorderBuffer(
|
||||
BaseLocation base,
|
||||
int radius,
|
||||
double playerX,
|
||||
double playerZ
|
||||
) {
|
||||
if (base == null) {
|
||||
throw new IllegalArgumentException("base is required");
|
||||
}
|
||||
if (radius <= 0) {
|
||||
throw new IllegalArgumentException("base radius must be positive");
|
||||
}
|
||||
double deltaX = playerX - (base.x() + 0.5);
|
||||
double deltaZ = playerZ - (base.z() + 0.5);
|
||||
double minimumDistance = radius + BORDER_BUFFER;
|
||||
return deltaX * deltaX + deltaZ * deltaZ > minimumDistance * minimumDistance;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user