主题
插件端到端案例
这一页给一个最小骨架,把模板注册、处理器注册、状态回写和打开 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))
})
}检查项
- 模板能注册并打开
- Query 能返回快照
- Command 能回写
sync:* - Event 能正常上报