Skip to content

Registration

Registering content from common code. Packages: net.ixdarklord.coolcatcore.api.registry, api.core.commands and api.client.registry.

Deferred registers

public final class MyRegistries {
    public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(MyMod.MOD_ID, Registries.ITEM);
    public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(MyMod.MOD_ID, Registries.BLOCK);
    public static final DeferredRegister<CreativeModeTab> TABS = DeferredRegister.create(MyMod.MOD_ID, Registries.CREATIVE_MODE_TAB);

    public static final RegistryEntry<Block> RUBY_BLOCK = BLOCKS.register("ruby_block", () ->
            new Block(BlockBehaviour.Properties.of().strength(3.0F).setId(ResourceKey.create(Registries.BLOCK, MyMod.id("ruby_block")))));

    public static final RegistryEntry<CreativeModeTab> TAB = TABS.register("main", () -> CreativeTabs.builder()
            .title(Component.translatable("itemGroup.mymod"))
            .icon(() -> new ItemStack(RUBY_BLOCK.get()))
            .displayItems((parameters, output) -> output.accept(RUBY_BLOCK.get()))
            .build());
}

// In ModConstructor#onConstructMod():
MyRegistries.BLOCKS.register();
MyRegistries.ITEMS.register();
MyRegistries.TABS.register();

Call register() once, during construction. On NeoForge, entries added after that are never registered.

Other registration helpers

// A block entity type, from its factory and blocks:
BLOCK_ENTITIES.register("crate", () -> BlockEntityTypes.create(CrateBlockEntity::new, CRATE.get()));

// A server reload listener (world load and /reload):
ReloadListeners.registerServer(MyMod.id("challenges"), new ChallengesManager());

// A custom command argument type, through a DeferredRegister of Registries.COMMAND_ARGUMENT_TYPE:
public static final RegistryEntry<ArgumentTypeInfo<ShapeArgument, ?>> SHAPE_ARGUMENT = ARGUMENT_TYPES.register("shape",
        () -> ArgumentTypeRegistry.register(ShapeArgument.class, SingletonArgumentInfo.contextFree(ShapeArgument::shape)));

Client registries

Register these from ClientModConstructor#onConstructMod():

KeyMappingRegistry.register(MY_KEY);
MenuScreenRegistry.register(MyRegistries.CRATE_MENU, CrateScreen::new);
TooltipComponentRegistry.register(MyTooltip.class, MyClientTooltip::new);

Reference

Type Description
DeferredRegister<T> create(modId, registryKey), register(name, supplier) โ†’ RegistryEntry, register(), getEntries(), getModId(), getRegistryKey().
RegistryEntry<T> A Supplier<T>: get() (throws before registration), getId(), holder(), isBound().
CreativeTabs builder(): a CreativeModeTab.Builder that the loader places; register the tab in Registries.CREATIVE_MODE_TAB.
ReloadListeners registerServer(Identifier id, PreparableReloadListener listener).
BlockEntityTypes create(Factory<T> factory, Block... blocks), where Factory is (BlockPos, BlockState) -> T.
api.core.commands.ArgumentTypeRegistry register(Class<A> argumentClass, I argumentTypeInfo).
api.client.registry.KeyMappingRegistry register(KeyMapping) โ†’ the mapping.
api.client.registry.MenuScreenRegistry register(Supplier<MenuType<M>> type, ScreenFactory<M, U> factory), where the factory is (menu, inventory, title) -> screen.
api.client.registry.TooltipComponentRegistry register(Class<T> type, Function<T, ClientTooltipComponent> factory).