我的世界Forge1.18Mod开发教程重置版

您所在的位置:网站首页 我的世界怎么给物品添加描述 我的世界Forge1.18Mod开发教程重置版

我的世界Forge1.18Mod开发教程重置版

2024-06-01 20:02| 来源: 网络整理| 查看: 265

        本期教程包含大量java或编程中的专有名词,所以没学过java很可能看不懂,因此建议没学过java的或者只学过一点的先学好java基础再来看本教程。

        在开始前请确认第0期的准备工作都完成,能正常启动游戏,且启动游戏以后在Mods列表里面能看到你的模组,否则这一期以及后面几期写的代码都是无用功。

        另外,本期教程有大量的大写或者小写的RealIndustry,我在教程里写的模组名都是RealIndustry,因此各位写自己的模组的时候请把这个改成自己模组的名字,还有一些其他的地方,大家自己留意一下。

        有些问题不是1.18版本的别问我,我也不知道qwq

本期目录

一、添加创造模式物品栏 4个步骤

二、添加无特殊逻辑的物品 5个步骤

三、设置创造模式物品栏显示的物品 1个步骤

四、添加合成表 3个步骤

五、添加各种合成表

六、核对模组文件目录

        由于写mod的方式很多样,我这里就使用我最喜欢的方法来写,如果各位有自己更好的方法可以用自己的方法,如果对自己的方法有自信可以发到评论区。

一、添加创造模式物品栏(CreativeModeTab)

1. 在存放mod程序的目录下(也就是模组文件夹/src/main/java/com/xxx/xxx,up这里两个xxx分别是lingbaojun和realindustry,也就是名字和模组名。这个目录下文简称程序目录)下新建一个文件夹,名为CreativeModeTab,在其中新建一个类,名为ModCreativeModeTab,继承CreativeModeTab。写入如下代码:

ModCreativeModeTab.java

package com.lingbaojun.realindustry.CreativeModeTab;

import net.minecraft.world.item.CreativeModeTab;import net.minecraft.world.item.ItemStack;

public class ModCreativeModeTab extends CreativeModeTab {    public ItemStack itemStack;    public ModCreativeModeTab(String label,ItemStack itemStack) {        super(label);        this.itemStack = itemStack;    }

   @Override    public ItemStack makeIcon() {        return itemStack;    }}

    

2. 在Sets文件夹下新建类,命名为CreativeModeTabs,具体格式如下(绿字部分代表需要按照绿字提示替换):

CreativeModeTabs.java

package com.lingbaojun.realindustry.Sets;

import com.lingbaojun.realindustry.CreativeModeTab.ModCreativeModeTab;

public class CreativeModeTabs {    public static final ModCreativeModeTab material = new ModCreativeModeTab("material", new ItemStack(net.minecraft.world.item.Items.AIR));}

up这里创建了一个名为Material的的创造模式物品栏,用mc原版的空气方块作为物品栏样子,可以根据自己的想法改

切记切记,如果不想显示任何物品,也不能在第二个变量上写null,否则在游戏里会直接报NullPointerException

把这个物品栏显示的物品改成模组添加的物品的方法在第三步会讲

学过java基本上都能看懂这是在干啥,看不懂的话可以多看几遍。如果没学过java看不懂,回第0期的视频链接学习,请(无慈悲)

    至此,创造模式物品栏就创建好了,但是这时候别急着进游戏,因为这个物品栏的变量还没有被使用,所以如果这时候进游戏依然不会有新的物品栏。

3. 在Sets文件夹下新建一个类,名为Initialize(初始化),用于存放所有注册的物品、方块和创建的创造模式物品栏等等,写入如下代码:

Initialize.java

package com.lingbaojun.realindustry.Sets;

import net.minecraft.world.item.CreativeModeTab;

import java.util.ArrayList;

public class Initialize {    public static final ArrayList creativeModeTabsArrayList = new ArrayList();    public Initialize() {

        CreativeModeTab material = CreativeModeTabs.material;    }}

4. 为了能让创造模式物品栏在创建时能被添加到Initialize类中的ArrayList中,我们在ModCreativeModeTab类的构造方法的最后添加如下代码:

Initialize.creativeModeTabsArrayList.add(this);

    同时在模组主程序的构造方法内添加如下代码来运行Initialize类内的代码:

new Initialize();

二、添加无特殊逻辑的物品

添加物品的流程和添加创造模式物品栏有一些不同,添加物品需要为物品注册,注册时需要有以下三个变量,分别是Item(物品,用于存放该物品的运行逻辑,如左键使用它攻击时的伤害,右键使用它时对正对鼠标指针的方块进行的操作等等)、String(物品注册名,在游戏中使用Alt+H快捷键可以看到每个物品的注册名)和IEventBus(注册总线),注册的代码比较固定,而且在后续开发中基本上是不会动的,所以注册的代码直接照抄就行了。又因为物品注册完以后还需要存入一个专门存放物品的类中,所以可以写一个方法,完成注册后返回Item,这样注册和存放两个操作可以在一行代码内完成。

1. 我们在程序目录下新建文件夹,名为Item,在其中新建一个类,名为ModItem,继承Item类。可以看到在父类Item的构造方法中需要输入一个Properties,最基本的Properties中需要包含一个CreativeModeTab。因此在ModItem中不仅要继承父类的构造方法,还要写一个静态方法将CreativeModeTab转换为Properties。写入如下代码:

ModItem.java

package com.lingbaojun.realindustry.Item;

import net.minecraft.world.item.CreativeModeTab;import net.minecraft.world.item.Item;

public class ModItem extends Item {    public ModItem(CreativeModeTab tab) {        super(getProperties(tab));    }

   public static Item.Properties getProperties(CreativeModeTab tab) {        return new Item.Properties().tab(tab);    }}

2. 为了方便调用,我们打开在程序目录下以模组名命名的类(下文简称模组主程序),在任意一行(只要不在主类外)加入这些代码:

public static final IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();

public static final String MOD_ID = "realindustry";

3. 接下来在程序目录的Sets文件夹里面新建类,名为Items,其中存放所有物品以及一个静态注册函数写入以下代码:

Items.java

package com.lingbaojun.industry.Sets;

import com.lingbaojun.realindustry.Item.ModItem;import com.lingbaojun.realindustry.RealIndustry;import net.minecraft.world.item.Item;import net.minecraftforge.registries.DeferredRegister;import net.minecraftforge.registries.ForgeRegistries;

import static com.lingbaojun.realindustry.RealIndustry.bus;

public class Items {    public static final Item 变量名 = registerItem(new ModItem(CreativeModeTabs.物品栏的变量名),字符串(注册名,不知道什么是注册名的请看这一个步骤开头讲的));

    public static Item registerItem(Item item, String name) {        DeferredRegister deferredRegisterItem = DeferredRegister.create(ForgeRegistries.ITEMS, RealIndustry.MOD_ID);        deferredRegisterItem.register(name, () -> item);        deferredRegisterItem.register(bus);        return item;    }}

既然是科技类模组,up这里的演示就用氧化铁锭(虽然应该是粉,但我相信史蒂夫有砬把氧化铁用手压成锭)

public static final Item iron_oxide_ingot = registerItem(new ModItem(CreativeModeTabs.material),"iron_oxide_ingot");

4. 接下来初始化加载物品

    (1)在Initialize类主类内添加以下代码:

public static final ArrayList itemsArrayList = new ArrayList();

    (2)在Items类registerItem内(不能加在return后)添加以下代码:

Initialize.itemsArrayList.add(item);

    (3)在Initialize类的构造方法内添加以下代码:

Item iron_oxide_ingot = Items.iron_oxide_ingot;

5. 接下来我们找到模组文件夹/src/main/resources(下文简称资源目录),在其中创建assets文件夹,在assets文件夹中创建realindustry(你的模组名小写)文件夹,在这个文件夹下再创建三个文件夹,分别是lang、models和textures,在models和textures两个文件夹下都创建item文件夹

    (1)在lang文件夹下创建两个文件,分别命名为en_us.json(存放英语)和zh_cn.json(存放中文),当然别的语言也可以创建,具体文件名可以百度。两个文件内格式都一样:

XX_XX.lang

{

 "item.模组名小写.物品注册名": "这个物品在这个语言中的名称"}

        比如我的氧化铁锭在en_us.json中就是:

"item.realindustry.iron_oxide_ingot": "Iron Oxide Ingot"

        如果以后又添加了新的物品,直接在大括号内加就可以了,不用再加一个大括号,如:

XX_XX.lang

{ "item.模组名小写.物品1注册名": "物品1在这个语言中的名称"

 "item.模组名小写.物品2注册名": "物品2在这个语言中的名称"

 "item.模组名小写.物品3注册名": "物品3在这个语言中的名称"

……

}

       由于上面我们创建的创造模式物品栏还没写入lang文件,所以也要写进去,按照我的步骤做下来en_us.lang文件应该是这样:

en_us.lang

{  "item.realindustry.iron_oxide_ingot": "Iron Oxide Ingot",  "itemGroup.material": "Material"}

     (2)在models/item文件夹下新建一个文件,名为物品注册名.json,写入如下代码:

物品注册名.json

{  "parent": "item/generated",  "textures": {    "layer0": "realindustry:item/物品注册名"  }}

    (3)在textures.item中把这个物品的材质的图片复制进去,然后把图片重命名为物品注册名.png(最好为png图片)

三、设置创造模式物品栏显示的物品

        其实很简单,在Initialize类的构造方法的最后增加这行代码:

CreativeModeTabs.material.itemStack = new ItemStack(iron_oxide_ingot);

四、添加工作台合成表

        刚才我们学习了如何添加一个物品,现在我们可以添加一下这个物品的合成表来确保生存模式也可以获取它。

        我们可以制作两种合成表,分别为有序和无序。

        原版的有序合成有稿子、箱子等等,因为想要在工作台里合成它们只有一种摆法。

        而原版的无序合成包括原木分解成木板、金锭分解成金粒等等,因为想要在工作台里合成它们只需要把材料按照一定比例放进去就可以合成了,不需要特定顺序。

        有一种特殊的合成表,它可以有多种合成方式,但必须按照特定顺序,比如原版的剪刀、斧子、锄头等等。

        

        在正式开始前,我们先创建好文件夹。在资源目录下新建data文件夹,在其中新建一个以模组名字(小写)为名字的文件夹(up这里就是realindustry),再在其中新建一个recipes文件夹,最后在其中新建一个json文件,随意命名,确保自己知道这个合成表是合成什么的就可以了。

1. 首先我们学习有序合成,假如想要定义刚才新增的物品(氧化铁)的合成表为工作台的1 3格为铁锭(迫真Fe2O3),代码如下:

XX.json

{  "type": "minecraft:crafting_shaped",  "pattern": [    "I I"  ],  "key": {    "I": {      "item": "minecraft:iron_ingot"    }  },  "result": {    "item": "realindustry:iron_oxide_ingot",    "count": 1  }}

    相信聪明的你已经知道如何举一反三了吧,不过要注意几个点:

    (1)每次修改时要改pattern,一定要是X*Y的大小,2*3,2*2,1*1都没问题,但是不可以缺个角啥的,空的地方用空格填上。

    (2)注意key对应的关系不要搞错了,key中的字母可以换成别的,大小写区不区分我没试过,不过不建议大小写混用,部分特殊符号比如#、$是可以用的,建议key使用对应物品的注册名的首字母。

    (3)每个key对应的Item以及result的Item中,如果用的是原版的物品,则冒号前为minecraft,若为模组的物品,就要在冒号前面加模组名(小写),每次修改的时候不要光改后面物品的注册名,也要看看前面模组的的名字是否正确。

    (4)count也就是合成一次产出的数量,自己随意改。

2. 接下来我们来学习无序合成,假如说我们现在合成氧化铁只需要在工作台甚至背包合成区任意放入两个铁锭就可以合成,只要不和剪刀和压力板的合成表冲突,我们就能合成出氧化铁,代码如下:

XX.json

{  "type": "minecraft:crafting_shapeless",  "ingredients": [    {      "item": "minecraft:iron_ingot",      "data": 0    },    {      "item": "minecraft:iron_ingot",      "data": 0    }  ],  "result": {    "item": "realindustry:iron_oxide_ingot",    "count": 1  }}

        这个也不难看明白,中间的ingredients要用多少就写多少,我们用两个,就写两个铁锭上去。

3. “特殊的合成表”实际上是写了多个有序合成的合成表,比如斧子和锄头都写了两个2*3的合成表,拿斧子举例,一个是1 2 3的位置放置材料 4 6的位置放置木棍,另一个是1 2 4的位置放材料 3 5的位置放木棍,实现起来不难,有空可以自己试试。

五、添加各种合成表(部分内容和排版选自我的世界维基百科)

配方类型列表(type)minecraft:blasting

代表一个高炉配方。

举例:

{

    "type": "minecraft:blasting",

    "ingredient": [

        {

            "item": "xxx:xxx(原料的模组名和物品注册名)"

        }

    ],

    "result": "xxx:xxx(成品的模组名和物品注册名)",

    "experience": xxx(数字,获取的经验),

    "cookingtime": xxx(数字,配方合成一次的时间,默认不填为5秒。)

}

minecraft:campfire_cooking

代表一个营火配方。

举例同高炉。

默认烧炼时间是100刻,即5秒。但所有的原版营火配方都将烧炼时间修改为了600刻,即30秒。营火配方并不会触发recipe_unlocked判据。

minecraft:crafting_shaped

代表一个工作台的有序合成配方。

第四步讲过了。

minecraft:crafting_shapeless

代表一个工作台的无序合成配方。

第四步讲过了。

minecraft:crafting_special_*

代表一个工作台的特殊配方。这些配方都是由游戏内部的代码处理的,无法通过JSON文件来修改。

比较复杂而且没啥用,不讲了。

minecraft:smelting

代表一个熔炉的配方。

举例同高炉。

配方合成一次的时间不填默认为10秒。

minecraft:smoking

代表一个烟熏炉的配方。

举例同高炉。

配方合成一次的时间不填默认为10秒。

minecraft:stonecutting

代表一个切石机的配方。

举例同高炉(没错,很神奇)。

minecraft:smithing

代表一个锻造台的配方。

举例:

{

  "type": "minecraft:smithing",

  "base": {

    "item": "xxx:xxx(第一栏的模组名和物品注册名)"

  },

  "addition": {

    "item": "xxx:xxx(第二栏的模组名和物品注册名)"

  },

  "result": {

    "item": "xxx:xxx(成品的模组名和物品注册名)"

  }

}

六、核对模组文件目录

有些文件我在教程中没说要创建,比如说iron_oxide_ingot_crafting_table.json这个合成表文件

        如果发现缺了什么文件,建议从头开始一步一步核对防止遗漏。如果确认是我在教程中没写,请在评论区指出。

总算搞好了,花了半天时间,也不知道有多少人看。这破专栏要10万观看才有创作激励,写这么久也不给钱。所以有条件的给个三连,没条件的给个赞吧,有问题请在评论区提问,我没回再私聊,谢谢观看。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3