Sync terminal cached item counts to client
This commit is contained in:
parent
64c18e9eae
commit
7bc859eaf6
|
@ -2,6 +2,7 @@ package net.shadowfacts.phycon.network.block.terminal
|
||||||
|
|
||||||
import alexiil.mc.lib.attributes.item.GroupedItemInv
|
import alexiil.mc.lib.attributes.item.GroupedItemInv
|
||||||
import alexiil.mc.lib.attributes.item.ItemStackCollections
|
import alexiil.mc.lib.attributes.item.ItemStackCollections
|
||||||
|
import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable
|
||||||
import net.fabricmc.fabric.api.container.ContainerProviderRegistry
|
import net.fabricmc.fabric.api.container.ContainerProviderRegistry
|
||||||
import net.minecraft.entity.player.PlayerEntity
|
import net.minecraft.entity.player.PlayerEntity
|
||||||
import net.minecraft.inventory.BasicInventory
|
import net.minecraft.inventory.BasicInventory
|
||||||
|
@ -9,6 +10,7 @@ import net.minecraft.inventory.Inventory
|
||||||
import net.minecraft.inventory.InventoryListener
|
import net.minecraft.inventory.InventoryListener
|
||||||
import net.minecraft.item.ItemStack
|
import net.minecraft.item.ItemStack
|
||||||
import net.minecraft.nbt.CompoundTag
|
import net.minecraft.nbt.CompoundTag
|
||||||
|
import net.minecraft.nbt.ListTag
|
||||||
import net.shadowfacts.phycon.api.packet.Packet
|
import net.shadowfacts.phycon.api.packet.Packet
|
||||||
import net.shadowfacts.phycon.api.util.MACAddress
|
import net.shadowfacts.phycon.api.util.MACAddress
|
||||||
import net.shadowfacts.phycon.init.PhyBlockEntities
|
import net.shadowfacts.phycon.init.PhyBlockEntities
|
||||||
|
@ -22,11 +24,14 @@ import net.shadowfacts.phycon.util.toTag
|
||||||
/**
|
/**
|
||||||
* @author shadowfacts
|
* @author shadowfacts
|
||||||
*/
|
*/
|
||||||
class TerminalBlockEntity: DeviceBlockEntity(PhyBlockEntities.TERMINAL), InventoryListener {
|
class TerminalBlockEntity: DeviceBlockEntity(PhyBlockEntities.TERMINAL), InventoryListener, BlockEntityClientSerializable {
|
||||||
|
|
||||||
private val inventoryCache = mutableMapOf<MACAddress, GroupedItemInv>()
|
private val inventoryCache = mutableMapOf<MACAddress, GroupedItemInv>()
|
||||||
|
val cachedNetItems = ItemStackCollections.intMap()
|
||||||
val internalBuffer = BasicInventory(18)
|
val internalBuffer = BasicInventory(18)
|
||||||
|
|
||||||
|
var counter = 0
|
||||||
|
|
||||||
init {
|
init {
|
||||||
internalBuffer.addListener(this)
|
internalBuffer.addListener(this)
|
||||||
}
|
}
|
||||||
|
@ -40,23 +45,32 @@ class TerminalBlockEntity: DeviceBlockEntity(PhyBlockEntities.TERMINAL), Invento
|
||||||
|
|
||||||
private fun handleReadInventory(packet: ReadInventoryPacket) {
|
private fun handleReadInventory(packet: ReadInventoryPacket) {
|
||||||
inventoryCache[packet.source] = packet.inventory
|
inventoryCache[packet.source] = packet.inventory
|
||||||
|
|
||||||
println("new items: ${computeNetItems()}")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleDeviceRemoved(packet: DeviceRemovedPacket) {
|
private fun handleDeviceRemoved(packet: DeviceRemovedPacket) {
|
||||||
inventoryCache.remove(packet.source)
|
inventoryCache.remove(packet.source)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun computeNetItems(): Map<ItemStack, Int> {
|
private fun updateNetItems() {
|
||||||
val net = ItemStackCollections.intMap()
|
cachedNetItems.clear()
|
||||||
for (inventory in inventoryCache.values) {
|
for (inventory in inventoryCache.values) {
|
||||||
for (stack in inventory.storedStacks) {
|
for (stack in inventory.storedStacks) {
|
||||||
val amount = inventory.getAmount(stack)
|
val amount = inventory.getAmount(stack)
|
||||||
net.mergeInt(stack, amount) { a, b -> a + b }
|
cachedNetItems.mergeInt(stack, amount) { a, b -> a + b }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return net
|
}
|
||||||
|
|
||||||
|
override fun tick() {
|
||||||
|
super.tick()
|
||||||
|
if (!world!!.isClient && (++counter % 20) == 0) {
|
||||||
|
updateNetItems()
|
||||||
|
sync()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (world!!.isClient && (++counter % 20) == 0) {
|
||||||
|
println(cachedNetItems)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onActivate(player: PlayerEntity) {
|
fun onActivate(player: PlayerEntity) {
|
||||||
|
@ -85,4 +99,25 @@ class TerminalBlockEntity: DeviceBlockEntity(PhyBlockEntities.TERMINAL), Invento
|
||||||
internalBuffer.fromTag(tag.getList("InternalBuffer", 10))
|
internalBuffer.fromTag(tag.getList("InternalBuffer", 10))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun toClientTag(tag: CompoundTag): CompoundTag {
|
||||||
|
val list = ListTag()
|
||||||
|
tag.put("CachedNetItems", list)
|
||||||
|
for ((stack, amount) in cachedNetItems) {
|
||||||
|
val entryTag = stack.toTag(CompoundTag())
|
||||||
|
entryTag.putInt("NetAmount", amount)
|
||||||
|
list.add(entryTag)
|
||||||
|
}
|
||||||
|
return tag
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun fromClientTag(tag: CompoundTag) {
|
||||||
|
val list = tag.getList("CachedNetItems", 10)
|
||||||
|
cachedNetItems.clear()
|
||||||
|
for (entryTag in list) {
|
||||||
|
val stack = ItemStack.fromTag(entryTag as CompoundTag)
|
||||||
|
val netAmount = entryTag.getInt("NetAmount")
|
||||||
|
cachedNetItems[stack] = netAmount
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue