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