Skip to content

事件回调参数

使用 samp.events.on 订阅。每个回调接收一个 event table。

公共 Envelope

每个事件都包含:

字段类型说明
namestring精确事件名。
sequenceinteger运行时内单调递增的派发序号;同一次派发的所有订阅者看到相同值。
timestampinteger单调时钟毫秒数,不是系统日期时间。
sessionIdinteger事件所属会话。
playerGenerationinteger事件对应的本地玩家世代。

payload table 只应在当前回调中使用;任务需要延后处理时复制其中的基础值。 未标记“可写”的字段即使被修改,也不会影响宿主行为。

生命周期、帧与 UI

事件附加字段说明
plugin.loaded入口文件加载后派发;必须在入口求值期间订阅。
session.started新运行会话开始。
session.ended当前会话结束。
game.ready游戏服务就绪。
server.connected多人游戏连接完成。
server.disconnected连接结束。
player.spawned应在这里重新取得玩家及相关资源。
player.died旧玩家世代资源应视为失效。
game.framedeltaSeconds: number每帧托管回调,工作必须有界。
draw.huddeltaSecondsscreenWidthscreenHeight: number唯一允许调用 samp.draw 的阶段。
ui.menu_opened本插件菜单打开;需要 ui.menu
ui.menu_closed本插件菜单关闭;需要 ui.menu
ui.control_changedpluginIdpageIdcontrolId: stringvalue: boolean/number/stringswitch 为 boolean;slider 为 number;choice/text input 为 string;button 为 "click"。应按页面和控件 ID 过滤。

本地玩家事件

事件权限Payload
player.health_changedgame.player.readpreviousHealth: numberhealth: number
player.vehicle_enteredgame.vehicle.readvehicleId: integerpassenger: boolean
player.vehicle_leftgame.vehicle.readvehicleId: integerpassenger: boolean
player.interior_changedgame.state.readpreviousInterior: integerinterior: integer

player.damage_before

需要 game.player.write

字段类型可变性
damagenumber可写,有限 0..100000;写入 0 可阻止伤害。
weaponTypeinteger只读输入。
bodyPartinteger只读输入。
sourceType"player""actor""entity"只读输入。
sourcePlayerIdinteger仅来源是已知玩家时存在。
sourceActorIdinteger仅来源是已知 Actor 时存在。

回调按优先级执行,后续回调能看到之前已接受的 damage。无效修改会被忽略, 该回调不能 yield。

聊天事件

事件权限Payload
chat.message_receivedchat.readplayerId: integerplayerName: stringmessage: stringlocalPlayer: boolean
chat.server_message_receivedchat.readmessage: stringcolor: integer(ARGB)。
chat.bubble_receivedchat.readplayerId: integermessage: stringcolor: integerdrawDistance: numberdurationMs: integer

chat.message_sending

需要 chat.interceptmessage: stringcancelled: boolean 可写。 替换文本必须是有效 UTF-8、非空、最多 4,096 字节,不含 NUL/CR/LF,且不能 以 / 开头。

command.executing

需要 command.interceptcommand: stringcancelled: boolean 可写。 替换值同样最多 4,096 字节且不能包含换行,必须以 / 开头,并至少还有一个 字符。

两者的取消都是粘性的:一旦设为 true,后续回调不能恢复为 false。可变拦截 回调不能 yield。

检查点事件

checkpoint.enteredcheckpoint.left 需要 game.state.read

字段类型说明
kind"normal""race"检查点类型。
positionVector3坐标。
sizeVector3方盒形检查点时存在。
radiusnumber半径形检查点时存在。
raceTypeinteger与 radius 一同存在。

服务器实体事件

entity.streamed_inentity.streamed_out 需要 game.entity.read

字段类型
entityTypeplayervehicleobjectactorpickuptext_label
entityIdinteger
streamGenerationinteger

streamed_in 时可将三个字段传给 samp.entity.get;streamed_out 后对应旧 Handle 已失效。

Dialog 事件

dialog.shown

需要 dialog.read

字段类型说明
dialogIdinteger0..32767
styleIdinteger数字样式 0..5
stylestringmessageinputlistpasswordtablisttablist_headers
titlestring标题。
messagestring正文或列表数据。
primaryButtonstring主按钮文字。
secondaryButtonstring次按钮文字,可能为空。

所有字符串均为 UTF-8;title 和每个按钮最长 1,024 字节,message 最长 16 KiB。

dialog.responding

需要 dialog.interceptaccepted: booleanlistItem: integer-1..65534)、input: string(有效 UTF-8、最多 4,096 字节、不含 NUL/CR/LF)以及 cancelled: boolean 可写;dialogId 只读。取消是粘性的, 无效替换会被忽略,回调不能 yield。

TextDraw 事件

TextDraw 身份由 textdrawId0..3071)和正整数 textdrawGeneration 共同组成。

事件权限附加 Payload
textdraw.showntextdraw.read身份、styleId: integertext: stringselectable: booleanx: numbery: number
textdraw.hiddentextdraw.read身份。
textdraw.text_changedtextdraw.read身份、text: string
textdraw.clickingtextdraw.intercept身份、可写 cancelled: boolean

事件中的 text 最多 4,096 字节。点击取消是粘性的,拦截回调不能 yield。