Create KRunnables.kt
This commit is contained in:
101
src/main/kotlin/net/axay/kspigot/runnables/KRunnables.kt
Normal file
101
src/main/kotlin/net/axay/kspigot/runnables/KRunnables.kt
Normal 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)
|
Reference in New Issue
Block a user