Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<kotlin.code.style>official</kotlin.code.style>
<kotlin.version>2.3.10</kotlin.version>
<kotlin.version>2.3.20</kotlin.version>
<java.version>21</java.version>
<jacoco.version>0.8.14</jacoco.version>
<spotless.version>3.4.0</spotless.version>
</properties>

<repositories>
Expand Down Expand Up @@ -102,7 +103,7 @@
<plugin>
<groupId>com.diffplug.spotless</groupId>
<artifactId>spotless-maven-plugin</artifactId>
<version>3.2.1</version>
<version>${spotless.version}</version>
<configuration>
<kotlin>
<ktlint>
Expand Down
5 changes: 5 additions & 0 deletions src/main/kotlin/com/coderjoe/atlas/fluid/FluidBlock.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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 {
Expand Down
8 changes: 4 additions & 4 deletions src/main/kotlin/com/coderjoe/atlas/fluid/FluidType.kt
Original file line number Diff line number Diff line change
@@ -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"),
}
Original file line number Diff line number Diff line change
Expand Up @@ -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())
}

Expand Down
16 changes: 1 addition & 15 deletions src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidMerger.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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()
Expand All @@ -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
Expand Down
12 changes: 0 additions & 12 deletions src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidPipe.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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()
Expand Down
12 changes: 0 additions & 12 deletions src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidSplitter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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"
Expand All @@ -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<FluidBlock, BlockFace>? = null
var lavaSource: Pair<FluidBlock, BlockFace>? = 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
}
}
Original file line number Diff line number Diff line change
@@ -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<FluidBlock, BlockFace>? = null
var lavaSource: Pair<FluidBlock, BlockFace>? = 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
}
}
Loading
Loading