PhysicalConnectivity/src/main/kotlin/net/shadowfacts/phycon/network/block/terminal/TerminalBufferInventory.kt

60 lines
1.4 KiB
Kotlin
Raw Normal View History

package net.shadowfacts.phycon.network.block.terminal
import alexiil.mc.lib.attributes.item.ItemStackUtil
2021-02-10 23:55:49 +00:00
import net.minecraft.inventory.SimpleInventory
import net.minecraft.item.ItemStack
import kotlin.math.min
/**
* @author shadowfacts
*/
2021-02-10 23:55:49 +00:00
class TerminalBufferInventory(size: Int): SimpleInventory(size) {
enum class Mode {
TO_NETWORK, FROM_NETWORK, UNASSIGNED
}
private val modes = Array(size) { Mode.UNASSIGNED }
fun insertFromNetwork(stack: ItemStack): ItemStack {
var remaining = stack.copy()
2021-02-10 23:55:49 +00:00
for (slot in 0 until size()) {
if (modes[slot] == Mode.TO_NETWORK) continue
remaining = insertFromNetwork(stack, slot)
if (remaining.isEmpty) {
break
}
}
return remaining
}
private fun insertFromNetwork(stack: ItemStack, slot: Int): ItemStack {
val mode = modes[slot]
if (mode == Mode.TO_NETWORK) return stack
2021-02-10 23:55:49 +00:00
val current = getStack(slot)
if (current.isEmpty) {
2021-02-10 23:55:49 +00:00
setStack(slot, stack)
modes[slot] = Mode.FROM_NETWORK
return ItemStack.EMPTY
} else if (ItemStackUtil.areEqualIgnoreAmounts(stack, current)) {
val toTransfer = min(current.maxCount - current.count, stack.count)
current.count += toTransfer
stack.count -= toTransfer
modes[slot] = Mode.FROM_NETWORK
return stack
} else {
return stack
}
}
2021-02-10 23:55:49 +00:00
override fun setStack(slot: Int, stack: ItemStack) {
if (stack.isEmpty) {
modes[slot] = Mode.UNASSIGNED
}
2021-02-10 23:55:49 +00:00
super.setStack(slot, stack)
}
}