From 3139986b8be8798331a3b28a3863cd036034079a Mon Sep 17 00:00:00 2001 From: CoderJoe Date: Thu, 19 Mar 2026 23:05:06 -0500 Subject: [PATCH 1/4] Use ADJACENT_FACES in PowerSplitter and FluidMerger Replace inline listOf(BlockFace.NORTH, ...) with the inherited ADJACENT_FACES constant from AtlasBlock. --- .../coderjoe/atlas/fluid/block/FluidMerger.kt | 16 +--------------- .../coderjoe/atlas/power/block/PowerSplitter.kt | 4 +--- 2 files changed, 2 insertions(+), 18 deletions(-) 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 c038572..0242f73 100644 --- a/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidMerger.kt +++ b/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidMerger.kt @@ -2,11 +2,9 @@ package com.coderjoe.atlas.fluid.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.fluid.FluidBlock import com.coderjoe.atlas.fluid.FluidBlockRegistry -import com.coderjoe.atlas.fluid.FluidType import org.bukkit.Location import org.bukkit.block.BlockFace @@ -30,16 +28,6 @@ class FluidMerger(location: Location, override val facing: BlockFace) : FluidBlo override fun getVisualStateBlockId(): String = BLOCK_ID - private fun updateFluidState() { - val fluidValue = - when (storedFluid) { - FluidType.WATER -> "water" - FluidType.LAVA -> "lava" - FluidType.NONE -> "none" - } - CraftEngineHelper.setStringProperty(location, "fluid", fluidValue) - } - override fun fluidUpdate() { if (hasFluid()) { updateFluidState() @@ -48,9 +36,7 @@ class FluidMerger(location: Location, override val facing: BlockFace) : FluidBlo val registry = FluidBlockRegistry.instance ?: return - val inputFaces = - listOf(BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST, BlockFace.UP, BlockFace.DOWN) - .filter { it != facing } + val inputFaces = ADJACENT_FACES.filter { it != facing } for (face in inputFaces) { val source = registry.getAdjacentFluidBlock(location, face) ?: continue 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 93e5a4d..c01562f 100644 --- a/src/main/kotlin/com/coderjoe/atlas/power/block/PowerSplitter.kt +++ b/src/main/kotlin/com/coderjoe/atlas/power/block/PowerSplitter.kt @@ -46,9 +46,7 @@ class PowerSplitter(location: Location, override val facing: BlockFace) : PowerB } if (hasPower()) { - val outputFaces = - listOf(BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST, BlockFace.UP, BlockFace.DOWN) - .filter { it != facing.oppositeFace } + val outputFaces = ADJACENT_FACES.filter { it != facing.oppositeFace } for (face in outputFaces) { if (!hasPower()) break From 28448c294e51debe36e5606e5a84c22aa4272e92 Mon Sep 17 00:00:00 2001 From: CoderJoe Date: Thu, 19 Mar 2026 23:05:12 -0500 Subject: [PATCH 2/4] Extract updateFluidState() to FluidBlock base class Add propertyName to FluidType enum and move the duplicated updateFluidState() method into FluidBlock. FluidContainer reuses it inside its own updateProperties() alongside fill_level. --- .../kotlin/com/coderjoe/atlas/fluid/FluidBlock.kt | 5 +++++ .../kotlin/com/coderjoe/atlas/fluid/FluidType.kt | 8 ++++---- .../com/coderjoe/atlas/fluid/block/FluidContainer.kt | 8 +------- .../com/coderjoe/atlas/fluid/block/FluidPipe.kt | 12 ------------ .../com/coderjoe/atlas/fluid/block/FluidSplitter.kt | 12 ------------ 5 files changed, 10 insertions(+), 35 deletions(-) diff --git a/src/main/kotlin/com/coderjoe/atlas/fluid/FluidBlock.kt b/src/main/kotlin/com/coderjoe/atlas/fluid/FluidBlock.kt index d9aac68..3d8256c 100644 --- a/src/main/kotlin/com/coderjoe/atlas/fluid/FluidBlock.kt +++ b/src/main/kotlin/com/coderjoe/atlas/fluid/FluidBlock.kt @@ -2,6 +2,7 @@ package com.coderjoe.atlas.fluid import com.coderjoe.atlas.core.AtlasBlock import com.coderjoe.atlas.core.BlockRegistry +import com.coderjoe.atlas.core.CraftEngineHelper import org.bukkit.Location import org.bukkit.block.BlockFace @@ -11,6 +12,10 @@ abstract class FluidBlock( ) : AtlasBlock(location) { open fun hasFluid(): Boolean = storedFluid != FluidType.NONE + protected fun updateFluidState() { + CraftEngineHelper.setStringProperty(location, "fluid", storedFluid.propertyName) + } + open fun canProvideFluid(requestDirection: BlockFace): Boolean = hasFluid() open fun storeFluid(type: FluidType): Boolean { diff --git a/src/main/kotlin/com/coderjoe/atlas/fluid/FluidType.kt b/src/main/kotlin/com/coderjoe/atlas/fluid/FluidType.kt index 8743ed8..296b89b 100644 --- a/src/main/kotlin/com/coderjoe/atlas/fluid/FluidType.kt +++ b/src/main/kotlin/com/coderjoe/atlas/fluid/FluidType.kt @@ -1,7 +1,7 @@ package com.coderjoe.atlas.fluid -enum class FluidType { - WATER, - LAVA, - NONE, +enum class FluidType(val propertyName: String) { + WATER("water"), + LAVA("lava"), + NONE("none"), } 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 f56d0ff..30ae46f 100644 --- a/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidContainer.kt +++ b/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidContainer.kt @@ -69,13 +69,7 @@ class FluidContainer(location: Location, override val facing: BlockFace) : Fluid override fun getVisualStateBlockId(): String = BLOCK_ID private fun updateProperties() { - val fluidValue = - when (storedFluid) { - FluidType.WATER -> "water" - FluidType.LAVA -> "lava" - FluidType.NONE -> "none" - } - CraftEngineHelper.setStringProperty(location, "fluid", fluidValue) + updateFluidState() CraftEngineHelper.setIntProperty(location, "fill_level", getFillLevel()) } 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 a367980..9d12547 100644 --- a/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidPipe.kt +++ b/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidPipe.kt @@ -2,11 +2,9 @@ package com.coderjoe.atlas.fluid.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.fluid.FluidBlock import com.coderjoe.atlas.fluid.FluidBlockRegistry -import com.coderjoe.atlas.fluid.FluidType import org.bukkit.Location import org.bukkit.block.BlockFace @@ -30,16 +28,6 @@ class FluidPipe(location: Location, override val facing: BlockFace) : FluidBlock override fun getVisualStateBlockId(): String = BLOCK_ID - private fun updateFluidState() { - val fluidValue = - when (storedFluid) { - FluidType.WATER -> "water" - FluidType.LAVA -> "lava" - FluidType.NONE -> "none" - } - CraftEngineHelper.setStringProperty(location, "fluid", fluidValue) - } - override fun fluidUpdate() { if (hasFluid()) { updateFluidState() diff --git a/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidSplitter.kt b/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidSplitter.kt index bcc7802..0b965fe 100644 --- a/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidSplitter.kt +++ b/src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidSplitter.kt @@ -2,11 +2,9 @@ package com.coderjoe.atlas.fluid.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.fluid.FluidBlock import com.coderjoe.atlas.fluid.FluidBlockRegistry -import com.coderjoe.atlas.fluid.FluidType import org.bukkit.Location import org.bukkit.block.BlockFace @@ -30,16 +28,6 @@ class FluidSplitter(location: Location, override val facing: BlockFace) : FluidB override fun getVisualStateBlockId(): String = BLOCK_ID - private fun updateFluidState() { - val fluidValue = - when (storedFluid) { - FluidType.WATER -> "water" - FluidType.LAVA -> "lava" - FluidType.NONE -> "none" - } - CraftEngineHelper.setStringProperty(location, "fluid", fluidValue) - } - override fun fluidUpdate() { val registry = FluidBlockRegistry.instance ?: return From 7340cf4a3ae812af3577c0e1f926b855f0623856 Mon Sep 17 00:00:00 2001 From: CoderJoe Date: Thu, 19 Mar 2026 23:05:22 -0500 Subject: [PATCH 3/4] Extract MaterialFactory base class from factory blocks CobblestoneFactory and ObsidianFactory had nearly identical powerUpdate() and hasFluidAvailable() methods. Pull shared logic into an abstract MaterialFactory with powerCost and outputMaterial as the only varying properties. --- .../atlas/utility/block/CobblestoneFactory.kt | 57 +--------------- .../atlas/utility/block/MaterialFactory.kt | 66 +++++++++++++++++++ .../atlas/utility/block/ObsidianFactory.kt | 57 +--------------- 3 files changed, 72 insertions(+), 108 deletions(-) create mode 100644 src/main/kotlin/com/coderjoe/atlas/utility/block/MaterialFactory.kt 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 14ec069..17fae13 100644 --- a/src/main/kotlin/com/coderjoe/atlas/utility/block/CobblestoneFactory.kt +++ b/src/main/kotlin/com/coderjoe/atlas/utility/block/CobblestoneFactory.kt @@ -1,21 +1,11 @@ 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 import org.bukkit.Location import org.bukkit.Material -import org.bukkit.block.BlockFace -import org.bukkit.inventory.ItemStack - -class CobblestoneFactory(location: Location) : PowerBlock(location, maxStorage = 2) { - override val canReceivePower: Boolean = true - override val updateIntervalTicks: Long = 20L +class CobblestoneFactory(location: Location) : MaterialFactory(location, maxStorage = 2) { companion object { const val BLOCK_ID = "atlas:cobblestone_factory" const val BLOCK_ID_ACTIVE = "atlas:cobblestone_factory_active" @@ -33,53 +23,12 @@ class CobblestoneFactory(location: Location) : PowerBlock(location, maxStorage = } override val baseBlockId: String = BLOCK_ID + override val powerCost: Int = POWER_COST + override val outputMaterial: Material = Material.COBBLESTONE override fun getVisualStateBlockId(): String = when { currentPower >= POWER_COST -> BLOCK_ID_ACTIVE else -> BLOCK_ID } - - override fun powerUpdate() { - pullPowerFromNeighbors() - - if (currentPower < POWER_COST) return - - val fluidRegistry = FluidBlockRegistry.instance ?: return - - var waterSource: Pair? = null - var lavaSource: Pair? = null - - for (face in ADJACENT_FACES) { - val source = fluidRegistry.getAdjacentFluidBlock(location, face) ?: continue - if (waterSource == null && hasFluidAvailable(source, face, FluidType.WATER)) { - waterSource = Pair(source, face) - } else if (lavaSource == null && hasFluidAvailable(source, face, FluidType.LAVA)) { - lavaSource = Pair(source, face) - } - if (waterSource != null && lavaSource != null) break - } - - if (waterSource == null || lavaSource == null) return - - waterSource.first.removeFluid() - lavaSource.first.removeFluid() - removePower(POWER_COST) - - val world = location.world ?: return - val dropLocation = location.clone().add(0.5, 1.5, 0.5) - world.dropItem(dropLocation, ItemStack(Material.COBBLESTONE)) - - plugin.logger.atlasInfo( - "CobblestoneFactory at ${location.blockX},${location.blockY},${location.blockZ} produced 1 cobblestone", - ) - } - - private fun hasFluidAvailable( - source: FluidBlock, - face: BlockFace, - fluidType: FluidType, - ): Boolean { - return source.canProvideFluid(face.oppositeFace) && source.storedFluid == fluidType - } } diff --git a/src/main/kotlin/com/coderjoe/atlas/utility/block/MaterialFactory.kt b/src/main/kotlin/com/coderjoe/atlas/utility/block/MaterialFactory.kt new file mode 100644 index 0000000..2723856 --- /dev/null +++ b/src/main/kotlin/com/coderjoe/atlas/utility/block/MaterialFactory.kt @@ -0,0 +1,66 @@ +package com.coderjoe.atlas.utility.block + +import com.coderjoe.atlas.atlasInfo +import com.coderjoe.atlas.fluid.FluidBlock +import com.coderjoe.atlas.fluid.FluidBlockRegistry +import com.coderjoe.atlas.fluid.FluidType +import com.coderjoe.atlas.power.PowerBlock +import org.bukkit.Location +import org.bukkit.Material +import org.bukkit.block.BlockFace +import org.bukkit.inventory.ItemStack + +abstract class MaterialFactory( + location: Location, + maxStorage: Int, +) : PowerBlock(location, maxStorage) { + override val canReceivePower: Boolean = true + override val updateIntervalTicks: Long = 20L + + protected abstract val powerCost: Int + protected abstract val outputMaterial: Material + + override fun powerUpdate() { + pullPowerFromNeighbors() + + if (currentPower < powerCost) return + + val fluidRegistry = FluidBlockRegistry.instance ?: return + + var waterSource: Pair? = null + var lavaSource: Pair? = null + + for (face in ADJACENT_FACES) { + val source = fluidRegistry.getAdjacentFluidBlock(location, face) ?: continue + if (waterSource == null && hasFluidAvailable(source, face, FluidType.WATER)) { + waterSource = Pair(source, face) + } else if (lavaSource == null && hasFluidAvailable(source, face, FluidType.LAVA)) { + lavaSource = Pair(source, face) + } + if (waterSource != null && lavaSource != null) break + } + + if (waterSource == null || lavaSource == null) return + + waterSource.first.removeFluid() + lavaSource.first.removeFluid() + removePower(powerCost) + + val world = location.world ?: return + val dropLocation = location.clone().add(0.5, 1.5, 0.5) + world.dropItem(dropLocation, ItemStack(outputMaterial)) + + plugin.logger.atlasInfo( + "${this::class.simpleName} at ${location.blockX},${location.blockY},${location.blockZ} " + + "produced 1 ${outputMaterial.name.lowercase()}", + ) + } + + private fun hasFluidAvailable( + source: FluidBlock, + face: BlockFace, + fluidType: FluidType, + ): Boolean { + 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 1141318..c193ff5 100644 --- a/src/main/kotlin/com/coderjoe/atlas/utility/block/ObsidianFactory.kt +++ b/src/main/kotlin/com/coderjoe/atlas/utility/block/ObsidianFactory.kt @@ -1,21 +1,11 @@ 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 import org.bukkit.Location import org.bukkit.Material -import org.bukkit.block.BlockFace -import org.bukkit.inventory.ItemStack - -class ObsidianFactory(location: Location) : PowerBlock(location, maxStorage = 100) { - override val canReceivePower: Boolean = true - override val updateIntervalTicks: Long = 20L +class ObsidianFactory(location: Location) : MaterialFactory(location, maxStorage = 100) { companion object { const val BLOCK_ID = "atlas:obsidian_factory" const val BLOCK_ID_ACTIVE = "atlas:obsidian_factory_active" @@ -33,53 +23,12 @@ class ObsidianFactory(location: Location) : PowerBlock(location, maxStorage = 10 } override val baseBlockId: String = BLOCK_ID + override val powerCost: Int = POWER_COST + override val outputMaterial: Material = Material.OBSIDIAN override fun getVisualStateBlockId(): String = when { currentPower >= POWER_COST -> BLOCK_ID_ACTIVE else -> BLOCK_ID } - - override fun powerUpdate() { - pullPowerFromNeighbors() - - if (currentPower < POWER_COST) return - - val fluidRegistry = FluidBlockRegistry.instance ?: return - - var waterSource: Pair? = null - var lavaSource: Pair? = null - - for (face in ADJACENT_FACES) { - val source = fluidRegistry.getAdjacentFluidBlock(location, face) ?: continue - if (waterSource == null && hasFluidAvailable(source, face, FluidType.WATER)) { - waterSource = Pair(source, face) - } else if (lavaSource == null && hasFluidAvailable(source, face, FluidType.LAVA)) { - lavaSource = Pair(source, face) - } - if (waterSource != null && lavaSource != null) break - } - - if (waterSource == null || lavaSource == null) return - - waterSource.first.removeFluid() - lavaSource.first.removeFluid() - removePower(POWER_COST) - - val world = location.world ?: return - val dropLocation = location.clone().add(0.5, 1.5, 0.5) - world.dropItem(dropLocation, ItemStack(Material.OBSIDIAN)) - - plugin.logger.atlasInfo( - "ObsidianFactory at ${location.blockX},${location.blockY},${location.blockZ} produced 1 obsidian", - ) - } - - private fun hasFluidAvailable( - source: FluidBlock, - face: BlockFace, - fluidType: FluidType, - ): Boolean { - return source.canProvideFluid(face.oppositeFace) && source.storedFluid == fluidType - } } From 9e6df7efa2cb1341d39460cc782528d0f1f8188b Mon Sep 17 00:00:00 2001 From: CoderJoe Date: Thu, 19 Mar 2026 23:07:25 -0500 Subject: [PATCH 4/4] Bump Kotlin to 2.3.20 and Spotless to 3.4.0 --- pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index fdc35ce..604fa47 100644 --- a/pom.xml +++ b/pom.xml @@ -12,9 +12,10 @@ UTF-8 official - 2.3.10 + 2.3.20 21 0.8.14 + 3.4.0 @@ -102,7 +103,7 @@ com.diffplug.spotless spotless-maven-plugin - 3.2.1 + ${spotless.version}