From 17e4856b100d9b9a5148a40b30e2f98a13a60c6e Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Mon, 10 Mar 2025 15:29:50 +0700 Subject: [PATCH] Use SlottedContainer in Essense Storage --- .../entity/tech/EssenceStorageBlockEntity.kt | 47 +++++++++++-------- .../screen/tech/EssenceStorageScreen.kt | 5 +- .../mc/otm/container/EnhancedContainer.kt | 9 ++++ .../mc/otm/menu/tech/EssenceStorageMenu.kt | 9 ++-- 4 files changed, 46 insertions(+), 24 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EssenceStorageBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EssenceStorageBlockEntity.kt index 9695e8dea..22db89523 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EssenceStorageBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EssenceStorageBlockEntity.kt @@ -23,8 +23,12 @@ import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity import ru.dbotthepony.mc.otm.block.tech.EssenceStorageBlock import ru.dbotthepony.mc.otm.capability.item.CombinedItemHandler import ru.dbotthepony.mc.otm.config.MachinesConfig +import ru.dbotthepony.mc.otm.container.EnhancedContainer import ru.dbotthepony.mc.otm.container.HandlerFilter import ru.dbotthepony.mc.otm.container.MatteryContainer +import ru.dbotthepony.mc.otm.container.slotted.ContainerSlot +import ru.dbotthepony.mc.otm.container.slotted.FilteredContainerSlot +import ru.dbotthepony.mc.otm.container.slotted.SlottedContainer import ru.dbotthepony.mc.otm.core.getEntitiesInEllipsoid import ru.dbotthepony.mc.otm.core.lookupOrThrow import ru.dbotthepony.mc.otm.core.math.Vector @@ -45,9 +49,29 @@ class EssenceStorageBlockEntity(blockPos: BlockPos, blockState: BlockState) : Ma markDirtyFast() } - val capsuleContainer = MatteryContainer(::markDirtyFast, 1) - val servoContainer = MatteryContainer(::markDirtyFast, 1) - val mendingContainer = MatteryContainer(::markDirtyFast, 1).also(::addDroppableContainer) + private class CapsuleSlot(container: SlottedContainer, slot: Int) : ContainerSlot(container, slot) { + override fun canAutomationPlaceItem(itemStack: ItemStack): Boolean { + return super.canAutomationPlaceItem(itemStack) && itemStack.item is EssenceCapsuleItem + } + + override fun canAutomationTakeItem(desired: Int): Boolean { + return false + } + } + + private inner class MendingSlot(container: SlottedContainer, slot: Int) : FilteredContainerSlot(container, slot) { + override fun canAutomationPlaceItem(itemStack: ItemStack): Boolean { + return super.canAutomationPlaceItem(itemStack) && itemStack.isDamaged && itemStack.getEnchantmentLevel(mending!!) > 0 + } + + override fun canAutomationTakeItem(desired: Int): Boolean { + return super.canAutomationTakeItem(desired) && (!item.isDamaged || experienceStored <= 0) + } + } + + val capsuleContainer = SlottedContainer.simple(1, ::CapsuleSlot, ::markDirtyFast) + val servoContainer = EnhancedContainer.withListener(1, ::markDirtyFast) + val mendingContainer = SlottedContainer.simple(1, ::MendingSlot, ::markDirtyFast).also(::addDroppableContainer) private var mending: Holder? = null @@ -63,22 +87,7 @@ class EssenceStorageBlockEntity(blockPos: BlockPos, blockState: BlockState) : Ma } val itemConfig = ConfigurableItemHandler( - inputOutput = CombinedItemHandler( - capsuleContainer.handler(HandlerFilter.OnlyIn.and(object : HandlerFilter { - override fun canInsert(slot: Int, stack: ItemStack): Boolean { - return stack.item is EssenceCapsuleItem - } - })), - mendingContainer.handler(object : HandlerFilter { - override fun canInsert(slot: Int, stack: ItemStack): Boolean { - return stack.isDamaged && stack.getEnchantmentLevel(mending!!) > 0 - } - - override fun canExtract(slot: Int, amount: Int, stack: ItemStack): Boolean { - return !stack.isDamaged || experienceStored <= 0 - } - }) - ) + inputOutput = CombinedItemHandler(capsuleContainer, mendingContainer) ) override fun loadAdditional(nbt: CompoundTag, registry: HolderLookup.Provider) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EssenceStorageScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EssenceStorageScreen.kt index 3bab0a1a5..46a1d4ed4 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EssenceStorageScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EssenceStorageScreen.kt @@ -21,6 +21,7 @@ import ru.dbotthepony.mc.otm.client.screen.panels.button.ButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.button.makeDeviceControls import ru.dbotthepony.mc.otm.client.screen.panels.input.TextInputPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.SlotPanel +import ru.dbotthepony.mc.otm.client.screen.panels.slot.UserFilteredSlotPanel import ru.dbotthepony.mc.otm.client.screen.panels.util.HorizontalStripPanel import ru.dbotthepony.mc.otm.core.ResourceLocation import ru.dbotthepony.mc.otm.core.TextComponent @@ -279,7 +280,7 @@ class EssenceStorageScreen(menu: EssenceStorageMenu, inventory: Inventory, title get() = SET_EXACT override fun onClick(mouseButton: Int) { - val player = minecraft!!.player!! ?: return + val player = minecraft!!.player!! if (player.experienceLevel == customDispense) { if (player.experienceProgress > 0f) { @@ -297,7 +298,7 @@ class EssenceStorageScreen(menu: EssenceStorageMenu, inventory: Inventory, title set(_) {} } - SlotPanel(this, inputs, menu.mendingSlot).also { + UserFilteredSlotPanel(this, inputs, menu.mendingSlot).also { it.dock = Dock.LEFT it.tooltips.add(TranslatableComponent("enchantment.minecraft.mending").withStyle(ChatFormatting.GRAY)) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/EnhancedContainer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/EnhancedContainer.kt index f3a4defd5..5f2f6c508 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/EnhancedContainer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/EnhancedContainer.kt @@ -186,5 +186,14 @@ open class EnhancedContainer(private val size: Int) : IEnhancedContainer, INBTSe companion object { private val LOGGER = LogManager.getLogger() + + fun withListener(slots: Int, listener: Runnable): EnhancedContainer { + return object : EnhancedContainer(slots) { + override fun notifySlotChanged(slot: Int, old: ItemStack) { + super.notifySlotChanged(slot, old) + listener.run() + } + } + } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/tech/EssenceStorageMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/tech/EssenceStorageMenu.kt index a80d14515..f3c4258fd 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/tech/EssenceStorageMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/tech/EssenceStorageMenu.kt @@ -9,11 +9,14 @@ import net.minecraft.world.item.enchantment.EnchantmentHelper import ru.dbotthepony.kommons.util.getValue import ru.dbotthepony.mc.otm.block.entity.RedstoneSetting import ru.dbotthepony.mc.otm.block.entity.tech.EssenceStorageBlockEntity +import ru.dbotthepony.mc.otm.container.EnhancedContainer +import ru.dbotthepony.mc.otm.container.slotted.SlottedContainer import ru.dbotthepony.mc.otm.core.util.getTotalXpRequiredForLevel import ru.dbotthepony.mc.otm.item.consumables.EssenceCapsuleItem import ru.dbotthepony.mc.otm.item.EssenceServoItem import ru.dbotthepony.mc.otm.menu.MatteryMenu import ru.dbotthepony.mc.otm.menu.MatteryMenuSlot +import ru.dbotthepony.mc.otm.menu.UserFilteredMenuSlot import ru.dbotthepony.mc.otm.menu.input.EnumInputWithFeedback import ru.dbotthepony.mc.otm.menu.input.FluidConfigPlayerInput import ru.dbotthepony.mc.otm.menu.input.ItemConfigPlayerInput @@ -31,19 +34,19 @@ class EssenceStorageMenu( val itemConfig = ItemConfigPlayerInput(this, tile?.itemConfig) val fluidConfig = FluidConfigPlayerInput(this, tile?.fluidConfig) - val capsuleSlot = object : MatteryMenuSlot(tile?.capsuleContainer ?: SimpleContainer(1), 0) { + val capsuleSlot = object : MatteryMenuSlot(tile?.capsuleContainer ?: EnhancedContainer(1), 0) { override fun mayPlace(itemStack: ItemStack): Boolean { return itemStack.item is EssenceCapsuleItem && super.mayPlace(itemStack) } } - val servoSlot = object : MatteryMenuSlot(tile?.servoContainer ?: SimpleContainer(1), 0) { + val servoSlot = object : MatteryMenuSlot(tile?.servoContainer ?: EnhancedContainer(1), 0) { override fun mayPlace(itemStack: ItemStack): Boolean { return itemStack.item == MItems.ESSENCE_SERVO && super.mayPlace(itemStack) } } - val mendingSlot = object : MatteryMenuSlot(tile?.mendingContainer ?: SimpleContainer(1), 0) { + val mendingSlot = object : UserFilteredMenuSlot(tile?.mendingContainer ?: SlottedContainer.filtered(1), 0) { override fun mayPlace(itemStack: ItemStack): Boolean { return itemStack.isDamaged && EnchantmentHelper.has(itemStack, EnchantmentEffectComponents.REPAIR_WITH_XP) }