用户:MashKJo/1.12.2模组开发教程/5.第一个物品:修订间差异

// Edit via Wikiplus
(// Edit via Wikiplus)
(// Edit via Wikiplus)
}
}
 
这时候启动游戏,就可以在创造模式物品栏“杂项”下,看到一个材质为紫黑块、名称为“item.ruby.name”的物品了。虽然暂时没什么用,且很难看,但这毕竟是我们添加的第一个物品了。
 
== 给物品设定模型文件和材质 ==
Minecraft中所有物品的渲染都是基于物品对应的模型,而物品的模型指定了物品的材质、旋转角度等渲染要素。
 
首先我们应该通过监听ModelRegistryEvent这个事件来把某个特定的物品(其实准确地说,是ItemStack,只不过仅能额外指定meta这一字段,ItemStack会在下一小节具体讲到)和某个模型文件的路径进行绑定,之前说过,渲染这种涉及到视觉效果的东西,其相关的代码应该只在物理客户端被调用,因此我们在client包下新建一个源文件ModelRegistryHandler.java,使用<code>ModelLoader#setCustomModelResourceLocation</code>这一静态方法,来完成物品和模型文件的绑定:
 
<code>src/main/java/net/tutorial_mod/client/model/ModelRegistryHandler.java:</code>
 
package net.tutorial_mod.client.model;
import static net.tutorial_mod.item.TutorialModItems.*;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.tutorial_mod.TutorialMod;
@Mod.EventBusSubscriber(value = Side.CLIENT, modid = TutorialMod.MODID)
public class ModelRegistryHandler{
@SubscribeEvent
public static void bindItemModels(ModelRegistryEvent event){
setModelResourceLocation(RUBY, 0, RUBY.getRegistryName());
}
 
private static void setModelResourceLocation(Item item, int meta, ResourceLocation location){
ModelLoader.setCustomModelResourceLocation(item, meta, new ModelResourceLocation(location, "inventory"));
}
}
 
我们在<code>@EventBusSubscriber</code>注解的参数value中指定了该类的物理端:Side.CLIENT,确保它只会存在于物理客户端。如果你选择手动注册该事件,那么请写在ClientProxy中——之前的所有事件注册则都是写在CommonProxy中。
 
这里笔者写了个private方法简单地把setCustomModelResourceLocation包装了一下,以节省代码量。然后我们就可以来看看这个方法的形参了:第1个参数要求传入一个Item,这自然不必多说;第2个参数是个int量,名为meta——meta到底是什么意思,这会在下一节“ItemStack”讲到,如果读者尚不清楚meta代表什么,那这一项就填0就行;第3个参数是一个ModelResourceLocation——这个类是ResourceLocation对模型的特化版,在示例代码中我们用的是它的<code>(ResourceLocation location, String variantIn)</code>这个构造方法,注意传入的ResourceLocation并不要求我们填完整的模型文件路径,而是类似于这样:<code>new ResourceLocation("modid:registry_name")</code>,这里我们用getRegistryName这一方法获取了这个ResourceLocation;至于那个variantIn,这个解释起来比较复杂,鉴于我们这里是要绑定物品和模型文件,因此直接填写<code>"inventory"</code>即可——inventory,物品栏,也很好理解。
 
另外这里说一句,能存在于物品栏(包括创造模式物品栏、玩家背包、箱子中的物品栏)中的一定是物品。如果你把物品按Q键丢出去,它就不是物品了——而是实体,准确地说是EntityItem,其通用逻辑是能被玩家、僵尸等生物捡起来,并转化为物品。
 
上述代码成功地把红宝石这一物品的模型映射到了位于路径为<code>assets/tutorial_mod/models/item/ruby.json</code>的JSON文件,这就是我们的模型文件了:
 
<code>src/main/resources/tutorial_mod/models/item/ruby.json:</code>
 
{
"parent": "item/generated",
"textures": {
"layer0": "tutorial_mod:items/ruby"
}
}
 
读者照抄就行,这块属于Minecraft原版的内容,如果想了解更多,可以去Minecraft Wiki查阅相关资料。
 
这个模型文件将红宝石物品的唯一一层材质指定为路径为<code>assets/tutorial_mod/textures/items/ruby.png</code>的PNG图片。注意材质文件只能是PNG,如果你想要实现类似动图的效果,也不能用GIF,而是要用Minecraft的纹理动画机制。且材质图片最好是正方形,边长为2的倍数,否则容易出问题——一出问题,就还是紫黑块,不跟你玩虚的。这里layer0的路径指定,用法类似于用于指定文件具体路径的ResourceLocation构造器,只是省略了<code>"textures/"</code>这一层路径——实际上这个路径,在Minecraft和Forge中都是被硬编码了的。
 
将预先准备好的材质文件放入指定路径,进入游戏,不出意外的话,你应该能在创造模式物品栏中看到一个正常显示材质的物品——红宝石了。
== 给物品提供本地化支持 ==
行政员、​优秀编辑者、​界面管理员、​监督员、​管理员、​小部件编辑者
3,334

个编辑