58 lines
1.6 KiB
Kotlin
58 lines
1.6 KiB
Kotlin
package net.shadowfacts.phycon.network.block.terminal
|
|
|
|
import alexiil.mc.lib.attributes.item.ItemStackCollections
|
|
import it.unimi.dsi.fastutil.objects.Object2IntMap
|
|
import net.minecraft.item.ItemStack
|
|
import net.shadowfacts.phycon.api.packet.Packet
|
|
import net.shadowfacts.phycon.api.util.MACAddress
|
|
import net.shadowfacts.phycon.init.PhyBlockEntities
|
|
import net.shadowfacts.phycon.network.DeviceBlockEntity
|
|
import net.shadowfacts.phycon.network.block.netinterface.InterfaceBlockEntity
|
|
import net.shadowfacts.phycon.network.packet.DeviceRemovedPacket
|
|
import net.shadowfacts.phycon.network.packet.ReadAllPacket
|
|
import net.shadowfacts.phycon.network.packet.RequestReadAllPacket
|
|
import java.util.*
|
|
|
|
/**
|
|
* @author shadowfacts
|
|
*/
|
|
class TerminalBlockEntity: DeviceBlockEntity(PhyBlockEntities.TERMINAL) {
|
|
|
|
private val inventoryCache = mutableMapOf<MACAddress, Map<ItemStack, Int>>()
|
|
|
|
override fun handlePacket(packet: Packet) {
|
|
when (packet) {
|
|
is ReadAllPacket -> handleReadAll(packet)
|
|
is DeviceRemovedPacket -> handleDeviceRemoved(packet)
|
|
}
|
|
}
|
|
|
|
private fun handleReadAll(packet: ReadAllPacket) {
|
|
inventoryCache[packet.source] = packet.items
|
|
|
|
println("new items: ${computeNetItems()}")
|
|
}
|
|
|
|
private fun handleDeviceRemoved(packet: DeviceRemovedPacket) {
|
|
inventoryCache.remove(packet.source)
|
|
}
|
|
|
|
fun computeNetItems(): Map<ItemStack, Int> {
|
|
val net = ItemStackCollections.intMap()
|
|
for (map in inventoryCache.values) {
|
|
for ((stack, amount) in map) {
|
|
net.mergeInt(stack, amount) { a, b -> a + b }
|
|
}
|
|
}
|
|
return net
|
|
}
|
|
|
|
fun onActivate() {
|
|
if (!world!!.isClient) {
|
|
inventoryCache.clear()
|
|
enqueueToSingle(RequestReadAllPacket(macAddress))
|
|
}
|
|
}
|
|
|
|
}
|