Use SlottedContainer in Essense Storage

This commit is contained in:
DBotThePony 2025-03-10 15:29:50 +07:00
parent 847ec81928
commit 17e4856b10
Signed by: DBot
GPG Key ID: DCC23B5715498507
4 changed files with 46 additions and 24 deletions

View File

@ -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<Enchantment>? = 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) {

View File

@ -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))
}

View File

@ -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()
}
}
}
}
}

View File

@ -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)
}