Minecraft Modding Cheat Sheet
A one-page printable reference for Minecraft Forge/Fabric modding covering mod structure, registry, items, blocks, events, GUI, rendering, networking and data storage.
A one-page printable reference for Minecraft Forge/Fabric modding covering mod structure, registry, items, blocks, events, GUI, rendering, networking and data storage.
// Main mod class (Forge) @Mod("mymod") public class MyMod { public MyMod() { FMLJavaModLoadingContext .get().getModEventBus() .register(this); } } // Event bus for mod lifecycle IEventBus bus = FMLJavaModLoadingContext .get().getModEventBus(); // Register items, blocks, etc. DeferredRegister<Item> ITEMS = DeferredRegister.create( ForgeRegistries.ITEMS, "mymod");
// DeferredRegister pattern DeferredRegister<Item> ITEMS = DeferredRegister.create( ForgeRegistries.ITEMS, "mymod"); // Register an item (add it to a tab in BuildCreativeModeTabContentsEvent) RegistryObject<Item> MY_ITEM = ITEMS.register("my_item", () -> new Item( new Item.Properties())); // Register a block DeferredRegister<Block> BLOCKS = DeferredRegister.create( ForgeRegistries.BLOCKS, "mymod"); RegistryObject<Block> MY_BLOCK = BLOCKS.register("my_block", () -> new Block(Block.Behaviour .of() .strength(2.f, 6.f) .requiresCorrectToolForDrops()));
| Item | Base class for all items |
| Item.Properties | Builder for item configuration |
| ItemStack | Represents a stack of items |
| ItemHandlerHelper | Utility for item manipulation |
| CreativeModeTab.builder() | Define a custom creative tab (Forge 1.20+) |
public class SwordItem extends SwordItem { public SwordItem() { super(5, -2.4f, new Item.Properties() .durability(100)); } @Override public InteractionResultHolder<ItemStack> use(Level level, Player player, InteractionHand hand) { // item right-click logic return InteractionResultHolder .success(player.getItemInHand(hand)); } }
// Block class public class MyBlock extends Block { public MyBlock(Properties props) { super(props); } } // Key types BlockBehaviour.Properties - block settings BlockState - state of block in world BlockPos - 3D position (x, y, z) Level - the world dimension BlockEntity - tile entity / block entity // Block interaction @Override public InteractionResult use( BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hit) { // right-click block logic return InteractionResult.sidedSuccess( level.isClientSide); }
@SubscribeEvent public static void onCommonSetup( FMLCommonSetupEvent event) { // register capabilities, etc. } @SubscribeEvent public static void onClientSetup( FMLClientSetupEvent event) { // register keybinds, etc. } // Common event types PlayerEvent - join, quit, respawn LivingEvent - hurt, death, tick TickEvent - server/client tick bus.register(MyClass.class);
// Container menu public class MyMenu extends AbstractContainerMenu { public MyMenu(int id, Inventory inv) { super(MENU_TYPE, id); Slot slot = new Slot( ItemStackHandler, 0, 8, 8); addSlot(slot); } } // Screen rendering public class MyScreen extends AbstractContainerScreen<MyMenu> { @Override protected void renderBg( PoseStack pose, float delta, int mouseX, int mouseY) { // draw background texture } } // MenuProvider for opening MenuProvider provider = new SimpleMenuProvider( (id, inv, player) -> new MyMenu(id, inv), Component.literal("My GUI"));
| TileEntityRenderer | Custom rendering for block entities |
| BlockEntityWithoutLevelRenderer | Special item rendering |
| ModelLayerLocation | Register model layers |
| RenderType | Control render pipeline (cutout, translucent) |
// Register model layer (client setup) EntityRenderers.register( EntityType.ZOMBIE, ZombieRenderer::new); // Block render type @Override public RenderType getRenderType( BlockState state) { return RenderType.cutout(); } // Item model JSON in resources registerLayerDefinition( MY_MODEL_LAYER, MyModel::createBodyLayer);
// Channel setup SimpleChannel CHANNEL = NetworkRegistry .newSimpleChannel( new ResourceLocation("mymod", "main"), () -> "1", "1"::equals, "1"::equals); // Register message CHANNEL.registerMessage(0, MyPacket.class, MyPacket::encode, MyPacket::decode, MyPacket::handle); // Send to server CHANNEL.sendToServer( new MyPacket(data)); // Send to client CHANNEL.send( PacketDistributor.PLAYER .with(() -> player), new MyPacket(data));
// CompoundTag (NBT data) CompoundTag tag = new CompoundTag(); tag.putString("Name", "Steve"); tag.putInt("Level", 42); tag.putBoolean("Active", true); // Read data String name = tag.getString("Name"); int level = tag.getInt("Level"); // ListTag (arrays) ListTag list = new ListTag(); list.add(StringTag.valueOf("hello")); // Save to block entity @Override public CompoundTag getUpdateTag() { return save(new CompoundTag()); } // Load from block entity @Override public void load(CompoundTag tag) { super.load(tag); name = tag.getString("Name"); }
โโ CUSTOM ITEM โโ public class FoodItem extends Item { public FoodItem() { super(new Item.Properties() .food(Foods.GOLDEN_APPLE) .stacksTo(16)); } } โโ CUSTOM BLOCK โโ public class LampBlock extends Block { public LampBlock() { super(Block.Behaviour.of() .strength(1.f) .lightLevel(state -> state.getValue(LIT) ? 15 : 0)); } } โโ CUSTOM MOB โโ public class GremlinEntity extends Monster { protected void registerGoals() { goalSelector.addGoal(2, new MeleeAttackGoal(this, 1.2f, false)); goalSelector.addGoal(7, new FloatGoal(this)); } } โโ GUI / SCREEN โโ // Server-side: open screen player.openMenu(provider); // Client-side: register screen MenuScreens.register( MyMenu.TYPE, MyScreen::new); โโ WORLD GENERATION โโ // ore gen in datapack or code // BiomeLoadingEvent was removed in Forge 1.19.4 // Or use datapack JSON in 1.18+ // data/mymod/worldgen/configured_feature/ // data/mymod/worldgen/placed_feature/ โโ RECIPE (JSON) โโ { "type": "minecraft:crafting_shaped", "pattern": ["###", " # ", " # "], "key": { "#": { "item": "mymod:my_item" } }, "result": { "item": "mymod:my_sword" } }
Follow one of our free step-by-step workshops in the Workshop hub.
๐ง Browse Workshops โ