feat: implemented debug ai renderer command

This commit is contained in:
Andrey Terentev 2025-04-06 11:59:55 +07:00
parent c7c024fc6b
commit 65a784a1ef
4 changed files with 109 additions and 0 deletions

View File

@ -19,6 +19,7 @@ import ru.dragonestia.msb3.api.event.NPCClickEvent;
import ru.dragonestia.msb3.api.item.ItemUtil; import ru.dragonestia.msb3.api.item.ItemUtil;
import ru.dragonestia.msb3.api.player.MsbPlayer; import ru.dragonestia.msb3.api.player.MsbPlayer;
import ru.dragonestia.msb3.api.player.PlayerContextManager; 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.KeyedBossBarContext;
import ru.dragonestia.msb3.api.player.defaults.NavigatorContext; import ru.dragonestia.msb3.api.player.defaults.NavigatorContext;
import ru.dragonestia.msb3.api.player.defaults.TalksContext; import ru.dragonestia.msb3.api.player.defaults.TalksContext;
@ -191,6 +192,7 @@ public final class ServerBootstrap {
PlayerContextManager.registerContext(KeyedBossBarContext.class, KeyedBossBarContext::new); PlayerContextManager.registerContext(KeyedBossBarContext.class, KeyedBossBarContext::new);
PlayerContextManager.registerContext(NavigatorContext.class, NavigatorContext::new); PlayerContextManager.registerContext(NavigatorContext.class, NavigatorContext::new);
PlayerContextManager.registerContext(TalksContext.class, TalksContext::new); PlayerContextManager.registerContext(TalksContext.class, TalksContext::new);
PlayerContextManager.registerContext(DebugParamsContext.class, DebugParamsContext::new);
} }
private void initDefaultSkins() { private void initDefaultSkins() {

View File

@ -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 <true/false> - 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));
}
}
}

View File

@ -30,6 +30,7 @@ public class DebugCommands {
registerTeleportCommand(); registerTeleportCommand();
registerGameModeCommand(); registerGameModeCommand();
DebugRendererCommand.register(); DebugRendererCommand.register();
DebugAICommand.register();
log.info("Registered debug commands"); log.info("Registered debug commands");
} }

View File

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