Add on_button method to plugin scripts

This commit is contained in:
Gary Tierney
2017-06-25 02:38:56 +01:00
parent 9a8ed0d7a9
commit e605241893
2 changed files with 72 additions and 65 deletions
@@ -3,6 +3,7 @@ package org.apollo.game.plugin.kotlin
import org.apollo.game.command.Command import org.apollo.game.command.Command
import org.apollo.game.command.CommandListener import org.apollo.game.command.CommandListener
import org.apollo.game.message.handler.MessageHandler import org.apollo.game.message.handler.MessageHandler
import org.apollo.game.message.impl.ButtonMessage
import org.apollo.game.model.World import org.apollo.game.model.World
import org.apollo.game.model.entity.Player import org.apollo.game.model.entity.Player
import org.apollo.game.model.entity.setting.PrivilegeLevel import org.apollo.game.model.entity.setting.PrivilegeLevel
@@ -14,89 +15,103 @@ import kotlin.reflect.KClass
import kotlin.script.templates.ScriptTemplateDefinition import kotlin.script.templates.ScriptTemplateDefinition
@ScriptTemplateDefinition( @ScriptTemplateDefinition(
scriptFilePattern = ".*\\.plugin\\.kts" scriptFilePattern = ".*\\.plugin\\.kts"
) )
abstract class KotlinPluginScript(private var world: World, val context: PluginContext) { abstract class KotlinPluginScript(private var world: World, val context: PluginContext) {
var startListener: (World) -> Unit = { _ -> }; var startListener: (World) -> Unit = { _ -> };
var stopListener: (World) -> Unit = { _ -> }; var stopListener: (World) -> Unit = { _ -> };
fun <T : Message> on(type: () -> KClass<T>) = KotlinMessageHandler<T>(world, context, type.invoke()) /**
* Create a new [MessageHandler].
*/
fun <T : Message> on(type: () -> KClass<T>) = KotlinMessageHandler<T>(world, context, type.invoke())
fun <T : PlayerEvent> on_player_event(type: () -> KClass<T>) = KotlinPlayerEventHandler(world, type.invoke()) /**
* Create a new [EventListener] for a type of [PlayerEvent].
*/
fun <T : PlayerEvent> on_player_event(type: () -> KClass<T>) = KotlinPlayerEventHandler(world, type.invoke())
fun on_command(command: String, privileges: PrivilegeLevel) = KotlinCommandHandler(world, command, privileges) /**
* Create a new [CommandHandler] for the given _command_ name, which only players with a [PrivelegeLevel]
* of _privileges_ and above can use.
*/
fun on_command(command: String, privileges: PrivilegeLevel) = KotlinCommandHandler(world, command, privileges)
/**
* Create a new [ButtonMessage] [MessageHandler] for the given _button_ id.
*/
fun on_button(button: Int) = on { ButtonMessage::class }.where { widgetId == button }
fun start(callback: (World) -> Unit) { fun start(callback: (World) -> Unit) {
this.startListener = callback this.startListener = callback
} }
fun stop(callback: (World) -> Unit) { fun stop(callback: (World) -> Unit) {
this.stopListener = callback this.stopListener = callback
} }
fun doStart(world: World) { fun doStart(world: World) {
this.startListener.invoke(world) this.startListener.invoke(world)
} }
fun doStop(world: World) { fun doStop(world: World) {
this.stopListener.invoke(world) this.stopListener.invoke(world)
} }
} }
interface KotlinPlayerHandlerProxyTrait<S : Any> { interface KotlinPlayerHandlerProxyTrait<S : Any> {
var callback: S.(Player) -> Unit var callback: S.(Player) -> Unit
var predicate: S.() -> Boolean var predicate: S.() -> Boolean
fun where(predicate: S.() -> Boolean): KotlinPlayerHandlerProxyTrait<S> { fun where(predicate: S.() -> Boolean): KotlinPlayerHandlerProxyTrait<S> {
this.predicate = predicate this.predicate = predicate
return this return this
} }
fun then(callback: S.(Player) -> Unit) { fun then(callback: S.(Player) -> Unit) {
this.callback = callback this.callback = callback
this.register() this.register()
} }
fun register() fun register()
fun handleProxy(player: Player, subject: S) { fun handleProxy(player: Player, subject: S) {
if (subject.predicate()) { if (subject.predicate()) {
subject.callback(player) subject.callback(player)
} }
} }
} }
class KotlinPlayerEventHandler<T : PlayerEvent>(val world: World, val type: KClass<T>) : class KotlinPlayerEventHandler<T : PlayerEvent>(val world: World, val type: KClass<T>) :
KotlinPlayerHandlerProxyTrait<T>, EventListener<T> { KotlinPlayerHandlerProxyTrait<T>, EventListener<T> {
override var callback: T.(Player) -> Unit = {} override var callback: T.(Player) -> Unit = {}
override var predicate: T.() -> Boolean = { true } override var predicate: T.() -> Boolean = { true }
override fun handle(event: T) = handleProxy(event.player, event) override fun handle(event: T) = handleProxy(event.player, event)
override fun register() = world.listenFor(type.java, this) override fun register() = world.listenFor(type.java, this)
} }
class KotlinMessageHandler<T : Message>(val world: World, val context: PluginContext, val type: KClass<T>) : class KotlinMessageHandler<T : Message>(val world: World, val context: PluginContext, val type: KClass<T>) :
KotlinPlayerHandlerProxyTrait<T>, MessageHandler<T>(world) { KotlinPlayerHandlerProxyTrait<T>, MessageHandler<T>(world) {
override var callback: T.(Player) -> Unit = {} override var callback: T.(Player) -> Unit = {}
override var predicate: T.() -> Boolean = { true } override var predicate: T.() -> Boolean = { true }
override fun handle(player: Player, message: T) = handleProxy(player, message) override fun handle(player: Player, message: T) = handleProxy(player, message)
override fun register() = context.addMessageHandler(type.java, this) override fun register() = context.addMessageHandler(type.java, this)
} }
class KotlinCommandHandler(val world: World, val command: String, privileges: PrivilegeLevel) : class KotlinCommandHandler(val world: World, val command: String, privileges: PrivilegeLevel) :
KotlinPlayerHandlerProxyTrait<Command>, CommandListener(privileges) { KotlinPlayerHandlerProxyTrait<Command>, CommandListener(privileges) {
override var callback: Command.(Player) -> Unit = {} override var callback: Command.(Player) -> Unit = {}
override var predicate: Command.() -> Boolean = { true } override var predicate: Command.() -> Boolean = { true }
override fun execute(player: Player, command: Command) = handleProxy(player, command) override fun execute(player: Player, command: Command) = handleProxy(player, command)
override fun register() = world.commandDispatcher.register(command, this) override fun register() = world.commandDispatcher.register(command, this)
} }
+8 -16
View File
@@ -6,7 +6,9 @@
* required to resolve references within plugin code. * required to resolve references within plugin code.
*/ */
import org.apollo.game.command.Command
import org.apollo.game.message.handler.MessageHandlerChainSet import org.apollo.game.message.handler.MessageHandlerChainSet
import org.apollo.game.message.impl.ButtonMessage
import org.apollo.game.model.World import org.apollo.game.model.World
import org.apollo.game.model.area.RegionRepository import org.apollo.game.model.area.RegionRepository
import org.apollo.game.model.entity.* import org.apollo.game.model.entity.*
@@ -16,21 +18,11 @@ import org.apollo.game.plugin.kotlin.*
import org.apollo.net.message.Message import org.apollo.net.message.Message
import kotlin.reflect.KClass import kotlin.reflect.KClass
fun <T : Message> on(type: () -> KClass<T>): KotlinMessageHandler<T> { fun <T : Message> on(type: () -> KClass<T>): KotlinPlayerHandlerProxyTrait<T> = null!!
null!! fun <T : PlayerEvent> on_player_event(type: () -> KClass<T>): KotlinPlayerHandlerProxyTrait<T> = null!!
} fun on_command(command: String, privileges: PrivilegeLevel): KotlinPlayerHandlerProxyTrait<Command> = null!!
fun <T : PlayerEvent> on_player_event(type: () -> KClass<T>): KotlinPlayerEventHandler<T> { fun on_button(button: Int): KotlinPlayerHandlerProxyTrait<ButtonMessage> = null!!
null!!
}
fun on_command(command: String, privileges: PrivilegeLevel): KotlinCommandHandler { fun start(callback: (World) -> Unit) = {}
null!! fun stop(callback: (World) -> Unit) = {}
}
fun start(callback: (World) -> Unit) {
}
fun stop(callback: (World) -> Unit) {
}