BlastingCrisis/src/main/kotlin/cc/maxmc/blastingcrisis/game/GameOreGenerator.kt

57 lines
2.0 KiB
Kotlin

package cc.maxmc.blastingcrisis.game
import cc.maxmc.blastingcrisis.misc.*
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import org.bukkit.Bukkit
import org.bukkit.Material
import taboolib.common.util.random
import taboolib.library.xseries.XMaterial
import taboolib.module.configuration.Configuration
import taboolib.platform.BukkitPlugin
class GameOreGenerator(config: Configuration) {
private val rate: Int = config.getInt("rate")
private val maxTry: Int = config.getInt("try")
private val ores: MutableMap<XMaterial, Int> = HashMap<XMaterial, Int>().also {
config.getConfigurationSection("ores")!!.getKeys(false).forEach { key ->
it += XMaterial.valueOf(key) to (config["ores.$key"]!! as Int)
}
}
private val random = WeightRandom(ores.map { it.key to it.value })
fun enable(area: UniArea): Job {
return pluginScope.launch {
while (true) {
val targetArea = area.randomizer.random()
val airPercent = targetArea.getAirPercentage()
debug("remain air: $airPercent.")
if (airPercent > 0.5) {
generate(targetArea)
}
delay(rate * 50L)
}
}
}
private tailrec fun generate(area: Area, times: Int = 0) {
if (times > maxTry) return
val x = random(area.locMin.blockX, area.locTop.blockX)
val y = random(area.locMin.blockY, area.locTop.blockY)
val z = random(area.locMin.blockZ, area.locTop.blockZ)
val block = area.locMin.world.getBlockAt(x, y, z)
debug("trying generate at ($x, $y, $z) - ${block.type}")
if (block.type == Material.AIR) {
Bukkit.getScheduler().runTask(BukkitPlugin.getInstance()) {
block.type = random.random().parseMaterial()
debug("generating ${block.type} at ($x, $y, $z)")
}
} else {
return generate(area, times + 1)
}
}
}