/DummyCore.Transfer

DummyCore 唯一注册的客户端/服务端指令,把指定玩家传送到指定维度。

基本信息

属性 值
类型 指令
指令名 DummyCore.Transfer(含英文句点,非纯字母)
语法 /DummyCore.Transfer <player> <dimensionID>
权限等级 未覆写 getRequiredPermissionLevel(),沿用 CommandBase 默认值 0(所有玩家可用)
注册时机 FMLServerStartingEvent(服务端启动时)
注册位置 DummyCore/Core/CoreInitialiser.java:96-100
实现类 DummyCore/Utils/CommandTransfer.java

行为

服务端启动时,CoreInitialiser.serverStart() 通过 ((CommandHandler) mcserver.getCommandManager()).registerCommand(new CommandTransfer()) 把指令挂到服务端命令树上,之后即可由玩家或控制台调用。

执行流程(CommandTransfer.processCommand):

  1. parseIntWithMin(sender, args[1], Integer.MIN_VALUE) — 把第二个参数解析为维度 ID,下限放宽到 Integer.MIN_VALUE,即负数维度 ID 也能通过。
  2. getPlayer(sender, args[0]) — 按玩家名取出目标 EntityPlayerMP;名字不存在时由 CommandBase 抛错。
  3. player.travelToDimension(var3) — 调用原版跨维度传送。

由于权限等级为 0,任何玩家都可以把自己或他人传送到任意维度 ID,这实际上是本指令最需要注意的行为。指令本身不校验维度是否存在,travelToDimension 被交给原版处理。

数值

数值 值
最小维度 ID Integer.MIN_VALUE(无实际下限)
权限等级 0

源码缺陷:缺少参数个数校验

DummyCore/Utils/CommandTransfer.java:21-22

int var3 = parseIntWithMin(sender, args[1], Integer.MIN_VALUE);          // 第 21 行
EntityPlayerMP player = args.length == 0 ? getCommandSenderAsPlayer(sender) : getPlayer(sender, args[0]); // 第 22 行

第 21 行在任何长度检查之前就访问了 args[1],第 22 行的 args.length == 0 判断永远来不及生效:

输入 实际结果
/DummyCore.Transfer 第 21 行 ArrayIndexOutOfBoundsException,崩溃
/DummyCore.Transfer <player> 同样在第 21 行崩溃(只传了 1 个参数)
/DummyCore.Transfer <player> <dim> 正常执行

第 22 行的 getCommandSenderAsPlayer(sender)(无参数时把执行者自己当目标)是不可达的死代码——args.length == 0 的那一支永远走不到,因为第 21 行已经抛异常了。

相关条目