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} 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/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/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 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 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 - } }