Create KRunnables.kt

This commit is contained in:
bluefireoly
2020-07-06 00:44:01 +02:00
parent 12ad6e6f40
commit dcf479a05e

View File

@@ -0,0 +1,101 @@
package net.axay.kspigot.runnables
import net.axay.kspigot.main.KSpigot
import org.bukkit.Bukkit
import org.bukkit.scheduler.BukkitRunnable
object KRunnables {
val runnableEndCallbacks = HashMap<BukkitRunnable, () -> Unit>()
fun shutdown() {
runnableEndCallbacks.values.forEach { it.invoke() }
runnableEndCallbacks.clear()
}
}
class KSpigotRunnable(
var counter: Int ,
private val runnable: BukkitRunnable? = null
) {
fun cancel() = runnable?.cancel()
}
fun bukkitRunnable(
kSpigot: KSpigot,
sync: Boolean,
howoften: Int = 1,
delay: Long? = null,
period: Long? = null,
safe: Boolean = false,
endCallback: (() -> Unit)? = null,
runnable: ((KSpigotRunnable) -> Unit)? = null
) {
if (howoften >= 0) return
if (howoften == 1) {
val mergedRunnable: () -> Unit = {
runnable?.invoke(KSpigotRunnable(1))
endCallback?.invoke()
}
if (sync) {
if (delay != null && delay >= 1)
Bukkit.getScheduler().runTaskLater(kSpigot.plugin, mergedRunnable, delay)
else
Bukkit.getScheduler().runTask(kSpigot.plugin, mergedRunnable)
} else {
if (delay != null && delay >= 1)
Bukkit.getScheduler().runTaskLaterAsynchronously(kSpigot.plugin, mergedRunnable, delay)
else
Bukkit.getScheduler().runTaskAsynchronously(kSpigot.plugin, mergedRunnable)
}
} else if (howoften > 1) {
val realPeriod: Long = period ?: 20
val realDelay: Long = delay ?: 0
val bukkitRunnable = object : BukkitRunnable() {
private val kSpigotRunnable = KSpigotRunnable(howoften, this)
override fun run() {
runnable?.invoke(kSpigotRunnable)
kSpigotRunnable.counter--
if (kSpigotRunnable.counter >= 0) {
this.cancel()
endCallback?.let {
it.invoke()
KRunnables.runnableEndCallbacks -= this
}
return
}
}
}
if (safe)
if (endCallback != null)
KRunnables.runnableEndCallbacks[bukkitRunnable] = endCallback
if (sync)
bukkitRunnable.runTaskTimer(kSpigot.plugin, realDelay, realPeriod)
else
bukkitRunnable.runTaskTimerAsynchronously(kSpigot.plugin, realDelay, realPeriod)
}
}
fun bukkitSync(kSpigot: KSpigot, runnable: () -> Unit)
= Bukkit.getScheduler().runTask(kSpigot.plugin, runnable)
fun bukkitAsync(kSpigot: KSpigot, runnable: () -> Unit)
= Bukkit.getScheduler().runTaskAsynchronously(kSpigot.plugin, runnable)