/roguelike 指令
基本信息
| 属性 | 值 |
|---|---|
| 指令名 | roguelike(util/CommandSpawnDungeon.java:27-29) |
| 实现类 | greymerk.roguelike.util.CommandSpawnDungeon extends CommandBase(:25) |
| 权限等级 | 2(getRequiredPermissionLevel(),:34-36) |
| 注册时机 | FMLServerStartingEvent,经 ServerCommandManager.registerCommand(Roguelike.java:42-48) |
| 注册次数 | 1(每服务器启动一次) |
| 补全 | addTabCompletionOptions 直接 return null(:320-323),无补全 |
| 子指令数 | 6(代码实际处理 6 个,用法文本只列 3 个) |
功能
本 mod 只注册这 1 条指令,承担三种职责:手动生成地牢、发放彩蛋物品、重载配置与设置。
⚠️ 用法文本与实际处理不一致。processCommand 在无参数与参数非法两处打印的都是:
Usage: roguelike [dungeon | give | config]
(util/CommandSpawnDungeon.java:49 与 :313)——但代码另外还处理了 dim、settings、citadel 三个子指令,玩家无法从帮助文本得知它们存在。
子指令表
| 子指令 | 参数 | 权限 | 来源 |
|---|---|---|---|
dungeon |
{X Z | here [setting] | nearby [次数]} |
2 | util/CommandSpawnDungeon.java:124-292 |
give |
<novelty_name> |
2 | util/CommandSpawnDungeon.java:97-122 |
config |
reload |
2 | util/CommandSpawnDungeon.java:53-66 |
dim |
无 | 2 | util/CommandSpawnDungeon.java:68-73 |
settings |
reload | list |
2 | util/CommandSpawnDungeon.java:75-95 |
citadel |
<X Z> |
2 | util/CommandSpawnDungeon.java:294-309 |
dungeon 的四种定位方式
| 写法 | 行为 | 来源 |
|---|---|---|
dungeon here [setting] |
以执行者玩家的 posX/posZ 为中心 |
:138-152 |
dungeon nearby |
在玩家附近随机位置生成一座,回报实际坐标 | :153-219 |
dungeon nearby <次数> |
循环生成 <次数> 座,不检查结果 |
:166-201 |
dungeon <X> <Z> [setting] |
精确指定坐标 | :221-235 |
未给 setting 时走 Dungeon.settingsResolver.getSettings(editor, rand, new Coord(x,0,z));若返回 null 则回落到 getDefaultSettings()(:269-291)。
给了 setting 时先 Dungeon.initResolver() 再 getWithDefault(settingName),查不到就中止并回报 Failed: <name> not found.(:240-249)。
⚠️ dungeon nearby <次数> 循环内不检查 toGenerate.generateNear 的结果,也忽略每次的坐标回报,直接统一打印 “Success: Dungeons generated all over the place!”(:188-199)。
give 的物品名
give 把参数交给 ItemNovelty.getItemByName(name)(util/CommandSpawnDungeon.java:111 → treasure/loot/provider/ItemNovelty.java:81),后者查一张 28 项的静态小写名字表。名字不存在时回报 “Failed: No such item”。
物品以 player.entityDropItem(item, 0) 丢在执行者脚下,并把 delayBeforeCanPickup 设为 0 以便立即拾取(:116-117)。因此 give 必须有玩家执行者——纯命令方块调用会因 PlayerNotFoundException 提前返回(:104-110)。
28 个可发放的名字见 彩蛋物品。
其他子指令
| 子指令 | 行为 | 来源 |
|---|---|---|
config reload |
RogueConfig.reload(true),回显 “Success: Configurations Reloaded” |
:59-63 |
dim |
打印 sender.getEntityWorld().provider.dimensionId |
:68-73 |
settings reload |
Dungeon.initResolver(),回显 “Success: Settings Reloaded” |
:82-87 |
settings list |
打印 Dungeon.settingsResolver.toString()(自定义设置名列表) |
:88-92 |
citadel <X> <Z> |
Citadel.generate(new WorldEditor(world), x, z),无成功回报 |
:294-309 |
dim 子指令主要用于排查 dimensionWL / dimensionBL 白名单配置。
数值
| 数值名 | 值 | 来源 |
|---|---|---|
| 权限等级 | 2 | util/CommandSpawnDungeon.java:35 |
| 坐标来源 | 玩家 posX / posZ(未取整,(int) 强转) |
:147-148、:163-164 |
here 的 X/Z 偏移 |
无偏移,直接取玩家脚下 | 同上 |
| 指令用法文本 | 缺省返回空串 "" |
:38-40 |
citadel 生成 Y |
50 | citadel/Citadel.java:21 |
交互
| 触发 | 行为 |
|---|---|
| 服务器启动 | FMLServerStartingEvent 注册指令(Roguelike.java:43-47) |
| Tab 补全 | 无(返回 null) |
isUsernameIndex |
返回 par2 == 0(:328-330),但没有任何子指令使用玩家名参数 |
异常处理
指令内的 catch 全部有副作用(发送错误消息或 return),无空 catch:
| 异常 | 位置 | 行为 |
|---|---|---|
PlayerNotFoundException |
:107、:142、:157 |
发 “Failed: Player error” / “Failure: Cannot find player” 并 return |
NumberInvalidException |
:170、:226、:300 |
发坐标/参数错误消息并 return |
Exception(宽泛) |
:214、:261 |
包裹 dungeon.getPosition().toString() 的成功消息;生成失败时改发 “Failure: Unable to generate dungeon” |
后两处宽泛 catch 是必要的防御:坐标回报依赖 toGenerate.getPosition(),而该字段在生成失败时可能为 null。
相关条目
- 配置项 -
config reload重载的对象 - JSON 地牢设置包 -
settings reload/settings list的对象 - 彩蛋物品 -
give可发放的 28 件物品 - 世界生成流程 -
dungeon指令与自然生成共用同一套生成代码