Skip to content

插件端到端案例

这一页给一个最小骨架,把模板注册、处理器注册、状态回写和打开 UI 串起来。

启动阶段

kotlin
class MyRpgPlugin : JavaPlugin() {

    override fun onEnable() {
        registerTemplates()
        registerHandlers()
    }

    private fun registerTemplates() {
        val uiFile = File(dataFolder, "ui/rpg/main.bui")
        BUIServerAPI.template().registerFile("rpg/main", uiFile)
    }

注册 Query / Command / Event

kotlin
    private fun registerHandlers() {
        BUIServerAPI.action().query().register("rpg/main", "rpg.player.snapshot") { player, _, _, _ ->
            mapOf("name" to player.name, "level" to player.level, "health" to player.health)
        }

        BUIServerAPI.action().command().register("rpg/main", "rpg.skill.cast") { player, _, storeId, payload ->
            val skillId = (payload as? Map<*, *>)?.get("skillId")?.toString() ?: return@register mapOf("ok" to false)
            val result = castSkill(player, skillId)
            BUIServerAPI.state().setSyncValue(player, storeId, "mp", result.currentMp)
            mapOf("ok" to true, "cooldownSec" to result.cooldownSec, "currentMp" to result.currentMp)
        }

        BUIServerAPI.action().event().register("rpg/main", "rpg.panel.close") { player, _, storeId, _ ->
            logger.info("player={} closed {}", player.name, storeId)
        }
    }

打开 UI

kotlin
    fun openMainPanel(player: Player) {
        BUIServerAPI.ui().open(
            player,
            "rpg/main",
            mapOf(
                "hp" to player.health,
                "maxHp" to player.maxHealth,
                "mp" to 50,
                "maxMp" to 100
            )
        )
    }
}

客户端调用示意

javascript
import { command } from "bui:action"
import { defineStore } from "bui:state"

const store = defineStore("rpg.main", { cooldown: 0 })

function castSkill(skillId) {
  command("rpg.skill.cast", { skillId }, (res) => {
    store.set("cooldown", Number(res.cooldownSec ?? 0))
  })
}

检查项

  1. 模板能注册并打开
  2. Query 能返回快照
  3. Command 能回写 sync:*
  4. Event 能正常上报