Skip to content

事件回调参数 ​

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

公共 Envelope ​

每个事件都包含:

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

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

生命周期、帧与 UI ​

事件附加字段说明
plugin.loaded无入口文件加载后派发;必须在入口求值期间订阅。
plugin.unloading无释放订阅、任务和效果前派发。
session.started无新运行会话开始。
session.ended无当前会话结束。
game.ready无游戏服务就绪。
server.connected无多人游戏连接完成。
server.disconnected无连接结束。
player.spawned无应在这里重新取得玩家及相关资源。
player.died无旧玩家世代资源应视为失效。
game.framedeltaSeconds: number每帧托管回调,工作必须有界。
draw.huddeltaSeconds、screenWidth、screenHeight: number唯一允许调用 samp.draw 的阶段。
ui.menu_opened无本插件菜单打开;需要 ui.menu。
ui.menu_closed无本插件菜单关闭;需要 ui.menu。
ui.control_changedpluginId、pageId、controlId、valueType、valueswitch 为 boolean;slider/number_input 为归一化 number;选择类控件和 list 为 string;button/confirm_button 为 action/click;group 为 action/toggle。应按页面和控件 ID 过滤。

ui.control_changed 只由可交互控件产生。section、text、divider 和 progress 是仅展示控件;multi_choice 回传被切换选项的 value, text_input 和 color_picker 在用户点击“应用”后才回传,list 回传被点击条目的 value。

本地玩家事件 ​

事件权限Payload
player.health_changedgame.player.readpreviousHealth: number、health: number。
player.vehicle_enteredgame.vehicle.readvehicleId: integer、passenger: boolean。
player.vehicle_leftgame.vehicle.readvehicleId: integer、passenger: boolean。
player.interior_changedgame.state.readpreviousInterior: integer、interior: integer。
player.weapon_changedgame.player.read之前和当前武器 ID。
player.aiming_changedgame.player.read之前和当前瞄准状态。
player.motion_changedgame.player.readpreviousActivity、activity、previousMoveState、moveState、onGround、inAir。
player.vehicle_collisiongame.vehicle.readvehicleId、otherType(vehicle、player 或 world)、可选 otherId、impact、speed、position。
player.skin_changedgame.player.readpreviousSkin、skin。
player.animation_changedgame.player.readpreviousAnimation、animation。
player.task_changedgame.player.readpreviousCategory、category、previousType、previousName、type、name。
world.time_changedgame.state.readpreviousHour、previousMinute、hour、minute。
world.weather_changedgame.state.readpreviousWeather、previousHoldTime、weather、holdTime。
vehicle.health_changedgame.vehicle.read载具 ID 和之前/当前生命值。
vehicle.state_changedgame.vehicle.readvehicleId、previousModel、model、可选 previousHeading/heading,以及引擎、车灯、警报状态的前后布尔值。

player.damage_before ​

需要 game.player.write:

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

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

派发与生命周期规则 ​

游戏、网络和 Android UI 线程只会把不可变快照写入容量为 256 的有界队列, 下一游戏主线程帧再派发;网络观测最多占用 96 项,普通通知最多占用 224 项, 以便为生命周期事件保留空间。队列满时丢弃新的通知,网络线程不会等待 Lua。

玩家可用状态和 generation 使用独立的可靠状态同步,因此不会因通知队列满而 丢失。状态变化每帧最多采样一次,在生命周期事件之后、game.frame 和 draw.hud 之前派发。直接切换载具时先派发 player.vehicle_left,再派发 player.vehicle_entered。出生、重连或运行中启用插件后的首次采样只建立基线, 不会补发历史变化;即使事件在 generation 改变前入队,也必须重新获取旧 Handle。

聊天事件 ​

事件权限Payload
chat.message_receivedchat.readplayerId: integer、playerName: string、message: string、localPlayer: boolean。
chat.server_message_receivedchat.readmessage: string、color: integer(ARGB)。
chat.bubble_receivedchat.readplayerId: integer、message: string、color: integer、drawDistance: number、durationMs: integer。

chat.message_sending ​

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

command.executing ​

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

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

检查点事件 ​

checkpoint.entered 与 checkpoint.left 需要 game.state.read。

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

服务器实体事件 ​

entity.streamed_in 与 entity.streamed_out 需要 game.entity.read:

字段类型
entityTypeplayer、vehicle、object、actor、pickup 或 text_label
entityIdinteger
streamGeneration正 integer

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

input.touch、camera.mode_changed 与网络事件 ​

input.touch 需要 ui.input,在触摸传递给游戏前同步派发,字段为 action(down、move、up、cancel)、pointerId、屏幕像素坐标 x/y、屏幕尺寸 width/height、限制在 0..1 的 normalizedX/normalizedY 和可写的 cancelled。将 cancelled 设为 true(或回调返回 false)会消费手势,同一 pointer 序列后续事件保持消费。 camera.mode_changed 需要 game.state.read,提供 previousMode 和 mode。

network.packet_received、network.rpc_received、network.packet_sending 和 network.rpc_sending 需要 network.inspect,发送前的两个对应事件需要 network.intercept。它们提供 packet/RPC ID、来源、字节/位长度、最多 4096 字节的 payload 前缀和 truncated;只有发送前事件允许修改粘性的 cancelled。观测是异步的,拦截在运行时无法安全同步执行时会放行。

pickup.collected ​

需要 game.entity.read,提供 pickupId、model、type 和 position,是 只读通知,不提供可变的 Pickup Handle。

Dialog 事件 ​

dialog.shown ​

需要 dialog.read:

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

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

dialog.responding ​

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

TextDraw 事件 ​

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

事件权限附加 Payload
textdraw.showntextdraw.read身份、styleId: integer、text: string、selectable: boolean、x: number、y: number。
textdraw.hiddentextdraw.read身份。
textdraw.text_changedtextdraw.read身份、text: string。
textdraw.clickingtextdraw.intercept身份、可写 cancelled: boolean。

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