Convert redstone emitter to fabric transfer API

This commit is contained in:
Shadowfacts 2024-07-14 15:06:37 -07:00
parent 0ba1033518
commit 03fd8ff699
1 changed files with 10 additions and 10 deletions

View File

@ -1,6 +1,7 @@
package net.shadowfacts.phycon.block.redstone_emitter package net.shadowfacts.phycon.block.redstone_emitter
import alexiil.mc.lib.attributes.item.GroupedItemInvView import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant
import net.fabricmc.fabric.api.transfer.v1.storage.Storage
import net.minecraft.block.BlockState import net.minecraft.block.BlockState
import net.minecraft.item.ItemStack import net.minecraft.item.ItemStack
import net.minecraft.nbt.NbtCompound import net.minecraft.nbt.NbtCompound
@ -12,11 +13,10 @@ import net.shadowfacts.phycon.block.DeviceBlockEntity
import net.shadowfacts.phycon.block.FaceDeviceBlock import net.shadowfacts.phycon.block.FaceDeviceBlock
import net.shadowfacts.phycon.init.PhyBlockEntities import net.shadowfacts.phycon.init.PhyBlockEntities
import net.shadowfacts.phycon.packet.DeviceRemovedPacket import net.shadowfacts.phycon.packet.DeviceRemovedPacket
import net.shadowfacts.phycon.packet.ReadGroupedInventoryPacket import net.shadowfacts.phycon.packet.ReadItemStoragePacket
import net.shadowfacts.phycon.packet.RequestInventoryPacket import net.shadowfacts.phycon.packet.RequestInventoryPacket
import net.shadowfacts.phycon.util.ClientConfigurableDevice import net.shadowfacts.phycon.util.ClientConfigurableDevice
import net.shadowfacts.phycon.util.GhostInv import net.shadowfacts.phycon.util.GhostInv
import kotlin.math.round
/** /**
* @author shadowfacts * @author shadowfacts
@ -26,7 +26,7 @@ class RedstoneEmitterBlockEntity(pos: BlockPos, state: BlockState) :
ClientConfigurableDevice, ClientConfigurableDevice,
GhostInv { GhostInv {
private val inventoryCache = mutableMapOf<IPAddress, GroupedItemInvView>() private val inventoryCache = mutableMapOf<IPAddress, Storage<ItemVariant>>()
var cachedEmittedPower: Int = 0 var cachedEmittedPower: Int = 0
private set private set
@ -45,12 +45,12 @@ class RedstoneEmitterBlockEntity(pos: BlockPos, state: BlockState) :
override fun handle(packet: Packet) { override fun handle(packet: Packet) {
when (packet) { when (packet) {
is ReadGroupedInventoryPacket -> handleReadInventory(packet) is ReadItemStoragePacket -> handleReadItemStorage(packet)
is DeviceRemovedPacket -> handleDeviceRemoved(packet) is DeviceRemovedPacket -> handleDeviceRemoved(packet)
} }
} }
private fun handleReadInventory(packet: ReadGroupedInventoryPacket) { private fun handleReadItemStorage(packet: ReadItemStoragePacket) {
inventoryCache[packet.source] = packet.inventory inventoryCache[packet.source] = packet.inventory
recalculateRedstone() recalculateRedstone()
} }
@ -66,9 +66,8 @@ class RedstoneEmitterBlockEntity(pos: BlockPos, state: BlockState) :
if (!world!!.isClient && counter % 20 == 0L) { if (!world!!.isClient && counter % 20 == 0L) {
if (counter % 80 == 0L) { if (counter % 80 == 0L) {
updateInventories() updateInventories()
} else if (counter % 20 == 0L) {
recalculateRedstone()
} }
recalculateRedstone()
} }
} }
@ -84,15 +83,16 @@ class RedstoneEmitterBlockEntity(pos: BlockPos, state: BlockState) :
updateWorld() updateWorld()
return return
} }
val variant = ItemVariant.of(stackToMonitor)
val networkAmount = inventoryCache.values.fold(0) { acc, inv -> val networkAmount = inventoryCache.values.fold(0) { acc, inv ->
acc + inv.getAmount(stackToMonitor) acc + inv.simulateExtract(variant, Long.MAX_VALUE, null).toInt()
} }
cachedEmittedPower = cachedEmittedPower =
when (mode) { when (mode) {
Mode.ANALOG -> if (networkAmount == 0) { Mode.ANALOG -> if (networkAmount == 0) {
0 0
} else { } else {
1 + round(networkAmount / maxAmount.toDouble() * 14).toInt() 1 + (networkAmount / maxAmount.toDouble() * 14).toInt()
} }
Mode.DIGITAL -> if (networkAmount >= maxAmount) 15 else 0 Mode.DIGITAL -> if (networkAmount >= maxAmount) 15 else 0