混合板-潘多里卡尔

混合板-潘多里卡尔

一个方块空间内的两种不同石板

将任意台阶放置到任意其他台阶的空半部分上。当两者是同一种方块时,原版已经会这样做,并将结果称为双台阶;当两者不同时,原版会放弃,并把新台阶放到旁边的下一个位置。本模组处理的就是第二种情况,将它们放进同一个方块中。

新台阶落在哪一半,完全按照原版的方式决定——取决于你点击的面以及点击的高度——因此两者的行为完全一致,结果绝不取决于由哪一方来处理点击。潜行仍然意味着“忽略该方块,使用手中的物品”。

破坏它,你会取回两个台阶,各自按照单独破坏该台阶时的掉落方式:草台阶的一半会变回泥土台阶,除非工具有精准采集。

四个方块

共有四个:mixed_slab、mixed_dirt_slab、mixed_topper_slab 和 mixed_signal_slab,按上半部分的内容划分。这不是风格上的划分。标签属于方块而非状态,因此“这个表面是泥土,植物可放置其上”不能针对一个方块的部分状态来说——按表面划分意味着它适用于其中一个方块的所有状态,而 mixed_dirt_slab 属于 #minecraft:dirt。放置在台阶上的东西绘制在下半部分的末端,而非上半部分的起始处,对于同一个上半部分来说这是不同的模型,因此它获得 mixed_topper_slab;红石元件带有一个其他元件用不到的开关位,因此它获得 mixed_signal_slab。

这四个方块共享所有可能的下半部分,并彼此分配上半部分,因此它们合起来恰好包含单个方块会有的全部组合。这种划分完全不产生额外的状态。

放置在台阶上

来自 wood-floor 的地板、火把、灵魂火把和地毯可以放置在台阶上并共享其方块,而不占用上方的那一格。台阶上的火把发出火把的光。水可以填充地板或地毯留下的空隙;台阶上的火把永远不会含水,因为水会摧毁它。

击打立在台阶上的东西——火把、拉杆,本节或下一节中的任何东西——只会击落那一个,按它自己的速度,并留下台阶。它的掉落方式与其他地方相同。

台阶上的红石

压力板、按钮、拉杆和红石火把坐在台阶上并共享其方块,而不占用上方的那一格。它们能工作:你站上去的压力板、你扳动的拉杆、会弹回的按钮、反转其所立之物的红石火把。

这些元件并未被重新实现。所有关于信号读取的部分——该方块是否是信号源、输出什么以及强度如何——都是通过构建真实元件自身的状态并询问它来回答的,硬度和声音已经是这样处理的。只有写入是我们自己的:位何时翻转。每个元件只需几行代码,而非一整套系统,保真度正源于此。

安装 lever-torch 和 player-detector 后,拉杆火把和玩家探测器也以同样的方式搭载,并且探测器仍然只检测玩家。

一个位就是全部。压力板、拉杆、按钮和火把各自存储一个布尔值。中继器的延迟、比较器的模式、测重压力板的十六个能量等级以及红石粉的连接形状都无法承载,因此不在此列。

蜡烛以同样的条件搭载。放置在台阶上的蜡烛共享其方块,它的一个位就是是否被点燃:打火石或火焰弹点燃它,空手熄灭它,它发出点燃蜡烛的光。它放弃的是数量——原版一个方块最多堆叠四根,而这里没有空间表示数量——因此台阶上的蜡烛就是一根蜡烛,十七种颜色任选。它也不能含水;承载一个位的方块没有水的空间。而且它不会闪烁:火焰的舞动粒子是绑定在原版蜡烛方块上的客户端动画,因此台阶上点燃的蜡烛会发光并照亮房间,且静止不动。

地面开关没有朝向。拉杆无论指向哪个方向都输出相同的能量,因此朝向只是装饰性的——而为此付出四倍的状态数,代价超过了朝向本身的价值。

规则

混合台阶是一个满高方块,其表面材质是其上半部分。

询问它材质时,它从某一半来回答。任何东西都不应从某一半读取台阶类型,也不应将植物偏移到某一半上——站在混合台阶上的植物站在满高处,这就是为什么原版植物适合它,而 dirt-slab 的半高植物变体不适合。

它的形状是两半加起来的结果。对于两个普通台阶来说,那就是一个完整立方体。对于栅栏柱台阶——它填满方块的一半,但其中只有一个窄柱——则不是,碰撞、剔除和光照都遵循真实形状,而非一个并不存在的立方体。

其他模组看到的内容

混合台阶是它自己的方块,因此游戏中每一个“这是什么方块?”看到的都是混合台阶,而非其内部的两个台阶。MixedSlabsApi 是模组查明情况的方式——一个基于普通原版类型的小型静态接口,通过反射访问,因此无需依赖本模组:

  • isMixedSlab(state)
  • halves(state) / topHalf(state) / bottomHalf(state)
  • withTopHalf(state, block) —— 重新铺设表面,用于草蔓延上来或锹制造小路。可能返回另一个方块的状态,因为哪个方块持有某个组合取决于其顶部。

目前已接入:

  • conductive-copper —— 混合台阶内的切制铜台阶仍然导电。一半是铜就足够了:金属在那里,若要求两半都是铜,则铜橡木台阶会成为信号在此消亡的墙。
  • dirt-slab —— 草会蔓延到顶部为泥土的混合台阶上(只有上半部分改变,且仅当它确实是泥土时);锹在表面制造小路;锄将粗泥松动为泥土。原版植物可以放置在任意 mixed_dirt_slab 上。

未覆盖的内容

  • 混合台阶上的草不会向外蔓延,也不会在黑暗中死亡。混合台阶不会随机刻。草到达这里是一个终点,而非起点。
  • 雪不会使草表面变白——没有空间容纳 snowy 状态。
  • 耕地完全无法混合,这是有意为之。其行为存在于混合台阶没有空间容纳的湿度等级中,因此一个看起来像耕地的方块永远无法耕种;拒绝才是诚实的答案。
  • 手持锹潜行不会将其减半。它是一个满方块;没有一半可以取走。

工作原理

一个位置持有一个方块状态,而一个方块状态无法命名两种材质。因此混合台阶是它自己的方块,其状态说明每一半中是哪一种台阶:

  • 147 种台阶,原版加上本套件自己的,以及 93 种放置其上的东西:42 种地板、火把和地毯,以及 51 种红石元件和蜡烛。即 147 × 240 = 35,280 种组合,四个方块合计 70,560 个状态,因为每个方块还携带一个额外的位(含水,或红石方块的开/关)。
  • 方块状态是多部分的,这正是使其可处理的原因。每一半的模型由各自的属性独立选择,因此每个文件只需为每一半的每种东西列出一个情况(红石元件为开和关两种情况)——四个文件合计 879 个——而非每种组合一个。
  • 台阶模型是原版自带的,或兄弟模组的。只有放置于台阶上的原版物品在这里生成模型,将它们自己的模型抬到中线。几何形状不会按状态重复:多部分状态持有对已烘焙子模型的引用。

好处在于绘制由原版完成。光照、环境光遮蔽、面剔除和破坏粒子都是真实的,而非仿制,并且没有可能出错的客户端渲染代码。代价在启动时支付一次,之后每刻不再支付。

方块所做的一切都交由被询问的那一半决定:

  • 硬度取较硬的一半,因此将石头与橡木搭配并不是廉价开采石头的办法。
  • 掉落按半判定——将石头混入橡木不会让你徒手收集石头,也不会因为没有镐而失去橡木。
  • 声音来自上半部分,即你所站立的那一半。

Pandorical

Mixed Slabs 通过 Pandorical 的内容同步注册混合台阶方块及其半模型,并通过 Pandorical 的方块染色为草的一半染色。

Pandorical 模组必须在客户端安装,才能将混合台阶绘制为它的两半。没有它,模组在服务端仍然工作,但连接的客户端会看到一个无纹理的方块。如果安装了 Block Tip,当你看向一个混合台阶时,它会列出两半的名称。