feat: implemented Puppet subcommand for /debug_ai

This commit is contained in:
Andrey Terentev 2025-05-22 15:48:25 +07:00
parent 8125d04013
commit 0f047692b0
2 changed files with 91 additions and 0 deletions

View File

@ -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() {

View File

@ -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;
}
}