Remove IMatteryContainer
This commit is contained in:
parent
bdeb740df0
commit
59eab74b44
@ -3,7 +3,6 @@ package ru.dbotthepony.mc.otm.capability.item
|
||||
import com.google.common.collect.ImmutableList
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.neoforged.neoforge.items.IItemHandler
|
||||
import ru.dbotthepony.mc.otm.container.ContainerHandler
|
||||
import ru.dbotthepony.mc.otm.container.slotted.SlottedContainer
|
||||
import java.util.stream.Stream
|
||||
|
||||
@ -12,7 +11,7 @@ class CombinedItemHandler(val handlers: ImmutableList<IItemHandler>) : IItemHand
|
||||
constructor(handlers: Collection<IItemHandler>) : this(ImmutableList.copyOf(handlers))
|
||||
constructor(vararg handlers: IItemHandler) : this(ImmutableList.copyOf(handlers))
|
||||
|
||||
private val needsChecking = handlers.any { it !is ContainerHandler && it !is SlottedContainer }
|
||||
private val needsChecking = handlers.any { it !is SlottedContainer }
|
||||
private val lastSizes = IntArray(this.handlers.size)
|
||||
private var totalSize = 0
|
||||
private val mappings = ArrayList<Mapping>()
|
||||
|
@ -23,7 +23,7 @@ import ru.dbotthepony.mc.otm.core.isNotEmpty
|
||||
import ru.dbotthepony.mc.otm.core.stream
|
||||
import java.util.stream.Stream
|
||||
|
||||
class CombinedContainer(containers: Stream<Pair<IEnhancedContainer<*>, Iterable<Int>>>) : ISlottedContainer<IFilteredContainerSlot>, IMatteryContainer {
|
||||
class CombinedContainer(containers: Stream<Pair<IEnhancedContainer<*>, Iterable<Int>>>) : ISlottedContainer<IContainerSlot> {
|
||||
constructor(vararg containers: IEnhancedContainer<*>) : this(containers.stream().map { it to (0 until it.containerSize) })
|
||||
constructor(containers: Collection<IEnhancedContainer<*>>) : this(containers.stream().map { it to (0 until it.containerSize) })
|
||||
|
||||
@ -116,28 +116,12 @@ class CombinedContainer(containers: Stream<Pair<IEnhancedContainer<*>, Iterable<
|
||||
)
|
||||
}
|
||||
|
||||
override fun slotIterator(): Iterator<IFilteredContainerSlot> {
|
||||
return slots.iterator().map {
|
||||
if (it is IFilteredContainerSlot) it else IFilteredContainerSlot.Dummy(it)
|
||||
}
|
||||
override fun slotIterator(): Iterator<IContainerSlot> {
|
||||
return slots.iterator()
|
||||
}
|
||||
|
||||
override fun containerSlot(slot: Int): IFilteredContainerSlot {
|
||||
val getSlot = slots[slot]
|
||||
if (getSlot is IFilteredContainerSlot) return getSlot
|
||||
return IFilteredContainerSlot.Dummy(getSlot)
|
||||
}
|
||||
|
||||
override fun getMaxStackSize(slot: Int, itemStack: ItemStack): Int {
|
||||
return super<ISlottedContainer>.getMaxStackSize(slot, itemStack)
|
||||
}
|
||||
|
||||
override fun getSlotFilter(slot: Int): Item? {
|
||||
return containerSlot(slot).filter
|
||||
}
|
||||
|
||||
override fun clearSlotFilters() {
|
||||
|
||||
override fun containerSlot(slot: Int): IContainerSlot {
|
||||
return slots[slot]
|
||||
}
|
||||
|
||||
override fun setChanged(slot: Int) {
|
||||
|
@ -1,89 +0,0 @@
|
||||
package ru.dbotthepony.mc.otm.container
|
||||
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.neoforged.neoforge.items.IItemHandler
|
||||
|
||||
class ContainerHandler(
|
||||
private val container: IMatteryContainer,
|
||||
private val filter: HandlerFilter = HandlerFilter.Both,
|
||||
) : IItemHandler {
|
||||
override fun getSlots() = container.containerSize
|
||||
override fun getStackInSlot(slot: Int) = container[slot]
|
||||
|
||||
override fun insertItem(slot: Int, stack: ItemStack, simulate: Boolean): ItemStack {
|
||||
if (!container.testSlotFilter(slot, stack) || !filter.canInsert(slot, stack))
|
||||
return stack
|
||||
|
||||
filter.preInsert(slot, stack, simulate)
|
||||
|
||||
val localStack = container[slot]
|
||||
var amount = filter.modifyInsertCount(slot, stack, localStack, simulate)
|
||||
|
||||
if (amount <= 0)
|
||||
return stack
|
||||
|
||||
if (localStack.isEmpty) {
|
||||
amount = stack.count.coerceAtMost(container.getMaxStackSize(slot, stack)).coerceAtMost(amount)
|
||||
|
||||
if (!simulate) {
|
||||
container.setItem(slot, stack.copyWithCount(amount))
|
||||
}
|
||||
|
||||
if (stack.count <= amount) {
|
||||
return ItemStack.EMPTY
|
||||
} else {
|
||||
return stack.copyWithCount(stack.count - amount)
|
||||
}
|
||||
} else if (localStack.isStackable && container.getMaxStackSize(slot, localStack) > localStack.count && ItemStack.isSameItemSameComponents(localStack, stack)) {
|
||||
val newCount = container.getMaxStackSize(slot, localStack).coerceAtMost(localStack.count + stack.count.coerceAtMost(amount))
|
||||
val diff = newCount - localStack.count
|
||||
|
||||
if (diff != 0) {
|
||||
if (!simulate) {
|
||||
localStack.grow(diff)
|
||||
container.setChanged(slot)
|
||||
}
|
||||
|
||||
val copy = stack.copy()
|
||||
copy.shrink(diff)
|
||||
return copy
|
||||
}
|
||||
}
|
||||
|
||||
return stack
|
||||
}
|
||||
|
||||
override fun extractItem(slot: Int, amount: Int, simulate: Boolean): ItemStack {
|
||||
if (amount <= 0 || container.isSlotForbiddenForAutomation(slot))
|
||||
return ItemStack.EMPTY
|
||||
|
||||
val localStack = container.getItem(slot)
|
||||
if (localStack.isEmpty) return ItemStack.EMPTY
|
||||
|
||||
@Suppress("name_shadowing")
|
||||
val amount = filter.modifyExtractCount(slot, amount, simulate)
|
||||
if (amount <= 0) return ItemStack.EMPTY
|
||||
if (!filter.canExtract(slot, amount, localStack)) return ItemStack.EMPTY
|
||||
|
||||
filter.preExtract(slot, amount, simulate)
|
||||
|
||||
val minimal = amount.coerceAtMost(localStack.count)
|
||||
val copy = localStack.copy()
|
||||
copy.count = minimal
|
||||
|
||||
if (!simulate) {
|
||||
localStack.shrink(minimal)
|
||||
container.setChanged(slot)
|
||||
}
|
||||
|
||||
return copy
|
||||
}
|
||||
|
||||
override fun getSlotLimit(slot: Int): Int {
|
||||
return container.maxStackSize
|
||||
}
|
||||
|
||||
override fun isItemValid(slot: Int, stack: ItemStack): Boolean {
|
||||
return container.testSlotFilter(slot, stack) && filter.canInsert(slot, stack)
|
||||
}
|
||||
}
|
@ -1,203 +0,0 @@
|
||||
package ru.dbotthepony.mc.otm.container
|
||||
|
||||
import it.unimi.dsi.fastutil.ints.IntIterable
|
||||
import net.minecraft.world.item.Item
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.Items
|
||||
import net.minecraft.world.item.crafting.RecipeInput
|
||||
import ru.dbotthepony.mc.otm.core.collect.filter
|
||||
import ru.dbotthepony.mc.otm.core.collect.map
|
||||
import ru.dbotthepony.mc.otm.core.isNotEmpty
|
||||
|
||||
interface IMatteryContainer : IEnhancedContainer<IFilteredContainerSlot> {
|
||||
fun getSlotFilter(slot: Int): Item?
|
||||
|
||||
/**
|
||||
* @return whenever the filter was set. Returns false only if container can't be filtered.
|
||||
*/
|
||||
fun setSlotFilter(slot: Int, filter: Item? = null): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
fun clearSlotFilters()
|
||||
|
||||
override fun isEmpty(): Boolean
|
||||
|
||||
override fun size(): Int {
|
||||
return containerSize
|
||||
}
|
||||
|
||||
/**
|
||||
* Iterates over non-empty itemstacks of this container
|
||||
*/
|
||||
override fun iterator(): Iterator<ItemStack> {
|
||||
return iterator(true)
|
||||
}
|
||||
|
||||
/**
|
||||
* Iterates non-empty slots of this container
|
||||
*/
|
||||
override fun slotIterator(): Iterator<IFilteredContainerSlot> {
|
||||
return slotIterator(true)
|
||||
}
|
||||
|
||||
fun iterator(nonEmpty: Boolean): Iterator<ItemStack> {
|
||||
if (nonEmpty) {
|
||||
return (0 until containerSize).iterator().map { this[it] }.filter { it.isNotEmpty }
|
||||
} else {
|
||||
return (0 until containerSize).iterator().map { this[it] }
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Iterates either non-empty slots of container or all slots of container
|
||||
*/
|
||||
fun slotIterator(nonEmpty: Boolean): Iterator<IFilteredContainerSlot> {
|
||||
if (nonEmpty) {
|
||||
return (0 until containerSize).iterator().filter { this[it].isNotEmpty }.map { containerSlot(it) }
|
||||
} else {
|
||||
return (0 until containerSize).iterator().map { containerSlot(it) }
|
||||
}
|
||||
}
|
||||
|
||||
override fun containerSlot(slot: Int): IFilteredContainerSlot
|
||||
|
||||
fun hasSlotFilter(slot: Int) = getSlotFilter(slot) !== null
|
||||
fun isSlotForbiddenForAutomation(slot: Int) = getSlotFilter(slot) === Items.AIR
|
||||
|
||||
fun testSlotFilter(slot: Int, itemStack: ItemStack): Boolean {
|
||||
return testSlotFilter(slot, itemStack.item)
|
||||
}
|
||||
|
||||
fun testSlotFilter(slot: Int, item: Item): Boolean {
|
||||
if (getSlotFilter(slot) == null) {
|
||||
return true
|
||||
} else {
|
||||
return getSlotFilter(slot) === item
|
||||
}
|
||||
}
|
||||
|
||||
override fun getMaxStackSize(slot: Int, itemStack: ItemStack) = maxStackSize.coerceAtMost(itemStack.maxStackSize)
|
||||
|
||||
private fun addItem(stack: ItemStack, simulate: Boolean, filterPass: Boolean, slots: IntIterable, onlyIntoExisting: Boolean, popTime: Int?, ignoreFilters: Boolean): ItemStack {
|
||||
if (stack.isEmpty)
|
||||
return stack
|
||||
|
||||
// двигаем в одинаковые слоты
|
||||
var i = slots.intIterator()
|
||||
|
||||
while (i.hasNext()) {
|
||||
val slot = i.nextInt()
|
||||
|
||||
if (
|
||||
(ignoreFilters || !isSlotForbiddenForAutomation(slot)) &&
|
||||
ItemStack.isSameItemSameComponents(getItem(slot), stack) &&
|
||||
(ignoreFilters || !filterPass && !hasSlotFilter(slot) || filterPass && hasSlotFilter(slot) && testSlotFilter(slot, stack))
|
||||
) {
|
||||
val slotStack = getItem(slot)
|
||||
val slotLimit = getMaxStackSize(slot, slotStack)
|
||||
|
||||
if (slotStack.count < slotLimit) {
|
||||
val newCount = (slotStack.count + stack.count).coerceAtMost(slotLimit)
|
||||
val diff = newCount - slotStack.count
|
||||
|
||||
if (!simulate) {
|
||||
slotStack.count = newCount
|
||||
setChanged(slot)
|
||||
|
||||
if (popTime != null) {
|
||||
slotStack.popTime = popTime
|
||||
}
|
||||
}
|
||||
|
||||
stack.shrink(diff)
|
||||
|
||||
if (stack.isEmpty) {
|
||||
return stack
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!onlyIntoExisting) {
|
||||
i = slots.intIterator()
|
||||
|
||||
// двигаем в пустые слоты
|
||||
while (i.hasNext()) {
|
||||
val slot = i.nextInt()
|
||||
|
||||
if (
|
||||
getItem(slot).isEmpty &&
|
||||
(ignoreFilters || !isSlotForbiddenForAutomation(slot)) &&
|
||||
(ignoreFilters || !filterPass && !hasSlotFilter(slot) || filterPass && hasSlotFilter(slot) && testSlotFilter(slot, stack))
|
||||
) {
|
||||
val diff = stack.count.coerceAtMost(getMaxStackSize(slot, stack))
|
||||
|
||||
if (!simulate) {
|
||||
val copyToPut = stack.copy()
|
||||
copyToPut.count = diff
|
||||
setItem(slot, copyToPut)
|
||||
|
||||
if (popTime != null) {
|
||||
copyToPut.popTime = popTime
|
||||
}
|
||||
}
|
||||
|
||||
stack.shrink(diff)
|
||||
|
||||
if (stack.isEmpty) {
|
||||
return stack
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return stack
|
||||
}
|
||||
|
||||
fun addItem(stack: ItemStack, simulate: Boolean, slots: IntIterable = slotRange, onlyIntoExisting: Boolean = false, popTime: Int? = null, ignoreFilters: Boolean = false): ItemStack {
|
||||
if (stack.isEmpty)
|
||||
return stack
|
||||
|
||||
if (ignoreFilters) {
|
||||
return addItem(stack.copy(), simulate, true, slots, onlyIntoExisting, popTime, true)
|
||||
} else {
|
||||
var copy = addItem(stack.copy(), simulate, true, slots, onlyIntoExisting, popTime, false)
|
||||
copy = addItem(copy, simulate, false, slots, onlyIntoExisting, popTime, false)
|
||||
return copy
|
||||
}
|
||||
}
|
||||
|
||||
fun handler(filter: HandlerFilter = HandlerFilter.Both): ContainerHandler {
|
||||
return ContainerHandler(this, filter)
|
||||
}
|
||||
|
||||
/**
|
||||
* Unlike [addItem], modifies original [stack]
|
||||
*
|
||||
* @return Whenever [stack] was modified
|
||||
*/
|
||||
fun consumeItem(stack: ItemStack, simulate: Boolean, slots: IntIterable = slotRange, onlyIntoExisting: Boolean = false, popTime: Int? = null, ignoreFilters: Boolean = false): Boolean {
|
||||
if (stack.isEmpty)
|
||||
return false
|
||||
|
||||
val result = addItem(stack, simulate, slots, onlyIntoExisting, popTime, ignoreFilters)
|
||||
|
||||
if (result.count != stack.count) {
|
||||
if (!simulate) {
|
||||
stack.count = result.count
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
fun fullyAddItem(stack: ItemStack, slots: IntIterable = slotRange, ignoreFilters: Boolean = false): Boolean {
|
||||
if (!addItem(stack, true, slots, ignoreFilters).isEmpty)
|
||||
return false
|
||||
|
||||
return addItem(stack, false, slots, ignoreFilters).isEmpty
|
||||
}
|
||||
}
|
@ -6,7 +6,6 @@ import net.minecraft.world.item.Item
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import ru.dbotthepony.mc.otm.container.IContainerSlot
|
||||
import ru.dbotthepony.mc.otm.container.IEnhancedContainer
|
||||
import ru.dbotthepony.mc.otm.container.IMatteryContainer
|
||||
import ru.dbotthepony.mc.otm.container.get
|
||||
import ru.dbotthepony.mc.otm.core.collect.filter
|
||||
import ru.dbotthepony.mc.otm.core.collect.map
|
||||
|
@ -21,7 +21,6 @@ import ru.dbotthepony.mc.otm.client.minecraft
|
||||
import ru.dbotthepony.mc.otm.container.EnhancedContainer
|
||||
import ru.dbotthepony.mc.otm.container.IEnhancedContainer
|
||||
import ru.dbotthepony.mc.otm.container.IFilteredContainerSlot
|
||||
import ru.dbotthepony.mc.otm.container.IMatteryContainer
|
||||
import ru.dbotthepony.mc.otm.container.ItemFilter
|
||||
import ru.dbotthepony.mc.otm.container.UpgradeContainer
|
||||
import ru.dbotthepony.mc.otm.container.util.containerSlotOrNull
|
||||
|
@ -85,7 +85,6 @@ import ru.dbotthepony.mc.otm.container.IContainer
|
||||
import ru.dbotthepony.mc.otm.container.IContainerSlot
|
||||
import ru.dbotthepony.mc.otm.container.IEnhancedContainer
|
||||
import ru.dbotthepony.mc.otm.container.IFilteredContainerSlot
|
||||
import ru.dbotthepony.mc.otm.container.IMatteryContainer
|
||||
import ru.dbotthepony.mc.otm.container.get
|
||||
import ru.dbotthepony.mc.otm.container.slotted.ContainerSlot
|
||||
import ru.dbotthepony.mc.otm.container.slotted.SlottedContainer
|
||||
|
Loading…
Reference in New Issue
Block a user