Документация 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 о легитимных действиях ваших скриптов и показывающие, освобождён ли игрок.
| Экспорт | Параметры | Возвращает | Что делает | Нужен доверенный ресурс? |
|---|---|---|---|---|
MarkTeleport | src; ms? (по умолчанию 8000, ограничено от 1000 до ts.Integration.markTeleportMaxMs, по умолчанию 15000); reason? (тег лога) | true, если выдано или уже покрыто; false, если игрок недействителен или не в сети либо бюджета не хватает | Мягкое освобождение. Вызывайте непосредственно перед перемещением игрока. Смягчает серверные проверки движения, проверки godmode/невидимости/noclip/focus и клиентские проверки самого игрока. Наказания за оружие, деньги, урон, злоупотребление событиями, инъекции и краши по-прежнему применяются. Сбрасывается при отключении. | Нет. Недоверенные ресурсы делят бюджет 180000 мс на игрока за 10 минут (ts.Integration.markTeleportBudgetMs). Запрос, который не помещается, отклоняется целиком. |
IsMovementExempt | src | boolean | true, пока активно мягкое окно MarkTeleport или DetectionExempt.serverEvents. | Нет |
GetIntegrationStatus | нет (вызывающий определяется автоматически) | { version, resource, trusted, trustedVia ('config', 'convar', 'self' или nil), enforcing, hint } | Сообщает вашему ресурсу, доверенный ли он и почему. hint — строка для server.cfg, если ресурс не доверенный. enforcing = false означает режим аудита. | Нет |
SetPlayerExempt | src; 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). Одноимённый клиентский экспорт принимает другие аргументы. | Да |
BypassDetection | src; detectionKey (обязателен, но его значение игнорируется); durationMs? (по умолчанию 5000, от 500 до 60000) | true; false, если вызывающий не доверенный, src отсутствует или равен 0 либо key равен nil | Устаревшее имя. Даёт то же полное освобождение, что и SetPlayerExempt; не ограничивается одним обнаружением. Пустая таблица в качестве key возвращает true, но ничего не выдаёт. | Да |
PausePlayerDetections | src; durationMs? (по умолчанию 15000, максимум 300000) | true; false, если вызывающий не доверенный или src не число | Иммунитет от серверных наказаний плюс клиентский флаг паузы для одного игрока. | Да |
PauseAllDetections | durationMs? (по умолчанию 10000, максимум 300000) | true; false, если вызывающий не доверенный | Приостанавливает клиентские обнаружения для всех игроков, находящихся онлайн сейчас. Серверного освобождения нет. Игроки, зашедшие позже, не приостанавливаются. Ограничения частоты нет. | Да |
AllowWeapon | src; weapon? (имя, например 'WEAPON_PISTOL', хеш, '*' или nil для всего оружия); ms? (по умолчанию 600000, от 1000 до 3600000) | true; false, если вызывающий не доверенный, игрок недействителен или не в сети либо число равно NaN/inf | Позволяет игроку держать и использовать оружие, которого нет в его инвентаре. Смягчает только проверку соответствия оружия инвентарю (оружие в руках и урон). Сбрасывается при отключении. | Да |
IsExemptFromPunish | src | boolean (true = не наказывать) | Центральное правило, используемое модулями применения наказаний. true для персонала (если ts.AdminBypassDetections не равен false), активных освобождений, белого списка времени выполнения и белого списка панели, а также защищённых игроков. Из-за последнего правила персонал остаётся освобождённым здесь даже при AdminBypassDetections = false. Всегда false при ts.Debug. Может обращаться к базе данных. | Нет |
IsPlayerProtected | src | boolean | true для персонала, статуса администратора или активного освобождения. Игнорирует 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 загружаются последними и именно они работают; этот справочник описывает их.
| Экспорт | Параметры | Возвращает | Что делает | Нужен доверенный ресурс? |
|---|---|---|---|---|
isAdmin | src (передавайте число) | boolean | Статус администратора из перечисленных выше источников. Результаты базы данных кешируются на 5 с при положительном ответе и на 30 с при отрицательном. Не учитывает ts.AdminBypassDetections. | Нет |
isStaffPlayer | src | boolean | Проверка персонала, используемая на путях бана. Те же источники, что у isAdmin, плюс ACE команд txAdmin (command.kick/ban/resources/restart/screenshot/unban), если не задано ts.txAdminAuth = false. | Нет |
isAdminMenuAllowed | src | boolean | Может ли игрок открыть меню администратора. false, если меню отключено. ACE только для txAdmin (txadmin, tx.admin), ts.AdminBypassAces и ts.AdminBypassIdentifiers не учитываются. Без кеша: один запрос к базе данных на вызов. | Нет |
getAdminType | src | 'tx', 'config' или false | Вводящая в заблуждение метка: каждый положительный путь администратора устанавливает один и тот же флаг, поэтому персонал почти всегда получает 'tx', и 'tx' не означает txAdmin. Используйте вместо этого isAdmin. | Нет |
addAdmin | src (передавайте число) | nil; false при отказе | Выдача прав персонала во время работы: иммунитет от наказаний и доступ к меню администратора. Не сохраняется в базе данных. Не сбрасывается при отключении: остаётся привязанной к этому серверному id до removeAdmin или перезапуска. | Да |
removeAdmin | src | nil; false при отказе | Снимает ручную выдачу и кешированный статус. Права через ACE, txAdmin, admins.lua и панель не отзываются и снова учитываются при следующей проверке. | Да |
Белый список игроков и зоны#
Белый список по серверному id, белый список по идентификаторам и именованные зоны. Списки времени выполнения хранятся только в памяти и теряются при перезапуске; белый список панели — отдельный.
| Экспорт | Параметры | Возвращает | Что делает | Нужен доверенный ресурс? |
|---|---|---|---|---|
whitelistPlayer | src (передавайте число); durationSec? (по умолчанию 3600; -1 = до отключения) | nil; false при отказе | Иммунитет от серверных наказаний по серверному id. Без клиентского флага. Сбрасывается при отключении. SetPlayerExempt, PausePlayerDetections и BypassDetection перезаписывают его. | Да |
removeWhitelist | src | nil; false при отказе | Завершает whitelistPlayer. Также завершает любой серверный иммунитет от SetPlayerExempt, PausePlayerDetections или BypassDetection. | Да |
AddWhitelist | target (серверный id или строка идентификатора); durationSec? (nil или 0 = до перезапуска) | true; false, если пусто или отклонено | Добавляет идентификаторы в белый список в памяти (не сохраняется в базе данных). Серверный id добавляет все идентификаторы этого игрока. Идентификаторы приводятся к нижнему регистру, префикс license:, license2:, discord:, steam: или fivem: удаляется. Значение только из цифр считается серверным id, поэтому передавайте Discord id с префиксом discord:. | Да |
RemoveWhitelist | target (серверный id или идентификатор) | true; false, если пусто или отклонено | Удаляет записи белого списка времени выполнения. Таблица белого списка панели не затрагивается. | Да |
IsWhitelisted | src | boolean | true, если какой-либо идентификатор есть в белом списке времени выполнения или в кешированном белом списке панели. Не учитывает whitelistPlayer и SetPlayerExempt. Всегда false при ts.Debug. | Нет |
refreshPanelWhitelist | нет | nil | Сразу перезагружает белый список панели (синхронный запрос). Он также перезагружается через 12 с после запуска и каждые 60 с. | Нет |
WhitelistArea | src; areaName (непустое); durationSec? (по умолчанию 30) | true; false, если недействительно или отклонено | Записывает именованную зону и устанавливает клиентский флаг освобождения. Только облегчение на клиенте: ни один серверный модуль не читает зону, поэтому иммунитета от серверных наказаний нет. | Да |
ClearArea | src; areaName? ('' или nil = все зоны) | true; false, если src равен 0 или отклонено | Удаляет зону. С именем также сбрасывает клиентский флаг освобождения, что завершает и другие клиентские освобождения. С пустым именем флаг остаётся как есть. | Да |
IsInArea | src; areaName? (пусто = любая зона) | boolean | С именем проверяет срок действия. С пустым именем возвращает true для любой записи, включая истёкшие. | Нет |
Наказания и баны#
Наказание игроков через конвейер AC, баны игроков не в сети и чтение банов. Все экспорты записи здесь требуют доверия.
| Экспорт | Параметры | Возвращает | Что делает | Нужен доверенный ресурс? |
|---|---|---|---|---|
punish | src (онлайн); reason; image? (URL или данные скриншота); configKey?; punishment? ('BAN', 'KICK' или 'LOG') | nil; false при отказе | Запускает полный конвейер наказаний AC. Освобождённые игроки пропускаются. См. «Как punish() выбирает наказание». | Да |
ban | src (онлайн); reason | nil; false при отказе | Тот же конвейер с ключом конфигурации 'Banned via Export' и наказанием ts.punishType. Не всегда навсегда: длительность — ts.BanDurations['default'] (0 = навсегда), а если владелец задал ts.punishType как KICK или LOG, вместо бана выполняется кик или запись в лог. Освобождённые игроки молча пропускаются. | Да |
BanPlayerExt | src (онлайн); reason? (по умолчанию 'Banned by script') | true, если отправлено; false, если вызывающий не доверенный или игрок не в сети | То же, что ban(). | Да |
KickPlayer | src (онлайн); reason? (по умолчанию 'Kicked by script') | true; false, если вызывающий не доверенный или игрок не в сети | Простой кик с сообщением '[Tosun AC] ' и причиной. Без проверки освобождений: персонал и игроки из белого списка тоже кикаются. Ничего не записывается в лог. | Да |
offlineBan | data { playername, license, steam, discord, ip, HWID, HWID2–HWID5 } (идентификаторы без префиксов); reason | nil; false при отказе | Строка постоянного бана для игрока не в сети. Отсутствующие идентификаторы сохраняются как заглушки, которые никогда не совпадают при подключении. Всегда задавайте data.playername и reason: без них вставка при STRICT sql_mode завершается ошибкой, и вызывающий об этом не узнаёт. Выводит строку в консоль. data = nil вызывает ошибку Lua. | Да |
offlineBanByLicense | license (hex без префикса или 'license:...'); reason? (по умолчанию 'Sebep yok', на турецком); actor? (по умолчанию 'panel'); name?; citizenid? | true, banID ('O' + 8 hex); false, 'license required'; false при отказе | Постоянный бан по license плюс строка истории в ac_offline_bans. Возвращает результат до завершения записи в базу данных, поэтому ошибки базы данных не сообщаются. Не кикает игрока, находящегося онлайн. license не строкового типа вызывает ошибку Lua. | Да |
unban | banID | всегда nil | Асинхронно: если бан существует, удаляет его, отправляет лог в Discord на вебхук меню администратора и вызывает серверное событие ts_anticheat:playerUnbanned. Строки истории ac_offline_bans сохраняются. | Да |
getBans | limit? (по умолчанию 100, без ограничения сверху); offset? (по умолчанию 0) | строки банов, сначала новые | Полные строки, включая столбцы IP, license, Steam, Discord и HWID. Синхронный запрос. | Нет |
getBanInfo | banID | полная строка бана или nil | Синхронный запрос. | Нет |
Как punish() выбирает наказание#
punish(), ban() и BanPlayerExt() используют один конвейер. Вот порядок его работы.
- Персонал пропускается, если ts.AdminBypassDetections не равен false. Игроки с активным освобождением или в белом списке времени выполнения или панели пропускаются. ts.Debug отключает эти пропуски. Пропущенные вызовы ничего не делают и ничего не пишут в лог.
- Игрок должен быть онлайн. Иначе в серверную консоль выводится ошибка, и ничего не происходит.
- Наказание: побеждает допустимый аргумент punishment. Иначе ts.DetectionPunishments[configKey], затем его псевдоним, затем ключ обнаружения, затем ts.punishType, затем BAN.
- Каждый исход вызывает серверное событие ts_anticheat:playerBanned, публикует сообщение в чат при включённом ts.chatMessages, добавляет облачное нарушение и пишет лог AC и живой лог.
- LOG: отправляет лог со скриншотом в Discord.
- KICK: повторно проверяет персонал независимо от ts.AdminBypassDetections, поэтому персонал никогда не кикается. Затем отправляет лог со скриншотом и отключает игрока.
- BAN: вставляет бан с длительностью из ts.BanDurations в часах (configKey, псевдоним, ключ обнаружения, префикс, затем default; 0 = навсегда) и bannedBy 'anticheat:' плюс ключ. Вызывает ts_anticheat:banCommitted, уведомляет панель и отключает игрока (повтор через 3 с).
exports['tosun-ac']:punish(src, 'Money exploit', nil, 'my_shop_exploit', 'BAN')Модерация отдельного игрока#
Действия над одним игроком. Внимательно смотрите на столбец доверия: у некоторых из этих экспортов нет проверки доверия.
| Экспорт | Параметры | Возвращает | Что делает | Нужен доверенный ресурс? |
|---|---|---|---|---|
freezePlayer | src (онлайн); freeze (boolean) | true; false, если игрок не в сети | Замораживает или размораживает игрока и публикует локализованное уведомление в чате. Флаг заморозки не сбрасывается при отключении. | Нет |
isPlayerFrozen | src | boolean | Отражает только freezePlayer, а не massFreeze. | Нет |
slayPlayer | src (онлайн) | true; false, если игрок не в сети | Убивает игрока на его клиенте и показывает уведомление. | Нет |
warnPlayer | src (онлайн); reason?; actor? (по умолчанию 'console') | true; false, если игрок не в сети | Предупреждение игроку в чате и строка в ac_player_warnings. | Нет |
mutePlayer | src (онлайн); durationSec? (число; nil или 0 = навсегда); reason?; actor? (по умолчанию 'system') | true; false, если игрок не в сети | Блокирует устаревшие события chatMessage игрока и сохраняет строку в ac_player_mutes. Временные муты заканчиваются в течение 15 с после истечения. Постоянный мут не сбрасывается при отключении и переходит к следующему игроку с тем же серверным id до unmutePlayer или перезапуска. Уведомления в чате для игрока жёстко заданы на турецком. | Нет |
unmutePlayer | src | true; false, если src равен nil | Снимает мут и уведомляет игрока, если он онлайн (уведомление в чате жёстко задано на турецком). | Нет |
isPlayerMuted | src | boolean | Только чтение. | Нет |
setPlayerHealth | src (онлайн); hp? (по умолчанию 100, от 0 до 200) | true; false, если игрок не в сети или отклонено | Устанавливает здоровье на клиенте и задаёт максимальное здоровье 200. | Да |
setPlayerArmor | src (онлайн); armor? (по умолчанию 0, от 0 до 100) | true; false, если игрок не в сети или отклонено | Устанавливает броню на клиенте. | Да |
giveWeapon | src (онлайн); weapon? (по умолчанию 'WEAPON_PISTOL'); ammo? (по умолчанию 60) | true; false, если игрок не в сети или отклонено | Использует ox_inventory, если он запущен; иначе инвентарь QB (только фреймворк 'qb' или 'qbox', не 'qbcore'); иначе addWeapon из ESX; иначе нативную выдачу. Возвращает true, даже если инвентарь отказал в предмете. Не вызывает AllowWeapon, поэтому выданное нативно оружие может быть помечено проверкой соответствия оружия инвентарю (действие по умолчанию — log). | Да |
stripWeapons | src (онлайн) | true; false, если игрок не в сети или отклонено | Забирает всё оружие у педа. Предметы инвентаря не затрагиваются. | Да |
clearInventory | src (онлайн) | true; false, если игрок не в сети или отклонено | Очищает инвентарь через ox_inventory. Без ox_inventory только показывает уведомление и ничего не очищает, но всё равно возвращает true. | Да |
spectatePlayer | adminSrc; targetSrc | true; false, если аргумент равен nil или у цели нет педа | Не настоящее наблюдение: телепортирует adminSrc к цели. Каждый вызов также даёт adminSrc освобождение от проверок движения на 15 с без учёта бюджета. | Нет |
Действия на весь сервер#
Действия, затрагивающие всех игроков или все новые подключения.
| Экспорт | Параметры | Возвращает | Что делает | Нужен доверенный ресурс? |
|---|---|---|---|---|
lockdownStatus | нет | active (boolean), reason (строка) | Только чтение. | Нет |
setLockdown | state (boolean); reason (при включении передавайте строку) | nil; false при отказе | Пока режим активен, каждое новое подключение отклоняется с сообщением LOCKDOWN и причиной. Обхода для персонала нет. Только на время работы. Рассылает строку в чат. Вызов с state = true без reason включает lockdown, а затем вызывает ошибку Lua. | Да |
emergencyLockdown | reason? (причина lockdown по умолчанию 'Acil durum', на турецком) | число кикнутых игроков; false при отказе | Включает lockdown и кикает всех игроков, не входящих в персонал, с локализованным сообщением. | Да |
massFreeze | state (boolean) | число игроков; false при отказе | Замораживает или размораживает всех игроков, включая персонал, и рассылает строку в чат. Строка в чате жёстко задана на турецком. | Да |
healAll | нет | число игроков, которым отправлено лечение; false при отказе | Устанавливает максимальное здоровье и броню 100 для каждого игрока с педом. | Да |
setSpeedLimit | kmh (0 отключает) | применённый лимит; false при отказе | Ограничивает скорость транспорта для игроков, находящихся онлайн сейчас. Игроки, зашедшие позже, лимит не получают. | Да |
applyWeatherWithFramework | weather (не проверяется) | true, список опробованных методов | Пробует qb-weather, Renewed-Weathersync, cd_easytime, затем wd_weather, weathersync, vSync и qb-weathersync, иначе рассылает всем клиентам. Существует, только если меню администратора включено. | Нет |
applyTimeWithFramework | hour; minute (без ограничения диапазона) | true, список опробованных методов | Та же цепочка запасных вариантов для времени. Существует, только если меню администратора включено. | Нет |
Карантин и защита от вредных данных#
Изоляция подозрительного игрока и защита ваших сетевых событий от краш-данных и спама.
| Экспорт | Параметры | Возвращает | Что делает | Нужен доверенный ресурс? |
|---|---|---|---|---|
quarantine | src (онлайн); reason? (по умолчанию 'supheli davranis', на турецком); seconds? (по умолчанию 300, от 30 до 1800) | true (также если игрок уже в карантине); false для освобождённых или недействительных игроков, при ошибке bucket или для недоверенного вызывающего | Переносит игрока в изолированный routing bucket (по умолчанию от 9001 до 9500, строгая блокировка сущностей, без популяции). Записывает обнаружение QUARANTINE и отправляет игроку уведомление в чат, если не задано notifyPlayer = false. Уведомление жёстко задано на турецком. Освобождение происходит автоматически по истечении времени. | Да |
releaseQuarantine | src | true, если освобождён; false, если не в карантине или отклонено | Возвращает исходный routing bucket, записывает в лог и уведомляет игрока (уведомление в чате жёстко задано на турецком, если не задано notifyPlayer = false). | Да |
isQuarantined | src | boolean | Только чтение. | Нет |
quarantineList | нет | { id, name, reason, remaining }[] (remaining в секундах) | Только чтение. | Нет |
crashGuardInspect | value (любые данные) | nil, если безопасно; иначе описание проблемы на турецком | Проверяет числа NaN/Inf, недопустимые векторы, строки длиннее 32768 символов, вложенность глубже 8, более 2000 элементов, около 64 КБ в сумме, ключи длиннее 512 символов, неподдерживаемые типы и рекурсию. Без побочных эффектов. | Нет |
crashGuardReject | src (онлайн); payload | true, если данные плохие (отбросьте их); false, если чисто или src недействителен | Та же проверка плюс страйк игроку. 3 страйка за 60 с применяют ts.crashGuard.action: 'kick' (по умолчанию), 'ban' или любое другое значение = только консоль и лог. Освобождённые игроки пропускаются. | Нет |
RateLimit | src; 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-адреса.
| Экспорт | Параметры | Возвращает | Что делает | Нужен доверенный ресурс? |
|---|---|---|---|---|
GetPlayerInfo | src (онлайн) | { id, name, ping, license, discord, steam, citizenid, isAdmin, coords, endpoint } или nil | Идентификаторы без префикса (license при отсутствии берётся из license2). endpoint — IP игрока. citizenid заполняется только для фреймворка 'qb', 'qbcore' или 'esx'; на 'qbox' он пуст. isAdmin может обращаться к базе данных. | Нет |
GetNearbyPlayers | src; radius? (по умолчанию 30.0) | { id, name, distance }[] | Игроки рядом с src по серверной позиции педа (OneSync), без самого src. | Нет |
getOnlinePlayers | нет | { id, name, ping, license, discord, steam, isAdmin }[] | Здесь идентификаторы сохраняют префикс (license:..., discord:..., steam:...). isAdmin может обращаться к базе данных для каждого игрока. | Нет |
GetDetections | src (онлайн); limit? (по умолчанию 25) | { banID, reason, banDate, banUntil }[] или {} | Историческое имя: возвращает строки BAN игрока, найденные по license, а не обнаружения. | Нет |
GetCloudThreatScore | src | от 0 до 100 | Отображаемый показатель: 8 за каждое нарушение в сессии (максимум 40, только пока последнему меньше 10 минут), 10 за каждый пропущенный отклик Shield (максимум 30) и 12 за каждый пункт угрозы native-guard (максимум 30). 0 при ts.cloudBridge.enabled = false. | Нет |
NoteCloudViolation | src; 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 уже вызывает его при каждом наказании. | Нет |
ForensicLinksOf | license (hex без префикса license:) | связанные license (список строк); {}, если неизвестно | Находит альт-аккаунты с общими значениями Steam, Discord или HWID (IP — только при ts.forensics.linkByIp = true), до ts.forensics.maxHops (по умолчанию 3, максимум 5). Блокирующие запросы. Работает и при отключённой форензике, но тогда новые связи не записываются. | Нет |
checkIpReputation | ip | { vpn, proxy, hosting, country, org, expiresAt } или nil | Только чтение кеша. Возвращает данные только для IP, проверенных при подключении в пределах ts.v12.ipCheckCacheHours (24). Живого запроса нет. | Нет |
webBridgeFindByLicense | license (строка, с license: или без) | серверный id онлайн или nil | Находит игрока онлайн. На практике совпадает с любым идентификатором точно, например license2:... или discord:.... | Нет |
webBridgeFindByCitizen | cid (citizenid QB или identifier ESX) | серверный id онлайн или nil | Работает только для фреймворков 'qb', 'qbcore' и 'esx'; на 'qbox' возвращает nil. | Нет |
Уведомления и язык#
Отправка уведомлений на телефон и использование таблиц переводов AC. phoneNotify и phoneNotifyAdmins существуют, только когда включён ts.AdminMenu.enable.
| Экспорт | Параметры | Возвращает | Что делает | Нужен доверенный ресурс? |
|---|---|---|---|---|
phoneNotify | src (онлайн); title; body; opts? { icon, color, app } | true; false, если игрок не в сети | Отправляет на первый запущенный телефон: qb-phone, qs-smartphone, lb-phone, yseries, gks_phone, npwd или roadphone, иначе в чат. Телефон определяется один раз, поэтому телефон, запущенный позже, игнорируется до перезапуска. | Нет |
phoneNotifyAdmins | title; body; opts? | nil | phoneNotify каждому сотруднику персонала онлайн. Может обращаться к базе данных для каждого игрока. | Нет |
getPlayerLocale | src | код локали; по умолчанию ts.Locale ('tr') | Только чтение. Только на стороне сервера. | Нет |
setPlayerLocale | src; lang (2 или 3 строчные буквы, должен существовать файл локали) | true, если задано; иначе false | Задаёт серверный язык игрока. В отличие от команды ts_setlang, не синхронизирует язык с клиентом. Сбрасывается при отключении. | Нет |
translate | key; ... (значения для {0}, {1} или одна таблица для {name}) | переведённая строка; английский вариант как запасной; сам ключ, если перевода нет | Использует ts.Locale. Код из 2 или 3 букв в конце, для которого есть файл локали, выбирает язык. Шаблоны с %s возвращаются неотформатированными; форматируйте их сами. | Нет |
translateForPlayer | src; key; ... | строка на языке игрока | Как translate, но с локалью игрока. Без кода языка в конце. | Нет |
Скриншоты#
Запрос скриншотов игроков для панели. Экспорты AC для записи логов внутренние и здесь не перечислены.
| Экспорт | Параметры | Возвращает | Что делает | Нужен доверенный ресурс? |
|---|---|---|---|---|
v6ScreenWatchRequest | serverId (онлайн); mode? (по умолчанию 'once'); requestedBy? (по умолчанию 'panel'); panelUrl?; forceBase64? | id запроса; или nil, 'invalid_id'; или nil, 'offline' | Ставит скриншот в очередь и просит клиент загрузить его в панель с токеном для каждой загрузки. panelUrl должен быть https и совпадать с ts_public_panel_url или ts.webPanelURL, иначе клиенту запрос не отправляется. Ожидающие запросы истекают через 30 с и удаляются через 90 с. | Нет |
v6ScreenWatchPoll | rid | { pending = true }, пока ожидается; иначе запись со status ('done', 'failed' или 'expired') и url; или nil, 'not_found' | Только чтение. | Нет |
v6ScreenWatchLatest | serverId | последняя запись запроса или nil | Только чтение. | Нет |
RequestShieldScreenshot | src (онлайн) | true; false, если игрок не в сети | Запрашивает скриншот у клиентского Shield (запрос действителен 60 с). Подписанный ответ отправляется в панель и вызывает серверное событие ts_anticheat:shield:screenshot_saved(src, b64). | Нет |
screenCapture | src (онлайн); 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 и другое) | Синхронно пересобирает снимок ресурсов. | Нет |
approveResource | resourceName; approvedBy? (по умолчанию 'web_panel') | true; false, 'resource_missing'; false при отказе | Добавляет текущий хеш манифеста в базовый список, снимает флаги подозрительности и блокировки, сохраняет в базу данных и обновляет всех клиентов. | Да |
blockResource | resourceName; 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. | Нет |
scanSingleResource | name | infected (boolean), reason | reason — одно из: self, escrow_signature_skip, whitelisted, snapshot_unavailable, incomplete, clean, cached_clean, infected, cached_infected, blocked. Может уступать управление. | Нет |
getInfectedFiles | нет | карта заражённых файлов | Результат последнего сканирования. | Нет |
addCheatSignature | pattern (шаблон имени ресурса); signatureName?; severity? (по умолчанию 'critical') | true; false, если пусто или отклонено | Добавляет шаблон в память и в базу данных. severity: info (low), warning (medium), low, medium, high или critical; неизвестные значения становятся high. | Да |
invalidateSignatureCache | нет | true | Очищает кеш шаблонов и сохранённые результаты сканирования, поэтому следующее сканирование заново читает все ресурсы. | Нет |
reloadSignatureExceptions | нет | true | Сбрасывает кеши исключений и пропусков escrow, а также сохранённые результаты сканирования. Они перезагружаются при следующем использовании. | Нет |
reloadSignatureScanCaches | нет | true | Сразу перезагружает шаблоны, белый список, исключения и пропуски escrow из базы данных. | Нет |
addSignatureEscrowSkip | resourceName; note? | true; false, если пусто, нет MySQL или отклонено | Пропускает для этого ресурса всё сканирование сигнатур (для escrow-кода). | Да |
removeSignatureEscrowSkip | idOrName (id строки или имя ресурса) | true; false, если недействительно, нет MySQL или отклонено | Удаляет пропуск escrow. | Да |
addSignatureException | resourceName; filePath? ('' = все файлы); signatureName; note? | true; false, если не хватает полей, нет MySQL или отклонено | Помечает срабатывание сигнатуры в этом ресурсе как ложное. | Да |
removeSignatureException | id (число) | true; false, если не число, нет MySQL или отклонено | Удаляет исключение. | Да |
tsScanBackdoors | callback?(report), где report = { complete, resources, finished_at, trigger } | true, если запущено; false, если сканирование уже идёт | Запускает сканирование на бэкдоры в потоке. Находки отправляются в базу данных и в панель. При включённом ts.BackdoorGuard.autoQuarantine критические находки останавливают ресурс. | Нет |
tsScanEvents | нет | true, если запущено; false, если сканирование уже идёт | Строит статическую опись событий и триггеров во всех ресурсах и отправляет её в панель. | Нет |
События-ловушки (honeypot)#
Превращение имён событий в ловушки или их освобождение. Оба экспорта пишут в ac_protected_events и перезагружают данные из базы данных.
| Экспорт | Параметры | Возвращает | Что делает | Нужен доверенный ресурс? |
|---|---|---|---|---|
fakeTriggerTrap | eventName; type ('client' или 'server') | true, если отправлено; false, если вызывающий не доверенный или type недопустим | Делает событие ловушкой (active = 1). Для полного эффекта перезапустите AC (ensure tosun-ac). | Да |
fakeTriggerWhitelist | eventName | true, если отправлено (также для пустого имени, которое ничего не делает); false, если вызывающий не доверенный | Отключает ловушку для этого события (active = 0). Для уже зарегистрированных обработчиков может потребоваться перезапуск AC; консоль об этом сообщает. | Да |
Экспорты, зависящие от функций#
Эти экспорты регистрируются, только когда их функция включена. Если функция выключена, их вызов вызывает ошибку.
| Экспорты | Регистрируются, только если |
|---|---|
quarantine, releaseQuarantine, isQuarantined, quarantineList | ts.quarantine.enabled не равен false |
crashGuardInspect, crashGuardReject | ts.crashGuard.enabled не равен false |
runCleanup, getCleanupStats | ts.v12.enableAutoCleanup не равен false |
tsScanBackdoors | ts.BackdoorGuard.enabled не равен false |
tsScanEvents | ts.EventScanner.enabled не равен false |
applyWeatherWithFramework, applyTimeWithFramework | меню администратора включено (ts.AdminMenu существует, и ни enable, ни enabled не равны false) |
phoneNotify, phoneNotifyAdmins | ts.AdminMenu.enable включён |
Клиентские экспорты#
Вызывайте их из клиентских скриптов. Их может вызвать любой клиентский ресурс; проверки доверия нет. Они влияют только на проверки на этом клиенте и никогда не меняют серверный контроль.
| Экспорт | Параметры | Возвращает | Что делает | Нужен доверенный ресурс? |
|---|---|---|---|---|
SetExempt (client) | state (boolean); durationMs? (по умолчанию 30000, максимум 300000); reason? (ключ, по умолчанию 'unknown') | nil | Добавляет или снимает локальное освобождение под этой причиной. Новая выдача для той же причины заменяет время окончания. Пока освобождение активно, большинство клиентских проверок пропускается; обнаружения, всё же дошедшие до клиентского пути бана, понижаются до записей LOG с тегом [exempt]. state = false снимает только эту причину. | Нет |
PauseDetections | durationMs? (по умолчанию 10000, максимум 300000) | nil | Приостанавливает локальные клиентские проверки. Каждый вызов заменяет время окончания, поэтому PauseDetections(0) завершает паузу, а меньшее значение её сокращает. | Нет |
IsPlayerAdmin | нет | boolean | Локальный флаг персонала, обновляемый каждые 2 с из проверенного сервером статуса администратора, а не из state bag, в который может писать клиент. | Нет |
IsExempt | нет | boolean | true, если игрок — персонал, активно серверное освобождение или пауза, активен PauseDetections или активна любая причина SetExempt. | Нет |
GetExemptions | нет | { [reason] = remainingMs } | Перечисляет только причины SetExempt и state bag tsAcExempt. Не показывает PauseDetections, серверные освобождения и статус персонала; для полного ответа используйте IsExempt. | Нет |
SetSpawned | state (boolean) | nil | true отмечает игрока как заспавненного. 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 видит вызывающим ваш ресурс.
- Добавьте мост в fxmanifest.lua вашего ресурса: server_script '@tosun-ac/bridge/tosun_ac_server.lua' и при необходимости client_script '@tosun-ac/bridge/tosun_ac_client.lua'.
- Если папка AC называется иначе, добавьте в server.cfg setr tosun_ac_resource "folder-name". Используйте setr: клиентский мост читает этот convar на клиенте.
- Необязательно: задайте set tosun_ac_bridge_server_ms (по умолчанию 60000), set tosun_ac_bridge_cooldown_ms (по умолчанию 750, 0 отключает) и setr tosun_ac_bridge_client_ms (по умолчанию 60000).
- Для полных серверных освобождений добавьте свой ресурс в 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.MarkTeleport | playerId (1 или больше); durationMs? (по умолчанию 8000) | true, только если экспорт вернул true | Вызывает MarkTeleport с причиной 'bridge:teleport'. | Нет (если ваш ресурс не доверенный, действует бюджет MarkTeleport на игрока) |
TosunAC.PlayerExempt | playerId; durationMs (от 500 до 300000), имя пресета или nil (= tosun_ac_bridge_server_ms); tag? (по умолчанию имя вашего ресурса) | true, 'full'; true, 'soft'; или false | Пробует SetPlayerExempt. При отказе переходит к MarkTeleport длительностью до 15 с. Задержка на игрока (по умолчанию 750 мс, общая с PlayerExemptPreset) возвращает одно значение false. В режиме аудита результат — 'full' даже для ресурсов не из списка. | Только для 'full' |
TosunAC.PlayerExemptPreset | playerId; presetName? (по умолчанию 'MEDIUM', без учёта регистра); tag? | как у PlayerExempt | PlayerExempt с длительностью из пресета. Неизвестные имена используют MEDIUM. Игнорирует tosun_ac_bridge_server_ms. | Только для 'full' |
TosunAC.PlayerExemptOff | playerId; tag? (AC не использует) | true, если принято | Вызывает SetPlayerExempt(playerId, false). Недоверенные ресурсы получают false, а мягкое окно не завершается. | Да |
TosunAC.IsTrusted | нет | boolean | GetIntegrationStatus().trusted. Возвращает false для ресурсов не из списка даже в режиме аудита, где защищённые вызовы всё равно проходят. | Нет |
TosunAC.IsAvailable | нет | boolean | true, если ресурс AC запущен. | Нет |
Мост: клиентские функции#
Определены в bridge/tosun_ac_client.lua внутри вашего ресурса. Они оборачивают клиентский экспорт SetExempt, поэтому дают облегчение только на стороне клиента.
| Экспорт | Параметры | Возвращает | Что делает | Нужен доверенный ресурс? |
|---|---|---|---|---|
TosunAC.Exempt | durationMs (от 500 до 300000), имя пресета или nil (= tosun_ac_bridge_client_ms); tag? (по умолчанию имя вашего ресурса) | nil | Вызывает клиентский SetExempt с ключом 'bridge:' плюс tag. | Нет |
TosunAC.ExemptOff | tag? (должен совпадать с tag, использованным в Exempt) | nil | Снимает это освобождение. | Нет |
TosunAC.ExemptPreset | name? (по умолчанию 'MEDIUM') | nil | Exempt с длительностью из пресета и tag по умолчанию. Параметра tag нет. | Нет |
TosunAC.RunWithExempt | durationMs; tag; fn | true плюс результаты fn; false, err; или false, если fn не функция | Выдаёт освобождение, выполняет fn внутри pcall, затем вызывает ExemptOff(tag). | Нет |
TosunAC.RunWithExemptPreset | presetName; fn | как у RunWithExempt | RunWithExempt с длительностью из пресета и tag по умолчанию. | Нет |
TosunAC.IsAvailable | нет | boolean | true, если ресурс 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 для серверного иммунитета |
screenCapture | AC не сохраняет результат. | v6ScreenWatchRequest или RequestShieldScreenshot |
GetStatus().detections | Не счётчик обнаружений или банов. | Не используйте как счётчик |
isAdmin, addAdmin | Зарегистрированы в исходном коде дважды. Работают версии из anticheat_server.lua. | Вызывайте как обычно |