游戏规则与指令

基本信息

类别 数量 位置
游戏规则 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 即墓碑总开关),故在此记录。仓库内没有注释说明「堆栈故意不打印」。

相关条目