/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):
parseIntWithMin(sender, args[1], Integer.MIN_VALUE)— 把第二个参数解析为维度 ID,下限放宽到Integer.MIN_VALUE,即负数维度 ID 也能通过。getPlayer(sender, args[0])— 按玩家名取出目标EntityPlayerMP;名字不存在时由CommandBase抛错。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 行已经抛异常了。
相关条目
- DummyCore 配置 —
mainMenuID等全局配置项