用户:MashKJo/1.12.2模组开发教程/10.BlockState系统及Forge BlockStates V1模型格式:修订间差异

→‎模型文件的书写:​ // Edit via Wikiplus
→‎模型文件的书写:​ // Edit via Wikiplus
→‎模型文件的书写:​ // Edit via Wikiplus
 
甚至于和方块没什么关系的普通物品我们也可以写在blockstates文件中,只需要把transform改成forge:default-item,再指定一下textures即可。不过并不推荐这么做,因为普通的物品和方块既然没关系,那么放在blockstates文件中既多此一举,也容易造成歧义。
 
== 方块的Meta-hack ==
类似于ItemStack,方块也是可以有Meta-hack的——实际上是用同一个Block的不同BlockState及其对应的meta代表设定上不同的多种方块(实际上在代码层面都对应同一个Block对象)。和ItemStack的Meta-hack类似,方块的Meta-hack也是不推荐使用的。
 
首先我们需要一个区分方块类型的IProperty,一般是用PropertyEnum,用到的枚举类一般作为静态内部类的形式出现在方块类中;再设定该方块的hasSubtypes为true;然后在blockstates文件中,针对这个variant分别指定各自不同的模型文件路径,即可。没错,你没看错,就这么简单。
 
然而使用Meta-hack的方块对应的物品却不是这么简单——因为ItemBlock类的默认实现很可能不能满足我们的需求,为何?因为ItemBlock的默认逻辑是:若传入的Block的hasSubtypes为true,那么使用ItemBlock对应的某个ItemStack放置该方块时,该ItemStack的meta值和放置的BlockState对应的meta值,是相等的。因此如果你的方块只有这一个区分类型的IProperty,倒还没问题;但如果你同时还有其他几个IProperty呢,比如一个决定朝向的PropertyDirection?那就糟了,该ItemBlock的meta会影响到放置出来的方块的朝向,这显然不是我们所期望的,我们所期望的应当是:由放置该方块的实体的朝向来决定该方块的朝向。因此这个时候你就得覆写<code>Block#getStateForPlacement</code>才行,这个方法会传入对应的ItemStack,由此我们就可以手动指定符合我们自己的需求的BlockState和ItemStack的各自的metadata的正确对应关系。
 
另外,我们还得覆写<code>Block#getSubBlocks</code>方法,它的用途和之前提到过的getSubItems差不多,实际上ItemBlock类中的getSubItems方法就是代理给了getSubBlocks的。
行政员、​优秀编辑者、​界面管理员、​监督员、​管理员、​小部件编辑者
3,351

个编辑