Convert redstone emitter to fabric transfer API
This commit is contained in:
parent
0ba1033518
commit
03fd8ff699
|
@ -1,6 +1,7 @@
|
|||
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.item.ItemStack
|
||||
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.init.PhyBlockEntities
|
||||
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.util.ClientConfigurableDevice
|
||||
import net.shadowfacts.phycon.util.GhostInv
|
||||
import kotlin.math.round
|
||||
|
||||
/**
|
||||
* @author shadowfacts
|
||||
|
@ -26,7 +26,7 @@ class RedstoneEmitterBlockEntity(pos: BlockPos, state: BlockState) :
|
|||
ClientConfigurableDevice,
|
||||
GhostInv {
|
||||
|
||||
private val inventoryCache = mutableMapOf<IPAddress, GroupedItemInvView>()
|
||||
private val inventoryCache = mutableMapOf<IPAddress, Storage<ItemVariant>>()
|
||||
var cachedEmittedPower: Int = 0
|
||||
private set
|
||||
|
||||
|
@ -45,12 +45,12 @@ class RedstoneEmitterBlockEntity(pos: BlockPos, state: BlockState) :
|
|||
|
||||
override fun handle(packet: Packet) {
|
||||
when (packet) {
|
||||
is ReadGroupedInventoryPacket -> handleReadInventory(packet)
|
||||
is ReadItemStoragePacket -> handleReadItemStorage(packet)
|
||||
is DeviceRemovedPacket -> handleDeviceRemoved(packet)
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleReadInventory(packet: ReadGroupedInventoryPacket) {
|
||||
private fun handleReadItemStorage(packet: ReadItemStoragePacket) {
|
||||
inventoryCache[packet.source] = packet.inventory
|
||||
recalculateRedstone()
|
||||
}
|
||||
|
@ -66,9 +66,8 @@ class RedstoneEmitterBlockEntity(pos: BlockPos, state: BlockState) :
|
|||
if (!world!!.isClient && counter % 20 == 0L) {
|
||||
if (counter % 80 == 0L) {
|
||||
updateInventories()
|
||||
} else if (counter % 20 == 0L) {
|
||||
recalculateRedstone()
|
||||
}
|
||||
recalculateRedstone()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -84,15 +83,16 @@ class RedstoneEmitterBlockEntity(pos: BlockPos, state: BlockState) :
|
|||
updateWorld()
|
||||
return
|
||||
}
|
||||
val variant = ItemVariant.of(stackToMonitor)
|
||||
val networkAmount = inventoryCache.values.fold(0) { acc, inv ->
|
||||
acc + inv.getAmount(stackToMonitor)
|
||||
acc + inv.simulateExtract(variant, Long.MAX_VALUE, null).toInt()
|
||||
}
|
||||
cachedEmittedPower =
|
||||
when (mode) {
|
||||
Mode.ANALOG -> if (networkAmount == 0) {
|
||||
0
|
||||
} else {
|
||||
1 + round(networkAmount / maxAmount.toDouble() * 14).toInt()
|
||||
1 + (networkAmount / maxAmount.toDouble() * 14).toInt()
|
||||
}
|
||||
|
||||
Mode.DIGITAL -> if (networkAmount >= maxAmount) 15 else 0
|
||||
|
|
Loading…
Reference in New Issue