К руководству

Документация 9.6.24

Справочник экспортов

Все публичные экспорты Tosun AC 9.6.15: параметры, возвращаемые значения, побочные эффекты и требование к доверию вызывающего ресурса. Для пошагового разбора по задачам начните с руководства по интеграции.

Вызов экспорта#

Серверные экспорты вызывайте из серверных скриптов вашего ресурса, клиентские — из его клиентских скриптов. В имени ресурса есть дефис, поэтому всегда используйте форму со скобками exports['tosun-ac']. Форма exports.tosun-ac недопустима в Lua.

  • Передавайте серверные id числами. Некоторые экспорты используют id напрямую как ключ таблицы.
  • Некоторые экспорты выполняют синхронный запрос к базе данных и уступают управление (yield). Вызывайте их из потока или обработчика события: getBans, getBanInfo, GetDetections, isAdmin и другие проверки персонала, IsExemptFromPunish, ForensicLinksOf и refreshPanelWhitelist. scanAllResources и scanSingleResource тоже уступают управление.
  • Защищённый экспорт, отклонивший ваш ресурс, возвращает false, даже если обычно возвращает nil.
  • Некоторые экспорты существуют, только когда включена их функция (см. «Экспорты, зависящие от функций»). Вызов незарегистрированного экспорта вызывает ошибку, поэтому оборачивайте такие вызовы в pcall.
  • Некоторых экспортов нет в списках экспортов fxmanifest.lua (например, MarkTeleport, punish и AllowWeapon). Эти списки носят лишь информационный характер; экспорты работают.
  • В таблицах ниже в последнем столбце стоит «Да», если вызывающий ресурс должен быть доверенным. См. «Доверенные ресурсы».
-- серверный скрипт в вашем ресурсе
local status = exports['tosun-ac']:GetIntegrationStatus()
if not status.trusted then
    print(status.hint) -- строка, которую нужно добавить в server.cfg
end

-- сообщить AC о телепорте, затем переместить игрока
exports['tosun-ac']:MarkTeleport(src, 8000)
SetEntityCoords(GetPlayerPed(src), x, y, z)

-- клиентский скрипт в вашем ресурсе
exports['tosun-ac']:SetExempt(true, 60000, 'my_menu')

Доверенные ресурсы#

Экспорты с «Да» в столбце доверия меняют освобождения, права персонала, баны, здоровье, оружие или инвентарь игрока, карантин, ресурсы и сигнатуры или весь сервер. Они принимают вызовы только от доверенного ресурса. Отклонённый вызов ничего не делает и возвращает false.

Вызывающий считается доверенным, если это серверная консоль, сам tosun-ac, ресурс из ts.ExportCallerWhitelist в конфигурации или ресурс из convar tosun_ac_trusted_resources. Список в конфигурации по умолчанию: qbx_core, qb-core, es_extended, ox_inventory и ox_lib.

Предпочитайте convar. Он находится в server.cfg и сохраняется при обновлениях AC, а правки файла конфигурации могут потеряться при обновлении. Разделяйте имена запятыми или пробелами. Список доверия кешируется на 10 секунд, поэтому изменение во время работы вступает в силу в течение 10 секунд.

При первом отказе для каждой пары «ресурс + экспорт» AC выводит в серверную консоль одно предупреждение с точной строкой для server.cfg и пишет одну строку в логи панели. Строка лога панели всегда на турецком.

Режим аудита: при ts.EnforceExportCallerWhitelist = false недоверенные вызовы выполняются, а каждая пара «ресурс + экспорт» один раз выводится в серверную консоль (без строки в логе панели). По умолчанию true. Используйте режим аудита только при настройке, чтобы увидеть, какие скрипты что вызывают.

Выполните tosunac_integration в серверной консоли, чтобы вывести режим применения, доверенные ресурсы с их источником (config или convar) и последние 20 отклонённых вызовов. Из скрипта вызовите GetIntegrationStatus().

Доверие также снимает бюджет MarkTeleport: доверенные ресурсы могут отмечать телепорты без лимита времени на игрока.

Tosun AC также регистрирует внутренние экспорты и сетевые события для собственной инфраструктуры (мост панели, подписи, сканирование, лицензирование, пакетная запись). Они не входят в этот справочник и не являются поддерживаемым API. Некоторые защищены проверкой доверия или внутренней проверкой вызывающего. Не вызывайте их.

# server.cfg
set tosun_ac_trusted_resources "my-housing,my-clothing"

Интеграция и освобождения#

Серверные экспорты, сообщающие AC о легитимных действиях ваших скриптов и показывающие, освобождён ли игрок.

ЭкспортПараметрыВозвращаетЧто делаетНужен доверенный ресурс?
MarkTeleportsrc; ms? (по умолчанию 8000, ограничено от 1000 до ts.Integration.markTeleportMaxMs, по умолчанию 15000); reason? (тег лога)true, если выдано или уже покрыто; false, если игрок недействителен или не в сети либо бюджета не хватаетМягкое освобождение. Вызывайте непосредственно перед перемещением игрока. Смягчает серверные проверки движения, проверки godmode/невидимости/noclip/focus и клиентские проверки самого игрока. Наказания за оружие, деньги, урон, злоупотребление событиями, инъекции и краши по-прежнему применяются. Сбрасывается при отключении.Нет. Недоверенные ресурсы делят бюджет 180000 мс на игрока за 10 минут (ts.Integration.markTeleportBudgetMs). Запрос, который не помещается, отклоняется целиком.
IsMovementExemptsrcbooleantrue, пока активно мягкое окно MarkTeleport или DetectionExempt.serverEvents.Нет
GetIntegrationStatusнет (вызывающий определяется автоматически){ version, resource, trusted, trustedVia ('config', 'convar', 'self' или nil), enforcing, hint }Сообщает вашему ресурсу, доверенный ли он и почему. hint — строка для server.cfg, если ресурс не доверенный. enforcing = false означает режим аудита.Нет
SetPlayerExemptsrc; state (true выдаёт, false снимает); durationMs? (по умолчанию 30000, максимум 300000); reason?true; false, если вызывающий не доверенный или src не числоПолное освобождение: иммунитет от серверных наказаний плюс клиентский флаг освобождения. Большинство клиентских проверок пропускается; обнаружения, всё же дошедшие до клиентского пути бана, понижаются до записей LOG с тегом [exempt]. Использует один таймер с whitelistPlayer, PausePlayerDetections и BypassDetection, поэтому новая выдача может сократить предыдущую, а state = false отменяет их. Сбрасывается при отключении.Да
SetExempt (server)src; durationMs? (по умолчанию 30000, максимум 300000); reason?как у SetPlayerExemptПсевдоним SetPlayerExempt(src, true, durationMs, reason). Одноимённый клиентский экспорт принимает другие аргументы.Да
BypassDetectionsrc; detectionKey (обязателен, но его значение игнорируется); durationMs? (по умолчанию 5000, от 500 до 60000)true; false, если вызывающий не доверенный, src отсутствует или равен 0 либо key равен nilУстаревшее имя. Даёт то же полное освобождение, что и SetPlayerExempt; не ограничивается одним обнаружением. Пустая таблица в качестве key возвращает true, но ничего не выдаёт.Да
PausePlayerDetectionssrc; durationMs? (по умолчанию 15000, максимум 300000)true; false, если вызывающий не доверенный или src не числоИммунитет от серверных наказаний плюс клиентский флаг паузы для одного игрока.Да
PauseAllDetectionsdurationMs? (по умолчанию 10000, максимум 300000)true; false, если вызывающий не доверенныйПриостанавливает клиентские обнаружения для всех игроков, находящихся онлайн сейчас. Серверного освобождения нет. Игроки, зашедшие позже, не приостанавливаются. Ограничения частоты нет.Да
AllowWeaponsrc; weapon? (имя, например 'WEAPON_PISTOL', хеш, '*' или nil для всего оружия); ms? (по умолчанию 600000, от 1000 до 3600000)true; false, если вызывающий не доверенный, игрок недействителен или не в сети либо число равно NaN/infПозволяет игроку держать и использовать оружие, которого нет в его инвентаре. Смягчает только проверку соответствия оружия инвентарю (оружие в руках и урон). Сбрасывается при отключении.Да
IsExemptFromPunishsrcboolean (true = не наказывать)Центральное правило, используемое модулями применения наказаний. true для персонала (если ts.AdminBypassDetections не равен false), активных освобождений, белого списка времени выполнения и белого списка панели, а также защищённых игроков. Из-за последнего правила персонал остаётся освобождённым здесь даже при AdminBypassDetections = false. Всегда false при ts.Debug. Может обращаться к базе данных.Нет
IsPlayerProtectedsrcbooleantrue для персонала, статуса администратора или активного освобождения. Игнорирует ts.AdminBypassDetections и ts.Debug. Не учитывает белый список времени выполнения и панели; для полного правила используйте IsExemptFromPunish. Может обращаться к базе данных.Нет

Выбор освобождения#

Используйте самое узкое освобождение, покрывающее ваш скрипт. Несколько освобождений используют один и тот же клиентский флаг, поэтому одно может завершить другое: ClearArea с именем зоны сбрасывает флаг, который также устанавливают SetPlayerExempt, MarkTeleport и BypassDetection.

ЭкспортИммунитет от серверных наказанийКлиентские проверкиДлительностьНужен доверенный ресурс?
MarkTeleportТолько проверки движения и видимостиОсвобождены (окно только продлевается)По умолчанию 8 с, минимум 1 с; максимум ts.Integration.markTeleportMaxMs за вызов (по умолчанию 15 с)Нет (с бюджетом)
SetPlayerExempt, SetExempt (server)ДаОсвобожденыПо умолчанию 30 с, максимум 300 сДа
BypassDetectionДаОсвобожденыПо умолчанию 5 с, от 0,5 до 60 сДа
PausePlayerDetectionsДаПриостановленыПо умолчанию 15 с, максимум 300 сДа
PauseAllDetectionsНетПриостановлены для игроков, находящихся онлайн сейчасПо умолчанию 10 с, максимум 300 сДа
whitelistPlayerДаБез клиентского флагаПо умолчанию 3600 с, -1 = до отключенияДа
AddWhitelistДа, по идентификаторуБез клиентского флагаДо перезапуска или durationSecДа
WhitelistAreaНетОсвобожденыПо умолчанию 30 сДа
AllowWeaponТолько проверка соответствия оружия инвентарюНе меняютсяПо умолчанию 600 с, максимум 3600 сДа
Client SetExempt, PauseDetectionsНетОсвобождены или приостановлены на этом клиентеПо умолчанию 30 с или 10 с, максимум 300 сНет (любой клиентский ресурс)

Персонал и права#

Чтение и изменение того, кого AC считает персоналом. Проверки персонала могут обращаться к базе данных, поэтому вызывайте их из потока или обработчика события.

isAdmin возвращает true для: ручной выдачи через addAdmin; ACE txadmin, tx.admin, txadmin.menu, txadmin.advanced, command.txadmin, command.ts, command.ban, command.kick, tosun.admin, ts.admin и любых из ts.AdminBypassAces; principal group.admin, group.superadmin, group.moderator и group.god; command.kick/ban/resources/restart при включённом ts.txAdminAuth; идентификаторов в admins.lua, ts.AdminMenu.allowedIds и ts.AdminBypassIdentifiers; прав из панели в базе данных. ACE, который также выдан builtin.everyone, не учитывается.

isAdmin и addAdmin зарегистрированы в исходном коде дважды. Версии из anticheat_server.lua загружаются последними и именно они работают; этот справочник описывает их.

ЭкспортПараметрыВозвращаетЧто делаетНужен доверенный ресурс?
isAdminsrc (передавайте число)booleanСтатус администратора из перечисленных выше источников. Результаты базы данных кешируются на 5 с при положительном ответе и на 30 с при отрицательном. Не учитывает ts.AdminBypassDetections.Нет
isStaffPlayersrcbooleanПроверка персонала, используемая на путях бана. Те же источники, что у isAdmin, плюс ACE команд txAdmin (command.kick/ban/resources/restart/screenshot/unban), если не задано ts.txAdminAuth = false.Нет
isAdminMenuAllowedsrcbooleanМожет ли игрок открыть меню администратора. false, если меню отключено. ACE только для txAdmin (txadmin, tx.admin), ts.AdminBypassAces и ts.AdminBypassIdentifiers не учитываются. Без кеша: один запрос к базе данных на вызов.Нет
getAdminTypesrc'tx', 'config' или falseВводящая в заблуждение метка: каждый положительный путь администратора устанавливает один и тот же флаг, поэтому персонал почти всегда получает 'tx', и 'tx' не означает txAdmin. Используйте вместо этого isAdmin.Нет
addAdminsrc (передавайте число)nil; false при отказеВыдача прав персонала во время работы: иммунитет от наказаний и доступ к меню администратора. Не сохраняется в базе данных. Не сбрасывается при отключении: остаётся привязанной к этому серверному id до removeAdmin или перезапуска.Да
removeAdminsrcnil; false при отказеСнимает ручную выдачу и кешированный статус. Права через ACE, txAdmin, admins.lua и панель не отзываются и снова учитываются при следующей проверке.Да

Белый список игроков и зоны#

Белый список по серверному id, белый список по идентификаторам и именованные зоны. Списки времени выполнения хранятся только в памяти и теряются при перезапуске; белый список панели — отдельный.

ЭкспортПараметрыВозвращаетЧто делаетНужен доверенный ресурс?
whitelistPlayersrc (передавайте число); durationSec? (по умолчанию 3600; -1 = до отключения)nil; false при отказеИммунитет от серверных наказаний по серверному id. Без клиентского флага. Сбрасывается при отключении. SetPlayerExempt, PausePlayerDetections и BypassDetection перезаписывают его.Да
removeWhitelistsrcnil; false при отказеЗавершает whitelistPlayer. Также завершает любой серверный иммунитет от SetPlayerExempt, PausePlayerDetections или BypassDetection.Да
AddWhitelisttarget (серверный id или строка идентификатора); durationSec? (nil или 0 = до перезапуска)true; false, если пусто или отклоненоДобавляет идентификаторы в белый список в памяти (не сохраняется в базе данных). Серверный id добавляет все идентификаторы этого игрока. Идентификаторы приводятся к нижнему регистру, префикс license:, license2:, discord:, steam: или fivem: удаляется. Значение только из цифр считается серверным id, поэтому передавайте Discord id с префиксом discord:.Да
RemoveWhitelisttarget (серверный id или идентификатор)true; false, если пусто или отклоненоУдаляет записи белого списка времени выполнения. Таблица белого списка панели не затрагивается.Да
IsWhitelistedsrcbooleantrue, если какой-либо идентификатор есть в белом списке времени выполнения или в кешированном белом списке панели. Не учитывает whitelistPlayer и SetPlayerExempt. Всегда false при ts.Debug.Нет
refreshPanelWhitelistнетnilСразу перезагружает белый список панели (синхронный запрос). Он также перезагружается через 12 с после запуска и каждые 60 с.Нет
WhitelistAreasrc; areaName (непустое); durationSec? (по умолчанию 30)true; false, если недействительно или отклоненоЗаписывает именованную зону и устанавливает клиентский флаг освобождения. Только облегчение на клиенте: ни один серверный модуль не читает зону, поэтому иммунитета от серверных наказаний нет.Да
ClearAreasrc; areaName? ('' или nil = все зоны)true; false, если src равен 0 или отклоненоУдаляет зону. С именем также сбрасывает клиентский флаг освобождения, что завершает и другие клиентские освобождения. С пустым именем флаг остаётся как есть.Да
IsInAreasrc; areaName? (пусто = любая зона)booleanС именем проверяет срок действия. С пустым именем возвращает true для любой записи, включая истёкшие.Нет

Наказания и баны#

Наказание игроков через конвейер AC, баны игроков не в сети и чтение банов. Все экспорты записи здесь требуют доверия.

ЭкспортПараметрыВозвращаетЧто делаетНужен доверенный ресурс?
punishsrc (онлайн); reason; image? (URL или данные скриншота); configKey?; punishment? ('BAN', 'KICK' или 'LOG')nil; false при отказеЗапускает полный конвейер наказаний AC. Освобождённые игроки пропускаются. См. «Как punish() выбирает наказание».Да
bansrc (онлайн); reasonnil; false при отказеТот же конвейер с ключом конфигурации 'Banned via Export' и наказанием ts.punishType. Не всегда навсегда: длительность — ts.BanDurations['default'] (0 = навсегда), а если владелец задал ts.punishType как KICK или LOG, вместо бана выполняется кик или запись в лог. Освобождённые игроки молча пропускаются.Да
BanPlayerExtsrc (онлайн); reason? (по умолчанию 'Banned by script')true, если отправлено; false, если вызывающий не доверенный или игрок не в сетиТо же, что ban().Да
KickPlayersrc (онлайн); reason? (по умолчанию 'Kicked by script')true; false, если вызывающий не доверенный или игрок не в сетиПростой кик с сообщением '[Tosun AC] ' и причиной. Без проверки освобождений: персонал и игроки из белого списка тоже кикаются. Ничего не записывается в лог.Да
offlineBandata { playername, license, steam, discord, ip, HWID, HWID2–HWID5 } (идентификаторы без префиксов); reasonnil; false при отказеСтрока постоянного бана для игрока не в сети. Отсутствующие идентификаторы сохраняются как заглушки, которые никогда не совпадают при подключении. Всегда задавайте data.playername и reason: без них вставка при STRICT sql_mode завершается ошибкой, и вызывающий об этом не узнаёт. Выводит строку в консоль. data = nil вызывает ошибку Lua.Да
offlineBanByLicenselicense (hex без префикса или 'license:...'); reason? (по умолчанию 'Sebep yok', на турецком); actor? (по умолчанию 'panel'); name?; citizenid?true, banID ('O' + 8 hex); false, 'license required'; false при отказеПостоянный бан по license плюс строка истории в ac_offline_bans. Возвращает результат до завершения записи в базу данных, поэтому ошибки базы данных не сообщаются. Не кикает игрока, находящегося онлайн. license не строкового типа вызывает ошибку Lua.Да
unbanbanIDвсегда nilАсинхронно: если бан существует, удаляет его, отправляет лог в Discord на вебхук меню администратора и вызывает серверное событие ts_anticheat:playerUnbanned. Строки истории ac_offline_bans сохраняются.Да
getBanslimit? (по умолчанию 100, без ограничения сверху); offset? (по умолчанию 0)строки банов, сначала новыеПолные строки, включая столбцы IP, license, Steam, Discord и HWID. Синхронный запрос.Нет
getBanInfobanIDполная строка бана или nilСинхронный запрос.Нет

Как punish() выбирает наказание#

punish(), ban() и BanPlayerExt() используют один конвейер. Вот порядок его работы.

  1. Персонал пропускается, если ts.AdminBypassDetections не равен false. Игроки с активным освобождением или в белом списке времени выполнения или панели пропускаются. ts.Debug отключает эти пропуски. Пропущенные вызовы ничего не делают и ничего не пишут в лог.
  2. Игрок должен быть онлайн. Иначе в серверную консоль выводится ошибка, и ничего не происходит.
  3. Наказание: побеждает допустимый аргумент punishment. Иначе ts.DetectionPunishments[configKey], затем его псевдоним, затем ключ обнаружения, затем ts.punishType, затем BAN.
  4. Каждый исход вызывает серверное событие ts_anticheat:playerBanned, публикует сообщение в чат при включённом ts.chatMessages, добавляет облачное нарушение и пишет лог AC и живой лог.
  5. LOG: отправляет лог со скриншотом в Discord.
  6. KICK: повторно проверяет персонал независимо от ts.AdminBypassDetections, поэтому персонал никогда не кикается. Затем отправляет лог со скриншотом и отключает игрока.
  7. BAN: вставляет бан с длительностью из ts.BanDurations в часах (configKey, псевдоним, ключ обнаружения, префикс, затем default; 0 = навсегда) и bannedBy 'anticheat:' плюс ключ. Вызывает ts_anticheat:banCommitted, уведомляет панель и отключает игрока (повтор через 3 с).
exports['tosun-ac']:punish(src, 'Money exploit', nil, 'my_shop_exploit', 'BAN')

Модерация отдельного игрока#

Действия над одним игроком. Внимательно смотрите на столбец доверия: у некоторых из этих экспортов нет проверки доверия.

ЭкспортПараметрыВозвращаетЧто делаетНужен доверенный ресурс?
freezePlayersrc (онлайн); freeze (boolean)true; false, если игрок не в сетиЗамораживает или размораживает игрока и публикует локализованное уведомление в чате. Флаг заморозки не сбрасывается при отключении.Нет
isPlayerFrozensrcbooleanОтражает только freezePlayer, а не massFreeze.Нет
slayPlayersrc (онлайн)true; false, если игрок не в сетиУбивает игрока на его клиенте и показывает уведомление.Нет
warnPlayersrc (онлайн); reason?; actor? (по умолчанию 'console')true; false, если игрок не в сетиПредупреждение игроку в чате и строка в ac_player_warnings.Нет
mutePlayersrc (онлайн); durationSec? (число; nil или 0 = навсегда); reason?; actor? (по умолчанию 'system')true; false, если игрок не в сетиБлокирует устаревшие события chatMessage игрока и сохраняет строку в ac_player_mutes. Временные муты заканчиваются в течение 15 с после истечения. Постоянный мут не сбрасывается при отключении и переходит к следующему игроку с тем же серверным id до unmutePlayer или перезапуска. Уведомления в чате для игрока жёстко заданы на турецком.Нет
unmutePlayersrctrue; false, если src равен nilСнимает мут и уведомляет игрока, если он онлайн (уведомление в чате жёстко задано на турецком).Нет
isPlayerMutedsrcbooleanТолько чтение.Нет
setPlayerHealthsrc (онлайн); hp? (по умолчанию 100, от 0 до 200)true; false, если игрок не в сети или отклоненоУстанавливает здоровье на клиенте и задаёт максимальное здоровье 200.Да
setPlayerArmorsrc (онлайн); armor? (по умолчанию 0, от 0 до 100)true; false, если игрок не в сети или отклоненоУстанавливает броню на клиенте.Да
giveWeaponsrc (онлайн); weapon? (по умолчанию 'WEAPON_PISTOL'); ammo? (по умолчанию 60)true; false, если игрок не в сети или отклоненоИспользует ox_inventory, если он запущен; иначе инвентарь QB (только фреймворк 'qb' или 'qbox', не 'qbcore'); иначе addWeapon из ESX; иначе нативную выдачу. Возвращает true, даже если инвентарь отказал в предмете. Не вызывает AllowWeapon, поэтому выданное нативно оружие может быть помечено проверкой соответствия оружия инвентарю (действие по умолчанию — log).Да
stripWeaponssrc (онлайн)true; false, если игрок не в сети или отклоненоЗабирает всё оружие у педа. Предметы инвентаря не затрагиваются.Да
clearInventorysrc (онлайн)true; false, если игрок не в сети или отклоненоОчищает инвентарь через ox_inventory. Без ox_inventory только показывает уведомление и ничего не очищает, но всё равно возвращает true.Да
spectatePlayeradminSrc; targetSrctrue; false, если аргумент равен nil или у цели нет педаНе настоящее наблюдение: телепортирует adminSrc к цели. Каждый вызов также даёт adminSrc освобождение от проверок движения на 15 с без учёта бюджета.Нет

Действия на весь сервер#

Действия, затрагивающие всех игроков или все новые подключения.

ЭкспортПараметрыВозвращаетЧто делаетНужен доверенный ресурс?
lockdownStatusнетactive (boolean), reason (строка)Только чтение.Нет
setLockdownstate (boolean); reason (при включении передавайте строку)nil; false при отказеПока режим активен, каждое новое подключение отклоняется с сообщением LOCKDOWN и причиной. Обхода для персонала нет. Только на время работы. Рассылает строку в чат. Вызов с state = true без reason включает lockdown, а затем вызывает ошибку Lua.Да
emergencyLockdownreason? (причина lockdown по умолчанию 'Acil durum', на турецком)число кикнутых игроков; false при отказеВключает lockdown и кикает всех игроков, не входящих в персонал, с локализованным сообщением.Да
massFreezestate (boolean)число игроков; false при отказеЗамораживает или размораживает всех игроков, включая персонал, и рассылает строку в чат. Строка в чате жёстко задана на турецком.Да
healAllнетчисло игроков, которым отправлено лечение; false при отказеУстанавливает максимальное здоровье и броню 100 для каждого игрока с педом.Да
setSpeedLimitkmh (0 отключает)применённый лимит; false при отказеОграничивает скорость транспорта для игроков, находящихся онлайн сейчас. Игроки, зашедшие позже, лимит не получают.Да
applyWeatherWithFrameworkweather (не проверяется)true, список опробованных методовПробует qb-weather, Renewed-Weathersync, cd_easytime, затем wd_weather, weathersync, vSync и qb-weathersync, иначе рассылает всем клиентам. Существует, только если меню администратора включено.Нет
applyTimeWithFrameworkhour; minute (без ограничения диапазона)true, список опробованных методовТа же цепочка запасных вариантов для времени. Существует, только если меню администратора включено.Нет

Карантин и защита от вредных данных#

Изоляция подозрительного игрока и защита ваших сетевых событий от краш-данных и спама.

ЭкспортПараметрыВозвращаетЧто делаетНужен доверенный ресурс?
quarantinesrc (онлайн); reason? (по умолчанию 'supheli davranis', на турецком); seconds? (по умолчанию 300, от 30 до 1800)true (также если игрок уже в карантине); false для освобождённых или недействительных игроков, при ошибке bucket или для недоверенного вызывающегоПереносит игрока в изолированный routing bucket (по умолчанию от 9001 до 9500, строгая блокировка сущностей, без популяции). Записывает обнаружение QUARANTINE и отправляет игроку уведомление в чат, если не задано notifyPlayer = false. Уведомление жёстко задано на турецком. Освобождение происходит автоматически по истечении времени.Да
releaseQuarantinesrctrue, если освобождён; false, если не в карантине или отклоненоВозвращает исходный routing bucket, записывает в лог и уведомляет игрока (уведомление в чате жёстко задано на турецком, если не задано notifyPlayer = false).Да
isQuarantinedsrcbooleanТолько чтение.Нет
quarantineListнет{ id, name, reason, remaining }[] (remaining в секундах)Только чтение.Нет
crashGuardInspectvalue (любые данные)nil, если безопасно; иначе описание проблемы на турецкомПроверяет числа NaN/Inf, недопустимые векторы, строки длиннее 32768 символов, вложенность глубже 8, более 2000 элементов, около 64 КБ в сумме, ключи длиннее 512 символов, неподдерживаемые типы и рекурсию. Без побочных эффектов.Нет
crashGuardRejectsrc (онлайн); payloadtrue, если данные плохие (отбросьте их); false, если чисто или src недействителенТа же проверка плюс страйк игроку. 3 страйка за 60 с применяют ts.crashGuard.action: 'kick' (по умолчанию), 'ban' или любое другое значение = только консоль и лог. Освобождённые игроки пропускаются.Нет
RateLimitsrc; key? (по умолчанию 'default'); max? (по умолчанию 10, минимум 1); windowMs? (по умолчанию 10000, минимум 100)true = разрешено; false = лимит превышенСчётчик с фиксированным окном на игрока и ключ. Ключи общие для всех ресурсов, поэтому добавляйте к ним префикс с именем своего ресурса. src, равный 0 или недействительный, всегда возвращает true. Сбрасывается при отключении.Нет
RegisterNetEvent('myres:buy', function(data)
    local src = source
    if not exports['tosun-ac']:RateLimit(src, 'myres:buy', 5, 10000) then return end
    if exports['tosun-ac']:crashGuardReject(src, data) then return end
    -- обработать покупку
end)

Игроки и обнаружения#

Поиск игроков, идентификаторов, банов игрока, показателей угрозы и связанных аккаунтов. Некоторые результаты содержат персональные данные, например IP-адреса.

ЭкспортПараметрыВозвращаетЧто делаетНужен доверенный ресурс?
GetPlayerInfosrc (онлайн){ id, name, ping, license, discord, steam, citizenid, isAdmin, coords, endpoint } или nilИдентификаторы без префикса (license при отсутствии берётся из license2). endpoint — IP игрока. citizenid заполняется только для фреймворка 'qb', 'qbcore' или 'esx'; на 'qbox' он пуст. isAdmin может обращаться к базе данных.Нет
GetNearbyPlayerssrc; radius? (по умолчанию 30.0){ id, name, distance }[]Игроки рядом с src по серверной позиции педа (OneSync), без самого src.Нет
getOnlinePlayersнет{ id, name, ping, license, discord, steam, isAdmin }[]Здесь идентификаторы сохраняют префикс (license:..., discord:..., steam:...). isAdmin может обращаться к базе данных для каждого игрока.Нет
GetDetectionssrc (онлайн); limit? (по умолчанию 25){ banID, reason, banDate, banUntil }[] или {}Историческое имя: возвращает строки BAN игрока, найденные по license, а не обнаружения.Нет
GetCloudThreatScoresrcот 0 до 100Отображаемый показатель: 8 за каждое нарушение в сессии (максимум 40, только пока последнему меньше 10 минут), 10 за каждый пропущенный отклик Shield (максимум 30) и 12 за каждый пункт угрозы native-guard (максимум 30). 0 при ts.cloudBridge.enabled = false.Нет
NoteCloudViolationsrc; reason?; punishment? ('LOG', 'KICK' или 'BAN')nilДобавляет нарушение к показателю игрока; ничего не делает при ts.cloudBridge.enabled = false. Каждая отметка KICK или BAN добавляет 25 к показателю intel (максимум 100, пока последней меньше 10 минут); при 50 и более license сообщается в межсерверную базу угроз панели (нужны URL и токен панели). Последующие входы блокируются, только если ts.cloudBridge.threatIntelAction = 'kick' (по умолчанию 'log'). AC уже вызывает его при каждом наказании.Нет
ForensicLinksOflicense (hex без префикса license:)связанные license (список строк); {}, если неизвестноНаходит альт-аккаунты с общими значениями Steam, Discord или HWID (IP — только при ts.forensics.linkByIp = true), до ts.forensics.maxHops (по умолчанию 3, максимум 5). Блокирующие запросы. Работает и при отключённой форензике, но тогда новые связи не записываются.Нет
checkIpReputationip{ vpn, proxy, hosting, country, org, expiresAt } или nilТолько чтение кеша. Возвращает данные только для IP, проверенных при подключении в пределах ts.v12.ipCheckCacheHours (24). Живого запроса нет.Нет
webBridgeFindByLicenselicense (строка, с license: или без)серверный id онлайн или nilНаходит игрока онлайн. На практике совпадает с любым идентификатором точно, например license2:... или discord:....Нет
webBridgeFindByCitizencid (citizenid QB или identifier ESX)серверный id онлайн или nilРаботает только для фреймворков 'qb', 'qbcore' и 'esx'; на 'qbox' возвращает nil.Нет

Уведомления и язык#

Отправка уведомлений на телефон и использование таблиц переводов AC. phoneNotify и phoneNotifyAdmins существуют, только когда включён ts.AdminMenu.enable.

ЭкспортПараметрыВозвращаетЧто делаетНужен доверенный ресурс?
phoneNotifysrc (онлайн); title; body; opts? { icon, color, app }true; false, если игрок не в сетиОтправляет на первый запущенный телефон: qb-phone, qs-smartphone, lb-phone, yseries, gks_phone, npwd или roadphone, иначе в чат. Телефон определяется один раз, поэтому телефон, запущенный позже, игнорируется до перезапуска.Нет
phoneNotifyAdminstitle; body; opts?nilphoneNotify каждому сотруднику персонала онлайн. Может обращаться к базе данных для каждого игрока.Нет
getPlayerLocalesrcкод локали; по умолчанию ts.Locale ('tr')Только чтение. Только на стороне сервера.Нет
setPlayerLocalesrc; lang (2 или 3 строчные буквы, должен существовать файл локали)true, если задано; иначе falseЗадаёт серверный язык игрока. В отличие от команды ts_setlang, не синхронизирует язык с клиентом. Сбрасывается при отключении.Нет
translatekey; ... (значения для {0}, {1} или одна таблица для {name})переведённая строка; английский вариант как запасной; сам ключ, если перевода нетИспользует ts.Locale. Код из 2 или 3 букв в конце, для которого есть файл локали, выбирает язык. Шаблоны с %s возвращаются неотформатированными; форматируйте их сами.Нет
translateForPlayersrc; key; ...строка на языке игрокаКак translate, но с локалью игрока. Без кода языка в конце.Нет

Скриншоты#

Запрос скриншотов игроков для панели. Экспорты AC для записи логов внутренние и здесь не перечислены.

ЭкспортПараметрыВозвращаетЧто делаетНужен доверенный ресурс?
v6ScreenWatchRequestserverId (онлайн); mode? (по умолчанию 'once'); requestedBy? (по умолчанию 'panel'); panelUrl?; forceBase64?id запроса; или nil, 'invalid_id'; или nil, 'offline'Ставит скриншот в очередь и просит клиент загрузить его в панель с токеном для каждой загрузки. panelUrl должен быть https и совпадать с ts_public_panel_url или ts.webPanelURL, иначе клиенту запрос не отправляется. Ожидающие запросы истекают через 30 с и удаляются через 90 с.Нет
v6ScreenWatchPollrid{ pending = true }, пока ожидается; иначе запись со status ('done', 'failed' или 'expired') и url; или nil, 'not_found'Только чтение.Нет
v6ScreenWatchLatestserverIdпоследняя запись запроса или nilТолько чтение.Нет
RequestShieldScreenshotsrc (онлайн)true; false, если игрок не в сетиЗапрашивает скриншот у клиентского Shield (запрос действителен 60 с). Подписанный ответ отправляется в панель и вызывает серверное событие ts_anticheat:shield:screenshot_saved(src, b64).Нет
screenCapturesrc (онлайн); requestedBy? (по умолчанию 'panel')true; false, если игрок не в сетиУстаревший. Нужен ресурс screenshot-basic и convar ts_screen_upload, заданный через setr (по умолчанию http://localhost/api/screen_upload.php). AC не сохраняет результат. Используйте вместо него v6ScreenWatchRequest или RequestShieldScreenshot.Нет

Статус и диагностика#

Чтение состояния AC для дашбордов и проверок работоспособности.

ЭкспортПараметрыВозвращаетЧто делаетНужен доверенный ресурс?
GetStatusнет{ version, online, detections, debug, framework }version — версия ресурса из fxmanifest. detections считает только отчёты из устаревшего неподписанного клиентского канала и при включённой подписи (по умолчанию) остаётся около 0; это не счётчик обнаружений или банов. Поля uptime нет.Нет
getConfig (server)configType? ('webhooks' или что-либо другое)очищенная копия конфигурации; для 'webhooks' — таблица Webhooks для доверенных вызывающих и {} для остальныхКопия исключает функции, ключи, содержащие secret, password, token или webhook, ключи, оканчивающиеся на key (кроме имён на hotkey и самого имени key), и всё, что вложено глубже 6 уровней. Кешируется на 5 с.Только для 'webhooks'
licenseStatusнет{ checked, ok, reason, serverId, licenseSet }Состояние блокировки лицензии. reason равен 'disabled', если ts.licenseLock.enabled не равен true, и 'not_checked' до первой проверки через 1,5 с после запуска.Нет
GetServerAuthorityStatusнет{ enabled, checks = { [id] = { available, enabled, action } } }Показывает, какие проверки серверной авторитетности поддерживает эта сборка сервера и как они настроены. Id: superJump, damageMod, meleeMod, defenseMod, weapon, godmode, invisible, noclip, focus.Нет
getRuntimeStatsнет{ uptime_sec, connect_buckets, subnet_buckets, license_tracking }Счётчики защиты подключений.Нет
getBatchStatsнет{ log_pending, detection_pending, webhook_pending }Размеры очередей пакетной записи с интервалом 5 с.Нет
getCleanupStatsнет{ runs, last_run_at, last_summary, cleaned }Только чтение.Нет
runCleanupнеттаблица статистики; false при отказеСразу запускает очистку по сроку хранения: устаревшие строки игроков онлайн, старые обнаружения, логи администраторов, аудит панели, репутация IP, очереди команд и скриншотов, попытки входа и истёкшие сессии (лимиты из настроек keep в ts.v12). Удаления асинхронные, поэтому возвращённая статистика ещё не включает этот запуск.Да

Resource Guard#

Чтение и изменение утверждённого базового списка ресурсов. Все эти экспорты регистрируются, даже если Resource Guard отключён.

ЭкспортПараметрыВозвращаетЧто делаетНужен доверенный ресурс?
getBaselineнет{ [resource] = { manifest_hash, deep_hash } }Утверждённый базовый список.Нет
getResourcesнет{ [resource] = true }Известные ресурсы.Нет
getSuspiciousнет{ [resource] = { reason, state, hash, manifest, at } }Ресурсы, помеченные как изменённые или подозрительные.Нет
getStatsнет{ lastScan, violations, driftedResources }Счётчики Guard.Нет
rescanResourcesнетполное состояние Guard (ready, resources, hashes, suspicious, drift_count, violation_count, last_scan и другое)Синхронно пересобирает снимок ресурсов.Нет
approveResourceresourceName; approvedBy? (по умолчанию 'web_panel')true; false, 'resource_missing'; false при отказеДобавляет текущий хеш манифеста в базовый список, снимает флаги подозрительности и блокировки, сохраняет в базу данных и обновляет всех клиентов.Да
blockResourceresourceName; reason? (по умолчанию 'Manuel blok', на турецком)true; false при отказеПомечает ресурс как заблокированный, удаляет его из базового списка, сохраняет в базу данных и останавливает его, если он запущен.Да
tsAutoSetupнетtrue (также если настройка уже идёт); false при отказеТо же, что консольная команда tosunac_setup: определяет фреймворк, запускает сканирование на бэкдоры (тайм-аут 120 с) и сканирование сигнатур, утверждает только запущенные ресурсы с полными, чистыми и неизменёнными результатами по бэкдорам и сигнатурам, затем запускает сканирование событий. Прерывается, ничего не утвердив, если Backdoor Guard отключён или занят.Да

Сканирование сигнатур, бэкдоров и событий#

Запуск сканирований и управление сигнатурами, исключениями для ложных срабатываний и пропусками escrow. Сканирование может занять время; запускайте его из потока.

ЭкспортПараметрыВозвращаетЧто делаетНужен доверенный ресурс?
scanAllResourcesнет{ total, scanned, infected, clean, errors, cached, skipped }; или nil, 'already_scanning'Сканирование сигнатур всех ресурсов. Уступает управление. Сбрасывает список заражённых. Блокирует заражённые ресурсы при включённом ts.ResourceGuard.autoBlockInfected.Нет
scanSingleResourcenameinfected (boolean), reasonreason — одно из: self, escrow_signature_skip, whitelisted, snapshot_unavailable, incomplete, clean, cached_clean, infected, cached_infected, blocked. Может уступать управление.Нет
getInfectedFilesнеткарта заражённых файловРезультат последнего сканирования.Нет
addCheatSignaturepattern (шаблон имени ресурса); signatureName?; severity? (по умолчанию 'critical')true; false, если пусто или отклоненоДобавляет шаблон в память и в базу данных. severity: info (low), warning (medium), low, medium, high или critical; неизвестные значения становятся high.Да
invalidateSignatureCacheнетtrueОчищает кеш шаблонов и сохранённые результаты сканирования, поэтому следующее сканирование заново читает все ресурсы.Нет
reloadSignatureExceptionsнетtrueСбрасывает кеши исключений и пропусков escrow, а также сохранённые результаты сканирования. Они перезагружаются при следующем использовании.Нет
reloadSignatureScanCachesнетtrueСразу перезагружает шаблоны, белый список, исключения и пропуски escrow из базы данных.Нет
addSignatureEscrowSkipresourceName; note?true; false, если пусто, нет MySQL или отклоненоПропускает для этого ресурса всё сканирование сигнатур (для escrow-кода).Да
removeSignatureEscrowSkipidOrName (id строки или имя ресурса)true; false, если недействительно, нет MySQL или отклоненоУдаляет пропуск escrow.Да
addSignatureExceptionresourceName; filePath? ('' = все файлы); signatureName; note?true; false, если не хватает полей, нет MySQL или отклоненоПомечает срабатывание сигнатуры в этом ресурсе как ложное.Да
removeSignatureExceptionid (число)true; false, если не число, нет MySQL или отклоненоУдаляет исключение.Да
tsScanBackdoorscallback?(report), где report = { complete, resources, finished_at, trigger }true, если запущено; false, если сканирование уже идётЗапускает сканирование на бэкдоры в потоке. Находки отправляются в базу данных и в панель. При включённом ts.BackdoorGuard.autoQuarantine критические находки останавливают ресурс.Нет
tsScanEventsнетtrue, если запущено; false, если сканирование уже идётСтроит статическую опись событий и триггеров во всех ресурсах и отправляет её в панель.Нет

События-ловушки (honeypot)#

Превращение имён событий в ловушки или их освобождение. Оба экспорта пишут в ac_protected_events и перезагружают данные из базы данных.

ЭкспортПараметрыВозвращаетЧто делаетНужен доверенный ресурс?
fakeTriggerTrapeventName; type ('client' или 'server')true, если отправлено; false, если вызывающий не доверенный или type недопустимДелает событие ловушкой (active = 1). Для полного эффекта перезапустите AC (ensure tosun-ac).Да
fakeTriggerWhitelisteventNametrue, если отправлено (также для пустого имени, которое ничего не делает); false, если вызывающий не доверенныйОтключает ловушку для этого события (active = 0). Для уже зарегистрированных обработчиков может потребоваться перезапуск AC; консоль об этом сообщает.Да

Экспорты, зависящие от функций#

Эти экспорты регистрируются, только когда их функция включена. Если функция выключена, их вызов вызывает ошибку.

ЭкспортыРегистрируются, только если
quarantine, releaseQuarantine, isQuarantined, quarantineListts.quarantine.enabled не равен false
crashGuardInspect, crashGuardRejectts.crashGuard.enabled не равен false
runCleanup, getCleanupStatsts.v12.enableAutoCleanup не равен false
tsScanBackdoorsts.BackdoorGuard.enabled не равен false
tsScanEventsts.EventScanner.enabled не равен false
applyWeatherWithFramework, applyTimeWithFrameworkменю администратора включено (ts.AdminMenu существует, и ни enable, ни enabled не равны false)
phoneNotify, phoneNotifyAdminsts.AdminMenu.enable включён

Клиентские экспорты#

Вызывайте их из клиентских скриптов. Их может вызвать любой клиентский ресурс; проверки доверия нет. Они влияют только на проверки на этом клиенте и никогда не меняют серверный контроль.

ЭкспортПараметрыВозвращаетЧто делаетНужен доверенный ресурс?
SetExempt (client)state (boolean); durationMs? (по умолчанию 30000, максимум 300000); reason? (ключ, по умолчанию 'unknown')nilДобавляет или снимает локальное освобождение под этой причиной. Новая выдача для той же причины заменяет время окончания. Пока освобождение активно, большинство клиентских проверок пропускается; обнаружения, всё же дошедшие до клиентского пути бана, понижаются до записей LOG с тегом [exempt]. state = false снимает только эту причину.Нет
PauseDetectionsdurationMs? (по умолчанию 10000, максимум 300000)nilПриостанавливает локальные клиентские проверки. Каждый вызов заменяет время окончания, поэтому PauseDetections(0) завершает паузу, а меньшее значение её сокращает.Нет
IsPlayerAdminнетbooleanЛокальный флаг персонала, обновляемый каждые 2 с из проверенного сервером статуса администратора, а не из state bag, в который может писать клиент.Нет
IsExemptнетbooleantrue, если игрок — персонал, активно серверное освобождение или пауза, активен PauseDetections или активна любая причина SetExempt.Нет
GetExemptionsнет{ [reason] = remainingMs }Перечисляет только причины SetExempt и state bag tsAcExempt. Не показывает PauseDetections, серверные освобождения и статус персонала; для полного ответа используйте IsExempt.Нет
SetSpawnedstate (boolean)niltrue отмечает игрока как заспавненного. false приостанавливает проверки движения и визуальные проверки, например при выборе персонажа; учитывается не чаще одного раза в 5 минут, а проверки возобновляются примерно через 30 с обычного видимого движения.Нет
getConfig (client)неттаблица клиентской конфигурацииКлиентам синхронизируются только безопасные для клиента настройки.Нет
-- выбор персонажа
exports['tosun-ac']:SetSpawned(false)
-- ... игрок выбирает персонажа ...
exports['tosun-ac']:SetSpawned(true)

Экспорты JavaScript#

Tosun AC регистрирует на сервере несколько экспортов JavaScript для сканирования ресурсов и проверки лицензии. Они внутренние, не защищены проверкой доверенных ресурсов и не являются поддерживаемым API. Не вызывайте их. Публичных экспортов JavaScript нет.

Файлы моста: настройка#

Необязательные файлы моста в tosun-ac/bridge дают вашему ресурсу глобальную таблицу TosunAC с короткими вспомогательными функциями. Они вызывают экспорты внутри pcall, поэтому ваш скрипт продолжает работать, когда AC остановлен. AC видит вызывающим ваш ресурс.

  1. Добавьте мост в fxmanifest.lua вашего ресурса: server_script '@tosun-ac/bridge/tosun_ac_server.lua' и при необходимости client_script '@tosun-ac/bridge/tosun_ac_client.lua'.
  2. Если папка AC называется иначе, добавьте в server.cfg setr tosun_ac_resource "folder-name". Используйте setr: клиентский мост читает этот convar на клиенте.
  3. Необязательно: задайте set tosun_ac_bridge_server_ms (по умолчанию 60000), set tosun_ac_bridge_cooldown_ms (по умолчанию 750, 0 отключает) и setr tosun_ac_bridge_client_ms (по умолчанию 60000).
  4. Для полных серверных освобождений добавьте свой ресурс в tosun_ac_trusted_resources. Без доверия TosunAC.PlayerExempt переходит к мягкому освобождению и один раз выводит подсказку в серверную консоль (текст подсказки на турецком).
-- fxmanifest.lua вашего ресурса
server_script '@tosun-ac/bridge/tosun_ac_server.lua'
client_script '@tosun-ac/bridge/tosun_ac_client.lua'

# server.cfg
setr tosun_ac_resource "tosun-ac"
set tosun_ac_trusted_resources "my-resource"

-- серверный скрипт
local ok, mode = TosunAC.PlayerExempt(src, 'long', 'clothing')
-- mode равен 'full' (доверенный) или 'soft' (только движение, максимум 15 с)

Мост: серверные функции#

Определены в bridge/tosun_ac_server.lua внутри вашего ресурса. Пресеты: SHORT 30000, MEDIUM 60000, LONG 120000, XL 180000 мс (TosunAC.Presets). TosunAC.Version равен '1.2'.

ЭкспортПараметрыВозвращаетЧто делаетНужен доверенный ресурс?
TosunAC.MarkTeleportplayerId (1 или больше); durationMs? (по умолчанию 8000)true, только если экспорт вернул trueВызывает MarkTeleport с причиной 'bridge:teleport'.Нет (если ваш ресурс не доверенный, действует бюджет MarkTeleport на игрока)
TosunAC.PlayerExemptplayerId; durationMs (от 500 до 300000), имя пресета или nil (= tosun_ac_bridge_server_ms); tag? (по умолчанию имя вашего ресурса)true, 'full'; true, 'soft'; или falseПробует SetPlayerExempt. При отказе переходит к MarkTeleport длительностью до 15 с. Задержка на игрока (по умолчанию 750 мс, общая с PlayerExemptPreset) возвращает одно значение false. В режиме аудита результат — 'full' даже для ресурсов не из списка.Только для 'full'
TosunAC.PlayerExemptPresetplayerId; presetName? (по умолчанию 'MEDIUM', без учёта регистра); tag?как у PlayerExemptPlayerExempt с длительностью из пресета. Неизвестные имена используют MEDIUM. Игнорирует tosun_ac_bridge_server_ms.Только для 'full'
TosunAC.PlayerExemptOffplayerId; tag? (AC не использует)true, если принятоВызывает SetPlayerExempt(playerId, false). Недоверенные ресурсы получают false, а мягкое окно не завершается.Да
TosunAC.IsTrustedнетbooleanGetIntegrationStatus().trusted. Возвращает false для ресурсов не из списка даже в режиме аудита, где защищённые вызовы всё равно проходят.Нет
TosunAC.IsAvailableнетbooleantrue, если ресурс AC запущен.Нет

Мост: клиентские функции#

Определены в bridge/tosun_ac_client.lua внутри вашего ресурса. Они оборачивают клиентский экспорт SetExempt, поэтому дают облегчение только на стороне клиента.

ЭкспортПараметрыВозвращаетЧто делаетНужен доверенный ресурс?
TosunAC.ExemptdurationMs (от 500 до 300000), имя пресета или nil (= tosun_ac_bridge_client_ms); tag? (по умолчанию имя вашего ресурса)nilВызывает клиентский SetExempt с ключом 'bridge:' плюс tag.Нет
TosunAC.ExemptOfftag? (должен совпадать с tag, использованным в Exempt)nilСнимает это освобождение.Нет
TosunAC.ExemptPresetname? (по умолчанию 'MEDIUM')nilExempt с длительностью из пресета и tag по умолчанию. Параметра tag нет.Нет
TosunAC.RunWithExemptdurationMs; tag; fntrue плюс результаты fn; false, err; или false, если fn не функцияВыдаёт освобождение, выполняет fn внутри pcall, затем вызывает ExemptOff(tag).Нет
TosunAC.RunWithExemptPresetpresetName; fnкак у RunWithExemptRunWithExempt с длительностью из пресета и tag по умолчанию.Нет
TosunAC.IsAvailableнетbooleantrue, если ресурс AC запущен.Нет
tosun-ac:bridge:clientExempt (net event)durationMs?; tag?ничегоРегистрируется внутри каждого ресурса, подключающего клиентский мост. Серверный скрипт может отправить его через TriggerClientEvent, чтобы выполнить TosunAC.Exempt на этом клиенте. Если мост подключён в нескольких ресурсах, каждый применяет своё освобождение. tosun-ac его не отправляет.Нет (серверные скрипты или локальные клиентские скрипты через TriggerEvent)

Экспорты, которые может вызвать любой ресурс#

У этих экспортов нет проверки доверия, и у них есть побочные эффекты. Их может вызвать любой серверный ресурс. Запускайте только ресурсы, которым доверяете; учтите, что любой серверный ресурс и так может кикать игроков или вызывать клиентские события через нативные функции FiveM.

  • MarkTeleport: освобождение от проверок движения, ограниченное бюджетом на игрока.
  • spectatePlayer: телепортирует игрока и при каждом вызове даёт освобождение от проверок движения на 15 с без учёта бюджета.
  • NoteCloudViolation: повышает показатель угрозы игрока и может сообщить license в межсерверную базу угроз.
  • warnPlayer и mutePlayer: записывают предупреждения и муты.
  • freezePlayer и slayPlayer: действуют на игрока напрямую.
  • crashGuardReject: добавляет страйки, которые могут привести к кику или бану.
  • screenCapture, v6ScreenWatchRequest и RequestShieldScreenshot: запрашивают скриншоты.
  • rescanResources, scanAllResources, scanSingleResource, tsScanBackdoors и tsScanEvents: запускают сканирование. scanAllResources может блокировать ресурсы, а tsScanBackdoors — останавливать их при включённых автоблокировке или автокарантине.
  • applyWeatherWithFramework и applyTimeWithFramework: меняют погоду и время для всех.
  • invalidateSignatureCache, reloadSignatureExceptions, reloadSignatureScanCaches и refreshPanelWhitelist: перезагружают кеши.
  • setPlayerLocale и unmutePlayer: меняют состояние игрока.
  • phoneNotify и phoneNotifyAdmins: отправляют игрокам сообщения на телефон или в чат.

Устаревшие и вводящие в заблуждение имена#

Эти экспорты по-прежнему работают, но их имена или старая документация предполагают то, чего они не делают.

  • Старые руководства (INTEGRATION.md для 9.6.6, CONFIG-EXPORTS-MULTILANG.md для 8.6.1 и заглушка-перенаправление TOSUN-AC-EXPORTS.md) устарели. Где они расходятся, этот справочник соответствует коду 9.6.15.
  • SetPlayerExempt, PausePlayerDetections, PauseAllDetections, BypassDetection, AddWhitelist, RemoveWhitelist, WhitelistArea, ClearArea, addAdmin, fakeTriggerTrap и fakeTriggerWhitelist требуют доверенного ресурса, хотя CONFIG-EXPORTS-MULTILANG.md перечисляет их без этого требования.
  • Список доверенных по умолчанию: qbx_core, qb-core, es_extended, ox_inventory и ox_lib. В INSTALLER-READY.md нет qb-core и es_extended.
  • GetIntegrationStatus() также возвращает поле version.
  • punish, ban, BanPlayerExt, KickPlayer, offlineBan и offlineBanByLicense требуют доверенного ресурса.
  • ban() и BanPlayerExt() следуют ts.punishType и ts.BanDurations['default'], поэтому не всегда банят навсегда.
  • KickPlayer не проверяет освобождения. В конвейере punish KICK всегда щадит персонал, а BAN и LOG следуют ts.AdminBypassDetections.
  • Во время клиентского освобождения большинство клиентских проверок полностью пропускается. Только обнаружения, всё же дошедшие до пути бана, становятся записями LOG с тегом [exempt].
  • NoteCloudViolation блокирует последующие входы только при ts.cloudBridge.threatIntelAction = 'kick'.
  • При использовании клиентского моста convar tosun_ac_resource и tosun_ac_bridge_client_ms нужно задавать через setr, а не через set.
  • Лимит MarkTeleport на один вызов (ts.Integration.markTeleportMaxMs) применяется и к доверенным вызывающим. Только бюджет 180 с за 10 минут относится к недоверенным вызывающим.
ЭкспортЧто нужно знатьЧто использовать вместо
BypassDetectionКлюч обнаружения игнорируется. Даёт полное освобождение на 0,5–60 с.SetPlayerExempt с короткой длительностью или MarkTeleport для телепортов
GetDetectionsВозвращает строки банов игрока, а не обнаружения.getBans или getBanInfo
getAdminType'tx' не означает txAdmin; персонал почти всегда получает 'tx'.isAdmin или isStaffPlayer
SetExempt (server)Псевдоним SetPlayerExempt(src, true, ...). Аргументы отличаются от клиентского SetExempt.SetPlayerExempt
WhitelistAreaТолько облегчение на клиенте; иммунитета от серверных наказаний нет.SetPlayerExempt для серверного иммунитета
screenCaptureAC не сохраняет результат.v6ScreenWatchRequest или RequestShieldScreenshot
GetStatus().detectionsНе счётчик обнаружений или банов.Не используйте как счётчик
isAdmin, addAdminЗарегистрированы в исходном коде дважды. Работают версии из anticheat_server.lua.Вызывайте как обычно