跳转到指南

文档 9.6.24

Export 参考

Tosun AC 9.6.15 的所有公开 export,包括参数、返回值、副作用,以及调用方资源是否必须受信任。如需按任务讲解的说明,请先阅读集成指南。

调用 export#

在你资源的服务器脚本中调用服务器 export,在其客户端脚本中调用客户端 export。资源名包含连字符,因此请始终使用方括号形式 exports['tosun-ac']。exports.tosun-ac 这种写法不是有效的 Lua。

  • 服务器 id 请以数字传入。有几个 export 直接把 id 用作表的键。
  • 有些 export 会执行同步数据库查询并让出(yield)。请在线程或事件处理器中调用它们:getBans、getBanInfo、GetDetections、isAdmin 及其他管理人员检查、IsExemptFromPunish、ForensicLinksOf 和 refreshPanelWhitelist。scanAllResources 和 scanSingleResource 也会让出。
  • 受保护的 export 拒绝你的资源时会返回 false,即使它通常返回 nil。
  • 有些 export 只有在对应功能启用时才存在(参见“依赖功能的 exports”)。调用未注册的 export 会抛出错误,因此请用 pcall 包裹这些调用。
  • 有几个 export 没有出现在 fxmanifest.lua 的 export 列表中(例如 MarkTeleport、punish 和 AllowWeapon)。这些列表仅供参考;export 本身可以正常工作。
  • 下面的表格中,调用方资源必须受信任时,最后一列为“是”。参见“受信任资源”。
-- 你自己资源中的服务器脚本
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')

受信任资源#

信任列中标为“是”的 export 会更改豁免、管理人员权限、封禁、玩家生命值、武器或背包、隔离、资源和特征码,或影响整个服务器。它们只接受来自受信任资源的调用。被拒绝的调用不做任何事并返回 false。

满足以下条件之一的调用方即为受信任:服务器控制台、tosun-ac 本身、配置中 ts.ExportCallerWhitelist 列出的资源,或 convar tosun_ac_trusted_resources 中列出的资源。默认配置列表为 qbx_core、qb-core、es_extended、ox_inventory 和 ox_lib。

优先使用 convar。它位于 server.cfg 中,AC 更新后仍然保留,而对配置文件的修改可能会在更新 AC 时丢失。名称之间用逗号或空格分隔。信任列表缓存 10 秒,因此运行时所做的更改会在 10 秒内生效。

对于每个资源与 export 的组合,第一次被拒绝时,AC 会在服务器控制台输出一条警告,其中包含需要添加的准确 server.cfg 行,并在面板日志中写入一行。面板日志行始终为土耳其语。

审计模式:设置 ts.EnforceExportCallerWhitelist = false 时,不受信任的调用会被执行,每个资源与 export 的组合会在服务器控制台输出一次(不写面板日志)。默认值为 true。审计模式只应在设置期间使用,用来查看哪些脚本调用了什么。

在服务器控制台运行 tosunac_integration,可输出执行模式、受信任资源及其来源(config 或 convar),以及最近 20 次被拒绝的调用。在脚本中可调用 GetIntegrationStatus()。

信任还会取消 MarkTeleport 额度:受信任资源可以标记传送,不受按玩家计算的时间限制。

Tosun AC 还为自身的内部机制(面板桥接、签名、扫描、授权、批处理)注册了内部 exports 和网络事件。它们不属于本参考,也不是受支持的 API。其中一些受信任检查或内部调用方检查保护。不要调用它们。

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

集成和豁免#

这些服务器 export 用于告知 AC 你的脚本中的合法操作,以及读取玩家是否处于豁免状态。

Export参数返回值作用是否需要受信任资源?
MarkTeleportsrc;ms?(默认 8000,限制在 1000 到 ts.Integration.markTeleportMaxMs 之间,默认 15000);reason?(日志标签)授予成功或已被覆盖时为 true;玩家无效或离线,或额度不足时为 false软豁免。请在移动玩家之前立即调用。放宽服务器移动检查、godmode/invisible/noclip/focus 检查以及该玩家自己的客户端检查。武器、金钱、伤害、事件滥用、注入和崩溃类惩罚仍然适用。断开连接时清除。否。不受信任的资源共享每名玩家每 10 分钟 180000 毫秒的额度(ts.Integration.markTeleportBudgetMs)。超出额度的请求会被整体拒绝。
IsMovementExemptsrc布尔值MarkTeleport 或 DetectionExempt.serverEvents 软豁免窗口有效期间为 true。否
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;不受信任或 src 不是数字时为 false完全豁免:服务器惩罚豁免加客户端豁免标志。大多数客户端检查会被跳过;仍进入客户端封禁路径的检测会降级为带 [exempt] 标签的 LOG 记录。与 whitelistPlayer、PausePlayerDetections 和 BypassDetection 共用一个计时器,因此新的授予可能缩短旧的授予,state = false 会取消它们。断开连接时清除。是
SetExempt (server)src;durationMs?(默认 30000,最大 300000);reason?与 SetPlayerExempt 相同SetPlayerExempt(src, true, durationMs, reason) 的别名。同名的客户端 export 参数不同。是
BypassDetectionsrc;detectionKey(必填,但其值会被忽略);durationMs?(默认 5000,500 到 60000)true;不受信任、src 缺失或为 0,或 key 为 nil 时为 false旧名称。授予与 SetPlayerExempt 相同的完全豁免;它并不只针对某一项检测。用空表作为 key 会返回 true,但不授予任何豁免。是
PausePlayerDetectionssrc;durationMs?(默认 15000,最大 300000)true;不受信任或 src 不是数字时为 false为一名玩家提供服务器惩罚豁免,并设置客户端暂停标志。是
PauseAllDetectionsdurationMs?(默认 10000,最大 300000)true;不受信任时为 false暂停当前所有在线玩家的客户端检测。没有服务器端豁免。之后加入的玩家不会被暂停。没有调用频率限制。是
AllowWeaponsrc;weapon?(名称如 'WEAPON_PISTOL'、哈希值、'*' 或 nil 表示所有武器);ms?(默认 600000,1000 到 3600000)true;不受信任、玩家无效或离线,或某个数字为 NaN/inf 时为 false允许玩家持有和使用不在其背包中的武器。只放宽武器与背包比对检查(持有的武器和伤害)。断开连接时清除。是
IsExemptFromPunishsrc布尔值(true = 不惩罚)执行模块使用的核心规则。以下情况为 true:管理人员(ts.AdminBypassDetections 不为 false 时)、有效的豁免、运行时白名单和面板白名单,以及受保护的玩家。由于最后一条规则,即使 AdminBypassDetections = false,管理人员在这里仍然被豁免。开启 ts.Debug 时始终为 false。可能会查询数据库。否
IsPlayerProtectedsrc布尔值管理人员、管理员状态或有效豁免时为 true。忽略 ts.AdminBypassDetections 和 ts.Debug。不包括运行时白名单或面板白名单;完整规则请使用 IsExemptFromPunish。可能会查询数据库。否

选择豁免方式#

使用能覆盖你脚本需求的最窄的豁免。几种豁免共用同一个客户端豁免标志,因此一种可能会结束另一种:带区域名调用 ClearArea 会重置 SetPlayerExempt、MarkTeleport 和 BypassDetection 也会设置的那个标志。

Export服务器惩罚豁免客户端检查时长是否需要受信任资源?
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 中的任意 ACE;主体 group.admin、group.superadmin、group.moderator 和 group.god;ts.txAdminAuth 开启时的 command.kick/ban/resources/restart;admins.lua、ts.AdminMenu.allowedIds 和 ts.AdminBypassIdentifiers 中的标识符;以及数据库中的面板授权。同时授予了 builtin.everyone 的 ACE 不算。

isAdmin 和 addAdmin 在源码中注册了两次。anticheat_server.lua 中的版本最后加载,是实际运行的版本;本参考描述的就是这些版本。

Export参数返回值作用是否需要受信任资源?
isAdminsrc(请传入数字)布尔值根据上面列出的来源判断管理员状态。数据库结果为肯定时缓存 5 秒,为否定时缓存 30 秒。不考虑 ts.AdminBypassDetections。否
isStaffPlayersrc布尔值封禁路径使用的管理人员检查。来源与 isAdmin 相同,另外还包括 txAdmin 命令 ACE(command.kick/ban/resources/restart/screenshot/unban),除非 ts.txAdminAuth = false。否
isAdminMenuAllowedsrc布尔值玩家是否可以打开管理菜单。菜单禁用时为 false。仅限 txAdmin 的 ACE(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 白名单、标识符白名单和命名区域。运行时列表只保存在内存中,重启后丢失;面板白名单是独立的。

Export参数返回值作用是否需要受信任资源?
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移除运行时白名单条目。不会触及面板白名单表。是
IsWhitelistedsrc布尔值任一标识符在运行时白名单或缓存的面板白名单中时为 true。不包括 whitelistPlayer 或 SetPlayerExempt。开启 ts.Debug 时始终为 false。否
refreshPanelWhitelist无nil立即重新加载面板白名单(同步查询)。它还会在启动 12 秒后以及每 60 秒自动重新加载。否
WhitelistAreasrc;areaName(非空);durationSec?(默认 30)true;无效或被拒绝时为 false记录一个命名区域并设置客户端豁免标志。只在客户端放宽:没有任何服务器模块读取该区域,因此没有服务器惩罚豁免。是
ClearAreasrc;areaName?('' 或 nil = 所有区域)true;src 为 0 或被拒绝时为 false移除该区域。带名称时还会重置客户端豁免标志,这也会结束其他客户端豁免。名称为空时该标志保持不变。是
IsInAreasrc;areaName?(为空 = 任意区域)布尔值带名称时会检查是否过期。名称为空时,只要存在任何条目(包括已过期的)就返回 true。否

惩罚和封禁#

通过 AC 流程惩罚玩家、封禁离线玩家以及读取封禁。这里所有写入类 export 都需要信任。

Export参数返回值作用是否需要受信任资源?
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异步:如果封禁存在,则删除它,向管理菜单 webhook 发送 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')

单个玩家的管理#

对一名玩家执行操作。请仔细查看信任列:其中有几个没有信任检查。

Export参数返回值作用是否需要受信任资源?
freezePlayersrc(在线);freeze(布尔值)true;离线时为 false冻结或解冻玩家,并发送本地化的聊天通知。断开连接时不会清除冻结标志。否
isPlayerFrozensrc布尔值只反映 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;src 为 nil 时为 false解除禁言,玩家在线时通知玩家(硬编码的土耳其语聊天通知)。否
isPlayerMutedsrc布尔值只读。否
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');否则使用 ESX addWeapon;否则以原生方式发放。即使背包拒绝了该物品也返回 true。不会调用 AllowWeapon,因此以原生方式发放的武器可能被武器与背包比对检查标记(默认动作为 log)。是
stripWeaponssrc(在线)true;离线或被拒绝时为 false移除 ped 身上的所有武器。不触及背包物品。是
clearInventorysrc(在线)true;离线或被拒绝时为 false通过 ox_inventory 清空背包。没有 ox_inventory 时只显示通知,不清空任何东西,但仍返回 true。是
spectatePlayeradminSrc;targetSrctrue;某个参数为 nil 或目标没有 ped 时为 false并非真正的观战:把 adminSrc 传送到目标处。每次调用还会给 adminSrc 一个不受额度限制的 15 秒移动豁免。否

全服操作#

影响所有玩家或所有新连接的操作。

Export参数返回值作用是否需要受信任资源?
lockdownStatus无active(布尔值)、reason(字符串)只读。否
setLockdownstate(布尔值);reason(启用时请传入字符串)nil;被拒绝时为 false封锁期间,所有新连接都会被拒绝,并显示 LOCKDOWN 消息和原因。没有管理人员例外。仅在运行时有效。会广播一条聊天消息。以 state 为 true 且不带 reason 调用时,会先开启封锁,然后引发 Lua 错误。是
emergencyLockdownreason?(封锁原因默认为 'Acil durum',土耳其语)被踢出的玩家数;被拒绝时为 false开启封锁,并以本地化消息踢出所有非管理人员玩家。是
massFreezestate(布尔值)玩家数;被拒绝时为 false冻结或解冻所有玩家,包括管理人员,并广播一条聊天消息。聊天消息是硬编码的土耳其语。是
healAll无收到治疗的玩家数;被拒绝时为 false为每个有 ped 的玩家把生命值设为最大、护甲设为 100。是
setSpeedLimitkmh(0 表示禁用)实际应用的限速值;被拒绝时为 false为当前在线的玩家限制车速。之后加入的玩家不受该限制。是
applyWeatherWithFrameworkweather(不校验)true,以及尝试过的方法列表依次尝试 qb-weather、Renewed-Weathersync、cd_easytime,然后是 wd_weather、weathersync、vSync 和 qb-weathersync,都不可用时广播给每个客户端。只有管理菜单启用时才存在。否
applyTimeWithFrameworkhour;minute(不做范围限制)true,以及尝试过的方法列表对时间使用相同的回退链。只有管理菜单启用时才存在。否

隔离和数据保护#

隔离可疑玩家,并保护你自己的网络事件免受崩溃数据和刷屏攻击。

Export参数返回值作用是否需要受信任资源?
quarantinesrc(在线);reason?(默认 'supheli davranis',土耳其语);seconds?(默认 300,30 到 1800)true(已被隔离时也是);对于被豁免或无效的玩家、bucket 失败或不受信任的调用方为 false把玩家移到隔离的 routing bucket(默认 9001 到 9500,严格实体锁定,无人口生成)。记录一条 QUARANTINE 检测,并向玩家发送聊天通知,除非 notifyPlayer = false。通知是硬编码的土耳其语。到期后自动释放。是
releaseQuarantinesrc释放成功时为 true;未被隔离或被拒绝时为 false恢复原来的 routing bucket,记录日志并通知玩家(硬编码的土耳其语聊天通知,除非 notifyPlayer = false)。是
isQuarantinedsrc布尔值只读。否
quarantineList无{ id, name, reason, remaining }[](remaining 以秒为单位)只读。否
crashGuardInspectvalue(任意数据)安全时为 nil;否则为土耳其语的问题描述检查 NaN/Inf 数字、无效向量、超过 32768 个字符的字符串、超过 8 层的嵌套、超过 2000 个元素、总大小约 64 KB、超过 512 个字符的键、不支持的类型和递归。没有副作用。否
crashGuardRejectsrc(在线);payload数据有问题时为 true(应丢弃);数据干净或 src 无效时为 false相同的检查,并给玩家记一次警告。60 秒内累计 3 次时执行 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 地址等个人数据。

Export参数返回值作用是否需要受信任资源?
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 }[]根据服务器端 ped 位置(OneSync)查找 src 附近的玩家,不包括 src 本身。否
getOnlinePlayers无{ id, name, ping, license, discord, steam, isAdmin }[]这里的标识符保留前缀(license:...、discord:...、steam:...)。isAdmin 可能会为每名玩家查询数据库。否
GetDetectionssrc(在线);limit?(默认 25){ banID, reason, banDate, banUntil }[] 或 {}历史名称:返回按 license 匹配的该玩家 BAN 记录,而不是检测记录。否
GetCloudThreatScoresrc0 到 100显示用评分:每次会话违规 8 分(最多 40,仅当最近一次违规不到 10 分钟时),每次错过 shield 签到 10 分(最多 30),每个 native-guard 威胁点 12 分(最多 30)。ts.cloudBridge.enabled = false 时为 0。否
NoteCloudViolationsrc;reason?;punishment?('LOG'、'KICK' 或 'BAN')nil为玩家的评分增加一次违规;ts.cloudBridge.enabled = false 时不做任何事。每条 KICK 或 BAN 记录会使情报评分增加 25(最多 100,仅当最近一次不到 10 分钟时);达到 50 或以上时,该 license 会被报告到面板的跨服务器威胁数据库(需要面板 URL 和令牌)。只有 ts.cloudBridge.threatIntelAction = 'kick'(默认 'log')时才会阻止之后的加入。AC 已经在每次惩罚时调用它。否
ForensicLinksOflicense(纯 hex,不带 license: 前缀)关联的 license(字符串列表);未知时为 {}查找共享 Steam、Discord 或 HWID 值的小号(只有 ts.forensics.linkByIp = true 时才包括 IP),最多 ts.forensics.maxHops 跳(默认 3,最大 5)。阻塞式查询。forensics 禁用时也能工作,但不会记录新的关联。否
checkIpReputationip{ vpn, proxy, hosting, country, org, expiresAt } 或 nil只读取缓存。只为在 ts.v12.ipCheckCacheHours(24)内于连接时检查过的 IP 返回数据。不做实时查询。否
webBridgeFindByLicenselicense(字符串,带或不带 license:)在线服务器 id 或 nil查找在线玩家。实际上它会精确匹配任何标识符,例如 license2:... 或 discord:...。否
webBridgeFindByCitizencid(QB citizenid 或 ESX identifier)在线服务器 id 或 nil仅适用于框架 'qb'、'qbcore' 和 'esx';在 'qbox' 上返回 nil。否

通知和语言#

发送手机通知并使用 AC 的翻译表。phoneNotify 和 phoneNotifyAdmins 只有在 ts.AdminMenu.enable 开启时才存在。

Export参数返回值作用是否需要受信任资源?
phoneNotifysrc(在线);title;body;opts? { icon, color, app }true;离线时为 false发送到第一个已启动的手机资源:qb-phone、qs-smartphone、lb-phone、yseries、gks_phone、npwd 或 roadphone,都没有时发送到聊天。手机资源只检测一次,因此之后才启动的手机资源在重启前会被忽略。否
phoneNotifyAdminstitle;body;opts?nil对每名在线管理人员调用 phoneNotify。可能会为每名玩家查询数据库。否
getPlayerLocalesrc语言代码;默认 ts.Locale('tr')只读。仅服务器端。否
setPlayerLocalesrc;lang(2 或 3 个小写字母,且有对应的 locales 文件)设置成功时为 true;否则为 false设置玩家的服务器端语言。与 ts_setlang 命令不同,它不会把语言同步到客户端。断开连接时清除。否
translatekey;...({0}、{1} 的值,或用于 {name} 的一个表)翻译后的字符串;英文回退;缺失时返回键名本身使用 ts.Locale。末尾带有对应 locale 文件的 2 或 3 个字母代码时会选择该语言。使用 %s 的模板会原样返回,不做格式化;请自行格式化。否
translateForPlayersrc;key;...玩家语言的字符串与 translate 类似,但使用玩家的语言。末尾不带语言代码。否

截图#

为面板请求玩家截图。AC 的日志写入类 export 属于内部接口,不在此列出。

Export参数返回值作用是否需要受信任资源?
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 资源,并需用 setr 设置 convar ts_screen_upload(默认 http://localhost/api/screen_upload.php)。AC 不保存结果。请改用 v6ScreenWatchRequest 或 RequestShieldScreenshot。否

状态和诊断#

为仪表盘和健康检查读取 AC 状态。

Export参数返回值作用是否需要受信任资源?
GetStatus无{ version, online, detections, debug, framework }version 是 fxmanifest 中的资源版本。detections 只统计来自旧版未签名客户端通道的报告,开启签名(默认)时接近 0;它不是检测数或封禁数。没有运行时长字段。否
getConfig (server)configType?('webhooks' 或其他任意值)经过清理的配置副本;对于 'webhooks',向受信任调用方返回 Webhooks 表,向其他调用方返回 {}副本会去掉函数、名称中包含 secret、password、token 或 webhook 的键、以 key 结尾的键(以 hotkey 结尾的名称和单独的 key 除外),以及嵌套超过 6 层的内容。缓存 5 秒。仅 'webhooks' 需要
licenseStatus无{ checked, ok, reason, serverId, licenseSet }许可证锁定状态。ts.licenseLock.enabled 不为 true 时 reason 为 'disabled';在启动 1.5 秒后的首次检查之前为 'not_checked'。否
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 信誉、命令和截图队列、登录尝试和过期会话(限制来自 ts.v12 的 keep 设置)。删除是异步的,因此返回的统计还不包括本次运行。是

资源防护(Resource Guard)#

读取和更改已批准的资源基线。即使资源防护被禁用,这些 export 也都会注册。

Export参数返回值作用是否需要受信任资源?
getBaseline无{ [resource] = { manifest_hash, deep_hash } }已批准的基线。否
getResources无{ [resource] = true }已知资源。否
getSuspicious无{ [resource] = { reason, state, hash, manifest, at } }被标记为已更改或可疑的资源。否
getStats无{ lastScan, violations, driftedResources }防护计数器。否
rescanResources无完整的防护状态(ready、resources、hashes、suspicious、drift_count、violation_count、last_scan 等)同步重建资源快照。否
approveResourceresourceName;approvedBy?(默认 'web_panel')true;false, 'resource_missing';被拒绝时为 false把当前 manifest 哈希加入基线,清除可疑和阻止标志,保存到数据库并更新所有客户端。是
blockResourceresourceName;reason?(默认 'Manuel blok',土耳其语)true;被拒绝时为 false把资源标记为已阻止,从基线中移除,保存到数据库,如果已启动则将其停止。是
tsAutoSetup无true(已有 setup 在运行时也是);被拒绝时为 false与控制台命令 tosunac_setup 相同:检测框架,运行后门扫描(超时 120 秒)和特征码扫描,只批准后门和特征码结果完整、干净且未改动的已启动资源,然后运行事件扫描。如果后门防护被禁用或正忙,会中止且不批准任何内容。是

特征码、后门和事件扫描#

运行扫描并管理特征码、误报例外和 escrow 跳过项。扫描可能需要一些时间;请在线程中运行。

Export参数返回值作用是否需要受信任资源?
scanAllResources无{ total, scanned, infected, clean, errors, cached, skipped };或 nil, 'already_scanning'对所有资源进行特征码扫描。会让出(yield)。重置感染列表。ts.ResourceGuard.autoBlockInfected 开启时会阻止被感染的资源。否
scanSingleResourcenameinfected(布尔值)、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(低)、warning(中)、low、medium、high 或 critical;未知值会变为 high。是
invalidateSignatureCache无true清空模式缓存和已保存的扫描结果,使下次扫描重新读取每个资源。否
reloadSignatureExceptions无true使例外缓存、escrow 跳过缓存和已保存的扫描结果失效。下次使用时重新加载。否
reloadSignatureScanCaches无true立即从数据库重新加载模式、白名单、例外和 escrow 跳过项。否
addSignatureEscrowSkipresourceName;note?true;为空、没有 MySQL 或被拒绝时为 false对该资源跳过整个特征码扫描(用于 escrow 代码)。是
removeSignatureEscrowSkipidOrName(行 id 或资源名)true;无效、没有 MySQL 或被拒绝时为 false移除 escrow 跳过项。是
addSignatureExceptionresourceName;filePath?('' = 所有文件);signatureName;note?true;缺少字段、没有 MySQL 或被拒绝时为 false把该资源中的一次特征码命中标记为误报。是
removeSignatureExceptionid(数字)true;不是数字、没有 MySQL 或被拒绝时为 false删除该例外。是
tsScanBackdoorscallback?(report),其中 report = { complete, resources, finished_at, trigger }启动成功时为 true;已有扫描在运行时为 false在线程中运行后门扫描。结果写入数据库并发送到面板。ts.BackdoorGuard.autoQuarantine 开启时,严重命中会停止对应资源。否
tsScanEvents无启动成功时为 true;已有扫描在运行时为 false为所有资源中的事件和触发器建立静态清单,并发送到面板。否

蜜罐事件#

把事件名变成陷阱或解除陷阱。两者都会写入 ac_protected_events 并从数据库重新加载。

Export参数返回值作用是否需要受信任资源?
fakeTriggerTrapeventName;type('client' 或 'server')已派发时为 true;不受信任或 type 无效时为 false把该事件设为蜜罐(active = 1)。重启 AC(ensure tosun-ac)以完全生效。是
fakeTriggerWhitelisteventName已派发时为 true(名称为空时也是,但不做任何事);不受信任时为 false禁用该事件的蜜罐(active = 0)。已注册的处理器可能需要重启 AC;控制台会给出提示。是

依赖功能的 exports#

这些 export 只有在对应功能开启时才会注册。功能关闭时调用它们会抛出错误。

Exports仅在以下情况注册
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 已开启

客户端 exports#

在客户端脚本中调用这些 export。任何客户端资源都可以调用;没有信任检查。它们只影响该客户端上的检查,永远不会改变服务器端的执行。

Export参数返回值作用是否需要受信任资源?
SetExempt (client)state(布尔值);durationMs?(默认 30000,最大 300000);reason?(键,默认 'unknown')nil以该 reason 添加或移除本地豁免。对同一 reason 的新授予会替换结束时间。生效期间大多数客户端检查会被跳过;仍进入客户端封禁路径的检测会降级为带 [exempt] 标签的 LOG 记录。state = false 只移除该 reason。否
PauseDetectionsdurationMs?(默认 10000,最大 300000)nil暂停本地客户端检查。每次调用都会替换结束时间,因此 PauseDetections(0) 会结束暂停,较短的值会缩短暂停。否
IsPlayerAdmin无布尔值本地管理人员标志,每 2 秒根据服务器验证过的管理员状态刷新,而不是根据客户端可写的 state bag。否
IsExempt无布尔值以下任一情况为 true:玩家是管理人员,服务器豁免或暂停有效,PauseDetections 有效,或有任何 SetExempt reason 有效。否
GetExemptions无{ [reason] = remainingMs }只列出 SetExempt 的 reason 和 tsAcExempt state bag。不显示 PauseDetections、服务器豁免或管理人员状态;完整结果请使用 IsExempt。否
SetSpawnedstate(布尔值)niltrue 把玩家标记为已出生。false 会暂停移动和视觉检查,例如在角色选择时;每 5 分钟最多生效一次,检查会在约 30 秒的正常可见移动后恢复。否
getConfig (client)无客户端配置表只有对客户端安全的设置才会同步到客户端。否
-- 角色选择
exports['tosun-ac']:SetSpawned(false)
-- ... 玩家选择角色 ...
exports['tosun-ac']:SetSpawned(true)

JavaScript exports#

Tosun AC 在服务器上注册了几个 JavaScript export,用于资源扫描和许可证验证。它们是内部接口,不受受信任资源检查保护,也不是受支持的 API。不要调用它们。没有公开的 JavaScript export。

桥接文件:设置#

tosun-ac/bridge 中的可选桥接文件会为你的资源提供一个带简短辅助函数的全局 TosunAC 表。它们在 pcall 中调用 export,因此 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'。

Export参数返回值作用是否需要受信任资源?
TosunAC.MarkTeleportplayerId(1 或更大);durationMs?(默认 8000)仅当 export 返回 true 时为 true以 reason 'bridge:teleport' 调用 MarkTeleport。否(如果你的资源不受信任,则适用按玩家计算的 MarkTeleport 额度)
TosunAC.PlayerExemptplayerId;durationMs(500 到 300000)、预设名称或 nil(= tosun_ac_bridge_server_ms);tag?(默认为你的资源名)true, 'full';true, 'soft';或 false尝试 SetPlayerExempt。被拒绝时回退为最长 15 秒的 MarkTeleport。按玩家计算的冷却时间(默认 750 毫秒,与 PlayerExemptPreset 共用)期间直接返回一个 false。在审计模式下,即使是未列出的资源,结果也是 'full'。仅 'full' 需要
TosunAC.PlayerExemptPresetplayerId;presetName?(默认 'MEDIUM',不区分大小写);tag?与 PlayerExempt 相同使用预设时长的 PlayerExempt。未知名称使用 MEDIUM。忽略 tosun_ac_bridge_server_ms。仅 'full' 需要
TosunAC.PlayerExemptOffplayerId;tag?(AC 不使用)被接受时为 true调用 SetPlayerExempt(playerId, false)。不受信任的资源得到 false,且软豁免窗口不会结束。是
TosunAC.IsTrusted无布尔值即 GetIntegrationStatus().trusted。即使在审计模式下(受保护的调用仍会通过),对未列出的资源也返回 false。否
TosunAC.IsAvailable无布尔值AC 资源已启动时为 true。否

桥接:客户端辅助函数#

由你资源内的 bridge/tosun_ac_client.lua 定义。它们封装了客户端 SetExempt export,因此只在客户端放宽检查。

Export参数返回值作用是否需要受信任资源?
TosunAC.ExemptdurationMs(500 到 300000)、预设名称或 nil(= tosun_ac_bridge_client_ms);tag?(默认为你的资源名)nil以键 'bridge:' 加 tag 调用客户端 SetExempt。否
TosunAC.ExemptOfftag?(必须与 Exempt 中使用的 tag 一致)nil移除该豁免。否
TosunAC.ExemptPresetname?(默认 'MEDIUM')nil使用预设时长和默认 tag 的 Exempt。没有 tag 参数。否
TosunAC.RunWithExemptdurationMs;tag;fntrue 加上 fn 的返回值;false, err;或 fn 不是函数时为 false先豁免,在 pcall 中运行 fn,然后调用 ExemptOff(tag)。否
TosunAC.RunWithExemptPresetpresetName;fn与 RunWithExempt 相同使用预设时长和默认 tag 的 RunWithExempt。否
TosunAC.IsAvailable无布尔值AC 资源已启动时为 true。否
tosun-ac:bridge:clientExempt (net event)durationMs?;tag?无返回值在每个包含客户端桥接文件的资源内注册。服务器脚本可以用 TriggerClientEvent 发送它,在该客户端上运行 TosunAC.Exempt。如果多个资源都包含桥接文件,每个资源都会应用各自的豁免。tosun-ac 中没有任何地方发送它。否(服务器脚本,或使用 TriggerEvent 的本地客户端脚本)

任何资源都能调用的 exports#

这些 export 没有信任检查,并且有副作用。每个服务器资源都可以调用它们。只运行你信任的资源;注意,任何服务器资源本来就可以通过 FiveM native 踢出玩家或触发客户端事件。

  • 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:向玩家发送手机或聊天消息。

旧名称和易误解的名称#

这些 export 仍然可用,但它们的名称或旧文档暗示了它们实际上并不做的事情。

  • 旧指南(9.6.6 的 INTEGRATION.md、8.6.1 的 CONFIG-EXPORTS-MULTILANG.md,以及重定向占位文件 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。
  • 客户端豁免期间,大多数客户端检查会被完全跳过。只有仍进入封禁路径的检测才会变成带 [exempt] 标签的 LOG 记录。
  • 只有 ts.cloudBridge.threatIntelAction = 'kick' 时,NoteCloudViolation 才会阻止之后的加入。
  • 使用客户端桥接时,convar tosun_ac_resource 和 tosun_ac_bridge_client_ms 必须用 setr 设置,而不是 set。
  • MarkTeleport 的单次调用上限(ts.Integration.markTeleportMaxMs)同样适用于受信任的调用方。只有每 10 分钟 180 秒的额度是针对不受信任调用方的。
Export须知改用
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 中的版本。正常调用即可