parent
6c9f71aed8
commit
b51c4780b8
@ -15,17 +15,80 @@ import net.minecraftforge.eventbus.api.EventPriority
|
|||||||
import net.minecraftforge.eventbus.api.SubscribeEvent
|
import net.minecraftforge.eventbus.api.SubscribeEvent
|
||||||
import org.apache.logging.log4j.LogManager
|
import org.apache.logging.log4j.LogManager
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
import kotlin.ConcurrentModificationException
|
||||||
import kotlin.collections.ArrayList
|
import kotlin.collections.ArrayList
|
||||||
|
|
||||||
private val preServerTick = ArrayList<IConditionalTickable>()
|
private class TickList {
|
||||||
private val postServerTick = ArrayList<IConditionalTickable>()
|
private val conditional = LinkedList<IConditionalTickable>()
|
||||||
private val preServerTickOnce = ArrayList<ITickable>()
|
private val once = LinkedList<ITickable>()
|
||||||
private val postServerTickOnce = ArrayList<ITickable>()
|
|
||||||
|
|
||||||
private val preWorldTick = WeakHashMap<Level, ArrayList<IConditionalTickable>>()
|
private val conditionalValveTime = LinkedList<IConditionalTickable>()
|
||||||
private val postWorldTick = WeakHashMap<Level, ArrayList<IConditionalTickable>>()
|
private val onceValveTime = LinkedList<ITickable>()
|
||||||
private val preWorldTickOnce = WeakHashMap<Level, ArrayList<ITickable>>()
|
|
||||||
private val postWorldTickOnce = WeakHashMap<Level, ArrayList<ITickable>>()
|
private var inTicker = false
|
||||||
|
|
||||||
|
fun add(ticker: IConditionalTickable) {
|
||||||
|
if (inTicker) {
|
||||||
|
conditionalValveTime.add(ticker)
|
||||||
|
} else {
|
||||||
|
conditional.add(ticker)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun add(ticker: ITickable) {
|
||||||
|
if (inTicker) {
|
||||||
|
onceValveTime.add(ticker)
|
||||||
|
} else {
|
||||||
|
once.add(ticker)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun tick() {
|
||||||
|
if (inTicker) {
|
||||||
|
throw ConcurrentModificationException("Already ticking")
|
||||||
|
}
|
||||||
|
|
||||||
|
inTicker = true
|
||||||
|
val iterator = conditional.iterator()
|
||||||
|
|
||||||
|
for (ticker in iterator) {
|
||||||
|
if (!ticker.canTick) {
|
||||||
|
iterator.remove()
|
||||||
|
} else {
|
||||||
|
ticker.tick()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ticker in once) {
|
||||||
|
ticker.tick()
|
||||||
|
}
|
||||||
|
|
||||||
|
once.clear()
|
||||||
|
|
||||||
|
for (ticker in conditionalValveTime) {
|
||||||
|
conditional.addFirst(ticker)
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ticker in onceValveTime) {
|
||||||
|
once.addFirst(ticker)
|
||||||
|
}
|
||||||
|
|
||||||
|
conditionalValveTime.clear()
|
||||||
|
onceValveTime.clear()
|
||||||
|
|
||||||
|
inTicker = false
|
||||||
|
}
|
||||||
|
|
||||||
|
fun clear() {
|
||||||
|
conditional.clear()
|
||||||
|
once.clear()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val preServerTick = TickList()
|
||||||
|
private val postServerTick = TickList()
|
||||||
|
private val preWorldTick = WeakHashMap<Level, TickList>()
|
||||||
|
private val postWorldTick = WeakHashMap<Level, TickList>()
|
||||||
|
|
||||||
private val preServerTickTimers = TimerQueue()
|
private val preServerTickTimers = TimerQueue()
|
||||||
private val postServerTickTimers = TimerQueue()
|
private val postServerTickTimers = TimerQueue()
|
||||||
@ -191,38 +254,10 @@ interface IConditionalTickable : ITickable {
|
|||||||
fun onServerTick(event: ServerTickEvent) {
|
fun onServerTick(event: ServerTickEvent) {
|
||||||
if (event.phase === TickEvent.Phase.START) {
|
if (event.phase === TickEvent.Phase.START) {
|
||||||
preServerTickTimers.tick()
|
preServerTickTimers.tick()
|
||||||
|
preServerTick.tick()
|
||||||
for (i in preServerTick.size - 1 downTo 0) {
|
|
||||||
val ticker = preServerTick[i]
|
|
||||||
|
|
||||||
if (!ticker.canTick) {
|
|
||||||
preServerTick.removeAt(i)
|
|
||||||
} else {
|
|
||||||
ticker.tick()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i in preServerTickOnce.size - 1 downTo 0) {
|
|
||||||
preServerTickOnce[i].tick()
|
|
||||||
preServerTickOnce.removeAt(i)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
postServerTickTimers.tick()
|
postServerTickTimers.tick()
|
||||||
|
postServerTick.tick()
|
||||||
for (i in postServerTick.size - 1 downTo 0) {
|
|
||||||
val ticker = postServerTick[i]
|
|
||||||
|
|
||||||
if (!ticker.canTick) {
|
|
||||||
postServerTick.removeAt(i)
|
|
||||||
} else {
|
|
||||||
ticker.tick()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i in postServerTickOnce.size - 1 downTo 0) {
|
|
||||||
postServerTickOnce[i].tick()
|
|
||||||
postServerTickOnce.removeAt(i)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -250,7 +285,7 @@ fun addPreServerTickerOnce(ticker: ITickable) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
preServerTickOnce.add(ticker)
|
preServerTick.add(ticker)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addPostServerTickerOnce(ticker: ITickable) {
|
fun addPostServerTickerOnce(ticker: ITickable) {
|
||||||
@ -259,56 +294,14 @@ fun addPostServerTickerOnce(ticker: ITickable) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
postServerTickOnce.add(ticker)
|
postServerTick.add(ticker)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onWorldTick(event: LevelTickEvent) {
|
fun onWorldTick(event: LevelTickEvent) {
|
||||||
if (event.phase === TickEvent.Phase.START) {
|
if (event.phase === TickEvent.Phase.START) {
|
||||||
val it = preWorldTick[event.level]
|
preWorldTick[event.level]?.tick()
|
||||||
|
|
||||||
if (it != null) {
|
|
||||||
for (i in it.size - 1 downTo 0) {
|
|
||||||
val ticker = it[i]
|
|
||||||
|
|
||||||
if (!ticker.canTick) {
|
|
||||||
it.removeAt(i)
|
|
||||||
} else {
|
} else {
|
||||||
ticker.tick()
|
postWorldTick[event.level]?.tick()
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val it2 = preWorldTickOnce.remove(event.level)
|
|
||||||
|
|
||||||
if (it2 != null) {
|
|
||||||
for (i in it2.size - 1 downTo 0) {
|
|
||||||
it2[i].tick()
|
|
||||||
it2.removeAt(i)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
val it = postWorldTick[event.level]
|
|
||||||
|
|
||||||
if (it != null) {
|
|
||||||
for (i in it.size - 1 downTo 0) {
|
|
||||||
val ticker = it[i]
|
|
||||||
|
|
||||||
if (!ticker.canTick) {
|
|
||||||
it.removeAt(i)
|
|
||||||
} else {
|
|
||||||
ticker.tick()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val it2 = postWorldTickOnce.remove(event.level)
|
|
||||||
|
|
||||||
if (it2 != null) {
|
|
||||||
for (i in it2.size - 1 downTo 0) {
|
|
||||||
it2[i].tick()
|
|
||||||
it2.removeAt(i)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -318,7 +311,7 @@ fun addPreWorldTicker(level: Level, ticker: IConditionalTickable) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
preWorldTick.computeIfAbsent(level) { ArrayList() }.add(ticker)
|
preWorldTick.computeIfAbsent(level) { TickList() }.add(ticker)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addPostWorldTicker(level: Level, ticker: IConditionalTickable) {
|
fun addPostWorldTicker(level: Level, ticker: IConditionalTickable) {
|
||||||
@ -327,7 +320,7 @@ fun addPostWorldTicker(level: Level, ticker: IConditionalTickable) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
postWorldTick.computeIfAbsent(level) { ArrayList() }.add(ticker)
|
postWorldTick.computeIfAbsent(level) { TickList() }.add(ticker)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addPreWorldTickerOnce(level: Level, ticker: ITickable) {
|
fun addPreWorldTickerOnce(level: Level, ticker: ITickable) {
|
||||||
@ -336,7 +329,7 @@ fun addPreWorldTickerOnce(level: Level, ticker: ITickable) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
preWorldTickOnce.computeIfAbsent(level) { ArrayList() }.add(ticker)
|
preWorldTick.computeIfAbsent(level) { TickList() }.add(ticker)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addPostWorldTickerOnce(level: Level, ticker: ITickable) {
|
fun addPostWorldTickerOnce(level: Level, ticker: ITickable) {
|
||||||
@ -345,7 +338,7 @@ fun addPostWorldTickerOnce(level: Level, ticker: ITickable) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
postWorldTickOnce.computeIfAbsent(level) { ArrayList() }.add(ticker)
|
postWorldTick.computeIfAbsent(level) { TickList() }.add(ticker)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun clear() {
|
private fun clear() {
|
||||||
@ -355,10 +348,6 @@ private fun clear() {
|
|||||||
postServerTick.clear()
|
postServerTick.clear()
|
||||||
preWorldTick.clear()
|
preWorldTick.clear()
|
||||||
postWorldTick.clear()
|
postWorldTick.clear()
|
||||||
preServerTickOnce.clear()
|
|
||||||
postServerTickOnce.clear()
|
|
||||||
preWorldTickOnce.clear()
|
|
||||||
postWorldTickOnce.clear()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onServerStarting(event: ServerAboutToStartEvent) {
|
fun onServerStarting(event: ServerAboutToStartEvent) {
|
||||||
|
Loading…
Reference in New Issue
Block a user