diff --git a/modules/Movecraft/src/main/java/net/countercraft/movecraft/craft/BaseCraft.java b/modules/Movecraft/src/main/java/net/countercraft/movecraft/craft/BaseCraft.java index 916883f37..0e9ce7b9f 100644 --- a/modules/Movecraft/src/main/java/net/countercraft/movecraft/craft/BaseCraft.java +++ b/modules/Movecraft/src/main/java/net/countercraft/movecraft/craft/BaseCraft.java @@ -13,7 +13,6 @@ import net.countercraft.movecraft.processing.CachedMovecraftWorld; import net.countercraft.movecraft.processing.MovecraftWorld; import net.countercraft.movecraft.processing.WorldManager; -import net.countercraft.movecraft.processing.tasks.detection.DetectionTask; import net.countercraft.movecraft.util.Counter; import net.countercraft.movecraft.util.Tags; import net.countercraft.movecraft.util.TimingData; @@ -35,7 +34,6 @@ import org.jetbrains.annotations.Nullable; import java.util.Collection; -import java.util.Collections; import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; @@ -47,32 +45,44 @@ import static net.countercraft.movecraft.util.SignUtils.getFacing; public abstract class BaseCraft implements Craft { - @NotNull protected final CraftType type; - @NotNull protected HitBox hitBox; - @NotNull protected final MutableHitBox collapsedHitBox; - @NotNull protected MutableHitBox fluidLocations; - @NotNull protected final Counter<Material> materials; - @NotNull protected World w; - @NotNull private final AtomicBoolean processing = new AtomicBoolean(); + @NotNull + protected final CraftType type; + @NotNull + protected final MutableHitBox collapsedHitBox; + @NotNull + protected final Counter<Material> materials; + @NotNull + private final AtomicBoolean processing = new AtomicBoolean(); + private final long origPilotTime; + @NotNull + private final Map<Location, BlockData> phaseBlocks = new HashMap<>(); + @NotNull + protected HitBox hitBox; + @NotNull + protected MutableHitBox fluidLocations; + @NotNull + protected World w; + @NotNull TimingData stats = new TimingData(); private boolean cruising; private boolean sinking; private boolean disabled; private CruiseDirection cruiseDirection; private long lastCruiseUpdate; private long lastBlockCheck; - private long lastRotateTime=0; - private final long origPilotTime; + private long lastRotateTime = 0; private long lastTeleportTime; private int lastDX, lastDY, lastDZ; private int currentGear = 1; private double burningFuel; private int origBlockCount; - @Nullable private Player notificationPlayer; - @NotNull private Audience audience; - @NotNull private final Map<Location, BlockData> phaseBlocks = new HashMap<>(); - @NotNull private String name = ""; - @NotNull TimingData stats = new TimingData(); - @NotNull private MovecraftLocation lastTranslation = new MovecraftLocation(0,0,0); + @Nullable + private Player notificationPlayer; + @NotNull + private Audience audience; + @NotNull + private String name = ""; + @NotNull + private MovecraftLocation lastTranslation = new MovecraftLocation(0, 0, 0); public BaseCraft(@NotNull CraftType type, @NotNull World world) { this.type = type; @@ -102,7 +112,7 @@ public HitBox getHitBox() { return hitBox; } - public void setHitBox(@NotNull HitBox hitBox){ + public void setHitBox(@NotNull HitBox hitBox) { this.hitBox = hitBox; } @@ -112,13 +122,13 @@ public CraftType getType() { } @NotNull - public MovecraftWorld getMovecraftWorld(){ + public MovecraftWorld getMovecraftWorld() { return CachedMovecraftWorld.of(w); } @NotNull public World getWorld() { - if(WorldManager.INSTANCE.isRunning() && !Bukkit.isPrimaryThread()){ + if (WorldManager.INSTANCE.isRunning() && !Bukkit.isPrimaryThread()) { var exception = new Throwable("Invoking most methods on worlds while the world manager is running WILL cause deadlock."); Bukkit.getLogger().log(Level.SEVERE, exception, exception::getMessage); } @@ -137,11 +147,11 @@ public void translate(int dx, int dy, int dz) { @Override public void translate(@NotNull World world, int dx, int dy, int dz) { var v = type.getObjectProperty(CraftType.DISABLE_TELEPORT_TO_WORLDS); - if(!(v instanceof Collection<?>)) + if (!(v instanceof Collection<?>)) throw new IllegalStateException("DISABLE_TELEPORT_TO_WORLDS must be of type Collection"); var disableTeleportToWorlds = ((Collection<?>) v); disableTeleportToWorlds.forEach(i -> { - if(!(i instanceof String)) + if (!(i instanceof String)) throw new IllegalStateException("Values in DISABLE_TELEPORT_TO_WORLDS must be of type String"); }); @@ -171,7 +181,7 @@ public void translate(@NotNull World world, int dx, int dy, int dz) { @Override public void rotate(MovecraftRotation rotation, MovecraftLocation originPoint) { - if(getLastRotateTime()+1e9>System.nanoTime()){ + if (getLastRotateTime() + 1e9 > System.nanoTime()) { getAudience().sendMessage(I18nSupport.getInternationalisedComponent("Rotation - Turning Too Quickly")); return; } @@ -186,6 +196,7 @@ public void rotate(MovecraftRotation rotation, MovecraftLocation originPoint, bo /** * Gets the crafts that have made contact with this craft + * * @return a set of crafts on contact with this craft */ @NotNull @@ -197,7 +208,7 @@ public Set<Craft> getContacts() { MovecraftLocation tcenter = contact.getHitBox().getMidPoint(); int distsquared = ccenter.distanceSquared(tcenter); double detectionMultiplier; - if(tcenter.getY() > 65) // TODO: fix the water line + if (tcenter.getY() > 65) // TODO: fix the water line detectionMultiplier = (double) contact.getType().getPerWorldProperty(CraftType.PER_WORLD_DETECTION_MULTIPLIER, contact.getWorld()); else detectionMultiplier = (double) contact.getType().getPerWorldProperty(CraftType.PER_WORLD_UNDERWATER_DETECTION_MULTIPLIER, contact.getWorld()); @@ -222,26 +233,26 @@ public void resetSigns(@NotNull Sign clicked) { if (sign.equals(clicked)) { continue; } - if (ChatColor.stripColor(sign.getLine(0)).equalsIgnoreCase("Cruise: ON")){ + if (ChatColor.stripColor(sign.getLine(0)).equalsIgnoreCase("Cruise: ON")) { sign.setLine(0, "Cruise: OFF"); } else if (ChatColor.stripColor(sign.getLine(0)).equalsIgnoreCase("Cruise: OFF") && ChatColor.stripColor(clicked.getLine(0)).equalsIgnoreCase("Cruise: ON") && getFacing(sign) == getFacing(clicked)) { - sign.setLine(0,"Cruise: ON"); + sign.setLine(0, "Cruise: ON"); } - else if (ChatColor.stripColor(sign.getLine(0)).equalsIgnoreCase("Ascend: ON")){ + else if (ChatColor.stripColor(sign.getLine(0)).equalsIgnoreCase("Ascend: ON")) { sign.setLine(0, "Ascend: OFF"); } else if (ChatColor.stripColor(sign.getLine(0)).equalsIgnoreCase("Ascend: OFF") - && ChatColor.stripColor(clicked.getLine(0)).equalsIgnoreCase("Ascend: ON")){ + && ChatColor.stripColor(clicked.getLine(0)).equalsIgnoreCase("Ascend: ON")) { sign.setLine(0, "Ascend: ON"); } - else if (ChatColor.stripColor(sign.getLine(0)).equalsIgnoreCase("Descend: ON")){ + else if (ChatColor.stripColor(sign.getLine(0)).equalsIgnoreCase("Descend: ON")) { sign.setLine(0, "Descend: OFF"); } else if (ChatColor.stripColor(sign.getLine(0)).equalsIgnoreCase("Descend: OFF") - && ChatColor.stripColor(clicked.getLine(0)).equalsIgnoreCase("Descend: ON")){ + && ChatColor.stripColor(clicked.getLine(0)).equalsIgnoreCase("Descend: ON")) { sign.setLine(0, "Descend: ON"); } sign.update(); @@ -268,7 +279,7 @@ public boolean getSinking() { public void sink() { CraftSinkEvent event = new CraftSinkEvent(this); Bukkit.getServer().getPluginManager().callEvent(event); - if(event.isCancelled()){ + if (event.isCancelled()) { return; } sinking = true; @@ -295,13 +306,13 @@ public void setCruiseDirection(CruiseDirection cruiseDirection) { } @Override - public void setLastCruiseUpdate(long update) { - this.lastCruiseUpdate = update; + public long getLastCruiseUpdate() { + return lastCruiseUpdate; } @Override - public long getLastCruiseUpdate() { - return lastCruiseUpdate; + public void setLastCruiseUpdate(long update) { + this.lastCruiseUpdate = update; } @Override @@ -315,13 +326,14 @@ public void setLastBlockCheck(long update) { } @Override - public void setLastTranslation(@NotNull MovecraftLocation lastTranslation){ - this.lastTranslation = lastTranslation; + @NotNull + public MovecraftLocation getLastTranslation() { + return this.lastTranslation; } - @Override @NotNull - public MovecraftLocation getLastTranslation(){ - return this.lastTranslation; + @Override + public void setLastTranslation(@NotNull MovecraftLocation lastTranslation) { + this.lastTranslation = lastTranslation; } @Override @@ -344,7 +356,8 @@ public void setOrigBlockCount(int origBlockCount) { this.origBlockCount = origBlockCount; } - @Nullable @Deprecated + @Nullable + @Deprecated public Player getNotificationPlayer() { return notificationPlayer; } @@ -365,55 +378,59 @@ public double getMeanCruiseTime() { } @Override - public void addCruiseTime(float cruiseTime){ + public void addCruiseTime(float cruiseTime) { stats.accept(cruiseTime); } @Override public int getTickCooldown() { - if(sinking) + if (sinking) return type.getIntProperty(CraftType.SINK_RATE_TICKS); // Counter<Material> counter = new Counter<>(); // Map<Material, Integer> counter = new HashMap<>(); - if(materials.isEmpty()){ - for(MovecraftLocation location : hitBox){ + if (materials.isEmpty()) { + for (MovecraftLocation location : hitBox) { materials.add(location.toBukkit(w).getBlock().getType()); } } int chestPenalty = 0; - for(Material m : Tags.CHESTS) { + for (Material m : Tags.CHESTS) { chestPenalty += materials.get(m); } chestPenalty *= type.getDoubleProperty(CraftType.CHEST_PENALTY); - if(!cruising) + if (!cruising) return ((int) type.getPerWorldProperty(CraftType.PER_WORLD_TICK_COOLDOWN, w) + chestPenalty) * (type.getBoolProperty(CraftType.GEAR_SHIFTS_AFFECT_TICK_COOLDOWN) ? currentGear : 1); // Ascent or Descent - if(cruiseDirection == CruiseDirection.UP || cruiseDirection == CruiseDirection.DOWN) { + if (cruiseDirection == CruiseDirection.UP || cruiseDirection == CruiseDirection.DOWN) return ((int) type.getPerWorldProperty(CraftType.PER_WORLD_VERT_CRUISE_TICK_COOLDOWN, w) + chestPenalty) * (type.getBoolProperty(CraftType.GEAR_SHIFTS_AFFECT_TICK_COOLDOWN) ? currentGear : 1); - } // Dynamic Fly Block Speed int cruiseTickCooldown = (int) type.getPerWorldProperty(CraftType.PER_WORLD_CRUISE_TICK_COOLDOWN, w); - if(type.getDoubleProperty(CraftType.DYNAMIC_FLY_BLOCK_SPEED_FACTOR) != 0){ + if (type.getDoubleProperty(CraftType.DYNAMIC_FLY_BLOCK_SPEED_FACTOR) != 0) { EnumSet<Material> flyBlockMaterials = type.getMaterialSetProperty(CraftType.DYNAMIC_FLY_BLOCK); double count = 0; - for(Material m : flyBlockMaterials) { + for (Material m : flyBlockMaterials) { count += materials.get(m); } double ratio = count / hitBox.size(); - return Math.max((int)Math.round((20.0 * ((int) type.getPerWorldProperty(CraftType.PER_WORLD_CRUISE_SKIP_BLOCKS, w) + 1)) / ((type.getDoubleProperty(CraftType.DYNAMIC_FLY_BLOCK_SPEED_FACTOR) * 1.5) * (ratio - .5) + (20.0 / cruiseTickCooldown) + 1)) * (type.getBoolProperty(CraftType.GEAR_SHIFTS_AFFECT_TICK_COOLDOWN) ? currentGear : 1), 1); + double speed = (type.getDoubleProperty(CraftType.DYNAMIC_FLY_BLOCK_SPEED_FACTOR) * 1.5) + * (ratio - 0.5) + + (20.0 / cruiseTickCooldown) + 1; + return Math.max((int) Math.round((20.0 * ((int) type.getPerWorldProperty(CraftType.PER_WORLD_CRUISE_SKIP_BLOCKS, w) + 1)) / speed) * (type.getBoolProperty(CraftType.GEAR_SHIFTS_AFFECT_TICK_COOLDOWN) ? currentGear : 1), 1); } - if(type.getDoubleProperty(CraftType.DYNAMIC_FLY_BLOCK_SPEED_FACTOR) == 0.0 || type.getDoubleProperty(CraftType.DYNAMIC_LAG_POWER_FACTOR) == 0.0 || Math.abs(type.getDoubleProperty(CraftType.DYNAMIC_LAG_POWER_FACTOR)) > 1.0) + if (type.getDoubleProperty(CraftType.DYNAMIC_LAG_SPEED_FACTOR) == 0.0 + || type.getDoubleProperty(CraftType.DYNAMIC_LAG_POWER_FACTOR) == 0.0 + || Math.abs(type.getDoubleProperty(CraftType.DYNAMIC_LAG_POWER_FACTOR)) > 1.0) return (cruiseTickCooldown + chestPenalty) * (type.getBoolProperty(CraftType.GEAR_SHIFTS_AFFECT_TICK_COOLDOWN) ? currentGear : 1); - if(stats.getCount() == 0) + if (stats.getCount() == 0) return (int) Math.round(20.0 * ((cruiseTickCooldown + 1.0) / type.getDoubleProperty(CraftType.DYNAMIC_LAG_MIN_SPEED)) * (type.getBoolProperty(CraftType.GEAR_SHIFTS_AFFECT_TICK_COOLDOWN) ? currentGear : 1)); int cruiseSkipBlocks = (int) type.getPerWorldProperty(CraftType.PER_WORLD_CRUISE_SKIP_BLOCKS, w); - if(Settings.Debug) { + if (Settings.Debug) { Bukkit.getLogger().info("Skip: " + cruiseSkipBlocks); Bukkit.getLogger().info("Tick: " + cruiseTickCooldown); Bukkit.getLogger().info("SpeedFactor: " + type.getDoubleProperty(CraftType.DYNAMIC_LAG_SPEED_FACTOR)); @@ -426,17 +443,18 @@ public int getTickCooldown() { double speed = 20.0 * (cruiseSkipBlocks + 1.0) / (float) cruiseTickCooldown; speed -= type.getDoubleProperty(CraftType.DYNAMIC_LAG_SPEED_FACTOR) * Math.pow(getMeanCruiseTime() * 1000.0, type.getDoubleProperty(CraftType.DYNAMIC_LAG_POWER_FACTOR)); speed = Math.max(type.getDoubleProperty(CraftType.DYNAMIC_LAG_MIN_SPEED), speed); - return (int)Math.round((20.0 * (cruiseSkipBlocks + 1.0)) / speed) * (type.getBoolProperty(CraftType.GEAR_SHIFTS_AFFECT_TICK_COOLDOWN) ? currentGear : 1); + return (int) Math.round((20.0 * (cruiseSkipBlocks + 1.0)) / speed) * (type.getBoolProperty(CraftType.GEAR_SHIFTS_AFFECT_TICK_COOLDOWN) ? currentGear : 1); //In theory, the chest penalty is not needed for a DynamicLag craft. } /** * gets the speed of a craft in blocks per second. + * * @return the speed of the craft */ @Override public double getSpeed() { - if(cruiseDirection == CruiseDirection.UP || cruiseDirection == CruiseDirection.DOWN) { + if (cruiseDirection == CruiseDirection.UP || cruiseDirection == CruiseDirection.DOWN) { return 20 * ((int) type.getPerWorldProperty(CraftType.PER_WORLD_VERT_CRUISE_SKIP_BLOCKS, w) + 1) / (double) getTickCooldown(); } else { @@ -455,7 +473,7 @@ public void setLastRotateTime(long lastRotateTime) { } @Override - public int getWaterLine(){ + public int getWaterLine() { //TODO: Remove this temporary system in favor of passthrough blocks // Find the waterline from the surrounding terrain or from the static level in the craft type int waterLine = 0; @@ -509,7 +527,7 @@ public int getWaterLine(){ } @Override - public @NotNull Map<Location, BlockData> getPhaseBlocks(){ + public @NotNull Map<Location, BlockData> getPhaseBlocks() { return phaseBlocks; } @@ -563,12 +581,12 @@ public void setCurrentGear(int currentGear) { @Override @NotNull - public Audience getAudience(){ + public Audience getAudience() { return audience; } @Override - public void setAudience(@NotNull Audience audience){ + public void setAudience(@NotNull Audience audience) { this.audience = audience; } }