API, exports y seguridad
1. Creación de Alertas de Despacho (Diferenciación Arquitectónica)
VARGAS MDT separa estrictamente los contextos de ejecución para evitar cualquier tipo de suplantación de identidad (caller spoofing) o inyección de coordenadas:
A. Export del Servidor (Server-Side Export — Confiable)
Invocable únicamente desde otros scripts del servidor (ej. robos de bancos, alarmas de tiendas, disparos automatizados). No requiere permisos de usuario cliente, pero aplica sanitización estricta de todos los campos:
-- server.lua de cualquier recurso externo (trusted environment)
exports['vargas_mdt']:CreateAlert({
type = 'police', -- 'police' | 'ems' | 'fire' | '911'
priority = 'high', -- 'low' | 'medium' | 'high' | 'critical'
title = 'Robo a Banco',
message = 'Alarma de bóveda activada en Pacific Standard Bank',
coords = vector3(254.12, 221.45, 106.28),
street = 'Alta Street',
zone = 'Downtown',
caller_name = 'Sistema Central de Alarmas',
caller_phone = 'N/A'
})B. Evento de Red de Cliente (RegisterNetEvent('vargas_mdt:server:createAlert') — Restringido)
Invocable únicamente por clientes autorizados con el permiso explícito mdt.dispatch. El servidor:
- Verifica permisos (
Permissions.Assert(src, 'mdt.dispatch')) y rate limit (2 req / 5 seg). - Sobrescribe y fuerza
caller_source = src. - Obtiene el nombre y teléfono del jugador directamente desde la base del servidor (
Bridge.GetPlayer(src)), anulando cualquier intento de suplantación. - Valida matemáticamente las coordenadas y aplica fallback a la posición del ped si no son válidas.
C. Llamadas Ciudadanas de Emergencia (vargas_mdt:server:sendEmergencyCall)
Abierto para todos los ciudadanos para llamadas de socorro (/911, /policia, /ems):
- Rate limit estricto (1 llamada cada 10 seg).
- Coordenadas leídas de la entidad del ped en el servidor (
GetEntityCoords(GetPlayerPed(src))). - Nombre y teléfono del remitente leídos de los datos oficiales del personaje en servidor.
2. Ciclo de Vida de Alertas
-- Cerrar llamada de despacho
exports['vargas_mdt']:RemoveAlert(alertId)3. Crear un Blip Sincronizado
exports['vargas_mdt']:CreateBlip({
name = 'Control Policial',
sprite = 161,
color = 3,
scale = 1.0,
coords = vector3(-200.0, -1000.0, 30.0),
radius = 50.0,
duration = 600,
department = 'police'
})4. Consultar Unidades y Alertas
local units = exports['vargas_mdt']:GetActiveUnits()
local alerts = exports['vargas_mdt']:GetActiveAlerts()5. Seguridad de Objetos Tácticos & Barreras
- Aislamiento por Departamento: Los objetos desplegados (conos, barreras, pinchos, carpas médicas) pertenecen al departamento que los colocó (
police,ems,fire). Un miembro de EMS no puede retirar ni mover barreras policiales ni viceversa, salvo agentes con rango administrativo (mdt.admin). - Validación de Proximidad en Servidor: Las peticiones de retirar (
removeObject) o reposicionar (updateObjectTransform) objetos verifican en el servidor la distancia euclídea entre el ped del solicitante (GetEntityCoords(GetPlayerPed(src))) y el objeto táctico (Config.MaxObjectInteractDistance, por defecto 15.0 m). - Límite de Despliegue: Se restringe en servidor a
Config.MaxDeployablesPerPlayer(15 objetos) tanto porsourcede sesión como por identificador persistente de personaje. - Transparencia Visual (
getPlacedObjects): El evento de consulta de objetos es de lectura pública (con rate limit) para que todos los clientes en el servidor puedan renderizar las entidades físicas y sus colisiones en el mundo de GTA, evitando colisiones invisibles.