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
67 changes: 43 additions & 24 deletions src/main/kotlin/com/coderjoe/atlas/Atlas.kt
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -51,37 +70,37 @@ class Atlas : JavaPlugin() {

// Register unified listener
val powerSystem =
BlockSystem<com.coderjoe.atlas.power.PowerBlock>(
BlockSystem<PowerBlock>(
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<com.coderjoe.atlas.fluid.FluidBlock>(
BlockSystem<FluidBlock>(
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<com.coderjoe.atlas.transport.TransportBlock>(
BlockSystem<TransportBlock>(
name = "transport",
registry = transportBlockRegistry,
factory = TransportBlockFactory,
descriptors = transportDescriptors(),
showDialog = { player, block ->
TransportBlockDialog.showTransportDialog(
player,
block as com.coderjoe.atlas.transport.TransportBlock,
block as TransportBlock,
transportBlockRegistry,
)
},
Expand Down Expand Up @@ -172,33 +191,33 @@ class Atlas : JavaPlugin() {
logger.atlasInfo("Transport system initialized with ${TransportBlockFactory.getRegisteredBlockIds().size} block types")
}

private fun transportDescriptors(): Map<String, com.coderjoe.atlas.core.BlockDescriptor> {
private fun transportDescriptors(): Map<String, BlockDescriptor> {
return listOf(
com.coderjoe.atlas.transport.block.ConveyorBelt.descriptor,
ConveyorBelt.descriptor,
).associateBy { it.baseBlockId }
}

private fun powerDescriptors(): Map<String, com.coderjoe.atlas.core.BlockDescriptor> {
private fun powerDescriptors(): Map<String, BlockDescriptor> {
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<String, com.coderjoe.atlas.core.BlockDescriptor> {
private fun fluidDescriptors(): Map<String, BlockDescriptor> {
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 }
}
}
10 changes: 10 additions & 0 deletions src/main/kotlin/com/coderjoe/atlas/core/AtlasBlock.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
44 changes: 44 additions & 0 deletions src/main/kotlin/com/coderjoe/atlas/core/AtlasBlockDialog.kt
Original file line number Diff line number Diff line change
@@ -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<UUID, BukkitTask>()
Expand All @@ -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,
Expand Down
3 changes: 3 additions & 0 deletions src/main/kotlin/com/coderjoe/atlas/fluid/FluidBlock.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@ 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,
var storedFluid: FluidType = FluidType.NONE,
) : 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
Expand Down
45 changes: 5 additions & 40 deletions src/main/kotlin/com/coderjoe/atlas/fluid/FluidBlockDialog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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"
}

Expand Down
63 changes: 11 additions & 52 deletions src/main/kotlin/com/coderjoe/atlas/fluid/block/FluidContainer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
}
}

Expand Down
Loading
Loading