From bc50017b4a7d683302b0d24f030cc9bdb75c7459 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Mon, 15 Mar 2021 18:30:35 -0400 Subject: [PATCH] Add cable colors to face device blocks --- .../phycon/block/FaceDeviceBlock.kt | 26 +++- .../phycon/client/model/ColoredCableModel.kt | 28 +--- .../phycon/client/model/FaceDeviceModel.kt | 137 +++++++++++------- .../client/model/RedstoneControllerModel.kt | 4 +- .../client/model/SimpleFaceDeviceModel.kt | 20 ++- .../phycon/client/util/ModelLoader.kt | 32 ++++ .../phycon/item/FaceDeviceBlockItem.kt | 4 +- .../models/block/interface_cable_cap.json | 4 +- .../models/block/interface_cable_corner.json | 10 +- .../block/interface_cable_corner_2.json | 10 +- .../block/interface_cable_straight.json | 6 +- .../phycon/models/block/interface_side.json | 10 +- .../textures/block/cable/black/cap_end.png | Bin 104 -> 308 bytes .../block/cable/black/corner_l_down.png | Bin 0 -> 317 bytes .../block/cable/black/corner_l_up.png | Bin 0 -> 321 bytes .../block/cable/black/corner_r_down.png | Bin 0 -> 322 bytes .../textures/block/cable/black/straight.png | Bin 173 -> 342 bytes .../block/cable/black/straight_rotated.png | Bin 128 -> 322 bytes .../blue/corner_l_down.png} | Bin .../blue/corner_l_up.png} | Bin .../blue/corner_r_down.png} | Bin .../textures/block/cable/brown/cap_end.png | Bin 144 -> 348 bytes .../block/cable/brown/corner_l_down.png | Bin 0 -> 427 bytes .../block/cable/brown/corner_l_up.png | Bin 0 -> 426 bytes .../block/cable/brown/corner_r_down.png | Bin 0 -> 426 bytes .../textures/block/cable/brown/straight.png | Bin 239 -> 501 bytes .../block/cable/brown/straight_rotated.png | Bin 217 -> 481 bytes .../textures/block/cable/cyan/cap_end.png | Bin 148 -> 359 bytes .../block/cable/cyan/corner_l_down.png | Bin 0 -> 452 bytes .../textures/block/cable/cyan/corner_l_up.png | Bin 0 -> 454 bytes .../block/cable/cyan/corner_r_down.png | Bin 0 -> 454 bytes .../textures/block/cable/cyan/straight.png | Bin 251 -> 556 bytes .../block/cable/cyan/straight_rotated.png | Bin 229 -> 530 bytes .../textures/block/cable/gray/cap_end.png | Bin 142 -> 345 bytes .../block/cable/gray/corner_l_down.png | Bin 0 -> 406 bytes .../textures/block/cable/gray/corner_l_up.png | Bin 0 -> 405 bytes .../block/cable/gray/corner_r_down.png | Bin 0 -> 405 bytes .../textures/block/cable/gray/straight.png | Bin 231 -> 455 bytes .../block/cable/gray/straight_rotated.png | Bin 206 -> 438 bytes .../textures/block/cable/green/cap_end.png | Bin 143 -> 348 bytes .../block/cable/green/corner_l_down.png | Bin 0 -> 428 bytes .../block/cable/green/corner_l_up.png | Bin 0 -> 430 bytes .../block/cable/green/corner_r_down.png | Bin 0 -> 430 bytes .../textures/block/cable/green/straight.png | Bin 228 -> 487 bytes .../block/cable/green/straight_rotated.png | Bin 211 -> 466 bytes .../block/cable/light_blue/cap_end.png | Bin 148 -> 362 bytes .../block/cable/light_blue/corner_l_down.png | Bin 0 -> 446 bytes .../block/cable/light_blue/corner_l_up.png | Bin 0 -> 448 bytes .../block/cable/light_blue/corner_r_down.png | Bin 0 -> 448 bytes .../block/cable/light_blue/straight.png | Bin 276 -> 553 bytes .../cable/light_blue/straight_rotated.png | Bin 246 -> 527 bytes .../block/cable/light_gray/cap_end.png | Bin 145 -> 359 bytes .../block/cable/light_gray/corner_l_down.png | Bin 0 -> 427 bytes .../block/cable/light_gray/corner_l_up.png | Bin 0 -> 426 bytes .../block/cable/light_gray/corner_r_down.png | Bin 0 -> 426 bytes .../block/cable/light_gray/straight.png | Bin 249 -> 477 bytes .../cable/light_gray/straight_rotated.png | Bin 222 -> 456 bytes .../textures/block/cable/lime/cap_end.png | Bin 149 -> 362 bytes .../block/cable/lime/corner_l_down.png | Bin 0 -> 455 bytes .../textures/block/cable/lime/corner_l_up.png | Bin 0 -> 457 bytes .../block/cable/lime/corner_r_down.png | Bin 0 -> 457 bytes .../textures/block/cable/lime/straight.png | Bin 274 -> 564 bytes .../block/cable/lime/straight_rotated.png | Bin 243 -> 539 bytes .../textures/block/cable/magenta/cap_end.png | Bin 148 -> 362 bytes .../block/cable/magenta/corner_l_down.png | Bin 0 -> 455 bytes .../block/cable/magenta/corner_l_up.png | Bin 0 -> 457 bytes .../block/cable/magenta/corner_r_down.png | Bin 0 -> 457 bytes .../textures/block/cable/magenta/straight.png | Bin 255 -> 564 bytes .../block/cable/magenta/straight_rotated.png | Bin 236 -> 539 bytes .../textures/block/cable/orange/cap_end.png | Bin 145 -> 362 bytes .../block/cable/orange/corner_l_down.png | Bin 0 -> 455 bytes .../block/cable/orange/corner_l_up.png | Bin 0 -> 457 bytes .../block/cable/orange/corner_r_down.png | Bin 0 -> 457 bytes .../textures/block/cable/orange/straight.png | Bin 259 -> 559 bytes .../block/cable/orange/straight_rotated.png | Bin 236 -> 533 bytes .../textures/block/cable/pink/cap_end.png | Bin 150 -> 359 bytes .../block/cable/pink/corner_l_down.png | Bin 0 -> 448 bytes .../textures/block/cable/pink/corner_l_up.png | Bin 0 -> 447 bytes .../block/cable/pink/corner_r_down.png | Bin 0 -> 447 bytes .../textures/block/cable/pink/straight.png | Bin 280 -> 536 bytes .../block/cable/pink/straight_rotated.png | Bin 249 -> 512 bytes .../textures/block/cable/purple/cap_end.png | Bin 148 -> 362 bytes .../block/cable/purple/corner_l_down.png | Bin 0 -> 452 bytes .../block/cable/purple/corner_l_up.png | Bin 0 -> 454 bytes .../block/cable/purple/corner_r_down.png | Bin 0 -> 454 bytes .../textures/block/cable/purple/straight.png | Bin 264 -> 555 bytes .../block/cable/purple/straight_rotated.png | Bin 243 -> 530 bytes .../textures/block/cable/red/cap_end.png | Bin 148 -> 362 bytes .../block/cable/red/corner_l_down.png | Bin 0 -> 455 bytes .../textures/block/cable/red/corner_l_up.png | Bin 0 -> 457 bytes .../block/cable/red/corner_r_down.png | Bin 0 -> 457 bytes .../textures/block/cable/red/straight.png | Bin 258 -> 564 bytes .../block/cable/red/straight_rotated.png | Bin 228 -> 539 bytes .../textures/block/cable/white/cap_end.png | Bin 109 -> 314 bytes .../block/cable/white/corner_l_down.png | Bin 0 -> 329 bytes .../block/cable/white/corner_l_up.png | Bin 0 -> 335 bytes .../block/cable/white/corner_r_down.png | Bin 0 -> 335 bytes .../textures/block/cable/white/straight.png | Bin 169 -> 366 bytes .../block/cable/white/straight_rotated.png | Bin 148 -> 344 bytes .../textures/block/cable/yellow/cap_end.png | Bin 149 -> 362 bytes .../block/cable/yellow/corner_l_down.png | Bin 0 -> 455 bytes .../block/cable/yellow/corner_l_up.png | Bin 0 -> 457 bytes .../block/cable/yellow/corner_r_down.png | Bin 0 -> 457 bytes .../textures/block/cable/yellow/straight.png | Bin 261 -> 561 bytes .../block/cable/yellow/straight_rotated.png | Bin 234 -> 536 bytes 105 files changed, 179 insertions(+), 112 deletions(-) create mode 100644 src/main/kotlin/net/shadowfacts/phycon/client/util/ModelLoader.kt create mode 100644 src/main/resources/assets/phycon/textures/block/cable/black/corner_l_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/black/corner_l_up.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/black/corner_r_down.png rename src/main/resources/assets/phycon/textures/block/{interface_cable_corner_l.png => cable/blue/corner_l_down.png} (100%) rename src/main/resources/assets/phycon/textures/block/{interface_cable_corner_l_up.png => cable/blue/corner_l_up.png} (100%) rename src/main/resources/assets/phycon/textures/block/{interface_cable_corner_r.png => cable/blue/corner_r_down.png} (100%) create mode 100644 src/main/resources/assets/phycon/textures/block/cable/brown/corner_l_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/brown/corner_l_up.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/brown/corner_r_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/cyan/corner_l_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/cyan/corner_l_up.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/cyan/corner_r_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/gray/corner_l_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/gray/corner_l_up.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/gray/corner_r_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/green/corner_l_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/green/corner_l_up.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/green/corner_r_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/light_blue/corner_l_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/light_blue/corner_l_up.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/light_blue/corner_r_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/light_gray/corner_l_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/light_gray/corner_l_up.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/light_gray/corner_r_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/lime/corner_l_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/lime/corner_l_up.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/lime/corner_r_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/magenta/corner_l_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/magenta/corner_l_up.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/magenta/corner_r_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/orange/corner_l_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/orange/corner_l_up.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/orange/corner_r_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/pink/corner_l_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/pink/corner_l_up.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/pink/corner_r_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/purple/corner_l_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/purple/corner_l_up.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/purple/corner_r_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/red/corner_l_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/red/corner_l_up.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/red/corner_r_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/white/corner_l_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/white/corner_l_up.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/white/corner_r_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/yellow/corner_l_down.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/yellow/corner_l_up.png create mode 100644 src/main/resources/assets/phycon/textures/block/cable/yellow/corner_r_down.png diff --git a/src/main/kotlin/net/shadowfacts/phycon/block/FaceDeviceBlock.kt b/src/main/kotlin/net/shadowfacts/phycon/block/FaceDeviceBlock.kt index 47ce568..8faf586 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/block/FaceDeviceBlock.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/block/FaceDeviceBlock.kt @@ -7,6 +7,7 @@ import net.minecraft.item.ItemPlacementContext import net.minecraft.state.StateManager import net.minecraft.state.property.EnumProperty import net.minecraft.state.property.Properties +import net.minecraft.util.DyeColor import net.minecraft.util.StringIdentifiable import net.minecraft.util.math.BlockPos import net.minecraft.util.math.Direction @@ -28,6 +29,7 @@ abstract class FaceDeviceBlock(settings: Settings): Device companion object { val FACING = Properties.FACING val CABLE_CONNECTION = EnumProperty.of("cable_connection", FaceCableConnection::class.java) + val COLOR = EnumProperty.of("color", DyeColor::class.java) } enum class FaceCableConnection : StringIdentifiable { @@ -100,44 +102,56 @@ abstract class FaceDeviceBlock(settings: Settings): Device super.appendProperties(builder) builder.add(FACING) builder.add(CABLE_CONNECTION) + builder.add(COLOR) } override fun getPlacementState(context: ItemPlacementContext): BlockState { val facing = if (context.player?.isSneaking == true) context.side.opposite else context.playerLookDirection.opposite - val cableConnection = FaceCableConnection.from(getCableConnectedSide(context.world, context.blockPos, facing)) + // todo: this should never be called + val cableConnection = FaceCableConnection.from(getCableConnectedSide(context.world, context.blockPos, facing, DyeColor.BLUE)) return defaultState .with(FACING, facing) .with(CABLE_CONNECTION, cableConnection) } - private fun getCableConnectedSide(world: WorldAccess, pos: BlockPos, facing: Direction): Direction? { + private fun getCableConnectedSide(world: WorldAccess, pos: BlockPos, facing: Direction, color: DyeColor): Direction? { for (side in Direction.values()) { if (side == facing) { continue } val offsetPos = pos.offset(side) val state = world.getBlockState(offsetPos) - val block = state.block - if (block is NetworkComponentBlock && block.getNetworkConnectedSides(state, world, offsetPos).contains(side.opposite)) { + if (canConnectTo(world, side, state, offsetPos, color)) { return side } } return null } + private fun canConnectTo(world: WorldAccess, side: Direction, candidateState: BlockState, candidatePos: BlockPos, myColor: DyeColor): Boolean { + val block = candidateState.block + return if (block is FaceDeviceBlock<*> && candidateState[COLOR] == myColor) { + true + } else if (block is CableBlock && block.color == myColor) { + true + } else { + block is NetworkComponentBlock && block.getNetworkConnectedSides(candidateState, world, candidatePos).contains(side.opposite) + } + } + override fun getStateForNeighborUpdate(state: BlockState, side: Direction, neighborState: BlockState, world: WorldAccess, pos: BlockPos, neighborPos: BlockPos): BlockState { val current = state[CABLE_CONNECTION] var newConnection = current if (current == FaceCableConnection.NONE) { - if (neighborState.block is NetworkComponentBlock) { + if (canConnectTo(world, side, neighborState, neighborPos, state[COLOR])) { newConnection = FaceCableConnection.from(side) } } else { val currentConnectedPos = pos.offset(current.direction) if (neighborPos == currentConnectedPos && neighborState.block !is NetworkComponentBlock) { // the old cable connection is no longer correct, try to find another - newConnection = FaceCableConnection.from(getCableConnectedSide(world, pos, state[FACING])) + newConnection = FaceCableConnection.from(getCableConnectedSide(world, pos, state[FACING], state[COLOR])) } } return state.with(CABLE_CONNECTION, newConnection) diff --git a/src/main/kotlin/net/shadowfacts/phycon/client/model/ColoredCableModel.kt b/src/main/kotlin/net/shadowfacts/phycon/client/model/ColoredCableModel.kt index 59b1128..0c5acab 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/client/model/ColoredCableModel.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/client/model/ColoredCableModel.kt @@ -3,8 +3,6 @@ package net.shadowfacts.phycon.client.model import com.mojang.datafixers.util.Pair import net.minecraft.block.BlockState import net.minecraft.client.render.model.* -import net.minecraft.client.render.model.json.ModelOverrideList -import net.minecraft.client.render.model.json.ModelTransformation import net.minecraft.client.texture.Sprite import net.minecraft.client.texture.SpriteAtlasTexture import net.minecraft.client.util.SpriteIdentifier @@ -13,6 +11,7 @@ import net.minecraft.util.Identifier import net.minecraft.util.math.Direction import net.shadowfacts.phycon.PhysicalConnectivity import net.shadowfacts.phycon.block.cable.CableBlock +import net.shadowfacts.phycon.client.util.bakeRecoloredCable import net.shadowfacts.phycon.util.CableConnection import java.util.Random import java.util.function.Function @@ -89,8 +88,8 @@ class ColoredCableModel( centerSprite = textureGetter.apply(SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, Identifier(PhysicalConnectivity.MODID, "block/cable/${color.getName()}/straight"))) sideRotations.forEach { (side, rot) -> - this.side[side.ordinal] = loader.bakeRetextured(SIDE, textureGetter, rot) - this.center[side.ordinal] = loader.bakeRetextured(CENTER, textureGetter, rot) + this.side[side.ordinal] = loader.bakeRecoloredCable(SIDE, rot, textureGetter, color) + this.center[side.ordinal] = loader.bakeRecoloredCable(CENTER, rot, textureGetter, color) } diagCorner.clear() @@ -105,8 +104,8 @@ class ColoredCableModel( ModelRotation.X180_Y90, ModelRotation.X180_Y270, ).forEach { rot -> - diagCorner[rot] = loader.bakeRetextured(DIAG_CORNER, textureGetter, rot) - diagCornerCont[rot] = loader.bakeRetextured(DIAG_CORNER_CONT, textureGetter, rot) + diagCorner[rot] = loader.bakeRecoloredCable(DIAG_CORNER, rot, textureGetter, color) + diagCornerCont[rot] = loader.bakeRecoloredCable(DIAG_CORNER_CONT, rot, textureGetter, color) } diagCornerXZ.clear() @@ -117,26 +116,13 @@ class ColoredCableModel( ModelRotation.X0_Y180, ModelRotation.X0_Y270, ).forEach { rot -> - diagCornerXZ[rot] = loader.bakeRetextured(DIAG_CORNER_XZ, textureGetter, rot) - diagCornerXZCont[rot] = loader.bakeRetextured(DIAG_CORNER_XZ_CONT, textureGetter, rot) + diagCornerXZ[rot] = loader.bakeRecoloredCable(DIAG_CORNER_XZ, rot, textureGetter, color) + diagCornerXZCont[rot] = loader.bakeRecoloredCable(DIAG_CORNER_XZ_CONT, rot, textureGetter, color) } return this } - private fun ModelLoader.bakeRetextured(id: Identifier, textureGetter: Function, rot: ModelRotation): BakedModel { - val unbaked = getOrLoadModel(id) - val wrappedTextureGetter: (SpriteIdentifier) -> Sprite = { - var newId = it - if (it.textureId.namespace == PhysicalConnectivity.MODID && it.textureId.path.startsWith("block/cable/color/")) { - val newPath = it.textureId.path.replace("block/cable/color/", "block/cable/${color.getName()}/") - newId = SpriteIdentifier(it.atlasId, Identifier(PhysicalConnectivity.MODID, newPath)) - } - textureGetter.apply(newId) - } - return unbaked.bake(this, wrappedTextureGetter, rot, id)!! - } - override fun getQuads(state: BlockState?, face: Direction?, random: Random): List { if (state == null) { return center.flatMap { diff --git a/src/main/kotlin/net/shadowfacts/phycon/client/model/FaceDeviceModel.kt b/src/main/kotlin/net/shadowfacts/phycon/client/model/FaceDeviceModel.kt index fadfe75..a96f376 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/client/model/FaceDeviceModel.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/client/model/FaceDeviceModel.kt @@ -4,11 +4,13 @@ import net.minecraft.block.BlockState import net.minecraft.client.render.model.* import net.minecraft.client.texture.Sprite import net.minecraft.client.util.SpriteIdentifier +import net.minecraft.util.DyeColor import net.minecraft.util.Identifier import net.minecraft.util.math.Direction import net.shadowfacts.phycon.PhysicalConnectivity import net.shadowfacts.phycon.block.FaceDeviceBlock import net.shadowfacts.phycon.block.FaceDeviceBlock.FaceCableConnection +import net.shadowfacts.phycon.client.util.bakeRecoloredCable import java.util.Random import java.util.function.Function @@ -21,10 +23,14 @@ abstract class FaceDeviceModel: UnbakedModel, BakedModel { private val interfaceCableCornerID = Identifier(PhysicalConnectivity.MODID, "block/interface_cable_corner") private val interfaceCableCorner2ID = Identifier(PhysicalConnectivity.MODID, "block/interface_cable_corner_2") private val interfaceCableCapID = Identifier(PhysicalConnectivity.MODID, "block/interface_cable_cap") - private var interfaceCableStraight = Array(6) { null } - private var interfaceCableCap = Array(6) { null } - private var interfaceCableCorner = mutableMapOf() - private var interfaceCableCorner2 = mutableMapOf() +// private var interfaceCableStraight = Array(6) { null } +// private var interfaceCableCap = Array(6) { null } +// private var interfaceCableCorner = mutableMapOf() +// private var interfaceCableCorner2 = mutableMapOf() + private var interfaceCableStraight = mutableMapOf>() + private var interfaceCableCap = mutableMapOf>() + private var interfaceCableCorner = mutableMapOf>() + private var interfaceCableCorner2 = mutableMapOf>() protected val defaultRotations = listOf( ModelRotation.X0_Y0, @@ -36,7 +42,7 @@ abstract class FaceDeviceModel: UnbakedModel, BakedModel { ) abstract fun getSideModelIDs(): Collection - abstract fun bakeSideModels(loader: ModelLoader) + abstract fun bakeSideModels(loader: ModelLoader, textureGetter: Function) abstract fun getSideModel(state: BlockState): BakedModel? override fun getModelDependencies(): Collection { @@ -52,36 +58,54 @@ abstract class FaceDeviceModel: UnbakedModel, BakedModel { unbakedModelGetter: Function, unresolvedTextureReferences: MutableSet> ): Collection { - return modelDependencies.map(unbakedModelGetter::apply).flatMap { it.getTextureDependencies(unbakedModelGetter, unresolvedTextureReferences) } + val textures = mutableListOf() + for (dep in modelDependencies) { + val unbakedDep = unbakedModelGetter.apply(dep) + val depTextures = unbakedDep.getTextureDependencies(unbakedModelGetter, unresolvedTextureReferences) + for (tex in depTextures) { + if (tex.textureId.namespace == PhysicalConnectivity.MODID && tex.textureId.path.startsWith("block/cable/color/")) { + for (color in DyeColor.values()) { + val newPath = tex.textureId.path.replace("block/cable/color/", "block/cable/${color.getName()}/") + val substituted = SpriteIdentifier(tex.atlasId, Identifier(PhysicalConnectivity.MODID, newPath)) + textures.add(substituted) + } + } else { + textures.add(tex) + } + } + } + return textures } override fun bake(loader: ModelLoader, textureGetter: Function, rotationContainer: ModelBakeSettings, modelId: Identifier): BakedModel { - bakeSideModels(loader) + bakeSideModels(loader, textureGetter) - defaultRotations.forEachIndexed { i, rot -> - interfaceCableStraight[i] = loader.bake(interfaceCableStraightID, rot) - interfaceCableCap[i] = loader.bake(interfaceCableCapID, rot) - } + DyeColor.values().forEach { color -> + interfaceCableStraight[color] = Array(6) { i -> + loader.bakeRecoloredCable(interfaceCableStraightID, defaultRotations[i], textureGetter, color) + } + interfaceCableCap[color] = Array(6) { i -> + loader.bakeRecoloredCable(interfaceCableCapID, defaultRotations[i], textureGetter, color) + } - mapOf( - interfaceCableCorner to interfaceCableCornerID to ModelRotation.values().toList(), - interfaceCableCorner2 to interfaceCableCorner2ID to listOf( - ModelRotation.X0_Y0, - ModelRotation.X0_Y90, - ModelRotation.X0_Y180, - ModelRotation.X0_Y270, - ModelRotation.X180_Y0, - ModelRotation.X180_Y90, - ModelRotation.X180_Y180, - ModelRotation.X180_Y270, - ), - ).forEach { (k, rotations) -> - val (map, id) = k - map.clear() - rotations.forEach { rot -> - val model = loader.bake(id, rot) - if (model == null) map.remove(rot) - else map[rot] = model + mapOf( + interfaceCableCorner to interfaceCableCornerID to ModelRotation.values().toList(), + interfaceCableCorner2 to interfaceCableCorner2ID to listOf( + ModelRotation.X0_Y0, + ModelRotation.X0_Y90, + ModelRotation.X0_Y180, + ModelRotation.X0_Y270, + ModelRotation.X180_Y0, + ModelRotation.X180_Y90, + ModelRotation.X180_Y180, + ModelRotation.X180_Y270, + ), + ).forEach { (k, rotations) -> + val (map, id) = k + map[color] = mutableMapOf() + rotations.forEach { rot -> + map[color]!![rot] = loader.bakeRecoloredCable(id, rot, textureGetter, color) + } } } @@ -92,54 +116,55 @@ abstract class FaceDeviceModel: UnbakedModel, BakedModel { if (state == null) return listOf() val facing = state[FaceDeviceBlock.FACING] val connection = state[FaceDeviceBlock.CABLE_CONNECTION] + val color = state[FaceDeviceBlock.COLOR] val sideQuads = getSideModel(state)?.getQuads(state, face, random) ?: listOf() val cableQuads = if (connection.direction == facing.opposite) { - interfaceCableStraight[facing.ordinal]?.getQuads(state, face, random) ?: listOf() + interfaceCableStraight[color]!![facing.ordinal]?.getQuads(state, face, random) ?: listOf() } else if (connection == FaceCableConnection.NONE) { - interfaceCableCap[facing.ordinal]?.getQuads(state, face, random) ?: listOf() + interfaceCableCap[color]!![facing.ordinal]?.getQuads(state, face, random) ?: listOf() } else { val model = when (facing) { Direction.DOWN -> when (connection) { - FaceCableConnection.NORTH -> interfaceCableCorner[ModelRotation.X0_Y0] - FaceCableConnection.EAST -> interfaceCableCorner[ModelRotation.X0_Y90] - FaceCableConnection.SOUTH -> interfaceCableCorner[ModelRotation.X0_Y180] - FaceCableConnection.WEST -> interfaceCableCorner[ModelRotation.X0_Y270] + FaceCableConnection.NORTH -> interfaceCableCorner[color]!![ModelRotation.X0_Y0] + FaceCableConnection.EAST -> interfaceCableCorner[color]!![ModelRotation.X0_Y90] + FaceCableConnection.SOUTH -> interfaceCableCorner[color]!![ModelRotation.X0_Y180] + FaceCableConnection.WEST -> interfaceCableCorner[color]!![ModelRotation.X0_Y270] else -> null } Direction.UP -> when (connection) { - FaceCableConnection.NORTH -> interfaceCableCorner[ModelRotation.X180_Y180] - FaceCableConnection.EAST -> interfaceCableCorner[ModelRotation.X180_Y270] - FaceCableConnection.SOUTH -> interfaceCableCorner[ModelRotation.X180_Y0] - FaceCableConnection.WEST -> interfaceCableCorner[ModelRotation.X180_Y90] + FaceCableConnection.NORTH -> interfaceCableCorner[color]!![ModelRotation.X180_Y180] + FaceCableConnection.EAST -> interfaceCableCorner[color]!![ModelRotation.X180_Y270] + FaceCableConnection.SOUTH -> interfaceCableCorner[color]!![ModelRotation.X180_Y0] + FaceCableConnection.WEST -> interfaceCableCorner[color]!![ModelRotation.X180_Y90] else -> null } Direction.NORTH -> when (connection) { - FaceCableConnection.UP -> interfaceCableCorner[ModelRotation.X270_Y0] - FaceCableConnection.EAST -> interfaceCableCorner2[ModelRotation.X180_Y180] - FaceCableConnection.DOWN -> interfaceCableCorner[ModelRotation.X90_Y180] - FaceCableConnection.WEST -> interfaceCableCorner2[ModelRotation.X0_Y0] + FaceCableConnection.UP -> interfaceCableCorner[color]!![ModelRotation.X270_Y0] + FaceCableConnection.EAST -> interfaceCableCorner2[color]!![ModelRotation.X180_Y180] + FaceCableConnection.DOWN -> interfaceCableCorner[color]!![ModelRotation.X90_Y180] + FaceCableConnection.WEST -> interfaceCableCorner2[color]!![ModelRotation.X0_Y0] else -> null } Direction.SOUTH -> when (connection) { - FaceCableConnection.UP -> interfaceCableCorner[ModelRotation.X270_Y180] - FaceCableConnection.WEST -> interfaceCableCorner2[ModelRotation.X180_Y0] - FaceCableConnection.DOWN -> interfaceCableCorner[ModelRotation.X90_Y0] - FaceCableConnection.EAST -> interfaceCableCorner2[ModelRotation.X0_Y180] + FaceCableConnection.UP -> interfaceCableCorner[color]!![ModelRotation.X270_Y180] + FaceCableConnection.WEST -> interfaceCableCorner2[color]!![ModelRotation.X180_Y0] + FaceCableConnection.DOWN -> interfaceCableCorner[color]!![ModelRotation.X90_Y0] + FaceCableConnection.EAST -> interfaceCableCorner2[color]!![ModelRotation.X0_Y180] else -> null } Direction.WEST -> when (connection) { - FaceCableConnection.UP -> interfaceCableCorner[ModelRotation.X270_Y270] - FaceCableConnection.NORTH -> interfaceCableCorner2[ModelRotation.X180_Y90] - FaceCableConnection.DOWN -> interfaceCableCorner[ModelRotation.X90_Y90] - FaceCableConnection.SOUTH -> interfaceCableCorner2[ModelRotation.X0_Y270] + FaceCableConnection.UP -> interfaceCableCorner[color]!![ModelRotation.X270_Y270] + FaceCableConnection.NORTH -> interfaceCableCorner2[color]!![ModelRotation.X180_Y90] + FaceCableConnection.DOWN -> interfaceCableCorner[color]!![ModelRotation.X90_Y90] + FaceCableConnection.SOUTH -> interfaceCableCorner2[color]!![ModelRotation.X0_Y270] else -> null } Direction.EAST -> when (connection) { - FaceCableConnection.UP -> interfaceCableCorner[ModelRotation.X270_Y90] - FaceCableConnection.SOUTH -> interfaceCableCorner2[ModelRotation.X180_Y270] - FaceCableConnection.DOWN -> interfaceCableCorner[ModelRotation.X90_Y270] - FaceCableConnection.NORTH -> interfaceCableCorner2[ModelRotation.X0_Y90] + FaceCableConnection.UP -> interfaceCableCorner[color]!![ModelRotation.X270_Y90] + FaceCableConnection.SOUTH -> interfaceCableCorner2[color]!![ModelRotation.X180_Y270] + FaceCableConnection.DOWN -> interfaceCableCorner[color]!![ModelRotation.X90_Y270] + FaceCableConnection.NORTH -> interfaceCableCorner2[color]!![ModelRotation.X0_Y90] else -> null } else -> null diff --git a/src/main/kotlin/net/shadowfacts/phycon/client/model/RedstoneControllerModel.kt b/src/main/kotlin/net/shadowfacts/phycon/client/model/RedstoneControllerModel.kt index 0b71f40..334bb6c 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/client/model/RedstoneControllerModel.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/client/model/RedstoneControllerModel.kt @@ -4,10 +4,12 @@ import net.minecraft.block.BlockState import net.minecraft.client.render.model.BakedModel import net.minecraft.client.render.model.ModelLoader import net.minecraft.client.texture.Sprite +import net.minecraft.client.util.SpriteIdentifier import net.minecraft.util.Identifier import net.shadowfacts.phycon.PhysicalConnectivity import net.shadowfacts.phycon.block.FaceDeviceBlock import net.shadowfacts.phycon.block.redstone_controller.RedstoneControllerBlock +import java.util.function.Function /** * @author shadowfacts @@ -23,7 +25,7 @@ object RedstoneControllerModel: FaceDeviceModel() { return listOf(ON, OFF) } - override fun bakeSideModels(loader: ModelLoader) { + override fun bakeSideModels(loader: ModelLoader, textureGetter: Function) { defaultRotations.forEachIndexed { i, rot -> onModels[i] = loader.bake(ON, rot) offModels[i] = loader.bake(OFF, rot) diff --git a/src/main/kotlin/net/shadowfacts/phycon/client/model/SimpleFaceDeviceModel.kt b/src/main/kotlin/net/shadowfacts/phycon/client/model/SimpleFaceDeviceModel.kt index bc9ca05..c42068f 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/client/model/SimpleFaceDeviceModel.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/client/model/SimpleFaceDeviceModel.kt @@ -4,8 +4,12 @@ import net.minecraft.block.BlockState import net.minecraft.client.render.model.BakedModel import net.minecraft.client.render.model.ModelLoader import net.minecraft.client.texture.Sprite +import net.minecraft.client.util.SpriteIdentifier +import net.minecraft.util.DyeColor import net.minecraft.util.Identifier import net.shadowfacts.phycon.block.FaceDeviceBlock +import net.shadowfacts.phycon.client.util.bakeRecoloredCable +import java.util.function.Function /** * @author shadowfacts @@ -13,23 +17,25 @@ import net.shadowfacts.phycon.block.FaceDeviceBlock class SimpleFaceDeviceModel( private val sideModelID: Identifier, ): FaceDeviceModel() { - private val sideModels = Array(6) { null } + private val sideModels = mutableMapOf>() override fun getSideModelIDs(): Collection { return listOf(sideModelID) } - override fun bakeSideModels(loader: ModelLoader) { - defaultRotations.forEachIndexed { i, rot -> - sideModels[i] = loader.bake(sideModelID, rot) + override fun bakeSideModels(loader: ModelLoader, textureGetter: Function) { + DyeColor.values().forEach { color -> + sideModels[color] = Array(6) { i -> + loader.bakeRecoloredCable(sideModelID, defaultRotations[i], textureGetter, color) + } } } - override fun getSideModel(state: BlockState): BakedModel? { - return sideModels[state[FaceDeviceBlock.FACING].ordinal] + override fun getSideModel(state: BlockState): BakedModel { + return sideModels[state[FaceDeviceBlock.COLOR]]!![state[FaceDeviceBlock.FACING].ordinal] } override fun getSprite(): Sprite { - return sideModels.first()!!.sprite + return sideModels[DyeColor.BLACK]!!.first().sprite } } diff --git a/src/main/kotlin/net/shadowfacts/phycon/client/util/ModelLoader.kt b/src/main/kotlin/net/shadowfacts/phycon/client/util/ModelLoader.kt new file mode 100644 index 0000000..aba8430 --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/phycon/client/util/ModelLoader.kt @@ -0,0 +1,32 @@ +package net.shadowfacts.phycon.client.util + +import net.minecraft.client.render.model.BakedModel +import net.minecraft.client.render.model.ModelLoader +import net.minecraft.client.render.model.ModelRotation +import net.minecraft.client.texture.Sprite +import net.minecraft.client.util.SpriteIdentifier +import net.minecraft.util.DyeColor +import net.minecraft.util.Identifier +import net.shadowfacts.phycon.PhysicalConnectivity +import java.util.function.Function + +/** + * @author shadowfacts + */ +fun ModelLoader.bakeRecoloredCable( + id: Identifier, + rot: ModelRotation, + textureGetter: Function, + color: DyeColor +): BakedModel { + val unbaked = getOrLoadModel(id) + val wrappedTextureGetter: (SpriteIdentifier) -> Sprite = { + var newId = it + if (it.textureId.namespace == PhysicalConnectivity.MODID && it.textureId.path.startsWith("block/cable/color/")) { + val newPath = it.textureId.path.replace("block/cable/color/", "block/cable/${color.getName()}/") + newId = SpriteIdentifier(it.atlasId, Identifier(PhysicalConnectivity.MODID, newPath)) + } + textureGetter.apply(newId) + } + return unbaked.bake(this, wrappedTextureGetter, rot, id)!! +} diff --git a/src/main/kotlin/net/shadowfacts/phycon/item/FaceDeviceBlockItem.kt b/src/main/kotlin/net/shadowfacts/phycon/item/FaceDeviceBlockItem.kt index 3ce9800..f8f010d 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/item/FaceDeviceBlockItem.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/item/FaceDeviceBlockItem.kt @@ -15,7 +15,8 @@ class FaceDeviceBlockItem(block: FaceDeviceBlock<*>, settings: Settings = Settin override fun getPlacementState(context: ItemPlacementContext): BlockState? { val hitState = context.world.getBlockState(context.blockPos) - if (hitState.block is CableBlock) { + val hitBlock = hitState.block + if (hitBlock is CableBlock) { val hitBlockEdge = context.hitPos.getComponentAlongAxis(context.side.axis) % 1 == 0.0 val placementSide = if (hitBlockEdge) context.side.opposite else context.side @@ -32,6 +33,7 @@ class FaceDeviceBlockItem(block: FaceDeviceBlock<*>, settings: Settings = Settin return block.defaultState .with(FaceDeviceBlock.FACING, placementSide) .with(FaceDeviceBlock.CABLE_CONNECTION, connection) + .with(FaceDeviceBlock.COLOR, hitBlock.color) } } return null diff --git a/src/main/resources/assets/phycon/models/block/interface_cable_cap.json b/src/main/resources/assets/phycon/models/block/interface_cable_cap.json index 7f1ef62..f9d30ea 100644 --- a/src/main/resources/assets/phycon/models/block/interface_cable_cap.json +++ b/src/main/resources/assets/phycon/models/block/interface_cable_cap.json @@ -1,7 +1,7 @@ { "textures": { - "cap": "phycon:block/cable_cap_end", - "straight": "phycon:block/cable_straight" + "cap": "phycon:block/cable/color/cap_end", + "straight": "phycon:block/cable/color/straight" }, "elements": [ { diff --git a/src/main/resources/assets/phycon/models/block/interface_cable_corner.json b/src/main/resources/assets/phycon/models/block/interface_cable_corner.json index e143872..b82f6c1 100644 --- a/src/main/resources/assets/phycon/models/block/interface_cable_corner.json +++ b/src/main/resources/assets/phycon/models/block/interface_cable_corner.json @@ -1,9 +1,9 @@ { "textures": { - "straight": "phycon:block/cable_straight", - "cap": "phycon:block/cable_cap_end", - "corner_r": "phycon:block/interface_cable_corner_r", - "corner_l": "phycon:block/interface_cable_corner_l" + "straight": "phycon:block/cable/color/straight", + "cap": "phycon:block/cable/color/cap_end", + "corner_r": "phycon:block/cable/color/corner_r_down", + "corner_l": "phycon:block/cable/color/corner_l_down" }, "elements": [ { @@ -19,4 +19,4 @@ } } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/phycon/models/block/interface_cable_corner_2.json b/src/main/resources/assets/phycon/models/block/interface_cable_corner_2.json index e543990..c1ef2ad 100644 --- a/src/main/resources/assets/phycon/models/block/interface_cable_corner_2.json +++ b/src/main/resources/assets/phycon/models/block/interface_cable_corner_2.json @@ -1,9 +1,9 @@ { "textures": { - "straight": "phycon:block/cable_straight_rotated", - "cap": "phycon:block/cable_cap_end", - "corner_up": "phycon:block/interface_cable_corner_l_up", - "corner_down": "phycon:block/interface_cable_corner_r" + "straight": "phycon:block/cable/color/straight_rotated", + "cap": "phycon:block/cable/color/cap_end", + "corner_up": "phycon:block/cable/color/corner_l_up", + "corner_down": "phycon:block/cable/color/corner_r_down" }, "elements": [ { @@ -19,4 +19,4 @@ } } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/phycon/models/block/interface_cable_straight.json b/src/main/resources/assets/phycon/models/block/interface_cable_straight.json index 36f53b3..b0a73fb 100644 --- a/src/main/resources/assets/phycon/models/block/interface_cable_straight.json +++ b/src/main/resources/assets/phycon/models/block/interface_cable_straight.json @@ -1,7 +1,7 @@ { "textures": { - "cable": "phycon:block/cable_straight", - "cap": "phycon:block/cable_cap_end" + "cable": "phycon:block/cable/color/straight", + "cap": "phycon:block/cable/color/cap_end" }, "elements": [ { @@ -16,4 +16,4 @@ } } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/phycon/models/block/interface_side.json b/src/main/resources/assets/phycon/models/block/interface_side.json index 479b753..d0bf2f5 100644 --- a/src/main/resources/assets/phycon/models/block/interface_side.json +++ b/src/main/resources/assets/phycon/models/block/interface_side.json @@ -1,7 +1,7 @@ { "parent": "block/block", "textures": { - "cable": "phycon:block/cable_straight", + "cable": "phycon:block/cable/color/straight", "particle": "#front", "back": "phycon:block/interface_back", "front": "phycon:block/interface_front" @@ -13,10 +13,10 @@ "faces": { "down": { "texture": "#front" }, "up": { "texture": "#back" }, - "north": { "texture": "#back" }, - "south": { "texture": "#back" }, - "west": { "texture": "#back" }, - "east": { "texture": "#back" } + "north": { "texture": "#back", "uv": [2, 2, 14, 4] }, + "south": { "texture": "#back", "uv": [2, 2, 14, 4] }, + "west": { "texture": "#back", "uv": [2, 2, 14, 4] }, + "east": { "texture": "#back", "uv": [2, 2, 14, 4] } } }, { diff --git a/src/main/resources/assets/phycon/textures/block/cable/black/cap_end.png b/src/main/resources/assets/phycon/textures/block/cable/black/cap_end.png index 5910580410feed207d6784635473deb82cf3dc43..514c11e077316fa3fa04f784f517a83675b013eb 100644 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UASkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY0t>0)3IFPO6{&;}^MR1)MD%)n4K`K$$qm*nm4 z!tlSn|IB_MkG;gx*OmP#Gry>X!9LUFw}C=>o-U3d5|@(`7O*F@1bq7c-_SNG0R$R3 z{v@aW;7l}JxTnC}Q!>*kacdB(KmH%6fx*+&&t;ucLK6U$ CFIB(* delta 74 zcmdnOlrcfYg{dUSFPMR$Z1PzP1_lO2PZ!6Kid)GE3zR2JpFGi7a6)L{L|4%OS78u$ c;c{U{&M3xDyZ82P04iqiboFyt=akR{0H!b*wEzGB diff --git a/src/main/resources/assets/phycon/textures/block/cable/black/corner_l_down.png b/src/main/resources/assets/phycon/textures/block/cable/black/corner_l_down.png new file mode 100644 index 0000000000000000000000000000000000000000..5e623b421fc93f1b00cbfe3c790ba0286cb0babb GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UASkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY0t>0)3IFPO6{&;}^MR1)MD%)n4K`K$$qm*nm4 z!tlSn|IB_MkG;gx*OmP#Gry>X!9LUFw}C?Do-U3d5|{V(EfhRpAaFP(-m~n*KkaF* ztUo1_loS{b_db2F^{(UZo`?|T5~qtDeiMJG?hemmvQJ$mpf#uJ=^3CAswJ)wB`Jv| zsaDBFsX&Us$iT=@*T7iU&@{xz(8|=*%D_z9z`)ADpx68EEffv8`6-!cl?V+cA%>P# brUq6f<`4}VIL>$jH86O(`njxgN@xNAXO3I? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/black/corner_l_up.png b/src/main/resources/assets/phycon/textures/block/cable/black/corner_l_up.png new file mode 100644 index 0000000000000000000000000000000000000000..2c874732089bf699b03d57bdfde8a8cff508734e GIT binary patch literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UASkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY0t>0)3IFPO6{&;}^MR1)MD%)n4K`K$$qm*nm4 z!tlSn|IB_MkG;gx*OmP#Gry>X!9LUFw}C>|o-U3d5|{V(ZR9;*Akgw4)qAGW@AFf2 zA3f4{wQ1HAWG!IIf8nKfpS{6QFxjd;uq*IR(weZKyK<3tYBsS5a4Rz}at0csTH+c} zl9E`GYL#4+3Zxi}42%qQ4UBaSO+$0)3IFPO6{&;}^MR1)MD%)n4K`K$$qm*nm4 z!tlSn|IB_MkG;gx*OmP#Gry>X!9LUFw}C=7o-U3d5|{V(ZR9*)AaG>K@fki7|FWMJ zU_2b(Rl&AeM2kiJL!Ro@x6B7-By6etpTv@^khgJx_Rdqv-Lv@*-WK3zl=N8)G)J|> zHKHUXu_Vl&Jd7#Uibnp&9}Y8x0>85l6|yal=&NkeXaN@iLm hLW4<&p{13nft86FM1xrU@&7;#44$rjF6*2UngDEYTZaGu literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/black/straight.png b/src/main/resources/assets/phycon/textures/block/cable/black/straight.png index 7f78fa61e6b5a9f00937e38f42e4a6d6c8098566..6fd6a98f0bcd32eff88312551ac64a23fd918500 100644 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UASkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY0t>0)3IFPO6{&;}^MR1)MD%)n4K`K$$qm*nm4 z!tlSn|IB_MkG;gx*OmP#Gry>X!9LUFw}C;_xM}Jya-Rxv#c>eG=Q-V*x(OJ2j|8h?$@3fW?oXl5g5)dG3almhnsal@KtR`hA zv#GnB=RanBvtCm1K&IJGpxLS=t`Q|Ei6yC4$wjF^iowXh$WYh7Sl7@b#L&{p)WFKb pOxwV~%D^C9soohyLvDUbW?Cg~4Py1j{{uBJc)I$ztaD0e0synBWZVD% delta 157 zcmcb{w3cy#L_G^L0|Ud`yN`l^lw5#Mh%1nmmzP&nRaH?@k&%&+m6cUiR+f{KQ&3Ql zmX>}d>fQ%b!B`UH7tG-B>_!@pW9#YS7*fHQ%)q25%*Mgt-DuQuc_EK_u*PDEV;o^X zp3Z_Eg<_55O`JZ4J}MTnYOLaoGavH=$1Lm05i?@QI>GTO@2TP%ph*m#u6{1-oD!M< DlglZ= diff --git a/src/main/resources/assets/phycon/textures/block/cable/black/straight_rotated.png b/src/main/resources/assets/phycon/textures/block/cable/black/straight_rotated.png index c75da9fdbcc4be4a38160354ee6cc0871d9ee14e..994a81ac3b271fea334ff96cb4825c621e3dc3e8 100644 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UASkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY0t>0)3IFPO6{&;}^MR1)MD%)n4K`K$$qm*nm4 z!tlSn|IB_MkG;gx*OmP#Gry>X!9LUFw}C=7o-U3d5|{U$+bG!JAaK~>o>z40R2Rbq!5I3@xop4XjMewG9lc3=9s2mV8Iikei>9nO2Eg U!v>Bs-ariup00i_>zopr0ODX?lmGw# delta 99 zcmV-p0G$8A0)PRKBwPY?QchC<0CtnjH~;_uIY~r8RCocs!NCoHFc8E*dx=C9^j{($ zxJ5LP8Mg3pocJc=9Fuiceo|}`0~A_m>AJ1LB#$`k@c}c-6)0@Y{y+c#002ovPDHLk FV1oBKB~$CPsIMIBVixOU8e*mypsN_5Dfj>X|K!$x(m*|oB|(0{3=Yq3 zq=7g|-tI2^61x~~0y*p@p1!W^Pnr2eEe!UVF24;FlJRtL4B@z*oS-1iG1EaZQ8eJ# znz;eT7FMUs=3?MI#KNI7>uNtxoob0|L`h0wNvc(HQ7VvPFfuSQ)HN{HH8cq^w6roc rure{zHZZUL&Jf8}QFW$my68SLrm=d#Wzp$Py;L@4|K diff --git a/src/main/resources/assets/phycon/textures/block/cable/brown/corner_l_down.png b/src/main/resources/assets/phycon/textures/block/cable/brown/corner_l_down.png new file mode 100644 index 0000000000000000000000000000000000000000..577ecae4ba3205040db9d1ecb3184144413addaa GIT binary patch literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>_!@hljQC0 zB3Hzvpbg}(mw5WRvOi_!7qu|hXS)10P{_{H#W6(Ua&p1~<%E=^w8Yfp^k)xRxC#nC zfB5wAGbaa^6KhM$&Y!L>tUHe$S-|v2Xj0H6qnJ%|=A_(kXJcTH3}v$0@Jvr0Xp(A) zYeY#(Vo9o1a#1RfVlXl=GSoFN)-^N@F*39=HMKG@(>5@$GBD`%zIzKrLvDUbW?Cge ggGq>?rIo3Hm5Dh-!v>Bs-ariup00i_>zopr0HJntvj6}9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/brown/corner_l_up.png b/src/main/resources/assets/phycon/textures/block/cable/brown/corner_l_up.png new file mode 100644 index 0000000000000000000000000000000000000000..d6fdc0cddb3599c7429e755ddee3d5e1ded7a36f GIT binary patch literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>cJHuEflUN7iI2Y4cN0V4*(`Y-xK%lrIP{b_3)jZD0 z#9vo2P){k?SUuQ4B~Vu}*i^$`OFlqb;s5{tDmAM>j$|we@(X5gcy=QV#7XjYcabaN zQqTr+*h@TpUD=;9^NU&->@!_{8z^M!>Eak7aXC3*0e3=5N>W;4YVz|3EnEeKg`Yos z`dG}(;lx@|(bDp>)zxL^%*3c8M^sgoE;*W-^763@2LprT1SYLz>>ql72C0^~MwFx^ zmZVxG7o`Fz1|tI_LtO)7T|?6lBSR}w6Dwm2Z36=<1A{%5r=n0aFVdQ&MBb@075WyS^xk5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/brown/corner_r_down.png b/src/main/resources/assets/phycon/textures/block/cable/brown/corner_r_down.png new file mode 100644 index 0000000000000000000000000000000000000000..015d1b98e44b56ca7347a77a585a9b828a29273c GIT binary patch literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a> zrC?+AU;~vvUBzHi4Sy~90Bwa>2jdt=<2V3pWK?z*rLG7tG-B>_!@hljQC0 zB3Hzvpbg}(mw5WRvOi_!7qu|hXS)10P{`KP#W6(Ua&p1~?u3-2w8Yfp^k)xRxC#mj zKY#f2;UhPP6KhKg%Z?V;3Rah+2~iS9Syfe*E=f&!`PhYnfkA3IljbrBH5Z^kswJ)w zB`Jv|saDBFsX&Us$iT=@*T7iU&@{xz(8|=*%G6NXz`)ADfPv>NFno|SFVdQ&MBb@0B14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>lvp zU~{cFSMyjWlMr*Q06nEx7qehvHGfUH08P0dBefVulORKt7#n>*O}SV{;~0CRKm(N+ z2jd_k)i@WkKpn;Z|Nna~J=_3v1Y=2%UoeBivm0q3PLj8~i&pTyEAxOH_7YEDSN5mO z{Gt{H`%IVL1`4Hkx;TbNTn;_&&exzI!Vzm0Xkxq!^40j0|-RjCBo7LJTdf tObx6|%(M**tPBj&mFk^QH00)|WTsW()*x1Y{6A0wgQu&X%Q~loCICqqj++1g delta 222 zcmV<403rYN1MdNl8Gix*005AYXf^-<00wkYPE!B?00000Zl(v30001_NklZ8xih#z*ASYrN2!hpPZ#E!=`2Ry;g+0^c9u8CYQmfS5nB1tfYHh&$ zLvSOGN6bNJJZ5Vle_s0f6vFN;oX^??*zPrCN+7(m*>Et1?N|Bn-V&|`+ZgZN61+B9 z68ZgV3FGZVl!^1`Eo6dNOA)<>--U}YTy6>Tc>oI8J)w5m7^?ll1johbHMlGZi7amX Y0oW-~DgzHkKmY&$07*qoM6N<$f}1v87ytkO diff --git a/src/main/resources/assets/phycon/textures/block/cable/brown/straight_rotated.png b/src/main/resources/assets/phycon/textures/block/cable/brown/straight_rotated.png index 137948f2f6142446ee490b00c8ead906e31ec182..137ee030747b9350689f0a1ac1ccc60b737729a7 100644 GIT binary patch literal 481 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>&M z#UKL}KTWwnedQn{HGfUH06nE(bFDx_m0%O~Kplk;Q;i^fUftDnm{r-UW|@vVys delta 200 zcmaFJe3Nm4WIYoD1H*)g8D>C=tt7}V7)S#_-ZJ)yK&sEv#WAFUF-d``hv}FDv#1+G zcksjp2N5Sv>-Y5z+3CNTYpf2pRjJA>?acfwGS_1Dx9hX-me_R%xtQLY|3BvF-LT)e zX-y|>G&lk;l{stm1i!D~GO%4#T4?;DFwKQw&crK@+&j621x_yZY52;{khc9XYtlvL yi4v-F`rY?*>!syfd*}b}zT?}ihPCb@608g=DxSyYv~Rcya-yfJpUXO@geCxxvrGN} diff --git a/src/main/resources/assets/phycon/textures/block/cable/cyan/cap_end.png b/src/main/resources/assets/phycon/textures/block/cable/cyan/cap_end.png index 24b0b9bf21956e8ee2ca8205d85e9e6ef05481b7..0ce646bf8dd4a6ee25f29c5de5c8991a1f5e1a2d 100644 GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>i_@$_B=PmfZ7;K zg8YIR9G=}s196hP-CYExZsOGea@b2eeO=j~GV_aC80<4$ej6yH;_2cTB5^r6VS#c& zN>ZAmU_xs0a|gi(PaZvU6nv2S=<)L9!i=_e8LF2&p7R5!UbVzEq9i4;B-JXpC>2OC z7#SED>KYj98k&R{T3VSJSeck<8yHv_7^ExJJELgG%}>cptHiBAtp50apaup{S3j3^ HP6C=tt7}V7)S#_-ZJ)yK+4n8#WAFUFqK8aU=?rx8Sd%o=d#Wzp$PyIgfEf+ diff --git a/src/main/resources/assets/phycon/textures/block/cable/cyan/corner_l_down.png b/src/main/resources/assets/phycon/textures/block/cable/cyan/corner_l_down.png new file mode 100644 index 0000000000000000000000000000000000000000..6cf239870e73bf13303a6850a6063f35b95f539b GIT binary patch literal 452 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>l{+gt!7}jfE>z7cAFV zxXN<=TCGK^43?}lTeMbt?lO~wYcv+E3R|%weAUi`RXbx=?1)^xJ$A*8;FUXq*6a#i zwbNk!DxXz5!&mHxTCqKJ<&Nm(JAzm5^jWjZcg-&SC2M0>?+jhBU47vS{l#m{=L3ye zX|!Oq$^6x(^H=}>|KCvB;y=)C#*!evUYbzS}y%0Lc#iKnkC`%`9q zQ4528rps>wg={=s977~7CnqdWPDn{gOH55pfA*k-tDx}nhfg25Ik-5TSzTO?9#K_U zso>z40R2R zbq!5Jj0~+zO|1;fv<(cb3=Dd`@7_Yukei>9nO2F=U=m_zX=Q3)WnvD|uz}-@H&6qE Mr>mdKI;Vst0RDTKxc~qF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/cyan/corner_l_up.png b/src/main/resources/assets/phycon/textures/block/cable/cyan/corner_l_up.png new file mode 100644 index 0000000000000000000000000000000000000000..f2f8413f88329be565c9ea7effd12258585f40bd GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>l{+gt!7})A_4S=C3wd zuv%l$O7r<^^cSyDU$`Q4#rD|MJN1{W^-W{U9lr_`SzF?NMQuIx{l z`9&=Z_L(lf4HUBTba4!kxSX7@fIA^2DJ?NI`T2t(Pr zm8DBkQx-B6ed6l!I;F+6D(g$35(@)EcL=j^)KW7Yph>DFt`Q|Ei6yC4$wjF^iowXh z$WYh7Sl7@r#K_Rf)WpizLfgQ=%D`Zc<*6tX4Y~O#nQ4^>4JILmmR6<)Rwm{U4I4Pl Rcmp*sc)I$ztaD0e0s!L#ntcEO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/cyan/corner_r_down.png b/src/main/resources/assets/phycon/textures/block/cable/cyan/corner_r_down.png new file mode 100644 index 0000000000000000000000000000000000000000..f1f2e32edc9184a0ead85f4afc93ae49f45a961d GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>l{+gt!7}lZ9)v=PuJ( zxXNtNT7xBPwHB?ioWE9e!E%j-D}q<;3|g}*c;$}R6+0rAZ;x5ABVpCf@Krm*R_xGN zw90qQE}u2KLRanxUcEDV`HrX++rwAv@L9FfVE!u8`KwLluQpn+T4T{l^Z9G^7q3xY zxFU4L_Sn@s^_Q&u|NsAQxj$h*yBSM@{DK)Ap4~_Tagw~?NMQuIx{l z`9&=Z_L(lf4HUBTba4!kxSX7@fIA^2DJ?NIIsMs#7OsNA&mTU0sSB7k6@B9B@;arpD(g$35(_XOOql+^QSW&IG)c9@HKHUXu_Vl&Jd7#Uibnp&9}Y8x0>85l6|yak3Gl7`&;l+3hBga(rkLrW`D11l3Vhz7Cx S14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>fgJyLzYA{1ujq)`zd!8L)DP@%+{5OV-4#+8MEOhryyX=JVHtuH2!& zV71}Al~F5qXe?Y|J9ll|^6g zmw5WRvOi_!7qu|hXS)10P$=8e#W6(Ua&iI#vzuC)7+cDLQ^(FVDjhg^^lY=zfz!wJ z8WVPt z^2)}FFxu8KJBu(XCkqFQFd7$gdvkCz)cs<6e#gOlKG0g#64!{5l*E!$tK_0oAjM#0 zU}UIkV61Cs5@Kj+Wolq$Vy10iU}a#Cu2k=gq9HdwB{QuOw+6BLOjQD29O}e`f5z!`(1HTPYyqxf=w0VagX?JRU+a*sX!J zrknDcy<)-_f-n4!T)+}?qSnCigBKfcxi#?a3@PAE*&5h-x?{*1=*prsa61_Zmfymy zfoIiwDA0{YYv5GVfU4SMv<5x`!ToYRRd3*lF{IVUNUG-&Ghkw>s#T45vg|PL^afU* kBw7Vs4TYy5^AUXI6X6q4ihG$#6951J07*qoM6N<$g4qgW14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>n~hwGJm!5!sWUPR@%;8YdCME`TRBNOV(H}T5qvveelYi{wsF|t=ti^ zYG=gC9pNi?gs$8Xy?lGz^6lZPcE+vR>9b~6Yc$WcW5qNrMGaE)`ArV3sxB|T4TCsogvT-OIDdKUT3p# zy~e^7`U_SYELvkcf3?>969MZLDND4LxlwcuU|;HaOv8`tC!6UOpMG7O^vs2Skmvz zn3Ku&|EP^?7|?Ll64!{5l*E!$tK_0oAjM#0U}UIkV61Cs5@Kj+Wolq$VyC=tt7}V7)S#_-ZJ)yKx&q!i(^OyW0C?>50l$r*42z6 z-d7!690k17!U|q9yx%Xt#dt2ZO#ORY-6OVlH@Rz?KkEkZomqSL#Js9o8$^F8Jyxw* zUUqiMy>;?Z4<<}xn53f6AXN0=h1ezYN|tTMeou&H_APJWWRfymZ)q~m|6KFT>^*ar zEOyBhc=>$GnZ{)r8yNR(w?BI8apX!ib&D{|-g{f!kEbex3$QI_VDLZdTVHFn+!^Ft MPgg&ebxsLQ00WXz`Tzg` diff --git a/src/main/resources/assets/phycon/textures/block/cable/gray/cap_end.png b/src/main/resources/assets/phycon/textures/block/cable/gray/cap_end.png index 794161bc00820467404980c6f2536619316ba91a..20d78237d6d6595a310364d21899224c9f8c4d10 100644 GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFfz_&;cI2*Y-a6XY+?8R|Npfj`vid+7)yfuf*Bm1-ADs* zlDyqr`11D}_yalYC7!;n>`$5bMJ){WnJ&K#6q50DaSY+Oo}8c{&N0(LGVx`A+jB0B zEakt!I-ST-^0W$t!}K% zu3Q|=E$zO@WJc7@-8+6WP3&AMTPUUTHrDn}j7?1=&mxnEo0hX9ttFywFvhyhTkgil YurHi@%6vJ-#~@=pUHx3vIVCg!078T%aR2}S diff --git a/src/main/resources/assets/phycon/textures/block/cable/gray/corner_l_down.png b/src/main/resources/assets/phycon/textures/block/cable/gray/corner_l_down.png new file mode 100644 index 0000000000000000000000000000000000000000..b9582baf9ab49fc3f66029b3ac98017b2f25e2ee GIT binary patch literal 406 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>EL zBXe6bD~JF8|1Z9x76mkmu_VYZn8D%MjWiG^$=lsUocr30ejtav#M9T6{V6lQsD;5k z)8)5;LUx`mjv*44lM@ywC!{2$C8nh&r#)}rDkv)a{GsUcM{W)WR+iQs6+0_fceJ!D zWKyb$S(KFXCP_wSNwhm31H(fW#v}L2;w}MAQY~?fC`m~yNwrEYN(E93Mg~TPx(3F& zhNdA#hE}GgRt9F;1_o9J2EE>QZ=q<&%}>cpt3+rp2{E*^GBvO=F^6c_z;VVKsDZ)L L)z4*}Q$iB}s|0XY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/gray/corner_l_up.png b/src/main/resources/assets/phycon/textures/block/cable/gray/corner_l_up.png new file mode 100644 index 0000000000000000000000000000000000000000..b60475478ddbef2cc4c2d9102dfb96f514babcf2 GIT binary patch literal 405 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a> zTMHW}BXe69cV9P8e=}wg={@t977~7Cnqf6PDn{fN=r;iO@7|MRZz6C@biX`8wx)t!&WqW`Isg}4#l%yno=Ln~7gD`N|70|P4qgFTj~qEIyC=BH$)RU$N)gcw>{nHpG`m_syd;5g$A)WG2B L>gTe~DWM4fS9o-? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/gray/corner_r_down.png b/src/main/resources/assets/phycon/textures/block/cable/gray/corner_r_down.png new file mode 100644 index 0000000000000000000000000000000000000000..844f2f35ae92e193bd77eb65b2f3fa92e1c79f37 GIT binary patch literal 405 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a><{9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/gray/straight.png b/src/main/resources/assets/phycon/textures/block/cable/gray/straight.png index 7bae3dff070b61d3475e94e933d4b60d0ac6699f..0318b8ee7d04aadc6512087f18b2a482eac8592d 100644 GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>(^e={ow3mYdFcVAO0dowG07Y{#Ub6YDrXDd4w z6H7ZoGaDmwTXSniXLq0$A6HL5Q%n2*|NmPXpZf=5KGWs5fkLsKE{-7*mt)U+^ED{&ummh?)FK#IZ0z{pV7z*yJN yB*f6t%GAKh#7x`3z{Wr- z^2X5wi9SZc_qu}7z!(WDQ&KmEM>|LblHHU>LS_aj={(Qr4o|kbku(yjv;}T+G}31+ zG)4|%l?9@th!_d?T{cL{vy@iuOOmaPgp%-2siuF)a2yew?O>Z=m)>Uj0aIH~Io_e_ Q0ssI207*qoM6N<$f+yit;s5{u diff --git a/src/main/resources/assets/phycon/textures/block/cable/gray/straight_rotated.png b/src/main/resources/assets/phycon/textures/block/cable/gray/straight_rotated.png index 8f2516a8116414e5482ad08a9def6ef0fab1d10b..223569b51172a92d8743f84af5e222a5028d80b4 100644 GIT binary patch literal 438 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>|$S;_|;n|He5GTpo-9`2_ zbKyiFhrPtp*OmP#Gry>X!9LUFw}C=Fo-U3d5|{U$a};Y(;9v+8SQ{c@qP_NA{kgd5 z1=H$H8G@ahGv;nQy{nSTkU{-iWQh0OtzOyz{O8gy&vyw*UaP#rUq6f=Gq1ZRt5$K hLrcD+Xvob^$xN%ntziSl8E>El22WQ%mvv4FO#lFBe$oH{ delta 189 zcmdnSe2#H~WIYoD1H*)g8D>C=tt7}V7)S#_-ZJ)yK&si(#WAFUF-d``hsn)Yo1LLO zdEx;B2Bw1>Cd|9^zkX9uufklm@@r={om#4Gd??jw{pr~L(z8A%R|*>ozx#M+TjVjZ z8~@l1isN^!Y=7qQ>gB35#=@-Fvlq^k^n0&4@B5~p$1JmhF=x;I_?dx|=6p5^d}=MB pB70m>{QkpLk3Qxf`B5ywz|bk}yR!V&el?K0JYD@<);T3K0RTqwPBQ=i diff --git a/src/main/resources/assets/phycon/textures/block/cable/green/cap_end.png b/src/main/resources/assets/phycon/textures/block/cable/green/cap_end.png index d27673880e2d05f523f99758ecfb8e1993d9f8df..f058b67c87efec4d45ef726290b3df47650cb822 100644 GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFzm0Xkxq!^40j0|-RjCBo7LJTdfObx6| p%(M**tPBj&mFk^QH00)|WTsW()*x1Y{6A0wgQu&X%Q~loCIHw>TeAQF delta 126 zcmcb^)Xz9UqMUEakt!I-ST-@~*!AoR9? z>g)u`+X11AOm4Jk>^LgDQ(fXFi?+bhgK7~MZ4XK;QEai`{r2$HHpNqB2a6oSCq7>p a$iVQ+m3vqG!85Nw=6bsNxvX14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>mXUHKpC50 zdAm?GyHF*&P!+2{dD~EBn_xM&cq8`&BhMsLj|3C36p))> z>=viz7N>6;s_2<$VjHSz9V}-XqGTJQY#XBT|Nnpc&_#McI~YrX{DK)Ap4~_Tagw~< zUF2DL1@;0t>?NMQuIx{l`9&=Z_L(lf4HUBRba4!kxSX7@Ksg~LDJ?NAH975h16M&& z;pY#ZK7QinaA0L=ZTacq!usRrk%de`lVW;=f-V_tD*95W#2}f#P#rUq6f<`4}VIL>$jH86O(`njxgN@xNA!HRXR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/green/corner_l_up.png b/src/main/resources/assets/phycon/textures/block/cable/green/corner_l_up.png new file mode 100644 index 0000000000000000000000000000000000000000..ba004b20a97c11867c5decdf34aeced1cc25f360 GIT binary patch literal 430 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>s)14tUV#_HLGD0(EAcqW;; zCm7j)G%8yK%G(6X+l8vwg(}&Fs#yif{Qv*onWxwjXa{3SkY6x^!?PP{AWo9EyNf(4 zufSd)hrPtp*OmP#Gry>X!9LUFw}C=-o-U3d5|@(`7H}t|B&8*$CO?0W(#%y*`1!-9 zkK7zwoX)Hjm6a|mE-ptcjx1ynniO=&C}>kq(VH)YN-PWv7G+GS^&2|+fhMVzxJHzu zB$lLFB^RXvDF!10BST#SV_iej5F?5`b7=qo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/green/corner_r_down.png b/src/main/resources/assets/phycon/textures/block/cable/green/corner_r_down.png new file mode 100644 index 0000000000000000000000000000000000000000..fc06ba3e470e353dda5b9e40a31ee1efefead416 GIT binary patch literal 430 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>*yHF*&P&KPS8S5Zf_jm)hctei_6Zd#y&m>d#1S7Y2Bb#73w>W*bI6e0SWA}JN z_jn`MSUsB%McWV++Yn{j5GCtiIonWG+fYT%M3evj|C=s0cn`FLu_VYZn8D%MjWiG^ z$=lsUo|RW%FOb7t;_2(k{*;+t)WTq&>GIn^Av;eO#}J9j$q5U%6H=1W5>wNX)1EhQ z6%-W}elGa@=_9uTD@*GRi&obPm!n4(G6_uzx@5FT=1bLc0>cPNLvDUb kW?CgegGq>?rIo3Hm5CWdgIN9X|3D24p00i_>zopr0Eu07P5=M^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/green/straight.png b/src/main/resources/assets/phycon/textures/block/cable/green/straight.png index d864f0a7cde2806616cc43772052e6214f5135a1..5c5605685fed8c8b071439d038da57c841a8c0d2 100644 GIT binary patch literal 487 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>m6+rRH(yjsT6 zkj+qQ3A9bM#5JNMC9x#cD!C{XNHG{07#Zps80#9Egcw>{nHpG`m}wgrSQ!|kE7d!r dXvob^$xN%ntwF5*_#Quyxtw&hmb^nY&?@T{wRQC+@8=K@SM_{cd z1W6tvAWe{0szy)uexYz_4<|i<5OoA}i;BI6Pv2^-O4SH}NdRn){sEFXO*p*a=Nte4 N002ovPDHLkV1nLVTRZ>& diff --git a/src/main/resources/assets/phycon/textures/block/cable/green/straight_rotated.png b/src/main/resources/assets/phycon/textures/block/cable/green/straight_rotated.png index 9259cff8f77de5e0b703edda188fcc9585e0515f..88f2aaf874cba4d71ee3b17d6bea3490263e0af3 100644 GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>21sKV{|@wJ_Lcy8Jd!$k)@w zF+}3>-gE7Y4GKIA8#cWKTqFV>w343Qiww>V~YZCW*3%zDFK)g<@BCrm!R zQEX{_^J>NoHgKHr25MmNboFyt I=akR{0GV}!RsaA1 delta 194 zcmcb_e3@~AWIYoD1H*)g8D>C=tt7}V7)S#_-ZJ)yK&r#j#WAFUF-d``hso`>fGR_K z^3)FoJckp!&z;}!dw!vRvPZ7(TXBQt`b?(CuPOVKBTCip&zK+UZ?Lrb)9Na<<3E1= zoX#T5k*wMMpFuDr#N&Zq*4IaR%|6F>TM2x+=&~o@I#rirqut8hQt{r;h4Kq>j1$BD sYT54PpKy9l6LaDX+vLk}${cQt3=DDZ$Cij&sDK>j>FVdQ&MBb@0B*TS1ONa4 diff --git a/src/main/resources/assets/phycon/textures/block/cable/light_blue/cap_end.png b/src/main/resources/assets/phycon/textures/block/cable/light_blue/cap_end.png index 850d566080eaa4b2f9dffa3f1d10854dadff8376..431343bb2f2163125d8cfbf83257ff9ec46adc59 100644 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>Y!ADzdcL6!`$5bMJ@D=ZCB|5g;YFU977~7CnqdW zPDn{ga}-QSO@8hm_~6N-XO4moo<0^|uw0nY`3*xS!_!Icfa+CCTq8h@qvGsezS=nYMv}m4QLJQoS>ZhTQy=%(P0}8pP_4{|9Pd@O1Ta JS?83{1OSw%Z}9*C delta 130 zcmaFGG=*`3WHl251H*)g8D>C=tt7}V7)S#_-ZJ)yK+4n8#WAFUF@L~prgTe~DWM4fo((fw diff --git a/src/main/resources/assets/phycon/textures/block/cable/light_blue/corner_l_down.png b/src/main/resources/assets/phycon/textures/block/cable/light_blue/corner_l_down.png new file mode 100644 index 0000000000000000000000000000000000000000..6b0d83fc4bdd100fa50ade6a5eff529170db8227 GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>o)fepQ z&xW_2u&F!e*?cCr^`uqx8NcRJ7Ihce=AUU_cy{8l^F52tb}Ts4yZCJLyfaPn&o<3F z<6eKNde-T#g=bplpXpk7wtDuN+Bs+3o6q(xJ=Z$#v~lePx27{8%_q!j&wDnW@@qWl z-*oc-|NpKxZT*0@GL{7S1v5B2yO9RsBze2Ls2*lK$q(ePmw5WRvOi_!7q!qgwq2zM z6teMjaSV~ToSd*gIUyw}EipAY{n>*Su7bkPA3lBL=HTLVW_5AddGv^C%Td*(3z#k$ zZ7TZ2)#Y_c>r0^$LzDs2<&|nnoPg%2mbgZgq$HN4S|t~y0x1R~10zFS17lr7(-0#= zD^pV|12b&{11kfAUhliNP&DM`r(~v8A~cwU7+PAH8d#Z_Lo{sQIO7e}z~JfX=d#Wz Gp$P!9gPjuq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/light_blue/corner_l_up.png b/src/main/resources/assets/phycon/textures/block/cable/light_blue/corner_l_up.png new file mode 100644 index 0000000000000000000000000000000000000000..4c94fc065da748b09b5a0044345e961fea9d40c7 GIT binary patch literal 448 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>?i_dl}IMcKE?8If~+ZUd-sJr0Te9Ef&j9vZN;MS9#&1Y=t&V{$0(5t>+ zT66yY|NjvYEkZzB8B2ovf*Bm1-ADs*lDyqrR1Y(r(Prm8C387cv=b zD*D9Lr0^$3()&+Oi%6Cw*v!&LAAs+q9i4;B-JXpC>2OC7#SED>KYj98k&X} z8Csc|SQ%Sr8yHv_80@h;6@{W9H$NpatrDTZB*f6t%GAKh#2lhw1IHO}paup{S3j3^ HP614Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a> z-hB4||Nj%V+13MXWh@Eu3ubV5b|VeMN%D4gQ9aCfk{`%nFY)wsWq-=dFKVH0Y`aPi zC}ij9;us=vIXPhgcS1^1T4HK)`m+ZuTm^-nKYaSg&B4X#%14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>e**%W}mUBITzV}vVGy%`q`&_8c&+lUF=(Wu4BO&_r^0J%_mytpXpe5 z#-;v@d;KZXn)C5($NCnZZCh|QuH%G#-I?x1XIdAW32Hs1Q*}|l_Of5o$+iV&TIZkk zY&`AKaHf3rxxkiFy44q2=AUVpd&aBjbo2bP?hU6b>&`XKJ<~kzv~Sa?`q^i?7oT;i zKjYDOx@q2-p2g>^>d*iG|NmNme#tPr2{9Ao^4h-aQe7@gOY-V zicXV~!l|PwZAuDyikhuT3cAYL?Me#zN0v4yEm*N+O_S1sQ|p)YDJ@vIa%r!U!h)5H zyOkC!&u@4o?yQ_FEW#LUT+GeE%}{ofZR>{{1^hs3RZCnWN>UO_QmvAUQh^kMk%5t+ zu7RW}{iYGCkm^>bP0l+XkK DRB+G$ delta 259 zcmV+e0sQ`{1e5}h8Gix*005AYXf^-<00wkYPE!B?00000Zl(v30002VNkl^Cfig5PXwH5U>6-bJ(Uw?ki4t#<+04(qDs?1DGcs5Qs zY_{4m)N!(yQiRK~v4}vtB^~ayo()WNHufpPaW@jd-M6bTMfh-G;614Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>&eYF7(>V7` z%ltDP3(mAHIMX`+O!uNQeT&bwFFf0~^j!7qGhK_$_AEZvz4&bNywlC|&o<0GQ$G7# z>-^KLAoXWE76MH;T{HVk^Sm=w_2-@H&sfx)b8k51)pR6@ zoOh`|H=O_NUDJ zq89qbwyX4jLV=zxjv*44lM@zjC!{2$C8j1nfAHkdvxiR~izf((2#E;_iV9DkFhywk zv`G_FCrl0x2nho>z40R2Rbq!5I3@xop4XjMewG9lc3=9s2mV8Iikei>9 YnO2Eg!v>Bs-ariup00i_>zopr09BdGOaK4? delta 229 zcmV~1oi=t8Gix*005AYXf^-<00wkYPE!B?00000Zl(v300021NklA;MC>kiYhCz=JXxC@ETAe98PlL&1i^rJJ=YA3&9;FV9bVKLi+m>^Ygqb#s078QQm?gt!)(Xj%^2(8yaM~k f6(anP7%&O|FR4-=oXJIo00000NkvXXu0mjf9W`7O diff --git a/src/main/resources/assets/phycon/textures/block/cable/light_gray/cap_end.png b/src/main/resources/assets/phycon/textures/block/cable/light_gray/cap_end.png index 660a51a0af9e5b9c7a661d49fb90fff437e44d56..8abf4e754d4dbfab06897168a84b8b960c23909d 100644 GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>Fdh=l$l@D!eF22^4mZm6;Bt(5Q)pl2@8}HQj*df z1rt(}pF0RXc=G6(i{OKYPaiK|F3jk#gP}>RXUbuqdesuwh?11Vl2ohYqEsNoU}Ruq zsB2)XYiJT;XlZ3?U}a*aZD3$!V34jk delta 127 zcmaFPG?8(FWCarg1H*)g8D>C=tt7}V7)S#_-ZJ)yK+4V2#WAFUFO)%pIOZCQH)PuA5!EVtP$&xw_y|MOEdU`*yBdw^Hncf|s+OV_8*MR#22vO_5CH bJSkQNX+;rl&N=(|K_+{;`njxgN@xNAUc)O3 diff --git a/src/main/resources/assets/phycon/textures/block/cable/light_gray/corner_l_down.png b/src/main/resources/assets/phycon/textures/block/cable/light_gray/corner_l_down.png new file mode 100644 index 0000000000000000000000000000000000000000..4762e551cfa164774ee9a2bd2081c5a867cafdbc GIT binary patch literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>5hl(@94l*H8d^z5|%|NpNKYuF65fUzXVFPOpM*^M+1C&}C0 zMXrcTK^w?nFY)wsWq-=dFKS`1&vf~1ppc!Xi(`ny<>Z6~$_Xh+X^E-H>CYata1|7O z{_yGJ2W}1y2UeEW7S|oFtUFqdEMR&hG%4uP8>2^?<}8VJ=VM@yQfG4F?E51NG)c9@ zHKHUXu_Vl&Jd7#Uibnpzo{X&V?=85s0>-@S#RAvZrIGp!P# g!6d}c(#q7p%ETO^VFSk*Z=ePSPgg&ebxsLQ0CARulK=n! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/light_gray/corner_l_up.png b/src/main/resources/assets/phycon/textures/block/cable/light_gray/corner_l_up.png new file mode 100644 index 0000000000000000000000000000000000000000..d535174cf90a1b5bf71ad06c037f49f690407389 GIT binary patch literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>I%-oE$tdxY5xY~xA#+HVvy2{GhirU7SnuhB7=DPZ(y1K^N)XbEImioG;+J@%( zrnaV}w1mXegyi(3^z78+^u(;Z%($f3gp~OI|Nn>1sPqC_z*rLG7tG-B>_!@hljQC0 zB3Hzvpbg}(mw5WRvOi_!7qu|hXS)10P{`KP#W6(Ua&p1~?u3-2w8Yfp=MPfaxC#nC zfB5wA19t(p6Kh3fWowJ8OKatkgs3B`5vog14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>RdP`(kYX@0Ff!CNFxE9R4KXsbGBvd_HPkjRure@U;CTxSA0!RA`6-!cl?V+c fA%>P#rUq6fW)KZx^~e7MH86O(`njxgN@xNA;LU`a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/light_gray/straight.png b/src/main/resources/assets/phycon/textures/block/cable/light_gray/straight.png index 1a5fe173372b594d91281f590e687ae8bf0a9f46..5eedc033f3a98daed374d29cfe93d953e20c2e2c 100644 GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>ZH_!)XbF1+KR-~_`0Urs=CVb?9`;RgvQo}w5*iO+>F}Bn$*nXgp~N4g6zhYhPuYu z+`^pX^rX0?nE2$l^z5|ShMKgj)QXz&%-rW1d}l#Jwtmiqty|NmX}Mhs{l zV@Z%-FoVOh8)+a;lDE5yvQ|=#6_CST;_2(k{*;+t)WTq&>GIn^p+rv?#}J9jq32KX zH7M|~1c+T!QqtQIQ2zhFvhSBiXI568G+8TrIj0xeT5 zag8WRNi0dVN-jzTQVd20Muxfu#=3?kA%>P#rUq6fX4(b@Rt5&?O7+et8glbfGSez? VYY?kH{vW7;!PC{xWt~$(69AdDpI`t0 delta 232 zcmV8g*Y=uQ3SsY_1TfX1Jf^~IB;eLv zK6kjY8wpTOVxCl^w1T)aL-{cdCMfbqH7;eQ3J1LaAaP$30M9LDf%)Ji>e4V$-3r%? iIugp)y}(r8Uq1jW-BovID3{m(000014Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>iVjRn(~y41kQ1@yT(yg*gc+@&Et-uhNQL4z!Q4 zB*-tA!Qt7BG!Q4r+ucQ3D=Ehc$YC$>^mS!_%FHinVX)71`E8((kEe@ch{WZ+=h_(? z6nGdmY?_kEt)W-&w|+_d1a77atdE;Kk3KcXN}gNx;BbqF;nSIyoKz3*s=UL$M8r5y zL+(vv>F#&O_smaP+huoA{;N3iJnC}Q!>*kackJXamE{{fx*+&&t;ucLK6V4l9j^% delta 205 zcmX@Xe2;O0WIYoD1H*)g8D>C=tt7}V7)S#_-ZJ)yKx(q5i(^OyW0C?>57V(NIt-nc z6B`_Om{=8a8_FHUzq@Z(?y%>_mvgb5JGQH7-G6U>>_pAKntQ7hpT}g2PK?@bIsIA` zhvT-lkKWx#TvXcd(nQ?2m8 diff --git a/src/main/resources/assets/phycon/textures/block/cable/lime/cap_end.png b/src/main/resources/assets/phycon/textures/block/cable/lime/cap_end.png index cadc431775f047e51f5959628ef0020d5f176ba9..b6d345866851c182896f32055ef329d49f7c7cf2 100644 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>4@T zgp{N-N5O>D0|K)%Y_-8-!ODCJe~9os9v?iHKHUXu_Vl&Jb7+PAH8d#Z_X&V?=85pE1)jOkT$jwj5OsmALL9G7xf1m~iPgg&e IbxsLQ036C>UjP6A delta 131 zcmaFGG?j6JWDOGo1H*)g8D>C=tt7}V7)S#_-ZJ)yK+4P0#WAFUFNwMmZCb)h8`D?MdN?s)@8ZTgw?jHEDeOEPlQ7%tx0z*| f?4l=?St1M!^*;Q+=S`fF12Wyy)z4*}Q$iB}_=zuR diff --git a/src/main/resources/assets/phycon/textures/block/cable/lime/corner_l_down.png b/src/main/resources/assets/phycon/textures/block/cable/lime/corner_l_down.png new file mode 100644 index 0000000000000000000000000000000000000000..7033b8c072f872ca090bfede6d3b88c00a97131c GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>m5(BMe0&QU*uqoGyQHs~&YxJL<}_Q`O)^uu1YpFL>dDk%K?;nPQM4lYh-Ru`9}M^sgo zE=f&U$W-)+tIO+@)~c*mUka5NO3yM2%v1>e05nIn#5JNMC9x#cD!C{XNHG{07#Zps z80#9Eh8P)InVMP|m}wgrSQ!}fdf&Z;q9HdwB{QuOp}{1?(9+7(z{El N22WQ%mvv4FO#s*ciJ$-g literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/lime/corner_l_up.png b/src/main/resources/assets/phycon/textures/block/cable/lime/corner_l_up.png new file mode 100644 index 0000000000000000000000000000000000000000..54432cd8bb4a0b50663c779ff0c207a3a7aebb2d GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>m5aBUqQ~QXo;jvKtBf*A8LyS&_>mKvhJrcmWT}E)b4(BE%&TWb!+x2;Osu0(KX}r_Rq*-4r;pqmT%6qwtS(27sH!Yo zlA7{#0n;b0F0WHstGcpYeJNC8VPKeXomo#ljQJtZB-Ikvh?11Vl2ohYqEsNoU}Ruq zsB2)XYiJr`WN2k-Vr6WhZD3$!V6eyXR1}Ja-29Zxv`T~qlMq8oD^mk26LW}$4IF2@ Qff^V*UHx3vIVCg!0DdfrHUIzs literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/lime/corner_r_down.png b/src/main/resources/assets/phycon/textures/block/cable/lime/corner_r_down.png new file mode 100644 index 0000000000000000000000000000000000000000..076f1a91631bec797efde41704aad312705e4753 GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>m5*4an`LeT1UM#k9lez@ijaas(&Qd@Mwt9$#C6c{<=p3Shvfl z9d%Vb>Y{VhU+bus!O>8iqkaZQf_0AusvUOc+o~zNRbObU9{)Bi)@{?jkTH+c}l9E`GYL#4+3Zxi}42%qQ z4UBaSO+$14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>8ff%J4*}-qAqb?P{XijCGFs=^YK= z*`~(7MN8+npZ>8R)~zx!TWySwM(7;#m)c>$wN=^hNT|+HU!k3P3|qw*c8CgX)zv*3 zpnKS#Z@VVXHdTcac0xP!7`KRNANAEZ>dC)dlXtti)-fNxts3lG<+P6Y=p6QA-y$ct zO-JL1m;Uh}?rkc3+cdO}`WPG!VcRbA|Ns9vrfQRcu4gO>@(X5gcy=QV#7XjYcd@;Y z8yE@Xu$OrHy0SlI<`=clH@01+2NcTkba4!kxEy-IU8pI5f#qU#Oja#2WnvO MboFyt=akR{070{~Q2+n{ delta 257 zcmV+c0sj891d;-f8Gix*005AYXf^-<00wkYPE!B?00000Zl(v30002TNklYf6K@lbQ&muiap|?J4)nb< z+eCt}y3*>^G0zTooK=r_8XEZFTS1sG;n2)V;cgJR(c=Tc^G*g2~--Y7h*W& z)xIAY>^8rI2LABwGROyvG4#+Lb4aE?y~j-Bo=7m9=_WKV;(%bg{ukEJK-Zgw$$=f4 z#-V|ed^vw$mMhwWq~zfqj(FzqTuMoMp#j4rF%fCZ!RqT2Of^^|!?DaP00000NkvXX Hu0mjfz5{U= diff --git a/src/main/resources/assets/phycon/textures/block/cable/lime/straight_rotated.png b/src/main/resources/assets/phycon/textures/block/cable/lime/straight_rotated.png index ec4f6eb11386c50e2977e817b7653b4e795da841..8840ae70415586672b952f37fceebcdb91bf31a8 100644 GIT binary patch literal 539 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>Y2&vrG@okm(meKd}EX&v#= zKI*G?G*I_wfX-1r!y}=_M;>)&OhI^X|`xZIAts4B>HHCKQ@om>+*dZ#k zQ%`D#1?yHBo^5Kp+tmcO>acH-XWuIS|NsB6@ONcE*E5y``2{mLJiCzw;v{*yyVzdH z4U7bG*h@TpUD=;9^NU&->@!_{8z>a$>Eak7aXC3*0e3=5Qd(ka^798z9zA>b^s#t? zfQXQoprEMm^a)dhrcawVHF-jKKuAzn;MBn2>lZ|>Ub>ce;p$~`0}~@NLsR4J8@6oP zwy@usam{D;=G}I$!+?gXmbgZgq$HN4S|t~y0x1R~10zFS17lr7lMq8oD^mk26LW0? m11kfAgP|qgQ8eV{r(~v8;?}T%0xH2B)+Nc1?O+S|zsvK7&JwtJduicD>IJhhC_igvD=2;A zZ5124IO*%V^}p@QzD|egt(bLQ-``YK149x(I~F8VuV`qeW?O^`Z)2{riH7aK1e2mo zMn+UY?%6L?k(_ff<=D!#U!~++GS!m8aCh#N+Jnedwx9G_^BzBUd6KmHQ63k4!qqTR cAH*^`|0VQJ_+odf?EnA(07*qoM6N<$f=14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>D@^4$p zuycdx*411)4(shdrgLZ&*VffMTaOs-KdN_VHTSkHk~`K3Y+K2`Z5hLk|NsBLlB=5u z)X7*9XzOn5pJ)n?^r;B5V#O36K z1C=tt7}V7)S#_-ZJ)yK+4n8#WAFUF z(Wf>PH@^s5WU}Vjt-^@>|Aup&SMTV!a$xh6Iy e64@)~NwG4Vu##Y$Tb=s~WVolRpUXO@geCy(doteu diff --git a/src/main/resources/assets/phycon/textures/block/cable/magenta/corner_l_down.png b/src/main/resources/assets/phycon/textures/block/cable/magenta/corner_l_down.png new file mode 100644 index 0000000000000000000000000000000000000000..b9c9e2b043bd45d6283b8b8ca46916370b010885 GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>m55@$GBD`%zIzKrLvDUbW?CgegGq>?rIo3Hm5Dh-!v>Bs Q-ariup00i_>zopr01*14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>m5K;6- zc6bfn)}vZSj%pq|qJ8L?;lU&N`;QtPJZW^~nC_7yx(8RXZeK6BeL3f*Rh-*4h-_cS zyK@!$_D$m3mN0Eu&bsyg|Nj|nJ3j!eXDkWw3ubV5b|VeMN%D4g(b&6T>n0$Fy~NYk zmHjC*zo>=2vF$27ppc!Xi(`ny<>Z6~+zBa3X^E-H&mTN#;wt$3;nPQM4ld4a2UeG( zM^sgoE=f&!x`62uSC`i*tyNuFuf7y2u`n>qxX!F6AIAI;Xp(A)YeY#(Vo9o1a#1Rf zVlXl=GSoFN)-^N@F*39=HL)_b&^9ozGBDU?rIo3Hm5Dh- U!v>Bs-ariup00i_>zopr04Qai6951J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/magenta/corner_r_down.png b/src/main/resources/assets/phycon/textures/block/cable/magenta/corner_r_down.png new file mode 100644 index 0000000000000000000000000000000000000000..67928a4ee6b3a2649cdf9aa62bdf6520dfb6f8f3 GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>m5}mI@TAd^W4cF<=pJ0j zy8V#a(Zi}okLnycs&(|J!TzHII4T_u-f4@d|THGZ(T36buIt4<*eH_iEdlN zvtudC*2B67P8b|r$FuYQ|No5QjIu!M8B2ovf*Bm1-ADs*lDyqrH1=-Tx(Uc(FY)ws zWq-=dFKVH0Y`aPiC}ij9;us=vIXPhgcS1^1T4HK)`m+ZuTm^-nKYaSg&B4X#%>Oadml}(pr`E>Pw*#3j;%kI!C8<`)MX5lF z!N|bKP}jg%*U&V?$k58v)XLOQ+rYrez<`10Eim|yH00)|WTsUjG?;`KT3VSJSeckX VG>Fw7{}0r_;OXk;vd$@?2>_)|nS1~M literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/magenta/straight.png b/src/main/resources/assets/phycon/textures/block/cable/magenta/straight.png index 88886f60d12dafc6e553a3a57f363e8c61c09fdd..b8f3326913eab091b4e60e8ecf5c9a4942b081b8 100644 GIT binary patch literal 564 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>Wk z=iqYoE$aoh9nm;^T>r>w?rm%NwjI?veB9vh3byV4|Nmbd)_fl5dd89%8GrdRmDZ)5%cznQkBv)68nejWz2Rkg%5 zq9i4;B-JXpC>2OC7#SED>KYj98k&R{T3VSJSeck<8yHv_7^ExJJELgG%}>cptHiBA Ttp50apaup{S3j3^P6`2 delta 238 zcmVF-!r9#G(?dQpubbi4iFx*l#>aBMB2pw{bxe!5)|uW6>90{726{K zmVbr-`4`MJc|gW24R-)tq5T>ISRx2~byXeQ;m4qqUR7fX(_8_dK;1%sT{3r9DJ8nY oNEqv?s%r@WOhEzYntA-X2O%|0mZ7^}i2wiq07*qoM6N<$f_n;MdH?_b diff --git a/src/main/resources/assets/phycon/textures/block/cable/magenta/straight_rotated.png b/src/main/resources/assets/phycon/textures/block/cable/magenta/straight_rotated.png index 4ee9afed6a761dea46219ec61cdc38a64b10a564..c5dd48e992b74e5a58828c1fcd641d60d55b3664 100644 GIT binary patch literal 539 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>d- zed{{j?TZ<=tl`(Ei{!$i)o z;M1%MN~_8fUajO3GxeOaCmkj4a707XLer;BoSHl#JRl?}EO2UI@bwEKS1(;lym0lhxq*q1nW3ri z_6=J$ZClvy%(&(=d-HC)*I_`zRZCnWN>UO_QmvAUQh^kMk%5t+u7R>)nY&2eRJEa=fh98wpOBXl03cy4X6Bh(rQMu7z2PF`G!&GSKE2d2(D}dN~Shxc5 z14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>0oALPxJHzuB$lLFB^RXv zDF!10BST#SV_id&5JO8VQv)j#Gi?I{D+7acrFv%+4Y~O#nQ4`{HHg(8{}0r_;OXk; Jvd$@?2>|NJX`}!E delta 127 zcmaFGG?8(FWCarg1H*)g8D>C=tt7}V7)S#_-ZJ)yK+4V2#WAFUFEhMn(q?cojlW*YsSvhskdpj;8kB`*)MK1=R|_VRF7rL a-543Rmx`>GyxMmaWU{BLpUXO@geCw%u_*ii diff --git a/src/main/resources/assets/phycon/textures/block/cable/orange/corner_l_down.png b/src/main/resources/assets/phycon/textures/block/cable/orange/corner_l_down.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d3af90dbcdd5834104d3cab82e22ba98365e4f GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>m5BgsI$i1V1et5Sl2`ks zkL5F5?iRZ;S?=-_#VZqKuS{3G+9!QwlI+z^(W{+er}7xCPgT4$QSNv$!^vERV->6? zQW=gHFdQvmI$FZ~|Nnp1$EF*B)-#p_`2{mLJiCzw;v{*yyJ+m)uyqrV!(QU)>&pI= znP1dG-`IAQ9#F`})5S4F;&O7r0_B91q_o7;(Pr zm8DBkQx-B6ed6l!I;FKL>(!S+C5FQZ=q<&%}>cpt3+rp2{E*^GBvO=F^6c_z;VVK PsDZ)L)z4*}Q$iB}(P@<3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/orange/corner_l_up.png b/src/main/resources/assets/phycon/textures/block/cable/orange/corner_l_up.png new file mode 100644 index 0000000000000000000000000000000000000000..63a33d11ffacf84a6ccf1b324af0780258d013d6 GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>m5%+={im!~RRnW}VSmh#m}a+fE`olIjmQN(aKli_$4!|_s&pI= znP1dG-`IAQ9#F{6)5S4F;&O7r0`7#Aq_o7;o>z z40R2Rbq!5Jj0~+zO{|P9v<(cb3=H;Io{B=zkei>9nO2F=U=m_zX=Q3)WnvD|uz}-@ QH&6qEr>mdKI;Vst0I@TbumAu6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/orange/corner_r_down.png b/src/main/resources/assets/phycon/textures/block/cable/orange/corner_r_down.png new file mode 100644 index 0000000000000000000000000000000000000000..dd6fce1c03497c8716bf80cd8985934c25e4d288 GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>m56{o}zeVvfSlvv19oRM@yKGmM|SJU^tP=aIAv$WG=(; zWQI!<<*rXvJe9}r|Nno}GBXyS^^7G!e!&b5&u*lFI7!~_E*g6`Y~2Lpu$OrHy0SlI z<`=clH@01+2NbgNba4!kxSX7@fIA^2DJ?NIIsMs#7OsNA&mTU0!C8<`)MX5lF!N|bK zP}jg%*U&V?$k58v)XLOQ+rYrez<`10Eim|yH00)|WTsUjG?;`KT3VSJSeckXG>Fw7 R{}0r_;OXk;vd$@?2>>etk}UuL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/orange/straight.png b/src/main/resources/assets/phycon/textures/block/cable/orange/straight.png index f9266e33f24a5a5aa419ae13250dea6d7e7e7365..236945aa2b32738611d979552899254f89b42aec 100644 GIT binary patch literal 559 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>Xw(F` z69o*%a~W>7@t-VZJeI(4WrEDrUWpU=4A&+|9m``lmd0?oU;5Gn*`w(U$BP-S^hsO; z8lJ;&JfGp}1nFzj6;Gxy{Qv)-HEsS`pt~7Mg8YIR9G=}s196hP-Ce9L`M%@;IqW5# zzOL*~nfXO6^o?y-=>dhZJzX3_BrYc>FfhBRrHQen95{9CT%*!~lSj`sD;+p}{Ct;^ zf`W!hkCK9tmRg^Zf}*BsuabhYwtBzP0)-PxJCqhIS+l51X~D7e>l&37tX$f=%E{e3 zoZr>q{(%b|t_N-$xx(Xm;Lf2-T!)w#rYo`Q85ul~1zM|G;u=wsl30>zm0Xkxq!^40 zj0|-RjCBo7LJTdfObx6|%(M**tPBj&mFk^QH00)|WTsW()*x1Y{6A0wgQu&X%Q~lo FCIBW!zYhQa delta 242 zcmV@`Nk6~K;v?e7(om}QSg1a9cH|G?ii*fgR&0IsP=Wo55w=^WASm6 z$pHd^!(I0Gd#&sXelFve^tjm0U^%De!1hosa$5?HLn!!Cl53EODHu+U+wLyC>GmKL z?BU&8_l_-7C}>2b$i#z(LccJi*6F8&f~_5CcYIY=DEK?HR(JQkcqrH@fRgo2DD(+; suOwe$LC2D}VMvx^f$FkElCAvq1+T+W8XSFy#Q*>R07*qoM6N<$f--1srT_o{ diff --git a/src/main/resources/assets/phycon/textures/block/cable/orange/straight_rotated.png b/src/main/resources/assets/phycon/textures/block/cable/orange/straight_rotated.png index 90c2fdb5820f44a45601745ff44db33ee92d7080..929872c62c82e0664cdac2db1549a4f282c78074 100644 GIT binary patch literal 533 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>pq|a4do0crL@yVy5GX49Bt=j@0uWEo3-W!Fn1fTgiSRkKtqm>(vR;SNbF__e)=y zAaiB1{FO;^S0>6{o~CqVrpon6ve#!QU7aL%wNv!kWch2;6|YTExHLib+61Yqy%IOu z_%BV6yD~xc>Ll5#QxvXDlE2g^b){SE@&uWaX$;467>=eh9Lr-kQNVDrl<`y|!>Lln z6E$4NQyGruF&r&qJet99EQ8_y|NrKDpB)6co3SLwFPOpM*^M+1C&}C0#oChZOAe63 zUgGKN%Kns@U(`b1*mjj3P$dbS?41)yw7vCPpS^hNi~Pw{O_8sNb1! znjE{&fgGP&py8?|t`Q|Ei6yC4$wjF^iowXh$WYh7Sl7@b#L&{p)WFKbT-(6F%D~`Y hXvudJ4Y~O#nQ4`{HEiHG;|=xSxA*`6 delta 219 zcmV<103`pF1ndEj8Gix*005AYXf^-<00wkYPE!B?00000Zl(v30001?Nkli=hOrxH}}_FM$Gh4@itv$US@kKEsR1)Z+pE z^~~jpHRtKcJ}Wi{KIHV$`3bk6l0-ul5%`bDnJW7EW&v$yKUAKv+wtK+Sc{aqpa`6H z&a1gQ*f^eeIJhV%b}~DkLuh7c)$MtKpTG(cFf)b=SpZ-3dLM%=?m@tm*adNwn+x8@ VNnyU|L`DDr002ovPDHLkV1l<1Uey2q diff --git a/src/main/resources/assets/phycon/textures/block/cable/pink/cap_end.png b/src/main/resources/assets/phycon/textures/block/cable/pink/cap_end.png index 5cfa2a92147b336075e8dd5f22cda4b96cc8aa24..71d9c1fd6f66007c57ca4769761dff943edaa796 100644 GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>`sfQ)Yfq3xj>8%WngPR6JcALnJOICoE7- zNJ&a_6ii4>e(oUn;K`$BE`kppK7G7=xiF){4u&SNo+*cc>QzfzBT7;dOH!?pi&B9U zgOP!ep{{|kuAxbYp{13nft87wwt<0_fkC=by)%l2-29Zxv`X9>#Oja#2WnvOboFyt I=akR{0LgZA1ONa4 delta 132 zcmaFPG>vhBWGxc|1H*)g8D>C=tt7}V7)S#_-ZJ)yK+4*qrRS zm3I5z$K1DBWHM*<{JQrKHvVSspTBmd&y=>!UxVdkY)k)t;8bYV;1yq{Z+qSDb14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>T2S-oc+jsQN_WgHu96aAL^U;ZO_x2w>TiAE5dB(Z^d1p)d z&$Z4x+d1q1|NnWZTsc5n8B2ovf*Bm1-ADs*lDyqrR1Y(r3f%j=ZZoRk~xYzz#6flPai_;{*;CaIRVMwFx^mZVxG7o`Fz1|tI_LtO)7 zT|?6lBSR}wQ!4{AZ36=<1A|`gySGp@FVdQ&MBb@01VNqJpcdz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/pink/corner_l_up.png b/src/main/resources/assets/phycon/textures/block/cable/pink/corner_l_up.png new file mode 100644 index 0000000000000000000000000000000000000000..75ee8d05e3fdfbf6be7b3985efa01f572583d242 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>&z9aYc9=*Ho$iow7?jJt!@Yv}mXD-}7bmCmugwthxXR9Zl@0)+Vb=JAcN#`dm zJe$*Xwz%*A|Np`%6Y7DsGL{7S1v5B2yO9RsBze2Ls2*lK$q(ePmw5WRvOi_!7qu|h zXS)10P{`KP#W6(Ua&p1~?u3-2w8Yfp=MSDVaTR?2@af}cE)FhEXI2-NqeoO#mM*DG zO^8Z)`b1P@>XRv14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>_ut!h^uf_n500F?fAIM2ZTrqPO+VW?>s;&1vnBoK`sbZ%o^iIY@815S zk4~IB-!k+6|NnBIrGEl#Wh@Eu3ubV5b|VeMN%D4gQ9aCfk{`%nFY)wsWq-=dFKS`1 z&vf~1ppdPni(`ny<>Z6~+zBa3X^E-H>CYata1|7O{_yD|HwPD|GpmbB>yaa^Dk@8t zBu1sAJbfZ6GIdJmi^nb;3=AojOouHz<$&SDpjzS@QIe8al4_M)lnSI6j0}tnbq$Pl z4NXIg46RH}txOHI4GgRd3>bLc0s{?6LvDUbW?CgegGq>?rIo3Hm5CWdgIN9X|3D24 Mp00i_>zopr0N0?Z{Qv*} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/pink/straight.png b/src/main/resources/assets/phycon/textures/block/cable/pink/straight.png index ef1cd354be59765a3f6743f7768be5f36083b55f..7b2b0c716023fa8c16fab4d4773ccb3e88e1ba7a 100644 GIT binary patch literal 536 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>LnbWoK(9-#c*pLf`zeS)J$ede3&w zzPJDAxz?Fy8>ZdayzhL^ytCPzcXuB;*EZ{H)AYN04xj6o{qWeCv-MNYwamD;@5saB zXU>&R`v3pGb-h^w(20yCL4Lsu4$p3+fjCLt?k*-PH@^G}Nl&Jb7+PAH s8d#Z_X&V?=85pE1)jOkT$jwj5OsmALL9G7xf1m~iPgg&ebxsLQ0Mv`&?*IS* delta 264 zcmV+j0r&ox1egMl8Gix*005AYXf^-<00wkYPE!B?00000Zl(v30002ZNkl7)sD$wBzIb`kK>Pl_y*IY;vmuJ^Z#6@L*!^*fsUK$xvWgoJ6j z_H{Vhmpnz(14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>zIAE zY{I$b8E3OQ&o)du+d2DeR_EE8$>(P*Iomw#T>rfDr4uepS$wW>`h`i0?(I8rXV<~I zdk){*fAs$06Za1uzjxr+gQKS&ojm*C(22*V&fPzB;?DN{509RHc>K)6V`uK}J92mT zp*x%R-8*pn{^66ix9>k!KIv@z)H9|1XPc&Fdh=l$l@D!eF22 z^4mb6Ku;IP5Q)pl2@ALrQj*dVQ5nM69hzr!~_LJg{M!LA~b#4#Hq;> z!UIGCgTy8V3Qi6X6%7hb3AldY%B5=;uUbP0l+XkKqS)1- delta 232 zcmV1bhcXvO9+))9ag0Q{*;HYc&AJB}T*Mf^z znD=RQrca+Z?BeYwZY=cWn`Q$%-QLxdkqDWpfiS3*p_Y)a`eCT5t$sJTkbnMK2+!pf@AHH#Oj)P7*yoXWM in^3Kd2>&Aji~;}&lT@Q#@=S;T000014Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>mp{kNx?I>kE|EPxae7#d}|Y(uP`tEhXw3bL7{jNo@H4|Nmi?BA^Wn zj3q&S!3+-1Zlr-YN#5=*f{(V^?gDbyOFVsD*`G4=i&_}$GhKcgD5T=);us=vIXPj0 zazaW{nxkMsYVvaj!3R$sJ#!R%@bt0xg5|=D&Tkkx8Jzm0Xkx zq!^40j0|-RjCBo7LJTdfObx6|%(M**tPBj&mFk^QH00)|WTsW()*x1Y{6A0wgQu&X J%Q~loCICcMYk&X% delta 130 zcmaFGG=*`3WHl251H*)g8D>C=tt7}V7)S#_-ZJ)yK+4n8#WAFUFuWFWb zu&P14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>l{+gt!9fESYs_l56u6 zHdO0v%9Y1Gj z2K!8x-v$cVc)B=-NL)@%SfHGcl9ZO1nw!C8<`)MX5lF!N|bKP}jg% z*U&V?$k58v)XKn2+rYrez@XRr?kyAzx%nxXX_W{KCLxBFR;C74Cgu14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>l{+gt!9fGOZ0|nj1>g zHfG7LuhQ9AsInjduX!9{t2!Jrupuhi5nJ-apxE|74GS*|HnTG&bcZtjSZ@P@%o4Saox*{Dx}1 zO=*&Avt-u&|NsA{$Ge$8yBSM@{DK)Ap4~_Tagw~?NMQuIx{l`9&=Z z_L(lf4HUBTba4!kxSX7@fIA^2DJ?NI`T2t(Prm8DBk zQx-B6ed6l!I;F+6D(g$35(@)Ek1DgsWjXHvph>DFt`Q|Ei6yC4$wjF^iowXh$WYh7 zSl7@r#K_Rf)WpizLfgQ=%D`Zc<*6tX4Y~O#nQ4^>4JILmmR6<)Rwm{U4I4Plcmp*s Nc)I$ztaD0e0sx`il}P{q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/purple/corner_r_down.png b/src/main/resources/assets/phycon/textures/block/cable/purple/corner_r_down.png new file mode 100644 index 0000000000000000000000000000000000000000..62cb9836cb4f0e0b3e490dcfdf49df455deba3f6 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>l{+gt!9fGL20+3TyHd zHdJVDDpuW`E5D&yZ&RA&+ANuM6I>7UyBwV8wtt%czNy~(ruy%l8N7e8*Z#>K`?6&> z^w=Nlu{|`|WB)YYeUm))Pxak9#dCkJ-GL(2^<`Qc$}~5WsBO%WU0?NMQuIx{l`9&=Z z_L(lf4HUBTba4!kxSX7@fIA^2DJ?NIIsMs#7OsNA&mTU0;$O zsSB7k6@B9B@;arpD(g$35(_X;7@0oL-(^t>G)c9@HKHUXu_Vl&Jd7#Uibnp&9}Y8x0>85l6|yak3Gl7`&;l+3hBga(rkLrW`D11l3Vhz7Cx14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>Z3mne4THg46yIjSbn-o2CcupW?l*NM&P{&c;a|`zL$v zD^%W4thRo#=Ygrd`?6%#H5hN45wv%*$NoCQE%}P;r~2)k=&`>-b4!}Ux-^LmrJ5Ti zd+wj;v9DNlW2fbja?Q=Dl56{&4wk5GELPb#(e*%)>iTTC^%GoxF4>nYx2{xU;{->b z$@>eGHWaIFnC8DfTW-Vu|Nq~u&1zJDw>gkAx%#dI3~TTH(ZtQ_nC}Q!>*kacdB(KmH%6fx*+&&t;ucLK6TP CWyV7Q delta 247 zcmV(BW*bdn^CgD}54R>W$ii(3{*PAVkR7wJ|g9?nkgR6T!?ko7hUDf!NFARD?r>mp9c;(}k+WR@$!Q^N`#; xMkwv;ldM(`5td7alFVol>|p97AVwefiFeUsTOR^agfsvE002ovPDHLkV1n73Xes~z diff --git a/src/main/resources/assets/phycon/textures/block/cable/purple/straight_rotated.png b/src/main/resources/assets/phycon/textures/block/cable/purple/straight_rotated.png index bd950e762d5562ca00ddab6cc1a583fec84f7061..2c4e9860001c4b4ffeebebf37cc4b70fd835436e 100644 GIT binary patch literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>aQ|el{XMparugii=D&ZcFHqUOey4+-mPaOf z?3?JZe=<<9@4m_2`zAQ;@3lLaEw`aSX+yT$x+2x}C2AYXH8&TlZcLNdP@%b{&TvbX z%(^0#jU^fza^%+K$gThX|9{%yfC)fHGnNGT1v5B2yO9RsBze2LSov`t0r{7`#M9T6 z{V6lQsD;5k)8)5;LV=zxjv*44lM@zjC!{2$C8j1nfAHkdvxiR~izf((2#E;_iV9Dk zFhywkw24!bCxi!xgan063=9pvE^zgVP~wGa7q4D6H!v|WGfXu$-o9Z;zcXXOKeoRs zIaVGA8m?O68c~vxSdwa$T$Bo=7>o>z40R2Rbq!5I3@xop4XjMewG9lc3=9s2mV8Ii ckei>9nO2Eg!v>Bs-ariup00i_>zopr03+PHt^fc4 delta 226 zcmV<803H951oHuq8Gix*005AYXf^-<00wkYPE!B?00000Zl(v30001}Nkl(OrCq~CbsopcnOoWABl-qS=4RW$hlQDr z+hC#t>(kqcux~|MNKjP_Eryz;jm5vd{05J%*OVv}=cND8EVIMj#~D7}+mwW)c&keV ch{+lL0d?w7hdpK%O8@`>07*qoM6N<$f{rm`od5s; diff --git a/src/main/resources/assets/phycon/textures/block/cable/red/cap_end.png b/src/main/resources/assets/phycon/textures/block/cable/red/cap_end.png index 816d332c3dc2ddeb9767d150efd7c4ff978b3740..328932b4b6da2adb50fec43e3ed1e18923e533bd 100644 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>T3kwXHnrM+~ix>RD~$R^K71vrRyA8@t*L29^K+|9@qiqX*Q< zSQ6wH%;50sMjD8dx&eDLJaGe^M(PalgfST4-y{Dz^E;pwDzK=rC6t`Q|Ei6yC4$wjF^ ziowXh$WYh7Sl7@b#L&{p)WFKbOxwV~%D^C9soohyLvDUbW?Cg~4Py1j{{uBJc)I$z JtaD0e0ssXHWx)Ud delta 130 zcmaFGG=*`3WHl251H*)g8D>C=tt7}V7)S#_-ZJ)yK+4n8#WAFUFh=%Q zGNTo_qF0r?4)f{t914Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>m5+gVkQ=vp4rwK{2JbJWo0h`!}9L+c~j7RNNLj%rzM z?(YHnjy z-Nvu6RY+s2u-5H=O_NUDJ zq80}GOqbsV3fXwNIEF}EPEJ^$oRE@~mYABH{_H^uS3%+D51&4Ab8vAwv%0t(J))|z zbV+K;LZ+fmTwPwLv{q%k`ckOGP?)FK#IZ0z{pV7 zz*yJNG{nfz%GA`#z)ah~z{Q2398K5DgnR&Ugbg OFnGH9xvX14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>m5WH?*F+=Mk`j$rxZB8259MiQrqHDRGRdu_d)+SEXZJg@cMYMPFYHnv& z+a|8Hg-K;AtLp#%|D~jD76GkiED7=pW^j0RBMrn!@^*L8*t=otCLo8s#M9T6{V6lQ zsD;5k)8)5;LUx`mjv*44lM@zjC!{2$C8j1nfAFM!C8<`)MX5lF!N|bK zP}jg%*U&V?$k58v#LC!0+rYrez+jK%sVEc;x%nxXX_W{KCLxBFR;C74Cgu14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>m5JeMH~#sG-eCBb#HoR!4L#w*zI> zERL$0AJwrqs%3T5!1Ab$sp>Lu-VC@`TzfaCAa&FfYvjX1o;IsI6S+N2I3@nySr%Y-LQ2Nki%Z$>Fdh=l$l@D z!eF22^4mZmJ5LwK5Q)pl2@ALrQj*dVQ34w7nh?)R8^KP zNljVERP>3f%j=ZZs;pOE3YAzG7&_FM1%kBJ^a4#%Epd$~Nl7e8wMs5Z1yT$~21bUu z2FALErXfa#R;H#_riR)E237_J3_Ndv!H1+FH$NpatrDTZB*f6t%GAKh#0;WAtp50a Ppaup{S3j3^P614Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>scSs zw%E$9x}8V;sH*u9HS;a(syoDWj_Fz*)->NLsJW9_<%FTlQ9Y~eyc*j?HIM389@Vqn z#-p}{U;Vg_)iHhRt*okBWwehPTOZT0+##jAl}qi2q4iN6tDQnxTN#vgFsN)5(mbkb zd05wKJDWGb33p4F)fR&d>UKX)sARc9M-Yi!mhSW zQ1gg}*>QdAZQSbH_%x1cSsXX8-p;1>|Nnoz8jc@8*E5y``2{mLJiCzw;v{*yyVzdH z4U7bG*h@TpUD=;9^NU&->@!_{8z_|J>Eak7aXIvayHHaA1Ixw!hDj597*ASCIX?XN ze3O^C&-z_*iu+gao}EzortCQ5hb9fi6J5L5FO(c+*^qOb)k4NUo#Fi>c7}y|E)0c} z(inC|O<@SVyM-b4EdS?_3x%nxXX_dG&h}9qe57fZm M>FVdQ&MBb@0C~f+e*gdg delta 241 zcmV@@y=WCpSRIu0gaJGdW1m;L|@VU$6fA!z_=?^W*r;e#}+7={GeVw zSA#IW5d1*9i?)Ub+L^tD%h#9@%ZN|67V>1tj|ABTG(5alAZiQ0^*(5S)~3iB=Uc4> zu0LED={0)`&!74z317eW7EU%12|j4X`d&!O!>4An7V0TU=T+xr`s`LCSx1}900000NkvXXu0mjf+bw50 diff --git a/src/main/resources/assets/phycon/textures/block/cable/red/straight_rotated.png b/src/main/resources/assets/phycon/textures/block/cable/red/straight_rotated.png index 7d850ca77fe854b5a68d8eed8c0839c689932e59..100f11e27c1ebabd761cb7e8b22ef722fab5878d 100644 GIT binary patch literal 539 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>*M;?hjlEE0TpXloKP@3 z43yHbItCQcw?3+8eOS}{h?@BkZHw(}YTLNgx3H^i<Cuen1=YdfFD4hEH-LRved zbhomqZsP$uPh+c~<`#C{esBVOV<)FT)k{=U}9uuXllHD!r%r delta 211 zcmbQu@`Q1MWIYoD1H*)g8D>C=tt7}V7)S#_-ZJ)yKx(F^i(^OyW0C?>57V*S8Yzap zWsfc-YP3a`S0)3IFPO6{&;}^MR1)MD%)n4K`K$$qm*nm4 z!tlSn|IB_MkG;gx*OmP#Gry>XzOn5pJ)n?@r;B5V#O36K1?&ke0qJ#hf+oocAkfHB zb2;6HJJHZ_#ebci0I`tP14rNQfBDEogMs0|CypCc%e6KF^{bY+MwFx^mZVxG7o`Fz z1|tI_LtO)7T|<))LrW`D11l3VZ36=<1A}y>dS?_3x%nxXX_dG&h}9qe57fZm>FVdQ I&MBb@0HY9AivR!s delta 79 zcmdnRlsiGilc^-gFPMR$Z1PzP1_lN-PZ!6Kid)GE3zRL2OP*_rG&;-MzjYV1`0@3# jqex@-@o(=IEEi^cu$t$6z~cTspbiF4S3j3^P6$y diff --git a/src/main/resources/assets/phycon/textures/block/cable/white/corner_l_down.png b/src/main/resources/assets/phycon/textures/block/cable/white/corner_l_down.png new file mode 100644 index 0000000000000000000000000000000000000000..bcd61d08d4c58cac1d59a3c00d2faeb4a65363d8 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UASkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY0t>0)3IFPO6{&;}^MR1)MD%)n4K`K$$qm*nm4 z!tlSn|IB_MkG;gx*OmP#Gry>XzOn5pJ)n@Yr;B5V#O36K1?&ke0lWVde5!qt@b^>u zbXKJUDQAy-{H=eQpN&negW-4ofBSmlzX`wovM+1;f4ng78-I*XPf4K$Geek?;N_sT zlk0%Ssg}4#l%yno=Ln~8LD+4oa0|P4qgI@2uw@@_X n=BH$)RU$N)gcw>{nHpG`m_syd;5g$A)WG2B>gTe~DWM4fQGQ}S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/white/corner_l_up.png b/src/main/resources/assets/phycon/textures/block/cable/white/corner_l_up.png new file mode 100644 index 0000000000000000000000000000000000000000..c6b3ab7136a5e5952a209e17b808b3d2936be755 GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UASkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY0t>0)3IFPO6{&;}^MR1)MD%)n4K`K$$qm*nm4 z!tlSn|IB_MkG;gx*OmP#Gry>XzOn5pJ)n@Mr;B5V#O36K1?&knAOGJsZ=4^0*797G zu>lZl(Dy#8Ki7+te zUlilMoLO1`G*q?3HKHUXu_Vl&Jd7#UibnphcIXd4(<85r!b sJQanaAvZrIGp!P#!6d}c(#q7p%ETO^VFSk*Z=ePSPgg&ebxsLQ0H^n5>;M1& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/white/corner_r_down.png b/src/main/resources/assets/phycon/textures/block/cable/white/corner_r_down.png new file mode 100644 index 0000000000000000000000000000000000000000..4a7957422874210802406f1c96e894f487eb9b0f GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UASkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY0t>0)3IFPO6{&;}^MR1)MD%)n4K`K$$qm*nm4 z!tlSn|IB_MkG;gx*OmP#Gry>XzOn5pJ)n@Mr;B5V#O36K1?&knA7{2c|IYu<|9<2h z2@r_5A}L|<&tUVvALUYunqHpIUncLfzy9C0 tTc9V9H00)|WTsUjG?;`KT3VSJSeckXG>Fw7{}0r_;OXk;vd$@?2>`*xX1)Lb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/white/straight.png b/src/main/resources/assets/phycon/textures/block/cable/white/straight.png index 67246a37525b9d2a663a938e574a44796a4f5dc2..6d1d607eb109b3e3d3ab75cdf2540b3f38186674 100644 GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UASkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY0t>0)3IFPO6{&;}^MR1)MD%)n4K`K$$qm*nm4 z!tlSn|IB_MkG;gx*OmP#Gry>XzOn5pJ)lsAr;B5V#O2U)wpx2XJI zT)~#Vh%ad6jq6rdRD%zh1Fda1J3l+Kl=J;W@5w^7+Oh}V&2lkdHDHdS?_3x%nxXX_dG&h}9qe57fZm M>FVdQ&MBb@0Q0_TSO5S3 delta 141 zcmV;80CNBC0;vIzB!2>QQchC<0CtnjH~;_uVo5|nRCobYPJ&>v`LD6NlKz z=&jxHI(y;ZL@)ctw5qy591UFn(Mx6q#8#OJb{N+I;vDq_h@n$kAnMArfLLld2V!E1 v4MrrxV>2nI_>_w-mQp{)hzR}LAS?g{JT`u%k?dRm00000)3IFPO6{&;}^MR1)MD%)n4K`K$$qm*nm4 z!tlSn|IB_MkG;gx*OmP#Gry>XzOn5pJ)lsKr;B5V#O1x`PVzP=2rwMj+acX4|8l={ zvhF^U6)g;j8@ZP^G5%oAn`5H)ZqD`SUftDnm{r-UW|V)$lP delta 119 zcmV--0EqwC0+a!eBya+BQchC<0CtnjH~;_uO-V#SRCocs!37b3P!s^Lr-yt0G)NXs zaCch#4UE8o7kdb_b<@!vvf0D#Ap-tB;p?@}&BN_G@VRV$kzY7ol}b*V<(e|9wuu%5 ZBYw+*9e;tjGJOC5002ovPDHLkV1g?;G2Q?G diff --git a/src/main/resources/assets/phycon/textures/block/cable/yellow/cap_end.png b/src/main/resources/assets/phycon/textures/block/cable/yellow/cap_end.png index 4969f3555ee24485258f43bea95de8ae203d3c38..5509046544437d6d67bef0444f043e8a3f8be749 100644 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>i;oLWc;lKoj|NsB54oN%? z)X7*9XzOn5pJ)n?^r;B5V#O36K z1C=tt7}V7)S#_-ZJ)yK+4P0#WAFUF@6A-&)e87GLe~at|V*subXpMRWCOdOh3#s?XvaOb8iCfn>WwY;QcMm{dVr*o%vjc f8#z;|vP2jdqI1Q$yKLl(K&E@T`njxgN@xNALu@X5 diff --git a/src/main/resources/assets/phycon/textures/block/cable/yellow/corner_l_down.png b/src/main/resources/assets/phycon/textures/block/cable/yellow/corner_l_down.png new file mode 100644 index 0000000000000000000000000000000000000000..02040d166e5ad2ce8c9c03df0ff225f353e445d7 GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>m5GamoZhZ>c8A)9{n}@CX`SAwadx-X>1`@!wn0$Fy~NYk zmHjC*zo>=2vF$27ppcEHi(`ny<>Z6~$_Xh+X^E-H>CYata1|7O{_yD|HwPD|Gpmcs z(IcuVOP8dkEMzMB#MR|>N^4ctt1pF045eq81!gJ)e*l`JTH+c}l9E`GYL#4+3Zxi} z42%qQ4UBaSO+$14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>m5pcK>{L6o zNq+AvwliCm&u&pVy-nrpZmrWhHO}nPy0BmS><+cl+tv0@Vc0j9Yu6OUebX5C&Eq{d zn|1#*p!ouO`Wg04X88aA|BsXJL4IQ_3GxeOaCmkj4a7# zDKo#Qg}$-vDm|c(ou`Xqh{WaOgazCQDM@LGsmaeDJZa)8`26A1M{W)-&Ta=*m!n5i zRhBMEO?kS2=@VC%*D0-4U0JWb6e_VWFwD5ltS2AF{19l8YKdz^NlIc#s#S7PDv)9@ zGB7gKH89pSGz~E_v@$iZGPck*Ft9Q(*kgGr3PnS1eoAIqB|?Kqh@qvGsezS=IYh$- Sjx*js4Gf;HelF{r5}E+s;hY5k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/yellow/corner_r_down.png b/src/main/resources/assets/phycon/textures/block/cable/yellow/corner_r_down.png new file mode 100644 index 0000000000000000000000000000000000000000..4e791eb9b97607c6802960d6c4b387e196d1416a GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>m5B-AzR5rX`3}rv z**lTp)Hb#AyEPBaV)_67zbfCchd}EYOM?7@862M7NCR<_yxmf&NF!+!(FVdQ&MBb@0J4Ud?*IS* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/phycon/textures/block/cable/yellow/straight.png b/src/main/resources/assets/phycon/textures/block/cable/yellow/straight.png index b49453f1a939997d46fb8c002185a7c86306cdbb..90d0f6afc04f34d9bbcf409ea30a10610843a3bc 100644 GIT binary patch literal 561 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>Wzps%N&V z@0-c8dltvJ9ja${YV4iNuxF|0nLRpZcc|`PBD{Ax)9IaBXSS&xoX@p)0>gm`414Bq zp8=Y-Rc-%lwtX{LE^Lt4Kc9O~AH$h#DrdGR?w`%Re-`W6?aF&+vYp|`>%mV-b delta 244 zcmVudnaxI@aJ0e_nCHPbF;Or`B01K?)vQ6GjR um#O!dO1pc2r@UF-Vm|mJ4MxuOz4{614Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>l+_|0V=k{ox+of@8tLoY9%4fDH zUf3XUYOC6rZK`K?sGi-aab~;vsVz#UH_4ygrm}wu&|c;}lNt8TWZOTRegAy!{j=E) zOkg-TpKJdT;e9h%_RnP9Gn;GA6o$Q1822OC7#SED>KYj98k&R{T3VSJSeck> o8yHv_7#s{O`HrF?H$NpatrE9}4IF2@ff^V*UHx3vIVCg!0QmsI3jhEB delta 217 zcmV;~04D#K1nL2h8Gix*005AYXf^-<00wkYPE!B?00000Zl(v30001=Nkl