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
|
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
|
||||||
|
|
Loading…
Reference in New Issue