-
Notifications
You must be signed in to change notification settings - Fork 0
Client Registration
Butterfly API provides ClientRegistrar for common client-side registration tasks.
Client registration must only be performed on the physical client.
From your ModContext:
MOD.client();This should normally be used from your Fabric client initializer.
public class ExampleModClient implements ClientModInitializer {
@Override
public void onInitializeClient() {
ClientRegistrar client = ExampleMod.MOD.client();
}
}Calling MOD.client() on a dedicated server will throw an IllegalStateException.
MOD.cutout(EXAMPLE_BLOCK);Multiple blocks can be supplied:
MOD.cutout(
EXAMPLE_BLOCK,
SECOND_BLOCK,
THIRD_BLOCK
);MOD.cutoutMipped(EXAMPLE_BLOCK);In the current 1.21.11 implementation, cutoutMipped(...) uses the same CUTOUT render layer as cutout(...).
MOD.translucent(EXAMPLE_BLOCK);MOD.entityRenderer(
EXAMPLE_ENTITY,
ExampleEntityRenderer::new
);The equivalent ClientRegistrar method is:
MOD.client().entity(...);MOD.blockEntityRenderer(
EXAMPLE_BLOCK_ENTITY,
ExampleBlockEntityRenderer::new
);The equivalent ClientRegistrar method is:
MOD.client().blockEntity(...);Register a handled screen with:
MOD.screen(
EXAMPLE_SCREEN_HANDLER,
ExampleScreen::new
);MOD.modelLayer(
EXAMPLE_MODEL_LAYER,
ExampleModel::getTexturedModelData
);MOD.particleFactory(
EXAMPLE_PARTICLE,
ExampleParticle.Factory::new
);Butterfly API provides two small helpers for initialization code that should only run once:
BootstrapRunOnce
Bootstrap groups one or more initialization steps and prevents them from being executed more than once.
Create one with:
private static final Bootstrap BOOTSTRAP =
Bootstrap.create();Then run your initialization:
public static void init() {
BOOTSTRAP.run(
ModItems::init,
ModBlocks::init,
ModSounds::init
);
}The first call runs every supplied step.
Later calls do nothing.
BOOTSTRAP.hasRun();Returns true after the bootstrap successfully runs.
run(...) also returns a boolean:
boolean ran = BOOTSTRAP.run(
ModItems::init,
ModBlocks::init
);It returns:
true
when the initialization runs for the first time.
It returns:
false
when the bootstrap has already run.
RunOnce is the smaller version of the same idea.
Create one with:
private static final RunOnce INIT =
RunOnce.create();Then:
public static void init() {
INIT.run(() -> {
// initialization
});
}INIT.hasRun();Like Bootstrap, run(...) returns true when the action runs and false when it has already run.
Use Bootstrap when initialization naturally consists of multiple steps:
BOOTSTRAP.run(
ModItems::init,
ModBlocks::init,
ModEntities::init
);Use RunOnce when you simply need to protect one action:
INIT.run(ModItems::register);Both helpers are designed to prevent accidental duplicate initialization.