From c7da691ffd7e42735b483fd45db36cbaee989450 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Mon, 28 Oct 2019 12:00:17 -0400 Subject: [PATCH] Use cable connections in search instead of checking every direction --- .../shadowfacts/phycon/api/NetworkCable.java | 10 ++++++++++ .../shadowfacts/phycon/network/NetworkUtil.kt | 18 +++++++++++++++--- .../phycon/network/block/cable/CableBlock.kt | 11 +++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/shadowfacts/phycon/api/NetworkCable.java b/src/main/java/net/shadowfacts/phycon/api/NetworkCable.java index 650e6f4..53d1c6e 100644 --- a/src/main/java/net/shadowfacts/phycon/api/NetworkCable.java +++ b/src/main/java/net/shadowfacts/phycon/api/NetworkCable.java @@ -1,7 +1,17 @@ package net.shadowfacts.phycon.api; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; + +import java.util.Set; + /** * @author shadowfacts */ public interface NetworkCable extends NetworkComponent { + + Set getNetworkConnectedSides(BlockState state, World world, BlockPos pos); + } diff --git a/src/main/kotlin/net/shadowfacts/phycon/network/NetworkUtil.kt b/src/main/kotlin/net/shadowfacts/phycon/network/NetworkUtil.kt index 9eaa25b..8e3e4ce 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/network/NetworkUtil.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/network/NetworkUtil.kt @@ -31,9 +31,7 @@ object NetworkUtil { results.add(sink) } - if (world.getBlockState(pos).block is NetworkCable) { - addAdjacent(queue, visited, pos) - } + findEdges(queue, visited, world, pos) visited.add(pos) } @@ -41,6 +39,20 @@ object NetworkUtil { return results } + private fun findEdges(queue: MutableList, visited: Set, world: World, pos: BlockPos) { + val state = world.getBlockState(pos) + val block = state.block + if (block is NetworkCable) { + val connections = block.getNetworkConnectedSides(state, world, pos) + for (side in connections) { + val newPos = pos.offset(side) + if (newPos !in visited) { + queue.add(newPos) + } + } + } + } + private fun addAdjacent(queue: MutableList, visited: Set, pos: BlockPos) { for (dir in Direction.values()) { val newPos = pos.offset(dir) diff --git a/src/main/kotlin/net/shadowfacts/phycon/network/block/cable/CableBlock.kt b/src/main/kotlin/net/shadowfacts/phycon/network/block/cable/CableBlock.kt index bceae7f..fd6e7a0 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/network/block/cable/CableBlock.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/network/block/cable/CableBlock.kt @@ -15,6 +15,7 @@ import net.minecraft.util.shape.VoxelShape import net.minecraft.util.shape.VoxelShapes import net.minecraft.world.BlockView import net.minecraft.world.IWorld +import net.minecraft.world.World import net.shadowfacts.phycon.PhysicalConnectivity import net.shadowfacts.phycon.api.NetworkCable import net.shadowfacts.phycon.api.NetworkComponent @@ -58,6 +59,16 @@ class CableBlock: Block(Settings.of(CABLE_MATERIAL)), NetworkCable { } } + override fun getNetworkConnectedSides(state: BlockState, world: World, pos: BlockPos): Set { + val set = EnumSet.noneOf(Direction::class.java) + for ((side, prop) in CONNECTIONS) { + if (state[prop]) { + set.add(side) + } + } + return set + } + override fun appendProperties(builder: StateFactory.Builder) { super.appendProperties(builder) CONNECTIONS.values.forEach {