类似物品的添加, M i n e c r a f t Minecraft Minecraft中所有方块都继承类 B l o c k Block Block,我们在
package author.modid.block;
import author.modid.Modid;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material; //调用材料类
public class ModBlock extends Block {
public ModBlock() {
super(Material.SAND); //参数为该物品的材料种类,此处为沙子
this.setUnlocalizedName(Modid.MODID + ".modBlock");
this.setRegistryName("mod_block");
this.setHarvestLevel("shovel", 0); //设置挖掘工具和挖掘等级,此处分别为锹,0级
this.setHardness(0.5F); //设置硬度(可以决定挖掘速度)
this.setResistance(0.5F / 3.0F); //设置爆炸抗性(但是爆炸抗性会将这里的数值翻三倍)
}
}
代码中的super用于调用父类的含参构造方法,必须位于子类构造方法的第一句,如果没有super,子类的构造方法会在开始时自动调用父类的默认构造方法,而默认构造方法是无参的,并且如果子类含有默认构造方法而父类没有默认构造方法则会报错
类似物品的注册,我们在
package author.modid.block;
import ...
@Mod.EventBusSubscriber
public class RegistryOfBlockHandler {
public static final ModBlock MOD_BLOCK = new ModBlock();
@SubscribeEvent
public static void onRegistry(Register<Block> event) {
event.getRegistry().registerAll(
MOD_BLOCK
);
}
}
这简直和物品一模一样啊,但是不一样的马上就来了
现在需要注册刚才那个方块对应的物品,这也有现成的类可用—— I t e m B l o c k ItemBlock ItemBlock,它的构造函数的参数就是一个注册了的方块,接下来要在 R e g i s t r y O f I t e m H a n d l e r RegistryOfItemHandler RegistryOfItemHandler中添加语句定义一个 I t e m B l o c k ItemBlock ItemBlock来对应刚才那个方块
public static final ItemBlock MOD_ITEM_BLOCK = new
ItemBlock(RegistryOfBlockHandler.MOD_BLOCK);
但是forge的 I t e m B l o c k ItemBlock ItemBlock的构造方法唯一没有完成的初始化是设置registry name,为避免对于每个方块都要在 R e g i s t r y O f I t e m H a n d l e r RegistryOfItemHandler RegistryOfItemHandler中添加语句来设置registry name而导致冗长,可以给 I t e m B l o c k ItemBlock ItemBlock写一个子类并在其构造方法中加入初始化registry name的语句,具体操作为在
package author.modid.item;
import net.minecraft.block.Block;
import net.minecraft.item.ItemBlock;
import java.util.Objects;
public class MyItemBlock extends ItemBlock {
public MyItemBlock(Block block) {
super(block); //必须要加,因为ItemBlock没有默认的构造方法
this.setRegistryName(Objects.requireNonNull(block.getRegistryName())); //设置registry name
}
}
当然,在此之后还要把 R e g i s t r y O f I t e m H a n d l e r RegistryOfItemHandler RegistryOfItemHandler的那条定义语句中的ItemBlock改为MyItemBlock
方块的材质需要用它对应的 I t e m B l o c k ItemBlock ItemBlock进行添加,方法和普通物品是一样的,为了以后都可以方便地添加普通物品的材质,可在 R e g i s t r y O f I t e m H a n d l e r RegistryOfItemHandler RegistryOfItemHandler中添加一个方法如下
@SideOnly(Side.CLIENT)
private static void setResourceLocation(Item item) {
ModelLoader.setCustomModelResourceLocation(item, 0,
new ModelResourceLocation(Objects.requireNonNull(item.getRegistryName()), "inventory"));
}
这个方法类似于含metadata的物品的setSubtypeResourceLocation,所以在指定资源位置时只需要在onModelRegistry中加入一行
setResourceLocation(MOD_ITEM_BLOCK);
接下来在相应位置放入资源,先在main.resources.assets.modid.blockstates中新建一个mod_block.json文件,输入以下内容
{
"forge_marker" : 1,
"defaults" : {
"model" : "minecraft:cube_all", //说明该方块各面完全相同
"textures" : { "all" : "modid:blocks/mod_block" } //指定图片文件位置
},
"variants" : {
"normal" : [{}], //说明该方块的显示方式
"inventory" : [{ "transform" : "forge:default-block" }] //说明该方块对应的物品显示方式与原版方块对应的物品一样
}
}
接下来新建文件夹及放入图片文件的操作和物品类似,由于这里是各面一致的方块,所以只需要放入一张图片即可,这张图片会运用于方块的各个面
陆续更新中…
方块的本地化与物品的唯一不同点在于它将item换为了tile,即
tile.modid.modBlock.name=模组方块
该本地化同时作用于方块及其对应物品
Harbinger
土球球的《我的世界Minecraft模组开发指南》
Forge文档
我的世界开发者中文指南
制作不易,若有帮助,欢迎打赏!