使单个根名称的命令树一次性完成注册

并且现在由Minecraft自己的命令解析器确保用户输入的随机半径>=0
返回标准Command.SINGLE_SUCCESS
This commit is contained in:
TheWhiteDog9487
2025-10-05 14:08:52 +08:00
parent 48a5027cce
commit eb85fff326

View File

@@ -1,5 +1,6 @@
package xyz.thewhitedog9487; package xyz.thewhitedog9487;
import com.mojang.brigadier.Command;
import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.arguments.IntegerArgumentType;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
@@ -44,68 +45,48 @@ public class CommandRegister {
* @see <a href="https://wiki.fabricmc.net/tutorial:commands">Fabric Wiki (Old style,English)</a> * @see <a href="https://wiki.fabricmc.net/tutorial:commands">Fabric Wiki (Old style,English)</a>
*/ */
public static void Register(String Name){ public static void Register(String Name){
// /rtp
CommandRegistrationCallback.EVENT CommandRegistrationCallback.EVENT
.register((dispatcher, registryAccess, environment) ->{ .register((dispatcher, registryAccess, environment) ->{
dispatcher.register(literal(Name) dispatcher.register(literal(Name)
// /rtp
.requires(source -> source.hasPermissionLevel(PermissionLevel)) .requires(source -> source.hasPermissionLevel(PermissionLevel))
.executes(context -> execute_command( .executes(context -> ExecuteCommand(
context.getSource(),null,null, null)));}); context.getSource(),null,null, null))
// /rtp <Radius(半径)> // /rtp <Radius(半径)>
CommandRegistrationCallback.EVENT .then(argument("Radius(半径)", IntegerArgumentType.integer(0))
.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(literal(Name)
.then(argument("Radius(半径)", IntegerArgumentType.integer())
.requires(source -> source.hasPermissionLevel(PermissionLevel)) .requires(source -> source.hasPermissionLevel(PermissionLevel))
.executes(context -> execute_command( .executes(context -> ExecuteCommand(
context.getSource(), context.getSource(),
IntegerArgumentType.getInteger(context, "Radius(半径)"), IntegerArgumentType.getInteger(context, "Radius(半径)"),
null, null,
null))));}); null)))
// /rtp <被传送玩家名(PlayerID)> // /rtp <被传送玩家名(PlayerID)>
CommandRegistrationCallback.EVENT
.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(literal(Name)
.then(argument("被传送玩家名(PlayerID)", EntityArgumentType.entity()) .then(argument("被传送玩家名(PlayerID)", EntityArgumentType.entity())
.requires(source -> source.hasPermissionLevel(PermissionLevel)) .requires(source -> source.hasPermissionLevel(PermissionLevel))
.executes(context -> execute_command( .executes(context -> ExecuteCommand(
context.getSource(), context.getSource(),
null, null,
EntityArgumentType.getEntity(context,"被传送玩家名(PlayerID)"), EntityArgumentType.getEntity(context,"被传送玩家名(PlayerID)"),
null))));}); null)))
// /rtp <Radius(半径)> <被传送玩家名(PlayerID)> // /rtp <Radius(半径)> <被传送玩家名(PlayerID)>
CommandRegistrationCallback.EVENT .then(argument("Radius(半径)", IntegerArgumentType.integer(0))
.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(literal(Name)
.then(argument("Radius(半径)", IntegerArgumentType.integer())
.then(argument("被传送玩家名(PlayerID)", EntityArgumentType.entity()) .then(argument("被传送玩家名(PlayerID)", EntityArgumentType.entity())
.requires(source -> source.hasPermissionLevel(PermissionLevel)) .requires(source -> source.hasPermissionLevel(PermissionLevel))
.executes(context -> execute_command( .executes(context -> ExecuteCommand(
context.getSource(), context.getSource(),
IntegerArgumentType.getInteger(context, "Radius(半径)"), IntegerArgumentType.getInteger(context, "Radius(半径)"),
EntityArgumentType.getEntity(context,"被传送玩家名(PlayerID)"), EntityArgumentType.getEntity(context,"被传送玩家名(PlayerID)"),
null)))));}); null))))
// /rtp <被传送玩家名(PlayerID)> <Radius(半径)> // /rtp <被传送玩家名(PlayerID)> <Radius(半径)>
CommandRegistrationCallback.EVENT
.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(literal(Name)
.then(argument("被传送玩家名(PlayerID)", EntityArgumentType.entity()) .then(argument("被传送玩家名(PlayerID)", EntityArgumentType.entity())
.then(argument("Radius(半径)", IntegerArgumentType.integer()) .then(argument("Radius(半径)", IntegerArgumentType.integer(0))
.requires(source -> source.hasPermissionLevel(PermissionLevel)) .requires(source -> source.hasPermissionLevel(PermissionLevel))
.executes(context -> execute_command( .executes(context -> ExecuteCommand(
context.getSource(), context.getSource(),
IntegerArgumentType.getInteger(context, "Radius(半径)"), IntegerArgumentType.getInteger(context, "Radius(半径)"),
EntityArgumentType.getEntity(context,"被传送玩家名(PlayerID)"), EntityArgumentType.getEntity(context,"被传送玩家名(PlayerID)"),
null)))));}); null))))
// // /rtp <Radius(半径)> <Origin(随机中心)> // // /rtp <Radius(半径)> <Origin(随机中心)>
// CommandRegistrationCallback.EVENT
// .register((dispatcher, registryAccess, environment) -> {
// dispatcher.register(literal(Name)
// .then(argument("Radius(半径)", LongArgumentType.longArg()) // .then(argument("Radius(半径)", LongArgumentType.longArg())
// .then(argument("Origin(随机中心)",EntityArgumentType.player()) // .then(argument("Origin(随机中心)",EntityArgumentType.player())
// .requires(source -> source.hasPermissionLevel(PermissionLevel)) // .requires(source -> source.hasPermissionLevel(PermissionLevel))
@@ -113,78 +94,58 @@ public class CommandRegister {
// context.getSource(), // context.getSource(),
// LongArgumentType.getLong(context, "Radius(半径)"), // LongArgumentType.getLong(context, "Radius(半径)"),
// null, // null,
// EntityArgumentType.getEntity(context,"Origin(随机中心)"))))));}); // EntityArgumentType.getEntity(context,"Origin(随机中心)")))))
// /rtp <Radius(半径)> <OriginPos(随机中心,坐标)> // /rtp <Radius(半径)> <OriginPos(随机中心,坐标)>
CommandRegistrationCallback.EVENT .then(argument("Radius(半径)", IntegerArgumentType.integer(0))
.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(literal(Name)
.then(argument("Radius(半径)", IntegerArgumentType.integer())
.then(argument("OriginPos(随机中心,坐标)",Vec2ArgumentType.vec2()) .then(argument("OriginPos(随机中心,坐标)",Vec2ArgumentType.vec2())
.requires(source -> source.hasPermissionLevel(PermissionLevel)) .requires(source -> source.hasPermissionLevel(PermissionLevel))
.executes(context -> execute_command( .executes(context -> ExecuteCommand(
context.getSource(), context.getSource(),
IntegerArgumentType.getInteger(context, "Radius(半径)"), IntegerArgumentType.getInteger(context, "Radius(半径)"),
null, null,
Vec2ArgumentType.getVec2(context,"OriginPos(随机中心,坐标)"))))));}); Vec2ArgumentType.getVec2(context,"OriginPos(随机中心,坐标)")))))
// /rtp <Radius(半径)> <被传送玩家名(PlayerID)> <OriginEntity(随机中心,实体)> // /rtp <Radius(半径)> <被传送玩家名(PlayerID)> <OriginEntity(随机中心,实体)>
CommandRegistrationCallback.EVENT .then(argument("Radius(半径)", IntegerArgumentType.integer(0))
.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(literal(Name)
.then(argument("Radius(半径)", IntegerArgumentType.integer())
.then(argument("被传送玩家名(PlayerID)", EntityArgumentType.entity()) .then(argument("被传送玩家名(PlayerID)", EntityArgumentType.entity())
.then(argument("OriginEntity(随机中心,实体)",EntityArgumentType.entity()) .then(argument("OriginEntity(随机中心,实体)",EntityArgumentType.entity())
.requires(source -> source.hasPermissionLevel(PermissionLevel)) .requires(source -> source.hasPermissionLevel(PermissionLevel))
.executes(context -> execute_command( .executes(context -> ExecuteCommand(
context.getSource(), context.getSource(),
IntegerArgumentType.getInteger(context, "Radius(半径)"), IntegerArgumentType.getInteger(context, "Radius(半径)"),
EntityArgumentType.getEntity(context,"被传送玩家名(PlayerID)"), EntityArgumentType.getEntity(context,"被传送玩家名(PlayerID)"),
new Vec2f( (float) EntityArgumentType.getEntity( context,"OriginEntity(随机中心,实体)").getEntityPos().x, new Vec2f( (float) EntityArgumentType.getEntity( context,"OriginEntity(随机中心,实体)").getEntityPos().x,
(float) EntityArgumentType.getEntity( context,"OriginEntity(随机中心,实体)").getEntityPos().z )))))));}); (float) EntityArgumentType.getEntity( context,"OriginEntity(随机中心,实体)").getEntityPos().z ))))))
// /rtp <Radius(半径)> <被传送玩家名(PlayerID)> <OriginPos(随机中心,坐标)> // /rtp <Radius(半径)> <被传送玩家名(PlayerID)> <OriginPos(随机中心,坐标)>
CommandRegistrationCallback.EVENT .then(argument("Radius(半径)", IntegerArgumentType.integer(0))
.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(literal(Name)
.then(argument("Radius(半径)", IntegerArgumentType.integer())
.then(argument("被传送玩家名(PlayerID)", EntityArgumentType.entity()) .then(argument("被传送玩家名(PlayerID)", EntityArgumentType.entity())
.then(argument("OriginPos(随机中心,坐标)",Vec2ArgumentType.vec2()) .then(argument("OriginPos(随机中心,坐标)",Vec2ArgumentType.vec2())
.requires(source -> source.hasPermissionLevel(PermissionLevel)) .requires(source -> source.hasPermissionLevel(PermissionLevel))
.executes(context -> execute_command( .executes(context -> ExecuteCommand(
context.getSource(), context.getSource(),
IntegerArgumentType.getInteger(context, "Radius(半径)"), IntegerArgumentType.getInteger(context, "Radius(半径)"),
EntityArgumentType.getEntity(context,"被传送玩家名(PlayerID)"), EntityArgumentType.getEntity(context,"被传送玩家名(PlayerID)"),
Vec2ArgumentType.getVec2(context,"OriginPos(随机中心,坐标)")))))));}); Vec2ArgumentType.getVec2(context,"OriginPos(随机中心,坐标)"))))))
// /rtp <被传送玩家名(PlayerID)> <Radius(半径)> <OriginEntity(随机中心,实体)> // /rtp <被传送玩家名(PlayerID)> <Radius(半径)> <OriginEntity(随机中心,实体)>
CommandRegistrationCallback.EVENT
.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(literal(Name)
.then(argument("被传送玩家名(PlayerID)", EntityArgumentType.entity()) .then(argument("被传送玩家名(PlayerID)", EntityArgumentType.entity())
.then(argument("Radius(半径)", IntegerArgumentType.integer()) .then(argument("Radius(半径)", IntegerArgumentType.integer(0))
.then(argument("OriginEntity(随机中心,实体)",EntityArgumentType.entity()) .then(argument("OriginEntity(随机中心,实体)",EntityArgumentType.entity())
.requires(source -> source.hasPermissionLevel(PermissionLevel)) .requires(source -> source.hasPermissionLevel(PermissionLevel))
.executes(context -> execute_command( .executes(context -> ExecuteCommand(
context.getSource(), context.getSource(),
IntegerArgumentType.getInteger(context, "Radius(半径)"), IntegerArgumentType.getInteger(context, "Radius(半径)"),
EntityArgumentType.getEntity(context,"被传送玩家名(PlayerID)"), EntityArgumentType.getEntity(context,"被传送玩家名(PlayerID)"),
new Vec2f( (float) EntityArgumentType.getEntity( context,"OriginEntity(随机中心,实体)").getEntityPos().x, new Vec2f( (float) EntityArgumentType.getEntity( context,"OriginEntity(随机中心,实体)").getEntityPos().x,
(float) EntityArgumentType.getEntity( context,"OriginEntity(随机中心,实体)").getEntityPos().z )))))));}); (float) EntityArgumentType.getEntity( context,"OriginEntity(随机中心,实体)").getEntityPos().z ))))))
// /rtp <被传送玩家名(PlayerID)> <Radius(半径)> <OriginPos(随机中心,坐标)> // /rtp <被传送玩家名(PlayerID)> <Radius(半径)> <OriginPos(随机中心,坐标)>
CommandRegistrationCallback.EVENT
.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(literal(Name)
.then(argument("被传送玩家名(PlayerID)", EntityArgumentType.entity()) .then(argument("被传送玩家名(PlayerID)", EntityArgumentType.entity())
.then(argument("Radius(半径)", IntegerArgumentType.integer()) .then(argument("Radius(半径)", IntegerArgumentType.integer(0))
.then(argument("OriginPos(随机中心,坐标)",Vec2ArgumentType.vec2()) .then(argument("OriginPos(随机中心,坐标)",Vec2ArgumentType.vec2())
.requires(source -> source.hasPermissionLevel(PermissionLevel)) .requires(source -> source.hasPermissionLevel(PermissionLevel))
.executes(context -> execute_command( .executes(context -> ExecuteCommand(
context.getSource(), context.getSource(),
IntegerArgumentType.getInteger(context, "Radius(半径)"), IntegerArgumentType.getInteger(context, "Radius(半径)"),
EntityArgumentType.getEntity(context,"被传送玩家名(PlayerID)"), EntityArgumentType.getEntity(context,"被传送玩家名(PlayerID)"),
Vec2ArgumentType.getVec2(context,"OriginPos(随机中心,坐标)")))))));});} Vec2ArgumentType.getVec2(context,"OriginPos(随机中心,坐标)")))))) );});}
/** /**
* 向游戏内注册命令 * 向游戏内注册命令
@@ -220,7 +181,6 @@ public class CommandRegister {
return -1;} return -1;}
if (Radius == null){Radius = (int) (WorldBorder - 1e4);} if (Radius == null){Radius = (int) (WorldBorder - 1e4);}
// ↑ 远离世界边界 // ↑ 远离世界边界
Radius = Math.abs(Radius);
int Coordinate_X = 0; int Coordinate_X = 0;
int Coordinate_Z = 0; int Coordinate_Z = 0;
try { try {
@@ -271,7 +231,7 @@ public class CommandRegister {
int finalCoordinate_Y = Coordinate_Y; int finalCoordinate_Y = Coordinate_Y;
int finalCoordinate_Z = Coordinate_Z; int finalCoordinate_Z = Coordinate_Z;
// ↑ "lambda 表达式中使用的变量应为 final 或有效 final" // ↑ "lambda 表达式中使用的变量应为 final 或有效 final"
final var FeedbackFallbackString = String.format("已将玩家%s传送到%d %d %d", entity.getName().getString(), Coordinate_X, finalCoordinate_Y, Coordinate_Z); final var FeedbackFallbackString = String.format("已将玩家%s传送到%d %d %d", TargetEntity.getName().getString(), Coordinate_X, Coordinate_Y, Coordinate_Z);
Source.sendFeedback(()->{ return Text.translatableWithFallback("info.success", FeedbackFallbackString, entity.getName(), finalCoordinate_X, finalCoordinate_Y, finalCoordinate_Z); },true); Source.sendFeedback(()->{ return Text.translatableWithFallback("info.success", FeedbackFallbackString, TargetEntity.getName(), finalCoordinate_X, Coordinate_Y, finalCoordinate_Z); },true);
return 16;} return Command.SINGLE_SUCCESS;}
} }