Экспорты и события FiveM: межресурсное взаимодействие
Освойте экспорты, события и триггеры FiveM. Создавайте чистые API между ресурсами, избегайте плохих практик и следуйте примерам лучших open-source скриптов.
Agency Scripts
Основатель и ведущий разработчик Agency Scripts
События против экспортов: когда использовать что
FiveM предоставляет два основных механизма для межресурсного взаимодействия: события и экспорты. События асинхронны и работают по принципу fire-and-forget, что идеально подходит для уведомлений, логирования и запуска побочных эффектов между ресурсами. Экспорты же , это синхронные вызовы функций с немедленным возвратом значений, что отлично подходит для получения данных и утилитарных функций. Выбор правильного механизма для каждого случая , основа написания чистого и поддерживаемого кода 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. Эти callback позволяют клиенту запрашивать данные у сервера и получать их в callback-функции, связывая асинхронные события с кодом, который ощущается как синхронный. Понимание этих паттернов важно при работе с запросами к базе данных или проверками инвентаря, требующими серверного авторитета.
Лучшие практики коммуникации ресурсов
Используйте неймспейсы для названий событий, чтобы избежать конфликтов, используя шаблон вроде resourceName:eventAction. Четко документируйте ваши экспорты, чтобы другие разработчики могли интегрироваться с вашим ресурсом. Избегайте создания циклических зависимостей, когда два ресурса экспортируют друг другу, так как это может вызвать проблемы с порядком загрузки. При проектировании API для ваших скриптов отдавайте предпочтение экспортам для простого доступа к данным и событиям для сложных рабочих процессов, включающих несколько шагов или побочные эффекты в разных частях вашего сервера.