63 lines
2.1 KiB
Java
63 lines
2.1 KiB
Java
package games.dmg.spigotbase;
|
|
|
|
import org.bukkit.Location;
|
|
import org.bukkit.Particle;
|
|
import org.bukkit.Server;
|
|
import org.bukkit.entity.Player;
|
|
|
|
final class BaseBorderController implements Runnable {
|
|
private final Server server;
|
|
private final BaseStateManager stateManager;
|
|
private final BaseBoundsService boundsService;
|
|
|
|
BaseBorderController(
|
|
Server server,
|
|
BaseStateManager stateManager,
|
|
BaseBoundsService boundsService
|
|
) {
|
|
this.server = server;
|
|
this.stateManager = stateManager;
|
|
this.boundsService = boundsService;
|
|
}
|
|
|
|
@Override
|
|
public void run() {
|
|
for (Player player : server.getOnlinePlayers()) {
|
|
PlayerState state = stateManager.player(player.getUniqueId(), player.getName());
|
|
if (!state.borderEnabled() || state.base().isEmpty()) {
|
|
continue;
|
|
}
|
|
BaseLocation base = state.base().orElseThrow();
|
|
if (!player.getWorld().getUID().equals(base.worldId())) {
|
|
continue;
|
|
}
|
|
Location playerLocation = player.getLocation();
|
|
long minimumY = (long) base.y() - boundsService.verticalRange(state);
|
|
long maximumY = (long) base.y() + boundsService.verticalRange(state);
|
|
if (playerLocation.getY() < minimumY || playerLocation.getY() > maximumY) {
|
|
continue;
|
|
}
|
|
for (BaseBorderGeometry.Point point : BaseBorderGeometry.visiblePoints(
|
|
base.x() + 0.5,
|
|
base.z() + 0.5,
|
|
boundsService.radius(state),
|
|
playerLocation.getX(),
|
|
playerLocation.getZ()
|
|
)) {
|
|
Location particle = new Location(
|
|
player.getWorld(),
|
|
point.x(),
|
|
playerLocation.getY() + 0.15,
|
|
point.z()
|
|
);
|
|
player.spawnParticle(
|
|
Particle.END_ROD,
|
|
particle,
|
|
1,
|
|
0.0, 0.0, 0.0, 0.0
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|