diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/item/CombinedItemHandler.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/item/CombinedItemHandler.kt index cd21d7221..1cd762f2e 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/item/CombinedItemHandler.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/item/CombinedItemHandler.kt @@ -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) : IItemHand constructor(handlers: Collection) : 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() diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/CombinedContainer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/CombinedContainer.kt index 5f495f997..199414482 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/CombinedContainer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/CombinedContainer.kt @@ -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, Iterable>>) : ISlottedContainer, IMatteryContainer { +class CombinedContainer(containers: Stream, Iterable>>) : ISlottedContainer { constructor(vararg containers: IEnhancedContainer<*>) : this(containers.stream().map { it to (0 until it.containerSize) }) constructor(containers: Collection>) : this(containers.stream().map { it to (0 until it.containerSize) }) @@ -116,28 +116,12 @@ class CombinedContainer(containers: Stream, Iterable< ) } - override fun slotIterator(): Iterator { - return slots.iterator().map { - if (it is IFilteredContainerSlot) it else IFilteredContainerSlot.Dummy(it) - } + override fun slotIterator(): Iterator { + 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.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) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/ContainerHandler.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/ContainerHandler.kt deleted file mode 100644 index f3c21eb2d..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/ContainerHandler.kt +++ /dev/null @@ -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) - } -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/IMatteryContainer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/IMatteryContainer.kt deleted file mode 100644 index 7d383f010..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/IMatteryContainer.kt +++ /dev/null @@ -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 { - 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 { - return iterator(true) - } - - /** - * Iterates non-empty slots of this container - */ - override fun slotIterator(): Iterator { - return slotIterator(true) - } - - fun iterator(nonEmpty: Boolean): Iterator { - 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 { - 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 - } -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/util/Iterators.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/util/Iterators.kt index 39101d4cd..c5af49249 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/util/Iterators.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/util/Iterators.kt @@ -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 diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/Slots.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/Slots.kt index a41dad0c2..b881d0172 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/Slots.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/Slots.kt @@ -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 diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/player/MatteryPlayer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/player/MatteryPlayer.kt index c8d12575e..5dbc065d0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/player/MatteryPlayer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/player/MatteryPlayer.kt @@ -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