rfmp_frame(FMP 框架部件)

基本信息

属性 值
类型 ForgeMultipart 部件(不是方块,本 mod 不注册任何 Block)
部件名 rfmp_frame
注册位置 proxies.scala:26 MultiPartRegistry.registerParts((_, _) => new FramePart, "rfmp_frame")
实现类 mrtjp.relocationfmp.FramePart(framefmp.scala:29)
本体方块/物品 来自 MCFrames(mrtjp.mcframes.api.MCFramesAPI.getFrameBlock),注册名不在本仓源码中

功能

在 ForgeMultipart(CodeChickenLib)方块格中,代替 MCFrames 的框架方块参与渲染与碰撞。

FramePart 继承 TMultiPart + IFrame + TCuboidPart + TNormalOcclusion + TIconHitEffects(framefmp.scala:29-34), 因此它同时是一个 FMP 部件、一个 MCFrames 框架,并使用普通(而非部分)遮挡模型。

FrameBlockConverter(framefmp.scala:143-149)负责转换:当某个已有 TileMultipart 的格子里放的是 MCFrames 框架方块时, 把它转成 FramePart。

MultipartGenerator.registerPassThroughInterface(classOf[IFrame].getName)(proxies.scala:25) 让所有 IFrame 部件在遮挡计算时互相穿透。

数值

数值 值 来源
遮挡盒内缩 4/16 framefmp.scala:135 val i = 4 / 16d
边框厚度 1/16 framefmp.scala:136 val th = 1 / 16d
碰撞/选取包围盒 Cuboid6.full(整格) framefmp.scala:66
是否 Tick 否(doesTick = false) framefmp.scala:113
破坏速度 借用玩家对 MCFrames 框架方块的破坏速度,再除以该方块硬度 framefmp.scala:45-59

交互

触发 行为
破坏 掉落 1 个 MCFrames 框架方块物品(getDrops / pickItem,framefmp.scala:61-64)
玩家拾取 拾取物为 MCFrames 框架方块,本 mod 不含自有物品
客户端渲染 仅 pass 0:绑定图集、设置亮度、调用 MCFramesAPI.renderFrame(framefmp.scala:116-123)

遮挡逻辑

occlusionTest(framefmp.scala:88-102)做了改动:与另一个 FramePart 永不互相遮挡; 在其余情况下同时把对方的普通遮挡盒、部分遮挡盒和碰撞盒一起送进 NormalOcclusionTest 比较—— 即一个格子里的框架会让微方块等部件按真实外形露出,而不是被整格方块挡住。

放置方式

框架物品的右键放置由 FramePlacement(framefmp.scala:151-185,通过 proxies.scala:15 的 MCFramesAPI.instance.registerFramePlacement 注册)接管:

  1. 用命中点的法向投影算出命中深度 d(framefmp.scala:152-153)。
  2. d < 1 时先尝试放进被点中的那一格;成功即结束。
  3. 否则放进该格的 side 邻格。
  4. 放置前要求该格已有 TileMultipart(framefmp.scala:169)且 TileMultipart.canPlacePart 通过。
  5. 非创造模式扣 1 个物品(framefmp.scala:175)。

相关条目

  • FMP 移动器 — 整格 FMP 区块被结构移动时如何被搬运