From cd5ee1d2bb59f07647672657e17e5606c7f00517 Mon Sep 17 00:00:00 2001 From: CoderJoe Date: Mon, 16 Mar 2026 23:20:18 -0500 Subject: [PATCH 1/7] Extract pullPowerFromNeighbors() into PowerBlock The same ~12-line power-pulling loop was duplicated in CobblestoneFactory, ObsidianFactory, SmallDrill, and AutoSmelter. Move it to a shared protected method in PowerBlock and replace all four copies. --- .../kotlin/com/coderjoe/atlas/power/PowerBlock.kt | 15 +++++++++++++++ .../coderjoe/atlas/utility/block/AutoSmelter.kt | 15 +-------------- .../atlas/utility/block/CobblestoneFactory.kt | 15 +-------------- .../atlas/utility/block/ObsidianFactory.kt | 15 +-------------- .../coderjoe/atlas/utility/block/SmallDrill.kt | 15 +-------------- 5 files changed, 19 insertions(+), 56 deletions(-) diff --git a/src/main/kotlin/com/coderjoe/atlas/power/PowerBlock.kt b/src/main/kotlin/com/coderjoe/atlas/power/PowerBlock.kt index 2ecea3a..5b9ba4f 100644 --- a/src/main/kotlin/com/coderjoe/atlas/power/PowerBlock.kt +++ b/src/main/kotlin/com/coderjoe/atlas/power/PowerBlock.kt @@ -28,6 +28,21 @@ abstract class PowerBlock( return toRemove } + protected fun pullPowerFromNeighbors() { + if (!canAcceptPower()) return + val registry = PowerBlockRegistry.instance ?: return + val neighbors = registry.getAdjacentPowerBlocks(location) + for (neighbor in neighbors) { + if (!canAcceptPower()) break + if (neighbor.hasPower()) { + val pulled = neighbor.removePower(1) + if (pulled > 0) { + addPower(pulled) + } + } + } + } + protected abstract fun powerUpdate() override fun blockUpdate() { diff --git a/src/main/kotlin/com/coderjoe/atlas/utility/block/AutoSmelter.kt b/src/main/kotlin/com/coderjoe/atlas/utility/block/AutoSmelter.kt index 20a0d53..63489dd 100644 --- a/src/main/kotlin/com/coderjoe/atlas/utility/block/AutoSmelter.kt +++ b/src/main/kotlin/com/coderjoe/atlas/utility/block/AutoSmelter.kt @@ -4,7 +4,6 @@ import com.coderjoe.atlas.core.BlockDescriptor import com.coderjoe.atlas.core.CraftEngineHelper import com.coderjoe.atlas.core.PlacementType import com.coderjoe.atlas.power.PowerBlock -import com.coderjoe.atlas.power.PowerBlockRegistry import org.bukkit.Bukkit import org.bukkit.Location import org.bukkit.block.BlockFace @@ -50,19 +49,7 @@ class AutoSmelter(location: Location, facing: BlockFace = BlockFace.NORTH) : Pow override fun getVisualStateBlockId(): String = BLOCK_ID override fun powerUpdate() { - if (canAcceptPower()) { - val registry = PowerBlockRegistry.instance ?: return - val neighbors = registry.getAdjacentPowerBlocks(location) - for (neighbor in neighbors) { - if (!canAcceptPower()) break - if (neighbor.hasPower()) { - val pulled = neighbor.removePower(1) - if (pulled > 0) { - addPower(pulled) - } - } - } - } + pullPowerFromNeighbors() val world = location.world ?: return diff --git a/src/main/kotlin/com/coderjoe/atlas/utility/block/CobblestoneFactory.kt b/src/main/kotlin/com/coderjoe/atlas/utility/block/CobblestoneFactory.kt index 5376df4..cf4c71e 100644 --- a/src/main/kotlin/com/coderjoe/atlas/utility/block/CobblestoneFactory.kt +++ b/src/main/kotlin/com/coderjoe/atlas/utility/block/CobblestoneFactory.kt @@ -10,7 +10,6 @@ import com.coderjoe.atlas.fluid.block.FluidMerger import com.coderjoe.atlas.fluid.block.FluidPipe import com.coderjoe.atlas.fluid.block.FluidPump import com.coderjoe.atlas.power.PowerBlock -import com.coderjoe.atlas.power.PowerBlockRegistry import org.bukkit.Location import org.bukkit.Material import org.bukkit.block.BlockFace @@ -55,19 +54,7 @@ class CobblestoneFactory(location: Location) : PowerBlock(location, maxStorage = } override fun powerUpdate() { - if (canAcceptPower()) { - val registry = PowerBlockRegistry.instance ?: return - val neighbors = registry.getAdjacentPowerBlocks(location) - for (neighbor in neighbors) { - if (!canAcceptPower()) break - if (neighbor.hasPower()) { - val pulled = neighbor.removePower(1) - if (pulled > 0) { - addPower(pulled) - } - } - } - } + pullPowerFromNeighbors() if (currentPower < POWER_COST) return diff --git a/src/main/kotlin/com/coderjoe/atlas/utility/block/ObsidianFactory.kt b/src/main/kotlin/com/coderjoe/atlas/utility/block/ObsidianFactory.kt index ad724a8..3e7ed81 100644 --- a/src/main/kotlin/com/coderjoe/atlas/utility/block/ObsidianFactory.kt +++ b/src/main/kotlin/com/coderjoe/atlas/utility/block/ObsidianFactory.kt @@ -10,7 +10,6 @@ import com.coderjoe.atlas.fluid.block.FluidMerger import com.coderjoe.atlas.fluid.block.FluidPipe import com.coderjoe.atlas.fluid.block.FluidPump import com.coderjoe.atlas.power.PowerBlock -import com.coderjoe.atlas.power.PowerBlockRegistry import org.bukkit.Location import org.bukkit.Material import org.bukkit.block.BlockFace @@ -55,19 +54,7 @@ class ObsidianFactory(location: Location) : PowerBlock(location, maxStorage = 10 } override fun powerUpdate() { - if (canAcceptPower()) { - val registry = PowerBlockRegistry.instance ?: return - val neighbors = registry.getAdjacentPowerBlocks(location) - for (neighbor in neighbors) { - if (!canAcceptPower()) break - if (neighbor.hasPower()) { - val pulled = neighbor.removePower(1) - if (pulled > 0) { - addPower(pulled) - } - } - } - } + pullPowerFromNeighbors() if (currentPower < POWER_COST) return diff --git a/src/main/kotlin/com/coderjoe/atlas/utility/block/SmallDrill.kt b/src/main/kotlin/com/coderjoe/atlas/utility/block/SmallDrill.kt index 58822b5..95b75b0 100644 --- a/src/main/kotlin/com/coderjoe/atlas/utility/block/SmallDrill.kt +++ b/src/main/kotlin/com/coderjoe/atlas/utility/block/SmallDrill.kt @@ -3,7 +3,6 @@ package com.coderjoe.atlas.utility.block import com.coderjoe.atlas.core.BlockDescriptor import com.coderjoe.atlas.core.PlacementType import com.coderjoe.atlas.power.PowerBlock -import com.coderjoe.atlas.power.PowerBlockRegistry import org.bukkit.Location import org.bukkit.Material import org.bukkit.block.BlockFace @@ -41,19 +40,7 @@ class SmallDrill(location: Location, facing: BlockFace? = null) : PowerBlock(loc override fun powerUpdate() { if (!enabled) return - if (canAcceptPower()) { - val registry = PowerBlockRegistry.instance ?: return - val neighbors = registry.getAdjacentPowerBlocks(location) - for (neighbor in neighbors) { - if (!canAcceptPower()) break - if (neighbor.hasPower()) { - val pulled = neighbor.removePower(1) - if (pulled > 0) { - addPower(pulled) - } - } - } - } + pullPowerFromNeighbors() if (currentPower < 10) return From 9bbf5ba1d9bdaebaffa798f602cdc3904e1b9664 Mon Sep 17 00:00:00 2001 From: CoderJoe Date: Mon, 16 Mar 2026 23:22:30 -0500 Subject: [PATCH 2/7] Extract updatePoweredState() into PowerBlock The same 3-line method was duplicated in PowerCable, PowerSplitter, PowerMerger, and AutoSmelter. Move it to a shared protected method in PowerBlock and remove all four private copies. --- src/main/kotlin/com/coderjoe/atlas/power/PowerBlock.kt | 5 +++++ .../kotlin/com/coderjoe/atlas/power/block/PowerCable.kt | 6 ------ .../kotlin/com/coderjoe/atlas/power/block/PowerMerger.kt | 6 ------ .../kotlin/com/coderjoe/atlas/power/block/PowerSplitter.kt | 6 ------ .../kotlin/com/coderjoe/atlas/utility/block/AutoSmelter.kt | 6 ------ 5 files changed, 5 insertions(+), 24 deletions(-) diff --git a/src/main/kotlin/com/coderjoe/atlas/power/PowerBlock.kt b/src/main/kotlin/com/coderjoe/atlas/power/PowerBlock.kt index 5b9ba4f..4cde3d4 100644 --- a/src/main/kotlin/com/coderjoe/atlas/power/PowerBlock.kt +++ b/src/main/kotlin/com/coderjoe/atlas/power/PowerBlock.kt @@ -2,6 +2,7 @@ package com.coderjoe.atlas.power import com.coderjoe.atlas.core.AtlasBlock import com.coderjoe.atlas.core.BlockRegistry +import com.coderjoe.atlas.core.CraftEngineHelper import org.bukkit.Location abstract class PowerBlock( @@ -43,6 +44,10 @@ abstract class PowerBlock( } } + protected fun updatePoweredState() { + CraftEngineHelper.setBooleanProperty(location, "powered", hasPower()) + } + protected abstract fun powerUpdate() override fun blockUpdate() { diff --git a/src/main/kotlin/com/coderjoe/atlas/power/block/PowerCable.kt b/src/main/kotlin/com/coderjoe/atlas/power/block/PowerCable.kt index 065b366..756f34a 100644 --- a/src/main/kotlin/com/coderjoe/atlas/power/block/PowerCable.kt +++ b/src/main/kotlin/com/coderjoe/atlas/power/block/PowerCable.kt @@ -2,7 +2,6 @@ package com.coderjoe.atlas.power.block import com.coderjoe.atlas.atlasInfo import com.coderjoe.atlas.core.BlockDescriptor -import com.coderjoe.atlas.core.CraftEngineHelper import com.coderjoe.atlas.core.PlacementType import com.coderjoe.atlas.power.PowerBlock import com.coderjoe.atlas.power.PowerBlockRegistry @@ -47,9 +46,4 @@ class PowerCable(location: Location, override val facing: BlockFace) : PowerBloc updatePoweredState() } - - private fun updatePoweredState() { - val shouldBePowered = currentPower > 0 - CraftEngineHelper.setBooleanProperty(location, "powered", shouldBePowered) - } } diff --git a/src/main/kotlin/com/coderjoe/atlas/power/block/PowerMerger.kt b/src/main/kotlin/com/coderjoe/atlas/power/block/PowerMerger.kt index ed54b9d..c6deeaa 100644 --- a/src/main/kotlin/com/coderjoe/atlas/power/block/PowerMerger.kt +++ b/src/main/kotlin/com/coderjoe/atlas/power/block/PowerMerger.kt @@ -2,7 +2,6 @@ package com.coderjoe.atlas.power.block import com.coderjoe.atlas.atlasInfo import com.coderjoe.atlas.core.BlockDescriptor -import com.coderjoe.atlas.core.CraftEngineHelper import com.coderjoe.atlas.core.PlacementType import com.coderjoe.atlas.power.PowerBlock import com.coderjoe.atlas.power.PowerBlockRegistry @@ -55,9 +54,4 @@ class PowerMerger(location: Location, override val facing: BlockFace) : PowerBlo updatePoweredState() } - - private fun updatePoweredState() { - val shouldBePowered = currentPower > 0 - CraftEngineHelper.setBooleanProperty(location, "powered", shouldBePowered) - } } diff --git a/src/main/kotlin/com/coderjoe/atlas/power/block/PowerSplitter.kt b/src/main/kotlin/com/coderjoe/atlas/power/block/PowerSplitter.kt index bc04f07..93e5a4d 100644 --- a/src/main/kotlin/com/coderjoe/atlas/power/block/PowerSplitter.kt +++ b/src/main/kotlin/com/coderjoe/atlas/power/block/PowerSplitter.kt @@ -2,7 +2,6 @@ package com.coderjoe.atlas.power.block import com.coderjoe.atlas.atlasInfo import com.coderjoe.atlas.core.BlockDescriptor -import com.coderjoe.atlas.core.CraftEngineHelper import com.coderjoe.atlas.core.PlacementType import com.coderjoe.atlas.power.PowerBlock import com.coderjoe.atlas.power.PowerBlockRegistry @@ -69,9 +68,4 @@ class PowerSplitter(location: Location, override val facing: BlockFace) : PowerB updatePoweredState() } - - private fun updatePoweredState() { - val shouldBePowered = currentPower > 0 - CraftEngineHelper.setBooleanProperty(location, "powered", shouldBePowered) - } } diff --git a/src/main/kotlin/com/coderjoe/atlas/utility/block/AutoSmelter.kt b/src/main/kotlin/com/coderjoe/atlas/utility/block/AutoSmelter.kt index 63489dd..afcb419 100644 --- a/src/main/kotlin/com/coderjoe/atlas/utility/block/AutoSmelter.kt +++ b/src/main/kotlin/com/coderjoe/atlas/utility/block/AutoSmelter.kt @@ -1,7 +1,6 @@ package com.coderjoe.atlas.utility.block import com.coderjoe.atlas.core.BlockDescriptor -import com.coderjoe.atlas.core.CraftEngineHelper import com.coderjoe.atlas.core.PlacementType import com.coderjoe.atlas.power.PowerBlock import org.bukkit.Bukkit @@ -79,9 +78,4 @@ class AutoSmelter(location: Location, facing: BlockFace = BlockFace.NORTH) : Pow updatePoweredState() } - - private fun updatePoweredState() { - val shouldBePowered = hasPower() - CraftEngineHelper.setBooleanProperty(location, "powered", shouldBePowered) - } } From 6207afca05afb85884e742ddc8effd07a6161657 Mon Sep 17 00:00:00 2001 From: CoderJoe Date: Mon, 16 Mar 2026 23:23:45 -0500 Subject: [PATCH 3/7] Extract ADJACENT_FACES constant to AtlasBlock companion The same 6-element BlockFace list was defined in CobblestoneFactory, ObsidianFactory, LavaGenerator, and FluidPump. Move it to AtlasBlock companion and remove all four private copies. --- src/main/kotlin/com/coderjoe/atlas/core/AtlasBlock.kt | 5 +++++ .../kotlin/com/coderjoe/atlas/fluid/block/FluidPump.kt | 10 ---------- .../com/coderjoe/atlas/power/block/LavaGenerator.kt | 10 ---------- .../coderjoe/atlas/utility/block/CobblestoneFactory.kt | 10 ---------- .../coderjoe/atlas/utility/block/ObsidianFactory.kt | 10 ---------- 5 files changed, 5 insertions(+), 40 deletions(-) diff --git a/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlock.kt b/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlock.kt index a5c82f6..a7b87bf 100644 --- a/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlock.kt +++ b/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlock.kt @@ -20,6 +20,11 @@ abstract class AtlasBlock( companion object { @JvmStatic internal var testPlugin: JavaPlugin? = null + + val ADJACENT_FACES = + listOf( + BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST, BlockFace.UP, BlockFace.DOWN, + ) } protected abstract fun blockUpdate() diff --git a/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidPump.kt b/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidPump.kt index 7b46b91..ef18a17 100644 --- a/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidPump.kt +++ b/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidPump.kt @@ -34,16 +34,6 @@ class FluidPump(location: Location) : FluidBlock(location) { const val BLOCK_ID_ACTIVE = "atlas:fluid_pump_active" const val BLOCK_ID_ACTIVE_LAVA = "atlas:fluid_pump_active_lava" - private val ADJACENT_FACES = - listOf( - BlockFace.NORTH, - BlockFace.SOUTH, - BlockFace.EAST, - BlockFace.WEST, - BlockFace.UP, - BlockFace.DOWN, - ) - val descriptor = BlockDescriptor( baseBlockId = BLOCK_ID, diff --git a/src/main/kotlin/com/coderjoe/atlas/power/block/LavaGenerator.kt b/src/main/kotlin/com/coderjoe/atlas/power/block/LavaGenerator.kt index 3c06087..f93893d 100644 --- a/src/main/kotlin/com/coderjoe/atlas/power/block/LavaGenerator.kt +++ b/src/main/kotlin/com/coderjoe/atlas/power/block/LavaGenerator.kt @@ -22,16 +22,6 @@ class LavaGenerator(location: Location) : PowerBlock(location, maxStorage = 50) const val BLOCK_ID_ACTIVE = "atlas:lava_generator_active" const val POWER_PER_LAVA = 5 - private val ADJACENT_FACES = - listOf( - BlockFace.NORTH, - BlockFace.SOUTH, - BlockFace.EAST, - BlockFace.WEST, - BlockFace.UP, - BlockFace.DOWN, - ) - val descriptor = BlockDescriptor( baseBlockId = BLOCK_ID, diff --git a/src/main/kotlin/com/coderjoe/atlas/utility/block/CobblestoneFactory.kt b/src/main/kotlin/com/coderjoe/atlas/utility/block/CobblestoneFactory.kt index cf4c71e..93603d7 100644 --- a/src/main/kotlin/com/coderjoe/atlas/utility/block/CobblestoneFactory.kt +++ b/src/main/kotlin/com/coderjoe/atlas/utility/block/CobblestoneFactory.kt @@ -24,16 +24,6 @@ class CobblestoneFactory(location: Location) : PowerBlock(location, maxStorage = const val BLOCK_ID_ACTIVE = "atlas:cobblestone_factory_active" const val POWER_COST = 2 - private val ADJACENT_FACES = - listOf( - BlockFace.NORTH, - BlockFace.SOUTH, - BlockFace.EAST, - BlockFace.WEST, - BlockFace.UP, - BlockFace.DOWN, - ) - val descriptor = BlockDescriptor( baseBlockId = BLOCK_ID, diff --git a/src/main/kotlin/com/coderjoe/atlas/utility/block/ObsidianFactory.kt b/src/main/kotlin/com/coderjoe/atlas/utility/block/ObsidianFactory.kt index 3e7ed81..f063fa9 100644 --- a/src/main/kotlin/com/coderjoe/atlas/utility/block/ObsidianFactory.kt +++ b/src/main/kotlin/com/coderjoe/atlas/utility/block/ObsidianFactory.kt @@ -24,16 +24,6 @@ class ObsidianFactory(location: Location) : PowerBlock(location, maxStorage = 10 const val BLOCK_ID_ACTIVE = "atlas:obsidian_factory_active" const val POWER_COST = 100 - private val ADJACENT_FACES = - listOf( - BlockFace.NORTH, - BlockFace.SOUTH, - BlockFace.EAST, - BlockFace.WEST, - BlockFace.UP, - BlockFace.DOWN, - ) - val descriptor = BlockDescriptor( baseBlockId = BLOCK_ID, From 4e0bf0889ef4fa13897c6e5af349be7c4496a408 Mon Sep 17 00:00:00 2001 From: CoderJoe Date: Mon, 16 Mar 2026 23:26:51 -0500 Subject: [PATCH 4/7] Extract canProvideFluid() into FluidBlock Add a polymorphic canProvideFluid(requestDirection) method to FluidBlock, with overrides in FluidPump and FluidContainer that delegate to canRemoveFluidFrom(). This replaces the when(source) type dispatch duplicated across FluidPipe, FluidMerger, FluidContainer, CobblestoneFactory, ObsidianFactory, and LavaGenerator. --- .../com/coderjoe/atlas/fluid/FluidBlock.kt | 3 + .../atlas/fluid/block/FluidContainer.kt | 63 ++++--------------- .../coderjoe/atlas/fluid/block/FluidMerger.kt | 58 +++-------------- .../coderjoe/atlas/fluid/block/FluidPipe.kt | 48 +++----------- .../coderjoe/atlas/fluid/block/FluidPump.kt | 2 + .../atlas/power/block/LavaGenerator.kt | 32 +--------- .../atlas/utility/block/CobblestoneFactory.kt | 28 +-------- .../atlas/utility/block/ObsidianFactory.kt | 28 +-------- 8 files changed, 41 insertions(+), 221 deletions(-) diff --git a/src/main/kotlin/com/coderjoe/atlas/fluid/FluidBlock.kt b/src/main/kotlin/com/coderjoe/atlas/fluid/FluidBlock.kt index 498edd9..d9aac68 100644 --- a/src/main/kotlin/com/coderjoe/atlas/fluid/FluidBlock.kt +++ b/src/main/kotlin/com/coderjoe/atlas/fluid/FluidBlock.kt @@ -3,6 +3,7 @@ package com.coderjoe.atlas.fluid import com.coderjoe.atlas.core.AtlasBlock import com.coderjoe.atlas.core.BlockRegistry import org.bukkit.Location +import org.bukkit.block.BlockFace abstract class FluidBlock( location: Location, @@ -10,6 +11,8 @@ abstract class FluidBlock( ) : AtlasBlock(location) { open fun hasFluid(): Boolean = storedFluid != FluidType.NONE + open fun canProvideFluid(requestDirection: BlockFace): Boolean = hasFluid() + open fun storeFluid(type: FluidType): Boolean { if (storedFluid != FluidType.NONE) return false storedFluid = type diff --git a/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidContainer.kt b/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidContainer.kt index d777f9e..f56d0ff 100644 --- a/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidContainer.kt +++ b/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidContainer.kt @@ -56,6 +56,8 @@ class FluidContainer(location: Location, override val facing: BlockFace) : Fluid return direction == facing && hasFluid() } + override fun canProvideFluid(requestDirection: BlockFace): Boolean = canRemoveFluidFrom(requestDirection) + fun getFillLevel(): Int = when (storedAmount) { 0 -> 0 @@ -91,58 +93,15 @@ class FluidContainer(location: Location, override val facing: BlockFace) : Fluid return } - when (source) { - is FluidPump -> { - if (source.canRemoveFluidFrom(facing)) { - val fluid = source.removeFluid() - if (storeFluid(fluid)) { - plugin.logger.atlasInfo( - "FluidContainer at ${location.blockX},${location.blockY},${location.blockZ} " + - "pulled ${fluid.name} from FluidPump", - ) - } else { - source.storeFluid(fluid) - } - } - } - is FluidPipe -> { - if (source.hasFluid()) { - val fluid = source.removeFluid() - if (storeFluid(fluid)) { - plugin.logger.atlasInfo( - "FluidContainer at ${location.blockX},${location.blockY},${location.blockZ} " + - "pulled ${fluid.name} from FluidPipe", - ) - } else { - source.storeFluid(fluid) - } - } - } - is FluidContainer -> { - if (source.canRemoveFluidFrom(facing)) { - val fluid = source.removeFluid() - if (storeFluid(fluid)) { - plugin.logger.atlasInfo( - "FluidContainer at ${location.blockX},${location.blockY},${location.blockZ} " + - "pulled ${fluid.name} from FluidContainer", - ) - } else { - source.storeFluid(fluid) - } - } - } - is FluidMerger -> { - if (source.hasFluid()) { - val fluid = source.removeFluid() - if (storeFluid(fluid)) { - plugin.logger.atlasInfo( - "FluidContainer at ${location.blockX},${location.blockY},${location.blockZ} " + - "pulled ${fluid.name} from FluidMerger", - ) - } else { - source.storeFluid(fluid) - } - } + if (source.canProvideFluid(facing)) { + val fluid = source.removeFluid() + if (storeFluid(fluid)) { + plugin.logger.atlasInfo( + "FluidContainer at ${location.blockX},${location.blockY},${location.blockZ} " + + "pulled ${fluid.name} from ${source::class.simpleName}", + ) + } else { + source.storeFluid(fluid) } } diff --git a/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidMerger.kt b/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidMerger.kt index 419f6cf..c038572 100644 --- a/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidMerger.kt +++ b/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidMerger.kt @@ -55,55 +55,15 @@ class FluidMerger(location: Location, override val facing: BlockFace) : FluidBlo for (face in inputFaces) { val source = registry.getAdjacentFluidBlock(location, face) ?: continue - when (source) { - is FluidPump -> { - if (source.canRemoveFluidFrom(face.oppositeFace) && source.hasFluid()) { - val fluid = source.removeFluid() - storeFluid(fluid) - plugin.logger.atlasInfo( - "FluidMerger at ${location.blockX},${location.blockY},${location.blockZ} " + - "pulled ${fluid.name} from FluidPump at ${face.name}", - ) - updateFluidState() - return - } - } - is FluidPipe -> { - if (source.hasFluid()) { - val fluid = source.removeFluid() - storeFluid(fluid) - plugin.logger.atlasInfo( - "FluidMerger at ${location.blockX},${location.blockY},${location.blockZ} " + - "pulled ${fluid.name} from FluidPipe at ${face.name}", - ) - updateFluidState() - return - } - } - is FluidContainer -> { - if (source.canRemoveFluidFrom(face.oppositeFace) && source.hasFluid()) { - val fluid = source.removeFluid() - storeFluid(fluid) - plugin.logger.atlasInfo( - "FluidMerger at ${location.blockX},${location.blockY},${location.blockZ} " + - "pulled ${fluid.name} from FluidContainer at ${face.name}", - ) - updateFluidState() - return - } - } - is FluidMerger -> { - if (source.hasFluid()) { - val fluid = source.removeFluid() - storeFluid(fluid) - plugin.logger.atlasInfo( - "FluidMerger at ${location.blockX},${location.blockY},${location.blockZ} " + - "pulled ${fluid.name} from FluidMerger at ${face.name}", - ) - updateFluidState() - return - } - } + if (source.canProvideFluid(face.oppositeFace)) { + val fluid = source.removeFluid() + storeFluid(fluid) + plugin.logger.atlasInfo( + "FluidMerger at ${location.blockX},${location.blockY},${location.blockZ} " + + "pulled ${fluid.name} from ${source::class.simpleName} at ${face.name}", + ) + updateFluidState() + return } } diff --git a/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidPipe.kt b/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidPipe.kt index a459c99..a367980 100644 --- a/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidPipe.kt +++ b/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidPipe.kt @@ -50,47 +50,13 @@ class FluidPipe(location: Location, override val facing: BlockFace) : FluidBlock val behind = facing.oppositeFace val source = registry.getAdjacentFluidBlock(location, behind) ?: return - when (source) { - is FluidPump -> { - if (source.canRemoveFluidFrom(facing)) { - val fluid = source.removeFluid() - storeFluid(fluid) - plugin.logger.atlasInfo( - "FluidPipe at ${location.blockX},${location.blockY},${location.blockZ} " + - "pulled ${fluid.name} from FluidPump", - ) - } - } - is FluidPipe -> { - if (source.hasFluid()) { - val fluid = source.removeFluid() - storeFluid(fluid) - plugin.logger.atlasInfo( - "FluidPipe at ${location.blockX},${location.blockY},${location.blockZ} " + - "pulled ${fluid.name} from FluidPipe", - ) - } - } - is FluidContainer -> { - if (source.canRemoveFluidFrom(facing)) { - val fluid = source.removeFluid() - storeFluid(fluid) - plugin.logger.atlasInfo( - "FluidPipe at ${location.blockX},${location.blockY},${location.blockZ} " + - "pulled ${fluid.name} from FluidContainer", - ) - } - } - is FluidMerger -> { - if (source.hasFluid()) { - val fluid = source.removeFluid() - storeFluid(fluid) - plugin.logger.atlasInfo( - "FluidPipe at ${location.blockX},${location.blockY},${location.blockZ} " + - "pulled ${fluid.name} from FluidMerger", - ) - } - } + if (source.canProvideFluid(facing)) { + val fluid = source.removeFluid() + storeFluid(fluid) + plugin.logger.atlasInfo( + "FluidPipe at ${location.blockX},${location.blockY},${location.blockZ} " + + "pulled ${fluid.name} from ${source::class.simpleName}", + ) } updateFluidState() diff --git a/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidPump.kt b/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidPump.kt index ef18a17..1b2dc45 100644 --- a/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidPump.kt +++ b/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidPump.kt @@ -52,6 +52,8 @@ class FluidPump(location: Location) : FluidBlock(location) { return direction == cauldron.oppositeFace && hasFluid() } + override fun canProvideFluid(requestDirection: BlockFace): Boolean = canRemoveFluidFrom(requestDirection) + override fun getVisualStateBlockId(): String = when (storedFluid) { FluidType.WATER -> BLOCK_ID_ACTIVE diff --git a/src/main/kotlin/com/coderjoe/atlas/power/block/LavaGenerator.kt b/src/main/kotlin/com/coderjoe/atlas/power/block/LavaGenerator.kt index f93893d..6d0ed84 100644 --- a/src/main/kotlin/com/coderjoe/atlas/power/block/LavaGenerator.kt +++ b/src/main/kotlin/com/coderjoe/atlas/power/block/LavaGenerator.kt @@ -5,10 +5,6 @@ import com.coderjoe.atlas.core.BlockDescriptor import com.coderjoe.atlas.core.PlacementType import com.coderjoe.atlas.fluid.FluidBlockRegistry import com.coderjoe.atlas.fluid.FluidType -import com.coderjoe.atlas.fluid.block.FluidContainer -import com.coderjoe.atlas.fluid.block.FluidMerger -import com.coderjoe.atlas.fluid.block.FluidPipe -import com.coderjoe.atlas.fluid.block.FluidPump import com.coderjoe.atlas.power.PowerBlock import org.bukkit.Location import org.bukkit.block.BlockFace @@ -67,31 +63,9 @@ class LavaGenerator(location: Location) : PowerBlock(location, maxStorage = 50) source: com.coderjoe.atlas.fluid.FluidBlock, face: BlockFace, ): Boolean { - when (source) { - is FluidPump -> { - if (source.canRemoveFluidFrom(face.oppositeFace) && source.storedFluid == FluidType.LAVA) { - source.removeFluid() - return true - } - } - is FluidPipe -> { - if (source.hasFluid() && source.storedFluid == FluidType.LAVA) { - source.removeFluid() - return true - } - } - is FluidContainer -> { - if (source.canRemoveFluidFrom(face.oppositeFace) && source.storedFluid == FluidType.LAVA) { - source.removeFluid() - return true - } - } - is FluidMerger -> { - if (source.hasFluid() && source.storedFluid == FluidType.LAVA) { - source.removeFluid() - return true - } - } + if (source.canProvideFluid(face.oppositeFace) && source.storedFluid == FluidType.LAVA) { + source.removeFluid() + return true } return false } diff --git a/src/main/kotlin/com/coderjoe/atlas/utility/block/CobblestoneFactory.kt b/src/main/kotlin/com/coderjoe/atlas/utility/block/CobblestoneFactory.kt index 93603d7..e3b9462 100644 --- a/src/main/kotlin/com/coderjoe/atlas/utility/block/CobblestoneFactory.kt +++ b/src/main/kotlin/com/coderjoe/atlas/utility/block/CobblestoneFactory.kt @@ -5,10 +5,6 @@ import com.coderjoe.atlas.core.BlockDescriptor import com.coderjoe.atlas.core.PlacementType import com.coderjoe.atlas.fluid.FluidBlockRegistry import com.coderjoe.atlas.fluid.FluidType -import com.coderjoe.atlas.fluid.block.FluidContainer -import com.coderjoe.atlas.fluid.block.FluidMerger -import com.coderjoe.atlas.fluid.block.FluidPipe -import com.coderjoe.atlas.fluid.block.FluidPump import com.coderjoe.atlas.power.PowerBlock import org.bukkit.Location import org.bukkit.Material @@ -65,8 +61,8 @@ class CobblestoneFactory(location: Location) : PowerBlock(location, maxStorage = if (waterSource == null || lavaSource == null) return - pullFluid(waterSource.first, waterSource.second) - pullFluid(lavaSource.first, lavaSource.second) + waterSource.first.removeFluid() + lavaSource.first.removeFluid() removePower(POWER_COST) val world = location.world ?: return @@ -83,24 +79,6 @@ class CobblestoneFactory(location: Location) : PowerBlock(location, maxStorage = face: BlockFace, fluidType: FluidType, ): Boolean { - return when (source) { - is FluidPump -> source.canRemoveFluidFrom(face.oppositeFace) && source.storedFluid == fluidType - is FluidPipe -> source.hasFluid() && source.storedFluid == fluidType - is FluidContainer -> source.canRemoveFluidFrom(face.oppositeFace) && source.storedFluid == fluidType - is FluidMerger -> source.hasFluid() && source.storedFluid == fluidType - else -> false - } - } - - private fun pullFluid( - source: com.coderjoe.atlas.fluid.FluidBlock, - face: BlockFace, - ) { - when (source) { - is FluidPump -> source.removeFluid() - is FluidPipe -> source.removeFluid() - is FluidContainer -> source.removeFluid() - is FluidMerger -> source.removeFluid() - } + return source.canProvideFluid(face.oppositeFace) && source.storedFluid == fluidType } } diff --git a/src/main/kotlin/com/coderjoe/atlas/utility/block/ObsidianFactory.kt b/src/main/kotlin/com/coderjoe/atlas/utility/block/ObsidianFactory.kt index f063fa9..af7b136 100644 --- a/src/main/kotlin/com/coderjoe/atlas/utility/block/ObsidianFactory.kt +++ b/src/main/kotlin/com/coderjoe/atlas/utility/block/ObsidianFactory.kt @@ -5,10 +5,6 @@ import com.coderjoe.atlas.core.BlockDescriptor import com.coderjoe.atlas.core.PlacementType import com.coderjoe.atlas.fluid.FluidBlockRegistry import com.coderjoe.atlas.fluid.FluidType -import com.coderjoe.atlas.fluid.block.FluidContainer -import com.coderjoe.atlas.fluid.block.FluidMerger -import com.coderjoe.atlas.fluid.block.FluidPipe -import com.coderjoe.atlas.fluid.block.FluidPump import com.coderjoe.atlas.power.PowerBlock import org.bukkit.Location import org.bukkit.Material @@ -65,8 +61,8 @@ class ObsidianFactory(location: Location) : PowerBlock(location, maxStorage = 10 if (waterSource == null || lavaSource == null) return - pullFluid(waterSource.first, waterSource.second) - pullFluid(lavaSource.first, lavaSource.second) + waterSource.first.removeFluid() + lavaSource.first.removeFluid() removePower(POWER_COST) val world = location.world ?: return @@ -83,24 +79,6 @@ class ObsidianFactory(location: Location) : PowerBlock(location, maxStorage = 10 face: BlockFace, fluidType: FluidType, ): Boolean { - return when (source) { - is FluidPump -> source.canRemoveFluidFrom(face.oppositeFace) && source.storedFluid == fluidType - is FluidPipe -> source.hasFluid() && source.storedFluid == fluidType - is FluidContainer -> source.canRemoveFluidFrom(face.oppositeFace) && source.storedFluid == fluidType - is FluidMerger -> source.hasFluid() && source.storedFluid == fluidType - else -> false - } - } - - private fun pullFluid( - source: com.coderjoe.atlas.fluid.FluidBlock, - face: BlockFace, - ) { - when (source) { - is FluidPump -> source.removeFluid() - is FluidPipe -> source.removeFluid() - is FluidContainer -> source.removeFluid() - is FluidMerger -> source.removeFluid() - } + return source.canProvideFluid(face.oppositeFace) && source.storedFluid == fluidType } } From 36521aa4ef35ad00f8cbc3eee376967d1d9d6b29 Mon Sep 17 00:00:00 2001 From: CoderJoe Date: Mon, 16 Mar 2026 23:30:12 -0500 Subject: [PATCH 5/7] Extract notice dialog creation and BlockFace.displayName() into AtlasBlockDialog Add createNoticeDialog() to centralize the close-button + notice dialog pattern duplicated in FluidBlockDialog, TransportBlockDialog, and PowerBlockDialog. Add BlockFace.displayName() extension to replace 8 occurrences of the same formatting logic across dialog classes. --- .../coderjoe/atlas/core/AtlasBlockDialog.kt | 40 +++++++++++++++++ .../coderjoe/atlas/fluid/FluidBlockDialog.kt | 45 +++---------------- .../coderjoe/atlas/power/PowerBlockDialog.kt | 41 +++-------------- .../atlas/transport/TransportBlockDialog.kt | 41 ++--------------- 4 files changed, 55 insertions(+), 112 deletions(-) diff --git a/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlockDialog.kt b/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlockDialog.kt index 43e1942..d73dcea 100644 --- a/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlockDialog.kt +++ b/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlockDialog.kt @@ -1,11 +1,23 @@ package com.coderjoe.atlas.core +import io.papermc.paper.dialog.Dialog +import io.papermc.paper.registry.data.dialog.ActionButton +import io.papermc.paper.registry.data.dialog.DialogBase +import io.papermc.paper.registry.data.dialog.action.DialogAction +import io.papermc.paper.registry.data.dialog.action.DialogActionCallback +import io.papermc.paper.registry.data.dialog.body.DialogBody +import io.papermc.paper.registry.data.dialog.type.DialogType +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.event.ClickCallback +import org.bukkit.block.BlockFace import org.bukkit.entity.Player import org.bukkit.plugin.java.JavaPlugin import org.bukkit.scheduler.BukkitTask import java.util.UUID import java.util.concurrent.ConcurrentHashMap +fun BlockFace.displayName(): String = name.lowercase().replaceFirstChar { it.uppercase() } + object AtlasBlockDialog { private lateinit var plugin: JavaPlugin private val activeDialogs = ConcurrentHashMap() @@ -19,6 +31,34 @@ object AtlasBlockDialog { activeDialogs.clear() } + fun createNoticeDialog(title: Component, body: Component, onClose: (Player) -> Unit): Dialog { + val closeAction = + DialogAction.customClick( + DialogActionCallback { _, audience -> + val p = audience as? Player ?: return@DialogActionCallback + onClose(p) + }, + ClickCallback.Options.builder().build(), + ) + + val closeButton = + ActionButton.builder(Component.text("Close")) + .action(closeAction) + .build() + + return Dialog.create { factory -> + factory.empty() + .base( + DialogBase.builder(title) + .body(listOf(DialogBody.plainMessage(body))) + .canCloseWithEscape(false) + .afterAction(DialogBase.DialogAfterAction.CLOSE) + .build(), + ) + .type(DialogType.notice(closeButton)) + } + } + fun showDialog( player: Player, block: AtlasBlock, diff --git a/src/main/kotlin/com/coderjoe/atlas/fluid/FluidBlockDialog.kt b/src/main/kotlin/com/coderjoe/atlas/fluid/FluidBlockDialog.kt index 4df156d..718446e 100644 --- a/src/main/kotlin/com/coderjoe/atlas/fluid/FluidBlockDialog.kt +++ b/src/main/kotlin/com/coderjoe/atlas/fluid/FluidBlockDialog.kt @@ -2,19 +2,12 @@ package com.coderjoe.atlas.fluid import com.coderjoe.atlas.core.AtlasBlockDialog import com.coderjoe.atlas.core.BlockRegistry +import com.coderjoe.atlas.core.displayName import com.coderjoe.atlas.fluid.block.FluidContainer import com.coderjoe.atlas.fluid.block.FluidMerger import com.coderjoe.atlas.fluid.block.FluidPipe import com.coderjoe.atlas.fluid.block.FluidPump -import io.papermc.paper.dialog.Dialog -import io.papermc.paper.registry.data.dialog.ActionButton -import io.papermc.paper.registry.data.dialog.DialogBase -import io.papermc.paper.registry.data.dialog.action.DialogAction -import io.papermc.paper.registry.data.dialog.action.DialogActionCallback -import io.papermc.paper.registry.data.dialog.body.DialogBody -import io.papermc.paper.registry.data.dialog.type.DialogType import net.kyori.adventure.text.Component -import net.kyori.adventure.text.event.ClickCallback import net.kyori.adventure.text.format.NamedTextColor import net.kyori.adventure.text.format.TextDecoration import org.bukkit.entity.Player @@ -46,44 +39,16 @@ object FluidBlockDialog { ) { val title = Component.text(getBlockDisplayName(fluidBlock)) val bodyText = buildFluidInfo(fluidBlock) - val body = DialogBody.plainMessage(bodyText) - - val closeAction = - DialogAction.customClick( - DialogActionCallback { _, audience -> - val p = audience as? Player ?: return@DialogActionCallback - onClose(p) - }, - ClickCallback.Options.builder().build(), - ) - - val closeButton = - ActionButton.builder(Component.text("Close")) - .action(closeAction) - .build() - - val dialog = - Dialog.create { factory -> - factory.empty() - .base( - DialogBase.builder(title) - .body(listOf(body)) - .canCloseWithEscape(false) - .afterAction(DialogBase.DialogAfterAction.CLOSE) - .build(), - ) - .type(DialogType.notice(closeButton)) - } - + val dialog = AtlasBlockDialog.createNoticeDialog(title, bodyText, onClose) player.showDialog(dialog) } private fun getBlockDisplayName(fluidBlock: FluidBlock): String = when (fluidBlock) { is FluidPump -> "Fluid Pump" - is FluidPipe -> "Fluid Pipe (${fluidBlock.facing.name.lowercase().replaceFirstChar { it.uppercase() }})" - is FluidContainer -> "Fluid Container (${fluidBlock.facing.name.lowercase().replaceFirstChar { it.uppercase() }})" - is FluidMerger -> "Fluid Merger (${fluidBlock.facing.name.lowercase().replaceFirstChar { it.uppercase() }})" + is FluidPipe -> "Fluid Pipe (${fluidBlock.facing.displayName()})" + is FluidContainer -> "Fluid Container (${fluidBlock.facing.displayName()})" + is FluidMerger -> "Fluid Merger (${fluidBlock.facing.displayName()})" else -> "Fluid Block" } diff --git a/src/main/kotlin/com/coderjoe/atlas/power/PowerBlockDialog.kt b/src/main/kotlin/com/coderjoe/atlas/power/PowerBlockDialog.kt index 6045fe8..1f078aa 100644 --- a/src/main/kotlin/com/coderjoe/atlas/power/PowerBlockDialog.kt +++ b/src/main/kotlin/com/coderjoe/atlas/power/PowerBlockDialog.kt @@ -2,6 +2,7 @@ package com.coderjoe.atlas.power import com.coderjoe.atlas.core.AtlasBlockDialog import com.coderjoe.atlas.core.BlockRegistry +import com.coderjoe.atlas.core.displayName import com.coderjoe.atlas.power.block.LavaGenerator import com.coderjoe.atlas.power.block.PowerCable import com.coderjoe.atlas.power.block.PowerMerger @@ -64,35 +65,7 @@ object PowerBlockDialog { ) { val title = Component.text(getBlockDisplayName(powerBlock)) val bodyText = buildPowerInfo(powerBlock) - val body = DialogBody.plainMessage(bodyText) - - val closeAction = - DialogAction.customClick( - DialogActionCallback { _, audience -> - val p = audience as? Player ?: return@DialogActionCallback - onClose(p) - }, - ClickCallback.Options.builder().build(), - ) - - val closeButton = - ActionButton.builder(Component.text("Close")) - .action(closeAction) - .build() - - val dialog = - Dialog.create { factory -> - factory.empty() - .base( - DialogBase.builder(title) - .body(listOf(body)) - .canCloseWithEscape(false) - .afterAction(DialogBase.DialogAfterAction.CLOSE) - .build(), - ) - .type(DialogType.notice(closeButton)) - } - + val dialog = AtlasBlockDialog.createNoticeDialog(title, bodyText, onClose) player.showDialog(dialog) } @@ -152,13 +125,13 @@ object PowerBlockDialog { is SmallSolarPanel -> "Small Solar Panel" is SmallBattery -> "Small Battery" is SmallDrill -> "Small Drill" - is PowerCable -> "Power Cable (${powerBlock.facing.name.lowercase().replaceFirstChar { it.uppercase() }})" + is PowerCable -> "Power Cable (${powerBlock.facing.displayName()})" is LavaGenerator -> "Lava Generator" - is AutoSmelter -> "Auto Smelter (${powerBlock.facing.name.lowercase().replaceFirstChar { it.uppercase() }})" - is PowerSplitter -> "Power Splitter (${powerBlock.facing.name.lowercase().replaceFirstChar { it.uppercase() }})" + is AutoSmelter -> "Auto Smelter (${powerBlock.facing.displayName()})" + is PowerSplitter -> "Power Splitter (${powerBlock.facing.displayName()})" is CobblestoneFactory -> "Cobblestone Factory" is ObsidianFactory -> "Obsidian Factory" - is PowerMerger -> "Power Merger (${powerBlock.facing.name.lowercase().replaceFirstChar { it.uppercase() }})" + is PowerMerger -> "Power Merger (${powerBlock.facing.displayName()})" else -> "Power Block" } @@ -203,7 +176,7 @@ object PowerBlockDialog { Component.text("Storage - holds up to 10 power") .color(NamedTextColor.GRAY) is SmallDrill -> { - val directionName = powerBlock.miningDirection.name.lowercase().replaceFirstChar { it.uppercase() } + val directionName = powerBlock.miningDirection.displayName() val status = if (powerBlock.enabled) "ON" else "OFF" Component.text("Machine - mining $directionName, $status, consumes 10 power/s") .color(NamedTextColor.GRAY) diff --git a/src/main/kotlin/com/coderjoe/atlas/transport/TransportBlockDialog.kt b/src/main/kotlin/com/coderjoe/atlas/transport/TransportBlockDialog.kt index fd2ecbb..49262c2 100644 --- a/src/main/kotlin/com/coderjoe/atlas/transport/TransportBlockDialog.kt +++ b/src/main/kotlin/com/coderjoe/atlas/transport/TransportBlockDialog.kt @@ -2,16 +2,9 @@ package com.coderjoe.atlas.transport import com.coderjoe.atlas.core.AtlasBlockDialog import com.coderjoe.atlas.core.BlockRegistry +import com.coderjoe.atlas.core.displayName import com.coderjoe.atlas.transport.block.ConveyorBelt -import io.papermc.paper.dialog.Dialog -import io.papermc.paper.registry.data.dialog.ActionButton -import io.papermc.paper.registry.data.dialog.DialogBase -import io.papermc.paper.registry.data.dialog.action.DialogAction -import io.papermc.paper.registry.data.dialog.action.DialogActionCallback -import io.papermc.paper.registry.data.dialog.body.DialogBody -import io.papermc.paper.registry.data.dialog.type.DialogType import net.kyori.adventure.text.Component -import net.kyori.adventure.text.event.ClickCallback import net.kyori.adventure.text.format.NamedTextColor import org.bukkit.entity.Player import org.bukkit.plugin.java.JavaPlugin @@ -42,41 +35,13 @@ object TransportBlockDialog { ) { val title = Component.text(getBlockDisplayName(block)) val bodyText = getBlockDescription(block) - val body = DialogBody.plainMessage(bodyText) - - val closeAction = - DialogAction.customClick( - DialogActionCallback { _, audience -> - val p = audience as? Player ?: return@DialogActionCallback - onClose(p) - }, - ClickCallback.Options.builder().build(), - ) - - val closeButton = - ActionButton.builder(Component.text("Close")) - .action(closeAction) - .build() - - val dialog = - Dialog.create { factory -> - factory.empty() - .base( - DialogBase.builder(title) - .body(listOf(body)) - .canCloseWithEscape(false) - .afterAction(DialogBase.DialogAfterAction.CLOSE) - .build(), - ) - .type(DialogType.notice(closeButton)) - } - + val dialog = AtlasBlockDialog.createNoticeDialog(title, bodyText, onClose) player.showDialog(dialog) } private fun getBlockDisplayName(block: TransportBlock): String = when (block) { - is ConveyorBelt -> "Conveyor Belt (${block.facing.name.lowercase().replaceFirstChar { it.uppercase() }})" + is ConveyorBelt -> "Conveyor Belt (${block.facing.displayName()})" else -> "Transport Block" } From d1b6411e76c58427005bf0bb17f7d423fad11405 Mon Sep 17 00:00:00 2001 From: CoderJoe Date: Mon, 16 Mar 2026 23:31:38 -0500 Subject: [PATCH 6/7] Fix spotless formatting in AtlasBlock and AtlasBlockDialog --- src/main/kotlin/com/coderjoe/atlas/core/AtlasBlock.kt | 7 ++++++- .../kotlin/com/coderjoe/atlas/core/AtlasBlockDialog.kt | 6 +++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlock.kt b/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlock.kt index a7b87bf..a25e781 100644 --- a/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlock.kt +++ b/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlock.kt @@ -23,7 +23,12 @@ abstract class AtlasBlock( val ADJACENT_FACES = listOf( - BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST, BlockFace.UP, BlockFace.DOWN, + BlockFace.NORTH, + BlockFace.SOUTH, + BlockFace.EAST, + BlockFace.WEST, + BlockFace.UP, + BlockFace.DOWN, ) } diff --git a/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlockDialog.kt b/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlockDialog.kt index d73dcea..629b999 100644 --- a/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlockDialog.kt +++ b/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlockDialog.kt @@ -31,7 +31,11 @@ object AtlasBlockDialog { activeDialogs.clear() } - fun createNoticeDialog(title: Component, body: Component, onClose: (Player) -> Unit): Dialog { + fun createNoticeDialog( + title: Component, + body: Component, + onClose: (Player) -> Unit, + ): Dialog { val closeAction = DialogAction.customClick( DialogActionCallback { _, audience -> From 5229787f9b27d90fb556f3664e9e3aefd7a190c5 Mon Sep 17 00:00:00 2001 From: CoderJoe Date: Tue, 17 Mar 2026 00:26:46 -0500 Subject: [PATCH 7/7] Refactor imports to use simplified class references for FluidBlock and related classes --- src/main/kotlin/com/coderjoe/atlas/Atlas.kt | 67 ++++++++++++------- .../coderjoe/atlas/fluid/block/FluidPump.kt | 3 +- .../atlas/power/block/LavaGenerator.kt | 3 +- .../atlas/utility/block/CobblestoneFactory.kt | 7 +- .../atlas/utility/block/ObsidianFactory.kt | 7 +- 5 files changed, 55 insertions(+), 32 deletions(-) diff --git a/src/main/kotlin/com/coderjoe/atlas/Atlas.kt b/src/main/kotlin/com/coderjoe/atlas/Atlas.kt index c17e83e..a3ca166 100644 --- a/src/main/kotlin/com/coderjoe/atlas/Atlas.kt +++ b/src/main/kotlin/com/coderjoe/atlas/Atlas.kt @@ -1,21 +1,40 @@ package com.coderjoe.atlas import com.coderjoe.atlas.core.AtlasBlockListener +import com.coderjoe.atlas.core.BlockDescriptor import com.coderjoe.atlas.core.BlockSystem +import com.coderjoe.atlas.fluid.FluidBlock import com.coderjoe.atlas.fluid.FluidBlockDialog import com.coderjoe.atlas.fluid.FluidBlockFactory import com.coderjoe.atlas.fluid.FluidBlockPersistence import com.coderjoe.atlas.fluid.FluidBlockRegistry +import com.coderjoe.atlas.fluid.block.FluidContainer +import com.coderjoe.atlas.fluid.block.FluidMerger +import com.coderjoe.atlas.fluid.block.FluidPipe +import com.coderjoe.atlas.fluid.block.FluidPump import com.coderjoe.atlas.guide.GuideBook import com.coderjoe.atlas.guide.GuideBookListener +import com.coderjoe.atlas.power.PowerBlock import com.coderjoe.atlas.power.PowerBlockDialog import com.coderjoe.atlas.power.PowerBlockFactory import com.coderjoe.atlas.power.PowerBlockPersistence import com.coderjoe.atlas.power.PowerBlockRegistry +import com.coderjoe.atlas.power.block.LavaGenerator +import com.coderjoe.atlas.power.block.PowerCable +import com.coderjoe.atlas.power.block.PowerMerger +import com.coderjoe.atlas.power.block.PowerSplitter +import com.coderjoe.atlas.power.block.SmallBattery +import com.coderjoe.atlas.power.block.SmallSolarPanel +import com.coderjoe.atlas.transport.TransportBlock import com.coderjoe.atlas.transport.TransportBlockDialog import com.coderjoe.atlas.transport.TransportBlockFactory import com.coderjoe.atlas.transport.TransportBlockPersistence import com.coderjoe.atlas.transport.TransportBlockRegistry +import com.coderjoe.atlas.transport.block.ConveyorBelt +import com.coderjoe.atlas.utility.block.AutoSmelter +import com.coderjoe.atlas.utility.block.CobblestoneFactory +import com.coderjoe.atlas.utility.block.ObsidianFactory +import com.coderjoe.atlas.utility.block.SmallDrill import org.bukkit.plugin.java.JavaPlugin import org.bukkit.scheduler.BukkitTask @@ -51,29 +70,29 @@ class Atlas : JavaPlugin() { // Register unified listener val powerSystem = - BlockSystem( + BlockSystem( name = "power", registry = powerBlockRegistry, factory = PowerBlockFactory, descriptors = powerDescriptors(), showDialog = { player, block -> - PowerBlockDialog.showPowerDialog(player, block as com.coderjoe.atlas.power.PowerBlock, powerBlockRegistry) + PowerBlockDialog.showPowerDialog(player, block as PowerBlock, powerBlockRegistry) }, ) val fluidSystem = - BlockSystem( + BlockSystem( name = "fluid", registry = fluidBlockRegistry, factory = FluidBlockFactory, descriptors = fluidDescriptors(), showDialog = { player, block -> - FluidBlockDialog.showFluidDialog(player, block as com.coderjoe.atlas.fluid.FluidBlock, fluidBlockRegistry) + FluidBlockDialog.showFluidDialog(player, block as FluidBlock, fluidBlockRegistry) }, ) val transportSystem = - BlockSystem( + BlockSystem( name = "transport", registry = transportBlockRegistry, factory = TransportBlockFactory, @@ -81,7 +100,7 @@ class Atlas : JavaPlugin() { showDialog = { player, block -> TransportBlockDialog.showTransportDialog( player, - block as com.coderjoe.atlas.transport.TransportBlock, + block as TransportBlock, transportBlockRegistry, ) }, @@ -172,33 +191,33 @@ class Atlas : JavaPlugin() { logger.atlasInfo("Transport system initialized with ${TransportBlockFactory.getRegisteredBlockIds().size} block types") } - private fun transportDescriptors(): Map { + private fun transportDescriptors(): Map { return listOf( - com.coderjoe.atlas.transport.block.ConveyorBelt.descriptor, + ConveyorBelt.descriptor, ).associateBy { it.baseBlockId } } - private fun powerDescriptors(): Map { + private fun powerDescriptors(): Map { return listOf( - com.coderjoe.atlas.power.block.SmallSolarPanel.descriptor, - com.coderjoe.atlas.utility.block.SmallDrill.descriptor, - com.coderjoe.atlas.power.block.SmallBattery.descriptor, - com.coderjoe.atlas.power.block.PowerCable.descriptor, - com.coderjoe.atlas.power.block.LavaGenerator.descriptor, - com.coderjoe.atlas.utility.block.AutoSmelter.descriptor, - com.coderjoe.atlas.power.block.PowerSplitter.descriptor, - com.coderjoe.atlas.utility.block.CobblestoneFactory.descriptor, - com.coderjoe.atlas.utility.block.ObsidianFactory.descriptor, - com.coderjoe.atlas.power.block.PowerMerger.descriptor, + SmallSolarPanel.descriptor, + SmallDrill.descriptor, + SmallBattery.descriptor, + PowerCable.descriptor, + LavaGenerator.descriptor, + AutoSmelter.descriptor, + PowerSplitter.descriptor, + CobblestoneFactory.descriptor, + ObsidianFactory.descriptor, + PowerMerger.descriptor, ).associateBy { it.baseBlockId } } - private fun fluidDescriptors(): Map { + private fun fluidDescriptors(): Map { return listOf( - com.coderjoe.atlas.fluid.block.FluidPump.descriptor, - com.coderjoe.atlas.fluid.block.FluidPipe.descriptor, - com.coderjoe.atlas.fluid.block.FluidContainer.descriptor, - com.coderjoe.atlas.fluid.block.FluidMerger.descriptor, + FluidPump.descriptor, + FluidPipe.descriptor, + FluidContainer.descriptor, + FluidMerger.descriptor, ).associateBy { it.baseBlockId } } } diff --git a/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidPump.kt b/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidPump.kt index 1b2dc45..b662300 100644 --- a/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidPump.kt +++ b/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidPump.kt @@ -9,6 +9,7 @@ import com.coderjoe.atlas.power.PowerBlockRegistry import org.bukkit.Location import org.bukkit.Material import org.bukkit.block.BlockFace +import org.bukkit.block.data.Levelled class FluidPump(location: Location) : FluidBlock(location) { enum class PumpStatus { @@ -128,7 +129,7 @@ class FluidPump(location: Location) : FluidBlock(location) { when (foundBlock.type) { Material.WATER_CAULDRON -> { - val levelled = foundBlock.blockData as? org.bukkit.block.data.Levelled + val levelled = foundBlock.blockData as? Levelled if (levelled != null && levelled.level > 1) { levelled.level = levelled.level - 1 foundBlock.blockData = levelled diff --git a/src/main/kotlin/com/coderjoe/atlas/power/block/LavaGenerator.kt b/src/main/kotlin/com/coderjoe/atlas/power/block/LavaGenerator.kt index 6d0ed84..4226e31 100644 --- a/src/main/kotlin/com/coderjoe/atlas/power/block/LavaGenerator.kt +++ b/src/main/kotlin/com/coderjoe/atlas/power/block/LavaGenerator.kt @@ -3,6 +3,7 @@ package com.coderjoe.atlas.power.block import com.coderjoe.atlas.atlasInfo import com.coderjoe.atlas.core.BlockDescriptor import com.coderjoe.atlas.core.PlacementType +import com.coderjoe.atlas.fluid.FluidBlock import com.coderjoe.atlas.fluid.FluidBlockRegistry import com.coderjoe.atlas.fluid.FluidType import com.coderjoe.atlas.power.PowerBlock @@ -60,7 +61,7 @@ class LavaGenerator(location: Location) : PowerBlock(location, maxStorage = 50) } private fun tryPullLava( - source: com.coderjoe.atlas.fluid.FluidBlock, + source: FluidBlock, face: BlockFace, ): Boolean { if (source.canProvideFluid(face.oppositeFace) && source.storedFluid == FluidType.LAVA) { diff --git a/src/main/kotlin/com/coderjoe/atlas/utility/block/CobblestoneFactory.kt b/src/main/kotlin/com/coderjoe/atlas/utility/block/CobblestoneFactory.kt index e3b9462..14ec069 100644 --- a/src/main/kotlin/com/coderjoe/atlas/utility/block/CobblestoneFactory.kt +++ b/src/main/kotlin/com/coderjoe/atlas/utility/block/CobblestoneFactory.kt @@ -3,6 +3,7 @@ package com.coderjoe.atlas.utility.block import com.coderjoe.atlas.atlasInfo import com.coderjoe.atlas.core.BlockDescriptor import com.coderjoe.atlas.core.PlacementType +import com.coderjoe.atlas.fluid.FluidBlock import com.coderjoe.atlas.fluid.FluidBlockRegistry import com.coderjoe.atlas.fluid.FluidType import com.coderjoe.atlas.power.PowerBlock @@ -46,8 +47,8 @@ class CobblestoneFactory(location: Location) : PowerBlock(location, maxStorage = val fluidRegistry = FluidBlockRegistry.instance ?: return - var waterSource: Pair? = null - var lavaSource: Pair? = null + var waterSource: Pair? = null + var lavaSource: Pair? = null for (face in ADJACENT_FACES) { val source = fluidRegistry.getAdjacentFluidBlock(location, face) ?: continue @@ -75,7 +76,7 @@ class CobblestoneFactory(location: Location) : PowerBlock(location, maxStorage = } private fun hasFluidAvailable( - source: com.coderjoe.atlas.fluid.FluidBlock, + source: FluidBlock, face: BlockFace, fluidType: FluidType, ): Boolean { diff --git a/src/main/kotlin/com/coderjoe/atlas/utility/block/ObsidianFactory.kt b/src/main/kotlin/com/coderjoe/atlas/utility/block/ObsidianFactory.kt index af7b136..1141318 100644 --- a/src/main/kotlin/com/coderjoe/atlas/utility/block/ObsidianFactory.kt +++ b/src/main/kotlin/com/coderjoe/atlas/utility/block/ObsidianFactory.kt @@ -3,6 +3,7 @@ package com.coderjoe.atlas.utility.block import com.coderjoe.atlas.atlasInfo import com.coderjoe.atlas.core.BlockDescriptor import com.coderjoe.atlas.core.PlacementType +import com.coderjoe.atlas.fluid.FluidBlock import com.coderjoe.atlas.fluid.FluidBlockRegistry import com.coderjoe.atlas.fluid.FluidType import com.coderjoe.atlas.power.PowerBlock @@ -46,8 +47,8 @@ class ObsidianFactory(location: Location) : PowerBlock(location, maxStorage = 10 val fluidRegistry = FluidBlockRegistry.instance ?: return - var waterSource: Pair? = null - var lavaSource: Pair? = null + var waterSource: Pair? = null + var lavaSource: Pair? = null for (face in ADJACENT_FACES) { val source = fluidRegistry.getAdjacentFluidBlock(location, face) ?: continue @@ -75,7 +76,7 @@ class ObsidianFactory(location: Location) : PowerBlock(location, maxStorage = 10 } private fun hasFluidAvailable( - source: com.coderjoe.atlas.fluid.FluidBlock, + source: FluidBlock, face: BlockFace, fluidType: FluidType, ): Boolean {