mirror of
				https://github.com/GayPizzaSpecifications/foundation.git
				synced 2025-11-04 11:39:39 +00:00 
			
		
		
		
	chaos: selection controller
This commit is contained in:
		@ -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<ChaosModule> = emptyList()
 | 
			
		||||
  val allModules = ChaosModules.all(plugin)
 | 
			
		||||
  private var allowedModules: List<ChaosModule> = emptyList()
 | 
			
		||||
  private var activeModules = mutableSetOf<ChaosModule>()
 | 
			
		||||
 | 
			
		||||
  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()
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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()
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -5,5 +5,6 @@ import kotlinx.serialization.Serializable
 | 
			
		||||
@Serializable
 | 
			
		||||
class ChaosConfig(
 | 
			
		||||
  val allowed: Boolean = true,
 | 
			
		||||
  val enable: Map<String, Boolean> = mapOf()
 | 
			
		||||
  val enable: Map<String, Boolean> = mapOf(),
 | 
			
		||||
  val selectionTimerTicks: Long
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@ -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() {}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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()
 | 
			
		||||
 | 
			
		||||
@ -4,3 +4,4 @@ allowed: false
 | 
			
		||||
enable:
 | 
			
		||||
  nearest-player-entity-spawn: true
 | 
			
		||||
  teleport-all-entities-nearest-player: true
 | 
			
		||||
selectionTimerTicks: 100
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user