diff --git a/api/src/main/java/ru/dragonestia/msb3/api/boot/ServerBootstrap.java b/api/src/main/java/ru/dragonestia/msb3/api/boot/ServerBootstrap.java index c687246..45e86c9 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/boot/ServerBootstrap.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/boot/ServerBootstrap.java @@ -19,6 +19,7 @@ import ru.dragonestia.msb3.api.event.NPCClickEvent; import ru.dragonestia.msb3.api.item.ItemUtil; import ru.dragonestia.msb3.api.player.MsbPlayer; import ru.dragonestia.msb3.api.player.PlayerContextManager; +import ru.dragonestia.msb3.api.player.defaults.DebugParamsContext; import ru.dragonestia.msb3.api.player.defaults.KeyedBossBarContext; import ru.dragonestia.msb3.api.player.defaults.NavigatorContext; import ru.dragonestia.msb3.api.player.defaults.TalksContext; @@ -191,6 +192,7 @@ public final class ServerBootstrap { PlayerContextManager.registerContext(KeyedBossBarContext.class, KeyedBossBarContext::new); PlayerContextManager.registerContext(NavigatorContext.class, NavigatorContext::new); PlayerContextManager.registerContext(TalksContext.class, TalksContext::new); + PlayerContextManager.registerContext(DebugParamsContext.class, DebugParamsContext::new); } private void initDefaultSkins() { 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 new file mode 100644 index 0000000..7c2bea1 --- /dev/null +++ b/api/src/main/java/ru/dragonestia/msb3/api/command/DebugAICommand.java @@ -0,0 +1,49 @@ +package ru.dragonestia.msb3.api.command; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.minestom.server.MinecraftServer; +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.ArgumentBoolean; +import net.minestom.server.command.builder.arguments.ArgumentType; +import net.minestom.server.entity.Player; +import ru.dragonestia.msb3.api.player.MsbPlayer; +import ru.dragonestia.msb3.api.player.PlayerContext; +import ru.dragonestia.msb3.api.player.defaults.DebugParamsContext; + +public class DebugAICommand extends Command { + + private final ArgumentBoolean argShowPathValue = ArgumentType.Boolean("show"); + + public DebugAICommand() { + super("debug_ai"); + setDefaultExecutor(this::defaultExecutor); + + addSyntax(this::executeShowPath, ArgumentType.Literal("show_path"), argShowPathValue); + } + + public static void register() { + MinecraftServer.getCommandManager().register(new DebugAICommand()); + } + + private void defaultExecutor(CommandSender sender, CommandContext ctx) { + var player = (Player) sender; + + player.sendMessage("Debug Render commands:"); + player.sendMessage("/debug_ai show_path - Change debug renderer for path finder"); + } + + private void executeShowPath(CommandSender sender, CommandContext ctx) { + var player = (MsbPlayer) sender; + var show = ctx.get(argShowPathValue); + + PlayerContext.of(player, DebugParamsContext.class).setShowDebugRendererAiPathFinder(show); + if (show) { + player.sendMessage(Component.text("Enabled debug renderer for path finder", NamedTextColor.YELLOW)); + } else { + player.sendMessage(Component.text("Disabled debug renderer for path finder", NamedTextColor.YELLOW)); + } + } +} diff --git a/api/src/main/java/ru/dragonestia/msb3/api/command/DebugCommands.java b/api/src/main/java/ru/dragonestia/msb3/api/command/DebugCommands.java index ca6262b..0c68f11 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/command/DebugCommands.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/command/DebugCommands.java @@ -30,6 +30,7 @@ public class DebugCommands { registerTeleportCommand(); registerGameModeCommand(); DebugRendererCommand.register(); + DebugAICommand.register(); log.info("Registered debug commands"); } diff --git a/api/src/main/java/ru/dragonestia/msb3/api/player/defaults/DebugParamsContext.java b/api/src/main/java/ru/dragonestia/msb3/api/player/defaults/DebugParamsContext.java new file mode 100644 index 0000000..fcb6647 --- /dev/null +++ b/api/src/main/java/ru/dragonestia/msb3/api/player/defaults/DebugParamsContext.java @@ -0,0 +1,57 @@ +package ru.dragonestia.msb3.api.player.defaults; + +import net.kyori.adventure.text.format.NamedTextColor; +import net.minestom.server.entity.EntityCreature; +import net.minestom.server.network.packet.server.play.ParticlePacket; +import net.minestom.server.particle.Particle; +import net.minestom.server.timer.Task; +import ru.dragonestia.msb3.api.player.MsbPlayer; +import ru.dragonestia.msb3.api.player.PlayerContext; +import ru.dragonestia.msb3.api.scheduler.Scheduler; + +import java.time.Duration; + +public class DebugParamsContext extends PlayerContext { + + private final static Particle PARTICLE_AI_PATH = Particle.DUST + .withScale(2f) + .withColor(NamedTextColor.GREEN); + + private Task taskDebugRendererAiPathFinder; + + public DebugParamsContext(MsbPlayer player) { + super(player); + } + + @Override + public void init() { + + } + + @Override + public void dispose() { + + } + + public synchronized void setShowDebugRendererAiPathFinder(boolean value) { + if (value) { + if (taskDebugRendererAiPathFinder != null) return; + + taskDebugRendererAiPathFinder = Scheduler.ofPlayer(getPlayer()).repeatingTask(() -> { + for (var entity: getPlayer().getInstance().getNearbyEntities(getPlayer().getPosition(), 32)) { + if (entity instanceof EntityCreature creature) { + for (var point: creature.getNavigator().getNodes()) { + var packet = new ParticlePacket(PARTICLE_AI_PATH, point.x(), point.y() + 0.5, point.z(), 0, 0, 0, 0, 1); + entity.sendPacketToViewers(packet); + } + } + } + }, Duration.ofMillis(500)); + return; + } + + if (taskDebugRendererAiPathFinder == null) return; + taskDebugRendererAiPathFinder.cancel(); + taskDebugRendererAiPathFinder = null; + } +}