From 6c16884ae2878419a424907d4f19152a1cf3228b Mon Sep 17 00:00:00 2001 From: Alex Zenla Date: Sat, 28 Jan 2023 14:05:29 -0800 Subject: [PATCH] chaos: selection controller --- .../pizza/foundation/chaos/ChaosController.kt | 51 ++++++++++++++----- .../chaos/ChaosSelectorController.kt | 25 +++++++++ .../foundation/chaos/model/ChaosConfig.kt | 3 +- .../foundation/chaos/modules/ChaosModule.kt | 4 +- .../TeleportAllEntitiesNearestPlayer.kt | 2 +- .../src/main/resources/chaos.yaml | 1 + 6 files changed, 70 insertions(+), 16 deletions(-) create mode 100644 foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/ChaosSelectorController.kt 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 ece553e..8f553a2 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 @@ -3,37 +3,64 @@ package gay.pizza.foundation.chaos import gay.pizza.foundation.chaos.model.ChaosConfig import gay.pizza.foundation.chaos.modules.ChaosModule import gay.pizza.foundation.chaos.modules.ChaosModules +import net.kyori.adventure.text.Component import org.bukkit.event.HandlerList import org.bukkit.event.Listener import org.bukkit.plugin.Plugin import java.util.concurrent.atomic.AtomicBoolean -class ChaosController(private val plugin: Plugin, val config: ChaosConfig) : Listener { +class ChaosController(val plugin: Plugin, val config: ChaosConfig) : Listener { val state: AtomicBoolean = AtomicBoolean(false) + val selectorController = ChaosSelectorController(this, plugin) - private val allModules = ChaosModules.all(plugin) - private var modules: List = emptyList() + val allModules = ChaosModules.all(plugin) + private var allowedModules: List = emptyList() + private var activeModules = mutableSetOf() fun load() { if (state.get()) { return } - modules = allModules.filter { config.enable[it.id()] ?: true } - modules.forEach { module -> - plugin.server.pluginManager.registerEvents(module, plugin) - module.load() - } + allowedModules = allModules.filter { config.enable[it.id()] ?: true } state.set(true) + selectorController.schedule() + } + + fun activateAll() { + for (module in allowedModules) { + if (activeModules.contains(module)) { + continue + } + activate(module) + } + } + + fun activate(module: ChaosModule) { + plugin.server.pluginManager.registerEvents(module, plugin) + module.activate() + activeModules.add(module) + plugin.server.broadcast(Component.text("Chaos Module Activated: ${module.id()}")) + } + + fun deactivate(module: ChaosModule) { + HandlerList.unregisterAll(module) + module.deactivate() + activeModules.remove(module) + plugin.server.broadcast(Component.text("Chaos Module Deactivated: ${module.id()}")) + } + + fun deactivateAll() { + for (module in activeModules.toList()) { + deactivate(module) + } } fun unload() { if (!state.get()) { return } - modules.forEach { module -> - HandlerList.unregisterAll(module) - module.unload() - } + deactivateAll() state.set(false) + selectorController.cancel() } } 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 new file mode 100644 index 0000000..514f6c3 --- /dev/null +++ b/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/ChaosSelectorController.kt @@ -0,0 +1,25 @@ +package gay.pizza.foundation.chaos + +import org.bukkit.plugin.Plugin +import org.bukkit.scheduler.BukkitTask + +class ChaosSelectorController(val controller: ChaosController, val plugin: Plugin) { + var task: BukkitTask? = null + + fun schedule() { + cancel() + task = plugin.server.scheduler.runTaskTimer(controller.plugin, { -> + select() + }, controller.config.selectionTimerTicks, controller.config.selectionTimerTicks) + } + + fun select() { + controller.deactivateAll() + val module = controller.allModules.random() + controller.activate(module) + } + + fun cancel() { + task?.cancel() + } +} 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 5a3bf10..a7125e8 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,5 +5,6 @@ import kotlinx.serialization.Serializable @Serializable class ChaosConfig( val allowed: Boolean = true, - val enable: Map = mapOf() + val enable: Map = mapOf(), + val selectionTimerTicks: Long ) diff --git a/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/modules/ChaosModule.kt b/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/modules/ChaosModule.kt index b141f2d..8d5161f 100644 --- a/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/modules/ChaosModule.kt +++ b/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/modules/ChaosModule.kt @@ -5,6 +5,6 @@ import org.bukkit.event.Listener interface ChaosModule : Listener { fun id(): String fun what(): String - fun load() {} - fun unload() {} + fun activate() {} + fun deactivate() {} } diff --git a/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/modules/TeleportAllEntitiesNearestPlayer.kt b/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/modules/TeleportAllEntitiesNearestPlayer.kt index 2bcdfff..63804b2 100644 --- a/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/modules/TeleportAllEntitiesNearestPlayer.kt +++ b/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/modules/TeleportAllEntitiesNearestPlayer.kt @@ -7,7 +7,7 @@ class TeleportAllEntitiesNearestPlayer(val plugin: Plugin) : ChaosModule { override fun id(): String = "teleport-all-entities-nearest-player" override fun what(): String = "Teleports all entities to the nearest player." - override fun load() { + override fun activate() { for (world in plugin.server.worlds) { for (entity in world.entities) { val player = entity.location.nearestPlayer() diff --git a/foundation-chaos/src/main/resources/chaos.yaml b/foundation-chaos/src/main/resources/chaos.yaml index e3773cf..1d6ecad 100644 --- a/foundation-chaos/src/main/resources/chaos.yaml +++ b/foundation-chaos/src/main/resources/chaos.yaml @@ -4,3 +4,4 @@ allowed: false enable: nearest-player-entity-spawn: true teleport-all-entities-nearest-player: true +selectionTimerTicks: 100