核心改进: - 实时状态 HUD(左上角面板:任务/状态/时长/血量/饥饿/背包/进度) - 自动插火把(黑暗隧道自动防灾,可开关) - 自动进食跳过金苹果/附魔金苹果/紫颂果等特殊食物 - 背包接近满(≥30格)即提前丢垃圾,防误判满包返回 - 杀戮光环排除 Angerable 中立生物(僵尸猪灵/末影人/狼等) - 新增 /autodig status 命令 - GUI 补全设置:自动插火把、进食阈值、保命血量、攻击范围 - 会话统计(时长/死亡次数)联动 HUD 与命令 - 补全 README.md 文档 - 版本升至 2.2.0
94 行
5.4 KiB
Java
94 行
5.4 KiB
Java
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 客户端命令。
|
||
*
|
||
* <p>提供 {@code /autodig gui}(打开界面)、{@code /autodig start <任务>}
|
||
* (直接启动)、{@code /autodig stop}(停止当前任务)、{@code /autodig status}
|
||
* (查看实时状态)四个快捷入口,方便在未绑定的快捷键场景下使用。</p>
|
||
*/
|
||
public final class AutoDigCommands {
|
||
|
||
private AutoDigCommands() {
|
||
}
|
||
|
||
public static void register(CommandDispatcher<FabricClientCommandSource> dispatcher) {
|
||
dispatcher.register(com.mojang.brigadier.builder.LiteralArgumentBuilder
|
||
.<FabricClientCommandSource>literal("autodig")
|
||
.then(com.mojang.brigadier.builder.LiteralArgumentBuilder.<FabricClientCommandSource>literal("gui")
|
||
.executes(ctx -> {
|
||
AutoDigModClient.instance().openGui();
|
||
return 1;
|
||
}))
|
||
.then(com.mojang.brigadier.builder.LiteralArgumentBuilder.<FabricClientCommandSource>literal("start")
|
||
.then(com.mojang.brigadier.builder.RequiredArgumentBuilder
|
||
.<FabricClientCommandSource, String>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.<FabricClientCommandSource>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.<FabricClientCommandSource>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;
|
||
};
|
||
}
|
||
} |