From 41deab1fea5b29c2435021ab8370b713296b8c48 Mon Sep 17 00:00:00 2001 From: Andrew nuark G Date: Sat, 9 May 2026 10:09:01 +0700 Subject: [PATCH] feat: simple automation for custom arch. cutter machine --- .../mclschcannoncompat/Mclschcannoncompat.kt | 13 ++++++++ .../entity/OrnamentFabricatorBlockEntity.kt | 30 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/main/kotlin/xyz/nuark/mcmod/mclschcannoncompat/Mclschcannoncompat.kt b/src/main/kotlin/xyz/nuark/mcmod/mclschcannoncompat/Mclschcannoncompat.kt index 57543a7..b1120e1 100644 --- a/src/main/kotlin/xyz/nuark/mcmod/mclschcannoncompat/Mclschcannoncompat.kt +++ b/src/main/kotlin/xyz/nuark/mcmod/mclschcannoncompat/Mclschcannoncompat.kt @@ -9,6 +9,8 @@ import net.neoforged.fml.common.Mod import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent import net.neoforged.fml.event.lifecycle.FMLDedicatedServerSetupEvent +import net.neoforged.neoforge.capabilities.Capabilities +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent import net.neoforged.neoforge.data.event.GatherDataEvent import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent @@ -21,6 +23,7 @@ import thedarkcolour.kotlinforforge.neoforge.forge.MOD_BUS import thedarkcolour.kotlinforforge.neoforge.forge.runForDist import xyz.nuark.mcmod.mclschcannoncompat.block.ModBlockEntityTypes import xyz.nuark.mcmod.mclschcannoncompat.block.ModBlocks +import xyz.nuark.mcmod.mclschcannoncompat.block.entity.OrnamentFabricatorBlockEntity import xyz.nuark.mcmod.mclschcannoncompat.comands.ModCommands import xyz.nuark.mcmod.mclschcannoncompat.datagen.ModItemModelProvider import xyz.nuark.mcmod.mclschcannoncompat.datagen.ModLanguageProviders @@ -93,6 +96,16 @@ object Mclschcannoncompat { @Suppress("unused") val registrar = event.registrar(ID).versioned(modVersion) } + @SubscribeEvent + fun onRegisterCapabilities(event: RegisterCapabilitiesEvent) { + event.registerBlockEntity( + Capabilities.ItemHandler.BLOCK, + ModBlockEntityTypes.ORNAMENT_FABRICATOR.get() + ) { be, side -> + (be as OrnamentFabricatorBlockEntity).getAutomationHandler(side) + } + } + @SubscribeEvent fun gatherData(event: GatherDataEvent) { val existingFileHelper = event.existingFileHelper diff --git a/src/main/kotlin/xyz/nuark/mcmod/mclschcannoncompat/block/entity/OrnamentFabricatorBlockEntity.kt b/src/main/kotlin/xyz/nuark/mcmod/mclschcannoncompat/block/entity/OrnamentFabricatorBlockEntity.kt index a335741..7621859 100644 --- a/src/main/kotlin/xyz/nuark/mcmod/mclschcannoncompat/block/entity/OrnamentFabricatorBlockEntity.kt +++ b/src/main/kotlin/xyz/nuark/mcmod/mclschcannoncompat/block/entity/OrnamentFabricatorBlockEntity.kt @@ -20,8 +20,10 @@ import net.minecraft.world.inventory.ContainerData import net.minecraft.world.item.BlockItem import net.minecraft.world.item.ItemStack import net.minecraft.world.item.component.BlockItemStateProperties +import net.minecraft.core.Direction import net.minecraft.world.level.block.entity.BlockEntity import net.minecraft.world.level.block.state.BlockState +import net.neoforged.neoforge.items.IItemHandler import net.neoforged.neoforge.items.ItemStackHandler import xyz.nuark.mcmod.mclschcannoncompat.block.ModBlockEntityTypes import xyz.nuark.mcmod.mclschcannoncompat.menu.OrnamentFabricatorMenu @@ -291,6 +293,34 @@ class OrnamentFabricatorBlockEntity( level?.let { Containers.dropContents(it, blockPos, inventory) } } + fun getAutomationHandler(side: Direction?): IItemHandler { + return object : IItemHandler { + override fun getSlots(): Int = itemHandler.slots + + override fun getStackInSlot(slot: Int): ItemStack = itemHandler.getStackInSlot(slot) + + override fun insertItem(slot: Int, stack: ItemStack, simulate: Boolean): ItemStack { + if (side != null && side != Direction.UP) return stack + if (slot != SLOT_INPUT_A && slot != SLOT_INPUT_B) return stack + return itemHandler.insertItem(slot, stack, simulate) + } + + override fun extractItem(slot: Int, amount: Int, simulate: Boolean): ItemStack { + if (side != null && side != Direction.DOWN) return ItemStack.EMPTY + if (slot != SLOT_OUTPUT) return ItemStack.EMPTY + return itemHandler.extractItem(slot, amount, simulate) + } + + override fun getSlotLimit(slot: Int): Int = itemHandler.getSlotLimit(slot) + + override fun isItemValid(slot: Int, stack: ItemStack): Boolean { + if (side != null && side != Direction.UP) return false + if (slot != SLOT_INPUT_A && slot != SLOT_INPUT_B) return false + return itemHandler.isItemValid(slot, stack) + } + } + } + companion object { const val SLOT_INPUT_A = 0 const val SLOT_INPUT_B = 1