diff --git a/leaves-api/src/main/java/org/leavesmc/leaves/entity/bot/action/MountAction.java b/leaves-api/src/main/java/org/leavesmc/leaves/entity/bot/action/MountAction.java new file mode 100644 index 00000000..8452485b --- /dev/null +++ b/leaves-api/src/main/java/org/leavesmc/leaves/entity/bot/action/MountAction.java @@ -0,0 +1,12 @@ +package org.leavesmc.leaves.entity.bot.action; + +import org.bukkit.Bukkit; + +/** + * Represents an action for a bot to mount to nearby vehicles. + */ +public interface MountAction extends BotAction { + static MountAction create() { + return Bukkit.getBotManager().newAction(MountAction.class); + } +} diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/Actions.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/Actions.java index 5b831b65..17a3ed3f 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/Actions.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/Actions.java @@ -35,6 +35,7 @@ public class Actions { register(new ServerSwimAction(), SwimAction.class); register(new ServerRotationAction(), RotationAction.class); register(new ServerMoveAction(), MoveAction.class); + register(new ServerMountAction(), MountAction.class); } public static boolean register(@NotNull ServerBotAction action, Class> type) { diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerMountAction.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerMountAction.java new file mode 100644 index 00000000..09077735 --- /dev/null +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerMountAction.java @@ -0,0 +1,54 @@ +package org.leavesmc.leaves.bot.agent.actions; + +import net.minecraft.world.entity.Entity; +import org.bukkit.Location; +import org.bukkit.craftbukkit.entity.CraftVehicle; +import org.bukkit.entity.Vehicle; +import org.jetbrains.annotations.NotNull; +import org.leavesmc.leaves.bot.ServerBot; +import org.leavesmc.leaves.command.CommandArgument; +import org.leavesmc.leaves.entity.bot.actions.CraftMountAction; + +import java.util.Collection; +import java.util.Comparator; +import java.util.List; + +public class ServerMountAction extends ServerBotAction { + + public ServerMountAction() { + super("mount", CommandArgument.EMPTY, ServerMountAction::new); + } + + @Override + public boolean doTick(@NotNull ServerBot bot) { + Location center = bot.getBukkitEntity().getLocation(); + Collection nearbyVehicles = center.getNearbyEntitiesByType( + Vehicle.class, + 3, + vehicle -> manhattanDistance(bot, ((CraftVehicle) vehicle).getHandle()) <= 2 + ); + + List vehicles = nearbyVehicles.stream().sorted(Comparator.comparingDouble( + (vehicle) -> center.distanceSquared(vehicle.getLocation()) + )).toList(); + + for (Vehicle vehicle : vehicles) { + if (bot.startRiding(((CraftVehicle) vehicle).getHandle(), false)) { + return true; + } + } + + return false; + } + + @Override + public Object asCraft() { + return new CraftMountAction(this); + } + + private double manhattanDistance(@NotNull Entity entity1, @NotNull Entity entity2) { + return Math.abs(entity1.getX() - entity2.getX()) + + Math.abs(entity1.getY() - entity2.getY()) + + Math.abs(entity1.getZ() - entity2.getZ()); + } +} diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/entity/bot/actions/CraftMountAction.java b/leaves-server/src/main/java/org/leavesmc/leaves/entity/bot/actions/CraftMountAction.java new file mode 100644 index 00000000..7fe776c1 --- /dev/null +++ b/leaves-server/src/main/java/org/leavesmc/leaves/entity/bot/actions/CraftMountAction.java @@ -0,0 +1,82 @@ +package org.leavesmc.leaves.entity.bot.actions; + +import org.jetbrains.annotations.NotNull; +import org.leavesmc.leaves.bot.ServerBot; +import org.leavesmc.leaves.bot.agent.actions.*; +import org.leavesmc.leaves.entity.bot.action.*; + +import java.util.UUID; +import java.util.function.Consumer; + +public class CraftMountAction extends CraftBotAction implements MountAction { + private final ServerMountAction serverAction; + private Consumer onFail = null; + private Consumer onSuccess = null; + private Consumer onStop = null; + + public CraftMountAction(ServerMountAction serverAction) { + this.serverAction = serverAction; + } + + public boolean doTick(@NotNull ServerBot bot) { + return serverAction.doTick(bot); + } + + @Override + public ServerBotAction getHandle() { + return serverAction; + } + + @Override + public String getName() { + return serverAction.getName(); + } + + @Override + public UUID getUUID() { + return serverAction.getUUID(); + } + + @Override + public void setCancelled(boolean cancel) { + serverAction.setCancelled(cancel); + } + + @Override + public boolean isCancelled() { + return serverAction.isCancelled(); + } + + @Override + public void setOnFail(Consumer onFail) { + this.onFail = onFail; + serverAction.setOnFail(it -> onFail.accept(new CraftMountAction(it))); + } + + @Override + public Consumer getOnFail() { + return onFail; + } + + @Override + public void setOnSuccess(Consumer onSuccess) { + this.onSuccess = onSuccess; + serverAction.setOnSuccess(it -> onSuccess.accept(new CraftMountAction(it))); + } + + @Override + public Consumer getOnSuccess() { + return onSuccess; + } + + @Override + public void setOnStop(Consumer onStop) { + this.onStop = onStop; + serverAction.setOnStop(it -> onStop.accept(new CraftMountAction(it))); + } + + @Override + public Consumer getOnStop() { + return onStop; + } +}