# KetherScript

# 介绍

KetherTabooLib框架中内置的脚本语言,由 海螺先生 创造。
可以轻松实现诸多功能(如:发送动作栏或标题信息、改变玩家游戏模式、获取变量等等),它还拥有良好的拓展 API,能让其他开发者更加轻松地开发出自己的动作语句。

# 文档资源 (社区 · 新)

# 如何调用

fun runKether(script: List<String>, player: Player) {
    KetherShell.eval(
        script, options = ScriptOptions(
            sender = adaptCommandSender(player)
        )
    )
}

# 获取返回值

fun runKether(script: List<String>, player: Player): CompletableFuture<Any> {
    return KetherShell.eval(
        script, options = ScriptOptions(
            sender = adaptCommandSender(player)
        )
    ).thenApply { it }
}

# 注册组件

提供了 AbolethPlus 的 Get组件作为参考
作者:鹰

class AboPlusGetActions {

    class GetKeyValue(val key: ParsedAction<*>, val default: ParsedAction<*>? = null, val target: ParsedAction<*>? = null) : ScriptAction<Any?>() {

        override fun run(frame: ScriptFrame): CompletableFuture<Any?> {
            val future = CompletableFuture<Any?>()
            val keyString = frame.newFrame(key).run<String>().get()
            val defString = default?.let { frame.newFrame(it).run<String>().get() } ?: ""
            val targetOrNull = target?.let { frame.newFrame(it).run<String>().get() }
            val targetString = if (targetOrNull.isNullOrEmpty()) {
                frame.player().uniqueId
            } else {
                AbolethPlusAPI.getUserUUID(targetOrNull)
            }
            val result = AbolethPlusAPI.getValue(targetString, keyString, defString).getValueData(defString)
            future.complete(result)
            return future
        }
    }
    class GetKeyDefault(private val key: ParsedAction<*>) : ScriptAction<Any?>() {
        override fun run(frame: ScriptFrame): CompletableFuture<Any?> {
            val future = CompletableFuture<Any?>()
            val keyString = frame.newFrame(key).run<String>().get()
            val result = AbolethPlusAPI.getDefault(keyString)
            future.complete(result)
            return future
        }
    }



    /**
     * shared = true 公有语句
     * abpg {action} [def [{action}]] [@ (server|ID)]   -> 获取语句
     *
     * abpg key                 -> 获取 key 值, 默认值 ""
     * abpg key def             -> 获取 key 的默认值
     * abpg key def "default"   -> 获取 key 的值, 默认值 "default"
     *
     * @author 鹰
     * @since 2023/9/6
     *
     */
    companion object {
        @KetherParser(["abpg", "abolethplusget"], shared = true)
        fun parser() = scriptParser {
            val keyAction = it.nextParsedAction()
            it.mark()
            try {
                it.expect("def")
                it.mark()
                val defaultAction = it.nextParsedAction()
                if (it.hasNext()) {
                    val target = matchTarget(it)
                    GetKeyValue(keyAction, defaultAction, target)
                } else {
                    it.reset()
                    GetKeyDefault(keyAction)
                }
            } catch (ex: Exception) {
                it.reset()
                val target = matchTarget(it)
                GetKeyValue(keyAction, target = target)
            }
        }
        private fun matchTarget(it: QuestReader) =  try {
            it.mark()
            it.expect("@")
            it.nextParsedAction()
        } catch (ex: Throwable) {
            it.reset()
            literalAction("")
        }
    }
}

入门

15分钟

介绍

文档资源 (社区 · 新)

如何调用

获取返回值

注册组件