mirror of
https://github.com/2006-Scape/apollo.git
synced 2026-07-07 08:39:17 +00:00
Add on_button method to plugin scripts
This commit is contained in:
@@ -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)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user