diff --git a/common-heimdall/src/main/kotlin/gay/pizza/foundation/heimdall/export/ExportedChunk.kt b/common-heimdall/src/main/kotlin/gay/pizza/foundation/heimdall/export/ExportedChunk.kt index 92e71d9..77adaf8 100644 --- a/common-heimdall/src/main/kotlin/gay/pizza/foundation/heimdall/export/ExportedChunk.kt +++ b/common-heimdall/src/main/kotlin/gay/pizza/foundation/heimdall/export/ExportedChunk.kt @@ -4,6 +4,7 @@ import kotlinx.serialization.Serializable @Serializable data class ExportedChunk( + val blocks: List, val x: Int, val z: Int, val sections: List diff --git a/common-heimdall/src/main/kotlin/gay/pizza/foundation/heimdall/export/ExportedChunkSection.kt b/common-heimdall/src/main/kotlin/gay/pizza/foundation/heimdall/export/ExportedChunkSection.kt index 0215c1f..91e789c 100644 --- a/common-heimdall/src/main/kotlin/gay/pizza/foundation/heimdall/export/ExportedChunkSection.kt +++ b/common-heimdall/src/main/kotlin/gay/pizza/foundation/heimdall/export/ExportedChunkSection.kt @@ -6,5 +6,5 @@ import kotlinx.serialization.Serializable data class ExportedChunkSection( val x: Int, val z: Int, - val blocks: List + val blocks: List ) diff --git a/common-plugin/build.gradle.kts b/common-plugin/build.gradle.kts new file mode 100644 index 0000000..36dc4fa --- /dev/null +++ b/common-plugin/build.gradle.kts @@ -0,0 +1,3 @@ +plugins { + id("gay.pizza.foundation.concrete-library") +} diff --git a/common-plugin/src/main/kotlin/gay/pizza/foundation/common/SpawnExtensions.kt b/common-plugin/src/main/kotlin/gay/pizza/foundation/common/SpawnExtensions.kt new file mode 100644 index 0000000..c0f334d --- /dev/null +++ b/common-plugin/src/main/kotlin/gay/pizza/foundation/common/SpawnExtensions.kt @@ -0,0 +1,12 @@ +package gay.pizza.foundation.common + +import org.bukkit.Location +import org.bukkit.World +import org.bukkit.entity.Entity +import org.bukkit.entity.Player +import kotlin.reflect.KClass + +fun World.spawn(location: Location, clazz: KClass): T = spawn(location, clazz.java) + +fun Player.spawn(clazz: KClass): T = spawn(clazz.java) +fun Player.spawn(clazz: Class): T = world.spawn(location, clazz) diff --git a/foundation-chaos/build.gradle.kts b/foundation-chaos/build.gradle.kts index 1872b5a..b4cb561 100644 --- a/foundation-chaos/build.gradle.kts +++ b/foundation-chaos/build.gradle.kts @@ -3,5 +3,6 @@ plugins { } dependencies { + implementation(project(":common-plugin")) compileOnly(project(":foundation-core")) } diff --git a/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/ChaosController.kt b/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/ChaosController.kt index 090bbcb..3ff60a3 100644 --- a/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/ChaosController.kt +++ b/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/ChaosController.kt @@ -1,9 +1,9 @@ package gay.pizza.foundation.chaos import gay.pizza.foundation.chaos.model.ChaosConfig +import gay.pizza.foundation.chaos.model.ChaosModuleConfig import gay.pizza.foundation.chaos.modules.ChaosModule import gay.pizza.foundation.chaos.modules.ChaosModules -import net.kyori.adventure.text.Component import org.bukkit.boss.BarColor import org.bukkit.boss.BarStyle import org.bukkit.boss.BossBar @@ -28,7 +28,7 @@ class ChaosController(val plugin: Plugin, val config: ChaosConfig) : Listener { if (state.get()) { return } - allowedModules = allModules.filter { config.enable[it.id()] ?: true } + allowedModules = filterEnabledModules() state.set(true) selectorController.schedule() bossBar = plugin.server.createBossBar("Chaos Mode", BarColor.RED, BarStyle.SOLID) @@ -37,6 +37,11 @@ class ChaosController(val plugin: Plugin, val config: ChaosConfig) : Listener { } } + private fun filterEnabledModules(): List = allModules.filter { module -> + val moduleConfig = config.modules[module.id()] ?: config.defaultModuleConfiguration + moduleConfig.enabled + } + fun activateAll() { for (module in allowedModules) { if (activeModules.contains(module)) { diff --git a/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/ChaosSelectorController.kt b/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/ChaosSelectorController.kt index 514f6c3..2be0438 100644 --- a/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/ChaosSelectorController.kt +++ b/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/ChaosSelectorController.kt @@ -10,7 +10,7 @@ class ChaosSelectorController(val controller: ChaosController, val plugin: Plugi cancel() task = plugin.server.scheduler.runTaskTimer(controller.plugin, { -> select() - }, controller.config.selectionTimerTicks, controller.config.selectionTimerTicks) + }, 20, controller.config.selection.timerTicks) } fun select() { diff --git a/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/model/ChaosConfig.kt b/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/model/ChaosConfig.kt index a7125e8..f8f7b0a 100644 --- a/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/model/ChaosConfig.kt +++ b/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/model/ChaosConfig.kt @@ -5,6 +5,17 @@ import kotlinx.serialization.Serializable @Serializable class ChaosConfig( val allowed: Boolean = true, - val enable: Map = mapOf(), - val selectionTimerTicks: Long + val defaultModuleConfiguration: ChaosModuleConfig, + val modules: Map = emptyMap(), + val selection: ChaosSelectionConfig +) + +@Serializable +class ChaosModuleConfig( + val enabled: Boolean +) + +@Serializable +class ChaosSelectionConfig( + val timerTicks: Long ) diff --git a/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/modules/ChaosModules.kt b/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/modules/ChaosModules.kt index c6a5396..b9c13db 100644 --- a/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/modules/ChaosModules.kt +++ b/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/modules/ChaosModules.kt @@ -7,6 +7,7 @@ object ChaosModules { NearestPlayerEntitySpawn(plugin), TeleportAllEntitiesNearestPlayer(plugin), KillRandomPlayer(plugin), - TntAllPlayers(plugin) + TntAllPlayers(plugin), + MegaTnt(plugin) ) } diff --git a/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/modules/MegaTnt.kt b/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/modules/MegaTnt.kt new file mode 100644 index 0000000..1a91239 --- /dev/null +++ b/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/modules/MegaTnt.kt @@ -0,0 +1,19 @@ +package gay.pizza.foundation.chaos.modules + +import gay.pizza.foundation.common.spawn +import org.bukkit.entity.TNTPrimed +import org.bukkit.plugin.Plugin + +class MegaTnt(val plugin: Plugin) : ChaosModule { + override fun id(): String = "mega-tnt" + override fun name(): String = "Mega TNT" + override fun what(): String = "Spawn a massive TNT explosion" + + override fun activate() { + for (player in plugin.server.onlinePlayers) { + val tnt = player.spawn(TNTPrimed::class) + tnt.fuseTicks = 1 + tnt.yield = 10.0f + } + } +} diff --git a/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/modules/TntAllPlayers.kt b/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/modules/TntAllPlayers.kt index 8555525..c9727bb 100644 --- a/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/modules/TntAllPlayers.kt +++ b/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/modules/TntAllPlayers.kt @@ -1,5 +1,6 @@ package gay.pizza.foundation.chaos.modules +import gay.pizza.foundation.common.spawn import org.bukkit.entity.TNTPrimed import org.bukkit.plugin.Plugin @@ -10,7 +11,7 @@ class TntAllPlayers(val plugin: Plugin) : ChaosModule { override fun activate() { for (player in plugin.server.onlinePlayers) { - player.world.spawn(player.location, TNTPrimed::class.java) + player.spawn(TNTPrimed::class) } } } diff --git a/foundation-chaos/src/main/resources/chaos.yaml b/foundation-chaos/src/main/resources/chaos.yaml index 1d6ecad..05e3f33 100644 --- a/foundation-chaos/src/main/resources/chaos.yaml +++ b/foundation-chaos/src/main/resources/chaos.yaml @@ -1,7 +1,16 @@ # Whether enabling the chaos mode is allowed. allowed: false -# Chaos modules enablement. -enable: - nearest-player-entity-spawn: true - teleport-all-entities-nearest-player: true -selectionTimerTicks: 100 +# The default module configuration for modules with +# no explicit configuration. +defaultModuleConfiguration: + enabled: true +# Module configuration. +modules: + nearest-player-entity-spawn: + enabled: true + teleport-all-entities-nearest-player: + enabled: true +# Chaos selection configuration. +selection: + # The number of ticks before a new selection is made. + timerTicks: 6000 diff --git a/foundation-heimdall/src/main/kotlin/gay/pizza/foundation/heimdall/plugin/export/ChunkExporter.kt b/foundation-heimdall/src/main/kotlin/gay/pizza/foundation/heimdall/plugin/export/ChunkExporter.kt index c571926..991eee4 100644 --- a/foundation-heimdall/src/main/kotlin/gay/pizza/foundation/heimdall/plugin/export/ChunkExporter.kt +++ b/foundation-heimdall/src/main/kotlin/gay/pizza/foundation/heimdall/plugin/export/ChunkExporter.kt @@ -33,16 +33,18 @@ class ChunkExporter(private val plugin: Plugin, val world: World) { } private fun exportChunkSnapshot(snapshot: ChunkSnapshot) { + val blocks = mutableMapOf>() + val blockList = mutableListOf() val sections = mutableListOf() val yRange = world.minHeight until world.maxHeight val chunkRange = 0..15 for (x in chunkRange) { for (z in chunkRange) { - sections.add(exportChunkSection(snapshot, yRange, x, z)) + sections.add(exportChunkSection(blocks, blockList, snapshot, yRange, x, z)) } } - val exported = ExportedChunk(snapshot.x, snapshot.z, sections) + val exported = ExportedChunk(blocks = blockList, snapshot.x, snapshot.z, sections) saveChunkSnapshot(snapshot, exported) } @@ -58,13 +60,20 @@ class ChunkExporter(private val plugin: Plugin, val world: World) { gzipOutputStream.close() } - private fun exportChunkSection(snapshot: ChunkSnapshot, yRange: IntRange, x: Int, z: Int): ExportedChunkSection { - val blocks = mutableListOf() + private fun exportChunkSection(blocks: MutableMap>, blockList: MutableList, snapshot: ChunkSnapshot, yRange: IntRange, x: Int, z: Int): ExportedChunkSection { + val contents = mutableListOf() for (y in yRange) { val blockData = snapshot.getBlockData(x, y, z) - val block = ExportedBlock(blockData.material.key.toString()) - blocks.add(block) + val key = blockData.material.key.toString() + var idxToBlk = blocks[key] + if (idxToBlk == null) { + val idx = blockList.size + idxToBlk = idx to ExportedBlock(key) + blockList.add(idxToBlk.second) + blocks[key] = idxToBlk + } + contents.add(idxToBlk.first) } - return ExportedChunkSection(x, z, blocks) + return ExportedChunkSection(x, z, contents) } } diff --git a/settings.gradle.kts b/settings.gradle.kts index df90541..2f4a5d0 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -9,6 +9,7 @@ pluginManagement { } include( + ":common-plugin", ":common-heimdall", ":foundation-core", ":foundation-bifrost", diff --git a/tool-gjallarhorn/src/main/kotlin/gay/pizza/foundation/heimdall/tool/export/ChunkExportLoader.kt b/tool-gjallarhorn/src/main/kotlin/gay/pizza/foundation/heimdall/tool/export/ChunkExportLoader.kt index 342ea3c..5c327ce 100644 --- a/tool-gjallarhorn/src/main/kotlin/gay/pizza/foundation/heimdall/tool/export/ChunkExportLoader.kt +++ b/tool-gjallarhorn/src/main/kotlin/gay/pizza/foundation/heimdall/tool/export/ChunkExportLoader.kt @@ -40,7 +40,8 @@ class ChunkExportLoader( for (section in chunk.sections) { val x = (chunk.x * 16) + section.x val z = (chunk.z * 16) + section.z - for ((y, block) in section.blocks.withIndex()) { + for ((y, bidx) in section.blocks.withIndex()) { + val block = chunk.blocks[bidx] if (block.type == "minecraft:air") { continue }