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/core/AtlasBlock.kt b/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlock.kt index a5c82f6..a25e781 100644 --- a/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlock.kt +++ b/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlock.kt @@ -20,6 +20,16 @@ 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/core/AtlasBlockDialog.kt b/src/main/kotlin/com/coderjoe/atlas/core/AtlasBlockDialog.kt index 43e1942..629b999 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,38 @@ 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/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/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/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 7b46b91..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 { @@ -34,16 +35,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, @@ -62,6 +53,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 @@ -136,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/PowerBlock.kt b/src/main/kotlin/com/coderjoe/atlas/power/PowerBlock.kt index 2ecea3a..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( @@ -28,6 +29,25 @@ 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 fun updatePoweredState() { + CraftEngineHelper.setBooleanProperty(location, "powered", hasPower()) + } + protected abstract fun powerUpdate() override fun blockUpdate() { 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/power/block/LavaGenerator.kt b/src/main/kotlin/com/coderjoe/atlas/power/block/LavaGenerator.kt index 3c06087..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,12 +3,9 @@ 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.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 @@ -22,16 +19,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, @@ -74,34 +61,12 @@ class LavaGenerator(location: Location) : PowerBlock(location, maxStorage = 50) } private fun tryPullLava( - source: com.coderjoe.atlas.fluid.FluidBlock, + source: 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/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/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" } 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..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,10 +1,8 @@ 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 com.coderjoe.atlas.power.PowerBlockRegistry import org.bukkit.Bukkit import org.bukkit.Location import org.bukkit.block.BlockFace @@ -50,19 +48,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 @@ -92,9 +78,4 @@ class AutoSmelter(location: Location, facing: BlockFace = BlockFace.NORTH) : Pow updatePoweredState() } - - private fun updatePoweredState() { - val shouldBePowered = hasPower() - CraftEngineHelper.setBooleanProperty(location, "powered", shouldBePowered) - } } 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..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,14 +3,10 @@ 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.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 com.coderjoe.atlas.power.PowerBlockRegistry import org.bukkit.Location import org.bukkit.Material import org.bukkit.block.BlockFace @@ -25,16 +21,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, @@ -55,26 +41,14 @@ 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 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 @@ -88,8 +62,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 @@ -102,28 +76,10 @@ class CobblestoneFactory(location: Location) : PowerBlock(location, maxStorage = } private fun hasFluidAvailable( - source: com.coderjoe.atlas.fluid.FluidBlock, + source: FluidBlock, 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 ad724a8..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,14 +3,10 @@ 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.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 com.coderjoe.atlas.power.PowerBlockRegistry import org.bukkit.Location import org.bukkit.Material import org.bukkit.block.BlockFace @@ -25,16 +21,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, @@ -55,26 +41,14 @@ 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 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 @@ -88,8 +62,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 @@ -102,28 +76,10 @@ class ObsidianFactory(location: Location) : PowerBlock(location, maxStorage = 10 } private fun hasFluidAvailable( - source: com.coderjoe.atlas.fluid.FluidBlock, + source: FluidBlock, 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/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