package autodig.client.command; import autodig.client.AutoDigModClient; import autodig.client.config.MineTask; import autodig.client.controller.DigController; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.StringArgumentType; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.client.MinecraftClient; import net.minecraft.text.Text; /** * AutoDig 客户端命令。 * *

提供 {@code /autodig gui}(打开界面)、{@code /autodig start <任务>} * (直接启动)、{@code /autodig stop}(停止当前任务)、{@code /autodig status} * (查看实时状态)四个快捷入口,方便在未绑定的快捷键场景下使用。

*/ public final class AutoDigCommands { private AutoDigCommands() { } public static void register(CommandDispatcher dispatcher) { dispatcher.register(com.mojang.brigadier.builder.LiteralArgumentBuilder .literal("autodig") .then(com.mojang.brigadier.builder.LiteralArgumentBuilder.literal("gui") .executes(ctx -> { AutoDigModClient.instance().openGui(); return 1; })) .then(com.mojang.brigadier.builder.LiteralArgumentBuilder.literal("start") .then(com.mojang.brigadier.builder.RequiredArgumentBuilder .argument("task", StringArgumentType.word()) .executes(ctx -> { String name = StringArgumentType.getString(ctx, "task"); MineTask task = parseTask(name); if (task == null) { ctx.getSource().sendFeedback(Text.literal("未知任务: " + name + "(可用 overworld / nether / none)")); return 0; } AutoDigModClient mod = AutoDigModClient.instance(); mod.config().task = task; mod.saveConfig(); mod.sendToast("AutoDig: 已选择任务 " + task.label()); return 1; }))) .then(com.mojang.brigadier.builder.LiteralArgumentBuilder.literal("stop") .executes(ctx -> { AutoDigModClient mod = AutoDigModClient.instance(); mod.config().task = MineTask.NONE; mod.saveConfig(); mod.bridge().cancelAll(); mod.sendToast("AutoDig: 已停止"); return 1; })) .then(com.mojang.brigadier.builder.LiteralArgumentBuilder.literal("status") .executes(ctx -> { AutoDigModClient mod = AutoDigModClient.instance(); if (mod == null) { ctx.getSource().sendFeedback(Text.literal("AutoDig 未初始化")); return 0; } MinecraftClient client = MinecraftClient.getInstance(); boolean playerOk = client.player != null; String task = "任务: " + mod.config().task.label(); String state = "状态: " + mod.controller().statusText(); String hp = playerOk ? "血量: " + String.format("%.0f%%", client.player.getHealth() / Math.max(client.player.getMaxHealth(), 1.0) * 100.0) : "血量: --"; String food = playerOk ? "饥饿: " + client.player.getHungerManager().getFoodLevel() + "/20" : "饥饿: --"; String time = "时间: " + mod.controller().stats().elapsedString(); String deaths = "死亡: " + mod.controller().stats().getDeaths(); ctx.getSource().sendFeedback(Text.literal("§e== AutoDig 状态 ==")); ctx.getSource().sendFeedback(Text.literal("§7" + task)); ctx.getSource().sendFeedback(Text.literal("§7" + state)); ctx.getSource().sendFeedback(Text.literal("§7" + time)); ctx.getSource().sendFeedback(Text.literal("§7" + deaths)); if (playerOk) { ctx.getSource().sendFeedback(Text.literal("§7" + hp)); ctx.getSource().sendFeedback(Text.literal("§7" + food)); } return 1; }))); } private static MineTask parseTask(String name) { return switch (name.toLowerCase()) { case "overworld", "主世界", "ow" -> MineTask.OVERWORLD; case "nether", "下界" -> MineTask.NETHER; case "none", "stop", "空闲" -> MineTask.NONE; default -> null; }; } }