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