From 0f047692b0d10c53b6c9e9c28b552d46faccbcc9 Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Thu, 22 May 2025 15:48:25 +0700 Subject: [PATCH] feat: implemented Puppet subcommand for /debug_ai --- .../msb3/api/command/DebugAICommand.java | 1 + .../msb3/api/command/PuppeteerSubcommand.java | 90 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 api/src/main/java/ru/dragonestia/msb3/api/command/PuppeteerSubcommand.java diff --git a/api/src/main/java/ru/dragonestia/msb3/api/command/DebugAICommand.java b/api/src/main/java/ru/dragonestia/msb3/api/command/DebugAICommand.java index 7c2bea1..09ab1aa 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/command/DebugAICommand.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/command/DebugAICommand.java @@ -22,6 +22,7 @@ public class DebugAICommand extends Command { setDefaultExecutor(this::defaultExecutor); addSyntax(this::executeShowPath, ArgumentType.Literal("show_path"), argShowPathValue); + addSubcommand(new PuppeteerSubcommand()); } public static void register() { diff --git a/api/src/main/java/ru/dragonestia/msb3/api/command/PuppeteerSubcommand.java b/api/src/main/java/ru/dragonestia/msb3/api/command/PuppeteerSubcommand.java new file mode 100644 index 0000000..1da0624 --- /dev/null +++ b/api/src/main/java/ru/dragonestia/msb3/api/command/PuppeteerSubcommand.java @@ -0,0 +1,90 @@ +package ru.dragonestia.msb3.api.command; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.minestom.server.command.CommandSender; +import net.minestom.server.command.builder.Command; +import net.minestom.server.command.builder.CommandContext; +import net.minestom.server.command.builder.arguments.ArgumentType; +import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.Player; +import ru.dragonestia.msb3.api.entity.EntityAI; + +public class PuppeteerSubcommand extends Command { + + private EntityAI entity; + + public PuppeteerSubcommand() { + super("puppeteer"); + + setDefaultExecutor(this::defaultExecutor); + addSyntax(this::createEntity, ArgumentType.Literal("create")); + addSyntax(this::removeEntity, ArgumentType.Literal("remove")); + addSyntax(this::comeHere, ArgumentType.Literal("come_here")); + addSyntax(this::teleport, ArgumentType.Literal("teleport")); + } + + private void defaultExecutor(CommandSender sender, CommandContext ctx) { + var player = (Player) sender; + + player.sendMessage("Puppeteer commands:"); + } + + private void createEntity(CommandSender sender, CommandContext ctx) { + if (entity != null) { + sender.sendMessage(Component.text("Entity is already created!", NamedTextColor.RED)); + return; + } + + var player = (Player) sender; + + var e = new EntityAI(EntityType.SKELETON); + e.setCustomName(Component.text("Puppet")); + e.setInstance(player.getInstance(), player.getPosition()); + entity = e; + + sender.sendMessage(Component.text("Puppeteer created!", NamedTextColor.YELLOW)); + } + + private void removeEntity(CommandSender sender, CommandContext ctx) { + if (isNotCreated(sender)) return; + + entity.remove(); + sender.sendMessage(Component.text("Entity removed!")); + } + + private void comeHere(CommandSender sender, CommandContext ctx) { + if (isNotCreated(sender)) return; + + var player = (Player) sender; + + sender.sendMessage(Component.text("Set entity path target.")); + entity.getAi().setPathTo(player.getPosition()).thenAccept(result -> { + player.sendMessage(Component.text("Entity path target result: " + result, NamedTextColor.YELLOW)); + }); + } + + private void teleport(CommandSender sender, CommandContext ctx) { + if (isNotCreated(sender)) return; + + var player = (Player) sender; + entity.teleport(player.getPosition()).thenRun(() -> { + sender.sendMessage(Component.text("Teleported.", NamedTextColor.YELLOW)); + }); + } + + private boolean isNotCreated(CommandSender sender) { + boolean failed = false; + if (entity == null) { + failed = true; + } else if (entity.isDead() || entity.isRemoved()) { + entity.remove(); + entity = null; + } + + if (failed) { + sender.sendMessage(Component.text("Entity is not created!", NamedTextColor.RED)); + } + return failed; + } +}