我的世界1.20.1forge模组开发(2)制作基础的物品

添加物品

这次我们来给我的世界添加物品,今日目标:制作一个自定义武器,该武器攻击伤害为7,自定义贴图,制作一个自定义食物,回复指定的饱和度,制作一个自定义的药水,引用后给予自定义效果。

添加物品需要先创建一个注册表,往注册表里添加我们想要的物品,然后设置他的属性,然后在主类中把该注册表注册到事件总线中去即可,过程非常简单,下面上代码:

主类:

@Mod(ExampleMod.MOD_ID)
public class ExampleMod {
    public static final String MOD_ID = "mymod";
    public ExampleMod(FMLJavaModLoadingContext context) {
        IEventBus bus = context.getModEventBus();
        ModItems.ITEMS.register(bus);
        ModEffects.EFFECTS.register(bus);
        ModCreativeTab.register(bus);
    }
}

物品注册代码:

public class ModItems {
    public static final DeferredRegister<Item> ITEMS =
            DeferredRegister.create(ForgeRegistries.ITEMS, ExampleMod.MOD_ID);

    // 注册物品
    public static final RegistryObject<Item> TEST_WEAPON = ITEMS.register("test_weapon",
            () -> new SwordItem(Tiers.DIAMOND, 4, -2.4F,
                    new Item.Properties()));

    public static final RegistryObject<Item> CUSTOM_FOOD = ITEMS.register("custom_food",
            () -> new Item(new Item.Properties()
                    .food(new FoodProperties.Builder()
                            .nutrition(6)
                            .saturationMod(1.2F)
                            .build())));

    public static final RegistryObject<Item> TEST_POTION = ITEMS.register("test_potion",
            () -> new Item(new Item.Properties()
                    .stacksTo(2) // 可堆叠
                    .craftRemainder(Items.GLASS_BOTTLE) // 使用后返回玻璃瓶
                    .food(new FoodProperties.Builder()
                            .alwaysEat() // 允许随时使用
                            .effect(() -> new MobEffectInstance(ModEffects.TEST_EFFECT.get(), 600, 0), 1.0F) // 添加药水效果
                            .build())));
}

代码解析

  1. 类注解 @Mod(ExampleMod.MOD_ID):

    • 这是一个Forge Modder Library (FML) 提供的注解,用于标记该类为一个模组的主类。ExampleMod.MOD_ID 是模组的唯一标识符,用于在Minecraft中区分不同的模组。
  2. 类定义 public class ExampleMod:

    • 定义了一个名为 ExampleMod 的公共类,这个类就是模组的入口点。
  3. 静态常量 public static final String MOD_ID = "mymod";:

    • 定义了一个静态常量 MOD_ID,其值为 "mymod"。这个值在整个模组中都会用到,用于标识该模组。确保在模组的各个部分都使用相同的 MOD_ID
  4. 构造函数 public ExampleMod(FMLJavaModLoadingContext context):

    • 这个构造函数在模组被加载时被调用。FMLJavaModLoadingContext 是一个上下文对象,包含了模组的加载事件总线。
    • IEventBus bus = context.getModEventBus();: 获取模组的事件总线。事件总线用于注册模组的各种内容,如物品、效果等,以便在Minecraft中正确加载。
    • ModItems.ITEMS.register(bus);: 注册模组中的所有物品。ModItems.ITEMS 是一个 DeferredRegister 对象,用于延迟注册物品。这行代码将所有待注册的物品注册到Minecraft的物品注册表中。
    • ModEffects.EFFECTS.register(bus);: 注册模组中的所有效果(例如药水效果)。ModEffects.EFFECTS 同样是一个 DeferredRegister 对象,用于延迟注册效果。这行代码将所有待注册的效果注册到Minecraft的效果注册表中。
    • ModCreativeTab.register(bus);: 注册模组的创造模式标签页。创造模式标签页用于在创造模式中更方便地查找模组中的物品。ModCreativeTab.register(bus) 将标签页注册到Minecraft的创造模式标签页注册表中。
    • MinecraftForge.EVENT_BUS.register(this);: 将当前 ExampleMod 实例注册到Minecraft Forge的全局事件总线。这意味着该类可以监听和响应Minecraft Forge的各类事件,如客户端设置事件等。

代码总结

这段代码的主要功能是初始化模组,并进行必要的注册工作。它通过构造函数获取模组的事件总线,然后使用该事件总线注册模组中的物品、效果和创造模式标签页。此外,它还将当前模组实例注册到Minecraft Forge的全局事件总线,使得模组能够监听和处理各类Minecraft Forge事件。这些初始化步骤确保了模组的内容可以在Minecraft中正确加载和使用。

 物品生成类代码:

1.类定义

public class ModItems {

定义了一个名为ModItems的公共类,用于管理模组中的所有物品注册。

 2. 注册表的创建

public static final DeferredRegister<Item> ITEMS =
        DeferredRegister.create(ForgeRegistries.ITEMS, ExampleMod.MOD_ID);
  • DeferredRegister.create:创建一个延迟注册器,用于注册物品。
  • ForgeRegistries.ITEMS:指定要注册的物品类型为Minecraft中的物品。
  • ExampleMod.MOD_ID:指定模组的ID,ExampleMod应该定义在其他地方,标识了这个模组的唯一名称。

3. 注册测试武器

public static final RegistryObject<Item> TEST_WEAPON = ITEMS.register("test_weapon",
        () -> new SwordItem(Tiers.DIAMOND, 4, -2.4F,
                new Item.Properties()));

  • ITEMS.register("test_weapon", ...):在物品注册器中注册一个新的物品,名称为test_weapon
  • new SwordItem(Tiers.DIAMOND, 4, -2.4F, new Item.Properties()):创建一个新的剑物品。
    • Tiers.DIAMOND:指定剑的材质为钻石。
    • 4:指定剑的额外伤害值,基础伤害值加上这个值是最终的伤害值。
    • -2.4F:指定剑的攻击速度,负值表示攻击速度较慢。
    • new Item.Properties():设置物品的属性,这里没有做特殊设置。

4. 注册自定义食物

public static final RegistryObject<Item> CUSTOM_FOOD = ITEMS.register("custom_food",
        () -> new Item(new Item.Properties()
                .food(new FoodProperties.Builder()
                        .nutrition(6)
                        .saturationMod(1.2F)
                        .build())));
  • ITEMS.register("custom_food", ...):注册一个新的食物物品,名称为custom_food
  • new FoodProperties.Builder():创建食物属性的构建器。
    • .nutrition(6):设置食物提供的饱腹值为6。
    • .saturationMod(1.2F):设置食物提供的饱和度为1.2F。
    • .build():构建食物属性对象。

5. 注册测试药水

public static final RegistryObject<Item> TEST_POTION = ITEMS.register("test_potion",
        () -> new Item(new Item.Properties()
                .stacksTo(2) 
                .craftRemainder(Items.GLASS_BOTTLE) 
                .food(new FoodProperties.Builder()
                        .alwaysEat() 
                        .effect(() -> new MobEffectInstance(ModEffects.TEST_EFFECT.get(), 600, 0), 1.0F) 
                        .build())));
  • ITEMS.register("test_potion", ...):注册一个新的物品,名称为test_potion
  • new Item.Properties():设置物品的属性。
    • .stacksTo(2):设置物品的最大堆叠数量为2。
    • .craftRemainder(Items.GLASS_BOTTLE):设置在使用该物品后返回的物品为玻璃瓶。
    • .food(new FoodProperties.Builder().alwaysEat().effect(...).build()):设置物品为食物,并具有以下属性:
      • .alwaysEat():允许玩家在任何饱腹度下都可以食用。
      • .effect(...):食用该食物后会施加一个效果。
        • () -> new MobEffectInstance(ModEffects.TEST_EFFECT.get(), 600, 0):定义效果为ModEffects.TEST_EFFECT,持续时间为600个游戏刻(大约30秒),效果等级为0。

总结

这段代码的主要功能是在Minecraft模组中注册三个新的物品:一个钻石剑、一个自定义食物和一个自定义药水。这些物品可以通过模组ID在游戏内引用,并且每个物品都具有特定的属性设置,如材质、攻击速度、饱腹值、饱和度、堆叠数量等。特别是在药水的注册中,设置了使用后返回玻璃瓶和食用时施加特定效果的功能。

自定义效果 

这时候肯定有人要问了,自定义药水没有自定义效果叫什么自定义药水?这样我们就开始创建属于自己的自定义药水效果(这里不是真正的自定义,还是引用了mc原来就有的效果,只不过换了个名字)

还是像之前一样注册就可以:

public class ModEffects {
    public static final DeferredRegister<MobEffect> EFFECTS =
            DeferredRegister.create(ForgeRegistries.MOB_EFFECTS, ExampleMod.MOD_ID);

    // 注册药水效果
    public static final RegistryObject<MobEffect> TEST_EFFECT = EFFECTS.register("test_effect",
            TestEffect::new);
}

ModEffects解析: 

这段代码定义了一个名为 ModEffects 的类,主要用于注册药水效果。具体解析如下:

  1. 创建了一个名为 EFFECTS 的 DeferredRegister 对象,用于注册 MobEffect 类型的对象。这里通过调用 create 方法传入 ForgeRegistries.MOB_EFFECTS 和 ExampleMod.MOD_ID 来创建了一个 DeferredRegister 对象。

  2. 定义了一个名为 TEST_EFFECT 的 RegistryObject 对象,用于表示一种名为 "test_effect" 的药水效果。通过调用 EFFECTS 的 register 方法,将 "test_effect" 这个药水效果注册到 EFFECTS 对象中,同时传入 TestEffect::new 作为参数,表示创建 TestEffect 类的实例作为注册的物品。

总结:

该代码用于注册一种名为 "test_effect" 的药水效果,并在 ExampleMod.MOD_ID 下注册该药水效果。

public class TestEffect extends MobEffect {
    public TestEffect() {
        super(MobEffectCategory.BENEFICIAL, 0x00FF00);
    }
}

TestEffect解析:

这段代码定义了一个名为TestEffect的类,它是MobEffect类的子类。TestEffect类没有定义任何成员变量或方法。

TestEffect类的构造函数TestEffect()调用了父类MobEffect的构造函数,并传递了两个参数:MobEffectCategory.BENEFICIAL和0x00FF00。第一个参数表示效果的类别,这里是有益效果。第二个参数表示效果的颜色,这里是绿色。

通过这段代码,TestEffect类创建了一个有益的效果,颜色为绿色。

最后在主类中把注册表注册到事件总线中就可以了,非常简单,你学会了吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lemon_sjdk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值