diff --git a/src/main/kotlin/net/shadowfacts/phycon/block/terminal/AbstractTerminalBlockEntity.kt b/src/main/kotlin/net/shadowfacts/phycon/block/terminal/AbstractTerminalBlockEntity.kt index 57fcbf7..6a1cfcb 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/block/terminal/AbstractTerminalBlockEntity.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/block/terminal/AbstractTerminalBlockEntity.kt @@ -38,7 +38,8 @@ abstract class AbstractTerminalBlockEntity(type: BlockEntityType<*>, pos: BlockP // the locate/insertion timeouts are only 1 tick because that's long enough to hear from every device on the network // in a degraded state (when there's latency in the network), not handling interface priorities correctly is acceptable val LOCATE_REQUEST_TIMEOUT: Long = 1 // ticks - val INSERTION_TIMEOUT: Long = 1 + val INSERTION_TIMEOUT: Long = 1 // ticks + val REQUEST_INVENTORY_TIMEOUT: Long = 1 // ticks } protected val inventoryCache = mutableMapOf() @@ -48,8 +49,8 @@ abstract class AbstractTerminalBlockEntity(type: BlockEntityType<*>, pos: BlockP override val pendingInsertions = mutableListOf() override val dispatchStackTimeout = INSERTION_TIMEOUT - private var observers = 0 val cachedNetItems = ItemStackCollections.intMap() + private var requestInventoryTimestamp: Long? = null // todo: multiple players could have the terminal open simultaneously var netItemObserver: WeakReference? = null @@ -164,14 +165,26 @@ abstract class AbstractTerminalBlockEntity(type: BlockEntityType<*>, pos: BlockP if (!world!!.isClient) { finishPendingRequests() finishTimedOutPendingInsertions() - } - if (counter % 20 == 0L && !world!!.isClient) { - beginInsertions() + if (counter % 20 == 0L) { + beginInsertions() + } + + if (requestInventoryTimestamp != null && (counter - requestInventoryTimestamp!!) >= REQUEST_INVENTORY_TIMEOUT) { + updateAndSync() + requestInventoryTimestamp = null + } } } open fun onActivate(player: PlayerEntity) { + if (!world!!.isClient) { + updateAndSync() + + inventoryCache.clear() + sendPacket(RequestInventoryPacket(RequestInventoryPacket.Kind.GROUPED, ipAddress)) + requestInventoryTimestamp = counter + } } fun requestItem(stack: ItemStack, amount: Int = stack.count) { diff --git a/src/main/kotlin/net/shadowfacts/phycon/block/terminal/CraftingTerminalBlockEntity.kt b/src/main/kotlin/net/shadowfacts/phycon/block/terminal/CraftingTerminalBlockEntity.kt index 5852a34..058861e 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/block/terminal/CraftingTerminalBlockEntity.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/block/terminal/CraftingTerminalBlockEntity.kt @@ -33,11 +33,9 @@ class CraftingTerminalBlockEntity(pos: BlockPos, state: BlockState): AbstractTer private val completedCraftingStackRequests = LinkedList() override fun onActivate(player: PlayerEntity) { - if (!world!!.isClient) { - updateAndSync() + super.onActivate(player) - inventoryCache.clear() - sendPacket(RequestInventoryPacket(RequestInventoryPacket.Kind.GROUPED, ipAddress)) + if (!world!!.isClient) { val factory = object: ExtendedScreenHandlerFactory { override fun createMenu(syncId: Int, playerInv: PlayerInventory, player: PlayerEntity): ScreenHandler? { return CraftingTerminalScreenHandler(syncId, playerInv, this@CraftingTerminalBlockEntity) diff --git a/src/main/kotlin/net/shadowfacts/phycon/block/terminal/TerminalBlockEntity.kt b/src/main/kotlin/net/shadowfacts/phycon/block/terminal/TerminalBlockEntity.kt index a9a3285..0f31038 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/block/terminal/TerminalBlockEntity.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/block/terminal/TerminalBlockEntity.kt @@ -18,11 +18,9 @@ import net.shadowfacts.phycon.packet.RequestInventoryPacket class TerminalBlockEntity(pos: BlockPos, state: BlockState): AbstractTerminalBlockEntity(PhyBlockEntities.TERMINAL, pos, state) { override fun onActivate(player: PlayerEntity) { - if (!world!!.isClient) { - updateAndSync() + super.onActivate(player) - inventoryCache.clear() - sendPacket(RequestInventoryPacket(RequestInventoryPacket.Kind.GROUPED, ipAddress)) + if (!world!!.isClient) { val factory = object: ExtendedScreenHandlerFactory { override fun createMenu(syncId: Int, playerInv: PlayerInventory, player: PlayerEntity): ScreenHandler { return TerminalScreenHandler(syncId, playerInv, this@TerminalBlockEntity)