From a736e59262ac1d48580bd80f5a9199326cc91513 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Fri, 30 Sep 2022 17:51:02 -0400 Subject: [PATCH] Fixes + improve standingon -Blocks standing on is now a list -Fixed a stuck issue when clipping into walls --- .../net/nuggetmc/tplus/api/Terminator.java | 3 +- .../api/agent/legacyagent/LegacyAgent.java | 80 +++++++++++++++++-- .../tplus/api/event/BotFallDamageEvent.java | 12 ++- .../nuggetmc/tplus/api/utils/BotUtils.java | 11 ++- .../main/java/net/nuggetmc/tplus/bot/Bot.java | 33 ++++++-- 5 files changed, 122 insertions(+), 17 deletions(-) diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/Terminator.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/Terminator.java index 073e6d9..328a4ad 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/Terminator.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/Terminator.java @@ -12,6 +12,7 @@ import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; +import java.util.List; import java.util.UUID; public interface Terminator { @@ -52,7 +53,7 @@ public interface Terminator { boolean isBotOnGround(); - Block getStandingOn(); + List getStandingOn(); void setBotPitch(float pitch); diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyAgent.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyAgent.java index dc8fd59..6383faf 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyAgent.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyAgent.java @@ -11,6 +11,7 @@ import net.nuggetmc.tplus.api.event.BotDamageByPlayerEvent; import net.nuggetmc.tplus.api.event.BotDeathEvent; import net.nuggetmc.tplus.api.event.BotFallDamageEvent; import net.nuggetmc.tplus.api.event.TerminatorLocateTargetEvent; +import net.nuggetmc.tplus.api.utils.BotUtils; import net.nuggetmc.tplus.api.utils.MathUtils; import net.nuggetmc.tplus.api.utils.PlayerUtils; import org.bukkit.*; @@ -444,6 +445,71 @@ public class LegacyAgent extends Agent { BlockFace dir = player.getFacing(); LegacyLevel level = null; Block get = null; + + BoundingBox box = player.getBoundingBox(); + double[] xVals = new double[]{ + box.getMinX(), + box.getMaxX() - 0.01 + }; + + double[] zVals = new double[]{ + box.getMinZ(), + box.getMaxZ() - 0.01 + }; + List locStanding = new ArrayList<>(); + for (double x : xVals) { + for (double z : zVals) { + Location loc = new Location(player.getWorld(), Math.floor(x), npc.getLocation().getBlockY(), Math.floor(z)); + if (!locStanding.contains(loc)) + locStanding.add(loc); + } + } + Collections.sort(locStanding, (a, b) -> + Double.compare(BotUtils.getHorizSqDist(a, player.getLocation()), BotUtils.getHorizSqDist(b, player.getLocation()))); + + //Break potential obstructing walls + for (Location loc : locStanding) { + boolean up = false; + get = loc.getBlock(); + if (!LegacyMats.FENCE.contains(get.getType())) { + up = true; + get = loc.add(0, 1, 0).getBlock(); + if (!LegacyMats.FENCE.contains(get.getType())) { + get = null; + } + } + + if (get != null) { + int distanceX = get.getLocation().getBlockX() - player.getLocation().getBlockX(); + int distanceZ = get.getLocation().getBlockZ() - player.getLocation().getBlockZ(); + if (distanceX == 1 && distanceZ == 0) { + if (dir == BlockFace.NORTH || dir == BlockFace.SOUTH) { + npc.faceLocation(get.getLocation()); + level = up ? LegacyLevel.EAST : LegacyLevel.EAST_D; + } + } else if (distanceX == -1 && distanceZ == 0) { + if (dir == BlockFace.NORTH || dir == BlockFace.SOUTH) { + npc.faceLocation(get.getLocation()); + level = up ? LegacyLevel.WEST : LegacyLevel.WEST_D; + } + } else if (distanceX == 0 && distanceZ == 1) { + if (dir == BlockFace.EAST || dir == BlockFace.WEST) { + npc.faceLocation(get.getLocation()); + level = up ? LegacyLevel.SOUTH : LegacyLevel.SOUTH_D; + } + } else if (distanceX == 0 && distanceZ == -1) { + if (dir == BlockFace.EAST || dir == BlockFace.WEST) { + npc.faceLocation(get.getLocation()); + level = up ? LegacyLevel.NORTH : LegacyLevel.NORTH_D; + } + } + + if (level != null) { + preBreak(npc, player, get, level); + return level; + } + } + } switch (dir) { case NORTH: @@ -457,7 +523,7 @@ public class LegacyAgent extends Agent { get = get.getLocation().add(0, -2, 0).getBlock(); level = LegacyLevel.NORTH_D_2; } else { - Block standing = npc.getStandingOn(); + Block standing = npc.getStandingOn().isEmpty() ? null : npc.getStandingOn().get(0); if(standing == null) break; boolean obstructed = standing.getLocation().getBlockY() == player.getLocation().getBlockY() @@ -500,7 +566,7 @@ public class LegacyAgent extends Agent { get = get.getLocation().add(0, -2, 0).getBlock(); level = LegacyLevel.SOUTH_D_2; } else { - Block standing = npc.getStandingOn(); + Block standing = npc.getStandingOn().isEmpty() ? null : npc.getStandingOn().get(0); if(standing == null) break; boolean obstructed = standing.getLocation().getBlockY() == player.getLocation().getBlockY() @@ -543,7 +609,7 @@ public class LegacyAgent extends Agent { get = get.getLocation().add(0, -2, 0).getBlock(); level = LegacyLevel.EAST_D_2; } else { - Block standing = npc.getStandingOn(); + Block standing = npc.getStandingOn().isEmpty() ? null : npc.getStandingOn().get(0); if(standing == null) break; boolean obstructed = standing.getLocation().getBlockY() == player.getLocation().getBlockY() @@ -586,7 +652,7 @@ public class LegacyAgent extends Agent { get = get.getLocation().add(0, -2, 0).getBlock(); level = LegacyLevel.WEST_D_2; } else { - Block standing = npc.getStandingOn(); + Block standing = npc.getStandingOn().isEmpty() ? null : npc.getStandingOn().get(0); if(standing == null) break; boolean obstructed = standing.getLocation().getBlockY() == player.getLocation().getBlockY() @@ -782,7 +848,7 @@ public class LegacyAgent extends Agent { return false; if (c && npc.getLocation().getBlockY() > loc.getBlockY() + 1) { - Block block = npc.getStandingOn(); + Block block = npc.getStandingOn().isEmpty() ? null : npc.getStandingOn().get(0); if (block == null) return false; npc.look(BlockFace.DOWN); @@ -798,7 +864,7 @@ public class LegacyAgent extends Agent { b.setY(0); if (npc.getLocation().getBlockY() > loc.getBlockY() + 10 && a.distance(b) < 10) { - Block block = npc.getStandingOn(); + Block block = npc.getStandingOn().isEmpty() ? null : npc.getStandingOn().get(0); if (block == null) return false; npc.look(BlockFace.DOWN); @@ -938,7 +1004,7 @@ public class LegacyAgent extends Agent { cur = player.getLocation().add(0, 2, 0).getBlock(); break; case BELOW: - cur = bot.getStandingOn(); + cur = bot.getStandingOn().isEmpty() ? null : bot.getStandingOn().get(0); break; case NORTH_U: cur = player.getLocation().add(0, 2, -1).getBlock(); diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/event/BotFallDamageEvent.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/event/BotFallDamageEvent.java index d46f7d3..a294fdf 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/event/BotFallDamageEvent.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/event/BotFallDamageEvent.java @@ -1,20 +1,30 @@ package net.nuggetmc.tplus.api.event; +import java.util.List; + +import org.bukkit.block.Block; + import net.nuggetmc.tplus.api.Terminator; public class BotFallDamageEvent { private final Terminator bot; + private final List standingOn; private boolean cancelled; - public BotFallDamageEvent(Terminator bot) { + public BotFallDamageEvent(Terminator bot, List standingOn) { this.bot = bot; + this.standingOn = standingOn; } public Terminator getBot() { return bot; } + + public List getStandingOn() { + return standingOn; + } public boolean isCancelled() { return cancelled; diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/utils/BotUtils.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/utils/BotUtils.java index ee4a9e4..f5c9c45 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/utils/BotUtils.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/utils/BotUtils.java @@ -1,7 +1,10 @@ package net.nuggetmc.tplus.api.utils; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.util.BoundingBox; +import org.bukkit.util.NumberConversions; + import java.util.Arrays; import java.util.HashSet; import java.util.Set; @@ -13,7 +16,9 @@ public class BotUtils { Material.WATER, Material.LAVA, Material.TWISTING_VINES, - Material.VINE + Material.VINE, + Material.LADDER, + Material.COBWEB )); public static UUID randomSteveUUID() { @@ -29,4 +34,8 @@ public class BotUtils { public static boolean solidAt(BoundingBox playerBox, BoundingBox blockBox) { return playerBox.overlaps(blockBox); } + + public static double getHorizSqDist(Location blockLoc, Location pLoc) { + return NumberConversions.square(blockLoc.getX() + 0.5 - pLoc.getX()) + NumberConversions.square(blockLoc.getZ() + 0.5 - pLoc.getZ()); + } } diff --git a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/Bot.java b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/Bot.java index 51fe57a..60b0301 100644 --- a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/Bot.java +++ b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/Bot.java @@ -51,6 +51,7 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.Objects; import java.util.UUID; @@ -74,6 +75,7 @@ public class Bot extends ServerPlayer implements Terminator { private byte groundTicks; private byte jumpTicks; private byte noFallTicks; + private List standingOn = new ArrayList<>(); private boolean ignoredByMobs = true; private UUID targetPlayer = null; private Bot(MinecraftServer minecraftServer, ServerLevel worldServer, GameProfile profile) { @@ -392,7 +394,7 @@ public class Bot extends ServerPlayer implements Terminator { private void fallDamageCheck() { // TODO create a better bot event system in the future, also have bot.getAgent() if (groundTicks != 0 && noFallTicks == 0 && !(oldVelocity.getY() >= -0.8) && !BotUtils.NO_FALL.contains(getLocation().getBlock().getType())) { - BotFallDamageEvent event = new BotFallDamageEvent(this); + BotFallDamageEvent event = new BotFallDamageEvent(this, new ArrayList<>(getStandingOn())); plugin.getManager().getAgent().onFallDamage(event); @@ -526,11 +528,10 @@ public class Bot extends ServerPlayer implements Terminator { return false; } - return getStandingOn() != null; + return checkStandingOn(); } - @Override - public Block getStandingOn() { + public boolean checkStandingOn() { World world = getBukkitEntity().getWorld(); AABB box = getBoundingBox(); @@ -545,6 +546,8 @@ public class Bot extends ServerPlayer implements Terminator { }; BoundingBox playerBox = new BoundingBox(box.minX, position().y - 0.01, box.minZ, box.maxX, position().y + getBbHeight(), box.maxZ); + List standingOn = new ArrayList<>(); + List locations = new ArrayList<>(); for (double x : xVals) { for (double z : zVals) { @@ -552,7 +555,10 @@ public class Bot extends ServerPlayer implements Terminator { Block block = world.getBlockAt(loc); if ((block.getType().isSolid() || canStandOn(block.getType())) && BotUtils.solidAt(playerBox, block.getBoundingBox())) { - return block; + if (!locations.contains(block.getLocation())) { + standingOn.add(block); + locations.add(block.getLocation()); + } } } } @@ -568,12 +574,25 @@ public class Bot extends ServerPlayer implements Terminator { if ((LegacyMats.FENCE.contains(block.getType()) || LegacyMats.GATES.contains(block.getType())) && block.getType().isSolid() && BotUtils.solidAt(playerBox, modifiedBox)) { - return block; + if (!locations.contains(block.getLocation())) { + standingOn.add(block); + locations.add(block.getLocation()); + } } } } - return null; + //Closest block comes first + Collections.sort(standingOn, (a, b) -> + Double.compare(BotUtils.getHorizSqDist(a.getLocation(), getLocation()), BotUtils.getHorizSqDist(b.getLocation(), getLocation()))); + + this.standingOn = standingOn; + return !standingOn.isEmpty(); + } + + @Override + public List getStandingOn() { + return standingOn; } /**