Documentación 9.6.24
Referencia de exports
Todos los exports públicos de Tosun AC 9.6.15, con sus parámetros, valores de retorno, efectos secundarios y si el recurso que llama debe ser de confianza. Para una guía por tareas, empieza por la guía de integración.
Llamar a un export#
Llama a los exports de servidor desde los scripts de servidor de tu recurso y a los exports de cliente desde sus scripts de cliente. El nombre del recurso lleva un guion, así que usa siempre la forma con corchetes exports['tosun-ac']. La forma exports.tosun-ac no es Lua válido.
- Pasa los id de servidor como números. Varios exports usan el id directamente como clave de una tabla.
- Algunos exports ejecutan una consulta síncrona a la base de datos y ceden el hilo (yield). Llámalos desde un thread o un handler de evento: getBans, getBanInfo, GetDetections, isAdmin y las demás comprobaciones de staff, IsExemptFromPunish, ForensicLinksOf y refreshPanelWhitelist. scanAllResources y scanSingleResource también ceden el hilo.
- Un export protegido que rechaza tu recurso devuelve false, aunque normalmente devuelva nil.
- Algunos exports solo existen cuando su función está activada (consulta Exports que dependen de una función). Llamar a un export que no está registrado lanza un error, así que envuelve esas llamadas en pcall.
- Varios exports faltan en las listas de exports de fxmanifest.lua (por ejemplo MarkTeleport, punish y AllowWeapon). Esas listas son solo informativas; los exports funcionan.
- Las tablas de abajo indican Sí en la última columna cuando el recurso que llama debe ser de confianza. Consulta Recursos de confianza.
-- script de servidor en tu propio recurso
local status = exports['tosun-ac']:GetIntegrationStatus()
if not status.trusted then
print(status.hint) -- la línea de server.cfg que debes añadir
end
-- avisa al AC de un teletransporte y luego mueve al jugador
exports['tosun-ac']:MarkTeleport(src, 8000)
SetEntityCoords(GetPlayerPed(src), x, y, z)
-- script de cliente en tu propio recurso
exports['tosun-ac']:SetExempt(true, 60000, 'my_menu')Recursos de confianza#
Los exports marcados con Sí en la columna de confianza cambian exenciones, derechos de staff, bans, la salud, las armas o el inventario de los jugadores, la cuarentena, los recursos y las firmas, o todo el servidor. Solo aceptan llamadas de un recurso de confianza. Una llamada rechazada no hace nada y devuelve false.
Quien llama es de confianza cuando es la consola del servidor, el propio tosun-ac, un recurso listado en ts.ExportCallerWhitelist en la configuración o un recurso listado en el convar tosun_ac_trusted_resources. La lista por defecto de la configuración es qbx_core, qb-core, es_extended, ox_inventory y ox_lib.
Usa preferiblemente el convar. Vive en server.cfg y sobrevive a las actualizaciones del AC, mientras que los cambios en el archivo de configuración pueden perderse al actualizar el AC. Separa los nombres con comas o espacios. La lista de confianza se guarda en caché durante 10 segundos, así que un cambio hecho en ejecución se aplica en menos de 10 segundos.
En el primer rechazo de cada par de recurso y export, el AC imprime un aviso en la consola del servidor con la línea exacta de server.cfg que debes añadir, y escribe una línea en los logs del panel. La línea del log del panel siempre está en turco.
Modo auditoría: con ts.EnforceExportCallerWhitelist = false, las llamadas no fiables se ejecutan y cada par de recurso y export se imprime una vez en la consola del servidor (sin línea en el log del panel). El valor por defecto es true. Usa el modo auditoría solo durante la configuración para ver qué scripts llaman a qué.
Ejecuta tosunac_integration en la consola del servidor para imprimir el modo de aplicación, los recursos de confianza con su origen (config o convar) y las últimas 20 llamadas rechazadas. Desde un script, llama a GetIntegrationStatus().
La confianza también elimina el presupuesto de MarkTeleport: los recursos de confianza pueden marcar teletransportes sin el límite de tiempo por jugador.
Tosun AC también registra exports y eventos de red internos para su propio funcionamiento (puente con el panel, firma, escaneo, licencias, procesamiento por lotes). No forman parte de esta referencia ni son una API soportada. Algunos están protegidos por la comprobación de confianza o por una comprobación interna de quién llama. No los llames.
# server.cfg
set tosun_ac_trusted_resources "my-housing,my-clothing"Integración y exenciones#
Exports de servidor que informan al AC de acciones legítimas en tus scripts y consultan si un jugador está exento.
| Export | Parámetros | Devuelve | Qué hace | ¿Requiere recurso de confianza? |
|---|---|---|---|---|
MarkTeleport | src; ms? (por defecto 8000, limitado entre 1000 y ts.Integration.markTeleportMaxMs, por defecto 15000); reason? (etiqueta de log) | true si se concede o ya estaba cubierto; false si el jugador no es válido o está desconectado, o si el presupuesto no alcanza | Exención suave. Llámalo justo antes de mover a un jugador. Relaja las comprobaciones de movimiento del servidor, las de godmode/invisible/noclip/focus y las propias comprobaciones de cliente del jugador. Las sanciones por armas, dinero, daño, abuso de eventos, inyección y crash siguen aplicándose. Se borra al desconectarse. | No. Los recursos no fiables comparten un presupuesto de 180000 ms por jugador cada 10 minutos (ts.Integration.markTeleportBudgetMs). Una petición que no cabe se rechaza entera. |
IsMovementExempt | src | booleano | true mientras haya activa una ventana suave de MarkTeleport o de DetectionExempt.serverEvents. | No |
GetIntegrationStatus | ninguno (se detecta quién llama) | { version, resource, trusted, trustedVia ('config', 'convar', 'self' o nil), enforcing, hint } | Indica a tu recurso si es de confianza y por qué vía. hint es la línea de server.cfg que debes añadir cuando no lo es. enforcing = false significa modo auditoría. | No |
SetPlayerExempt | src; state (true concede, false quita); durationMs? (por defecto 30000, máx. 300000); reason? | true; false si no es de confianza o src no es un número | Exención completa: inmunidad frente a sanciones del servidor más el indicador de exención del cliente. Se omiten la mayoría de las comprobaciones de cliente; las detecciones que aun así llegan a la vía de ban del cliente se rebajan a entradas LOG etiquetadas [exempt]. Comparte un mismo temporizador con whitelistPlayer, PausePlayerDetections y BypassDetection, así que una concesión nueva puede acortar una anterior y state = false las cancela. Se borra al desconectarse. | Sí |
SetExempt (server) | src; durationMs? (por defecto 30000, máx. 300000); reason? | igual que SetPlayerExempt | Alias de SetPlayerExempt(src, true, durationMs, reason). El export de cliente con el mismo nombre recibe argumentos distintos. | Sí |
BypassDetection | src; detectionKey (obligatorio, pero su valor se ignora); durationMs? (por defecto 5000, de 500 a 60000) | true; false si no es de confianza, si falta src o es 0, o si key es nil | Nombre heredado. Concede la misma exención completa que SetPlayerExempt; no se limita a una sola detección. Una tabla vacía como key devuelve true pero no concede nada. | Sí |
PausePlayerDetections | src; durationMs? (por defecto 15000, máx. 300000) | true; false si no es de confianza o src no es un número | Inmunidad frente a sanciones del servidor más un indicador de pausa en el cliente para un jugador. | Sí |
PauseAllDetections | durationMs? (por defecto 10000, máx. 300000) | true; false si no es de confianza | Pausa las detecciones de cliente para todos los jugadores conectados ahora. Sin exención del lado del servidor. Los jugadores que entran después no quedan en pausa. No hay limitación de frecuencia. | Sí |
AllowWeapon | src; weapon? (nombre como 'WEAPON_PISTOL', hash, '*' o nil para todas las armas); ms? (por defecto 600000, de 1000 a 3600000) | true; false si no es de confianza, si el jugador no es válido o está desconectado, o si un número es NaN/inf | Permite a un jugador llevar y usar un arma que no está en su inventario. Solo relaja la comprobación de arma frente a inventario (arma en mano y daño). Se borra al desconectarse. | Sí |
IsExemptFromPunish | src | booleano (true = no sancionar) | La regla central que usan los módulos de aplicación de sanciones. true para el staff (cuando ts.AdminBypassDetections no es false), exenciones activas, la whitelist de ejecución y la del panel, y jugadores protegidos. Por la última regla, el staff sigue exento aquí incluso con AdminBypassDetections = false. Siempre false con ts.Debug. Puede consultar la base de datos. | No |
IsPlayerProtected | src | booleano | true para staff, estado de administrador o una exención activa. Ignora ts.AdminBypassDetections y ts.Debug. No incluye la whitelist de ejecución ni la del panel; usa IsExemptFromPunish para la regla completa. Puede consultar la base de datos. | No |
Elegir una exención#
Usa la exención más limitada que cubra tu script. Varias exenciones comparten el mismo indicador de exención del cliente, así que una puede terminar otra: ClearArea con un nombre de área reinicia el indicador que también activan SetPlayerExempt, MarkTeleport y BypassDetection.
| Export | Inmunidad frente a sanciones del servidor | Comprobaciones de cliente | Duración | ¿Requiere recurso de confianza? |
|---|---|---|---|---|
MarkTeleport | Solo comprobaciones de movimiento y visibilidad | Exento (la ventana solo se amplía) | 8 s por defecto, mín. 1 s; máx. ts.Integration.markTeleportMaxMs por llamada (15 s por defecto) | No (con presupuesto) |
SetPlayerExempt, SetExempt (server) | Sí | Exento | 30 s por defecto, máx. 300 s | Sí |
BypassDetection | Sí | Exento | 5 s por defecto, de 0,5 a 60 s | Sí |
PausePlayerDetections | Sí | En pausa | 15 s por defecto, máx. 300 s | Sí |
PauseAllDetections | No | En pausa para los jugadores conectados ahora | 10 s por defecto, máx. 300 s | Sí |
whitelistPlayer | Sí | Sin indicador en el cliente | 3600 s por defecto, -1 = hasta la desconexión | Sí |
AddWhitelist | Sí, por identificador | Sin indicador en el cliente | Hasta reiniciar, o durationSec | Sí |
WhitelistArea | No | Exento | 30 s por defecto | Sí |
AllowWeapon | Solo la comprobación de arma frente a inventario | Sin cambios | 600 s por defecto, máx. 3600 s | Sí |
Client SetExempt, PauseDetections | No | Exento o en pausa en ese cliente | 30 s o 10 s por defecto, máx. 300 s | No (cualquier recurso de cliente) |
Staff y permisos#
Consulta y cambia a quién trata el AC como staff. Las comprobaciones de staff pueden consultar la base de datos, así que llámalas desde un thread o un handler de evento.
isAdmin devuelve true para: un permiso manual con addAdmin; los ACE txadmin, tx.admin, txadmin.menu, txadmin.advanced, command.txadmin, command.ts, command.ban, command.kick, tosun.admin, ts.admin y cualquiera de ts.AdminBypassAces; los principals group.admin, group.superadmin, group.moderator y group.god; command.kick/ban/resources/restart cuando ts.txAdminAuth está activado; identificadores en admins.lua, ts.AdminMenu.allowedIds y ts.AdminBypassIdentifiers; y permisos del panel en la base de datos. Un ACE que también está concedido a builtin.everyone no cuenta.
isAdmin y addAdmin están registrados dos veces en el código fuente. Las versiones de anticheat_server.lua se cargan las últimas y son las que se ejecutan; esta referencia describe esas.
| Export | Parámetros | Devuelve | Qué hace | ¿Requiere recurso de confianza? |
|---|---|---|---|---|
isAdmin | src (pasa un número) | booleano | Estado de administrador según las fuentes listadas arriba. Los resultados de la base de datos se guardan en caché 5 s si son positivos y 30 s si son negativos. No tiene en cuenta ts.AdminBypassDetections. | No |
isStaffPlayer | src | booleano | La comprobación de staff que usan las vías de ban. Las mismas fuentes que isAdmin, más los ACE de comandos de txAdmin (command.kick/ban/resources/restart/screenshot/unban) salvo que ts.txAdminAuth = false. | No |
isAdminMenuAllowed | src | booleano | Si el jugador puede abrir el menú de administración. false cuando el menú está desactivado. Los ACE solo de txAdmin (txadmin, tx.admin), ts.AdminBypassAces y ts.AdminBypassIdentifiers no cuentan. Sin caché: una consulta a la base de datos por llamada. | No |
getAdminType | src | 'tx', 'config' o false | Etiqueta engañosa: todas las vías de administrador positivas activan el mismo indicador, así que el staff casi siempre recibe 'tx', y 'tx' no significa txAdmin. Usa isAdmin en su lugar. | No |
addAdmin | src (pasa un número) | nil; false si se rechaza | Permiso de staff en ejecución: inmunidad frente a sanciones y acceso al menú de administración. No se guarda en la base de datos. No se borra al desconectarse: queda ligado a ese id de servidor hasta removeAdmin o un reinicio. | Sí |
removeAdmin | src | nil; false si se rechaza | Quita el permiso manual y el estado en caché. Los permisos por ACE, txAdmin, admins.lua y panel no se revocan y vuelven a contar en la siguiente comprobación. | Sí |
Whitelist de jugadores y áreas#
Whitelist por id de servidor, whitelist por identificador y áreas con nombre. Las listas de ejecución solo viven en memoria y se pierden al reiniciar; la whitelist del panel es aparte.
| Export | Parámetros | Devuelve | Qué hace | ¿Requiere recurso de confianza? |
|---|---|---|---|---|
whitelistPlayer | src (pasa un número); durationSec? (por defecto 3600; -1 = hasta la desconexión) | nil; false si se rechaza | Inmunidad frente a sanciones del servidor por id de servidor. Sin indicador en el cliente. Se borra al desconectarse. SetPlayerExempt, PausePlayerDetections y BypassDetection la sobrescriben. | Sí |
removeWhitelist | src | nil; false si se rechaza | Termina whitelistPlayer. También termina cualquier inmunidad de servidor de SetPlayerExempt, PausePlayerDetections o BypassDetection. | Sí |
AddWhitelist | target (id de servidor o string de identificador); durationSec? (nil o 0 = hasta reiniciar) | true; false si está vacío o se rechaza | Añade identificadores a la whitelist en memoria (no se guarda en la base de datos). Un id de servidor añade todos los identificadores de ese jugador. Los identificadores se pasan a minúsculas y se quita el prefijo license:, license2:, discord:, steam: o fivem:. Un valor solo con dígitos se interpreta como id de servidor, así que pasa los id de Discord con el prefijo discord:. | Sí |
RemoveWhitelist | target (id de servidor o identificador) | true; false si está vacío o se rechaza | Quita entradas de la whitelist de ejecución. La tabla de la whitelist del panel no se toca. | Sí |
IsWhitelisted | src | booleano | true si algún identificador está en la whitelist de ejecución o en la whitelist del panel en caché. No incluye whitelistPlayer ni SetPlayerExempt. Siempre false con ts.Debug. | No |
refreshPanelWhitelist | ninguno | nil | Recarga ahora la whitelist del panel (consulta síncrona). También se recarga 12 s después del arranque y cada 60 s. | No |
WhitelistArea | src; areaName (no vacío); durationSec? (por defecto 30) | true; false si no es válido o se rechaza | Registra un área con nombre y activa el indicador de exención del cliente. Solo alivio del lado del cliente: ningún módulo del servidor lee el área, así que no hay inmunidad frente a sanciones del servidor. | Sí |
ClearArea | src; areaName? ('' o nil = todas las áreas) | true; false si src es 0 o se rechaza | Quita el área. Con un nombre también reinicia el indicador de exención del cliente, lo que termina también otras exenciones de cliente. Con un nombre vacío el indicador se deja como está. | Sí |
IsInArea | src; areaName? (vacío = cualquier área) | booleano | Con un nombre, comprueba la caducidad. Con un nombre vacío, devuelve true para cualquier entrada, incluidas las caducadas. | No |
Sanciones y bans#
Sanciona a jugadores mediante el flujo del AC, banea a jugadores desconectados y consulta bans. Todos los exports de escritura de aquí necesitan confianza.
| Export | Parámetros | Devuelve | Qué hace | ¿Requiere recurso de confianza? |
|---|---|---|---|---|
punish | src (conectado); reason; image? (URL o datos de la captura); configKey?; punishment? ('BAN', 'KICK' o 'LOG') | nil; false si se rechaza | Ejecuta el flujo completo de sanciones del AC. Los jugadores exentos se omiten. Consulta Cómo elige punish() la sanción. | Sí |
ban | src (conectado); reason | nil; false si se rechaza | El mismo flujo con la clave de configuración 'Banned via Export' y la sanción ts.punishType. No siempre es permanente: la duración es ts.BanDurations['default'] (0 = permanente), y si el dueño puso ts.punishType en KICK o LOG, expulsa o registra en su lugar. Los jugadores exentos se omiten en silencio. | Sí |
BanPlayerExt | src (conectado); reason? (por defecto 'Banned by script') | true si se envía; false si no es de confianza o está desconectado | Igual que ban(). | Sí |
KickPlayer | src (conectado); reason? (por defecto 'Kicked by script') | true; false si no es de confianza o está desconectado | Expulsión simple con el mensaje '[Tosun AC] ' más el motivo. Sin comprobación de exenciones: el staff y los jugadores en whitelist también se expulsan. No se registra nada. | Sí |
offlineBan | data { playername, license, steam, discord, ip, HWID, HWID2 a HWID5 } (identificadores sin prefijo); reason | nil; false si se rechaza | Fila de ban permanente para un jugador desconectado. Los identificadores que faltan se guardan como marcadores que nunca coinciden al conectar. Define siempre data.playername y reason: sin ellos la inserción falla con el sql_mode STRICT y no se avisa a quien llama. Imprime una línea en consola. data = nil lanza un error de Lua. | Sí |
offlineBanByLicense | license (hex sin prefijo o 'license:...'); reason? (por defecto 'Sebep yok', en turco); actor? (por defecto 'panel'); name?; citizenid? | true, banID ('O' + 8 hex); false, 'license required'; false si se rechaza | Ban permanente por licencia más una fila de historial en ac_offline_bans. Devuelve antes de que terminen las escrituras en la base de datos, así que no se informa de errores de la base de datos. No expulsa a un jugador que esté conectado. Una licencia que no sea string lanza un error de Lua. | Sí |
unban | banID | siempre nil | Asíncrono: si el ban existe, lo borra, envía un log de Discord al webhook del menú de administración y dispara el evento de servidor ts_anticheat:playerUnbanned. Las filas de historial de ac_offline_bans se conservan. | Sí |
getBans | limit? (por defecto 100, sin tope); offset? (por defecto 0) | filas de ban, las más recientes primero | Filas completas, incluidas las columnas de IP, licencia, Steam, Discord y HWID. Consulta síncrona. | No |
getBanInfo | banID | fila de ban completa o nil | Consulta síncrona. | No |
Cómo elige punish() la sanción#
punish(), ban() y BanPlayerExt() comparten un mismo flujo. Este es el orden que sigue.
- El staff se omite cuando ts.AdminBypassDetections no es false. Los jugadores con una exención activa o en la whitelist de ejecución o del panel se omiten. ts.Debug desactiva estas omisiones. Las llamadas omitidas no hacen nada ni registran nada.
- El jugador debe estar conectado. Si no, se imprime un error en la consola del servidor y no pasa nada.
- Sanción: gana un argumento punishment válido. Si no, ts.DetectionPunishments[configKey], luego su alias, luego la clave de detección, luego ts.punishType y luego BAN.
- Cada resultado dispara el evento de servidor ts_anticheat:playerBanned, publica un mensaje de chat cuando ts.chatMessages está activado, añade una infracción en la nube y escribe el log del AC y el log en directo.
- LOG: envía el log con la captura a Discord.
- KICK: vuelve a comprobar el staff sin importar ts.AdminBypassDetections, así que el staff nunca se expulsa. Luego envía el log con la captura y expulsa al jugador.
- BAN: inserta el ban con una duración de ts.BanDurations en horas (configKey, alias, clave de detección, prefijo y luego default; 0 = permanente) y bannedBy 'anticheat:' más la clave. Dispara ts_anticheat:banCommitted, avisa al panel y expulsa al jugador (se reintenta tras 3 s).
exports['tosun-ac']:punish(src, 'Money exploit', nil, 'my_shop_exploit', 'BAN')Moderación de un solo jugador#
Actúan sobre un jugador. Lee con atención la columna de confianza: varios de estos no tienen comprobación de confianza.
| Export | Parámetros | Devuelve | Qué hace | ¿Requiere recurso de confianza? |
|---|---|---|---|---|
freezePlayer | src (conectado); freeze (booleano) | true; false si está desconectado | Congela o descongela al jugador y publica un aviso de chat traducido. El indicador de congelado no se borra al desconectarse. | No |
isPlayerFrozen | src | booleano | Solo refleja freezePlayer, no massFreeze. | No |
slayPlayer | src (conectado) | true; false si está desconectado | Mata al jugador en su cliente y muestra una notificación. | No |
warnPlayer | src (conectado); reason?; actor? (por defecto 'console') | true; false si está desconectado | Advertencia por chat al jugador y una fila en ac_player_warnings. | No |
mutePlayer | src (conectado); durationSec? (número; nil o 0 = permanente); reason?; actor? (por defecto 'system') | true; false si está desconectado | Bloquea los eventos chatMessage heredados del jugador y guarda una fila en ac_player_mutes. Los mutes temporales terminan en los 15 s siguientes a su caducidad. Un mute permanente no se borra al desconectarse y pasa al siguiente jugador que reciba el mismo id de servidor, hasta unmutePlayer o un reinicio. Los avisos de chat al jugador están en turco fijo en el código. | No |
unmutePlayer | src | true; false si src es nil | Quita el mute y avisa al jugador si está conectado (aviso de chat en turco fijo en el código). | No |
isPlayerMuted | src | booleano | Solo lectura. | No |
setPlayerHealth | src (conectado); hp? (por defecto 100, de 0 a 200) | true; false si está desconectado o se rechaza | Fija la salud en el cliente y pone la salud máxima en 200. | Sí |
setPlayerArmor | src (conectado); armor? (por defecto 0, de 0 a 100) | true; false si está desconectado o se rechaza | Fija la armadura en el cliente. | Sí |
giveWeapon | src (conectado); weapon? (por defecto 'WEAPON_PISTOL'); ammo? (por defecto 60) | true; false si está desconectado o se rechaza | Usa ox_inventory si está iniciado; si no, el inventario de QB (solo framework 'qb' o 'qbox', no 'qbcore'); si no, addWeapon de ESX; si no, una entrega nativa. Devuelve true incluso cuando el inventario rechazó el objeto. No llama a AllowWeapon, así que un arma entregada de forma nativa puede ser marcada por la comprobación de arma frente a inventario (acción por defecto log). | Sí |
stripWeapons | src (conectado) | true; false si está desconectado o se rechaza | Quita todas las armas del ped. Los objetos del inventario no se tocan. | Sí |
clearInventory | src (conectado) | true; false si está desconectado o se rechaza | Vacía el inventario con ox_inventory. Sin ox_inventory solo muestra una notificación y no vacía nada, pero aun así devuelve true. | Sí |
spectatePlayer | adminSrc; targetSrc | true; false si un argumento es nil o el objetivo no tiene ped | No es un modo espectador real: teletransporta a adminSrc hasta el objetivo. Cada llamada también da a adminSrc una exención de movimiento de 15 s sin presupuesto. | No |
Acciones para todo el servidor#
Acciones que afectan a todos los jugadores o a todas las conexiones nuevas.
| Export | Parámetros | Devuelve | Qué hace | ¿Requiere recurso de confianza? |
|---|---|---|---|---|
lockdownStatus | ninguno | active (booleano), reason (string) | Solo lectura. | No |
setLockdown | state (booleano); reason (pasa un string al activarlo) | nil; false si se rechaza | Mientras está activo, toda conexión nueva se rechaza con un mensaje LOCKDOWN y el motivo. No hay excepción para el staff. Solo en ejecución. Envía una línea al chat. Llamarlo con state true y sin motivo activa el lockdown y luego lanza un error de Lua. | Sí |
emergencyLockdown | reason? (el motivo del lockdown por defecto es 'Acil durum', en turco) | número de jugadores expulsados; false si se rechaza | Activa el lockdown y expulsa a todos los jugadores que no son staff con un mensaje traducido. | Sí |
massFreeze | state (booleano) | número de jugadores; false si se rechaza | Congela o descongela a todos los jugadores, staff incluido, y envía una línea al chat. La línea de chat está en turco fijo en el código. | Sí |
healAll | ninguno | número de jugadores a los que se envió la curación; false si se rechaza | Pone la salud al máximo y la armadura en 100 para cada jugador con ped. | Sí |
setSpeedLimit | kmh (0 lo desactiva) | el límite aplicado; false si se rechaza | Limita la velocidad de los vehículos para los jugadores conectados ahora. Los jugadores que entran después no reciben el límite. | Sí |
applyWeatherWithFramework | weather (no se valida) | true, lista de métodos probados | Prueba qb-weather, Renewed-Weathersync, cd_easytime, luego wd_weather, weathersync, vSync y qb-weathersync; si no, lo envía a todos los clientes. Solo existe cuando el menú de administración está activado. | No |
applyTimeWithFramework | hour; minute (sin límites) | true, lista de métodos probados | La misma cadena de alternativas para la hora. Solo existe cuando el menú de administración está activado. | No |
Cuarentena y protección de payloads#
Aísla a un jugador sospechoso y protege tus propios eventos de red frente a payloads de crash y spam.
| Export | Parámetros | Devuelve | Qué hace | ¿Requiere recurso de confianza? |
|---|---|---|---|---|
quarantine | src (conectado); reason? (por defecto 'supheli davranis', en turco); seconds? (por defecto 300, de 30 a 1800) | true (también si ya estaba retenido); false para jugadores exentos o no válidos, fallo del bucket o quien llama no es de confianza | Mueve al jugador a un routing bucket aislado (por defecto 9001 a 9500, bloqueo estricto de entidades, sin población). Registra una detección QUARANTINE y publica un aviso de chat al jugador salvo que notifyPlayer = false. El aviso está en turco fijo en el código. Se libera automáticamente al caducar. | Sí |
releaseQuarantine | src | true si se libera; false si no estaba retenido o se rechaza | Restaura el routing bucket original, lo registra y avisa al jugador (aviso de chat en turco fijo en el código, salvo que notifyPlayer = false). | Sí |
isQuarantined | src | booleano | Solo lectura. | No |
quarantineList | ninguno | { id, name, reason, remaining }[] (remaining en segundos) | Solo lectura. | No |
crashGuardInspect | value (cualquier payload) | nil si es seguro; si no, una descripción del problema en turco | Busca números NaN/Inf, vectores no válidos, strings de más de 32768 caracteres, anidamiento de más de 8 niveles, más de 2000 elementos, unos 64 KB en total, claves de más de 512 caracteres, tipos no soportados y recursión. Sin efectos secundarios. | No |
crashGuardReject | src (conectado); payload | true si el payload es malo (descártalo); false si está limpio o src no es válido | La misma comprobación más un strike para el jugador. 3 strikes en 60 s aplican ts.crashGuard.action: 'kick' (por defecto), 'ban' o cualquier otro valor = solo consola y log. Los jugadores exentos se omiten. | No |
RateLimit | src; key? (por defecto 'default'); max? (por defecto 10, mín. 1); windowMs? (por defecto 10000, mín. 100) | true = permitido; false = por encima del límite | Contador de ventana fija por jugador y clave. Las claves las comparten todos los recursos, así que ponles como prefijo el nombre de tu recurso. src 0 o no válido siempre devuelve true. Se borra al desconectarse. | No |
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
-- gestiona la compra
end)Jugadores y detecciones#
Busca jugadores, identificadores, bans por jugador, puntuaciones de amenaza y cuentas vinculadas. Algunos resultados contienen datos personales como direcciones IP.
| Export | Parámetros | Devuelve | Qué hace | ¿Requiere recurso de confianza? |
|---|---|---|---|---|
GetPlayerInfo | src (conectado) | { id, name, ping, license, discord, steam, citizenid, isAdmin, coords, endpoint } o nil | Identificadores sin prefijo (license recurre a license2 si falta). endpoint es la IP del jugador. citizenid solo se rellena con el framework 'qb', 'qbcore' o 'esx'; está vacío en 'qbox'. isAdmin puede consultar la base de datos. | No |
GetNearbyPlayers | src; radius? (por defecto 30.0) | { id, name, distance }[] | Jugadores cerca de src según la posición del ped en el servidor (OneSync), sin incluir a src. | No |
getOnlinePlayers | ninguno | { id, name, ping, license, discord, steam, isAdmin }[] | Aquí los identificadores conservan su prefijo (license:..., discord:..., steam:...). isAdmin puede consultar la base de datos para cada jugador. | No |
GetDetections | src (conectado); limit? (por defecto 25) | { banID, reason, banDate, banUntil }[] o {} | Nombre histórico: devuelve las filas de BAN del jugador buscadas por licencia, no detecciones. | No |
GetCloudThreatScore | src | de 0 a 100 | Puntuación para mostrar: 8 por infracción de sesión (máx. 40, solo mientras la última tenga menos de 10 minutos), 10 por cada check-in de Shield perdido (máx. 30) y 12 por punto de amenaza del native guard (máx. 30). 0 cuando ts.cloudBridge.enabled = false. | No |
NoteCloudViolation | src; reason?; punishment? ('LOG', 'KICK' o 'BAN') | nil | Añade una infracción a la puntuación del jugador; no hace nada cuando ts.cloudBridge.enabled = false. Cada nota KICK o BAN suma 25 a la puntuación de inteligencia (máx. 100, mientras la última tenga menos de 10 minutos); a partir de 50 la licencia se reporta a la base de datos de amenazas entre servidores del panel (necesita la URL y el token del panel). Las entradas posteriores solo se bloquean cuando ts.cloudBridge.threatIntelAction = 'kick' (por defecto 'log'). El AC ya lo llama en cada sanción. | No |
ForensicLinksOf | license (hex sin prefijo, sin license:) | licencias vinculadas (lista de strings); {} si es desconocida | Encuentra cuentas secundarias que comparten valores de Steam, Discord o HWID (IP solo con ts.forensics.linkByIp = true), hasta ts.forensics.maxHops (por defecto 3, máx. 5). Consultas bloqueantes. Funciona con forensics desactivado, pero entonces no se registran vínculos nuevos. | No |
checkIpReputation | ip | { vpn, proxy, hosting, country, org, expiresAt } o nil | Solo lee la caché. Solo devuelve datos de IP comprobadas al conectar dentro de ts.v12.ipCheckCacheHours (24). Sin consulta en vivo. | No |
webBridgeFindByLicense | license (string, con o sin license:) | id de servidor conectado o nil | Encuentra a un jugador conectado. En la práctica coincide exactamente con cualquier identificador, por ejemplo license2:... o discord:.... | No |
webBridgeFindByCitizen | cid (citizenid de QB o identificador de ESX) | id de servidor conectado o nil | Solo funciona con el framework 'qb', 'qbcore' y 'esx'; devuelve nil en 'qbox'. | No |
Notificaciones e idioma#
Envía notificaciones al teléfono y usa las tablas de traducción del AC. phoneNotify y phoneNotifyAdmins solo existen cuando ts.AdminMenu.enable está activado.
| Export | Parámetros | Devuelve | Qué hace | ¿Requiere recurso de confianza? |
|---|---|---|---|---|
phoneNotify | src (conectado); title; body; opts? { icon, color, app } | true; false si está desconectado | Envía al primer teléfono iniciado: qb-phone, qs-smartphone, lb-phone, yseries, gks_phone, npwd o roadphone; si no, al chat. El teléfono se detecta una sola vez, así que un teléfono iniciado más tarde se ignora hasta reiniciar. | No |
phoneNotifyAdmins | title; body; opts? | nil | phoneNotify a todos los miembros del staff conectados. Puede consultar la base de datos para cada jugador. | No |
getPlayerLocale | src | código de idioma; por defecto ts.Locale ('tr') | Solo lectura. Solo del lado del servidor. | No |
setPlayerLocale | src; lang (2 o 3 letras minúsculas con un archivo de locales) | true si se fija; false en otro caso | Fija el idioma del jugador en el servidor. A diferencia del comando ts_setlang, no sincroniza el idioma con el cliente. Se borra al desconectarse. | No |
translate | key; ... (valores para {0}, {1}, o una tabla para {name}) | string traducido; alternativa en inglés; la propia clave si falta | Usa ts.Locale. Un código final de 2 o 3 letras con archivo de idioma selecciona el idioma. Las plantillas que usan %s se devuelven sin formatear; formatéalas tú. | No |
translateForPlayer | src; key; ... | string en el idioma del jugador | Como translate, pero con el idioma del jugador. Sin código de idioma al final. | No |
Capturas de pantalla#
Pide capturas de los jugadores para el panel. Los exports del AC que escriben logs son internos y no aparecen aquí.
| Export | Parámetros | Devuelve | Qué hace | ¿Requiere recurso de confianza? |
|---|---|---|---|---|
v6ScreenWatchRequest | serverId (conectado); mode? (por defecto 'once'); requestedBy? (por defecto 'panel'); panelUrl?; forceBase64? | id de petición; o nil, 'invalid_id'; o nil, 'offline' | Pone una captura en cola y pide al cliente que la suba al panel con un token por subida. Un panelUrl debe ser https y coincidir con ts_public_panel_url o ts.webPanelURL; si no, no se pide nada al cliente. Las peticiones pendientes caducan a los 30 s y se eliminan a los 90 s. | No |
v6ScreenWatchPoll | rid | { pending = true } mientras está pendiente; si no, la entrada con status ('done', 'failed' o 'expired') y url; o nil, 'not_found' | Solo lectura. | No |
v6ScreenWatchLatest | serverId | última entrada de petición o nil | Solo lectura. | No |
RequestShieldScreenshot | src (conectado) | true; false si está desconectado | Pide una captura al Shield del cliente (petición válida 60 s). Una respuesta firmada se envía al panel y dispara el evento de servidor ts_anticheat:shield:screenshot_saved(src, b64). | No |
screenCapture | src (conectado); requestedBy? (por defecto 'panel') | true; false si está desconectado | Heredado. Necesita el recurso screenshot-basic y el convar ts_screen_upload definido con setr (por defecto http://localhost/api/screen_upload.php). El AC no guarda el resultado. Usa v6ScreenWatchRequest o RequestShieldScreenshot en su lugar. | No |
Estado y diagnóstico#
Consulta el estado del AC para paneles de control y comprobaciones de salud.
| Export | Parámetros | Devuelve | Qué hace | ¿Requiere recurso de confianza? |
|---|---|---|---|---|
GetStatus | ninguno | { version, online, detections, debug, framework } | version es la versión del recurso de fxmanifest. detections solo cuenta reportes de un canal de cliente heredado sin firmar y se queda cerca de 0 con la firma activada (por defecto); no es un recuento de detecciones ni de bans. No hay campo de tiempo en marcha (uptime). | No |
getConfig (server) | configType? ('webhooks' o cualquier otro valor) | copia saneada de la configuración; para 'webhooks', la tabla Webhooks para quien llama de confianza y {} para los demás | La copia quita las funciones, las claves que contienen secret, password, token o webhook, las claves que terminan en key (excepto los nombres que terminan en hotkey y el nombre key a secas) y todo lo anidado a más de 6 niveles. En caché durante 5 s. | Solo para 'webhooks' |
licenseStatus | ninguno | { checked, ok, reason, serverId, licenseSet } | Estado del bloqueo de licencia. reason es 'disabled' cuando ts.licenseLock.enabled no es true, y 'not_checked' antes de la primera comprobación, 1,5 s después del arranque. | No |
GetServerAuthorityStatus | ninguno | { enabled, checks = { [id] = { available, enabled, action } } } | Muestra qué comprobaciones con autoridad en el servidor admite esta build del servidor y cómo están configuradas. Ids: superJump, damageMod, meleeMod, defenseMod, weapon, godmode, invisible, noclip, focus. | No |
getRuntimeStats | ninguno | { uptime_sec, connect_buckets, subnet_buckets, license_tracking } | Contadores del endurecimiento de conexiones. | No |
getBatchStats | ninguno | { log_pending, detection_pending, webhook_pending } | Tamaños de las colas del escritor por lotes de 5 s. | No |
getCleanupStats | ninguno | { runs, last_run_at, last_summary, cleaned } | Solo lectura. | No |
runCleanup | ninguno | la tabla de estadísticas; false si se rechaza | Ejecuta ahora la limpieza por retención: filas antiguas de jugadores conectados, detecciones antiguas, logs de administración, auditoría del panel, reputación de IP, colas de comandos y capturas, intentos de inicio de sesión y sesiones caducadas (límites según los ajustes keep de ts.v12). Los borrados son asíncronos, así que las estadísticas devueltas todavía no incluyen esta ejecución. | Sí |
Resource guard#
Consulta y cambia la base de recursos aprobados. Todos estos exports se registran aunque el resource guard esté desactivado.
| Export | Parámetros | Devuelve | Qué hace | ¿Requiere recurso de confianza? |
|---|---|---|---|---|
getBaseline | ninguno | { [resource] = { manifest_hash, deep_hash } } | La base aprobada. | No |
getResources | ninguno | { [resource] = true } | Recursos conocidos. | No |
getSuspicious | ninguno | { [resource] = { reason, state, hash, manifest, at } } | Recursos marcados como cambiados o sospechosos. | No |
getStats | ninguno | { lastScan, violations, driftedResources } | Contadores del guard. | No |
rescanResources | ninguno | estado completo del guard (ready, resources, hashes, suspicious, drift_count, violation_count, last_scan y más) | Reconstruye la instantánea de recursos de forma síncrona. | No |
approveResource | resourceName; approvedBy? (por defecto 'web_panel') | true; false, 'resource_missing'; false si se rechaza | Añade el hash actual del manifest a la base, borra los indicadores de sospechoso y bloqueado, lo guarda en la base de datos y actualiza todos los clientes. | Sí |
blockResource | resourceName; reason? (por defecto 'Manuel blok', en turco) | true; false si se rechaza | Marca el recurso como bloqueado, lo quita de la base, lo guarda en la base de datos y lo detiene si está iniciado. | Sí |
tsAutoSetup | ninguno | true (también si ya hay una instalación en marcha); false si se rechaza | Igual que el comando de consola tosunac_setup: detecta el framework, ejecuta el escaneo de backdoors (límite de 120 s) y el escaneo de firmas, aprueba solo los recursos iniciados cuyos resultados de backdoors y firmas estén completos, limpios y sin cambios, y luego ejecuta el escaneo de eventos. Se cancela sin aprobar nada si el backdoor guard está desactivado u ocupado. | Sí |
Escaneos de firmas, backdoors y eventos#
Ejecuta escaneos y gestiona firmas, excepciones de falsos positivos y omisiones de escrow. Los escaneos pueden tardar; ejecútalos desde un thread.
| Export | Parámetros | Devuelve | Qué hace | ¿Requiere recurso de confianza? |
|---|---|---|---|---|
scanAllResources | ninguno | { total, scanned, infected, clean, errors, cached, skipped }; o nil, 'already_scanning' | Escaneo de firmas de todos los recursos. Cede el hilo. Reinicia la lista de infectados. Bloquea los recursos infectados cuando ts.ResourceGuard.autoBlockInfected está activado. | No |
scanSingleResource | name | infected (booleano), reason | reason es uno de self, escrow_signature_skip, whitelisted, snapshot_unavailable, incomplete, clean, cached_clean, infected, cached_infected, blocked. Puede ceder el hilo. | No |
getInfectedFiles | ninguno | mapa de archivos infectados | Resultado del último escaneo. | No |
addCheatSignature | pattern (patrón de nombre de recurso); signatureName?; severity? (por defecto 'critical') | true; false si está vacío o se rechaza | Añade el patrón en memoria y en la base de datos. severity: info (bajo), warning (medio), low, medium, high o critical; los valores desconocidos pasan a high. | Sí |
invalidateSignatureCache | ninguno | true | Vacía la caché de patrones y los resultados de escaneo guardados, así que el siguiente escaneo vuelve a leer todos los recursos. | No |
reloadSignatureExceptions | ninguno | true | Invalida las cachés de excepciones y de omisiones de escrow y los resultados de escaneo guardados. Se recargan en el siguiente uso. | No |
reloadSignatureScanCaches | ninguno | true | Recarga ahora desde la base de datos los patrones, la whitelist, las excepciones y las omisiones de escrow. | No |
addSignatureEscrowSkip | resourceName; note? | true; false si está vacío, no hay MySQL o se rechaza | Omite todo el escaneo de firmas para ese recurso (para código con escrow). | Sí |
removeSignatureEscrowSkip | idOrName (id de fila o nombre de recurso) | true; false si no es válido, no hay MySQL o se rechaza | Quita la omisión de escrow. | Sí |
addSignatureException | resourceName; filePath? ('' = todos los archivos); signatureName; note? | true; false si faltan campos, no hay MySQL o se rechaza | Marca un acierto de firma en ese recurso como falso positivo. | Sí |
removeSignatureException | id (número) | true; false si no es numérico, no hay MySQL o se rechaza | Borra la excepción. | Sí |
tsScanBackdoors | callback?(report) con report = { complete, resources, finished_at, trigger } | true si se inicia; false si ya hay un escaneo en marcha | Ejecuta el escaneo de backdoors en un thread. Los hallazgos van a la base de datos y al panel. Con ts.BackdoorGuard.autoQuarantine activado, los aciertos críticos detienen el recurso. | No |
tsScanEvents | ninguno | true si se inicia; false si ya hay un escaneo en marcha | Construye un inventario estático de eventos y triggers de todos los recursos y lo envía al panel. | No |
Eventos honeypot#
Convierten nombres de evento en trampas o los liberan. Ambos escriben en ac_protected_events y recargan desde la base de datos.
| Export | Parámetros | Devuelve | Qué hace | ¿Requiere recurso de confianza? |
|---|---|---|---|---|
fakeTriggerTrap | eventName; type ('client' o 'server') | true si se envía; false si no es de confianza o el tipo no es válido | Convierte el evento en un honeypot (active = 1). Reinicia el AC (ensure tosun-ac) para que tenga efecto completo. | Sí |
fakeTriggerWhitelist | eventName | true si se envía (también para un nombre vacío, que no hace nada); false si no es de confianza | Desactiva el honeypot de ese evento (active = 0). Los handlers que ya están registrados pueden necesitar un reinicio del AC; la consola lo indica. | Sí |
Exports que dependen de una función#
Estos exports solo se registran cuando su función está activada. Si la función está desactivada, llamarlos lanza un error.
| Exports | Solo se registran cuando |
|---|---|
quarantine, releaseQuarantine, isQuarantined, quarantineList | ts.quarantine.enabled no es false |
crashGuardInspect, crashGuardReject | ts.crashGuard.enabled no es false |
runCleanup, getCleanupStats | ts.v12.enableAutoCleanup no es false |
tsScanBackdoors | ts.BackdoorGuard.enabled no es false |
tsScanEvents | ts.EventScanner.enabled no es false |
applyWeatherWithFramework, applyTimeWithFramework | el menú de administración está activado (ts.AdminMenu existe y ni enable ni enabled es false) |
phoneNotify, phoneNotifyAdmins | ts.AdminMenu.enable está activado |
Exports del lado del cliente#
Llámalos desde scripts de cliente. Cualquier recurso de cliente puede llamarlos; no hay comprobación de confianza. Solo afectan a las comprobaciones de ese cliente y nunca cambian la aplicación de sanciones del servidor.
| Export | Parámetros | Devuelve | Qué hace | ¿Requiere recurso de confianza? |
|---|---|---|---|---|
SetExempt (client) | state (booleano); durationMs? (por defecto 30000, máx. 300000); reason? (clave, por defecto 'unknown') | nil | Añade o quita una exención local con ese motivo. Una concesión nueva sustituye la hora de fin para el mismo motivo. La mayoría de las comprobaciones de cliente se omiten mientras está activa; las detecciones que aun así llegan a la vía de ban del cliente se rebajan a entradas LOG etiquetadas [exempt]. state = false quita solo ese motivo. | No |
PauseDetections | durationMs? (por defecto 10000, máx. 300000) | nil | Pausa las comprobaciones locales del cliente. Cada llamada sustituye la hora de fin, así que PauseDetections(0) termina una pausa y un valor más corto la acorta. | No |
IsPlayerAdmin | ninguno | booleano | Indicador local de staff, actualizado cada 2 s a partir del estado de administrador verificado por el servidor, no de un state bag que el cliente pueda escribir. | No |
IsExempt | ninguno | booleano | true si el jugador es staff, hay una exención o pausa del servidor activa, PauseDetections está activo o hay algún motivo de SetExempt activo. | No |
GetExemptions | ninguno | { [reason] = remainingMs } | Solo lista los motivos de SetExempt y el state bag tsAcExempt. No muestra PauseDetections, las exenciones del servidor ni el estado de staff; usa IsExempt para la respuesta completa. | No |
SetSpawned | state (booleano) | nil | true marca al jugador como spawneado. false pausa las comprobaciones de movimiento y visuales, por ejemplo en la selección de personaje; se respeta como máximo una vez cada 5 minutos, y las comprobaciones se reanudan tras unos 30 s de movimiento visible normal. | No |
getConfig (client) | ninguno | tabla de configuración del cliente | Solo se sincronizan con los clientes los ajustes seguros para el cliente. | No |
-- selección de personaje
exports['tosun-ac']:SetSpawned(false)
-- ... el jugador elige un personaje ...
exports['tosun-ac']:SetSpawned(true)Exports de JavaScript#
Tosun AC registra algunos exports de JavaScript en el servidor para el escaneo de recursos y la verificación de la licencia. Son internos, no pasan por la comprobación de recurso de confianza y no son una API soportada. No los llames. No hay exports de JavaScript públicos.
Archivos del bridge: configuración#
Los archivos opcionales del bridge en tosun-ac/bridge dan a tu recurso una tabla global TosunAC con funciones auxiliares cortas. Llaman a los exports dentro de pcall, así que tu script sigue funcionando cuando el AC está detenido. El AC ve a tu recurso como quien llama.
- Añade el bridge al fxmanifest.lua de tu recurso: server_script '@tosun-ac/bridge/tosun_ac_server.lua' y, si hace falta, client_script '@tosun-ac/bridge/tosun_ac_client.lua'.
- Si la carpeta del AC tiene otro nombre, añade setr tosun_ac_resource "folder-name" a server.cfg. Usa setr: el bridge de cliente lee este convar en el cliente.
- Opcional: set tosun_ac_bridge_server_ms (por defecto 60000), set tosun_ac_bridge_cooldown_ms (por defecto 750, 0 lo desactiva) y setr tosun_ac_bridge_client_ms (por defecto 60000).
- Para exenciones completas en el servidor, añade tu recurso a tosun_ac_trusted_resources. Sin confianza, TosunAC.PlayerExempt recurre a una exención suave e imprime una sugerencia una sola vez en la consola del servidor (el texto de la sugerencia está en turco).
-- fxmanifest.lua de tu recurso
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"
-- script de servidor
local ok, mode = TosunAC.PlayerExempt(src, 'long', 'clothing')
-- mode es 'full' (de confianza) o 'soft' (solo movimiento, máx. 15 s)Bridge: funciones auxiliares de servidor#
Definidas por bridge/tosun_ac_server.lua dentro de tu recurso. Presets: SHORT 30000, MEDIUM 60000, LONG 120000, XL 180000 ms (TosunAC.Presets). TosunAC.Version es '1.2'.
| Export | Parámetros | Devuelve | Qué hace | ¿Requiere recurso de confianza? |
|---|---|---|---|---|
TosunAC.MarkTeleport | playerId (1 o mayor); durationMs? (por defecto 8000) | true solo si el export devolvió true | Llama a MarkTeleport con el motivo 'bridge:teleport'. | No (si tu recurso no es de confianza, se aplica el presupuesto de MarkTeleport por jugador) |
TosunAC.PlayerExempt | playerId; durationMs (de 500 a 300000), nombre de preset o nil (= tosun_ac_bridge_server_ms); tag? (por defecto el nombre de tu recurso) | true, 'full'; true, 'soft'; o false | Prueba SetPlayerExempt. Si se rechaza, recurre a MarkTeleport durante hasta 15 s. Un cooldown por jugador (por defecto 750 ms, compartido con PlayerExemptPreset) devuelve un único false. En modo auditoría el resultado es 'full' incluso para recursos no listados. | Solo para 'full' |
TosunAC.PlayerExemptPreset | playerId; presetName? (por defecto 'MEDIUM', sin distinguir mayúsculas de minúsculas); tag? | igual que PlayerExempt | PlayerExempt con una duración de preset. Los nombres desconocidos usan MEDIUM. Ignora tosun_ac_bridge_server_ms. | Solo para 'full' |
TosunAC.PlayerExemptOff | playerId; tag? (el AC no lo usa) | true si se acepta | Llama a SetPlayerExempt(playerId, false). Los recursos no fiables reciben false, y una ventana suave no se termina. | Sí |
TosunAC.IsTrusted | ninguno | booleano | GetIntegrationStatus().trusted. Devuelve false para recursos no listados incluso en modo auditoría, donde las llamadas protegidas siguen pasando. | No |
TosunAC.IsAvailable | ninguno | booleano | true cuando el recurso del AC está iniciado. | No |
Bridge: funciones auxiliares de cliente#
Definidas por bridge/tosun_ac_client.lua dentro de tu recurso. Envuelven el export de cliente SetExempt, así que solo dan alivio del lado del cliente.
| Export | Parámetros | Devuelve | Qué hace | ¿Requiere recurso de confianza? |
|---|---|---|---|---|
TosunAC.Exempt | durationMs (de 500 a 300000), nombre de preset o nil (= tosun_ac_bridge_client_ms); tag? (por defecto el nombre de tu recurso) | nil | Llama al SetExempt de cliente con la clave 'bridge:' más el tag. | No |
TosunAC.ExemptOff | tag? (debe coincidir con el tag usado en Exempt) | nil | Quita esa exención. | No |
TosunAC.ExemptPreset | name? (por defecto 'MEDIUM') | nil | Exempt con una duración de preset y el tag por defecto. Sin parámetro tag. | No |
TosunAC.RunWithExempt | durationMs; tag; fn | true más los resultados de fn; false, err; o false si fn no es una función | Exime, ejecuta fn dentro de pcall y luego llama a ExemptOff(tag). | No |
TosunAC.RunWithExemptPreset | presetName; fn | igual que RunWithExempt | RunWithExempt con una duración de preset y el tag por defecto. | No |
TosunAC.IsAvailable | ninguno | booleano | true cuando el recurso del AC está iniciado. | No |
tosun-ac:bridge:clientExempt (net event) | durationMs?; tag? | nada | Se registra dentro de cada recurso que incluye el bridge de cliente. Un script de servidor puede enviarlo con TriggerClientEvent para ejecutar TosunAC.Exempt en ese cliente. Si varios recursos incluyen el bridge, cada uno aplica su propia exención. Nada en tosun-ac lo envía. | No (scripts de servidor, o scripts de cliente locales con TriggerEvent) |
Exports que cualquier recurso puede llamar#
Estos exports no tienen comprobación de confianza y tienen efectos secundarios. Cualquier recurso del servidor puede llamarlos. Ejecuta solo recursos en los que confíes; ten en cuenta que cualquier recurso del servidor ya puede expulsar jugadores o disparar eventos de cliente mediante las natives de FiveM.
- MarkTeleport: exención de movimiento, limitada por el presupuesto por jugador.
- spectatePlayer: teletransporta a un jugador y concede en cada llamada una exención de movimiento de 15 s sin presupuesto.
- NoteCloudViolation: sube la puntuación de amenaza de un jugador y puede reportar la licencia a la base de datos de amenazas entre servidores.
- warnPlayer y mutePlayer: escriben registros de advertencias y mutes.
- freezePlayer y slayPlayer: actúan directamente sobre un jugador.
- crashGuardReject: añade strikes que pueden expulsar o banear.
- screenCapture, v6ScreenWatchRequest y RequestShieldScreenshot: piden capturas.
- rescanResources, scanAllResources, scanSingleResource, tsScanBackdoors y tsScanEvents: inician escaneos. scanAllResources puede bloquear y tsScanBackdoors puede detener recursos cuando el autobloqueo o la autocuarentena están activados.
- applyWeatherWithFramework y applyTimeWithFramework: cambian el clima y la hora para todos.
- invalidateSignatureCache, reloadSignatureExceptions, reloadSignatureScanCaches y refreshPanelWhitelist: recargan cachés.
- setPlayerLocale y unmutePlayer: cambian el estado del jugador.
- phoneNotify y phoneNotifyAdmins: envían mensajes al teléfono o al chat de los jugadores.
Nombres heredados y engañosos#
Estos exports siguen funcionando, pero sus nombres o la documentación antigua sugieren algo que no hacen.
- Las guías antiguas (INTEGRATION.md de la 9.6.6, CONFIG-EXPORTS-MULTILANG.md de la 8.6.1 y el archivo de redirección TOSUN-AC-EXPORTS.md) están desactualizadas. Donde difieren, esta referencia coincide con el código de la 9.6.15.
- SetPlayerExempt, PausePlayerDetections, PauseAllDetections, BypassDetection, AddWhitelist, RemoveWhitelist, WhitelistArea, ClearArea, addAdmin, fakeTriggerTrap y fakeTriggerWhitelist necesitan un recurso de confianza, aunque CONFIG-EXPORTS-MULTILANG.md los lista sin ese requisito.
- La lista de confianza por defecto es qbx_core, qb-core, es_extended, ox_inventory y ox_lib. INSTALLER-READY.md omite qb-core y es_extended.
- GetIntegrationStatus() también devuelve un campo version.
- punish, ban, BanPlayerExt, KickPlayer, offlineBan y offlineBanByLicense necesitan un recurso de confianza.
- ban() y BanPlayerExt() siguen ts.punishType y ts.BanDurations['default'], así que no siempre son permanentes.
- KickPlayer no comprueba exenciones. En el flujo de punish, KICK siempre respeta al staff, mientras que BAN y LOG siguen ts.AdminBypassDetections.
- Durante una exención de cliente, la mayoría de las comprobaciones de cliente se omiten por completo. Solo las detecciones que aun así llegan a la vía de ban se convierten en entradas LOG etiquetadas [exempt].
- NoteCloudViolation solo bloquea entradas posteriores con ts.cloudBridge.threatIntelAction = 'kick'.
- Con el bridge de cliente, los convars tosun_ac_resource y tosun_ac_bridge_client_ms deben definirse con setr, no con set.
- El tope por llamada de MarkTeleport (ts.Integration.markTeleportMaxMs) también se aplica a quien llama siendo de confianza. Solo el presupuesto de 180 s cada 10 minutos es para quien llama sin ser de confianza.
| Export | Qué debes saber | Usa en su lugar |
|---|---|---|
BypassDetection | La clave de detección se ignora. Concede una exención completa de 0,5 a 60 s. | SetPlayerExempt con una duración corta, o MarkTeleport para teletransportes |
GetDetections | Devuelve las filas de ban del jugador, no detecciones. | getBans o getBanInfo |
getAdminType | 'tx' no significa txAdmin; el staff casi siempre recibe 'tx'. | isAdmin o isStaffPlayer |
SetExempt (server) | Alias de SetPlayerExempt(src, true, ...). Los argumentos son distintos de los del SetExempt de cliente. | SetPlayerExempt |
WhitelistArea | Solo alivio del lado del cliente; sin inmunidad frente a sanciones del servidor. | SetPlayerExempt para inmunidad en el servidor |
screenCapture | El AC no guarda el resultado. | v6ScreenWatchRequest o RequestShieldScreenshot |
GetStatus().detections | No es un recuento de detecciones ni de bans. | No lo uses como contador |
isAdmin, addAdmin | Registrado dos veces en el código fuente. Se ejecutan las versiones de anticheat_server.lua. | Llámalos con normalidad |