From 8b0309828081f005ea97c940b17e392442322ae8 Mon Sep 17 00:00:00 2001 From: TheWhiteDog9487 Date: Wed, 11 Feb 2026 18:12:06 +0800 Subject: [PATCH] =?UTF-8?q?0.5.0=20=E6=94=AF=E6=8C=81=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E5=AF=B9=E8=A7=92=E7=BA=BF=E5=9D=90=E6=A0=87=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E9=9A=8F=E6=9C=BA=E5=9D=90=E6=A0=87=E9=80=89=E5=8F=96=E8=8C=83?= =?UTF-8?q?=E5=9B=B4=20=E8=BF=9C=E7=A6=BB=E8=BE=B9=E7=95=8C=E8=BF=99?= =?UTF-8?q?=E4=B8=AA=E4=BF=9D=E6=8A=A4=E7=9A=84=E5=AE=9E=E7=8E=B0=E6=9C=89?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=8C=E7=84=B6=E5=90=8E=E5=9C=B0=E7=8B=B1?= =?UTF-8?q?=E6=9C=AB=E5=9C=B0=E4=BB=80=E4=B9=88=E7=8E=A9=E6=84=8F=E7=9A=84?= =?UTF-8?q?=E4=B9=9F=E4=B8=8D=E5=AF=B9=EF=BC=8C=E9=87=8D=E8=AF=95=E6=9C=BA?= =?UTF-8?q?=E5=88=B6=E4=B9=9F=E4=B8=8D=E5=AD=98=E5=9C=A8=EF=BC=8C=E8=BF=99?= =?UTF-8?q?=E4=BA=9B=E4=B9=8B=E5=90=8E=E5=86=8D=E9=B8=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 97 +++++++---- gradle.properties | 2 +- .../xyz/thewhitedog9487/CommandRegister.java | 162 ++++++++++++++---- .../ResourceReloaderListener.java | 15 +- .../assets/randomteleporter/lang/en_us.json | 6 +- .../assets/randomteleporter/lang/zh_cn.json | 6 +- 6 files changed, 209 insertions(+), 79 deletions(-) diff --git a/README.md b/README.md index 07c3017..070b7ca 100644 --- a/README.md +++ b/README.md @@ -1,61 +1,84 @@ # 介绍 -这个模组增加了一个命令(/rtp),用于将玩家随机传送到世界的任何一个位置。 +这个模组增加了一个命令 `/rtp`,用于将玩家随机传送到世界的任何一个位置。 # 命令格式 -- /rtp -- /rtp -- /rtp -- /rtp -- /rtp -- /rtp -- /rtp -- /rtp -- /rtp -- /rtp +- `/rtp` +- `/rtp <随机半径>` +- `/rtp <被传送玩家ID>` +- `/rtp <随机半径> <被传送玩家ID>` +- `/rtp <被传送玩家ID> <随机半径>` +- `/rtp <随机半径> <随机中心点坐标>` +- `/rtp <随机半径> <被传送玩家ID> <作为随机中心的实体>` +- `/rtp <随机半径> <被传送玩家ID> <随机中心点坐标>` +- `/rtp <被传送玩家ID> <随机半径> <作为随机中心的实体>` +- `/rtp <被传送玩家ID> <随机半径> <随机中心点坐标>` +- `/rtp <随机区域起点坐标> <随机区域终点坐标>` +- `/rtp <被传送玩家ID> <随机区域起点坐标> <随机区域终点坐标>` +- `/rtp <随机区域起点坐标> <随机区域终点坐标> <被传送玩家ID>` +- `/rtp <随机区域起点实体> <随机区域终点实体>` +- `/rtp <随机区域起点实体> <随机区域终点实体> <被传送玩家ID>` ## 命令示例 -- /rtp -将执行命令的玩家随机传送到以(0,0)为中心点,2.9e7 - 1e4作为随机半径的范围内的随机一点 +- `/rtp` +将执行命令的玩家随机传送到以`(0,0)`为中心点,2.9e7 - 1e4作为随机半径的范围内的随机一点 2.9e+7 = 2.9 x 10^7 = 29000000 = 两千九百万 1e4 = 10^4 = 10000 = 一万 -- /rtp 1000 -将执行命令的玩家随机传送到以(0,0)为中心点,1000作为随机半径的范围内的随机一点 +- `/rtp 1000` +将执行命令的玩家随机传送到以`(0,0)`为中心点,1000作为随机半径的范围内的随机一点 -- /rtp TheWhiteDog9487 -将TheWhiteDog9487随机传送到以(0,0)为中心点,2.9e7 - 1e4作为随机半径的范围内的随机一点 +- `/rtp TheWhiteDog9487` +将TheWhiteDog9487随机传送到以`(0,0)`为中心点,2.9e7 - 1e4作为随机半径的范围内的随机一点 -- /rtp TheWhiteDog9487 1000 -将TheWhiteDog9487随机传送到以(0,0)为中心点,1000作为随机半径的范围内的随机一点 +- `/rtp TheWhiteDog9487 1000` +将TheWhiteDog9487随机传送到以`(0,0)`为中心点,1000作为随机半径的范围内的随机一点 -- /rtp 1000 TheWhiteDog9487 -将TheWhiteDog9487随机传送到以(0,0)为中心点,1000作为随机半径的范围内的随机一点 +- `/rtp 1000 TheWhiteDog9487` +将TheWhiteDog9487随机传送到以`(0,0)`为中心点,1000作为随机半径的范围内的随机一点 -- /rtp 1000 10000 10000 -将执行命令的玩家随机传送到以(10000,10000)为中心点,1000作为随机半径的范围内的随机一点 +- `/rtp 1000 10000 10000` +将执行命令的玩家随机传送到以`(10000,10000)`为中心点,1000作为随机半径的范围内的随机一点 -- /rtp 1000 TheWhiteDog9487 TheWhiteDog_CN +- `/rtp 1000 TheWhiteDog9487 TheWhiteDog_CN` 将TheWhiteDog9487随机传送到以TheWhiteDog_CN所在位置为中心点,1000作为随机半径的范围内的随机一点 -- /rtp 1000 TheWhiteDog9487 10000 10000 -将TheWhiteDog9487随机传送到以(10000,10000)为中心点,1000作为随机半径的范围内的随机一点 +- `/rtp 1000 TheWhiteDog9487 10000 10000` +将TheWhiteDog9487随机传送到以`(10000,10000)`为中心点,1000作为随机半径的范围内的随机一点 -- /rtp TheWhiteDog9487 1000 TheWhiteDog_CN +- `/rtp TheWhiteDog9487 1000 TheWhiteDog_CN` 将TheWhiteDog9487随机传送到以TheWhiteDog_CN所在位置为中心点,1000作为随机半径的范围内的随机一点 -- /rtp TheWhiteDog9487 1000 10000 10000 -将TheWhiteDog9487随机传送到以(10000,10000)为中心点,1000作为随机半径的范围内的随机一点 +- `/rtp TheWhiteDog9487 1000 10000 10000` +将TheWhiteDog9487随机传送到以`(10000,10000)`为中心点,1000作为随机半径的范围内的随机一点 + +- `/rtp 10000 10000 20000 20000` +将执行命令的玩家随机传送到以`(10000,10000)`,`(20000,10000)`,`(20000,20000)`,`(10000,20000)`四个顶点围成的长方形区域内的随机一点 +您需要提供的坐标是这个长方形的任意一个顶点和这个顶点对应的斜对角顶点的位置 + +- `/rtp TheWhiteDog9487 10000 10000 20000 20000` +将TheWhiteDog9487随机传送到以`(10000,10000)`,`(20000,10000)`,`(20000,20000)`,`(10000,20000)`四个顶点围成的长方形区域内的随机一点 + +- `/rtp 10000 10000 20000 20000 TheWhiteDog9487` +将TheWhiteDog9487随机传送到以`(10000,10000)`,`(20000,10000)`,`(20000,20000)`,`(10000,20000)`四个顶点围成的长方形区域内的随机一点 + +- `/rtp TheWhiteDog9487 TheWhiteDog_CN` +将命令执行者传送到以TheWhiteDog9487和TheWhiteDog_CN当前所在位置为对角线的长方形区域内的随机一点 + +- `/rtp TheWhiteDog9487 TheWhiteDog_CN TheWhiteDog4568` +将TheWhiteDog4568随机传送到以TheWhiteDog9487和TheWhiteDog_CN当前所在位置为对角线的长方形区域内的随机一点 ### 特别提示 -/rtp 这种格式不存在。 +`/rtp <随机半径> <作为随机中心的实体>` 这种格式不存在。 因为第二个参数可能是被传送玩家名,也可能是做随机中心点的实体。 这两种都是实体类型,无法区分到底是哪一种,存在歧义。 +同样,`/rtp <被传送玩家ID> <随机区域起点实体> <随机区域终点实体>` 这一组也是不存在的 +三个参数都是实体类型,没办法区分`被传送玩家ID`是第一个还是第三个 # 依赖项 -由于我使用了fabric.api.command.v2中的CommandRegistrationCallback.EVENT来向游戏注册命令,所以这个模组需要依赖Fabric API +Fabric API # 关于玩家权限 -我参照原版的 /tp 命令,给 /rtp 设置了2级的权限要求。 +我参照原版的 `/tp` 命令,给 `/rtp` 设置了2级的权限要求。 如果是原版或者类原版,你只需要让玩家有作弊的权限就可以用。 插件服务器方面那些具体的权限分配,因为我自己没玩过所以我也没法给出参考意见。 @@ -67,7 +90,7 @@ 2. 单人游戏 + 开放局域网 1. 使用客户端内置的服务器,开放局域网的那位玩家的客户端需要安装 2. 其他加入游戏的玩家不需要安装 -3. 使用独立服务器(类似server.jar这种文件) +3. 使用独立服务器(类似`server.jar`这种文件) 1. 服务器需要安装 2. 客户端不需要 @@ -75,11 +98,11 @@ 如果有查看多语言翻译文本的需求 ,那建议还是都装一下吧。** # 一些小彩蛋 -你可以使用 /随机传送 来替代 /rtp +你可以使用 `/随机传送` 来替代 `/rtp` 没错,Minecraft的命令是可以存在非ASCII字符的,所以我就整了一个 例如: -- /rtp TheWhiteDog9487 1000 -- /随机传送 TheWhiteDog9487 1000 +- `/rtp TheWhiteDog9487 1000` +- `/随机传送 TheWhiteDog9487 1000` 这两个命令的效果没有任何差别 -玩家权限限制和 /rtp 当然也是一样的,都是2级 \ No newline at end of file +玩家权限限制和 `/rtp` 当然也是一样的,都是2级 \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 88bf906..2a301fe 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ minecraft_version=1.21.11 loader_version=0.18.2 # Mod Properties -mod_version=0.4.0 +mod_version=0.5.0 maven_group=xyz.thewhitedog9487 archives_base_name=RandomTeleporter diff --git a/src/main/java/xyz/thewhitedog9487/CommandRegister.java b/src/main/java/xyz/thewhitedog9487/CommandRegister.java index 44bb4c0..b751923 100644 --- a/src/main/java/xyz/thewhitedog9487/CommandRegister.java +++ b/src/main/java/xyz/thewhitedog9487/CommandRegister.java @@ -18,7 +18,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.phys.Vec2; import net.minecraft.world.level.Level; import net.minecraft.world.level.chunk.status.ChunkStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.util.HashSet; import java.util.Set; @@ -88,7 +88,7 @@ public class CommandRegister { // /rtp .requires(Commands.hasPermission(PermissionLevel)) .executes(context -> ExecuteCommand( - context.getSource(),null,null, null)) + context.getSource(),null,null, null, null, null)) // /rtp .then(argument(CommandArgumentName_Radius, IntegerArgumentType.integer(0)) .requires(Commands.hasPermission(PermissionLevel)) @@ -96,6 +96,8 @@ public class CommandRegister { context.getSource(), IntegerArgumentType.getInteger(context, CommandArgumentName_Radius), null, + null, + null, null))) // /rtp .then(argument(CommandArgumentName_Target, EntityArgument.entity()) @@ -104,6 +106,8 @@ public class CommandRegister { context.getSource(), null, EntityArgument.getEntity(context,CommandArgumentName_Target), + null, + null, null))) // /rtp .then(argument(CommandArgumentName_Radius, IntegerArgumentType.integer(0)) @@ -113,6 +117,8 @@ public class CommandRegister { context.getSource(), IntegerArgumentType.getInteger(context, CommandArgumentName_Radius), EntityArgument.getEntity(context,CommandArgumentName_Target), + null, + null, null)))) // /rtp .then(argument(CommandArgumentName_Target, EntityArgument.entity()) @@ -122,6 +128,8 @@ public class CommandRegister { context.getSource(), IntegerArgumentType.getInteger(context, CommandArgumentName_Radius), EntityArgument.getEntity(context,CommandArgumentName_Target), + null, + null, null)))) // // /rtp // .then(argument("Radius(半径)", LongArgumentType.longArg()) @@ -140,8 +148,9 @@ public class CommandRegister { context.getSource(), IntegerArgumentType.getInteger(context, CommandArgumentName_Radius), null, - Vec2Argument.getVec2(context,CommandArgumentName_OriginPosition))))) - // /rtp <被传送玩家名(PlayerID)> + Vec2Argument.getVec2(context,CommandArgumentName_OriginPosition), + null, + null)))) // /rtp .then(argument(CommandArgumentName_Radius, IntegerArgumentType.integer(0)) .then(argument(CommandArgumentName_Target, EntityArgument.entity()) @@ -152,8 +161,9 @@ public class CommandRegister { IntegerArgumentType.getInteger(context, CommandArgumentName_Radius), EntityArgument.getEntity(context,CommandArgumentName_Target), new Vec2( (float) EntityArgument.getEntity( context,CommandArgumentName_OriginEntity).position().x, - (float) EntityArgument.getEntity( context,CommandArgumentName_OriginEntity).position().z )))))) - // /rtp <被传送玩家名(PlayerID)> + (float) EntityArgument.getEntity( context,CommandArgumentName_OriginEntity).position().z ), + null, + null))))) // /rtp .then(argument(CommandArgumentName_Radius, IntegerArgumentType.integer(0)) .then(argument(CommandArgumentName_Target, EntityArgument.entity()) @@ -163,8 +173,9 @@ public class CommandRegister { context.getSource(), IntegerArgumentType.getInteger(context, CommandArgumentName_Radius), EntityArgument.getEntity(context,CommandArgumentName_Target), - Vec2Argument.getVec2(context,CommandArgumentName_OriginPosition)))))) - // /rtp <被传送玩家名(PlayerID)> + Vec2Argument.getVec2(context,CommandArgumentName_OriginPosition), + null, + null))))) // /rtp .then(argument(CommandArgumentName_Target, EntityArgument.entity()) .then(argument(CommandArgumentName_Radius, IntegerArgumentType.integer(0)) @@ -175,8 +186,9 @@ public class CommandRegister { IntegerArgumentType.getInteger(context, CommandArgumentName_Radius), EntityArgument.getEntity(context,CommandArgumentName_Target), new Vec2( (float) EntityArgument.getEntity( context,CommandArgumentName_OriginEntity).position().x, - (float) EntityArgument.getEntity( context,CommandArgumentName_OriginEntity).position().z )))))) - // /rtp <被传送玩家名(PlayerID)> + (float) EntityArgument.getEntity( context,CommandArgumentName_OriginEntity).position().z ), + null, + null))))) // /rtp .then(argument(CommandArgumentName_Target, EntityArgument.entity()) .then(argument(CommandArgumentName_Radius, IntegerArgumentType.integer(0)) @@ -186,7 +198,71 @@ public class CommandRegister { context.getSource(), IntegerArgumentType.getInteger(context, CommandArgumentName_Radius), EntityArgument.getEntity(context,CommandArgumentName_Target), - Vec2Argument.getVec2(context,CommandArgumentName_OriginPosition)))))) );});} + Vec2Argument.getVec2(context,CommandArgumentName_OriginPosition), + null, + null))))) + // /rtp + .then(argument(CommandArgumentName_RegionFromPosition, Vec2Argument.vec2()) + .then(argument(CommandArgumentName_RegionToPosition, Vec2Argument.vec2()) + .requires(Commands.hasPermission(PermissionLevel)) + .executes(context -> ExecuteCommand( + context.getSource(), + null, + null, + null, + Vec2Argument.getVec2(context, CommandArgumentName_RegionFromPosition), + Vec2Argument.getVec2(context, CommandArgumentName_RegionToPosition))))) + // /rtp + .then(argument(CommandArgumentName_RegionFromPosition, Vec2Argument.vec2()) + .then(argument(CommandArgumentName_RegionToPosition, Vec2Argument.vec2()) + .then(argument(CommandArgumentName_Target, EntityArgument.entity()) + .requires(Commands.hasPermission(PermissionLevel)) + .executes(context -> ExecuteCommand( + context.getSource(), + null, + EntityArgument.getEntity(context,CommandArgumentName_Target), + null, + Vec2Argument.getVec2(context, CommandArgumentName_RegionFromPosition), + Vec2Argument.getVec2(context, CommandArgumentName_RegionToPosition)))))) + // /rtp + .then(argument(CommandArgumentName_Target, EntityArgument.entity()) + .then(argument(CommandArgumentName_RegionFromPosition, Vec2Argument.vec2()) + .then(argument(CommandArgumentName_RegionToPosition, Vec2Argument.vec2()) + .requires(Commands.hasPermission(PermissionLevel)) + .executes(context -> ExecuteCommand( + context.getSource(), + null, + EntityArgument.getEntity(context,CommandArgumentName_Target), + null, + Vec2Argument.getVec2(context, CommandArgumentName_RegionFromPosition), + Vec2Argument.getVec2(context, CommandArgumentName_RegionToPosition)))))) + // /rtp + .then(argument(CommandArgumentName_RegionFromEntity, EntityArgument.entity()) + .then(argument(CommandArgumentName_RegionToEntity, EntityArgument.entity()) + .requires(Commands.hasPermission(PermissionLevel)) + .executes(context -> ExecuteCommand( + context.getSource(), + null, + null, + null, + new Vec2( (float) EntityArgument.getEntity( context,CommandArgumentName_RegionFromEntity).position().x, + (float) EntityArgument.getEntity( context,CommandArgumentName_RegionFromEntity).position().z ), + new Vec2( (float) EntityArgument.getEntity( context,CommandArgumentName_RegionToEntity).position().x, + (float) EntityArgument.getEntity( context,CommandArgumentName_RegionToEntity).position().z ) ) ))) + // /rtp + .then(argument(CommandArgumentName_RegionFromEntity, EntityArgument.entity()) + .then(argument(CommandArgumentName_RegionToEntity, EntityArgument.entity()) + .then(argument(CommandArgumentName_Target, EntityArgument.entity()) + .requires(Commands.hasPermission(PermissionLevel)) + .executes(context -> ExecuteCommand( + context.getSource(), + null, + EntityArgument.getEntity(context,CommandArgumentName_Target), + null, + new Vec2( (float) EntityArgument.getEntity( context,CommandArgumentName_RegionFromEntity).position().x, + (float) EntityArgument.getEntity( context,CommandArgumentName_RegionFromEntity).position().z ), + new Vec2( (float) EntityArgument.getEntity( context,CommandArgumentName_RegionToEntity).position().x, + (float) EntityArgument.getEntity( context,CommandArgumentName_RegionToEntity).position().z )))))) );});} /** * 向游戏内注册命令 @@ -205,9 +281,11 @@ public class CommandRegister { * @param Radius 随机选择的目的坐标距离参数 {@code Origin} 的最大距离 * @param Entity 被传送的实体 * @param Origin 随机选择的目的坐标的中心 + * @param RegionFrom 选择随机坐标的范围的起始坐标 + * @param RegionTo 选择随机坐标的范围的结束坐标 * @return 命令运行是否成功 */ - static int ExecuteCommand(CommandSourceStack Source, @Nullable Integer Radius, @Nullable Entity Entity, @Nullable Vec2 Origin){ + static int ExecuteCommand(CommandSourceStack Source, @Nullable Integer Radius, @Nullable Entity Entity, @Nullable Vec2 Origin, @Nullable Vec2 RegionFrom, @Nullable Vec2 RegionTo){ Entity TargetEntity = Entity == null ? Source.getPlayer() : Entity; /* ↑ @@ -219,34 +297,46 @@ public class CommandRegister { */ if (TargetEntity == null) { Source.sendSuccess(()->{ return Component.translatableWithFallback("error.no_target","不存在被传送目标,由非玩家物体执行命令时请显式指定被传送玩家ID"); }, true); - return -1;} - if (Radius == null){Radius = (int) (WorldBorder - 1e4);} - // ↑ 远离世界边界 + return -1; } int Coordinate_X = 0; int Coordinate_Z = 0; - try { - if (Origin == null){ - Coordinate_X = SR.nextInt(-Radius, Radius + 1); - Coordinate_Z = SR.nextInt(-Radius, Radius + 1); } - else{ - Coordinate_X = SR.nextInt((int) Origin.x - Radius, (int) Origin.x + Radius + 1); - Coordinate_Z = SR.nextInt((int) Origin.y - Radius, (int) Origin.y + Radius + 1); } } - catch (IllegalArgumentException e) { - // 半径为零 - if (Origin == null) { - Source.sendSuccess(()->{ return Component.translatableWithFallback("warning.radius_equal_zero_no_target", "由于你设置的随机半径为0,并且未设置随机中心点坐标,因此什么都不会发生"); },true); - return -1;} - else { - Coordinate_X = (int) Origin.x; - Coordinate_Z = (int) Origin.y; - int finalCoordinate_X1 = Coordinate_X; - int finalCoordinate_Z1 = Coordinate_Z; - // ↑ "lambda 表达式中使用的变量应为 final 或有效 final" - Source.sendSuccess(()->{ return Component.translatableWithFallback("warning.radius_equal_zero", "警告:由于你设置的随机半径为0,因此在选择出合适高度之后将直接把你传送至%d %d", finalCoordinate_X1, finalCoordinate_Z1); },true);}} + if (RegionFrom == null || RegionTo == null) { // ← 按半径和中心取随机 + if (Radius == null) { Radius = (int) (WorldBorder - 1e4); } + // ↑ 远离世界边界 + try { + if (Origin == null) { + Coordinate_X = SR.nextInt(-Radius, Radius + 1); + Coordinate_Z = SR.nextInt(-Radius, Radius + 1); } + else { + Coordinate_X = SR.nextInt((int) Origin.x - Radius, (int) Origin.x + Radius + 1); + Coordinate_Z = SR.nextInt((int) Origin.y - Radius, (int) Origin.y + Radius + 1); } } + catch (IllegalArgumentException e) { + // 半径为零 + if (Origin == null) { + Source.sendSuccess(() -> { + return Component.translatableWithFallback("warning.radius_equal_zero_no_target", "由于你设置的随机半径为0,并且未设置随机中心点坐标,因此什么都不会发生"); }, true); + return -1; } + else { + Coordinate_X = (int) Origin.x; + Coordinate_Z = (int) Origin.y; + int finalCoordinate_X1 = Coordinate_X; + int finalCoordinate_Z1 = Coordinate_Z; + // ↑ "lambda 表达式中使用的变量应为 final 或有效 final" + Source.sendSuccess(() -> { + return Component.translatableWithFallback("warning.radius_equal_zero", "警告:由于你设置的随机半径为0,因此在选择出合适高度之后将直接把你传送至%d %d", finalCoordinate_X1, finalCoordinate_Z1); }, true); } } } + else { // ← 按范围取随机 + Coordinate_X = SR.nextInt( Math.min( (int)RegionFrom.x, (int)RegionTo.x ), Math.max( (int)RegionFrom.x, (int)RegionTo.x ) + 1 ); + Coordinate_Z = SR.nextInt( Math.min( (int)RegionFrom.y, (int)RegionTo.y ), Math.max( (int)RegionFrom.y, (int)RegionTo.y ) + 1 ); } + if (Coordinate_X >= WorldBorder){ Coordinate_X = (int) (WorldBorder - 1e4); } + else if (Coordinate_X <= -WorldBorder){ Coordinate_X = (int) (-WorldBorder + 1e4); } + if (Coordinate_Z >= WorldBorder){ Coordinate_Z = (int) (WorldBorder - 1e4); } + else if (Coordinate_Z <= -WorldBorder){ Coordinate_Z = (int) (-WorldBorder + 1e4); } + // ↑ 远离世界边界 Level EntityWorld = TargetEntity.level(); EntityWorld.getChunk(Coordinate_X >> 4, Coordinate_Z >> 4, ChunkStatus.FULL, true); // ↑ 加载目标区块,不然下面获取到的Coordinate_Y一定是-64 - // 必须是 >> 4 ,不能是 / 16 + // 按位右移4和除以16在被除数小于0时的结果不一致,一个是向上取整,一个是向下取整 + // 因此必须是 >> 4 ,不能是 / 16 int Coordinate_Y = EntityWorld.getHeight(MOTION_BLOCKING_NO_LEAVES, Coordinate_X, Coordinate_Z); BlockPos.MutableBlockPos BlockPos = new BlockPos.MutableBlockPos(); for (int x = -1; x <= 1; x++) { @@ -265,5 +355,5 @@ public class CommandRegister { // ↑ "lambda 表达式中使用的变量应为 final 或有效 final" final var FeedbackFallbackString = String.format("已将玩家%s传送到%d %d %d", TargetEntity.getName().getString(), Coordinate_X, Coordinate_Y, Coordinate_Z); Source.sendSuccess(()->{ return Component.translatableWithFallback("info.success", FeedbackFallbackString, TargetEntity.getName(), finalCoordinate_X, Coordinate_Y, finalCoordinate_Z); },true); - return Command.SINGLE_SUCCESS;} + return Command.SINGLE_SUCCESS; } } \ No newline at end of file diff --git a/src/main/java/xyz/thewhitedog9487/ResourceReloaderListener.java b/src/main/java/xyz/thewhitedog9487/ResourceReloaderListener.java index 72596fb..c2af0d7 100644 --- a/src/main/java/xyz/thewhitedog9487/ResourceReloaderListener.java +++ b/src/main/java/xyz/thewhitedog9487/ResourceReloaderListener.java @@ -4,6 +4,7 @@ import net.fabricmc.fabric.api.resource.v1.ResourceLoader; import net.fabricmc.fabric.api.resource.v1.reloader.SimpleResourceReloader; import net.minecraft.network.chat.Component; import net.minecraft.resources.Identifier; +import org.jspecify.annotations.NonNull; import static net.minecraft.server.packs.PackType.CLIENT_RESOURCES; import static xyz.thewhitedog9487.RandomTeleporter.MOD_ID; @@ -16,6 +17,10 @@ public class ResourceReloaderListener { public static String CommandArgumentName_Target = "PlayerID(被传送玩家名)"; public static String CommandArgumentName_OriginPosition = "OriginPos(随机中心,坐标)"; public static String CommandArgumentName_OriginEntity = "OriginEntity(随机中心,实体)"; + public static String CommandArgumentName_RegionFromPosition = "RegionFrom(随机范围起始位置,坐标)"; + public static String CommandArgumentName_RegionToPosition = "RegionTo(随机范围结束位置,坐标)"; + public static String CommandArgumentName_RegionFromEntity = "RegionFrom(随机范围起始位置,实体)"; + public static String CommandArgumentName_RegionToEntity = "RegionTo(随机范围结束位置,实体)"; public static void Register(){ ResourceLoader.get(CLIENT_RESOURCES).registerReloader(Identifier.fromNamespaceAndPath(MOD_ID, "translate_text_apply"), new SimpleResourceReloader() { @@ -23,12 +28,16 @@ public class ResourceReloaderListener { * 用不到,不用管 */ @Override - protected Void prepare(SharedState store) { + protected Void prepare(@NonNull SharedState store) { return null; } @Override - protected void apply(Void prepared, SharedState store) { + protected void apply(Void prepared, @NonNull SharedState store) { CommandArgumentName_Radius = Component.translatableWithFallback("command.argument.radius", "Radius(半径)").getString(); CommandArgumentName_Target = Component.translatableWithFallback("command.argument.target", "PlayerID(被传送玩家名)").getString(); CommandArgumentName_OriginPosition = Component.translatableWithFallback("command.argument.origin_pos", "OriginPos(随机中心,坐标)").getString(); - CommandArgumentName_OriginEntity = Component.translatableWithFallback("command.argument.origin_entity", "OriginEntity(随机中心,实体)").getString(); } } ); } } \ No newline at end of file + CommandArgumentName_OriginEntity = Component.translatableWithFallback("command.argument.origin_entity", "OriginEntity(随机中心,实体)").getString(); + CommandArgumentName_RegionFromPosition = Component.translatableWithFallback("command.argument.region_from_pos", "RegionFrom(随机范围起始位置,坐标)").getString(); + CommandArgumentName_RegionToPosition = Component.translatableWithFallback("command.argument.region_to_pos", "RegionTo(随机范围结束位置,坐标)").getString(); + CommandArgumentName_RegionFromEntity = Component.translatableWithFallback("command.argument.region_from_entity", "RegionFrom(随机范围起始位置,实体)").getString(); + CommandArgumentName_RegionToEntity = Component.translatableWithFallback("command.argument.region_to_entity", "RegionTo(随机范围结束位置,实体)").getString(); } } ); } } \ No newline at end of file diff --git a/src/main/resources/assets/randomteleporter/lang/en_us.json b/src/main/resources/assets/randomteleporter/lang/en_us.json index 1f0e207..cf63b48 100644 --- a/src/main/resources/assets/randomteleporter/lang/en_us.json +++ b/src/main/resources/assets/randomteleporter/lang/en_us.json @@ -9,5 +9,9 @@ "command.argument.radius": "radius", "command.argument.target": "teleported entity", "command.argument.origin_pos": "origin(pos)", - "command.argument.origin_entity": "origin(entity)" + "command.argument.origin_entity": "origin(entity)", + "command.argument.region_from_pos": "region start(pos)", + "command.argument.region_to_pos": "region end(pos)", + "command.argument.region_from_entity": "region start(entity)", + "command.argument.region_to_entity": "region end(entity)" } \ No newline at end of file diff --git a/src/main/resources/assets/randomteleporter/lang/zh_cn.json b/src/main/resources/assets/randomteleporter/lang/zh_cn.json index 941aa5c..63f344a 100644 --- a/src/main/resources/assets/randomteleporter/lang/zh_cn.json +++ b/src/main/resources/assets/randomteleporter/lang/zh_cn.json @@ -9,5 +9,9 @@ "command.argument.radius": "半径", "command.argument.target": "被传送实体", "command.argument.origin_pos": "随机中心(坐标)", - "command.argument.origin_entity": "随机中心(实体)" + "command.argument.origin_entity": "随机中心(实体)", + "command.argument.region_from_pos": "坐标选取区域起点(坐标)", + "command.argument.region_to_pos": "坐标选取区域终点(坐标)", + "command.argument.region_from_entity": "坐标选取区域起点(实体)", + "command.argument.region_to_entity": "坐标选取区域终点(实体)" } \ No newline at end of file