@@ -7,6 +7,7 @@ import org.apollo.game.message.impl.ButtonMessage
77import org.apollo.game.model.World
88import org.apollo.game.model.entity.Player
99import org.apollo.game.model.entity.setting.PrivilegeLevel
10+ import org.apollo.game.model.event.Event
1011import org.apollo.game.model.event.EventListener
1112import org.apollo.game.model.event.PlayerEvent
1213import org.apollo.game.plugin.PluginContext
@@ -15,103 +16,151 @@ import kotlin.reflect.KClass
1516import kotlin.script.templates.ScriptTemplateDefinition
1617
1718@ScriptTemplateDefinition(
18- scriptFilePattern = " .*\\ .plugin\\ .kts"
19+ scriptFilePattern = " .*\\ .plugin\\ .kts"
1920)
2021abstract class KotlinPluginScript (private var world : World , val context : PluginContext ) {
21- var startListener: (World ) -> Unit = { _ -> };
22- var stopListener: (World ) -> Unit = { _ -> };
23-
24- /* *
25- * Create a new [MessageHandler].
26- */
27- fun <T : Message > on (type : () -> KClass <T >) = KotlinMessageHandler <T >(world, context, type.invoke())
28-
29- /* *
30- * Create a new [EventListener] for a type of [PlayerEvent].
31- */
32- fun <T : PlayerEvent > on_player_event (type : () -> KClass <T >) = KotlinPlayerEventHandler (world, type.invoke())
33-
34- /* *
35- * Create a new [CommandHandler] for the given _command_ name, which only players with a [PrivelegeLevel]
36- * of _privileges_ and above can use.
37- */
38- fun on_command (command : String , privileges : PrivilegeLevel ) = KotlinCommandHandler (world, command, privileges)
39-
40- /* *
41- * Create a new [ButtonMessage] [MessageHandler] for the given _button_ id.
42- */
43- fun on_button (button : Int ) = on { ButtonMessage ::class }.where { widgetId == button }
44-
45- fun start (callback : (World ) -> Unit ) {
46- this .startListener = callback
47- }
48-
49- fun stop (callback : (World ) -> Unit ) {
50- this .stopListener = callback
51- }
52-
53- fun doStart (world : World ) {
54- this .startListener.invoke(world)
55- }
56-
57- fun doStop (world : World ) {
58- this .stopListener.invoke(world)
59- }
22+ var startListener: (World ) -> Unit = { _ -> }
23+ var stopListener: (World ) -> Unit = { _ -> }
24+
25+ /* *
26+ * Creates a [MessageHandler].
27+ */
28+ fun <T : Message > on (type : () -> KClass <T >) = KotlinMessageHandler (world, context, type.invoke())
29+
30+ /* *
31+ * Create an [EventListener] for a [PlayerEvent].
32+ */
33+ fun <T : PlayerEvent > on_player_event (type : () -> KClass <T >) = KotlinPlayerEventHandler (world, type.invoke())
34+
35+ /* *
36+ * Create an [EventListener] for an [Event].
37+ */
38+ fun <T : Event > on_event (type : () -> KClass <T >) = KotlinEventHandler (world, type.invoke())
39+
40+ /* *
41+ * Create a [CommandListener] for the given [command] name, which only players with a [PrivilegeLevel]
42+ * of [privileges] and above can use.
43+ */
44+ fun on_command (command : String , privileges : PrivilegeLevel ) = KotlinCommandHandler (world, command, privileges)
45+
46+ /* *
47+ * Create a [ButtonMessage] [MessageHandler] for the given [id].
48+ */
49+ fun on_button (id : Int ) = on { ButtonMessage ::class }.where { widgetId == id }
50+
51+ fun start (callback : (World ) -> Unit ) {
52+ this .startListener = callback
53+ }
54+
55+ fun stop (callback : (World ) -> Unit ) {
56+ this .stopListener = callback
57+ }
58+
59+ fun doStart (world : World ) {
60+ this .startListener.invoke(world)
61+ }
62+
63+ fun doStop (world : World ) {
64+ this .stopListener.invoke(world)
65+ }
66+
6067}
6168
69+ /* *
70+ * A proxy interface for any handler that operates on [Player]s.
71+ */
6272interface KotlinPlayerHandlerProxyTrait <S : Any > {
6373
64- var callback: S .(Player ) -> Unit
65- var predicate: S .() -> Boolean
74+ var callback: S .(Player ) -> Unit
75+ var predicate: S .() -> Boolean
76+
77+ fun register ()
78+
79+ fun where (predicate : S .() -> Boolean ): KotlinPlayerHandlerProxyTrait <S > {
80+ this .predicate = predicate
81+ return this
82+ }
6683
67- fun where ( predicate : S .() -> Boolean ): KotlinPlayerHandlerProxyTrait < S > {
68- this .predicate = predicate
69- return this
70- }
84+ fun then ( callback : S .(Player ) -> Unit ) {
85+ this .callback = callback
86+ this .register()
87+ }
7188
72- fun then (callback : S .(Player ) -> Unit ) {
73- this .callback = callback
74- this .register()
75- }
7689
77- fun register ()
90+ fun handleProxy (player : Player , subject : S ) {
91+ if (subject.predicate()) {
92+ subject.callback(player)
93+ }
94+ }
7895
79- fun handleProxy (player : Player , subject : S ) {
80- if (subject.predicate()) {
81- subject.callback(player)
82- }
83- }
8496}
8597
98+ /* *
99+ * A handler for [PlayerEvent]s.
100+ */
86101class KotlinPlayerEventHandler <T : PlayerEvent >(val world : World , val type : KClass <T >) :
87- KotlinPlayerHandlerProxyTrait <T >, EventListener <T > {
102+ KotlinPlayerHandlerProxyTrait <T >, EventListener <T > {
103+
104+ override var callback: T .(Player ) -> Unit = {}
105+ override var predicate: T .() -> Boolean = { true }
106+
107+ override fun handle (event : T ) = handleProxy(event.player, event)
108+ override fun register () = world.listenFor(type.java, this )
109+
110+ }
111+
112+ /* *
113+ * A handler for [Event]s.
114+ */
115+ class KotlinEventHandler <S : Event >(val world : World , val type : KClass <S >) : EventListener<S> {
116+
117+ private var callback: S .() -> Unit = {}
118+ private var predicate: S .() -> Boolean = { true }
119+
120+ fun where (predicate : S .() -> Boolean ): KotlinEventHandler <S > {
121+ this .predicate = predicate
122+ return this
123+ }
124+
125+ fun then (callback : S .() -> Unit ) {
126+ this .callback = callback
127+ this .register()
128+ }
88129
89- override var callback: T .(Player ) -> Unit = {}
90- override var predicate: T .() -> Boolean = { true }
130+ override fun handle (event : S ) {
131+ if (event.predicate()) {
132+ event.callback()
133+ }
134+ }
91135
92- override fun handle (event : T ) = handleProxy(event.player, event)
93- override fun register () = world.listenFor(type.java, this )
136+ fun register () = world.listenFor(type.java, this )
94137
95138}
96139
140+ /* *
141+ * A handler for [Message]s.
142+ */
97143class KotlinMessageHandler <T : Message >(val world : World , val context : PluginContext , val type : KClass <T >) :
98- KotlinPlayerHandlerProxyTrait <T >, MessageHandler <T >(world) {
144+ KotlinPlayerHandlerProxyTrait <T >, MessageHandler <T >(world) {
99145
100- override var callback: T .(Player ) -> Unit = {}
101- override var predicate: T .() -> Boolean = { true }
146+ override var callback: T .(Player ) -> Unit = {}
147+ override var predicate: T .() -> Boolean = { true }
102148
103- override fun handle (player : Player , message : T ) = handleProxy(player, message)
104- override fun register () = context.addMessageHandler(type.java, this )
149+ override fun handle (player : Player , message : T ) = handleProxy(player, message)
150+ override fun register () = context.addMessageHandler(type.java, this )
105151
106152}
107153
154+ /* *
155+ * A handler for [Command]s.
156+ */
108157class KotlinCommandHandler (val world : World , val command : String , privileges : PrivilegeLevel ) :
109- KotlinPlayerHandlerProxyTrait <Command >, CommandListener (privileges) {
158+ KotlinPlayerHandlerProxyTrait <Command >, CommandListener (privileges) {
110159
111- override var callback: Command .(Player ) -> Unit = {}
112- override var predicate: Command .() -> Boolean = { true }
160+ override var callback: Command .(Player ) -> Unit = {}
161+ override var predicate: Command .() -> Boolean = { true }
113162
114- override fun execute (player : Player , command : Command ) = handleProxy(player, command)
115- override fun register () = world.commandDispatcher.register(command, this )
163+ override fun execute (player : Player , command : Command ) = handleProxy(player, command)
164+ override fun register () = world.commandDispatcher.register(command, this )
116165
117166}
0 commit comments