电梯 / 旋转电梯

基本信息

属性 值
注册名 OpenBlocks:elevator、OpenBlocks:elevator_rotating
对应类 openblocks.common.block.BlockElevator、openblocks.common.block.BlockElevatorRotating
TileEntity 旋转电梯有 TileEntityElevatorRotating;普通电梯 @RegisterBlock 未声明 tileEntity(OpenBlocks.java:266),没有 TileEntity
材质 均为 Material.rock(BlockElevator.java:26、BlockElevatorRotating.java:19)
朝向 普通电梯无朝向设置;旋转电梯 BlockRotationMode.FOUR_DIRECTIONS(BlockElevatorRotating.java:20)
上界贴图 旋转电梯顶面 openblocks:elevator_rot(BlockElevatorRotating.java:27)
声明位置 OpenBlocks.java:266(elevator)、:269-273(elevator_rotating)

注册名与类名不同:旋转电梯的注册名是 elevator_rotating(下划线),而它的 ItemBlock 与普通电梯共用 openblocks.common.item.ItemElevator、贴图名共用 elevator(OpenBlocks.java:272-273)。

功能

电梯是一对颜色配对的垂直传送装置:站在电梯上跳跃向上传送,潜行向下传送。核心逻辑不在方块类里,而在两个 Forge 事件处理器中。

配对与搜索

ElevatorActionHandler.findLevel(ElevatorActionHandler.java:57-101):

  1. 从当前电梯沿 UP 或 DOWN 逐格扫描,最多 Config.elevatorTravelDistance 格(默认 20,Config.java:64)
  2. 遇到另一个 IElevatorBlock 且 getColor() 与自身相同、且目标格上方有足够空间时,判定为配对成功,返回目标 Y 与朝向
  3. 扫描途中遇到普通方块时按 ElevatorBlockRules.getActionForBlock 分类处理:
    • ABORT → 立即放弃,返回 null
    • IGNORE → 跳过,不计数
    • INCREMENT → 计数,计数超过 Config.elevatorMaxBlockPassCount(默认 4,Config.java:82)时中断扫描
  4. 若 Config.elevatorIgnoreBlocks 为 true(默认 false,Config.java:68),整段阻挡判定被跳过

事件链(客户端 → 服务端)

电梯不使用右键,而是监听移动事件:

  • 客户端 ElevatorActionHandler.onPlayerMovement(ElevatorActionHandler.java:189-213,@SideOnly(Side.CLIENT))检测玩家脚下方块;跳跃时若正下方是空气会再往下看一格(针对跳跃高度的兼容)
  • 命中后发送 ElevatorActionEvent(C2S,ElevatorActionEvent.java:13 标注 @NetworkEventMeta(direction = EventDirection.C2S))
  • 服务端 onElevatorEvent(ElevatorActionHandler.java:164-185)收到事件后调用 activate;玩家骑乘在任何实体上时不触发(ElevatorActionHandler.java:176)

事件注册在 OpenBlocks.java:614-617 的 NetworkEventManager 中,与地图数据、玩家动作、MinMe 归属变更共 6 个事件同批注册。

数值

数值名 配置项 默认值 来源
最大搜索距离 dropblock.searchDistance 20 格 Config.java:64
忽略所有阻挡 dropblock.ignoreAllBlocks false Config.java:68
忽略半砖计数 dropblock.ignoreHalfBlocks false Config.java:75
最多穿透方块数 dropblock.maxPassThrough 4 Config.java:82
传送到格中心 dropblock.centerOnBlock false Config.java:89
经验消耗系数 dropblock.elevatorXpDrainRatio 0.0(不消耗) Config.java:103
允许不规则碰撞箱方块 dropblock.irregularBlocksArePassable true Config.java:148
特殊方块规则 dropblock.specialBlockRules 空数组 Config.java:96

经验消耗公式(ElevatorActionHandler.java:150-162):neededXP = ceil(elevatorXpDrainRatio × |player.posY − 目标Y|);系数为 0 或创造模式时不消耗。经验不足时静默失败——不传送、不提示。

特殊方块规则条目格式为 <modId>:<blockName>:<action>,action 取 abort / increment / ignore(ElevatorBlockRules.java:24-28、:53-68)。解析失败只打 WARN 日志并跳过该条(ElevatorBlockRules.java:45-49)。

交互

触发 行为
站在电梯上跳跃 向上寻找同色电梯并传送
站在电梯上潜行 向下寻找同色电梯并传送
手持染料右键普通电梯 从手持物品的染料 meta 中随机取一个写为方块 meta(BlockElevator.java:57-69);普通电梯的颜色存在方块 meta 里(getColor 读 meta,:72-74)
手持染料右键旋转电梯 仅服务端生效;从手持染料的多个 meta 中随机取一个写入 TE 的 SyncableEnum<ColorMeta> 并同步(TileEntityElevatorRotating.java:69-84)
潜行/剪刀染色 普通电梯 recolourBlock 写方块 meta(BlockElevator.java:40-49);旋转电梯写入 TileEntity 且只在服务端生效(BlockElevatorRotating.java:46-62)
破坏旋转电梯 不掉原版掉落物(suppressNormalHarvestDrops 返回 true,TileEntityElevatorRotating.java:49-52),改为按当前颜色掉落对应 meta 的电梯物品(addHarvestDrops,:55-57)
放置旋转电梯 从手持物品的 damage 值恢复颜色(onBlockPlacedBy,TileEntityElevatorRotating.java:87-90)

传送到目标后播放音效 openblocks:elevator.activate(ElevatorActionHandler.java:130)。

旋转电梯的 TileEntity 不做刻更新(canUpdate 返回 false,TileEntityElevatorRotating.java:45-47),颜色默认值是 ColorUtils.ColorMeta.BLACK(:32);只有当 TE 缺失时(如渲染查询早于放置)getColorMeta 才回退为 WHITE(BlockElevatorRotating.java:30-33)。

Config.elevatorCenter 为 false 时(默认),代码会先检查玩家原所在水平格在目标层是否安全;不安全则改为传送到电梯格中心(ElevatorActionHandler.java:111-129)。该安全检查的第二层判定写作 !world.isAirBlock(j, result.level + 2, j)(ElevatorActionHandler.java:121)——两层都用 j 作 X 与 Z 坐标,内层 i 循环因此不生效。仓库内没有注释或测试声明这是有意为之,此处按代码原样记录。

合成配方

普通电梯(Config.java:650-662):

www
wew
www
字符 物品
w Blocks.wool 羊毛
e Items.ender_eye 末影之眼

旋转电梯(Config.java:663-686):

wiw
wew
wiw
字符 物品
w Blocks.wool 羊毛
e Items.ender_eye 末影之眼
i ingotIron 铁锭

另有无序替代配方:普通电梯 + 2 个 ingotIron → 6 个旋转电梯(Config.java:677-685)。

相关条目