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 注册)接管:
- 用命中点的法向投影算出命中深度
d(framefmp.scala:152-153)。 d < 1时先尝试放进被点中的那一格;成功即结束。- 否则放进该格的
side邻格。 - 放置前要求该格已有
TileMultipart(framefmp.scala:169)且TileMultipart.canPlacePart通过。 - 非创造模式扣 1 个物品(
framefmp.scala:175)。
相关条目
- FMP 移动器 — 整格 FMP 区块被结构移动时如何被搬运