在这一期教程中,我们首先要了解一些基本概念,然后开始为我们的物品或者方块添加功能。首先要观察一张图,左边显示了我们在代码中定义并注册的对象,我们注册过item、注册过block,而block eterm是由block自动生成的item,也属于一种item。这些都是我们定义并注册的东西,在注册时已经生成了实例。在注册时使用了new block这个构造函数,直接生成了一个实例,整个游戏只有这一个实例。虽然世界上有很多方块,但实际上所有方块都是block state的实例,而所有block state实例都拥有同一个block实例。这样做的好处之一就是可以使用等号来判断是否是目标物品或方块,因为Java对象比较实际上是比较对象的地址而不是内容。所以如果整个世界只有一个物品实例、一个方块实例,你想要判断是什么物品时可以直接用等号判断,因为它们的地址都是相同的。
另外,item在背包里是item stack对象,类似地,block state在世界上是掉落在地上的物品对象,而INT entity对象则代表一个实体。这些是一些基本概念。现在我们要给我们的物品或者方块添加功能,一个简单的想法是自定义一个物品,当对着我们的方块右键使用时,这个物品会消失,并让该方块吐出一个东西,比如烤鱼。我们可以把这个物品命名为"Exchange Voucher",将方块命名为"Vending Machine"。这个功能相对简单,我们第一步肯定是把方块的名字改成"Vending Machine",英文暂时保留不变,毕竟暂时不需要调整语言设置。这里涉及到物品与方块的互动,我们可以想象一些交互形式,比如以物品为主体,判断使用物品时瞄准的方块是否是目标方块,这是一种方法。
第二种方法是以方块为主体,判断玩家手持的物品是否是目标物品,这也是一种互动方式。这两种方法都可以实现我们的需求。这次我们要自定义一个item,而不再直接使用block生成的block item。要自定义一个item,就需要将其注册进去,但简单注册的item是没有什么交互功能的。所以我们需要给我们的物品添加交互功能,可以参考原版中是怎样实现的。
首先看看原版中的word item里面,找一个交互比较简单的物品,比如剪刀。在剪刀的类中,可能会有一些与开采方块相关的内容,我们暂时不需要这部分。其中可能会涉及到获取破坏速度之类的属性,这个暂时也不需要。看起来与实体的互动有关,暂时做个记录。
接着,发现一个名为"UZ"的方法,似乎很有趣。"UZONE"看起来像是当你使用了这个物品后的效果。再看这个事件,首先获取了方块,然后判断该方块是否属于正在生长的植物的顶部方块,如果还没有长到最大,获取玩家信息和玩家手上物品的信息,然后触发某种进度。这个可以看到涉及到了advancement包,与游戏进度相关。
然后播放声音,触发声音效果,接着获取一个block state,重新设置了方块的更新,最后触发了世界。通过这些步骤,我们可以使用"UZONE"来获取方块并进行逻辑判断。
首先,我们需要在item包下创建一个新的类,比如命名为"ExchangeVoucher",让其继承自Item类。在这个类中,我们可以实现与"UZONE"类似的逻辑,用于处理交互事件。
我们首先要复制"UZONE"中的相关方法和逻辑,确保我们的"ExchangeVoucher"类也能获取方块信息,并进行必要的判断。这样才能正确处理玩家与方块的互动。
在检查方块是否符合需求后,如果方块符合条件,我们就需要创建一个物品。通过获取玩家信息,我们可以在适当的时候将物品添加到玩家的背包中。这里可以直接参考原版的实现方式,例如创建一个新的ItemStack对象,该对象包含有关我们要生成的物品的信息。
为了创建正确的物品,我们可以参考原版游戏中已注册的物品,比如Cookie,查找其对应的代码,以便正确设置我们自定义物品的属性,例如名称、图标等。这样我们就可以成功地添加一个具有互动功能的自定义物品了。
接着我们需要处理返回的逻辑。当成功执行后,我们需要返回相应的结果;当执行不成功时,同样也需要返回对应的结果。在成功执行后,我们可以参考之前的shares来处理返回值的部分。
兑换券制作完成后,接下来要将其注册到游戏中。我们可以使用类似以下代码来注册兑换券:
public static final RegistryObject<Item> EXCHANGE_VOUCHER = ITEMS.register("exchange_voucher", () -> new ExchangeVoucher());
然后,我们需要测试一下效果。可以看到物品已经成功添加到了游戏中,并可以通过GV(游戏内GUI)获取到兑换券,最终用兑换券来获取烤鱼等物品。
接下来,我们需要完善逻辑。兑换券不能无限使用,每次使用后数量都应该减少,同时可能需要更改材质。这些需求需要通过修改代码来实现。我们可以参考其他类似的实现方式,比如根据物品的耐久度来控制数量的减少。在ItemStack类中找到类似减少物品数量的方法,例如setCount(),并参考其实现方式,通过调整数量来实现兑换券的有效次数减少功能。
为了给兑换券创建贴图,我们需要按照以下步骤进行操作:
1.首先在资源管理器中打开域文件,然后在其中新建一个名为"exchange_voucher.json"的文件。
2.将铃铛等简单物品的模型代码复制到"exchange_voucher.json"中。
3.修改文件中的"parent"为"HASTMOD:item/exchange_voucher",确保正确继承了父级模型。
4.在textures文件夹下的item文件夹中创建一个新的贴图文件,例如"exchange_voucher.png"。
5.参考原版材质设计,使用图片编辑软件创建兑换券的贴图,可以绘制自定义图案和颜色。
6.将自定义的贴图保存为"exchange_voucher.png"并替换掉原有的样本图片。
7.运行游戏,检查兑换券的材质是否已经更新,然后通过生存模式测试兑换券的数量减少功能。
通过这些步骤,兑换券将拥有自定义的贴图和正确的数量处理逻辑。完成后,您可以在创造模式中找到该物品,并测试其功能。