添加物品
这次我们来给我的世界添加物品,今日目标:制作一个自定义武器,该武器攻击伤害为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())));
}
代码解析
-
类注解
@Mod(ExampleMod.MOD_ID)
:- 这是一个Forge Modder Library (FML) 提供的注解,用于标记该类为一个模组的主类。
ExampleMod.MOD_ID
是模组的唯一标识符,用于在Minecraft中区分不同的模组。
- 这是一个Forge Modder Library (FML) 提供的注解,用于标记该类为一个模组的主类。
-
类定义
public class ExampleMod
:- 定义了一个名为
ExampleMod
的公共类,这个类就是模组的入口点。
- 定义了一个名为
-
静态常量
public static final String MOD_ID = "mymod";
:- 定义了一个静态常量
MOD_ID
,其值为"mymod"
。这个值在整个模组中都会用到,用于标识该模组。确保在模组的各个部分都使用相同的MOD_ID
。
- 定义了一个静态常量
-
构造函数
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 的类,主要用于注册药水效果。具体解析如下:
-
创建了一个名为 EFFECTS 的 DeferredRegister 对象,用于注册 MobEffect 类型的对象。这里通过调用 create 方法传入 ForgeRegistries.MOB_EFFECTS 和 ExampleMod.MOD_ID 来创建了一个 DeferredRegister 对象。
-
定义了一个名为 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类创建了一个有益的效果,颜色为绿色。
最后在主类中把注册表注册到事件总线中就可以了,非常简单,你学会了吗?