Move from lambdas to interface since it is more clean in mattery container

This commit is contained in:
DBotThePony 2022-01-14 13:27:17 +07:00
parent fc20c4429d
commit 81e6a8e616
Signed by: DBot
GPG Key ID: DCC23B5715498507
2 changed files with 29 additions and 11 deletions

View File

@ -1,7 +1,5 @@
package ru.dbotthepony.mc.otm.container package ru.dbotthepony.mc.otm.container
import net.minecraft.MethodsReturnNonnullByDefault
import javax.annotation.ParametersAreNonnullByDefault
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.ListTag import net.minecraft.nbt.ListTag
@ -130,14 +128,26 @@ open class MatteryContainer(val watcher: Runnable, private val size: Int) : Cont
protected var handler: MatteryContainerHandler? = null protected var handler: MatteryContainerHandler? = null
fun handler( fun handler(
insert_validator: (Int, ItemStack) -> Boolean, insert_validator: (slot: Int, stack: ItemStack) -> Boolean,
extract_validator: (Int, Int, ItemStack) -> Boolean extract_validator: (slot: Int, amount: Int, stack: ItemStack) -> Boolean
): MatteryContainerHandler { ): MatteryContainerHandler {
return handler ?: MatteryContainerHandler(this, insert_validator, extract_validator).also { handler = it } return handler ?: MatteryContainerHandler(this, object : MatteryContainerFilter {
override fun canInsert(slot: Int, stack: ItemStack) = insert_validator(slot, stack)
override fun canExtract(slot: Int, amount: Int, stack: ItemStack) = extract_validator(slot, amount, stack)
}).also { handler = it }
}
fun handler(
filter: MatteryContainerFilter
): MatteryContainerHandler {
return handler ?: MatteryContainerHandler(this, filter).also { handler = it }
} }
fun handler(insert_validator: (Int, ItemStack) -> Boolean): MatteryContainerHandler { fun handler(insert_validator: (Int, ItemStack) -> Boolean): MatteryContainerHandler {
return handler ?: MatteryContainerHandler(this, insert_validator).also { handler = it } return handler ?: MatteryContainerHandler(this, object : MatteryContainerFilter {
override fun canInsert(slot: Int, stack: ItemStack) = insert_validator(slot, stack)
override fun canExtract(slot: Int, amount: Int, stack: ItemStack) = false
}).also { handler = it }
} }
fun handler(): MatteryContainerHandler { fun handler(): MatteryContainerHandler {

View File

@ -4,10 +4,18 @@ import net.minecraft.world.item.ItemStack
import net.minecraftforge.common.util.LazyOptional import net.minecraftforge.common.util.LazyOptional
import net.minecraftforge.items.IItemHandler import net.minecraftforge.items.IItemHandler
interface MatteryContainerFilter {
fun canInsert(slot: Int, stack: ItemStack): Boolean
fun canExtract(slot: Int, amount: Int, stack: ItemStack): Boolean
}
class MatteryContainerHandler @JvmOverloads internal constructor( class MatteryContainerHandler @JvmOverloads internal constructor(
private val container: MatteryContainer, private val container: MatteryContainer,
private val insert_validator: (Int, ItemStack) -> Boolean = { _: Int, _: ItemStack -> true },
private val extract_validator: (Int, Int, ItemStack) -> Boolean = { _: Int, _: Int, _: ItemStack -> true } private val filter: MatteryContainerFilter = object : MatteryContainerFilter {
override fun canInsert(slot: Int, stack: ItemStack) = true
override fun canExtract(slot: Int, amount: Int, stack: ItemStack) = true
},
) : IItemHandler { ) : IItemHandler {
private var handler = LazyOptional.of<IItemHandler> { this } private var handler = LazyOptional.of<IItemHandler> { this }
@ -27,7 +35,7 @@ class MatteryContainerHandler @JvmOverloads internal constructor(
override fun getStackInSlot(slot: Int) = container[slot] override fun getStackInSlot(slot: Int) = container[slot]
override fun insertItem(slot: Int, stack: ItemStack, simulate: Boolean): ItemStack { override fun insertItem(slot: Int, stack: ItemStack, simulate: Boolean): ItemStack {
if (!insert_validator(slot, stack)) if (!filter.canInsert(slot, stack))
return stack return stack
val localStack = container[slot] val localStack = container[slot]
@ -68,7 +76,7 @@ class MatteryContainerHandler @JvmOverloads internal constructor(
val localStack = container.getItem(slot) val localStack = container.getItem(slot)
if (localStack.isEmpty) return ItemStack.EMPTY if (localStack.isEmpty) return ItemStack.EMPTY
if (!extract_validator(slot, amount, localStack)) return ItemStack.EMPTY if (!filter.canExtract(slot, amount, localStack)) return ItemStack.EMPTY
val minimal = Math.min(amount, localStack.count) val minimal = Math.min(amount, localStack.count)
val copy = localStack.copy() val copy = localStack.copy()
@ -88,6 +96,6 @@ class MatteryContainerHandler @JvmOverloads internal constructor(
} }
override fun isItemValid(slot: Int, stack: ItemStack): Boolean { override fun isItemValid(slot: Int, stack: ItemStack): Boolean {
return insert_validator(slot, stack) return filter.canInsert(slot, stack)
} }
} }