FiveM 导出与事件:资源间通信
掌握 FiveM 导出、事件和触发器。在资源间构建干净API,避免不良模式,参考顶级开源脚本示例。
Agency Scripts
Agency Scripts 创始人兼首席开发者
事件与导出:何时使用哪种
FiveM 提供两种主要的资源间通信机制:事件和导出。事件是异步且一次性触发,适合通知、日志记录和跨资源触发副作用。导出则是同步函数调用,立即返回值,适合数据检索和实用函数。为每种用例选择合适机制是编写清晰、可维护 FiveM 代码的基础。
服务器和客户端事件
FiveM中的事件按特定方向流动。 TriggerServerEvent 将数据从客户端发送到服务器,在那里可以安全处理。 TriggerClientEvent 使用玩家源标识符或 -1 用于广播。本地事件由触发器触发 TriggerEvent 保持在相同执行上下文中。始终使用注册网络事件 RegisterNetEvent 添加处理程序之前,且请记住客户端注册的任何事件都可能被使用注入器的作弊者触发。
保护您的事件
服务器端事件处理程序应始终验证传入数据。检查源玩家是否存在,验证数据类型是否符合预期,并应用速率限制以防止刷屏。切勿通过客户端事件传递数据库ID等敏感信息,除非经过验证。常见模式是使用服务器端回调,客户端请求数据,服务器验证请求并获取信息,然后触发响应事件返回给特定客户端。
使用导出功能
导出允许一个资源暴露函数供其他资源直接调用。您可在您的 fxmanifest.lua 并在您的脚本文件中实现它们。当其他资源调用 exports['your-resource']:YourFunction(args),它同步执行并返回结果。这对于框架桥接、共享实用库以及从电话脚本、库存系统或工作管理器访问数据而不通过事件紧密耦合资源特别有用。
回调和异步模式
许多 FiveM 框架实现了结合事件和响应处理的回调系统。QBCore 使用 QBCore.Functions.CreateCallback 在服务器端和 QBCore.Functions.TriggerCallback 在客户端。ESX有类似模式, ESX.RegisterServerCallback这些回调允许客户端从服务器请求数据并在回调函数中接收,弥合异步事件与同步感代码之间的差距。理解这些模式对于处理需要服务器权限的数据库查询或库存检查至关重要。
资源通信的最佳实践
保持事件名称命名空间以避免冲突,使用类似的模式 resourceName:eventAction. 清晰记录你的导出,以便其他开发者能与你的资源集成。避免创建两个资源相互导出的循环依赖,因为这可能导致加载顺序问题。设计脚本API时,简单数据访问优先使用导出,复杂工作流涉及多步骤或服务器不同部分副作用时使用事件。