游戏规则与指令
基本信息
| 类别 | 数量 | 位置 |
|---|---|---|
| 游戏规则 | 1 | common/GameRuleManager.java |
| 指令 | 3 | rubbish/CommandFlimFlam.java、rubbish/CommandLuck.java、common/CommandInventory.java |
| 事件订阅 | 1 | PlayerDeathHandler.java(OpenBlocks.java:631) |
游戏规则
| 规则名 | 默认值 | 常量 | 行 |
|---|---|---|---|
openblocks:spawn_graves |
"true" |
GameRuleManager.GameRule.SPAWN_GRAVES |
GameRuleManager.java:12、:22 |
实现极简(GameRuleManager.java 共 25 行):
addRule先查rules.hasRule(name)再addGameRule,因此不会覆盖玩家已在level.dat里设过的值(:15-17)- 规则在
WorldEvent.Load时补齐(@SubscribeEvent onWorldLoad,:19-23) - 因为只在世界加载时补齐,新建世界要重进一次才会写入
关闭 openblocks:spawn_graves 后,玩家死亡不再生成墓碑方块。墓碑逻辑在 common/PlayerDeathHandler.java(含 GraveAutoEquip、GraveInventorySnapshot、GraveSlotOrigin 三个配套类),该处理器注册在 OpenBlocks.java:631。
GraveAutoEquip 与 GraveInventorySnapshot 会按 ModPresence 检查 7 个模组,把它们的装备一并收进 / 归还墓碑(见集成 / 外部模组)。
指令
/flimflam
| 属性 | 值 | 行 |
|---|---|---|
| 类 | openblocks.rubbish.CommandFlimFlam |
— |
| 名称 | 见 getCommandName() |
CommandFlimFlam.java:31 |
| 用法 | 见 getCommandUsage(ICommandSender) |
:36 |
| 别名 | 见 getCommandAliases() |
:42 |
CommandFlimFlam 实现了 Comparable(compareTo 在 :27 比较 NAME),以便与其它指令一起排序显示。目录名 rubbish/ 是作者的原始命名,含 BrickManager、LoreGenerator 与本类共 4 个类。
BrickManager 只在 !Config.soSerious 时注册(OpenBlocks.java:707-709)——注意判定依据是配置项而非物品是否启用。
/luck
| 属性 | 值 | 行 |
|---|---|---|
| 类 | openblocks.rubbish.CommandLuck |
— |
| 名称/用法/别名 | 见对应 getter | — |
CommandLuck 控制 FlimFlam 的 Luck 值,即附魔页里 canApply(luck) 的那个变量。
/dev/null
| 属性 | 值 | 行 |
|---|---|---|
| 类 | openblocks.common.CommandInventory |
— |
| 名称 | 见 getCommandName() |
CommandInventory.java:48 |
| 用法 | 见 getCommandUsage(ICommandSender) |
:53 |
| 别名 | 见 getCommandAliases() |
:65 |
compareTo |
比较 NAME |
:44 |
/dev/null 与 ItemDevNull 的 GUI(common/item/ItemDevNull.java)配套——物品版的打开条件是 !Config.devNullSneakGui || player.isSneaking()(ItemDevNull.java:92)。
网络事件注册
指令与游戏规则之外,OpenBlocks 通过 NetworkEventManager 注册了 6 个网络事件(OpenBlocks.java:614-617):
| 事件 | 行 |
|---|---|
MapDataManager.MapDataRequestEvent |
:614 |
MapDataManager.MapDataResponseEvent |
:615 |
MapDataManager.MapUpdatesEvent |
:615 |
电梯动作事件 ElevatorActionEvent |
:616 |
玩家动作事件 PlayerActionEvent |
:616 |
克隆体归属变更 EntityMiniMe.OwnerChangeEvent |
:617 |
另有 3 个 RPC 接口注册(OpenBlocks.java:619-622),见模组 API 与扩展点。
容错:被吞掉的异常
对全仓库 grep catch (Throwable 共 14 处。逐处核对后,多数并不静默:
| 位置 | 行为 |
|---|---|
BlockTank.java:112 |
重新抛出为 RuntimeException(带说明性消息),非吞掉 |
ApiSetup.java:40、:52 |
重新抛出(Throwables.propagate) |
DummyCreepersFlimFlam.java:32 |
重新抛出(Throwables.propagate) |
TrophyHandler.java:76 |
记 Log.severe |
MapDataManager.java:222 等 |
记日志 |
PlayerDeathHandler.java:503 等 |
记日志 |
唯一真正丢失信息的一处:
// PlayerDeathHandler.java:320
} catch (Throwable t) {
Log.warn("Failed to store grave backup for player %s", stiffId);
}
Log.warn 只接收了消息字符串,没有把异常 t 传进日志——堆栈被完全丢弃。对照 TrophyHandler.java:76 等处会把 Throwable 作为第一个参数传给 Log.warn/warn(Throwable, ...),可见此处是漏传而非有意为之。后果:墓碑备份失败时玩家只能看到一行不含任何原因的警告,排查困难。
这与墓碑系统直接相关(本页的 openblocks:spawn_graves 即墓碑总开关),故在此记录。仓库内没有注释说明「堆栈故意不打印」。
相关条目
- 配置项全表 -
devnull.sneakClickToGui与soSerious - 附魔:FlimFlam -
/flimflam与/luck的作用对象 - 方块 / 电梯 - 电梯动作事件的网络通道