事件脚本
将代码写入书与笔/成书,放进容器(箱子等),通过 /lktevent add 绑定到游戏事件。事件触发时,书中代码自动执行。LittleKt 语法见 语言文档。
event 变量
事件触发时,event 是一个包含该事件所有参数的 Map。可以直接读取和修改:
kotlin
// 读取事件参数
val playerId = event["playerId"]
// 修改事件参数(如取消事件)
event["cancel"] = true不同事件的参数名不同。例如
ServerPlayerTryDestroyBlockEvent用playerId,DelServerPlayerEvent用id。具体请查网易事件文档。
常用事件与配方
玩家进入 — 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变量(原事件早已结束)。
