diff --git a/nova/src/main/kotlin/xyz/xenondevs/nova/tileentity/network/type/energy/EnergyNetwork.kt b/nova/src/main/kotlin/xyz/xenondevs/nova/tileentity/network/type/energy/EnergyNetwork.kt index ff25274565..6e18e498d7 100644 --- a/nova/src/main/kotlin/xyz/xenondevs/nova/tileentity/network/type/energy/EnergyNetwork.kt +++ b/nova/src/main/kotlin/xyz/xenondevs/nova/tileentity/network/type/energy/EnergyNetwork.kt @@ -20,6 +20,7 @@ class EnergyNetwork(networkData: NetworkData) : Network() private val consumers = HashSet() private val buffers = HashSet() + private val complexity: Int private val transferRate: Long private val availableProviderEnergy: Long @@ -31,6 +32,7 @@ class EnergyNetwork(networkData: NetworkData) : Network) : Network providers += energyHolder else -> throw IllegalArgumentException("Invalid connection config for $energyHolder") } + + complexity++ } else if (node is EnergyBridge) { transferRate = min(transferRate, node.energyTransferRate) } } this.transferRate = transferRate + this.complexity = complexity } /** * Called every tick to transfer energy. */ fun tick() { + if (MAX_COMPLEXITY != -1 && complexity > MAX_COMPLEXITY) + return + val providerEnergy = min(transferRate, availableProviderEnergy) val bufferEnergy = min(transferRate - providerEnergy, availableBufferEnergy) val requestedEnergy = min(transferRate, requestedConsumerEnergy) @@ -154,6 +162,7 @@ class EnergyNetwork(networkData: NetworkData) : Network("default_transfer_rate"), TICK_DELAY_PROVIDER) .map { (defaultTransferRate, tickDelay) -> (defaultTransferRate * tickDelay).roundToLong() } .map { defaultTransferRate -> if (defaultTransferRate < 0) Long.MAX_VALUE else defaultTransferRate } + val MAX_COMPLEXITY: Int by ENERGY_NETWORK.entry("max_complexity") } diff --git a/nova/src/main/kotlin/xyz/xenondevs/nova/tileentity/network/type/fluid/FluidNetwork.kt b/nova/src/main/kotlin/xyz/xenondevs/nova/tileentity/network/type/fluid/FluidNetwork.kt index 9da1b941e5..2de19fd6f5 100644 --- a/nova/src/main/kotlin/xyz/xenondevs/nova/tileentity/network/type/fluid/FluidNetwork.kt +++ b/nova/src/main/kotlin/xyz/xenondevs/nova/tileentity/network/type/fluid/FluidNetwork.kt @@ -19,11 +19,13 @@ class FluidNetwork(networkData: NetworkData) : Network = arrayOfNulls(CHANNEL_AMOUNT) private val transferRate: Long + private val complexity: Int private var nextChannel = 0 init { var transferRate = DEFAULT_TRANSFER_RATE + var complexity = 0 for ((node, faces) in networkData.nodes.values) { if (node is NetworkEndPoint) { @@ -36,18 +38,24 @@ class FluidNetwork(networkData: NetworkData) : Network MAX_COMPLEXITY) + return + val startingChannel = nextChannel var amountLeft = transferRate do { @@ -66,6 +74,7 @@ class FluidNetwork(networkData: NetworkData) : Network (defaultTransferRate * tickDelay).roundToLong() } .map { defaultTransferRate -> if (defaultTransferRate < 0) Long.MAX_VALUE else defaultTransferRate } val CHANNEL_AMOUNT: Int by FLUID_NETWORK.entry("channel_amount") + val MAX_COMPLEXITY: Int by FLUID_NETWORK.entry("max_complexity") } diff --git a/nova/src/main/kotlin/xyz/xenondevs/nova/tileentity/network/type/item/ItemNetwork.kt b/nova/src/main/kotlin/xyz/xenondevs/nova/tileentity/network/type/item/ItemNetwork.kt index c4e8c68cd6..6a6d3908a8 100644 --- a/nova/src/main/kotlin/xyz/xenondevs/nova/tileentity/network/type/item/ItemNetwork.kt +++ b/nova/src/main/kotlin/xyz/xenondevs/nova/tileentity/network/type/item/ItemNetwork.kt @@ -19,11 +19,13 @@ class ItemNetwork(networkData: NetworkData) : Network, internal val channels: Array private val transferRate: Int + val complexity: Int private var nextChannel = 0 init { var transferRate = DEFAULT_TRANSFER_RATE + var complexity = 0 val channelsBuilder = ItemChannelsBuilder() for ((node, faces) in nodes.values) { if (node is NetworkEndPoint) { @@ -31,15 +33,21 @@ class ItemNetwork(networkData: NetworkData) : Network, ?: continue channelsBuilder.addHolder(itemHolder, faces) + complexity++ } else if (node is ItemBridge) { transferRate = min(transferRate, node.itemTransferRate) } } + this.transferRate = transferRate + this.complexity = complexity channels = channelsBuilder.build() } internal fun tick() { + if (MAX_COMPLEXITY != -1 && complexity > MAX_COMPLEXITY) + return + val startingChannel = nextChannel var transfersLeft = transferRate do { @@ -60,6 +68,7 @@ class ItemNetwork(networkData: NetworkData) : Network, .map { (defaultTransferRate, tickDelay) -> (defaultTransferRate * tickDelay).roundToInt() } .map { defaultTransferRate -> if (defaultTransferRate < 0) Int.MAX_VALUE else defaultTransferRate } val CHANNEL_AMOUNT: Int by ITEM_NETWORK.entry("channel_amount") + val MAX_COMPLEXITY: Int by ITEM_NETWORK.entry("max_complexity") } diff --git a/nova/src/main/kotlin/xyz/xenondevs/nova/tileentity/network/type/item/ItemNetworkGroup.kt b/nova/src/main/kotlin/xyz/xenondevs/nova/tileentity/network/type/item/ItemNetworkGroup.kt index c41337425c..1339c29d4a 100644 --- a/nova/src/main/kotlin/xyz/xenondevs/nova/tileentity/network/type/item/ItemNetworkGroup.kt +++ b/nova/src/main/kotlin/xyz/xenondevs/nova/tileentity/network/type/item/ItemNetworkGroup.kt @@ -5,6 +5,7 @@ package xyz.xenondevs.nova.tileentity.network.type.item import net.minecraft.world.item.ItemStack import xyz.xenondevs.nova.tileentity.network.NetworkGroup import xyz.xenondevs.nova.tileentity.network.NetworkGroupData +import xyz.xenondevs.nova.tileentity.network.type.item.ItemNetwork.Companion.MAX_COMPLEXITY import xyz.xenondevs.nova.tileentity.network.type.item.channel.FilteredNetworkedInventory import xyz.xenondevs.nova.tileentity.network.type.item.inventory.NetworkedInventory import xyz.xenondevs.nova.util.RoundRobinCounter @@ -13,6 +14,7 @@ internal class ItemNetworkGroup(data: NetworkGroupData) : NetworkGr private val providerSnapshots = HashMap>() private val filteredProviderSnapshots = HashMap>() + private var hasSnapshot = false private val roundRobin = RoundRobinCounter(networks.size) @@ -54,10 +56,19 @@ internal class ItemNetworkGroup(data: NetworkGroupData) : NetworkGr } override fun preTick() { + if (MAX_COMPLEXITY != -1 && networks.all { it.complexity > MAX_COMPLEXITY }) { + hasSnapshot = false + return + } + takeSnapshot() + hasSnapshot = true } override fun tick() { + if (!hasSnapshot) + return + val startIdx = roundRobin.next() for (i in startIdx..