blob: e3dff201485b5fd757a601e07138489cb8cb8f8e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
package at.hannibal2.skyhanni.api.event
import at.hannibal2.skyhanni.data.MinecraftData
import at.hannibal2.skyhanni.data.jsonobjects.repo.DisabledEventsJson
import at.hannibal2.skyhanni.events.DebugDataCollectEvent
import at.hannibal2.skyhanni.events.RepositoryReloadEvent
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import java.lang.reflect.Method
@SkyHanniModule
object SkyHanniEvents {
private val handlers: MutableMap<Class<*>, EventHandler<*>> = mutableMapOf()
private var disabledHandlers = emptySet<String>()
private var disabledHandlerInvokers = emptySet<String>()
fun init(instances: List<Any>) {
instances.forEach { instance ->
instance.javaClass.declaredMethods.forEach {
registerMethod(it, instance)
}
}
handlers.values.forEach { it.freeze() }
}
@Suppress("UNCHECKED_CAST")
fun <T : SkyHanniEvent> getEventHandler(event: Class<T>): EventHandler<T> = handlers.getOrPut(event) {
EventHandler(event)
} as EventHandler<T>
fun isDisabledHandler(handler: String): Boolean = handler in disabledHandlers
fun isDisabledInvoker(invoker: String): Boolean = invoker in disabledHandlerInvokers
@Suppress("UNCHECKED_CAST")
private fun registerMethod(method: Method, instance: Any) {
if (method.parameterCount != 1) return
val options = method.getAnnotation(HandleEvent::class.java) ?: return
val event = method.parameterTypes[0]
if (!SkyHanniEvent::class.java.isAssignableFrom(event)) return
val handler = getEventHandler(event as Class<SkyHanniEvent>)
handler.addListener(method, instance, options)
}
@SubscribeEvent
fun onRepoLoad(event: RepositoryReloadEvent) {
val data = event.getConstant<DisabledEventsJson>("DisabledEvents")
disabledHandlers = data.disabledHandlers
disabledHandlerInvokers = data.disabledInvokers
}
@SubscribeEvent
fun onDebug(event: DebugDataCollectEvent) {
event.title("Events")
event.addIrrelevant {
handlers.values.toMutableList()
.filter { it.invokeCount > 0 }
.sortedWith(compareBy({ -it.invokeCount }, { it.name }))
.forEach {
add("- ${it.name} (${it.invokeCount} ${it.invokeCount / (MinecraftData.totalTicks / 20)}/s)")
}
}
}
}
|