Move IContainerSlot to regular container subpackage

This commit is contained in:
DBotThePony 2025-02-25 16:31:27 +07:00
parent 25e25b0f86
commit 4ab69d6d82
Signed by: DBot
GPG Key ID: DCC23B5715498507
6 changed files with 73 additions and 86 deletions

View File

@ -10,20 +10,16 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectFunction
import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap
import net.minecraft.world.Container import net.minecraft.world.Container
import net.minecraft.world.entity.player.Player import net.minecraft.world.entity.player.Player
import net.minecraft.world.inventory.Slot
import net.minecraft.world.item.Item import net.minecraft.world.item.Item
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import ru.dbotthepony.mc.otm.container.util.IContainerSlot
import ru.dbotthepony.mc.otm.container.util.containerSlot import ru.dbotthepony.mc.otm.container.util.containerSlot
import ru.dbotthepony.mc.otm.container.util.iterator import ru.dbotthepony.mc.otm.container.util.iterator
import ru.dbotthepony.mc.otm.container.util.slotIterator
import ru.dbotthepony.mc.otm.core.collect.concatIterators import ru.dbotthepony.mc.otm.core.collect.concatIterators
import ru.dbotthepony.mc.otm.core.collect.filter import ru.dbotthepony.mc.otm.core.collect.filter
import ru.dbotthepony.mc.otm.core.collect.flatMap import ru.dbotthepony.mc.otm.core.collect.flatMap
import ru.dbotthepony.mc.otm.core.collect.map import ru.dbotthepony.mc.otm.core.collect.map
import ru.dbotthepony.mc.otm.core.isNotEmpty import ru.dbotthepony.mc.otm.core.isNotEmpty
import ru.dbotthepony.mc.otm.core.stream import ru.dbotthepony.mc.otm.core.stream
import java.util.LinkedList
import java.util.stream.Stream import java.util.stream.Stream
class CombinedContainer(containers: Stream<Pair<Container, Iterable<Int>>>) : IMatteryContainer { class CombinedContainer(containers: Stream<Pair<Container, Iterable<Int>>>) : IMatteryContainer {
@ -33,18 +29,6 @@ class CombinedContainer(containers: Stream<Pair<Container, Iterable<Int>>>) : IM
private inner class Slot(override val slot: Int, val outer: IContainerSlot) : IContainerSlot by outer { private inner class Slot(override val slot: Int, val outer: IContainerSlot) : IContainerSlot by outer {
override val container: Container override val container: Container
get() = this@CombinedContainer get() = this@CombinedContainer
override fun setChanged() {
outer.setChanged()
}
override fun component1(): Int {
return super.component1()
}
override fun component2(): ItemStack {
return super.component2()
}
} }
private val slots: ImmutableList<Slot> private val slots: ImmutableList<Slot>

View File

@ -18,7 +18,6 @@ import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.enchantment.EnchantmentEffectComponents import net.minecraft.world.item.enchantment.EnchantmentEffectComponents
import net.minecraft.world.item.enchantment.EnchantmentHelper import net.minecraft.world.item.enchantment.EnchantmentHelper
import net.neoforged.neoforge.fluids.capability.IFluidHandler import net.neoforged.neoforge.fluids.capability.IFluidHandler
import ru.dbotthepony.mc.otm.container.util.IContainerSlot
import ru.dbotthepony.mc.otm.container.util.ItemStackHashStrategy import ru.dbotthepony.mc.otm.container.util.ItemStackHashStrategy
import ru.dbotthepony.mc.otm.container.util.containerSlot import ru.dbotthepony.mc.otm.container.util.containerSlot
import ru.dbotthepony.mc.otm.container.util.slotIterator import ru.dbotthepony.mc.otm.container.util.slotIterator

View File

@ -0,0 +1,68 @@
package ru.dbotthepony.mc.otm.container
import net.minecraft.world.Container
import net.minecraft.world.item.Item
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Items
import ru.dbotthepony.kommons.util.Delegate
import ru.dbotthepony.mc.otm.core.isNotEmpty
/**
* While this somewhat similar to [net.minecraft.world.inventory.Slot], this slot is not meant
* for Player interaction.
*/
interface IContainerSlot : Delegate<ItemStack> {
val slot: Int
val container: Container
operator fun component1() = slot
operator fun component2() = item
fun getMaxStackSize(item: ItemStack = this.item): Int {
return container.maxStackSize
}
val isForbiddenForAutomation: Boolean get() {
return getFilter() === Items.AIR
}
fun getFilter(): Item?
/**
* @return whenever the filter was set. Returns false only if container can't be filtered.
*/
fun setFilter(filter: Item? = null): Boolean
val hasFilter: Boolean
get() = getFilter() != null
fun remove() {
container[slot] = ItemStack.EMPTY
}
fun remove(count: Int): ItemStack {
return container.removeItem(slot, count)
}
override fun get(): ItemStack {
return container[slot]
}
override fun accept(t: ItemStack) {
container[slot] = t
}
fun setChanged() {
container.setChanged()
}
var item: ItemStack
get() = container[slot]
set(value) { container[slot] = value }
val isEmpty: Boolean
get() = container[slot].isEmpty
val isNotEmpty: Boolean
get() = container[slot].isNotEmpty
}

View File

@ -5,7 +5,6 @@ import net.minecraft.world.item.Item
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Items import net.minecraft.world.item.Items
import net.minecraft.world.item.crafting.RecipeInput import net.minecraft.world.item.crafting.RecipeInput
import ru.dbotthepony.mc.otm.container.util.IContainerSlot
import ru.dbotthepony.mc.otm.core.collect.filter import ru.dbotthepony.mc.otm.core.collect.filter
import ru.dbotthepony.mc.otm.core.collect.map import ru.dbotthepony.mc.otm.core.collect.map
import ru.dbotthepony.mc.otm.core.isNotEmpty import ru.dbotthepony.mc.otm.core.isNotEmpty

View File

@ -22,7 +22,6 @@ import net.minecraft.world.item.Items
import net.neoforged.neoforge.common.util.INBTSerializable import net.neoforged.neoforge.common.util.INBTSerializable
import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.LogManager
import ru.dbotthepony.kommons.util.Delegate import ru.dbotthepony.kommons.util.Delegate
import ru.dbotthepony.mc.otm.container.util.IContainerSlot
import ru.dbotthepony.mc.otm.core.addSorted import ru.dbotthepony.mc.otm.core.addSorted
import ru.dbotthepony.mc.otm.core.collect.any import ru.dbotthepony.mc.otm.core.collect.any
import ru.dbotthepony.mc.otm.core.collect.count import ru.dbotthepony.mc.otm.core.collect.count

View File

@ -3,76 +3,14 @@ package ru.dbotthepony.mc.otm.container.util
import net.minecraft.world.Container import net.minecraft.world.Container
import net.minecraft.world.item.Item import net.minecraft.world.item.Item
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Items import ru.dbotthepony.mc.otm.container.IContainerSlot
import ru.dbotthepony.kommons.util.Delegate
import ru.dbotthepony.mc.otm.container.IMatteryContainer import ru.dbotthepony.mc.otm.container.IMatteryContainer
import ru.dbotthepony.mc.otm.container.get import ru.dbotthepony.mc.otm.container.get
import ru.dbotthepony.mc.otm.container.set
import ru.dbotthepony.mc.otm.core.collect.filter import ru.dbotthepony.mc.otm.core.collect.filter
import ru.dbotthepony.mc.otm.core.collect.map import ru.dbotthepony.mc.otm.core.collect.map
import ru.dbotthepony.mc.otm.core.isNotEmpty import ru.dbotthepony.mc.otm.core.isNotEmpty
/** class SimpleContainerSlot(override val slot: Int, override val container: Container) : IContainerSlot {
* While this somewhat similar to [net.minecraft.world.inventory.Slot], this slot is not meant
* for Player interaction.
*/
interface IContainerSlot : Delegate<ItemStack> {
val slot: Int
val container: Container
operator fun component1() = slot
operator fun component2() = item
fun getMaxStackSize(item: ItemStack = this.item): Int {
return container.maxStackSize
}
val isForbiddenForAutomation: Boolean get() {
return getFilter() === Items.AIR
}
fun getFilter(): Item?
/**
* @return whenever the filter was set. Returns false only if container can't be filtered.
*/
fun setFilter(filter: Item? = null): Boolean
val hasFilter: Boolean
get() = getFilter() != null
fun remove() {
container[slot] = ItemStack.EMPTY
}
fun remove(count: Int): ItemStack {
return container.removeItem(slot, count)
}
override fun get(): ItemStack {
return container[slot]
}
override fun accept(t: ItemStack) {
container[slot] = t
}
fun setChanged() {
container.setChanged()
}
var item: ItemStack
get() = container[slot]
set(value) { container[slot] = value }
val isEmpty: Boolean
get() = container[slot].isEmpty
val isNotEmpty: Boolean
get() = container[slot].isNotEmpty
}
class ContainerSlot(override val slot: Int, override val container: Container) : IContainerSlot {
init { init {
require(slot in 0 until container.containerSize) { "Slot out of bounds: $slot (container: $container with size ${container.containerSize})" } require(slot in 0 until container.containerSize) { "Slot out of bounds: $slot (container: $container with size ${container.containerSize})" }
} }
@ -90,7 +28,7 @@ fun Container.containerSlot(slot: Int): IContainerSlot {
if (this is IMatteryContainer) { if (this is IMatteryContainer) {
return containerSlot(slot) return containerSlot(slot)
} else { } else {
return ContainerSlot(slot, this) return SimpleContainerSlot(slot, this)
} }
} }
@ -110,8 +48,8 @@ fun Container.slotIterator(nonEmpty: Boolean = true): Iterator<IContainerSlot> {
if (this is IMatteryContainer) { if (this is IMatteryContainer) {
return slotIterator(nonEmpty) return slotIterator(nonEmpty)
} else if (nonEmpty) { } else if (nonEmpty) {
return (0 until containerSize).iterator().filter { this[it].isNotEmpty }.map { ContainerSlot(it, this) } return (0 until containerSize).iterator().filter { this[it].isNotEmpty }.map { SimpleContainerSlot(it, this) }
} else { } else {
return (0 until containerSize).iterator().map { ContainerSlot(it, this) } return (0 until containerSize).iterator().map { SimpleContainerSlot(it, this) }
} }
} }