电梯 / 旋转电梯
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | 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):
- 从当前电梯沿 UP 或 DOWN 逐格扫描,最多
Config.elevatorTravelDistance格(默认 20,Config.java:64) - 遇到另一个
IElevatorBlock且getColor()与自身相同、且目标格上方有足够空间时,判定为配对成功,返回目标 Y 与朝向 - 扫描途中遇到普通方块时按
ElevatorBlockRules.getActionForBlock分类处理:ABORT→ 立即放弃,返回 nullIGNORE→ 跳过,不计数INCREMENT→ 计数,计数超过Config.elevatorMaxBlockPassCount(默认 4,Config.java:82)时中断扫描
- 若
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)。