自动注册

介绍

模块提供对所有 IForgeRegistryEntry 的自动注册。修饰符必须为 public static final

@KiwiModule
public class MyModule extends AbstractModule
{
    public static final Item COOL_ITEM = new ModItem(new Item.Properties().rarity(Rarity.EPIC));

    public static final Block COOL_BLOCK = new ModBlock(Block.Properties.create(Material.WOOD));
}

这样你就会发现它们以 my_mod:cool_itemmy_mod:cool_block 被注册了。而 COOL_BLOCK 相应的 BlockItem 也会被自动注册。

物品和方块并非必须继承 ModItem 和 ModBlock,但这样做的好处会在之后提到。

你可以这样来简化代码:

@KiwiModule
public class MyModule extends AbstractModule
{
    public static final Item COOL_ITEM = new ModItem(itemProp().rarity(Rarity.EPIC));

    public static final Block COOL_BLOCK = new ModBlock(blockProp(Material.WOOD));
}

字段注解

@Skip

使用 @Skip 可以跳过该字段的自动注册。

@KiwiModule
public class MyModule extends AbstractModule
{
    @Skip
    public static final Item COOL_ITEM = new ModItem(itemProp());
}

@NoItem

有些方块不需要注册相应的 BlockItem。使用 @NoItem 可以禁用该功能。

@NoGroup

此字段可以禁用物品或方块的默认 ItemGroup 设置。

@Name

重新命名此注册项,而不是使用字段名。

@KiwiModule
public class MyModule extends AbstractModule
{
    @NoItem
    public static final Block MY_TORCH = new MyTorchBlock();

    @NoItem
    public static final Block MY_WALL_TORCH = new MyWallTorchBlock();

    @Name("my_torch")
    public static final Item MY_TORCH_ITEM = new WallOrFloorItem(MY_TORCH, MY_WALL_TORCH, itemProp());
}

你也可以用此字段替换已有的注册项:

@Name("minecraft:torch")
public static final Item TORCH = ...;

自定义 BlockItem 属性

自动注册的方块会尝试将前一个 Item.Properties 应用于它的 BlockItem。@Skip 可以跳过前一个 Item.Properties。

@KiwiModule
public class MyModule extends AbstractModule
{
    public static final Item.Properties COOL_BLOCK_ITEM_BUILDER = itemProp().rarity(Rarity.RARE);
    public static final Block COOL_BLOCK = new ModBlock(blockProp(Material.WOOD));
}

!!! Warning

该 Item.Properties 被使用后会被设置为 null

设置 ItemGroup

设置默认 ItemGroup

手动为模块内的每个物品和方块设置 ItemGroup 是一件相当麻烦的事情,为此 Kiwi 提供了这种方式注入默认的 ItemGroup。

@KiwiModule
@KiwiModule.Group
public class MyModule extends AbstractModule
{
    public static final ItemGroup GROUP = new ItemGroup("my_mod.items")
    {
        @Override
        public ItemStack createIcon()
        {
            return new ItemStack(COOL_ITEM);
        }
    };

    public static final Item COOL_ITEM = new ModItem(itemProp());
}

如果有 @KiwiModule.Group 注解,Kiwi 会将模块中第一个 ItemGroup 字段作为默认,注入到每个无 @NoGroup 注解的物品和方块中。

你也可以这样将任意 ItemGroup 设为默认。只需填入 ItemGroup 的 label 名,如原版的:building_blocks, decorations, redstone, transportation, misc, food, tools, combat, brewing

@KiwiModule
@KiwiModule.Group("building_blocks")
public class MyModule extends AbstractModule {...}
@KiwiModule
@KiwiModule.Group("my_mod.my_awesome_group")
public class MyModule extends AbstractModule {...}

为单个注册项设置 ItemGroup

@KiwiModule.Group("redstone")
public static final Item MY_ITEM = new Item(itemProp());

@KiwiModule.Group("building_blocks")
public static final Block MY_BLOCK = new Block(blockProp(Blocks.SAND));

为方块设置 RenderType

方式一:直接设置单个注册项:

// 允许的值:CUTOUT, CUTOUT_MIPPED, TRANSLUCENT
@RenderLayer(Layer.CUTOUT)
public static final Block MY_GLASS = new GlassBlock(blockProp(Blocks.GLASS));

方式二:为某个方块类及其子类设置 RenderType:

@RenderLayer(Layer.CUTOUT)
public class MyBlock extends GlassBlock {...}