/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。

相关条目