Skip to content

事件脚本

将代码写入书与笔/成书,放进容器(箱子等),通过 /lktevent add 绑定到游戏事件。事件触发时,书中代码自动执行。LittleKt 语法见 语言文档

event 变量

事件触发时,event 是一个包含该事件所有参数的 Map。可以直接读取和修改:

kotlin
// 读取事件参数
val playerId = event["playerId"]

// 修改事件参数(如取消事件)
event["cancel"] = true

不同事件的参数名不同。例如 ServerPlayerTryDestroyBlockEventplayerIdDelServerPlayerEventid。具体请查网易事件文档。

常用事件与配方

玩家进入 — ClientLoadAddonsFinishServerEvent

kotlin
val playerId = event["playerId"]
clientSys.createMsgbox(playerId, "欢迎回来!")

// 统计访问次数
if (db["visits"] == null) { db["visits"] = 0 }
db["visits"] = db["visits"] + 1

玩家离开 — DelServerPlayerEvent

kotlin
val playerId = event["id"]
println("$playerId 离开了游戏")

聊天消息 — ServerChatEvent

kotlin
val msg = event["message"]
val playerId = event["playerId"]

when {
    msg.contains("帮助") -> clientSys.createMsgbox(playerId, "命令列表:/lktrun /lktevent")
    msg.contains("传送") -> println("$playerId 请求传送")
    else -> {}
}

玩家死亡 — PlayerDieEvent

kotlin
val playerId = event["playerId"]
println("$playerId 死亡,原因:${event["cause"]}")

破坏方块 — ServerPlayerTryDestroyBlockEvent

kotlin
val x = event["x"]
val y = event["y"]
val z = event["z"]
val playerId = event["playerId"]

// 禁止破坏 Y<10 的深层方块
if (y < 10) {
    event["cancel"] = true
    clientSys.createMsgbox(playerId, "禁止破坏深层方块!")
    clientSys.vibrateDevice(playerId, 200)
}

// 禁止破坏主城(x:0~50, z:0~50)
if (x >= 0 && x <= 50 && z >= 0 && z <= 50 && y <= 64) {
    event["cancel"] = true
    clientSys.createMsgbox(playerId, "这是保护区!")
}

方块交互 — ServerBlockUseEvent

kotlin
// 前提:已在 System 中注册了方块白名单
val playerId = event["playerId"]
val blockName = event["blockName"]
println("$playerId 点击了 $blockName")

物品在方块上使用 — ServerItemUseOnEvent

kotlin
val entityId = event["entityId"]
val itemName = event["itemName"]
println("$entityId 在方块上使用了 $itemName")

容器物品变化 — ContainerItemChangedServerEvent

kotlin
val playerId = event["playerId"]
val slot = event["slot"]
val containerType = event["containerType"]

println("容器物品变化:玩家=$playerId,槽位=$slot")

// 检测特定容器类型
if (containerType == serverApi.GetMinecraftEnum().ContainerType.SMOKER) {
    println("烟熏炉发生变化")
}

合成输出 — CraftItemOutputChangeServerEvent

kotlin
val playerId = event["playerId"]
val outputItem = event["itemDict"]

if (outputItem != null) {
    println("$playerId 制作了 ${outputItem["itemName"]} x${outputItem["count"]}")
}

弹射物命中 — ProjectileDoHitEffectEvent

kotlin
println("弹射物命中!")
// 取消碰撞效果:
// event["cancel"] = true

踩上方块 — StepOnBlockServerEvent

kotlin
// 前提:已在 System 中注册了方块监听
val entityId = event["entityId"]
val blockName = event["blockName"]
println("$entityId 踩上了 $blockName")

游戏刻 — OnMCTick

随服务端游戏刻触发(最高 20 次/秒)。需要周期性执行逻辑时用它,简单的判断和赋值每 tick 跑也没问题:

kotlin
var tick = globals["timer"]
if (tick == null) {
    globals["timer"] = 0
    tick = 0
}
globals["timer"] = tick + 1

// 每 200 刻(约 10 秒)执行一次
if (tick % 200 == 0) {
    println("定时任务触发,刻数:$tick")
}

// 每 1200 刻(60 秒)执行
if (tick % 1200 == 0) {
    val comp = serverApi.GetEngineCompFactory().CreateCommand(serverSys.levelId)
    comp.SetCommand("/say 服务器运行中...")
}

生物死亡 — MobDieEvent

kotlin
val mobId = event["mobId"]
val cause = event["cause"]
println("生物 $mobId 死亡,原因:$cause")

实体受伤 — ActorHurtServerEvent

kotlin
val entityId = event["entityId"]
val attackerId = event["attackerId"]
val damage = event["damage"]
println("$entityId 受到 $attackerId$damage 点伤害")

实体生成 — ServerSpawnMobEvent

kotlin
val entityId = event["entityId"]
val entityType = event["entityType"]
println("生成了 $entityType,ID:$entityId")

注意createConfirmbox / createInputbox 的回调是异步的,回调内无法访问原始 event 变量(原事件早已结束)。