From 4e4cab3ecc837b1127b326a8b4f8179c27dc63e0 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Sun, 25 Sep 2022 17:59:46 -0400 Subject: [PATCH 01/30] Fix bots not being removed properly --- .../src/main/java/net/nuggetmc/tplus/bot/Bot.java | 2 +- .../src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 2dcc356..cdf8d5e 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 @@ -609,7 +609,7 @@ public class Bot extends ServerPlayer implements Terminator { // this should fix the concurrentmodificationexception mentioned above, I used the ConcurrentHashMap.newKeySet to make a "ConcurrentHashSet" plugin.getManager().remove(this); - scheduler.runTaskLater(plugin, this::setDead, 30); + scheduler.runTaskLater(plugin, this::removeBot, 30); this.removeTab(); } diff --git a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java index 51925f9..a0f93a8 100644 --- a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java +++ b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java @@ -164,7 +164,7 @@ public class BotManagerImpl implements BotManager, Listener { @Override public void reset() { if (!bots.isEmpty()) { - bots.forEach(Terminator::removeVisually); + bots.forEach(Terminator::removeBot); bots.clear(); // Not always necessary, but a good security measure } From 1d5a796b8cb1faebaa550a3b4dc5b24d004b984a Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Mon, 26 Sep 2022 14:43:49 -0400 Subject: [PATCH 02/30] Fix /bot reset glitching block breaks --- .../api/agent/legacyagent/LegacyAgent.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) 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 90874e9..f5a1ee2 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 @@ -23,6 +23,7 @@ import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.Vector; import java.util.*; +import java.util.Map.Entry; import java.util.regex.Pattern; // Yes, this code is very unoptimized, I know. @@ -875,7 +876,10 @@ public class LegacyAgent extends Agent { all.playSound(block.getLocation(), sound, SoundCategory.BLOCKS, (float) 0.3, 1); } - if (block.getType() == Material.BARRIER || block.getType() == Material.BEDROCK || block.getType() == Material.END_PORTAL_FRAME) + if (block.getType() == Material.BARRIER || block.getType() == Material.BEDROCK || block.getType() == Material.END_PORTAL_FRAME + || block.getType() == Material.STRUCTURE_BLOCK || block.getType() == Material.STRUCTURE_BLOCK + || block.getType() == Material.COMMAND_BLOCK || block.getType() == Material.REPEATING_COMMAND_BLOCK + || block.getType() == Material.CHAIN_COMMAND_BLOCK) return; if (instantBreakBlocks.contains(block.getType())) { // instant break blocks @@ -1227,4 +1231,17 @@ public class LegacyAgent extends Agent { private boolean validateCloserEntity(LivingEntity entity, Location loc, LivingEntity result) { return loc.getWorld() == entity.getWorld() && !entity.isDead() && (result == null || loc.distance(entity.getLocation()) < loc.distance(result.getLocation())); } + + @Override + public void stopAllTasks() { + super.stopAllTasks(); + + Iterator> itr = crackList.entrySet().iterator(); + while(itr.hasNext()) { + Block block = itr.next().getKey(); + TerminatorPlusAPI.getInternalBridge().sendBlockDestructionPacket(crackList.get(block), block.getX(), block.getY(), block.getZ(), -1); + itr.remove(); + } + mining.clear(); + } } From e90bf3a46cafebeacb017fb5ae4137fa19456e4f Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Mon, 26 Sep 2022 20:05:10 -0400 Subject: [PATCH 03/30] Fix several issues -OnGround check for half-blocks and walls/fences/gates -Improvements to LegacyMats item list --- .../api/agent/legacyagent/LegacyMats.java | 109 +++++++++++++++--- .../nuggetmc/tplus/api/utils/BotUtils.java | 26 +---- .../main/java/net/nuggetmc/tplus/bot/Bot.java | 47 +++++++- 3 files changed, 142 insertions(+), 40 deletions(-) diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java index 53b2a5e..bffc333 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java @@ -10,7 +10,6 @@ public class LegacyMats { public static final Set AIR = new HashSet<>(Arrays.asList( Material.WATER, - Material.OAK_TRAPDOOR, Material.FIRE, Material.LAVA, Material.SNOW, @@ -36,33 +35,64 @@ public class LegacyMats { Material.FIRE, Material.LAVA, Material.CAVE_AIR, + Material.VOID_AIR, + Material.AIR, Material.SOUL_FIRE )); public static final Set SHOVEL = new HashSet<>(Arrays.asList( + Material.CLAY, Material.DIRT, + Material.GRASS_BLOCK, + Material.COARSE_DIRT, + Material.PODZOL, + Material.MYCELIUM, Material.GRAVEL, + Material.MUD, + Material.MUDDY_MANGROVE_ROOTS, Material.SAND, - Material.SNOW + Material.RED_SAND, + Material.SOUL_SAND, + Material.SOUL_SOIL, + Material.SNOW, + Material.SNOW_BLOCK, + Material.BLACK_CONCRETE_POWDER, + Material.BLUE_CONCRETE_POWDER, + Material.CYAN_CONCRETE_POWDER, + Material.GRAY_CONCRETE_POWDER, + Material.GREEN_CONCRETE_POWDER, + Material.LIGHT_BLUE_CONCRETE_POWDER, + Material.LIGHT_GRAY_CONCRETE_POWDER, + Material.LIME_CONCRETE_POWDER, + Material.MAGENTA_CONCRETE_POWDER, + Material.ORANGE_CONCRETE_POWDER, + Material.PINK_CONCRETE_POWDER, + Material.PURPLE_CONCRETE_POWDER, + Material.RED_CONCRETE_POWDER, + Material.WHITE_CONCRETE_POWDER, + Material.YELLOW_CONCRETE_POWDER )); public static final Set AXE = new HashSet<>(Arrays.asList( - Material.OAK_PLANKS, Material.OAK_DOOR, Material.OAK_FENCE, Material.OAK_FENCE_GATE, Material.OAK_LOG, Material.OAK_PLANKS, + Material.OAK_PLANKS, Material.OAK_DOOR, Material.OAK_FENCE, Material.OAK_FENCE_GATE, Material.OAK_LOG, Material.OAK_SIGN, Material.OAK_SLAB, Material.OAK_STAIRS, Material.OAK_TRAPDOOR, Material.OAK_WALL_SIGN, Material.OAK_WOOD, - Material.DARK_OAK_PLANKS, Material.DARK_OAK_DOOR, Material.DARK_OAK_FENCE, Material.DARK_OAK_FENCE_GATE, Material.DARK_OAK_LOG, Material.DARK_OAK_PLANKS, + Material.DARK_OAK_PLANKS, Material.DARK_OAK_DOOR, Material.DARK_OAK_FENCE, Material.DARK_OAK_FENCE_GATE, Material.DARK_OAK_LOG, Material.DARK_OAK_SIGN, Material.DARK_OAK_SLAB, Material.DARK_OAK_STAIRS, Material.DARK_OAK_TRAPDOOR, Material.DARK_OAK_WALL_SIGN, Material.DARK_OAK_WOOD, - Material.ACACIA_PLANKS, Material.ACACIA_DOOR, Material.ACACIA_FENCE, Material.ACACIA_FENCE_GATE, Material.ACACIA_LOG, Material.ACACIA_PLANKS, + Material.ACACIA_PLANKS, Material.ACACIA_DOOR, Material.ACACIA_FENCE, Material.ACACIA_FENCE_GATE, Material.ACACIA_LOG, Material.ACACIA_SIGN, Material.ACACIA_SLAB, Material.ACACIA_STAIRS, Material.ACACIA_TRAPDOOR, Material.ACACIA_WALL_SIGN, Material.ACACIA_WOOD, - Material.BIRCH_PLANKS, Material.BIRCH_DOOR, Material.BIRCH_FENCE, Material.BIRCH_FENCE_GATE, Material.BIRCH_LOG, Material.BIRCH_PLANKS, + Material.BIRCH_PLANKS, Material.BIRCH_DOOR, Material.BIRCH_FENCE, Material.BIRCH_FENCE_GATE, Material.BIRCH_LOG, Material.BIRCH_SIGN, Material.BIRCH_SLAB, Material.BIRCH_STAIRS, Material.BIRCH_TRAPDOOR, Material.BIRCH_WALL_SIGN, Material.BIRCH_WOOD, - Material.JUNGLE_PLANKS, Material.JUNGLE_DOOR, Material.JUNGLE_FENCE, Material.JUNGLE_FENCE_GATE, Material.JUNGLE_LOG, Material.JUNGLE_PLANKS, + Material.JUNGLE_PLANKS, Material.JUNGLE_DOOR, Material.JUNGLE_FENCE, Material.JUNGLE_FENCE_GATE, Material.JUNGLE_LOG, Material.JUNGLE_SIGN, Material.JUNGLE_SLAB, Material.JUNGLE_STAIRS, Material.JUNGLE_TRAPDOOR, Material.JUNGLE_WALL_SIGN, Material.JUNGLE_WOOD, - Material.SPRUCE_PLANKS, Material.SPRUCE_DOOR, Material.SPRUCE_FENCE, Material.SPRUCE_FENCE_GATE, Material.SPRUCE_LOG, Material.SPRUCE_PLANKS, + Material.SPRUCE_PLANKS, Material.SPRUCE_DOOR, Material.SPRUCE_FENCE, Material.SPRUCE_FENCE_GATE, Material.SPRUCE_LOG, Material.SPRUCE_SIGN, Material.SPRUCE_SLAB, Material.SPRUCE_STAIRS, Material.SPRUCE_TRAPDOOR, Material.SPRUCE_WALL_SIGN, Material.SPRUCE_WOOD, - Material.CRIMSON_PLANKS, Material.CRIMSON_DOOR, Material.CRIMSON_FENCE, Material.CRIMSON_FENCE_GATE, Material.CRIMSON_PLANKS, + Material.MANGROVE_PLANKS, Material.MANGROVE_DOOR, Material.MANGROVE_FENCE, Material.MANGROVE_FENCE_GATE, Material.MANGROVE_LOG, + Material.MANGROVE_SIGN, Material.MANGROVE_SLAB, Material.MANGROVE_STAIRS, Material.MANGROVE_TRAPDOOR, Material.MANGROVE_WALL_SIGN, Material.MANGROVE_WOOD, + Material.CRIMSON_PLANKS, Material.CRIMSON_DOOR, Material.CRIMSON_FENCE, Material.CRIMSON_FENCE_GATE, Material.CRIMSON_STEM, Material.CRIMSON_SIGN, Material.CRIMSON_SLAB, Material.CRIMSON_STAIRS, Material.CRIMSON_TRAPDOOR, Material.CRIMSON_WALL_SIGN, - Material.WARPED_PLANKS, Material.WARPED_DOOR, Material.WARPED_FENCE, Material.WARPED_FENCE_GATE, Material.WARPED_PLANKS, - Material.WARPED_SIGN, Material.WARPED_SLAB, Material.WARPED_STAIRS, Material.WARPED_TRAPDOOR, Material.WARPED_WALL_SIGN + Material.WARPED_PLANKS, Material.WARPED_DOOR, Material.WARPED_FENCE, Material.WARPED_FENCE_GATE, Material.WARPED_STEM, + Material.WARPED_SIGN, Material.WARPED_SLAB, Material.WARPED_STAIRS, Material.WARPED_TRAPDOOR, Material.WARPED_WALL_SIGN, + Material.CHEST, Material.TRAPPED_CHEST )); public static final Set BREAK = new HashSet<>(Arrays.asList( @@ -145,24 +175,75 @@ public class LegacyMats { Material.NETHER_BRICK_FENCE, Material.SPRUCE_FENCE, Material.WARPED_FENCE, + Material.MANGROVE_FENCE, Material.COBBLESTONE_WALL, + Material.MOSSY_COBBLESTONE_WALL, + Material.MOSSY_STONE_BRICK_WALL, + Material.STONE_BRICK_WALL, + Material.PRISMARINE_WALL, Material.ANDESITE_WALL, Material.BLACKSTONE_WALL, + Material.POLISHED_BLACKSTONE_BRICK_WALL, + Material.POLISHED_BLACKSTONE_WALL, Material.BRICK_WALL, Material.GRANITE_WALL, Material.DIORITE_WALL, Material.SANDSTONE_WALL, Material.RED_SANDSTONE_WALL, Material.RED_NETHER_BRICK_WALL, - Material.IRON_BARS, - Material.COBWEB + Material.NETHER_BRICK_WALL, + Material.END_STONE_BRICK_WALL, + Material.POLISHED_DEEPSLATE_WALL, + Material.COBBLED_DEEPSLATE_WALL, + Material.DEEPSLATE_BRICK_WALL, + Material.DEEPSLATE_TILE_WALL, + Material.MUD_BRICK_WALL + )); + + public static final Set GATES = new HashSet<>(Arrays.asList( + Material.ACACIA_FENCE_GATE, + Material.BIRCH_FENCE_GATE, + Material.DARK_OAK_FENCE_GATE, + Material.JUNGLE_FENCE_GATE, + Material.OAK_FENCE_GATE, + Material.SPRUCE_FENCE_GATE, + Material.MANGROVE_FENCE_GATE, + Material.CRIMSON_FENCE_GATE, + Material.WARPED_FENCE_GATE + )); + + public static final Set OBSTACLES = new HashSet<>(Arrays.asList( + Material.IRON_BARS, + Material.CHAIN, + Material.END_ROD, + Material.COBWEB, + Material.FLOWER_POT, + Material.GLASS_PANE )); + public static final Set IGNORED = new HashSet<>(Arrays.asList( + Material.ACACIA_BUTTON, + Material.BIRCH_BUTTON, + Material.CRIMSON_BUTTON, + Material.DARK_OAK_BUTTON, + Material.JUNGLE_BUTTON, + Material.MANGROVE_BUTTON, + Material.OAK_BUTTON, + Material.POLISHED_BLACKSTONE_BUTTON, + Material.SPRUCE_BUTTON, + Material.STONE_BUTTON, + Material.WARPED_BUTTON, + Material.TWISTING_VINES, + Material.TWISTING_VINES_PLANT + )); + public static final Set LEAVES = new HashSet<>(Arrays.asList( Material.BIRCH_LEAVES, Material.DARK_OAK_LEAVES, Material.JUNGLE_LEAVES, Material.OAK_LEAVES, - Material.SPRUCE_LEAVES + Material.SPRUCE_LEAVES, + Material.FLOWERING_AZALEA_LEAVES, + Material.MANGROVE_LEAVES )); } 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 6349309..ee4a9e4 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,11 +1,7 @@ package net.nuggetmc.tplus.api.utils; -import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.block.Block; import org.bukkit.util.BoundingBox; -import org.bukkit.util.Vector; - import java.util.Arrays; import java.util.HashSet; import java.util.Set; @@ -29,24 +25,8 @@ public class BotUtils { return randomSteveUUID(); } - - public static boolean solidAt(Location loc) { // not perfect, still cuts corners of fences - Block block = loc.getBlock(); - BoundingBox box = block.getBoundingBox(); - Vector position = loc.toVector(); - - double x = position.getX(); - double y = position.getY(); - double z = position.getZ(); - - double minX = box.getMinX(); - double minY = box.getMinY(); - double minZ = box.getMinZ(); - - double maxX = box.getMaxX(); - double maxY = box.getMaxY(); - double maxZ = box.getMaxZ(); - - return x > minX && x < maxX && y > minY && y < maxY && z > minZ && z < maxZ; + + public static boolean solidAt(BoundingBox playerBox, BoundingBox blockBox) { + return playerBox.overlaps(blockBox); } } 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 cdf8d5e..9ddcfcb 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 @@ -2,8 +2,6 @@ package net.nuggetmc.tplus.bot; import com.mojang.authlib.GameProfile; import com.mojang.datafixers.util.Pair; -import io.netty.util.concurrent.Future; -import io.netty.util.concurrent.GenericFutureListener; import net.minecraft.network.Connection; import net.minecraft.network.PacketSendListener; import net.minecraft.network.protocol.Packet; @@ -27,6 +25,7 @@ import net.minecraft.world.phys.Vec3; import net.nuggetmc.tplus.TerminatorPlus; import net.nuggetmc.tplus.api.Terminator; import net.nuggetmc.tplus.api.agent.Agent; +import net.nuggetmc.tplus.api.agent.legacyagent.LegacyMats; import net.nuggetmc.tplus.api.agent.legacyagent.ai.NeuralNetwork; import net.nuggetmc.tplus.api.event.BotDamageByPlayerEvent; import net.nuggetmc.tplus.api.event.BotFallDamageEvent; @@ -35,6 +34,7 @@ import net.nuggetmc.tplus.api.utils.*; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.data.type.Candle; import org.bukkit.craftbukkit.v1_19_R1.CraftEquipmentSlot; import org.bukkit.craftbukkit.v1_19_R1.CraftServer; import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; @@ -45,6 +45,7 @@ import org.bukkit.entity.Damageable; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitScheduler; +import org.bukkit.util.BoundingBox; import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; @@ -537,21 +538,61 @@ public class Bot extends ServerPlayer implements Terminator { box.minZ, box.maxZ }; + BoundingBox playerBox = new BoundingBox(box.minX, position().y - 0.01, box.minZ, + box.maxX, position().y + getBbHeight(), box.maxZ); for (double x : xVals) { for (double z : zVals) { Location loc = new Location(world, x, position().y - 0.01, z); Block block = world.getBlockAt(loc); - if (block.getType().isSolid() && BotUtils.solidAt(loc)) { + if ((block.getType().isSolid() || canStandOn(block.getType())) && BotUtils.solidAt(playerBox, block.getBoundingBox())) { return true; } } } + + //Fence/wall check + for (double x : xVals) { + for (double z : zVals) { + Location loc = new Location(world, x, position().y - 0.51, z); + Block block = world.getBlockAt(loc); + BoundingBox blockBox = loc.getBlock().getBoundingBox(); + BoundingBox modifiedBox = new BoundingBox(blockBox.getMinX(), blockBox.getMinY(), blockBox.getMinZ(), blockBox.getMaxX(), + blockBox.getMinY() + 1.5, blockBox.getMaxZ()); + + if ((LegacyMats.FENCE.contains(block.getType()) || LegacyMats.GATES.contains(block.getType())) + && block.getType().isSolid() && BotUtils.solidAt(playerBox, modifiedBox)) { + return true; + } + } + } return false; } + /** + * Checks for non-solid blocks that can hold an entity up. + */ + private boolean canStandOn(Material mat) + { + if(mat == Material.END_ROD || mat == Material.FLOWER_POT || mat == Material.REPEATER || mat == Material.COMPARATOR + || mat == Material.SNOW || mat == Material.LADDER || mat == Material.VINE) + return true; + + if(mat == Material.BLACK_CARPET || mat == Material.BLUE_CARPET || mat == Material.BROWN_CARPET || mat == Material.CYAN_CARPET + || mat == Material.GRAY_CARPET || mat == Material.GREEN_CARPET || mat == Material.LIGHT_BLUE_CARPET + || mat == Material.LIGHT_GRAY_CARPET || mat == Material.LIME_CARPET || mat == Material.MAGENTA_CARPET + || mat == Material.MOSS_CARPET || mat == Material.ORANGE_CARPET || mat == Material.PINK_CARPET + || mat == Material.PURPLE_CARPET || mat == Material.RED_CARPET || mat == Material.WHITE_CARPET + || mat == Material.YELLOW_CARPET) + return true; + + if(mat.data == Candle.class) + return true; + return false; + } + @Override public boolean isBotOnGround() { return groundTicks != 0; From de17a892353c9a4196c61ae64aec2cb5172d31f4 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Thu, 29 Sep 2022 12:11:57 -0400 Subject: [PATCH 04/30] More fixes -Add lots of materials to LegacyMats -Improved ground checking for non-solid blocks -Fixed tons of edge cases involving climbing over/going into walls --- .../net/nuggetmc/tplus/api/Terminator.java | 3 + .../api/agent/legacyagent/LegacyAgent.java | 228 +++++++++++++++--- .../api/agent/legacyagent/LegacyLevel.java | 26 +- .../api/agent/legacyagent/LegacyMats.java | 220 ++++++++++------- .../main/java/net/nuggetmc/tplus/bot/Bot.java | 29 ++- 5 files changed, 361 insertions(+), 145 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 9d368d2..073e6d9 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 @@ -4,6 +4,7 @@ import com.mojang.authlib.GameProfile; import net.nuggetmc.tplus.api.agent.legacyagent.ai.NeuralNetwork; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; @@ -50,6 +51,8 @@ public interface Terminator { boolean isBotInWater(); boolean isBotOnGround(); + + Block 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 f5a1ee2..dc8fd59 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 @@ -16,6 +16,7 @@ import net.nuggetmc.tplus.api.utils.PlayerUtils; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.data.type.*; import org.bukkit.entity.*; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; @@ -44,23 +45,6 @@ public class LegacyAgent extends Agent { private final Map mining = new HashMap<>(); private final Set fallDamageCooldown = new HashSet<>(); public boolean offsets = true; - private List instantBreakBlocks = Arrays.asList( - Material.TALL_GRASS, - Material.GRASS, - Material.KELP_PLANT, - Material.WHEAT, - Material.POTATOES, - Material.CARROT, - Material.BEETROOT, - Material.SUGAR_CANE, - Material.SWEET_BERRY_BUSH, - Material.LILY_PAD, - Material.DANDELION, - Material.POPPY, - Material.ROSE_BUSH, - Material.PUMPKIN_STEM, - Material.MELON_STEM - ); private EnumTargetGoal goal; public LegacyAgent(BotManager manager, Plugin plugin) { @@ -181,7 +165,9 @@ public class LegacyAgent extends Agent { if (checkAt(bot, block, botPlayer)) return; - if (checkFence(bot, loc.getBlock(), botPlayer)) return; + if (checkFenceAndGates(bot, loc.getBlock(), botPlayer)) return; + + if (checkObstacles(bot, loc.getBlock(), botPlayer)) return; if (checkDown(bot, botPlayer, livingTarget.getLocation(), bothXZ)) return; @@ -443,7 +429,7 @@ public class LegacyAgent extends Agent { if (level == null) { resetHand(npc, target, playerNPC); return 1; - } else if (level.isSide()) { + } else if (level.isSide() || level == LegacyLevel.BELOW) { return 0; } else { return 2; @@ -467,6 +453,40 @@ public class LegacyAgent extends Agent { } else if (checkSideBreak(get.getLocation().add(0, -1, 0).getBlock().getType())) { get = get.getLocation().add(0, -1, 0).getBlock(); level = LegacyLevel.NORTH_D; + } else if (LegacyMats.FENCE.contains(get.getLocation().add(0, -2, 0).getBlock().getType())) { + get = get.getLocation().add(0, -2, 0).getBlock(); + level = LegacyLevel.NORTH_D_2; + } else { + Block standing = npc.getStandingOn(); + if(standing == null) + break; + boolean obstructed = standing.getLocation().getBlockY() == player.getLocation().getBlockY() + || (standing.getLocation().getBlockY() + 1 == player.getLocation().getBlockY() + && (LegacyMats.FENCE.contains(standing.getType()) || LegacyMats.GATES.contains(standing.getType()))); + if(obstructed) { + Block belowStanding = standing.getLocation().add(0, -1, 0).getBlock(); + if(!LegacyMats.BREAK.contains(belowStanding.getType()) && !LegacyMats.NONSOLID.contains(belowStanding.getType())) { + //Break standing block + get = standing; + level = LegacyLevel.BELOW; + + noJump.add(player); + scheduler.runTaskLater(plugin, () -> { + noJump.remove(player); + }, 15); + } else { + //Break above + Block above = npc.getLocation().add(0, 2, 0).getBlock(); + Block aboveSide = get.getLocation().add(0, 1, 0).getBlock(); + if(!LegacyMats.BREAK.contains(above.getType())) { + get = above; + level = LegacyLevel.ABOVE; + } else if(!LegacyMats.BREAK.contains(aboveSide.getType())) { + get = aboveSide; + level = LegacyLevel.NORTH_U; + } + } + } } break; case SOUTH: @@ -476,6 +496,40 @@ public class LegacyAgent extends Agent { } else if (checkSideBreak(get.getLocation().add(0, -1, 0).getBlock().getType())) { get = get.getLocation().add(0, -1, 0).getBlock(); level = LegacyLevel.SOUTH_D; + } else if (LegacyMats.FENCE.contains(get.getLocation().add(0, -2, 0).getBlock().getType())) { + get = get.getLocation().add(0, -2, 0).getBlock(); + level = LegacyLevel.SOUTH_D_2; + } else { + Block standing = npc.getStandingOn(); + if(standing == null) + break; + boolean obstructed = standing.getLocation().getBlockY() == player.getLocation().getBlockY() + || (standing.getLocation().getBlockY() + 1 == player.getLocation().getBlockY() + && (LegacyMats.FENCE.contains(standing.getType()) || LegacyMats.GATES.contains(standing.getType()))); + if(obstructed) { + Block belowStanding = standing.getLocation().add(0, -1, 0).getBlock(); + if(!LegacyMats.BREAK.contains(belowStanding.getType()) && !LegacyMats.NONSOLID.contains(belowStanding.getType())) { + //Break standing block + get = standing; + level = LegacyLevel.BELOW; + + noJump.add(player); + scheduler.runTaskLater(plugin, () -> { + noJump.remove(player); + }, 15); + } else { + //Break above + Block above = npc.getLocation().add(0, 2, 0).getBlock(); + Block aboveSide = get.getLocation().add(0, 1, 0).getBlock(); + if(!LegacyMats.BREAK.contains(above.getType())) { + get = above; + level = LegacyLevel.ABOVE; + } else if(!LegacyMats.BREAK.contains(aboveSide.getType())) { + get = aboveSide; + level = LegacyLevel.SOUTH_U; + } + } + } } break; case EAST: @@ -485,6 +539,40 @@ public class LegacyAgent extends Agent { } else if (checkSideBreak(get.getLocation().add(0, -1, 0).getBlock().getType())) { get = get.getLocation().add(0, -1, 0).getBlock(); level = LegacyLevel.EAST_D; + } else if (LegacyMats.FENCE.contains(get.getLocation().add(0, -2, 0).getBlock().getType())) { + get = get.getLocation().add(0, -2, 0).getBlock(); + level = LegacyLevel.EAST_D_2; + } else { + Block standing = npc.getStandingOn(); + if(standing == null) + break; + boolean obstructed = standing.getLocation().getBlockY() == player.getLocation().getBlockY() + || (standing.getLocation().getBlockY() + 1 == player.getLocation().getBlockY() + && (LegacyMats.FENCE.contains(standing.getType()) || LegacyMats.GATES.contains(standing.getType()))); + if(obstructed) { + Block belowStanding = standing.getLocation().add(0, -1, 0).getBlock(); + if(!LegacyMats.BREAK.contains(belowStanding.getType()) && !LegacyMats.NONSOLID.contains(belowStanding.getType())) { + //Break standing block + get = standing; + level = LegacyLevel.BELOW; + + noJump.add(player); + scheduler.runTaskLater(plugin, () -> { + noJump.remove(player); + }, 15); + } else { + //Break above + Block above = npc.getLocation().add(0, 2, 0).getBlock(); + Block aboveSide = get.getLocation().add(0, 1, 0).getBlock(); + if(!LegacyMats.BREAK.contains(above.getType())) { + get = above; + level = LegacyLevel.ABOVE; + } else if(!LegacyMats.BREAK.contains(aboveSide.getType())) { + get = aboveSide; + level = LegacyLevel.EAST_U; + } + } + } } break; case WEST: @@ -494,15 +582,51 @@ public class LegacyAgent extends Agent { } else if (checkSideBreak(get.getLocation().add(0, -1, 0).getBlock().getType())) { get = get.getLocation().add(0, -1, 0).getBlock(); level = LegacyLevel.WEST_D; + } else if (LegacyMats.FENCE.contains(get.getLocation().add(0, -2, 0).getBlock().getType())) { + get = get.getLocation().add(0, -2, 0).getBlock(); + level = LegacyLevel.WEST_D_2; + } else { + Block standing = npc.getStandingOn(); + if(standing == null) + break; + boolean obstructed = standing.getLocation().getBlockY() == player.getLocation().getBlockY() + || (standing.getLocation().getBlockY() + 1 == player.getLocation().getBlockY() + && (LegacyMats.FENCE.contains(standing.getType()) || LegacyMats.GATES.contains(standing.getType()))); + if(obstructed) { + Block belowStanding = standing.getLocation().add(0, -1, 0).getBlock(); + if(!LegacyMats.BREAK.contains(belowStanding.getType()) && !LegacyMats.NONSOLID.contains(belowStanding.getType())) { + //Break standing block + get = standing; + level = LegacyLevel.BELOW; + + noJump.add(player); + scheduler.runTaskLater(plugin, () -> { + noJump.remove(player); + }, 15); + } else { + //Break above + Block above = npc.getLocation().add(0, 2, 0).getBlock(); + Block aboveSide = get.getLocation().add(0, 1, 0).getBlock(); + if(!LegacyMats.BREAK.contains(above.getType())) { + get = above; + level = LegacyLevel.ABOVE; + } else if(!LegacyMats.BREAK.contains(aboveSide.getType())) { + get = aboveSide; + level = LegacyLevel.WEST_U; + } + } + } } break; default: break; } - if (level == LegacyLevel.EAST_D || level == LegacyLevel.WEST_D || level == LegacyLevel.NORTH_D || level == LegacyLevel.SOUTH_D) { + if (level == LegacyLevel.EAST_D || level == LegacyLevel.WEST_D || level == LegacyLevel.NORTH_D || level == LegacyLevel.SOUTH_D + || level == LegacyLevel.EAST_D_2 || level == LegacyLevel.WEST_D_2 || level == LegacyLevel.NORTH_D_2 || level == LegacyLevel.SOUTH_D_2) { if (LegacyMats.AIR.contains(player.getLocation().add(0, 2, 0).getBlock().getType()) - && LegacyMats.AIR.contains(get.getLocation().add(0, 2, 0).getBlock().getType())) { + && LegacyMats.AIR.contains(get.getLocation().add(0, 2, 0).getBlock().getType()) + && !LegacyMats.FENCE.contains(get.getType()) && !LegacyMats.GATES.contains(get.getType())) { return null; } } @@ -658,7 +782,9 @@ public class LegacyAgent extends Agent { return false; if (c && npc.getLocation().getBlockY() > loc.getBlockY() + 1) { - Block block = npc.getLocation().add(0, -1, 0).getBlock(); + Block block = npc.getStandingOn(); + if (block == null) + return false; npc.look(BlockFace.DOWN); downMine(npc, player, block); @@ -672,7 +798,9 @@ public class LegacyAgent extends Agent { b.setY(0); if (npc.getLocation().getBlockY() > loc.getBlockY() + 10 && a.distance(b) < 10) { - Block block = npc.getLocation().add(0, -1, 0).getBlock(); + Block block = npc.getStandingOn(); + if (block == null) + return false; npc.look(BlockFace.DOWN); downMine(npc, player, block); @@ -720,8 +848,17 @@ public class LegacyAgent extends Agent { } } - private boolean checkFence(Terminator bot, Block block, LivingEntity player) { - if (LegacyMats.FENCE.contains(block.getType())) { + private boolean checkFenceAndGates(Terminator bot, Block block, LivingEntity player) { + if (LegacyMats.FENCE.contains(block.getType()) || LegacyMats.GATES.contains(block.getType())) { + preBreak(bot, player, block, LegacyLevel.AT_D); + return true; + } + + return false; + } + + private boolean checkObstacles(Terminator bot, Block block, LivingEntity player) { + if (LegacyMats.OBSTACLES.contains(block.getType())) { preBreak(bot, player, block, LegacyLevel.AT_D); return true; } @@ -752,13 +889,16 @@ public class LegacyAgent extends Agent { bot.setItem(new ItemStack(item)); - if (level == LegacyLevel.EAST_D || level == LegacyLevel.NORTH_D || level == LegacyLevel.SOUTH_D || level == LegacyLevel.WEST_D) { + if (level == LegacyLevel.EAST_D || level == LegacyLevel.NORTH_D || level == LegacyLevel.SOUTH_D || level == LegacyLevel.WEST_D + || level == LegacyLevel.EAST_D_2 || level == LegacyLevel.NORTH_D_2 || level == LegacyLevel.SOUTH_D_2 || level == LegacyLevel.WEST_D_2) { bot.setBotPitch(69); scheduler.runTaskLater(plugin, () -> { btCheck.put(player, true); }, 5); - } else if (level == LegacyLevel.AT_D || level == LegacyLevel.AT) { + } else if (level == LegacyLevel.EAST_U || level == LegacyLevel.NORTH_U || level == LegacyLevel.SOUTH_U || level == LegacyLevel.WEST_U) { + bot.setBotPitch(-53); + }else if (level == LegacyLevel.AT_D || level == LegacyLevel.AT) { Location blockLoc = block.getLocation().add(0.5, -1, 0.5); bot.faceLocation(blockLoc); } @@ -778,10 +918,10 @@ public class LegacyAgent extends Agent { miningAnim.put(player, task); } - blockBreakEffect(player, block, level); + blockBreakEffect(bot, player, block, level); } - private void blockBreakEffect(LivingEntity player, Block block, LegacyLevel level) { + private void blockBreakEffect(Terminator bot, LivingEntity player, Block block, LegacyLevel level) { if (LegacyMats.NO_CRACK.contains(block.getType())) return; @@ -798,7 +938,19 @@ public class LegacyAgent extends Agent { cur = player.getLocation().add(0, 2, 0).getBlock(); break; case BELOW: - cur = player.getLocation().add(0, -1, 0).getBlock(); + cur = bot.getStandingOn(); + break; + case NORTH_U: + cur = player.getLocation().add(0, 2, -1).getBlock(); + break; + case SOUTH_U: + cur = player.getLocation().add(0, 2, 1).getBlock(); + break; + case EAST_U: + cur = player.getLocation().add(1, 2, 0).getBlock(); + break; + case WEST_U: + cur = player.getLocation().add(-1, 2, 0).getBlock(); break; case NORTH: cur = player.getLocation().add(0, 1, -1).getBlock(); @@ -824,6 +976,18 @@ public class LegacyAgent extends Agent { case WEST_D: cur = player.getLocation().add(-1, 0, 0).getBlock(); break; + case NORTH_D_2: + cur = player.getLocation().add(0, -1, -1).getBlock(); + break; + case SOUTH_D_2: + cur = player.getLocation().add(0, -1, 1).getBlock(); + break; + case EAST_D_2: + cur = player.getLocation().add(1, -1, 0).getBlock(); + break; + case WEST_D_2: + cur = player.getLocation().add(-1, -1, 0).getBlock(); + break; case AT_D: cur = player.getLocation().getBlock(); break; @@ -833,7 +997,7 @@ public class LegacyAgent extends Agent { // wow this repeated code is so bad lmao - if (player.isDead() || (!block.equals(cur) || block.getType() != cur.getType())) { + if (player.isDead() || cur == null || (!block.equals(cur) || block.getType() != cur.getType())) { this.cancel(); TerminatorPlusAPI.getInternalBridge().sendBlockDestructionPacket(crackList.get(block), block.getX(), block.getY(), block.getZ(), -1); @@ -882,7 +1046,7 @@ public class LegacyAgent extends Agent { || block.getType() == Material.CHAIN_COMMAND_BLOCK) return; - if (instantBreakBlocks.contains(block.getType())) { // instant break blocks + if (LegacyMats.INSTANT_BREAK.contains(block.getType())) { // instant break blocks block.breakNaturally(); return; } diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyLevel.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyLevel.java index b4f622e..218dd63 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyLevel.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyLevel.java @@ -9,6 +9,10 @@ public enum LegacyLevel { BELOW, AT, AT_D, + NORTH_U, + SOUTH_U, + EAST_U, + WEST_U, NORTH, SOUTH, EAST, @@ -16,20 +20,20 @@ public enum LegacyLevel { NORTH_D, SOUTH_D, EAST_D, - WEST_D; + WEST_D, + NORTH_D_2, + SOUTH_D_2, + EAST_D_2, + WEST_D_2; - private static final Set SIDE = new HashSet<>(Arrays.asList( - NORTH, - SOUTH, - EAST, - WEST, - NORTH_D, - SOUTH_D, - EAST_D, - WEST_D + private static final Set NON_SIDE = new HashSet<>(Arrays.asList( + ABOVE, + BELOW, + AT, + AT_D )); public boolean isSide() { - return SIDE.contains(this); + return !NON_SIDE.contains(this); } } diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java index bffc333..51f2707 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java @@ -1,10 +1,17 @@ package net.nuggetmc.tplus.api.agent.legacyagent; import org.bukkit.Material; +import org.bukkit.block.data.type.*; +import com.google.common.collect.Lists; + +import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; +import java.util.List; import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Stream; public class LegacyMats { @@ -40,7 +47,7 @@ public class LegacyMats { Material.SOUL_FIRE )); - public static final Set SHOVEL = new HashSet<>(Arrays.asList( + public static final Set SHOVEL = new HashSet<>(concatTypes(Lists.newArrayList( Material.CLAY, Material.DIRT, Material.GRASS_BLOCK, @@ -55,23 +62,8 @@ public class LegacyMats { Material.SOUL_SAND, Material.SOUL_SOIL, Material.SNOW, - Material.SNOW_BLOCK, - Material.BLACK_CONCRETE_POWDER, - Material.BLUE_CONCRETE_POWDER, - Material.CYAN_CONCRETE_POWDER, - Material.GRAY_CONCRETE_POWDER, - Material.GREEN_CONCRETE_POWDER, - Material.LIGHT_BLUE_CONCRETE_POWDER, - Material.LIGHT_GRAY_CONCRETE_POWDER, - Material.LIME_CONCRETE_POWDER, - Material.MAGENTA_CONCRETE_POWDER, - Material.ORANGE_CONCRETE_POWDER, - Material.PINK_CONCRETE_POWDER, - Material.PURPLE_CONCRETE_POWDER, - Material.RED_CONCRETE_POWDER, - Material.WHITE_CONCRETE_POWDER, - Material.YELLOW_CONCRETE_POWDER - )); + Material.SNOW_BLOCK + ), Arrays.asList(), Arrays.asList(), m -> m.name().endsWith("_CONCRETE_POWDER"))); public static final Set AXE = new HashSet<>(Arrays.asList( Material.OAK_PLANKS, Material.OAK_DOOR, Material.OAK_FENCE, Material.OAK_FENCE_GATE, Material.OAK_LOG, @@ -101,13 +93,13 @@ public class LegacyMats { Material.LAVA, Material.TALL_GRASS, Material.SNOW, - Material.DIRT_PATH, Material.CAVE_AIR, Material.VINE, Material.FERN, Material.LARGE_FERN, Material.SUGAR_CANE, Material.TWISTING_VINES, + Material.TWISTING_VINES_PLANT, Material.WEEPING_VINES, Material.SEAGRASS, Material.TALL_SEAGRASS, @@ -165,85 +157,133 @@ public class LegacyMats { Material.WATER )); - public static final Set FENCE = new HashSet<>(Arrays.asList( - Material.OAK_FENCE, - Material.ACACIA_FENCE, - Material.BIRCH_FENCE, - Material.CRIMSON_FENCE, - Material.DARK_OAK_FENCE, - Material.JUNGLE_FENCE, - Material.NETHER_BRICK_FENCE, - Material.SPRUCE_FENCE, - Material.WARPED_FENCE, - Material.MANGROVE_FENCE, - Material.COBBLESTONE_WALL, - Material.MOSSY_COBBLESTONE_WALL, - Material.MOSSY_STONE_BRICK_WALL, - Material.STONE_BRICK_WALL, - Material.PRISMARINE_WALL, - Material.ANDESITE_WALL, - Material.BLACKSTONE_WALL, - Material.POLISHED_BLACKSTONE_BRICK_WALL, - Material.POLISHED_BLACKSTONE_WALL, - Material.BRICK_WALL, - Material.GRANITE_WALL, - Material.DIORITE_WALL, - Material.SANDSTONE_WALL, - Material.RED_SANDSTONE_WALL, - Material.RED_NETHER_BRICK_WALL, - Material.NETHER_BRICK_WALL, - Material.END_STONE_BRICK_WALL, - Material.POLISHED_DEEPSLATE_WALL, - Material.COBBLED_DEEPSLATE_WALL, - Material.DEEPSLATE_BRICK_WALL, - Material.DEEPSLATE_TILE_WALL, - Material.MUD_BRICK_WALL - )); + public static final Set FENCE = new HashSet<>(concatTypes(new ArrayList<>(), + Arrays.asList(Material.GLASS_PANE, Material.IRON_BARS), Arrays.asList(Fence.class, Wall.class))); - public static final Set GATES = new HashSet<>(Arrays.asList( - Material.ACACIA_FENCE_GATE, - Material.BIRCH_FENCE_GATE, - Material.DARK_OAK_FENCE_GATE, - Material.JUNGLE_FENCE_GATE, - Material.OAK_FENCE_GATE, - Material.SPRUCE_FENCE_GATE, - Material.MANGROVE_FENCE_GATE, - Material.CRIMSON_FENCE_GATE, - Material.WARPED_FENCE_GATE - )); + public static final Set GATES = new HashSet<>(concatTypes(Gate.class)); - public static final Set OBSTACLES = new HashSet<>(Arrays.asList( + public static final Set OBSTACLES = new HashSet<>(concatTypes(Lists.newArrayList( Material.IRON_BARS, Material.CHAIN, Material.END_ROD, + Material.LIGHTNING_ROD, Material.COBWEB, + Material.SWEET_BERRY_BUSH, Material.FLOWER_POT, Material.GLASS_PANE - )); + ), Arrays.asList(), Arrays.asList(GlassPane.class), m -> m.name().startsWith("POTTED_"))); - public static final Set IGNORED = new HashSet<>(Arrays.asList( - Material.ACACIA_BUTTON, - Material.BIRCH_BUTTON, - Material.CRIMSON_BUTTON, - Material.DARK_OAK_BUTTON, - Material.JUNGLE_BUTTON, - Material.MANGROVE_BUTTON, - Material.OAK_BUTTON, - Material.POLISHED_BLACKSTONE_BUTTON, - Material.SPRUCE_BUTTON, - Material.STONE_BUTTON, - Material.WARPED_BUTTON, - Material.TWISTING_VINES, - Material.TWISTING_VINES_PLANT - )); + //Notice: We exclude blocks that cannot exist without a solid block below (such as rails or crops) + public static final Set NONSOLID = new HashSet<>(concatTypes(Lists.newArrayList( + Material.COBWEB, + Material.END_GATEWAY, + Material.END_PORTAL, + Material.NETHER_PORTAL, + Material.CAVE_VINES_PLANT, + Material.GLOW_LICHEN, + Material.HANGING_ROOTS, + Material.POWDER_SNOW, + Material.SCULK_VEIN, + Material.STRING, + Material.TRIPWIRE_HOOK, + Material.LADDER, + Material.VINE, + Material.SOUL_WALL_TORCH, + Material.REDSTONE_WALL_TORCH, + Material.WALL_TORCH, + Material.WEEPING_VINES_PLANT, + Material.WEEPING_VINES, + Material.CAVE_VINES_PLANT, + Material.CAVE_VINES + ), Arrays.asList(), Arrays.asList(Switch.class, CoralWallFan.class, WallSign.class), m -> m.name().endsWith("_WALL_BANNER"))); - public static final Set LEAVES = new HashSet<>(Arrays.asList( - Material.BIRCH_LEAVES, - Material.DARK_OAK_LEAVES, - Material.JUNGLE_LEAVES, - Material.OAK_LEAVES, - Material.SPRUCE_LEAVES, - Material.FLOWERING_AZALEA_LEAVES, - Material.MANGROVE_LEAVES - )); + public static final Set LEAVES = new HashSet<>(concatTypes(Leaves.class)); + + public static final Set INSTANT_BREAK = new HashSet<>(concatTypes(Lists.newArrayList( + Material.TALL_GRASS, + Material.GRASS, + Material.FERN, + Material.LARGE_FERN, + Material.KELP_PLANT, + Material.DEAD_BUSH, + Material.WHEAT_SEEDS, + Material.POTATOES, + Material.CARROTS, + Material.BEETROOT_SEEDS, + Material.PUMPKIN_STEM, + Material.MELON_STEM, + Material.SUGAR_CANE, + Material.SWEET_BERRY_BUSH, + Material.LILY_PAD, + Material.DANDELION, + Material.POPPY, + Material.BLUE_ORCHID, + Material.ALLIUM, + Material.AZURE_BLUET, + Material.RED_TULIP, + Material.ORANGE_TULIP, + Material.WHITE_TULIP, + Material.PINK_TULIP, + Material.OXEYE_DAISY, + Material.CORNFLOWER, + Material.LILY_OF_THE_VALLEY, + Material.WITHER_ROSE, + Material.SUNFLOWER, + Material.LILAC, + Material.ROSE_BUSH, + Material.PEONY, + Material.NETHER_WART, + Material.FLOWER_POT, + Material.AZALEA, + Material.FLOWERING_AZALEA, + Material.REPEATER, + Material.COMPARATOR, + Material.REDSTONE_WIRE, + Material.REDSTONE_TORCH, + Material.REDSTONE_WALL_TORCH, + Material.TORCH, + Material.WALL_TORCH, + Material.SOUL_TORCH, + Material.SOUL_WALL_TORCH, + Material.SCAFFOLDING, + Material.SLIME_BLOCK, + Material.HONEY_BLOCK, + Material.TNT, + Material.TRIPWIRE, + Material.TRIPWIRE_HOOK, + Material.SPORE_BLOSSOM, + Material.RED_MUSHROOM, + Material.BROWN_MUSHROOM, + Material.CRIMSON_FUNGUS, + Material.WARPED_FUNGUS, + Material.CRIMSON_ROOTS, + Material.WARPED_ROOTS, + Material.HANGING_ROOTS, + Material.WEEPING_VINES, + Material.WEEPING_VINES_PLANT, + Material.TWISTING_VINES, + Material.TWISTING_VINES_PLANT, + Material.CAVE_VINES, + Material.CAVE_VINES_PLANT, + Material.SEA_PICKLE + ), Arrays.asList(), Arrays.asList(Sapling.class, CoralWallFan.class), m -> m.name().endsWith("_CORAL_FAN") || m.name().endsWith("_CORAL") + || m.name().startsWith("POTTED_"))); + + private static List concatTypes(Class... types) { + return concatTypes(new ArrayList<>(), Arrays.asList(types)); + } + + private static List concatTypes(List materials, List> types) { + return concatTypes(materials, Arrays.asList(), types); + } + + private static List concatTypes(List materials, List exclusions, List> types) { + return concatTypes(materials, exclusions, types, m -> false); + } + + private static List concatTypes(List materials, List exclusions, List> types, Predicate otherFilter) { + materials.addAll(Stream.of(Material.values()).filter(m -> (types.contains(m.data) || otherFilter.test(m)) + && !exclusions.contains(m) && !m.isLegacy()).toList()); + return materials; + } } 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 9ddcfcb..51fe57a 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 @@ -526,7 +526,12 @@ public class Bot extends ServerPlayer implements Terminator { return false; } - World world = getBukkitEntity().getWorld(); + return getStandingOn() != null; + } + + @Override + public Block getStandingOn() { + World world = getBukkitEntity().getWorld(); AABB box = getBoundingBox(); double[] xVals = new double[]{ @@ -547,7 +552,7 @@ 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 true; + return block; } } } @@ -563,29 +568,29 @@ 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 true; + return block; } } } - return false; + return null; } /** * Checks for non-solid blocks that can hold an entity up. */ - private boolean canStandOn(Material mat) - { + private boolean canStandOn(Material mat) { if(mat == Material.END_ROD || mat == Material.FLOWER_POT || mat == Material.REPEATER || mat == Material.COMPARATOR || mat == Material.SNOW || mat == Material.LADDER || mat == Material.VINE) return true; - if(mat == Material.BLACK_CARPET || mat == Material.BLUE_CARPET || mat == Material.BROWN_CARPET || mat == Material.CYAN_CARPET - || mat == Material.GRAY_CARPET || mat == Material.GREEN_CARPET || mat == Material.LIGHT_BLUE_CARPET - || mat == Material.LIGHT_GRAY_CARPET || mat == Material.LIME_CARPET || mat == Material.MAGENTA_CARPET - || mat == Material.MOSS_CARPET || mat == Material.ORANGE_CARPET || mat == Material.PINK_CARPET - || mat == Material.PURPLE_CARPET || mat == Material.RED_CARPET || mat == Material.WHITE_CARPET - || mat == Material.YELLOW_CARPET) + if(mat.name().endsWith("_CARPET")) + return true; + + if(mat.name().startsWith("POTTED_")) + return true; + + if((mat.name().endsWith("_HEAD") || mat.name().endsWith("_SKULL")) && !mat.name().equals("PISTON_HEAD")) return true; if(mat.data == Candle.class) From a736e59262ac1d48580bd80f5a9199326cc91513 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Fri, 30 Sep 2022 17:51:02 -0400 Subject: [PATCH 05/30] 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; } /** From 686218112f3d7d7761f9d1817bd893aec89f506c Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Fri, 30 Sep 2022 17:57:37 -0400 Subject: [PATCH 06/30] Bump codeql, fix import --- .github/workflows/dev-analysis.yml | 4 ++-- .../net/nuggetmc/tplus/api/agent/legacyagent/LegacyAgent.java | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dev-analysis.yml b/.github/workflows/dev-analysis.yml index 8d11f31..ee33c82 100644 --- a/.github/workflows/dev-analysis.yml +++ b/.github/workflows/dev-analysis.yml @@ -32,12 +32,12 @@ jobs: ${{ runner.os }}-maven- - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 gradle: strategy: 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 6383faf..ddc7f9f 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 @@ -22,6 +22,7 @@ import org.bukkit.entity.*; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.BoundingBox; import org.bukkit.util.Vector; import java.util.*; From 3bd057075cae09e2b1bd39ed6a599956cc2fdb3a Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Fri, 30 Sep 2022 20:40:53 -0400 Subject: [PATCH 07/30] Fix CodeQL --- .github/workflows/dev-analysis.yml | 51 +++++++++++++----------------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/.github/workflows/dev-analysis.yml b/.github/workflows/dev-analysis.yml index ee33c82..50ce0f4 100644 --- a/.github/workflows/dev-analysis.yml +++ b/.github/workflows/dev-analysis.yml @@ -24,7 +24,7 @@ jobs: uses: actions/checkout@v2 - name: Cache local repo - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} @@ -35,34 +35,27 @@ jobs: uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} + + - uses: actions/setup-java@v3 + with: + distribution: temurin + java-version: 17 + + - name: Make gradlew executable + run: chmod +x ./gradlew + + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + + - name: Execute Gradle build + run: ./gradlew build - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v2 - - gradle: - strategy: - matrix: - os: [ ubuntu-latest ] - runs-on: ${{ matrix.os }} - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-java@v3 - with: - distribution: temurin - java-version: 17 - - - name: Make gradlew executable - run: chmod +x ./gradlew - - - name: Setup Gradle - uses: gradle/gradle-build-action@v2 - - - name: Execute Gradle build - run: ./gradlew build - - - name: Upload a Build Artifact - uses: actions/upload-artifact@v2.2.4 - if: success() - with: - name: TerminatorPlus - path: build/libs/ + + - name: Upload a Build Artifact + uses: actions/upload-artifact@v3 + if: success() + with: + name: TerminatorPlus + path: build/libs/ From 42c8c448c7ee4b2335a0d8b72fb244e440732951 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Sun, 2 Oct 2022 11:20:25 -0400 Subject: [PATCH 08/30] Commands fixes -Fix formatting of mobtarget and setgoal -Add /bot settings region (prioritize in region) --- .../api/agent/legacyagent/LegacyAgent.java | 57 +++++++++- .../main/java/net/nuggetmc/tplus/bot/Bot.java | 3 +- .../tplus/command/commands/BotCommand.java | 106 ++++++++++++++++-- 3 files changed, 156 insertions(+), 10 deletions(-) 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 ddc7f9f..57dc12d 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 @@ -48,6 +48,10 @@ public class LegacyAgent extends Agent { private final Set fallDamageCooldown = new HashSet<>(); public boolean offsets = true; private EnumTargetGoal goal; + private BoundingBox region; + private double regionWeightX; + private double regionWeightY; + private double regionWeightZ; public LegacyAgent(BotManager manager, Plugin plugin) { super(manager, plugin); @@ -1346,6 +1350,33 @@ public class LegacyAgent extends Agent { bot.attack(target); } + + public void setRegion(BoundingBox region, double regionWeightX, double regionWeightY, double regionWeightZ) { + this.region = region; + this.regionWeightX = regionWeightX; + this.regionWeightY = regionWeightY; + this.regionWeightZ = regionWeightZ; + } + + public BoundingBox getRegion() { + return region; + } + + public double getRegionWeightX() { + return regionWeightX; + } + + public double getRegionWeightY() { + return regionWeightY; + } + + public double getRegionWeightZ() { + return regionWeightZ; + } + + public EnumTargetGoal getTargetType() { + return goal; + } public void setTargetType(EnumTargetGoal goal) { this.goal = goal; @@ -1446,7 +1477,7 @@ public class LegacyAgent extends Agent { case PLAYER: { //Target a single player. Defaults to NEAREST_VULNERABLE_PLAYER if no player found. if (bot.getTargetPlayer() != null) { Player player = Bukkit.getPlayer(bot.getTargetPlayer()); - if (player != null) { + if (player != null && validateCloserEntity(player, loc, null)) { return player; } } @@ -1460,7 +1491,29 @@ public class LegacyAgent extends Agent { } private boolean validateCloserEntity(LivingEntity entity, Location loc, LivingEntity result) { - return loc.getWorld() == entity.getWorld() && !entity.isDead() && (result == null || loc.distance(entity.getLocation()) < loc.distance(result.getLocation())); + double regionDistEntity = getWeightedRegionDist(entity.getLocation()); + if (regionDistEntity == Double.MAX_VALUE) + return false; + double regionDistResult = result == null ? 0 : getWeightedRegionDist(result.getLocation()); + return loc.getWorld() == entity.getWorld() && !entity.isDead() + && (result == null || (loc.distance(entity.getLocation()) + regionDistEntity) < (loc.distance(result.getLocation())) + regionDistResult); + } + + private double getWeightedRegionDist(Location loc) { + if (region == null) + return 0; + double diffX = Math.min(0, Math.abs(region.getCenterX() - loc.getX()) - region.getWidthX() * 0.5); + double diffY = Math.max(0, Math.abs(region.getCenterY() - loc.getY()) - region.getHeight() * 0.5); + double diffZ = Math.max(0, Math.abs(region.getCenterZ() - loc.getZ()) - region.getWidthZ() * 0.5); + if (regionWeightX == 0 && regionWeightY == 0 && regionWeightZ == 0) { + if (diffX > 0 || diffY > 0 || diffZ > 0) + return Double.MAX_VALUE; + } else { + diffX *= regionWeightX; + diffY *= regionWeightY; + diffZ *= regionWeightZ; + } + return diffX * diffX + diffY * diffY + diffZ * diffZ; } @Override 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 60b0301..f1665ac 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 @@ -600,7 +600,8 @@ public class Bot extends ServerPlayer implements Terminator { */ private boolean canStandOn(Material mat) { if(mat == Material.END_ROD || mat == Material.FLOWER_POT || mat == Material.REPEATER || mat == Material.COMPARATOR - || mat == Material.SNOW || mat == Material.LADDER || mat == Material.VINE) + || mat == Material.SNOW || mat == Material.LADDER || mat == Material.VINE || mat == Material.SCAFFOLDING + || mat == Material.AZALEA || mat == Material.FLOWERING_AZALEA) return true; if(mat.name().endsWith("_CARPET")) diff --git a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java index 36b0157..52266b5 100644 --- a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java +++ b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java @@ -22,6 +22,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitScheduler; +import org.bukkit.util.BoundingBox; import org.bukkit.util.Vector; import java.text.DecimalFormat; @@ -141,7 +142,6 @@ public class BotCommand extends CommandInstance { desc = "Gives all bots an armor set.", autofill = "armorAutofill" ) - @SuppressWarnings("deprecation") public void armor(CommandSender sender, @Arg("armor-tier") String armorTier) { String tier = armorTier.toLowerCase(); @@ -267,17 +267,24 @@ public class BotCommand extends CommandInstance { String extra = ChatColor.GRAY + " [" + ChatColor.YELLOW + "/bot settings" + ChatColor.GRAY + "]"; - if (arg1 == null || ((!arg1.equalsIgnoreCase("setgoal")) && !arg1.equalsIgnoreCase("mobtarget") && !arg1.equalsIgnoreCase("playertarget"))) { + if (arg1 == null || ((!arg1.equalsIgnoreCase("setgoal")) && !arg1.equalsIgnoreCase("mobtarget") && !arg1.equalsIgnoreCase("playertarget") + && !arg1.equalsIgnoreCase("region"))) { sender.sendMessage(ChatUtils.LINE); sender.sendMessage(ChatColor.GOLD + "Bot Settings" + extra); sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "setgoal" + ChatUtils.BULLET_FORMATTED + "Set the global bot target selection method."); sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "mobtarget" + ChatUtils.BULLET_FORMATTED + "Allow all future bots spawned to be targeted by hostile mobs."); + sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "playertarget" + ChatUtils.BULLET_FORMATTED + "Sets a player name for the bots to focus on if the goal is PLAYER."); + sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "region" + ChatUtils.BULLET_FORMATTED + "Sets a region for the bots to prioritize entities inside."); sender.sendMessage(ChatUtils.LINE); return; } if (arg1.equalsIgnoreCase("setgoal")) { - EnumTargetGoal goal = EnumTargetGoal.from(arg2 == null ? "" : arg2); + if (arg2 == null) { + sender.sendMessage("The global bot goal is currently " + ChatColor.BLUE + agent.getTargetType() + ChatColor.RESET + "."); + return; + } + EnumTargetGoal goal = EnumTargetGoal.from(arg2); if (goal == null) { sender.sendMessage(ChatUtils.LINE); @@ -290,14 +297,22 @@ public class BotCommand extends CommandInstance { agent.setTargetType(goal); sender.sendMessage("The global bot goal has been set to " + ChatColor.BLUE + goal.name() + ChatColor.RESET + "."); } else if (arg1.equalsIgnoreCase("mobtarget")) { - manager.setMobTarget(!manager.isMobTarget()); - sender.sendMessage("Mob targeting is now " + (manager.isMobTarget() ? ChatColor.GREEN + "enabled" : ChatColor.RED + "disabled") + ChatColor.RESET + ". (for all future bots)"); + if (arg2 == null) { + sender.sendMessage("Mob targeting is currently " + (manager.isMobTarget() ? ChatColor.GREEN + "enabled" : ChatColor.RED + "disabled") + ChatColor.RESET + "."); + return; + } + if (!arg2.equals("true") && !arg2.equals("false")) { + sender.sendMessage(ChatColor.RED + "You must specify true or false!"); + return; + } + manager.setMobTarget(Boolean.parseBoolean(arg2)); + sender.sendMessage("Mob targeting is now " + (manager.isMobTarget() ? ChatColor.GREEN + "enabled" : ChatColor.RED + "disabled") + ChatColor.RESET + ". (for all future bots)"); } else if (arg1.equalsIgnoreCase("playertarget")) { - if (args.size() < 2) { + if (args.size() < 2) { sender.sendMessage(ChatColor.RED + "You must specify a player name!"); return; } - String playerName = args.get(1); + String playerName = arg2; Player player = Bukkit.getPlayer(playerName); if (player == null) { sender.sendMessage(ChatColor.RED + "Could not find player " + ChatColor.YELLOW + playerName + ChatColor.RED + "!"); @@ -307,6 +322,76 @@ public class BotCommand extends CommandInstance { fetch.setTargetPlayer(player.getUniqueId()); } sender.sendMessage("All spawned bots are now set to target " + ChatColor.BLUE + player.getName() + ChatColor.RESET + ". They will target the closest player if they can't be found.\nYou may need to set the goal to PLAYER."); + } else if (arg1.equalsIgnoreCase("region")) { + if (arg2 == null) { + if (agent.getRegion() == null) { + sender.sendMessage("No region has been set."); + return; + } + sender.sendMessage("The current region is " + ChatColor.BLUE + agent.getRegion() + ChatColor.RESET + "."); + if (agent.getRegionWeightX() == 0 && agent.getRegionWeightY() == 0 && agent.getRegionWeightZ() == 0) + sender.sendMessage("Entities out of range will not be targeted."); + else { + sender.sendMessage("The region X weight is " + ChatColor.BLUE + agent.getRegionWeightX() + ChatColor.RESET + "."); + sender.sendMessage("The region Y weight is " + ChatColor.BLUE + agent.getRegionWeightY() + ChatColor.RESET + "."); + sender.sendMessage("The region Z weight is " + ChatColor.BLUE + agent.getRegionWeightZ() + ChatColor.RESET + "."); + } + return; + } + if (arg2.equalsIgnoreCase("clear")) { + agent.setRegion(null, 0, 0, 0); + sender.sendMessage("The region has been cleared."); + return; + } + boolean strict = args.size() == 8 && args.get(7).equalsIgnoreCase("strict"); + if (args.size() != 10 && !strict) { + sender.sendMessage(ChatUtils.LINE); + sender.sendMessage(ChatColor.GOLD + "Bot Region Settings" + extra); + sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + " " + ChatUtils.BULLET_FORMATTED + + "Sets a region for bots to prioritize entities within."); + sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + " strict" + ChatUtils.BULLET_FORMATTED + + "Sets a region so that the bots only target entities within the region."); + sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "clear" + ChatUtils.BULLET_FORMATTED + + "Clears the region."); + sender.sendMessage("Without strict mode, the entity distance from the region is multiplied by the weight values if outside the region."); + sender.sendMessage("The resulting value is added to the entity distance when selecting an entity."); + sender.sendMessage(ChatUtils.LINE); + return; + } + double x1, y1, z1, x2, y2, z2, wX, wY, wZ; + try { + x1 = Double.parseDouble(args.get(1)); + y1 = Double.parseDouble(args.get(2)); + z1 = Double.parseDouble(args.get(3)); + x2 = Double.parseDouble(args.get(4)); + y2 = Double.parseDouble(args.get(5)); + z2 = Double.parseDouble(args.get(6)); + if (strict) + wX = wY = wZ = 0; + else { + wX = Double.parseDouble(args.get(7)); + wY = Double.parseDouble(args.get(8)); + wZ = Double.parseDouble(args.get(9)); + if (wX <= 0 || wY <= 0 || wZ <= 0) { + sender.sendMessage("The region weights must be positive values!"); + return; + } + } + } catch (NumberFormatException e) { + sender.sendMessage("The region bounds and weights must be valid numbers!"); + sender.sendMessage("Correct syntax: " + ChatColor.YELLOW + "/bot settings region " + + ChatColor.RESET); + return; + } + agent.setRegion(new BoundingBox(x1, y1, z1, x2, y2, z2), wX, wY, wZ); + sender.sendMessage("The region has been set to " + ChatColor.BLUE + agent.getRegion() + ChatColor.RESET + "."); + if (wX == 0 && wY == 0 && wZ == 0) + sender.sendMessage("Entities out of range will not be targeted."); + else { + sender.sendMessage("The region X weight is " + ChatColor.BLUE + agent.getRegionWeightX() + ChatColor.RESET + "."); + sender.sendMessage("The region Y weight is " + ChatColor.BLUE + agent.getRegionWeightY() + ChatColor.RESET + "."); + sender.sendMessage("The region Z weight is " + ChatColor.BLUE + agent.getRegionWeightZ() + ChatColor.RESET + "."); + } } } @@ -325,6 +410,8 @@ public class BotCommand extends CommandInstance { if (args.length == 2) { output.add("setgoal"); output.add("mobtarget"); + output.add("playertarget"); + output.add("region"); } else if (args.length == 3) { if (args[1].equalsIgnoreCase("setgoal")) { Arrays.stream(EnumTargetGoal.values()).forEach(goal -> output.add(goal.name().replace("_", "").toLowerCase())); @@ -333,6 +420,11 @@ public class BotCommand extends CommandInstance { output.add("true"); output.add("false"); } + if (args[1].equalsIgnoreCase("playertarget")) { + for (Player player : Bukkit.getOnlinePlayers()) { + output.add(player.getName()); + } + } } return output; From 08dd248fbae1629b93b36c238fe525f18aa3aa7c Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Mon, 3 Oct 2022 16:50:18 -0400 Subject: [PATCH 09/30] /bot count and region fixes -Fix bugs with region setting -/bot count: Count bots by name -/bot info gets closest bot --- .../net/nuggetmc/tplus/api/BotManager.java | 2 +- .../api/agent/legacyagent/EnumTargetGoal.java | 1 + .../api/agent/legacyagent/LegacyAgent.java | 13 ++++-------- .../nuggetmc/tplus/bot/BotManagerImpl.java | 12 ++++++++++- .../tplus/command/commands/AICommand.java | 2 +- .../tplus/command/commands/BotCommand.java | 21 ++++++++++++++++++- 6 files changed, 38 insertions(+), 13 deletions(-) diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/BotManager.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/BotManager.java index ad1eeb4..5d37bea 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/BotManager.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/BotManager.java @@ -16,7 +16,7 @@ public interface BotManager { void add(Terminator bot); - Terminator getFirst(String name); + Terminator getFirst(String name, Location target); List fetchNames(); diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/EnumTargetGoal.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/EnumTargetGoal.java index c2e8a1c..a708bd1 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/EnumTargetGoal.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/EnumTargetGoal.java @@ -24,6 +24,7 @@ public enum EnumTargetGoal { this.put("nearestbot", NEAREST_BOT); this.put("nearestbotdiffer", NEAREST_BOT_DIFFER); this.put("nearestbotdifferalpha", NEAREST_BOT_DIFFER_ALPHA); + this.put("player", PLAYER); } }; 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 57dc12d..b95f2eb 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 @@ -1496,24 +1496,19 @@ public class LegacyAgent extends Agent { return false; double regionDistResult = result == null ? 0 : getWeightedRegionDist(result.getLocation()); return loc.getWorld() == entity.getWorld() && !entity.isDead() - && (result == null || (loc.distance(entity.getLocation()) + regionDistEntity) < (loc.distance(result.getLocation())) + regionDistResult); + && (result == null || (loc.distanceSquared(entity.getLocation()) + regionDistEntity) < (loc.distanceSquared(result.getLocation())) + regionDistResult); } private double getWeightedRegionDist(Location loc) { if (region == null) return 0; - double diffX = Math.min(0, Math.abs(region.getCenterX() - loc.getX()) - region.getWidthX() * 0.5); + double diffX = Math.max(0, Math.abs(region.getCenterX() - loc.getX()) - region.getWidthX() * 0.5); double diffY = Math.max(0, Math.abs(region.getCenterY() - loc.getY()) - region.getHeight() * 0.5); double diffZ = Math.max(0, Math.abs(region.getCenterZ() - loc.getZ()) - region.getWidthZ() * 0.5); - if (regionWeightX == 0 && regionWeightY == 0 && regionWeightZ == 0) { + if (regionWeightX == 0 && regionWeightY == 0 && regionWeightZ == 0) if (diffX > 0 || diffY > 0 || diffZ > 0) return Double.MAX_VALUE; - } else { - diffX *= regionWeightX; - diffY *= regionWeightY; - diffZ *= regionWeightZ; - } - return diffX * diffX + diffY * diffY + diffZ * diffZ; + return diffX * diffX * regionWeightX + diffY * diffY * regionWeightY + diffZ * diffZ * regionWeightZ; } @Override diff --git a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java index a0f93a8..3e713d9 100644 --- a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java +++ b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java @@ -56,7 +56,17 @@ public class BotManagerImpl implements BotManager, Listener { } @Override - public Terminator getFirst(String name) { + public Terminator getFirst(String name, Location target) { + if (target != null) { + Terminator closest = null; + for (Terminator bot : bots) { + if (name.equals(bot.getBotName()) && (closest == null + || target.distanceSquared(bot.getLocation()) < target.distanceSquared(closest.getLocation()))) { + closest = bot; + } + } + return closest; + } for (Terminator bot : bots) { if (name.equals(bot.getBotName())) { return bot; diff --git a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/AICommand.java b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/AICommand.java index 4b95949..02a57fd 100644 --- a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/AICommand.java +++ b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/AICommand.java @@ -121,7 +121,7 @@ public class AICommand extends CommandInstance implements AIManager { scheduler.runTaskAsynchronously(plugin, () -> { try { - Terminator bot = manager.getFirst(name); + Terminator bot = manager.getFirst(name, (sender instanceof Player pl) ? pl.getLocation() : null); if (bot == null) { sender.sendMessage("Could not find bot " + ChatColor.GREEN + name + ChatColor.RESET + "!"); diff --git a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java index 52266b5..e8a9077 100644 --- a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java +++ b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java @@ -27,6 +27,8 @@ import org.bukkit.util.Vector; import java.text.DecimalFormat; import java.util.*; +import java.util.Map.Entry; +import java.util.stream.Collectors; public class BotCommand extends CommandInstance { @@ -190,7 +192,7 @@ public class BotCommand extends CommandInstance { scheduler.runTaskAsynchronously(plugin, () -> { try { - Terminator bot = manager.getFirst(name); + Terminator bot = manager.getFirst(name, (sender instanceof Player pl) ? pl.getLocation() : null); if (bot == null) { sender.sendMessage("Could not find bot " + ChatColor.GREEN + name + ChatColor.RESET + "!"); @@ -231,6 +233,23 @@ public class BotCommand extends CommandInstance { public List infoAutofill(CommandSender sender, String[] args) { return args.length == 2 ? manager.fetchNames() : null; } + + @Command( + name = "count", + desc = "Counts the amount of bots on screen by name." + ) + public void count(CommandSender sender) { + List names = manager.fetchNames(); + Map freqMap = names.stream().collect(Collectors.toMap(s -> s, s -> 1, Integer::sum)); + List> entries = freqMap.entrySet().stream() + .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).collect(Collectors.toList()); + + sender.sendMessage(ChatUtils.LINE); + entries.forEach(en -> sender.sendMessage(ChatColor.GREEN + en.getKey() + + ChatColor.RESET + " - " + ChatColor.BLUE + en.getValue().toString() + ChatColor.RESET)); + sender.sendMessage("Total bots: " + ChatColor.BLUE + freqMap.values().stream().reduce(0, Integer::sum) + ChatColor.RESET); + sender.sendMessage(ChatUtils.LINE); + } @Command( name = "reset", From e626fa7144afaf6f9254d375afa0cf5ddd745675 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Tue, 4 Oct 2022 11:01:06 -0400 Subject: [PATCH 10/30] Fix mobtarget and obstacles -Fix trapdoors -Fix mobtarget (and make the setting global) --- .../api/agent/legacyagent/LegacyAgent.java | 22 +++++++++++++------ .../main/java/net/nuggetmc/tplus/bot/Bot.java | 8 ------- .../nuggetmc/tplus/bot/BotManagerImpl.java | 15 +++++++------ .../tplus/command/commands/BotCommand.java | 6 ++--- 4 files changed, 26 insertions(+), 25 deletions(-) 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 b95f2eb..11b6b87 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 @@ -929,13 +929,21 @@ public class LegacyAgent extends Agent { } private boolean checkObstacles(Terminator bot, Block block, LivingEntity player) { - if (LegacyMats.OBSTACLES.contains(block.getType())) { + if (LegacyMats.OBSTACLES.contains(block.getType()) || isDoorObstacle(block)) { preBreak(bot, player, block, LegacyLevel.AT_D); return true; } return false; } + + private boolean isDoorObstacle(Block block) { + if (block.getType().data == Door.class) + return true; + if (block.getType().data == TrapDoor.class && ((TrapDoor)block.getBlockData()).isOpen()) + return true; + return false; + } private boolean checkAt(Terminator bot, Block block, LivingEntity player) { if (LegacyMats.BREAK.contains(block.getType())) { @@ -1503,12 +1511,12 @@ public class LegacyAgent extends Agent { if (region == null) return 0; double diffX = Math.max(0, Math.abs(region.getCenterX() - loc.getX()) - region.getWidthX() * 0.5); - double diffY = Math.max(0, Math.abs(region.getCenterY() - loc.getY()) - region.getHeight() * 0.5); - double diffZ = Math.max(0, Math.abs(region.getCenterZ() - loc.getZ()) - region.getWidthZ() * 0.5); - if (regionWeightX == 0 && regionWeightY == 0 && regionWeightZ == 0) - if (diffX > 0 || diffY > 0 || diffZ > 0) - return Double.MAX_VALUE; - return diffX * diffX * regionWeightX + diffY * diffY * regionWeightY + diffZ * diffZ * regionWeightZ; + double diffY = Math.max(0, Math.abs(region.getCenterY() - loc.getY()) - region.getHeight() * 0.5); + double diffZ = Math.max(0, Math.abs(region.getCenterZ() - loc.getZ()) - region.getWidthZ() * 0.5); + if (regionWeightX == 0 && regionWeightY == 0 && regionWeightZ == 0) + if (diffX > 0 || diffY > 0 || diffZ > 0) + return Double.MAX_VALUE; + return diffX * diffX * regionWeightX + diffY * diffY * regionWeightY + diffZ * diffZ * regionWeightZ; } @Override 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 f1665ac..b7ff8fc 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 @@ -921,12 +921,4 @@ public class Bot extends ServerPlayer implements Terminator { this.yRotO = this.getYRot(); this.xRotO = this.getXRot(); } - - public boolean isIgnoredByMobs() { - return ignoredByMobs; - } - - public void setIgnoredByMobs(boolean ignoredByMobs) { - this.ignoredByMobs = ignoredByMobs; - } } diff --git a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java index 3e713d9..38d25db 100644 --- a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java +++ b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java @@ -60,10 +60,10 @@ public class BotManagerImpl implements BotManager, Listener { if (target != null) { Terminator closest = null; for (Terminator bot : bots) { - if (name.equals(bot.getBotName()) && (closest == null - || target.distanceSquared(bot.getLocation()) < target.distanceSquared(closest.getLocation()))) { - closest = bot; - } + if (name.equals(bot.getBotName()) && (closest == null + || target.distanceSquared(bot.getLocation()) < target.distanceSquared(closest.getLocation()))) { + closest = bot; + } } return closest; } @@ -149,7 +149,6 @@ public class BotManagerImpl implements BotManager, Listener { } else if (i > 1) { bot.setVelocity(randomVelocity().multiply(f)); } - bot.setIgnoredByMobs(!mobTarget); bots.add(bot); i++; @@ -232,8 +231,10 @@ public class BotManagerImpl implements BotManager, Listener { @EventHandler public void onMobTarget(EntityTargetLivingEntityEvent event) { - Bot bot = (Bot) getBot(event.getEntity().getUniqueId()); - if (bot != null && bot.isIgnoredByMobs()) { + if (mobTarget || event.getTarget() == null) + return; + Bot bot = (Bot) getBot(event.getTarget().getUniqueId()); + if (bot != null) { event.setCancelled(true); } } diff --git a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java index e8a9077..2d2b729 100644 --- a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java +++ b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java @@ -291,8 +291,8 @@ public class BotCommand extends CommandInstance { sender.sendMessage(ChatUtils.LINE); sender.sendMessage(ChatColor.GOLD + "Bot Settings" + extra); sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "setgoal" + ChatUtils.BULLET_FORMATTED + "Set the global bot target selection method."); - sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "mobtarget" + ChatUtils.BULLET_FORMATTED + "Allow all future bots spawned to be targeted by hostile mobs."); - sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "playertarget" + ChatUtils.BULLET_FORMATTED + "Sets a player name for the bots to focus on if the goal is PLAYER."); + sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "mobtarget" + ChatUtils.BULLET_FORMATTED + "Allow all bots to be targeted by hostile mobs."); + sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "playertarget" + ChatUtils.BULLET_FORMATTED + "Sets a player name for spawned bots to focus on if the goal is PLAYER."); sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "region" + ChatUtils.BULLET_FORMATTED + "Sets a region for the bots to prioritize entities inside."); sender.sendMessage(ChatUtils.LINE); return; @@ -325,7 +325,7 @@ public class BotCommand extends CommandInstance { return; } manager.setMobTarget(Boolean.parseBoolean(arg2)); - sender.sendMessage("Mob targeting is now " + (manager.isMobTarget() ? ChatColor.GREEN + "enabled" : ChatColor.RED + "disabled") + ChatColor.RESET + ". (for all future bots)"); + sender.sendMessage("Mob targeting is now " + (manager.isMobTarget() ? ChatColor.GREEN + "enabled" : ChatColor.RED + "disabled") + ChatColor.RESET + "."); } else if (arg1.equalsIgnoreCase("playertarget")) { if (args.size() < 2) { sender.sendMessage(ChatColor.RED + "You must specify a player name!"); From a0c92d5097a4bce6785781d30105cfe774070bf8 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Wed, 5 Oct 2022 16:33:24 -0400 Subject: [PATCH 11/30] Fix onground check -Full bounds check and check for waterlogged blocks -OnGround check now works for big dripleaf -Fix nofall check Note: There is an inconsistency where waterlogged big dripleafs will block fall damage --- .../nuggetmc/tplus/api/utils/BotUtils.java | 6 +-- .../main/java/net/nuggetmc/tplus/bot/Bot.java | 37 ++++++++++++++++--- 2 files changed, 35 insertions(+), 8 deletions(-) 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 f5c9c45..b67f98b 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 @@ -16,8 +16,8 @@ public class BotUtils { Material.WATER, Material.LAVA, Material.TWISTING_VINES, - Material.VINE, - Material.LADDER, + Material.SWEET_BERRY_BUSH, + Material.POWDER_SNOW, Material.COBWEB )); @@ -31,7 +31,7 @@ public class BotUtils { return randomSteveUUID(); } - public static boolean solidAt(BoundingBox playerBox, BoundingBox blockBox) { + public static boolean overlaps(BoundingBox playerBox, BoundingBox blockBox) { return playerBox.overlaps(blockBox); } 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 b7ff8fc..2c43618 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 @@ -34,6 +34,7 @@ import net.nuggetmc.tplus.api.utils.*; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.type.Candle; import org.bukkit.craftbukkit.v1_19_R1.CraftEquipmentSlot; import org.bukkit.craftbukkit.v1_19_R1.CraftServer; @@ -76,7 +77,6 @@ public class Bot extends ServerPlayer implements Terminator { 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) { super(minecraftServer, worldServer, profile, null); @@ -393,7 +393,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())) { + if (groundTicks != 0 && noFallTicks == 0 && !(oldVelocity.getY() >= -0.8) && !isFallBlocked()) { BotFallDamageEvent event = new BotFallDamageEvent(this, new ArrayList<>(getStandingOn())); plugin.getManager().getAgent().onFallDamage(event); @@ -403,6 +403,33 @@ public class Bot extends ServerPlayer implements Terminator { } } } + + private boolean isFallBlocked() { + AABB box = getBoundingBox(); + double[] xVals = new double[]{ + box.minX, + box.maxX - 0.01 + }; + + double[] zVals = new double[]{ + box.minZ, + box.maxZ - 0.01 + }; + BoundingBox playerBox = new BoundingBox(box.minX, position().y - 0.01, box.minZ, + box.maxX, position().y + getBbHeight(), box.maxZ); + for (double x : xVals) { + for (double z : zVals) { + Location loc = new Location(getBukkitEntity().getWorld(), Math.floor(x), getLocation().getY(), Math.floor(z)); + Block block = loc.getBlock(); + if (block.getBlockData() instanceof Waterlogged wl && wl.isWaterlogged()) + return true; + if (BotUtils.NO_FALL.contains(loc.getBlock().getType()) && (BotUtils.overlaps(playerBox, loc.getBlock().getBoundingBox()) + || loc.getBlock().getType() == Material.WATER || loc.getBlock().getType() == Material.LAVA)) + return true; + } + } + return false; + } @Override public boolean isFalling() { @@ -554,7 +581,7 @@ public class Bot extends ServerPlayer implements Terminator { Location loc = new Location(world, x, position().y - 0.01, z); Block block = world.getBlockAt(loc); - if ((block.getType().isSolid() || canStandOn(block.getType())) && BotUtils.solidAt(playerBox, block.getBoundingBox())) { + if ((block.getType().isSolid() || canStandOn(block.getType())) && BotUtils.overlaps(playerBox, block.getBoundingBox())) { if (!locations.contains(block.getLocation())) { standingOn.add(block); locations.add(block.getLocation()); @@ -573,7 +600,7 @@ public class Bot extends ServerPlayer implements Terminator { blockBox.getMinY() + 1.5, blockBox.getMaxZ()); if ((LegacyMats.FENCE.contains(block.getType()) || LegacyMats.GATES.contains(block.getType())) - && block.getType().isSolid() && BotUtils.solidAt(playerBox, modifiedBox)) { + && block.getType().isSolid() && BotUtils.overlaps(playerBox, modifiedBox)) { if (!locations.contains(block.getLocation())) { standingOn.add(block); locations.add(block.getLocation()); @@ -601,7 +628,7 @@ public class Bot extends ServerPlayer implements Terminator { private boolean canStandOn(Material mat) { if(mat == Material.END_ROD || mat == Material.FLOWER_POT || mat == Material.REPEATER || mat == Material.COMPARATOR || mat == Material.SNOW || mat == Material.LADDER || mat == Material.VINE || mat == Material.SCAFFOLDING - || mat == Material.AZALEA || mat == Material.FLOWERING_AZALEA) + || mat == Material.AZALEA || mat == Material.FLOWERING_AZALEA || mat == Material.BIG_DRIPLEAF) return true; if(mat.name().endsWith("_CARPET")) From 3fa35c17f9ec645aaf18c4554c064a1a51d62973 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Fri, 7 Oct 2022 21:10:55 -0400 Subject: [PATCH 12/30] Improved MLG handling - Added blacklist for scenarios where MLG wouldn't block fall damage (or fail to place) -Water buckets now waterlog if possible Note: This still means that any non-solid blocks like signs are treated as air and are destroyed at MLG. --- .../api/agent/legacyagent/LegacyAgent.java | 50 ++++- .../api/agent/legacyagent/LegacyMats.java | 181 +++++++++++++++++- .../nuggetmc/tplus/api/utils/BotUtils.java | 6 +- .../main/java/net/nuggetmc/tplus/bot/Bot.java | 4 +- 4 files changed, 229 insertions(+), 12 deletions(-) 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 11b6b87..d6bdd40 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 @@ -17,6 +17,7 @@ import net.nuggetmc.tplus.api.utils.PlayerUtils; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.type.*; import org.bukkit.entity.*; import org.bukkit.inventory.ItemStack; @@ -337,26 +338,50 @@ public class LegacyAgent extends Agent { Material itemType; Material placeType; Sound sound; + Location groundLoc = null; + boolean nether = bot.getBukkitEntity().getWorld().getEnvironment() == World.Environment.NETHER; + double yPos = bot.getBukkitEntity().getLocation().getY(); - if (bot.getBukkitEntity().getWorld().getEnvironment() == World.Environment.NETHER) { + if (nether) { itemType = Material.TWISTING_VINES; sound = Sound.BLOCK_WEEPING_VINES_PLACE; placeType = itemType; + + for (Block block : event.getStandingOn()) { + if (LegacyMats.canPlaceTwistingVines(block)) { + groundLoc = block.getLocation(); + break; + } + } } else { itemType = Material.WATER_BUCKET; sound = Sound.ITEM_BUCKET_EMPTY; placeType = Material.WATER; + + for (Block block : event.getStandingOn()) { + if (LegacyMats.canPlaceWater(block, yPos)) { + groundLoc = block.getLocation(); + break; + } + } } - - Location loc = bot.getLocation(); - - if (!loc.clone().add(0, -1, 0).getBlock().getType().isSolid()) return; + + if (groundLoc == null) return; + + Location loc = !LegacyMats.shouldReplace(groundLoc.getBlock(), yPos, nether) ? groundLoc.add(0, 1, 0) : groundLoc; + boolean waterloggable = loc.getBlock().getBlockData() instanceof Waterlogged; + boolean waterlogged = waterloggable && ((Waterlogged)loc.getBlock().getBlockData()).isWaterlogged(); event.setCancelled(true); - if (loc.getBlock().getType() != placeType) { + if (loc.getBlock().getType() != placeType && !waterlogged) { bot.punch(); - loc.getBlock().setType(placeType); + if (waterloggable) { + Waterlogged data = (Waterlogged)loc.getBlock().getBlockData(); + data.setWaterlogged(true); + loc.getBlock().setBlockData(data); + } else + loc.getBlock().setType(placeType); world.playSound(loc, sound, 1, 1); if (itemType == Material.WATER_BUCKET) { @@ -365,11 +390,18 @@ public class LegacyAgent extends Agent { scheduler.runTaskLater(plugin, () -> { Block block = loc.getBlock(); - if (block.getType() == Material.WATER) { + boolean waterloggedNow = block.getBlockData() instanceof Waterlogged + && ((Waterlogged)block.getBlockData()).isWaterlogged(); + if (block.getType() == Material.WATER || waterloggedNow) { bot.look(BlockFace.DOWN); bot.setItem(new ItemStack(Material.WATER_BUCKET)); world.playSound(loc, Sound.ITEM_BUCKET_FILL, 1, 1); - block.setType(Material.AIR); + if (waterloggedNow) { + Waterlogged data = (Waterlogged)loc.getBlock().getBlockData(); + data.setWaterlogged(false); + loc.getBlock().setBlockData(data); + } else + block.setType(Material.AIR); } }, 5); } diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java index 51f2707..48811f0 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java @@ -1,8 +1,12 @@ package net.nuggetmc.tplus.api.agent.legacyagent; +import org.bukkit.Axis; import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.Bisected; +import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.type.*; - import com.google.common.collect.Lists; import java.util.ArrayList; @@ -286,4 +290,179 @@ public class LegacyMats { && !exclusions.contains(m) && !m.isLegacy()).toList()); return materials; } + + public static boolean canPlaceWater(Block block, double entityYPos) { + if (block.getType().isSolid()) { + if (block.getType() == Material.CHAIN && ((Chain)block.getBlockData()).getAxis() == Axis.Y + && !((Chain)block.getBlockData()).isWaterlogged()) + return false; + if ((block.getType().data == Leaves.class || block.getType() == Material.MANGROVE_ROOTS + || block.getType() == Material.IRON_BARS || block.getType().name().endsWith("GLASS_PANE")) + && !((Waterlogged)block.getBlockData()).isWaterlogged()) + return false; + if (block.getType().data == Slab.class && ((Slab)block.getBlockData()).getType() == Slab.Type.TOP + && !((Slab)block.getBlockData()).isWaterlogged()) + return false; + if (block.getType().data == Stairs.class && ((Stairs)block.getBlockData()).getHalf() == Bisected.Half.TOP + && !((Stairs)block.getBlockData()).isWaterlogged()) + return false; + if (block.getType().data == Stairs.class && ((Stairs)block.getBlockData()).getHalf() == Bisected.Half.BOTTOM + && !((Stairs)block.getBlockData()).isWaterlogged() && (int)entityYPos != block.getLocation().getBlockY()) + return false; + if ((block.getType().data == Fence.class || block.getType().data == Wall.class) + && !((Waterlogged)block.getBlockData()).isWaterlogged()) + return false; + if (block.getType() == Material.LIGHTNING_ROD && !((LightningRod)block.getBlockData()).isWaterlogged() + && (((LightningRod)block.getBlockData()).getFacing() == BlockFace.UP || ((LightningRod)block.getBlockData()).getFacing() == BlockFace.DOWN)) + return false; + return true; + } else { + if (block.getType().name().endsWith("_CARPET")) + return true; + if (block.getType().data == Candle.class) + return true; + if (block.getType().name().startsWith("POTTED_")) + return true; + if ((block.getType().name().endsWith("_HEAD") || block.getType().name().endsWith("_SKULL")) + && !block.getType().name().equals("PISTON_HEAD")) + return true; + switch (block.getType()) { + case SNOW: + case AZALEA: + case FLOWERING_AZALEA: + case CHORUS_FLOWER: + case CHORUS_PLANT: + case COCOA: + case LILY_PAD: + case SEA_PICKLE: + case END_ROD: + case FLOWER_POT: + case SCAFFOLDING: + return true; + default: + break; + } + } + return false; + } + + public static boolean canPlaceTwistingVines(Block block) { + if (block.getType().isSolid()) { + if (block.getType().data == Leaves.class) + return false; + if (block.getType().name().endsWith("_CORAL_FAN") || block.getType().name().endsWith("_CORAL") + || block.getType().name().endsWith("_CORAL_WALL_FAN")) + return false; + if (block.getType().name().endsWith("GLASS_PANE")) + return false; + if (block.getType().data == Slab.class && ((Slab)block.getBlockData()).getType() == Slab.Type.BOTTOM) + return false; + if (block.getType().data == Stairs.class && ((Stairs)block.getBlockData()).getHalf() == Bisected.Half.BOTTOM) + return false; + if (block.getType().data == Fence.class || block.getType().data == Wall.class) + return false; + if (block.getType().name().endsWith("_BANNER")) + return false; + if (block.getType().name().endsWith("_WALL_BANNER")) + return false; + if (block.getType().data == Bed.class) + return false; + if (block.getType().name().endsWith("CANDLE_CAKE")) + return false; + if (block.getType().data == Door.class) + return false; + if (block.getType().data == Gate.class) + return false; + switch (block.getType()) { + case POINTED_DRIPSTONE: + case SMALL_AMETHYST_BUD: + case MEDIUM_AMETHYST_BUD: + case LARGE_AMETHYST_BUD: + case AMETHYST_CLUSTER: + case BAMBOO: + case CACTUS: + case DRAGON_EGG: + case TURTLE_EGG: + case CHAIN: + case IRON_BARS: + case LANTERN: + case SOUL_LANTERN: + case ANVIL: + case BREWING_STAND: + case CHEST: + case ENDER_CHEST: + case TRAPPED_CHEST: + case ENCHANTING_TABLE: + case GRINDSTONE: + case LECTERN: + case STONECUTTER: + case BELL: + case CAKE: + case CAMPFIRE: + case SOUL_CAMPFIRE: + case CAULDRON: + case COMPOSTER: + case CONDUIT: + case END_PORTAL_FRAME: + case FARMLAND: + case LADDER: + case DAYLIGHT_DETECTOR: + case HOPPER: + case LIGHTNING_ROD: + return false; + default: + } + return true; + } else { + switch (block.getType()) { + case CHORUS_FLOWER: + case SCAFFOLDING: + case AZALEA: + case FLOWERING_AZALEA: + return true; + case SNOW: + return ((Snow)block.getBlockData()).getLayers() == 1 || ((Snow)block.getBlockData()).getLayers() == 8; + default: + } + } + return false; + } + + public static boolean shouldReplace(Block block, double entityYPos, boolean nether) { + if ((int)entityYPos != block.getLocation().getBlockY()) + return false; + if (nether) { + return false; + } else { + if (block.getType().name().endsWith("_CORAL_FAN") || block.getType().name().endsWith("_CORAL") + || block.getType().name().endsWith("_CORAL_WALL_FAN")) + return true; + if (block.getType().data == Slab.class && ((Slab)block.getBlockData()).getType() == Slab.Type.BOTTOM) + return true; + if (block.getType().data == Stairs.class && !((Stairs)block.getBlockData()).isWaterlogged()) + return true; + if (block.getType().data == Candle.class) + return true; + switch (block.getType()) { + case POINTED_DRIPSTONE: + case SMALL_AMETHYST_BUD: + case MEDIUM_AMETHYST_BUD: + case LARGE_AMETHYST_BUD: + case AMETHYST_CLUSTER: + case SEA_PICKLE: + case LANTERN: + case SOUL_LANTERN: + case CHEST: + case ENDER_CHEST: + case TRAPPED_CHEST: + case CAMPFIRE: + case SOUL_CAMPFIRE: + case CONDUIT: + case LIGHTNING_ROD: + return true; + default: + } + return false; + } + } } 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 b67f98b..85cfce6 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 @@ -16,9 +16,13 @@ public class BotUtils { Material.WATER, Material.LAVA, Material.TWISTING_VINES, + Material.TWISTING_VINES_PLANT, + Material.WEEPING_VINES, + Material.WEEPING_VINES_PLANT, Material.SWEET_BERRY_BUSH, Material.POWDER_SNOW, - Material.COBWEB + Material.COBWEB, + Material.VINE )); public static UUID randomSteveUUID() { 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 2c43618..85aa40f 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 @@ -628,7 +628,9 @@ public class Bot extends ServerPlayer implements Terminator { private boolean canStandOn(Material mat) { if(mat == Material.END_ROD || mat == Material.FLOWER_POT || mat == Material.REPEATER || mat == Material.COMPARATOR || mat == Material.SNOW || mat == Material.LADDER || mat == Material.VINE || mat == Material.SCAFFOLDING - || mat == Material.AZALEA || mat == Material.FLOWERING_AZALEA || mat == Material.BIG_DRIPLEAF) + || mat == Material.AZALEA || mat == Material.FLOWERING_AZALEA || mat == Material.BIG_DRIPLEAF + || mat == Material.CHORUS_FLOWER || mat == Material.CHORUS_PLANT || mat == Material.COCOA + || mat == Material.LILY_PAD || mat == Material.SEA_PICKLE) return true; if(mat.name().endsWith("_CARPET")) From cd275341cbbe2daa8bfffa860538fce5ee1fb254 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Wed, 19 Oct 2022 12:21:10 -0400 Subject: [PATCH 13/30] Finish mlg handling Issues: -Twisting vines placement will delete block standing on (example: if landing with open trapdoor, vines deletes the block) -OnGround does not handle standing on moving pistons --- .../api/agent/legacyagent/LegacyAgent.java | 4 +-- .../api/agent/legacyagent/LegacyMats.java | 25 ++++++++++++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) 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 d6bdd40..b2a3fd1 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 @@ -369,7 +369,7 @@ public class LegacyAgent extends Agent { if (groundLoc == null) return; Location loc = !LegacyMats.shouldReplace(groundLoc.getBlock(), yPos, nether) ? groundLoc.add(0, 1, 0) : groundLoc; - boolean waterloggable = loc.getBlock().getBlockData() instanceof Waterlogged; + boolean waterloggable = !nether && loc.getBlock().getBlockData() instanceof Waterlogged; boolean waterlogged = waterloggable && ((Waterlogged)loc.getBlock().getBlockData()).isWaterlogged(); event.setCancelled(true); @@ -390,7 +390,7 @@ public class LegacyAgent extends Agent { scheduler.runTaskLater(plugin, () -> { Block block = loc.getBlock(); - boolean waterloggedNow = block.getBlockData() instanceof Waterlogged + boolean waterloggedNow = !nether && block.getBlockData() instanceof Waterlogged && ((Waterlogged)block.getBlockData()).isWaterlogged(); if (block.getType() == Material.WATER || waterloggedNow) { bot.look(BlockFace.DOWN); diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java index 48811f0..ae5a399 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java @@ -6,6 +6,7 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.data.Bisected; import org.bukkit.block.data.Waterlogged; +import org.bukkit.block.data.Bisected.Half; import org.bukkit.block.data.type.*; import com.google.common.collect.Lists; @@ -315,6 +316,10 @@ public class LegacyMats { if (block.getType() == Material.LIGHTNING_ROD && !((LightningRod)block.getBlockData()).isWaterlogged() && (((LightningRod)block.getBlockData()).getFacing() == BlockFace.UP || ((LightningRod)block.getBlockData()).getFacing() == BlockFace.DOWN)) return false; + if (block.getType().data == TrapDoor.class && (((TrapDoor)block.getBlockData()).getHalf() == Half.TOP + || (((TrapDoor)block.getBlockData()).getHalf() == Half.BOTTOM && ((TrapDoor)block.getBlockData()).isOpen())) + && !((TrapDoor)block.getBlockData()).isWaterlogged()) + return false; return true; } else { if (block.getType().name().endsWith("_CARPET")) @@ -338,6 +343,8 @@ public class LegacyMats { case END_ROD: case FLOWER_POT: case SCAFFOLDING: + case COMPARATOR: + case REPEATER: return true; default: break; @@ -373,6 +380,14 @@ public class LegacyMats { return false; if (block.getType().data == Gate.class) return false; + if (block.getType() == Material.PISTON_HEAD && ((PistonHead)block.getBlockData()).getFacing() != BlockFace.UP) + return false; + if (block.getType().data == Piston.class && ((Piston)block.getBlockData()).getFacing() != BlockFace.DOWN + && ((Piston)block.getBlockData()).isExtended()) + return false; + if (block.getType().data == TrapDoor.class && (((TrapDoor)block.getBlockData()).getHalf() == Half.BOTTOM + || ((TrapDoor)block.getBlockData()).isOpen())) + return false; switch (block.getType()) { case POINTED_DRIPSTONE: case SMALL_AMETHYST_BUD: @@ -405,10 +420,12 @@ public class LegacyMats { case CONDUIT: case END_PORTAL_FRAME: case FARMLAND: - case LADDER: case DAYLIGHT_DETECTOR: + case HONEY_BLOCK: case HOPPER: case LIGHTNING_ROD: + case SCULK_SENSOR: + case SCULK_SHRIEKER: return false; default: } @@ -441,8 +458,12 @@ public class LegacyMats { return true; if (block.getType().data == Stairs.class && !((Stairs)block.getBlockData()).isWaterlogged()) return true; + if (block.getType().data == Chain.class && !((Chain)block.getBlockData()).isWaterlogged()) + return true; if (block.getType().data == Candle.class) return true; + if (block.getType().data == TrapDoor.class && !((TrapDoor)block.getBlockData()).isWaterlogged()) + return true; switch (block.getType()) { case POINTED_DRIPSTONE: case SMALL_AMETHYST_BUD: @@ -459,6 +480,8 @@ public class LegacyMats { case SOUL_CAMPFIRE: case CONDUIT: case LIGHTNING_ROD: + case SCULK_SENSOR: + case SCULK_SHRIEKER: return true; default: } From 5d766d6a171af778f6365ce03dda6ac8b48ea1e7 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Wed, 19 Oct 2022 15:35:03 -0400 Subject: [PATCH 14/30] Fix regen after death on block damages --- .../src/main/java/net/nuggetmc/tplus/bot/Bot.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 85aa40f..68b0b02 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 @@ -293,6 +293,8 @@ public class Bot extends ServerPlayer implements Terminator { } updateLocation(); + + if (!isAlive()) return; float health = getHealth(); float maxHealth = getMaxHealth(); @@ -704,7 +706,7 @@ public class Bot extends ServerPlayer implements Terminator { // this should fix the concurrentmodificationexception mentioned above, I used the ConcurrentHashMap.newKeySet to make a "ConcurrentHashSet" plugin.getManager().remove(this); - scheduler.runTaskLater(plugin, this::removeBot, 30); + scheduler.runTaskLater(plugin, this::removeBot, 20); this.removeTab(); } From a6accf1501c9b5d8840f3dedb10ff4a08e8792db Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Fri, 21 Oct 2022 16:17:53 -0400 Subject: [PATCH 15/30] Fix invulnerable time ticking twice The variable is already ticked down at the super() call. --- .../main/java/net/nuggetmc/tplus/bot/Bot.java | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) 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 68b0b02..ef63e98 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 @@ -282,7 +282,6 @@ public class Bot extends ServerPlayer implements Terminator { aliveTicks++; if (fireTicks > 0) --fireTicks; - if (invulnerableTime > 0) --invulnerableTime; if (jumpTicks > 0) --jumpTicks; if (noFallTicks > 0) --noFallTicks; @@ -355,10 +354,10 @@ public class Bot extends ServerPlayer implements Terminator { if (invulnerableTime == 0) { if (lava) { hurt(DamageSource.LAVA, 4); - invulnerableTime = 20;//this used to be 12 ticks but that would cause the bot to take damage too quickly + invulnerableTime = 10; } else if (fireTicks > 1) { hurt(DamageSource.IN_FIRE, 1); - invulnerableTime = 20; + invulnerableTime = 10; } } @@ -939,17 +938,6 @@ public class Bot extends ServerPlayer implements Terminator { @Override public void doTick() { - if (this.hurtTime > 0) { - this.hurtTime -= 1; - } - baseTick(); - tickEffects(); - - this.animStepO = (int) this.animStep; - this.yBodyRotO = this.yBodyRot; - this.yHeadRotO = this.yHeadRot; - this.yRotO = this.getYRot(); - this.xRotO = this.getXRot(); } } From 9350b6fba30e4b0fd46b8fa9cc917481fb1299b6 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Sun, 6 Nov 2022 18:51:02 -0500 Subject: [PATCH 16/30] Pre-clutch before landing If block cannot be mlged on --- .../net/nuggetmc/tplus/api/Terminator.java | 6 ++ .../api/agent/legacyagent/LegacyAgent.java | 20 ++-- .../agent/legacyagent/LegacyBlockCheck.java | 93 +++++++++++++++++++ .../api/agent/legacyagent/LegacyMats.java | 32 ++++++- .../main/java/net/nuggetmc/tplus/bot/Bot.java | 37 +++----- 5 files changed, 152 insertions(+), 36 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 328a4ad..6fb50ce 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 @@ -4,12 +4,14 @@ import com.mojang.authlib.GameProfile; import net.nuggetmc.tplus.api.agent.legacyagent.ai.NeuralNetwork; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; +import org.bukkit.util.BoundingBox; import org.bukkit.util.Vector; import java.util.List; @@ -32,6 +34,8 @@ public interface Terminator { boolean hasNeuralNetwork(); Location getLocation(); + + BoundingBox getBotBoundingBox(); boolean isBotAlive(); //Has to be named like this because paper re-obfuscates it @@ -120,4 +124,6 @@ public interface Terminator { UUID getTargetPlayer(); void setTargetPlayer(UUID target); + + World.Environment getDimension(); } 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 b2a3fd1..2bd0d4c 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 @@ -26,6 +26,8 @@ import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.BoundingBox; import org.bukkit.util.Vector; +import com.google.common.base.Optional; + import java.util.*; import java.util.Map.Entry; import java.util.regex.Pattern; @@ -107,6 +109,8 @@ public class LegacyAgent extends Agent { Location loc = bot.getLocation(); LivingEntity livingTarget = locateTarget(bot, loc); + blockCheck.tryPreMLG(bot, loc); + if (livingTarget == null) { stopMining(bot); return; @@ -297,7 +301,7 @@ public class LegacyAgent extends Agent { Material itemType; - if (bot.getBukkitEntity().getWorld().getEnvironment() == World.Environment.NETHER) { + if (bot.getDimension() == World.Environment.NETHER) { itemType = Material.TWISTING_VINES; } else { itemType = Material.WATER_BUCKET; @@ -339,7 +343,7 @@ public class LegacyAgent extends Agent { Material placeType; Sound sound; Location groundLoc = null; - boolean nether = bot.getBukkitEntity().getWorld().getEnvironment() == World.Environment.NETHER; + boolean nether = bot.getDimension() == World.Environment.NETHER; double yPos = bot.getBukkitEntity().getLocation().getY(); if (nether) { @@ -359,7 +363,7 @@ public class LegacyAgent extends Agent { placeType = Material.WATER; for (Block block : event.getStandingOn()) { - if (LegacyMats.canPlaceWater(block, yPos)) { + if (LegacyMats.canPlaceWater(block, Optional.of(yPos))) { groundLoc = block.getLocation(); break; } @@ -1203,7 +1207,7 @@ public class LegacyAgent extends Agent { Location loc = bot.getLocation(); if (bot.isBotOnFire()) { - if (bot.getBukkitEntity().getWorld().getEnvironment() != World.Environment.NETHER) { + if (bot.getDimension() != World.Environment.NETHER) { placeWaterDown(bot, world, loc); } } @@ -1211,7 +1215,7 @@ public class LegacyAgent extends Agent { Material atType = loc.getBlock().getType(); if (atType == Material.FIRE || atType == Material.SOUL_FIRE) { - if (bot.getBukkitEntity().getWorld().getEnvironment() != World.Environment.NETHER) { + if (bot.getDimension() != World.Environment.NETHER) { placeWaterDown(bot, world, loc); world.playSound(loc, Sound.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 1, 1); } else { @@ -1223,7 +1227,7 @@ public class LegacyAgent extends Agent { } if (atType == Material.LAVA) { - if (bot.getBukkitEntity().getWorld().getEnvironment() == World.Environment.NETHER) { + if (bot.getDimension() == World.Environment.NETHER) { bot.attemptBlockPlace(loc, Material.COBBLESTONE, false); } else { placeWaterDown(bot, world, loc); @@ -1234,7 +1238,7 @@ public class LegacyAgent extends Agent { Material headType = head.getBlock().getType(); if (headType == Material.LAVA) { - if (bot.getBukkitEntity().getWorld().getEnvironment() == World.Environment.NETHER) { + if (bot.getDimension() == World.Environment.NETHER) { bot.attemptBlockPlace(head, Material.COBBLESTONE, false); } else { placeWaterDown(bot, world, head); @@ -1242,7 +1246,7 @@ public class LegacyAgent extends Agent { } if (headType == Material.FIRE || headType == Material.SOUL_FIRE) { - if (bot.getBukkitEntity().getWorld().getEnvironment() == World.Environment.NETHER) { + if (bot.getDimension() == World.Environment.NETHER) { bot.look(BlockFace.DOWN); bot.punch(); world.playSound(head, Sound.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 1, 1); diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyBlockCheck.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyBlockCheck.java index a9c2d12..54f290c 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyBlockCheck.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyBlockCheck.java @@ -1,16 +1,25 @@ package net.nuggetmc.tplus.api.agent.legacyagent; import net.nuggetmc.tplus.api.Terminator; +import net.nuggetmc.tplus.api.utils.BotUtils; + import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.data.Waterlogged; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; +import org.bukkit.util.BoundingBox; +import com.google.common.base.Optional; + +import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; +import java.util.Iterator; +import java.util.List; import java.util.Set; public class LegacyBlockCheck { @@ -135,6 +144,90 @@ public class LegacyBlockCheck { all.playSound(loc, Sound.BLOCK_STONE_PLACE, SoundCategory.BLOCKS, 1, 1); placeFinal(bot, player, block.getLocation()); } + + public boolean tryPreMLG(Terminator bot, Location botLoc) { + if(bot.isBotOnGround() || bot.getVelocity().getY() >= -0.8D) + return false; + if (tryPreMLG(bot, botLoc, 3)) + return true; + return tryPreMLG(bot, botLoc, 2); + } + + private boolean tryPreMLG(Terminator bot, Location botLoc, int blocksBelow) { + BoundingBox box = bot.getBotBoundingBox(); + double[] xVals = new double[]{ + box.getMinX(), + box.getMaxX() - 0.01 + }; + + double[] zVals = new double[]{ + box.getMinZ(), + box.getMaxZ() - 0.01 + }; + Set below2Set = new HashSet<>(); + + for (double x : xVals) { + for (double z : zVals) { + Location below = botLoc.clone(); + below.setX(x); + below.setZ(z); + below.setY(bot.getLocation().getBlockY()); + for (int i = 0; i < blocksBelow - 1; i++) { + below.setY(below.getY() - 1); + + // Blocks before must all be pass-through + Material type = below.getBlock().getType(); + if (type.isSolid() || LegacyMats.canStandOn(type)) + return false; + below = below.clone(); + } + below.setY(bot.getLocation().getBlockY() - blocksBelow); + below2Set.add(below.getBlock().getLocation()); + } + } + + // Second block below must have at least one unplaceable block (that is landable) + boolean nether = bot.getDimension() == World.Environment.NETHER; + Iterator itr = below2Set.iterator(); + while (itr.hasNext()) { + Block next = itr.next().getBlock(); + boolean placeable = nether ? LegacyMats.canPlaceTwistingVines(next) + : LegacyMats.canPlaceWater(next, Optional.absent()); + if (placeable || (!next.getType().isSolid() && !LegacyMats.canStandOn(next.getType()))) + itr.remove(); + } + + // Clutch + if (!below2Set.isEmpty()) { + List below2List = new ArrayList<>(below2Set); + below2List.sort((a, b) -> { + Block aBlock = a.clone().add(0, 1, 0).getBlock(); + Block bBlock = b.clone().add(0, 1, 0).getBlock(); + if (aBlock.getType().isAir() && !bBlock.getType().isAir()) + return -1; + if (!bBlock.getType().isAir() && aBlock.getType().isAir()) + return 1; + return Double.compare(BotUtils.getHorizSqDist(a, botLoc), BotUtils.getHorizSqDist(b, botLoc)); + }); + + Location faceLoc = below2List.get(0); + Location loc = faceLoc.clone().add(0, 1, 0); + bot.faceLocation(faceLoc); + bot.look(BlockFace.DOWN); + + Bukkit.getScheduler().runTaskLater(plugin, () -> { + bot.faceLocation(faceLoc); + }, 1); + + bot.punch(); + for (Player all : Bukkit.getOnlinePlayers()) + all.playSound(loc, Sound.BLOCK_STONE_PLACE, SoundCategory.BLOCKS, 1, 1); + bot.setItem(new ItemStack(Material.COBBLESTONE)); + loc.getBlock().setType(Material.COBBLESTONE); + } + + return false; + } public void clutch(Terminator bot, LivingEntity target) { Location botLoc = bot.getLocation(); diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java index ae5a399..9e00c02 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java @@ -8,6 +8,8 @@ import org.bukkit.block.data.Bisected; import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.Bisected.Half; import org.bukkit.block.data.type.*; + +import com.google.common.base.Optional; import com.google.common.collect.Lists; import java.util.ArrayList; @@ -292,7 +294,32 @@ public class LegacyMats { return materials; } - public static boolean canPlaceWater(Block block, double entityYPos) { + /** + * Checks for non-solid blocks that can hold an entity up. + */ + public static boolean canStandOn(Material mat) { + if(mat == Material.END_ROD || mat == Material.FLOWER_POT || mat == Material.REPEATER || mat == Material.COMPARATOR + || mat == Material.SNOW || mat == Material.LADDER || mat == Material.VINE || mat == Material.SCAFFOLDING + || mat == Material.AZALEA || mat == Material.FLOWERING_AZALEA || mat == Material.BIG_DRIPLEAF + || mat == Material.CHORUS_FLOWER || mat == Material.CHORUS_PLANT || mat == Material.COCOA + || mat == Material.LILY_PAD || mat == Material.SEA_PICKLE) + return true; + + if(mat.name().endsWith("_CARPET")) + return true; + + if(mat.name().startsWith("POTTED_")) + return true; + + if((mat.name().endsWith("_HEAD") || mat.name().endsWith("_SKULL")) && !mat.name().equals("PISTON_HEAD")) + return true; + + if(mat.data == Candle.class) + return true; + return false; + } + + public static boolean canPlaceWater(Block block, Optional entityYPos) { if (block.getType().isSolid()) { if (block.getType() == Material.CHAIN && ((Chain)block.getBlockData()).getAxis() == Axis.Y && !((Chain)block.getBlockData()).isWaterlogged()) @@ -308,7 +335,8 @@ public class LegacyMats { && !((Stairs)block.getBlockData()).isWaterlogged()) return false; if (block.getType().data == Stairs.class && ((Stairs)block.getBlockData()).getHalf() == Bisected.Half.BOTTOM - && !((Stairs)block.getBlockData()).isWaterlogged() && (int)entityYPos != block.getLocation().getBlockY()) + && !((Stairs)block.getBlockData()).isWaterlogged() + && (!entityYPos.isPresent() || (int)entityYPos.get().doubleValue() != block.getLocation().getBlockY())) return false; if ((block.getType().data == Fence.class || block.getType().data == Wall.class) && !((Waterlogged)block.getBlockData()).isWaterlogged()) 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 ef63e98..9ef3a15 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 @@ -582,7 +582,7 @@ public class Bot extends ServerPlayer implements Terminator { Location loc = new Location(world, x, position().y - 0.01, z); Block block = world.getBlockAt(loc); - if ((block.getType().isSolid() || canStandOn(block.getType())) && BotUtils.overlaps(playerBox, block.getBoundingBox())) { + if ((block.getType().isSolid() || LegacyMats.canStandOn(block.getType())) && BotUtils.overlaps(playerBox, block.getBoundingBox())) { if (!locations.contains(block.getLocation())) { standingOn.add(block); locations.add(block.getLocation()); @@ -623,31 +623,6 @@ public class Bot extends ServerPlayer implements Terminator { return standingOn; } - /** - * Checks for non-solid blocks that can hold an entity up. - */ - private boolean canStandOn(Material mat) { - if(mat == Material.END_ROD || mat == Material.FLOWER_POT || mat == Material.REPEATER || mat == Material.COMPARATOR - || mat == Material.SNOW || mat == Material.LADDER || mat == Material.VINE || mat == Material.SCAFFOLDING - || mat == Material.AZALEA || mat == Material.FLOWERING_AZALEA || mat == Material.BIG_DRIPLEAF - || mat == Material.CHORUS_FLOWER || mat == Material.CHORUS_PLANT || mat == Material.COCOA - || mat == Material.LILY_PAD || mat == Material.SEA_PICKLE) - return true; - - if(mat.name().endsWith("_CARPET")) - return true; - - if(mat.name().startsWith("POTTED_")) - return true; - - if((mat.name().endsWith("_HEAD") || mat.name().endsWith("_SKULL")) && !mat.name().equals("PISTON_HEAD")) - return true; - - if(mat.data == Candle.class) - return true; - return false; - } - @Override public boolean isBotOnGround() { return groundTicks != 0; @@ -824,6 +799,11 @@ public class Bot extends ServerPlayer implements Terminator { public Location getLocation() { return getBukkitEntity().getLocation(); } + + @Override + public BoundingBox getBotBoundingBox() { + return getBukkitEntity().getBoundingBox(); + } @Override public void setBotPitch(float pitch) { @@ -940,4 +920,9 @@ public class Bot extends ServerPlayer implements Terminator { public void doTick() { baseTick(); } + + @Override + public World.Environment getDimension() { + return getBukkitEntity().getWorld().getEnvironment(); + } } From 765c3d6fb409f9ed339d8c8e9d1e484fb8f84527 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Sat, 19 Nov 2022 15:58:20 -0500 Subject: [PATCH 17/30] Option to add bots to player list -Useful for datapacks that may use commands that target players -This will count towards the player count --- .../net/nuggetmc/tplus/api/BotManager.java | 3 +++ .../net/nuggetmc/tplus/api/Terminator.java | 2 ++ .../api/agent/legacyagent/LegacyAgent.java | 12 +++++---- .../main/java/net/nuggetmc/tplus/bot/Bot.java | 25 ++++++++++++++++--- .../nuggetmc/tplus/bot/BotManagerImpl.java | 12 +++++++++ .../tplus/command/commands/BotCommand.java | 19 +++++++++++++- 6 files changed, 63 insertions(+), 10 deletions(-) diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/BotManager.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/BotManager.java index 5d37bea..a04bc76 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/BotManager.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/BotManager.java @@ -50,4 +50,7 @@ public interface BotManager { void setMobTarget(boolean mobTarget); + boolean addToPlayerList(); + + void setAddToPlayerList(boolean addPlayerList); } 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 6fb50ce..c43f686 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 @@ -125,5 +125,7 @@ public interface Terminator { void setTargetPlayer(UUID target); + boolean isInPlayerList(); + World.Environment getDimension(); } 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 2bd0d4c..4b789b6 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 @@ -50,6 +50,7 @@ public class LegacyAgent extends Agent { private final Map mining = new HashMap<>(); private final Set fallDamageCooldown = new HashSet<>(); public boolean offsets = true; + private List botEntityCache; private EnumTargetGoal goal; private BoundingBox region; private double regionWeightX; @@ -69,7 +70,8 @@ public class LegacyAgent extends Agent { @Override protected void tick() { - manager.fetch().forEach(this::tickBot); + botEntityCache = manager.fetch().stream().filter(t -> t.isInPlayerList()).map(b -> b.getBukkitEntity()).toList(); + manager.fetch().forEach(this::tickBot); } private void center(Terminator bot) { @@ -1426,7 +1428,7 @@ public class LegacyAgent extends Agent { this.goal = goal; } - public LivingEntity locateTarget(Terminator bot, Location loc, EnumTargetGoal... targetGoal) { + private LivingEntity locateTarget(Terminator bot, Location loc, EnumTargetGoal... targetGoal) { LivingEntity result = null; EnumTargetGoal g = goal; @@ -1437,7 +1439,7 @@ public class LegacyAgent extends Agent { case NEAREST_PLAYER: { for (Player player : Bukkit.getOnlinePlayers()) { - if (validateCloserEntity(player, loc, result)) { + if (!botEntityCache.contains(player) && validateCloserEntity(player, loc, result)) { result = player; } } @@ -1447,7 +1449,7 @@ public class LegacyAgent extends Agent { case NEAREST_VULNERABLE_PLAYER: { for (Player player : Bukkit.getOnlinePlayers()) { - if (!PlayerUtils.isInvincible(player.getGameMode()) && validateCloserEntity(player, loc, result)) { + if (!botEntityCache.contains(player) && !PlayerUtils.isInvincible(player.getGameMode()) && validateCloserEntity(player, loc, result)) { result = player; } } @@ -1521,7 +1523,7 @@ public class LegacyAgent extends Agent { case PLAYER: { //Target a single player. Defaults to NEAREST_VULNERABLE_PLAYER if no player found. if (bot.getTargetPlayer() != null) { Player player = Bukkit.getPlayer(bot.getTargetPlayer()); - if (player != null && validateCloserEntity(player, loc, null)) { + if (player != null && !botEntityCache.contains(player) && validateCloserEntity(player, loc, null)) { return player; } } 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 9ef3a15..c8dacd6 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 @@ -35,7 +35,6 @@ import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.data.Waterlogged; -import org.bukkit.block.data.type.Candle; import org.bukkit.craftbukkit.v1_19_R1.CraftEquipmentSlot; import org.bukkit.craftbukkit.v1_19_R1.CraftServer; import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; @@ -78,7 +77,9 @@ public class Bot extends ServerPlayer implements Terminator { private byte noFallTicks; private List standingOn = new ArrayList<>(); private UUID targetPlayer = null; - private Bot(MinecraftServer minecraftServer, ServerLevel worldServer, GameProfile profile) { + private boolean inPlayerList; + + private Bot(MinecraftServer minecraftServer, ServerLevel worldServer, GameProfile profile, boolean addToPlayerList) { super(minecraftServer, worldServer, profile, null); this.plugin = TerminatorPlus.getInstance(); @@ -91,6 +92,10 @@ public class Bot extends ServerPlayer implements Terminator { this.fireTicks = 0; this.removeOnDeath = true; this.offset = MathUtils.circleOffset(3); + if (addToPlayerList) { + minecraftServer.getPlayerList().getPlayers().add(this); + inPlayerList = true; + } //this.entityData.set(new EntityDataAccessor<>(16, EntityDataSerializers.BYTE), (byte) 0xFF); } @@ -106,8 +111,10 @@ public class Bot extends ServerPlayer implements Terminator { UUID uuid = BotUtils.randomSteveUUID(); CustomGameProfile profile = new CustomGameProfile(uuid, ChatUtils.trim16(name), skin); + + boolean addPlayerList = TerminatorPlus.getInstance().getManager().addToPlayerList(); - Bot bot = new Bot(nmsServer, nmsWorld, profile); + Bot bot = new Bot(nmsServer, nmsWorld, profile, addPlayerList); bot.connection = new ServerGamePacketListenerImpl(nmsServer, new Connection(PacketFlow.CLIENTBOUND) { @@ -122,7 +129,10 @@ public class Bot extends ServerPlayer implements Terminator { bot.getBukkitEntity().setNoDamageTicks(0); Bukkit.getOnlinePlayers().forEach(p -> ((CraftPlayer) p).getHandle().connection.send( new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, bot))); - nmsWorld.addFreshEntity(bot); + if (addPlayerList) + nmsWorld.addNewPlayer(bot); + else + nmsWorld.addFreshEntity(bot); bot.renderAll(); TerminatorPlus.getInstance().getManager().add(bot); @@ -653,6 +663,8 @@ public class Bot extends ServerPlayer implements Terminator { scheduler.runTask(plugin, () -> this.remove(RemovalReason.DISCARDED)); } this.removeVisually(); + if (inPlayerList) + this.server.getPlayerList().getPlayers().remove(this); } private void removeTab() { @@ -921,6 +933,11 @@ public class Bot extends ServerPlayer implements Terminator { baseTick(); } + @Override + public boolean isInPlayerList() { + return inPlayerList; + } + @Override public World.Environment getDimension() { return getBukkitEntity().getWorld().getEnvironment(); diff --git a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java index 38d25db..aaec0d0 100644 --- a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java +++ b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java @@ -35,6 +35,8 @@ public class BotManagerImpl implements BotManager, Listener { public boolean joinMessages = false; private boolean mobTarget = false; + private boolean addPlayerList = false; + public BotManagerImpl() { this.agent = new LegacyAgent(this, TerminatorPlus.getInstance()); this.bots = ConcurrentHashMap.newKeySet(); //should fix concurrentmodificationexception @@ -213,6 +215,16 @@ public class BotManagerImpl implements BotManager, Listener { public void setMobTarget(boolean mobTarget) { this.mobTarget = mobTarget; } + + @Override + public boolean addToPlayerList() { + return addPlayerList; + } + + @Override + public void setAddToPlayerList(boolean addPlayerList) { + this.addPlayerList = addPlayerList; + } @EventHandler public void onJoin(PlayerJoinEvent event) { diff --git a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java index 2d2b729..7a13905 100644 --- a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java +++ b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java @@ -287,12 +287,13 @@ public class BotCommand extends CommandInstance { String extra = ChatColor.GRAY + " [" + ChatColor.YELLOW + "/bot settings" + ChatColor.GRAY + "]"; if (arg1 == null || ((!arg1.equalsIgnoreCase("setgoal")) && !arg1.equalsIgnoreCase("mobtarget") && !arg1.equalsIgnoreCase("playertarget") - && !arg1.equalsIgnoreCase("region"))) { + && !arg1.equalsIgnoreCase("addplayerlist") && !arg1.equalsIgnoreCase("region"))) { sender.sendMessage(ChatUtils.LINE); sender.sendMessage(ChatColor.GOLD + "Bot Settings" + extra); sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "setgoal" + ChatUtils.BULLET_FORMATTED + "Set the global bot target selection method."); sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "mobtarget" + ChatUtils.BULLET_FORMATTED + "Allow all bots to be targeted by hostile mobs."); sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "playertarget" + ChatUtils.BULLET_FORMATTED + "Sets a player name for spawned bots to focus on if the goal is PLAYER."); + sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "addplayerlist" + ChatUtils.BULLET_FORMATTED + "Adds newly spawned bots to the player list. This allows the bots to be affected by player selectors like @a and @p."); sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "region" + ChatUtils.BULLET_FORMATTED + "Sets a region for the bots to prioritize entities inside."); sender.sendMessage(ChatUtils.LINE); return; @@ -341,6 +342,17 @@ public class BotCommand extends CommandInstance { fetch.setTargetPlayer(player.getUniqueId()); } sender.sendMessage("All spawned bots are now set to target " + ChatColor.BLUE + player.getName() + ChatColor.RESET + ". They will target the closest player if they can't be found.\nYou may need to set the goal to PLAYER."); + } else if (arg1.equalsIgnoreCase("addplayerlist")) { + if (arg2 == null) { + sender.sendMessage("Adding bots to the player list is currently " + (manager.addToPlayerList() ? ChatColor.GREEN + "enabled" : ChatColor.RED + "disabled") + ChatColor.RESET + "."); + return; + } + if (!arg2.equals("true") && !arg2.equals("false")) { + sender.sendMessage(ChatColor.RED + "You must specify true or false!"); + return; + } + manager.setAddToPlayerList(Boolean.parseBoolean(arg2)); + sender.sendMessage("Adding bots to the player list is now " + (manager.addToPlayerList() ? ChatColor.GREEN + "enabled" : ChatColor.RED + "disabled") + ChatColor.RESET + "."); } else if (arg1.equalsIgnoreCase("region")) { if (arg2 == null) { if (agent.getRegion() == null) { @@ -430,6 +442,7 @@ public class BotCommand extends CommandInstance { output.add("setgoal"); output.add("mobtarget"); output.add("playertarget"); + output.add("addplayerlist"); output.add("region"); } else if (args.length == 3) { if (args[1].equalsIgnoreCase("setgoal")) { @@ -444,6 +457,10 @@ public class BotCommand extends CommandInstance { output.add(player.getName()); } } + if (args[1].equalsIgnoreCase("addplayerlist")) { + output.add("true"); + output.add("false"); + } } return output; From d3456b5290e26a63891b4da44b511684d2648d10 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Sat, 19 Nov 2022 16:00:07 -0500 Subject: [PATCH 18/30] Refactor variable --- .../tplus/api/agent/legacyagent/LegacyAgent.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 4b789b6..ef98b21 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 @@ -50,7 +50,7 @@ public class LegacyAgent extends Agent { private final Map mining = new HashMap<>(); private final Set fallDamageCooldown = new HashSet<>(); public boolean offsets = true; - private List botEntityCache; + private List botsInPlayerList; private EnumTargetGoal goal; private BoundingBox region; private double regionWeightX; @@ -70,7 +70,7 @@ public class LegacyAgent extends Agent { @Override protected void tick() { - botEntityCache = manager.fetch().stream().filter(t -> t.isInPlayerList()).map(b -> b.getBukkitEntity()).toList(); + botsInPlayerList = manager.fetch().stream().filter(t -> t.isInPlayerList()).map(b -> b.getBukkitEntity()).toList(); manager.fetch().forEach(this::tickBot); } @@ -1439,7 +1439,7 @@ public class LegacyAgent extends Agent { case NEAREST_PLAYER: { for (Player player : Bukkit.getOnlinePlayers()) { - if (!botEntityCache.contains(player) && validateCloserEntity(player, loc, result)) { + if (!botsInPlayerList.contains(player) && validateCloserEntity(player, loc, result)) { result = player; } } @@ -1449,7 +1449,7 @@ public class LegacyAgent extends Agent { case NEAREST_VULNERABLE_PLAYER: { for (Player player : Bukkit.getOnlinePlayers()) { - if (!botEntityCache.contains(player) && !PlayerUtils.isInvincible(player.getGameMode()) && validateCloserEntity(player, loc, result)) { + if (!botsInPlayerList.contains(player) && !PlayerUtils.isInvincible(player.getGameMode()) && validateCloserEntity(player, loc, result)) { result = player; } } @@ -1523,7 +1523,7 @@ public class LegacyAgent extends Agent { case PLAYER: { //Target a single player. Defaults to NEAREST_VULNERABLE_PLAYER if no player found. if (bot.getTargetPlayer() != null) { Player player = Bukkit.getPlayer(bot.getTargetPlayer()); - if (player != null && !botEntityCache.contains(player) && validateCloserEntity(player, loc, null)) { + if (player != null && !botsInPlayerList.contains(player) && validateCloserEntity(player, loc, null)) { return player; } } From a829cdf70184379c2d7feea6bae7c4ab11756774 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Mon, 21 Nov 2022 16:26:53 -0500 Subject: [PATCH 19/30] Fix doTick() not being called Fixes potion ticking and fire damage effects --- .../net/nuggetmc/tplus/api/Terminator.java | 4 -- .../main/java/net/nuggetmc/tplus/bot/Bot.java | 58 +------------------ .../net/nuggetmc/tplus/utils/Debugger.java | 4 -- 3 files changed, 3 insertions(+), 63 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 c43f686..a54919c 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 @@ -43,8 +43,6 @@ public interface Terminator { float getBotMaxHealth(); - void ignite(); - boolean isBotOnFire(); boolean isFalling(); @@ -119,8 +117,6 @@ public interface Terminator { void renderBot(Object packetListener, boolean login); - void setOnFirePackets(boolean onFire); - UUID getTargetPlayer(); void setTargetPlayer(UUID target); 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 c8dacd6..69b3d77 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 @@ -71,7 +71,6 @@ public class Bot extends ServerPlayer implements Terminator { private boolean removeOnDeath; private int aliveTicks; private int kills; - private byte fireTicks; // Fire animation isn't played? Bot still takes damage. private byte groundTicks; private byte jumpTicks; private byte noFallTicks; @@ -89,7 +88,6 @@ public class Bot extends ServerPlayer implements Terminator { this.velocity = new Vector(0, 0, 0); this.oldVelocity = velocity.clone(); this.noFallTicks = 60; - this.fireTicks = 0; this.removeOnDeath = true; this.offset = MathUtils.circleOffset(3); if (addToPlayerList) { @@ -291,7 +289,6 @@ public class Bot extends ServerPlayer implements Terminator { aliveTicks++; - if (fireTicks > 0) --fireTicks; if (jumpTicks > 0) --jumpTicks; if (noFallTicks > 0) --noFallTicks; @@ -318,14 +315,11 @@ public class Bot extends ServerPlayer implements Terminator { setHealth(amount); - fireDamageCheck(); fallDamageCheck(); - if (position().y < -64) { - die(DamageSource.OUT_OF_WORLD); - } - oldVelocity = velocity.clone(); + + doTick(); } private void loadChunks() { @@ -342,52 +336,6 @@ public class Bot extends ServerPlayer implements Terminator { } } - private void fireDamageCheck() { - if (!isAlive()) { - return; // maybe also have packet reset thing - } - - Material type = getLocation().getBlock().getType(); - - if (type == Material.WATER) { - setOnFirePackets(false); // maybe also play extinguish noise? - fireTicks = 0; - return; - } - - boolean lava = type == org.bukkit.Material.LAVA; - - if (lava || type == org.bukkit.Material.FIRE || type == Material.SOUL_FIRE) { - ignite(); - } - - if (invulnerableTime == 0) { - if (lava) { - hurt(DamageSource.LAVA, 4); - invulnerableTime = 10; - } else if (fireTicks > 1) { - hurt(DamageSource.IN_FIRE, 1); - invulnerableTime = 10; - } - } - - if (fireTicks == 1) { - setOnFirePackets(false); - } - } - - @Override - public void ignite() { - if (fireTicks <= 1) setOnFirePackets(true); - fireTicks = 100; - } - - @Override - public void setOnFirePackets(boolean onFire) { - //entityData.set(new EntityDataAccessor<>(0, EntityDataSerializers.BYTE), onFire ? (byte) 1 : (byte) 0); - //sendPacket(new ClientboundSetEntityDataPacket(getId(), entityData, false)); - } - @Override public UUID getTargetPlayer() { return targetPlayer; @@ -400,7 +348,7 @@ public class Bot extends ServerPlayer implements Terminator { @Override public boolean isBotOnFire() { - return fireTicks != 0; + return this.isOnFire(); } private void fallDamageCheck() { // TODO create a better bot event system in the future, also have bot.getAgent() diff --git a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/utils/Debugger.java b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/utils/Debugger.java index 42a5caf..e3fcfb8 100644 --- a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/utils/Debugger.java +++ b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/utils/Debugger.java @@ -365,10 +365,6 @@ public class Debugger { print("This has been established as a feature as \"" + ChatColor.AQUA + "/bot settings setgoal" + ChatColor.RESET + "\"!"); } - public void fire(boolean b) { - TerminatorPlus.getInstance().getManager().fetch().forEach(bot -> bot.setOnFirePackets(b)); - } - public void trackYVel() { if (!(sender instanceof Player)) return; From 0e4a5e171fa79c71d97d3c10e67b786498faa06f Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Wed, 23 Nov 2022 17:49:44 -0500 Subject: [PATCH 20/30] Spawn bots at location feature --- .../net/nuggetmc/tplus/api/BotManager.java | 4 ++ .../nuggetmc/tplus/bot/BotManagerImpl.java | 24 +++++++++++- .../tplus/command/commands/BotCommand.java | 37 ++++++++++++++++++- 3 files changed, 62 insertions(+), 3 deletions(-) diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/BotManager.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/BotManager.java index a04bc76..613d787 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/BotManager.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/BotManager.java @@ -10,6 +10,10 @@ import java.util.Set; import java.util.UUID; public interface BotManager { + Location getSpawnLoc(); + + void setSpawnLoc(Location loc); + Set fetch(); Agent getAgent(); diff --git a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java index aaec0d0..b4a9486 100644 --- a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java +++ b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/BotManagerImpl.java @@ -36,12 +36,23 @@ public class BotManagerImpl implements BotManager, Listener { public boolean joinMessages = false; private boolean mobTarget = false; private boolean addPlayerList = false; + private Location spawnLoc; public BotManagerImpl() { this.agent = new LegacyAgent(this, TerminatorPlus.getInstance()); this.bots = ConcurrentHashMap.newKeySet(); //should fix concurrentmodificationexception this.numberFormat = NumberFormat.getInstance(Locale.US); } + + @Override + public Location getSpawnLoc() { + return spawnLoc; + } + + @Override + public void setSpawnLoc(Location loc) { + spawnLoc = loc; + } @Override public Set fetch() { @@ -110,7 +121,18 @@ public class BotManagerImpl implements BotManager, Listener { skinName = skinName == null ? name : skinName; - createBots(sender.getLocation(), name, MojangAPI.getSkin(skinName), n, network); + if (spawnLoc != null) { + sender.sendMessage("The spawn location is " + + ChatColor.BLUE + String.format("(%s, %s, %s)", spawnLoc.getX(), spawnLoc.getY(), spawnLoc.getZ()) + ChatColor.RESET + + ". This will be reset to the player location next time."); + Location loc = sender.getLocation().clone(); + loc.setX(spawnLoc.getX()); + loc.setY(spawnLoc.getY()); + loc.setZ(spawnLoc.getZ()); + createBots(loc, name, MojangAPI.getSkin(skinName), n, network); + spawnLoc = null; + } else + createBots(sender.getLocation(), name, MojangAPI.getSkin(skinName), n, network); sender.sendMessage("Process completed (" + ChatColor.RED + ((System.currentTimeMillis() - timestamp) / 1000D) + "s" + ChatColor.RESET + ")."); } diff --git a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java index 7a13905..6b1d2f0 100644 --- a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java +++ b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java @@ -286,10 +286,11 @@ public class BotCommand extends CommandInstance { String extra = ChatColor.GRAY + " [" + ChatColor.YELLOW + "/bot settings" + ChatColor.GRAY + "]"; - if (arg1 == null || ((!arg1.equalsIgnoreCase("setgoal")) && !arg1.equalsIgnoreCase("mobtarget") && !arg1.equalsIgnoreCase("playertarget") + if (arg1 == null || (!arg1.equalsIgnoreCase("spawnloc") && !arg1.equalsIgnoreCase("setgoal") && !arg1.equalsIgnoreCase("mobtarget") && !arg1.equalsIgnoreCase("playertarget") && !arg1.equalsIgnoreCase("addplayerlist") && !arg1.equalsIgnoreCase("region"))) { sender.sendMessage(ChatUtils.LINE); sender.sendMessage(ChatColor.GOLD + "Bot Settings" + extra); + sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "spawnloc" + ChatUtils.BULLET_FORMATTED + "Set the location where the bots should spawn. This will be reset after a spawn command is executed."); sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "setgoal" + ChatUtils.BULLET_FORMATTED + "Set the global bot target selection method."); sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "mobtarget" + ChatUtils.BULLET_FORMATTED + "Allow all bots to be targeted by hostile mobs."); sender.sendMessage(ChatUtils.BULLET_FORMATTED + ChatColor.YELLOW + "playertarget" + ChatUtils.BULLET_FORMATTED + "Sets a player name for spawned bots to focus on if the goal is PLAYER."); @@ -299,7 +300,38 @@ public class BotCommand extends CommandInstance { return; } - if (arg1.equalsIgnoreCase("setgoal")) { + if (arg1.equalsIgnoreCase("spawnloc")) { + if (arg2 == null) { + if (manager.getSpawnLoc() == null) + sender.sendMessage("No custom spawn location has been set. The bots will spawn at the player location."); + else { + Location loc = manager.getSpawnLoc(); + sender.sendMessage("The next spawn location will be at " + ChatColor.BLUE + String.format("(%s, %s, %s)", loc.getX(), loc.getY(), loc.getZ()) + ChatColor.RESET + "."); + } + return; + } + if (arg2.equalsIgnoreCase("clear")) { + manager.setSpawnLoc(null); + sender.sendMessage("The spawn location has been reset to the player location."); + return; + } + if (args.size() != 4) { + sender.sendMessage("Incorrect argument size. Correct syntax: " + ChatColor.YELLOW + "/bot settings spawnloc " + ChatColor.RESET); + return; + } + double x, y, z; + try { + x = Double.parseDouble(args.get(1)); + y = Double.parseDouble(args.get(2)); + z = Double.parseDouble(args.get(3)); + } catch (NumberFormatException e) { + sender.sendMessage("The block coordinates must be doubles!"); + sender.sendMessage("Correct syntax: " + ChatColor.YELLOW + "/bot settings spawnloc " + ChatColor.RESET); + return; + } + manager.setSpawnLoc(new Location(null, x, y, z)); + sender.sendMessage("The next spawn location has been set to " + ChatColor.BLUE + String.format("(%s, %s, %s)", x, y, z) + ChatColor.RESET + "."); + } else if (arg1.equalsIgnoreCase("setgoal")) { if (arg2 == null) { sender.sendMessage("The global bot goal is currently " + ChatColor.BLUE + agent.getTargetType() + ChatColor.RESET + "."); return; @@ -439,6 +471,7 @@ public class BotCommand extends CommandInstance { // lookall if (args.length == 2) { + output.add("spawnloc"); output.add("setgoal"); output.add("mobtarget"); output.add("playertarget"); From 9c98231cb3fbc9785cbd8b8e52247a270db7c7ee Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Wed, 23 Nov 2022 18:03:47 -0500 Subject: [PATCH 21/30] Fix stuck issue While boat clutching and breaking a side block --- .../net/nuggetmc/tplus/api/BotManager.java | 8 +- .../api/agent/legacyagent/LegacyAgent.java | 41 ++++++-- .../api/agent/legacyagent/LegacyLevel.java | 94 +++++++++++++++++++ 3 files changed, 132 insertions(+), 11 deletions(-) diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/BotManager.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/BotManager.java index 613d787..5e3e1bb 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/BotManager.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/BotManager.java @@ -10,10 +10,10 @@ import java.util.Set; import java.util.UUID; public interface BotManager { - Location getSpawnLoc(); - - void setSpawnLoc(Location loc); - + Location getSpawnLoc(); + + void setSpawnLoc(Location loc); + Set fetch(); Agent getAgent(); 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 ef98b21..71b71f9 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 @@ -1006,14 +1006,13 @@ public class LegacyAgent extends Agent { bot.setItem(new ItemStack(item)); - if (level == LegacyLevel.EAST_D || level == LegacyLevel.NORTH_D || level == LegacyLevel.SOUTH_D || level == LegacyLevel.WEST_D - || level == LegacyLevel.EAST_D_2 || level == LegacyLevel.NORTH_D_2 || level == LegacyLevel.SOUTH_D_2 || level == LegacyLevel.WEST_D_2) { + if (level.isSideDown() || level.isSideDown2()) { bot.setBotPitch(69); scheduler.runTaskLater(plugin, () -> { btCheck.put(player, true); }, 5); - } else if (level == LegacyLevel.EAST_U || level == LegacyLevel.NORTH_U || level == LegacyLevel.SOUTH_U || level == LegacyLevel.WEST_U) { + } else if (level.isSideUp()) { bot.setBotPitch(-53); }else if (level == LegacyLevel.AT_D || level == LegacyLevel.AT) { Location blockLoc = block.getLocation().add(0.5, -1, 0.5); @@ -1035,10 +1034,10 @@ public class LegacyAgent extends Agent { miningAnim.put(player, task); } - blockBreakEffect(bot, player, block, level); + blockBreakEffect(bot, player, block, new LegacyLevel.LevelWrapper(level)); } - private void blockBreakEffect(Terminator bot, LivingEntity player, Block block, LegacyLevel level) { + private void blockBreakEffect(Terminator bot, LivingEntity player, Block block, LegacyLevel.LevelWrapper wrapper) { if (LegacyMats.NO_CRACK.contains(block.getType())) return; @@ -1050,7 +1049,7 @@ public class LegacyAgent extends Agent { byte i = mining.get(this); Block cur; - switch (level) { + switch (wrapper.getLevel()) { case ABOVE: cur = player.getLocation().add(0, 2, 0).getBlock(); break; @@ -1112,6 +1111,34 @@ public class LegacyAgent extends Agent { cur = player.getLocation().add(0, 1, 0).getBlock(); } + // Fix boat clutching while breaking block + if ((wrapper.getLevel().isSideAt() || wrapper.getLevel().isSideUp()) + && bot.getLocation().add(0, -2, 0).getBlock().getType() == Material.LAVA + && block.getLocation().clone().add(0, 1, 0).equals(cur.getLocation())) { + cur = block; + wrapper.setLevel(wrapper.getLevel().sideDown()); + + if (wrapper.getLevel().isSideDown() || wrapper.getLevel().isSideDown2()) + bot.setBotPitch(69); + else if (wrapper.getLevel().isSideUp()) + bot.setBotPitch(-53); + else if (wrapper.getLevel().isSide()) + bot.setBotPitch(0); + } + if ((wrapper.getLevel().isSideAt() || wrapper.getLevel().isSideDown()) + && bot.getLocation().add(0, -1, 0).getBlock().getType() == Material.LAVA + && block.getLocation().clone().add(0, -1, 0).equals(cur.getLocation())) { + cur = block; + wrapper.setLevel(wrapper.getLevel().sideUp()); + + if (wrapper.getLevel().isSideDown() || wrapper.getLevel().isSideDown2()) + bot.setBotPitch(69); + else if (wrapper.getLevel().isSideUp()) + bot.setBotPitch(-53); + else if (wrapper.getLevel().isSide()) + bot.setBotPitch(0); + } + // wow this repeated code is so bad lmao if (player.isDead() || cur == null || (!block.equals(cur) || block.getType() != cur.getType())) { @@ -1139,7 +1166,7 @@ public class LegacyAgent extends Agent { block.breakNaturally(); - if (level == LegacyLevel.ABOVE) { + if (wrapper.getLevel() == LegacyLevel.ABOVE) { noJump.add(player); scheduler.runTaskLater(plugin, () -> { diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyLevel.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyLevel.java index 218dd63..32f446f 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyLevel.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyLevel.java @@ -32,8 +32,102 @@ public enum LegacyLevel { AT, AT_D )); + private static final Set SIDE_AT = new HashSet<>(Arrays.asList( + NORTH, + SOUTH, + EAST, + WEST + )); + private static final Set SIDE_UP = new HashSet<>(Arrays.asList( + NORTH_U, + SOUTH_U, + EAST_U, + WEST_U + )); + private static final Set SIDE_DOWN = new HashSet<>(Arrays.asList( + NORTH_D, + SOUTH_D, + EAST_D, + WEST_D + )); + private static final Set SIDE_DOWN_2 = new HashSet<>(Arrays.asList( + NORTH_D_2, + SOUTH_D_2, + EAST_D_2, + WEST_D_2 + )); public boolean isSide() { return !NON_SIDE.contains(this); } + + public boolean isSideAt() { + return SIDE_AT.contains(this); + } + + public boolean isSideUp() { + return SIDE_UP.contains(this); + } + + public boolean isSideDown() { + return SIDE_DOWN.contains(this); + } + + public boolean isSideDown2() { + return SIDE_DOWN_2.contains(this); + } + + public LegacyLevel sideUp() { + switch(this) { + case NORTH: return NORTH_U; + case SOUTH: return SOUTH_U; + case EAST: return EAST_U; + case WEST: return WEST_U; + case NORTH_D: return NORTH; + case SOUTH_D: return SOUTH; + case EAST_D: return EAST; + case WEST_D: return WEST; + case NORTH_D_2: return NORTH_D; + case SOUTH_D_2: return SOUTH_D; + case EAST_D_2: return EAST_D; + case WEST_D_2: return WEST_D; + default: + return null; + } + } + + public LegacyLevel sideDown() { + switch(this) { + case NORTH_U: return NORTH; + case SOUTH_U: return SOUTH; + case EAST_U: return EAST; + case WEST_U: return WEST; + case NORTH: return NORTH_D; + case SOUTH: return SOUTH_D; + case EAST: return EAST_D; + case WEST: return WEST_D; + case NORTH_D: return NORTH_D_2; + case SOUTH_D: return SOUTH_D_2; + case EAST_D: return EAST_D_2; + case WEST_D: return WEST_D_2; + default: + return null; + } + } + + public static class LevelWrapper { + private LegacyLevel level; + + public LevelWrapper(LegacyLevel level) { + this.level = level; + } + + public LegacyLevel getLevel() { + return level; + } + + public void setLevel(LegacyLevel level) { + this.level = level; + } + } } From 6e8deef5a5b47f2cffe00abd1eccceb39ea8cf5f Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Fri, 25 Nov 2022 12:42:53 -0500 Subject: [PATCH 22/30] Don't break below if not obstructed --- .../api/agent/legacyagent/LegacyAgent.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) 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 71b71f9..57668f8 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 @@ -473,7 +473,7 @@ public class LegacyAgent extends Agent { if (level == null) { resetHand(npc, target, playerNPC); return 1; - } else if (level.isSide() || level == LegacyLevel.BELOW) { + } else if (level.isSide() || level == LegacyLevel.BELOW || level == LegacyLevel.ABOVE) { return 0; } else { return 2; @@ -739,8 +739,36 @@ public class LegacyAgent extends Agent { return null; } } + if (level == LegacyLevel.ABOVE || level == LegacyLevel.BELOW) { + Block check; + + switch (dir) { + case NORTH: + check = player.getLocation().add(0, 2, -1).getBlock(); + break; + case SOUTH: + check = player.getLocation().add(0, 2, 1).getBlock(); + break; + case EAST: + check = player.getLocation().add(1, 2, 0).getBlock(); + break; + case WEST: + check = player.getLocation().add(-1, 2, 0).getBlock(); + break; + default: + check = null; + } + if (LegacyMats.AIR.contains(player.getLocation().add(0, 2, 0).getBlock().getType()) + && LegacyMats.AIR.contains(check.getType())) + return null; + } if (level != null) { + if (level == LegacyLevel.BELOW) { + npc.look(BlockFace.DOWN); + downMine(npc, player, get); + } else if (level == LegacyLevel.ABOVE) + npc.look(BlockFace.UP); preBreak(npc, player, get, level); } @@ -1112,6 +1140,7 @@ public class LegacyAgent extends Agent { } // Fix boat clutching while breaking block + // As a side effect, the bot is able to break multiple blocks at once while over lava if ((wrapper.getLevel().isSideAt() || wrapper.getLevel().isSideUp()) && bot.getLocation().add(0, -2, 0).getBlock().getType() == Material.LAVA && block.getLocation().clone().add(0, 1, 0).equals(cur.getLocation())) { From a41d9245b2a3b69f0e7021e8d3f93c123abcbdab Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Sun, 11 Dec 2022 19:13:39 -0500 Subject: [PATCH 23/30] Fix bot stuck issues -Fix bot being sometimes clipped into the ground at checkup (5 tick delay -> 3) -Fix stuck on snow layer issue --- .../api/agent/legacyagent/LegacyAgent.java | 87 ++++++------------- .../agent/legacyagent/LegacyBlockCheck.java | 1 - .../api/agent/legacyagent/LegacyLevel.java | 72 ++++++++++----- .../tplus/command/commands/BotCommand.java | 2 +- 4 files changed, 78 insertions(+), 84 deletions(-) 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 57668f8..c675eaf 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 @@ -510,6 +510,24 @@ public class LegacyAgent extends Agent { Collections.sort(locStanding, (a, b) -> Double.compare(BotUtils.getHorizSqDist(a, player.getLocation()), BotUtils.getHorizSqDist(b, player.getLocation()))); + //Break snow in the way + for (Location loc : locStanding) { + if (loc.getBlock().getType() == Material.SNOW) { + get = loc.getBlock(); + npc.faceLocation(get.getLocation()); + level = LegacyLevel.getOffset(player.getLocation(), loc); + + if (level != null) { + preBreak(npc, player, get, level); + return level; + } else { + //This should not happen + level = null; + get = null; + } + } + } + //Break potential obstructing walls for (Location loc : locStanding) { boolean up = false; @@ -847,7 +865,7 @@ public class LegacyAgent extends Agent { towerList.put(playerNPC, playerNPC.getLocation()); } } - }, 5); + }, 3); if (npc.isBotOnGround()) { if (target.getLocation().distance(playerNPC.getLocation()) < 16) { @@ -1077,67 +1095,12 @@ public class LegacyAgent extends Agent { byte i = mining.get(this); Block cur; - switch (wrapper.getLevel()) { - case ABOVE: - cur = player.getLocation().add(0, 2, 0).getBlock(); - break; - case BELOW: - cur = bot.getStandingOn().isEmpty() ? null : bot.getStandingOn().get(0); - break; - case NORTH_U: - cur = player.getLocation().add(0, 2, -1).getBlock(); - break; - case SOUTH_U: - cur = player.getLocation().add(0, 2, 1).getBlock(); - break; - case EAST_U: - cur = player.getLocation().add(1, 2, 0).getBlock(); - break; - case WEST_U: - cur = player.getLocation().add(-1, 2, 0).getBlock(); - break; - case NORTH: - cur = player.getLocation().add(0, 1, -1).getBlock(); - break; - case SOUTH: - cur = player.getLocation().add(0, 1, 1).getBlock(); - break; - case EAST: - cur = player.getLocation().add(1, 1, 0).getBlock(); - break; - case WEST: - cur = player.getLocation().add(-1, 1, 0).getBlock(); - break; - case NORTH_D: - cur = player.getLocation().add(0, 0, -1).getBlock(); - break; - case SOUTH_D: - cur = player.getLocation().add(0, 0, 1).getBlock(); - break; - case EAST_D: - cur = player.getLocation().add(1, 0, 0).getBlock(); - break; - case WEST_D: - cur = player.getLocation().add(-1, 0, 0).getBlock(); - break; - case NORTH_D_2: - cur = player.getLocation().add(0, -1, -1).getBlock(); - break; - case SOUTH_D_2: - cur = player.getLocation().add(0, -1, 1).getBlock(); - break; - case EAST_D_2: - cur = player.getLocation().add(1, -1, 0).getBlock(); - break; - case WEST_D_2: - cur = player.getLocation().add(-1, -1, 0).getBlock(); - break; - case AT_D: - cur = player.getLocation().getBlock(); - break; - default: - cur = player.getLocation().add(0, 1, 0).getBlock(); - } + if (wrapper.getLevel() == null) + cur = player.getLocation().add(0, 1, 0).getBlock(); + else if (wrapper.getLevel() == LegacyLevel.BELOW) + cur = bot.getStandingOn().isEmpty() ? null : bot.getStandingOn().get(0); + else + cur = wrapper.getLevel().offset(player.getLocation()).getBlock(); // Fix boat clutching while breaking block // As a side effect, the bot is able to break multiple blocks at once while over lava diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyBlockCheck.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyBlockCheck.java index 54f290c..309cfdd 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyBlockCheck.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyBlockCheck.java @@ -6,7 +6,6 @@ import net.nuggetmc.tplus.api.utils.BotUtils; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.block.data.Waterlogged; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyLevel.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyLevel.java index 32f446f..9f6b44c 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyLevel.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyLevel.java @@ -4,27 +4,43 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Set; +import org.bukkit.Location; + public enum LegacyLevel { - ABOVE, - BELOW, - AT, - AT_D, - NORTH_U, - SOUTH_U, - EAST_U, - WEST_U, - NORTH, - SOUTH, - EAST, - WEST, - NORTH_D, - SOUTH_D, - EAST_D, - WEST_D, - NORTH_D_2, - SOUTH_D_2, - EAST_D_2, - WEST_D_2; + ABOVE(0, 2, 0), + BELOW(0, -1, 0), + AT(0, 1, 0), + AT_D(0, 0, 0), + NORTH_U(0, 2, -1), + SOUTH_U(0, 2, 1), + EAST_U(1, 2, 0), + WEST_U(-1, 2, 0), + NORTH(0, 1, -1), + SOUTH(0, 1, 1), + EAST(1, 1, 0), + WEST(-1, 1, 0), + NORTH_D(0, 0, -1), + SOUTH_D(0, 0, 1), + EAST_D(1, 0, 0), + WEST_D(-1, 0, 0), + NORTHWEST_D(-1, 0, -1), + SOUTHWEST_D(-1, 0, 1), + NORTHEAST_D(1, 0, -1), + SOUTHEAST_D(1, 0, 1), + NORTH_D_2(0, -1, -1), + SOUTH_D_2(0, -1, 1), + EAST_D_2(1, -1, 0), + WEST_D_2(-1, -1, 0); + + private final int offsetX; + private final int offsetY; + private final int offsetZ; + + private LegacyLevel(int offsetX, int offsetY, int offsetZ) { + this.offsetX = offsetX; + this.offsetY = offsetY; + this.offsetZ = offsetZ; + } private static final Set NON_SIDE = new HashSet<>(Arrays.asList( ABOVE, @@ -115,6 +131,22 @@ public enum LegacyLevel { } } + public static LegacyLevel getOffset(Location start, Location end) { + int diffX = end.getBlockX() - start.getBlockX(); + int diffY = end.getBlockY() - start.getBlockY(); + int diffZ = end.getBlockZ() - start.getBlockZ(); + for (LegacyLevel level : LegacyLevel.values()) { + if (level.offsetX == diffX && level.offsetY == diffY && level.offsetZ == diffZ) { + return level; + } + } + return null; + } + + public Location offset(Location loc) { + return loc.add(offsetX, offsetY, offsetZ); + } + public static class LevelWrapper { private LegacyLevel level; diff --git a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java index 6b1d2f0..8b61ceb 100644 --- a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java +++ b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java @@ -213,7 +213,7 @@ public class BotCommand extends CommandInstance { String botName = bot.getBotName(); String world = ChatColor.YELLOW + bot.getBukkitEntity().getWorld().getName(); Location loc = bot.getLocation(); - String strLoc = ChatColor.YELLOW + formatter.format(loc.getBlockX()) + ", " + formatter.format(loc.getBlockY()) + ", " + formatter.format(loc.getBlockZ()); + String strLoc = ChatColor.YELLOW + formatter.format(loc.getX()) + ", " + formatter.format(loc.getY()) + ", " + formatter.format(loc.getZ()); Vector vel = bot.getVelocity(); String strVel = ChatColor.AQUA + formatter.format(vel.getX()) + ", " + formatter.format(vel.getY()) + ", " + formatter.format(vel.getZ()); From 58f39c1d3978cfd2df34b2335b6c8b2ddc90ef6b Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Thu, 15 Dec 2022 17:10:15 -0500 Subject: [PATCH 24/30] SpawnLoc changes +NoFall check --- .../main/java/net/nuggetmc/tplus/api/Terminator.java | 2 ++ .../tplus/api/agent/legacyagent/LegacyBlockCheck.java | 2 +- .../src/main/java/net/nuggetmc/tplus/bot/Bot.java | 5 +++++ .../nuggetmc/tplus/command/commands/BotCommand.java | 11 +++++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) 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 a54919c..dca945b 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 @@ -112,6 +112,8 @@ public interface Terminator { void addVelocity(Vector velocity); int getAliveTicks(); + + int getNoFallTicks(); boolean tickDelay(int ticks); diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyBlockCheck.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyBlockCheck.java index 309cfdd..3fffacc 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyBlockCheck.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyBlockCheck.java @@ -145,7 +145,7 @@ public class LegacyBlockCheck { } public boolean tryPreMLG(Terminator bot, Location botLoc) { - if(bot.isBotOnGround() || bot.getVelocity().getY() >= -0.8D) + if(bot.isBotOnGround() || bot.getVelocity().getY() >= -0.8D || bot.getNoFallTicks() > 7) return false; if (tryPreMLG(bot, botLoc, 3)) return true; 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 69b3d77..b2f2751 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 @@ -254,6 +254,11 @@ public class Bot extends ServerPlayer implements Terminator { public int getAliveTicks() { return aliveTicks; } + + @Override + public int getNoFallTicks() { + return noFallTicks; + } @Override public boolean tickDelay(int i) { diff --git a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java index 8b61ceb..9010d79 100644 --- a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java +++ b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java @@ -315,8 +315,19 @@ public class BotCommand extends CommandInstance { sender.sendMessage("The spawn location has been reset to the player location."); return; } + if (arg2.equalsIgnoreCase("playerloc")) { + if (!(sender instanceof Player)) { + sender.sendMessage("You must be a player to do this!"); + return; + } + Location loc = ((Player)sender).getLocation(); + manager.setSpawnLoc(loc.clone()); + sender.sendMessage("The spawn location has been set to " + ChatColor.BLUE + formatter.format(loc.getX()) + ", " + formatter.format(loc.getY()) + ", " + formatter.format(loc.getZ()) + ChatColor.RESET + "."); + return; + } if (args.size() != 4) { sender.sendMessage("Incorrect argument size. Correct syntax: " + ChatColor.YELLOW + "/bot settings spawnloc " + ChatColor.RESET); + sender.sendMessage("Additionally, to specify a spawnloc at the current player position: " + ChatColor.YELLOW + "/bot settings spawnloc playerloc" + ChatColor.RESET); return; } double x, y, z; From 88bf90080cd2ef91b176540e13a65ddc30074007 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Thu, 15 Dec 2022 19:59:28 -0500 Subject: [PATCH 25/30] Fix bot stuck issue -Removed snow breaking feature (wrong kind of fix) -Remove snow from LegacyMats (because snow can have a hitbox if more than 1 layer) --- .../api/agent/legacyagent/LegacyAgent.java | 57 ++++++------------- .../api/agent/legacyagent/LegacyMats.java | 1 - 2 files changed, 17 insertions(+), 41 deletions(-) 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 c675eaf..d4cec9a 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 @@ -184,7 +184,7 @@ public class LegacyAgent extends Agent { if (checkDown(bot, botPlayer, livingTarget.getLocation(), bothXZ)) return; - if ((withinTargetXZ || sameXZ) && checkUp(bot, livingTarget, botPlayer, target, withinTargetXZ)) return; + if ((withinTargetXZ || sameXZ) && checkUp(bot, livingTarget, botPlayer, target, withinTargetXZ, sameXZ)) return; if (bothXZ) sideResult = checkSide(bot, livingTarget, botPlayer); @@ -510,24 +510,6 @@ public class LegacyAgent extends Agent { Collections.sort(locStanding, (a, b) -> Double.compare(BotUtils.getHorizSqDist(a, player.getLocation()), BotUtils.getHorizSqDist(b, player.getLocation()))); - //Break snow in the way - for (Location loc : locStanding) { - if (loc.getBlock().getType() == Material.SNOW) { - get = loc.getBlock(); - npc.faceLocation(get.getLocation()); - level = LegacyLevel.getOffset(player.getLocation(), loc); - - if (level != null) { - preBreak(npc, player, get, level); - return level; - } else { - //This should not happen - level = null; - get = null; - } - } - } - //Break potential obstructing walls for (Location loc : locStanding) { boolean up = false; @@ -596,11 +578,6 @@ public class LegacyAgent extends Agent { //Break standing block get = standing; level = LegacyLevel.BELOW; - - noJump.add(player); - scheduler.runTaskLater(plugin, () -> { - noJump.remove(player); - }, 15); } else { //Break above Block above = npc.getLocation().add(0, 2, 0).getBlock(); @@ -639,11 +616,6 @@ public class LegacyAgent extends Agent { //Break standing block get = standing; level = LegacyLevel.BELOW; - - noJump.add(player); - scheduler.runTaskLater(plugin, () -> { - noJump.remove(player); - }, 15); } else { //Break above Block above = npc.getLocation().add(0, 2, 0).getBlock(); @@ -682,11 +654,6 @@ public class LegacyAgent extends Agent { //Break standing block get = standing; level = LegacyLevel.BELOW; - - noJump.add(player); - scheduler.runTaskLater(plugin, () -> { - noJump.remove(player); - }, 15); } else { //Break above Block above = npc.getLocation().add(0, 2, 0).getBlock(); @@ -725,11 +692,6 @@ public class LegacyAgent extends Agent { //Break standing block get = standing; level = LegacyLevel.BELOW; - - noJump.add(player); - scheduler.runTaskLater(plugin, () -> { - noJump.remove(player); - }, 15); } else { //Break above Block above = npc.getLocation().add(0, 2, 0).getBlock(); @@ -783,6 +745,11 @@ public class LegacyAgent extends Agent { if (level != null) { if (level == LegacyLevel.BELOW) { + noJump.add(player); + scheduler.runTaskLater(plugin, () -> { + noJump.remove(player); + }, 15); + npc.look(BlockFace.DOWN); downMine(npc, player, get); } else if (level == LegacyLevel.ABOVE) @@ -793,7 +760,7 @@ public class LegacyAgent extends Agent { return level; } - private boolean checkUp(Terminator npc, LivingEntity target, LivingEntity playerNPC, Location loc, boolean c) { + private boolean checkUp(Terminator npc, LivingEntity target, LivingEntity playerNPC, Location loc, boolean c, boolean sameXZ) { Location a = playerNPC.getLocation(); Location b = target.getLocation(); @@ -925,6 +892,16 @@ public class LegacyAgent extends Agent { } return true; + } else if (sameXZ && LegacyMats.BREAK.contains(m1)) { + Block block = npc.getStandingOn().isEmpty() ? null : npc.getStandingOn().get(0); + if (block != null && block.getLocation().getBlockY() == playerNPC.getLocation().getBlockY() + && !LegacyMats.BREAK.contains(block.getType())) { + npc.look(BlockFace.DOWN); + + downMine(npc, playerNPC, block); + preBreak(npc, playerNPC, block, LegacyLevel.BELOW); + return true; + } } } diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java index 9e00c02..fe37af8 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/LegacyMats.java @@ -99,7 +99,6 @@ public class LegacyMats { Material.WATER, Material.LAVA, Material.TALL_GRASS, - Material.SNOW, Material.CAVE_AIR, Material.VINE, Material.FERN, From 2f38e556ae8b0bae9721d12cbaa69835b4ba74e6 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Sun, 18 Dec 2022 17:47:23 -0500 Subject: [PATCH 26/30] Fix placing blocks in water --- .../api/agent/legacyagent/LegacyAgent.java | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) 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 d4cec9a..4cff264 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 @@ -815,24 +815,25 @@ public class LegacyAgent extends Agent { npc.look(BlockFace.DOWN); // maybe put this in lower if statement onGround() - scheduler.runTaskLater(plugin, () -> { - npc.sneak(); - npc.setItem(new ItemStack(Material.COBBLESTONE)); - npc.punch(); - npc.look(BlockFace.DOWN); - - scheduler.runTaskLater(plugin, () -> { - npc.look(BlockFace.DOWN); - }, 1); - - blockCheck.placeBlock(npc, playerNPC, place); - - if (!towerList.containsKey(playerNPC)) { - if (c) { - towerList.put(playerNPC, playerNPC.getLocation()); - } - } - }, 3); + if (m0 != Material.WATER) + scheduler.runTaskLater(plugin, () -> { + npc.sneak(); + npc.setItem(new ItemStack(Material.COBBLESTONE)); + npc.punch(); + npc.look(BlockFace.DOWN); + + scheduler.runTaskLater(plugin, () -> { + npc.look(BlockFace.DOWN); + }, 1); + + blockCheck.placeBlock(npc, playerNPC, place); + + if (!towerList.containsKey(playerNPC)) { + if (c) { + towerList.put(playerNPC, playerNPC.getLocation()); + } + } + }, 3); if (npc.isBotOnGround()) { if (target.getLocation().distance(playerNPC.getLocation()) < 16) { From 910b53f54f31d0e37bc4bca93e1b1be4f5f9113f Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Fri, 23 Dec 2022 12:16:32 -0500 Subject: [PATCH 27/30] Nearest raider option --- .../tplus/api/agent/legacyagent/EnumTargetGoal.java | 2 ++ .../tplus/api/agent/legacyagent/LegacyAgent.java | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/EnumTargetGoal.java b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/EnumTargetGoal.java index a708bd1..02eb72f 100644 --- a/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/EnumTargetGoal.java +++ b/TerminatorPlus-API/src/main/java/net/nuggetmc/tplus/api/agent/legacyagent/EnumTargetGoal.java @@ -7,6 +7,7 @@ public enum EnumTargetGoal { NEAREST_VULNERABLE_PLAYER("Locate the nearest real player that is in either Survival or Adventure mode."), NEAREST_PLAYER("Locate the nearest real online player, despite the gamemode."), NEAREST_HOSTILE("Locate the nearest hostile entity."), + NEAREST_RAIDER("Locate the nearest raider."), NEAREST_MOB("Locate the nearest mob."), NEAREST_BOT("Locate the nearest bot."), NEAREST_BOT_DIFFER("Locate the nearest bot with a different username."), @@ -20,6 +21,7 @@ public enum EnumTargetGoal { this.put("nearestvulnerableplayer", NEAREST_VULNERABLE_PLAYER); this.put("nearestplayer", NEAREST_PLAYER); this.put("nearesthostile", NEAREST_HOSTILE); + this.put("nearestraider", NEAREST_RAIDER); this.put("nearestmob", NEAREST_MOB); this.put("nearestbot", NEAREST_BOT); this.put("nearestbotdiffer", NEAREST_BOT_DIFFER); 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 4cff264..0833d46 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 @@ -1463,6 +1463,16 @@ public class LegacyAgent extends Agent { break; } + + case NEAREST_RAIDER: { + for (LivingEntity entity : bot.getBukkitEntity().getWorld().getLivingEntities()) { + if ((entity instanceof Raider || (entity instanceof Vex vex && vex.getSummoner() instanceof Raider)) && validateCloserEntity(entity, loc, result)) { + result = entity; + } + } + + break; + } case NEAREST_MOB: { for (LivingEntity entity : bot.getBukkitEntity().getWorld().getLivingEntities()) { From 945b2627d1dffd7cbde29b20a40be30efe3c22a1 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Mon, 2 Jan 2023 15:21:37 -0500 Subject: [PATCH 28/30] Allow relative coordinates in /bot region Also remove codeql --- .github/workflows/dev-analysis.yml | 69 ++++++------------- .../tplus/command/commands/BotCommand.java | 29 ++++++-- 2 files changed, 43 insertions(+), 55 deletions(-) diff --git a/.github/workflows/dev-analysis.yml b/.github/workflows/dev-analysis.yml index 50ce0f4..da6e3de 100644 --- a/.github/workflows/dev-analysis.yml +++ b/.github/workflows/dev-analysis.yml @@ -3,59 +3,30 @@ name: "CodeQL" on: [push, pull_request] jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - + gradle: strategy: - fail-fast: false matrix: - language: [ 'java' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] - # Learn more: - # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed - + os: [ ubuntu-latest ] + runs-on: ${{ matrix.os }} steps: - - name: Checkout repository - uses: actions/checkout@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-java@v3 + with: + distribution: temurin + java-version: 17 - - name: Cache local repo - uses: actions/cache@v3 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven- + - name: Make gradlew executable + run: chmod +x ./gradlew - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: ${{ matrix.language }} - - - uses: actions/setup-java@v3 - with: - distribution: temurin - java-version: 17 - - - name: Make gradlew executable - run: chmod +x ./gradlew + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 - - name: Setup Gradle - uses: gradle/gradle-build-action@v2 + - name: Execute Gradle build + run: ./gradlew build - - name: Execute Gradle build - run: ./gradlew build - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 - - - name: Upload a Build Artifact - uses: actions/upload-artifact@v3 - if: success() - with: - name: TerminatorPlus - path: build/libs/ + - name: Upload a Build Artifact + uses: actions/upload-artifact@v2.2.4 + if: success() + with: + name: TerminatorPlus + path: build/libs/ diff --git a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java index 9010d79..15cad2a 100644 --- a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java +++ b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java @@ -434,12 +434,13 @@ public class BotCommand extends CommandInstance { } double x1, y1, z1, x2, y2, z2, wX, wY, wZ; try { - x1 = Double.parseDouble(args.get(1)); - y1 = Double.parseDouble(args.get(2)); - z1 = Double.parseDouble(args.get(3)); - x2 = Double.parseDouble(args.get(4)); - y2 = Double.parseDouble(args.get(5)); - z2 = Double.parseDouble(args.get(6)); + Location loc = sender instanceof Player pl ? pl.getLocation() : null; + x1 = parseDoubleOrRelative(args.get(1), loc, 0); + y1 = parseDoubleOrRelative(args.get(2), loc, 1); + z1 = parseDoubleOrRelative(args.get(3), loc, 2); + x2 = parseDoubleOrRelative(args.get(4), loc, 0); + y2 = parseDoubleOrRelative(args.get(5), loc, 1); + z2 = parseDoubleOrRelative(args.get(6), loc, 2); if (strict) wX = wY = wZ = 0; else { @@ -518,4 +519,20 @@ public class BotCommand extends CommandInstance { public void debug(CommandSender sender, @Arg("expression") String expression) { new Debugger(sender).execute(expression); } + + private double parseDoubleOrRelative(String pos, Location loc, int type) { + if (loc == null || pos.length() == 0 || pos.charAt(0) != '~') + return Double.parseDouble(pos); + double relative = Double.parseDouble(pos.substring(1)); + switch (type) { + case 0: + return relative + loc.getX(); + case 1: + return relative + loc.getY(); + case 2: + return relative + loc.getZ(); + default: + return 0; + } + } } From d5e75d40bc3e9b8af3da20ee2afd732ee66b7c2d Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Mon, 2 Jan 2023 15:23:57 -0500 Subject: [PATCH 29/30] Rename task --- .github/workflows/{dev-analysis.yml => compile.yml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .github/workflows/{dev-analysis.yml => compile.yml} (97%) diff --git a/.github/workflows/dev-analysis.yml b/.github/workflows/compile.yml similarity index 97% rename from .github/workflows/dev-analysis.yml rename to .github/workflows/compile.yml index da6e3de..0e7059f 100644 --- a/.github/workflows/dev-analysis.yml +++ b/.github/workflows/compile.yml @@ -1,4 +1,4 @@ -name: "CodeQL" +name: "Compile" on: [push, pull_request] From a7ca363d5e03ef264c5b5edeefdd7d84d621cbc9 Mon Sep 17 00:00:00 2001 From: ThisTestUser Date: Mon, 2 Jan 2023 16:10:29 -0500 Subject: [PATCH 30/30] Round player pos to 3 decimal places --- .../net/nuggetmc/tplus/command/commands/BotCommand.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java index 15cad2a..b553648 100644 --- a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java +++ b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/command/commands/BotCommand.java @@ -526,11 +526,11 @@ public class BotCommand extends CommandInstance { double relative = Double.parseDouble(pos.substring(1)); switch (type) { case 0: - return relative + loc.getX(); + return relative + Math.round(loc.getX() * 1000) / 1000D; case 1: - return relative + loc.getY(); + return relative + Math.round(loc.getY() * 1000) / 1000D; case 2: - return relative + loc.getZ(); + return relative + Math.round(loc.getZ() * 1000) / 1000D; default: return 0; }