From d375a98c5928680659d3a0a8dee9301722cf3089 Mon Sep 17 00:00:00 2001 From: Yummy-Cookie-S Date: Tue, 21 Jun 2022 12:02:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=84=9A=E6=9C=AC=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E9=97=AE=E9=A2=98=20//TODO=20event=20=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E5=BE=85=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jythonengine/script/ScriptManager.kt | 11 +++-- .../script/modifier/AsyncModifier.kt | 6 ++- .../script/trigger/EventListener.kt | 30 +++++++++++++ .../script/trigger/EventTrigger.kt | 44 +++++++++---------- .../script/trigger/SchedulerTrigger.kt | 16 +++---- .../script/trigger/StatusTrigger.kt | 2 +- 6 files changed, 69 insertions(+), 40 deletions(-) create mode 100644 src/main/kotlin/tech/cookiepower/jythonengine/script/trigger/EventListener.kt diff --git a/src/main/kotlin/tech/cookiepower/jythonengine/script/ScriptManager.kt b/src/main/kotlin/tech/cookiepower/jythonengine/script/ScriptManager.kt index 90db5d6..f26536f 100644 --- a/src/main/kotlin/tech/cookiepower/jythonengine/script/ScriptManager.kt +++ b/src/main/kotlin/tech/cookiepower/jythonengine/script/ScriptManager.kt @@ -20,8 +20,12 @@ object ScriptManager { throw IllegalArgumentException("Can't load ${script.path} Script with namespaced key $namespacedKey " + "already loaded by ${getScript(namespacedKey)?.path}") } + val event = ScriptLoadEvent(script) - if(event.call()){ return } + if(!event.call()){ + ScriptUnloadEvent(script).call() + return + } scripts.add(script) } @@ -41,14 +45,13 @@ object ScriptManager { fun unloadAll(){ scripts.forEach { - namespacedKeys.remove(it.namespacedKey) ScriptUnloadEvent(it).call() - unload(it) } + namespacedKeys.clear() scripts.clear() } - @Awake(LifeCycle.ENABLE) + @Awake(LifeCycle.ACTIVE) fun reloadAll(){ unloadAll() loadByDir() diff --git a/src/main/kotlin/tech/cookiepower/jythonengine/script/modifier/AsyncModifier.kt b/src/main/kotlin/tech/cookiepower/jythonengine/script/modifier/AsyncModifier.kt index a2d673e..b74ec09 100644 --- a/src/main/kotlin/tech/cookiepower/jythonengine/script/modifier/AsyncModifier.kt +++ b/src/main/kotlin/tech/cookiepower/jythonengine/script/modifier/AsyncModifier.kt @@ -9,8 +9,10 @@ object AsyncModifier : Modifier(){ @SubscribeEvent(ignoreCancelled = true) fun onLoad(event: ScriptLoadEvent){ val script = event.script - if (script.async && script.sync) throw IllegalArgumentException("Script cannot be async and sync at the same time") - event.isCancelled = true + if (script.async && script.sync){ + event.isCancelled = true + throw IllegalArgumentException("Script cannot be async and sync at the same time") + } } @SubscribeEvent(ignoreCancelled = true) fun onExecute(event: ScriptExecuteEvent){ diff --git a/src/main/kotlin/tech/cookiepower/jythonengine/script/trigger/EventListener.kt b/src/main/kotlin/tech/cookiepower/jythonengine/script/trigger/EventListener.kt new file mode 100644 index 0000000..ab6a4d2 --- /dev/null +++ b/src/main/kotlin/tech/cookiepower/jythonengine/script/trigger/EventListener.kt @@ -0,0 +1,30 @@ +package tech.cookiepower.jythonengine.script.trigger + +import org.bukkit.event.EventPriority +import org.bukkit.event.HandlerList +import org.bukkit.event.Listener +import org.bukkit.plugin.RegisteredListener +import taboolib.common.platform.function.submit +import taboolib.platform.BukkitPlugin + +class EventListener : Listener { + private val handlers = ArrayList() + private val listener = RegisteredListener( this, + { _, event -> EventTrigger.onEventCall(event) }, + EventPriority.NORMAL, + BukkitPlugin.getInstance(), + false + ) + private var lastSize = 0 + val task = submit(period = 20, async = true) { + if (lastSize != HandlerList.getHandlerLists().size){ + HandlerList.getHandlerLists().filter { + it !in handlers + }.forEach { + it.register(listener) + handlers.add(it) + } + lastSize = HandlerList.getHandlerLists().size + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/tech/cookiepower/jythonengine/script/trigger/EventTrigger.kt b/src/main/kotlin/tech/cookiepower/jythonengine/script/trigger/EventTrigger.kt index 932186c..c2a730a 100644 --- a/src/main/kotlin/tech/cookiepower/jythonengine/script/trigger/EventTrigger.kt +++ b/src/main/kotlin/tech/cookiepower/jythonengine/script/trigger/EventTrigger.kt @@ -1,7 +1,15 @@ package tech.cookiepower.jythonengine.script.trigger +import org.bukkit.Bukkit +import org.bukkit.event.Event +import taboolib.common.LifeCycle +import taboolib.common.platform.Awake +import taboolib.common.platform.Platform +import taboolib.common.platform.PlatformSide import taboolib.common.platform.event.SubscribeEvent +import taboolib.platform.BukkitPlugin import tech.cookiepower.jythonengine.annotation.ReflexCall +import tech.cookiepower.jythonengine.event.ScriptExecuteEvent import tech.cookiepower.jythonengine.event.ScriptLoadEvent import tech.cookiepower.jythonengine.event.ScriptUnloadEvent import tech.cookiepower.jythonengine.script.Script @@ -22,35 +30,27 @@ object EventTrigger : Trigger>>() { } } - @SubscribeEvent(ignoreCancelled = true) + @SubscribeEvent fun onScriptUnload(event: ScriptUnloadEvent){ if(event.script.isEventScript){ onUnsubscribe(event.script) } } -// @SubscribeEvent -// fun onEventCall(event: Event){ -// event.javaClass.name.let { -// event2Scripts[it]?.forEach { script -> -// val exeEvent = ScriptExecuteEvent(script,defaultInterpreter) -// exeEvent.argument("__EVENT__" to event) -// defaultHandlerAndPost(exeEvent) -// } -// } -// } + @Awake(LifeCycle.ACTIVE) + @PlatformSide([Platform.BUKKIT]) + fun registerListener(){ + Bukkit.getPluginManager().registerEvents(EventListener(), BukkitPlugin.getInstance()) + } -// @SubscribeEvent(bind = "org.bukkit.event.Event") -// fun onEventCall(ope: OptionalEvent){ -// val event = ope.get() -// event.javaClass.name.let { -// event2Scripts[it]?.forEach { script -> -// val exeEvent = ScriptExecuteEvent(script,defaultInterpreter) -// exeEvent.argument("__EVENT__" to event) -// defaultHandlerAndPost(exeEvent) -// } -// } -// } + fun onEventCall(event: Event){ + val name = event.javaClass.name + event2Scripts[name]?.forEach { script -> + val exeEvent = ScriptExecuteEvent(script,defaultInterpreter) + exeEvent.argument("__EVENT__" to event) + defaultHandlerAndPost(exeEvent) + } + } override fun onSubscribe(script: Script) { val events = script.events diff --git a/src/main/kotlin/tech/cookiepower/jythonengine/script/trigger/SchedulerTrigger.kt b/src/main/kotlin/tech/cookiepower/jythonengine/script/trigger/SchedulerTrigger.kt index 27c94b1..b9e73ca 100644 --- a/src/main/kotlin/tech/cookiepower/jythonengine/script/trigger/SchedulerTrigger.kt +++ b/src/main/kotlin/tech/cookiepower/jythonengine/script/trigger/SchedulerTrigger.kt @@ -2,7 +2,6 @@ package tech.cookiepower.jythonengine.script.trigger import org.python.util.PythonInterpreter import taboolib.common.platform.event.SubscribeEvent -import taboolib.common.platform.function.info import tech.cookiepower.jythonengine.event.ScriptLoadEvent import tech.cookiepower.jythonengine.event.ScriptUnloadEvent import tech.cookiepower.jythonengine.script.Script @@ -14,19 +13,13 @@ object SchedulerTrigger : Trigger>(){ @SubscribeEvent(ignoreCancelled = true) fun onScriptLoad(event: ScriptLoadEvent){ - info("####################################################################################") - info("event subscriber: ScriptLoadEvent") - info("####################################################################################") if(event.script.isSchedulerScript){ onSubscribe(event.script) } } - @SubscribeEvent(ignoreCancelled = true) + @SubscribeEvent fun onScriptUnload(event: ScriptUnloadEvent){ - info("####################################################################################") - info("event subscriber: ScriptUnloadEvent") - info("####################################################################################") if(event.script.isSchedulerScript){ onUnsubscribe(event.script) } @@ -39,10 +32,11 @@ object SchedulerTrigger : Trigger>(){ } override fun onUnsubscribe(script: Script): Boolean { - val task = tasks.find { it.script == script } - task?.stop() + val task = tasks.find { it.script.path == script.path } ?: + throw IllegalStateException("Scheduler Script is not subscribed") + task.stop() tasks.remove(task) - return task!=null + return true } override fun getAll(): List = tasks diff --git a/src/main/kotlin/tech/cookiepower/jythonengine/script/trigger/StatusTrigger.kt b/src/main/kotlin/tech/cookiepower/jythonengine/script/trigger/StatusTrigger.kt index 8ba5b7e..d0ceae9 100644 --- a/src/main/kotlin/tech/cookiepower/jythonengine/script/trigger/StatusTrigger.kt +++ b/src/main/kotlin/tech/cookiepower/jythonengine/script/trigger/StatusTrigger.kt @@ -16,7 +16,7 @@ object StatusTrigger : Trigger() { } } - @SubscribeEvent(ignoreCancelled = true) + @SubscribeEvent fun onScriptUnload(event: ScriptUnloadEvent){ if(event.script.release){ onUnsubscribe(event.script)