Cómo escribir FiveM Scripts usando IA: Desarrollador completo&#…

Cómo escribir FiveM Scripts usando IA

Escribir scripts de FiveM tradicionalmente requería un conocimiento profundo de Lua, JavaScript y la API de FiveM. Hoy en día, herramientas de IA como Claude Code, GitHub Copilot y ChatGPT están cambiando cómo los desarrolladores crean todo, desde Scripts de ESX demasiado complejo sistemas independientesEsta guía completa le muestra exactamente cómo aprovechar la IA para el desarrollo de FiveM, con ejemplos concretos y flujos de trabajo probados.

Por qué el desarrollo FiveM asistido por IA lo cambia todo

El desarrollo tradicional de scripts de FiveM requiere dominar varias tecnologías simultáneamente: Lua para la lógica del lado del servidor, JavaScript para interfaces NUI, SQL para operaciones de base de datos y la extensa Biblioteca de funciones nativas de FiveM. Las herramientas de IA pueden acelerar la redacción y depuración rutinarias, pero no reemplazan el aprendizaje del tiempo de ejecución FiveM, las APIs del marco o los límites de seguridad.

Impacto real para los propietarios de servidores:

  • Redacte el código de rutina más rápido cuando los requisitos y las dependencias sean explícitos
  • Genere código repetitivo al instante para patrones comunes
  • Depurar problemas de sincronización complejos entre el cliente y el servidor
  • Convierte ideas directamente en prototipos funcionales

Herramientas esenciales de IA para el desarrollo de FiveM

Código Claude (Antrópico)

Claude Code puede revisar el contexto en varios archivos. Los métodos de instalación cambian, por lo que siga la documentación oficial actual de Claude Code vinculada anteriormente en lugar de copiar un comando de paquete de terceros no verificado.

Ventajas específicas de FiveM:

  • Genera configuraciones completas de fxmanifest.lua
  • Comprende los marcos ESX, QBCore y VRP
  • Crea automáticamente controladores de eventos cliente/servidor coincidentes

Copiloto GitHub

Se integra directamente con VS Code y ofrece sugerencias en tiempo real mientras escribes. Especialmente eficaz para:

  • Completar llamadas a funciones nativas
  • Generación de patrones de controladores de eventos
  • Consultas de base de datos con autocompletado

ChatGPT con instrucciones personalizadas

Configure ChatGPT específicamente para FiveM configurando instrucciones personalizadas:

You are a FiveM script developer. Always use:
- Lua 5.4 syntax for server scripts
- Modern JavaScript for client scripts
- FiveM natives from the latest game build
- Proper event security with server-side validation

Paso a paso: Crea tu primer script generado por IA

Construyamos un script de taller de vehículos completo usando Claude Code, que demuestre todo el flujo de trabajo desde el concepto hasta la implementación.

Paso 1: Definir requisitos claros

Crear una requirements.md archivo:

## Vehicle Shop Script Requirements
- Framework: ESX Legacy 1.9.0+
- Database: MySQL with oxmysql
- Features:
 - Browse vehicles by category
 - Test drive system with time limit
 - Finance options with weekly payments
 - Admin commands for adding vehicles
- UI: Modern NUI with React

Paso 2: Generar la estructura de recursos

Comando a Claude Code:

claude-code generate "Create a complete FiveM vehicle shop resource based on requirements.md"

Esto genera:

vehicle_shop/
├── fxmanifest.lua
├── config.lua
├── server/
│ ├── main.lua
│ ├── database.lua
│ └── commands.lua
├── client/
│ ├── main.lua
│ ├── showroom.lua
│ └── testdrive.lua
├── ui/
│ ├── index.html
│ ├── style.css
│ └── script.js
└── sql/
 └── vehicle_shop.sql

Paso 3: fxmanifest.lua generado por IA

fx_version 'cerulean'
game 'gta5'

author 'YourName'
description 'AI-Generated Vehicle Shop'
version '1.0.0'

shared_scripts {
 '@es_extended/imports.lua',
 '@ox_lib/init.lua',
 'config.lua'
}

client_scripts {
 'client/*.lua'
}

server_scripts {
 '@oxmysql/lib/MySQL.lua',
 'server/*.lua'
}

ui_page 'ui/index.html'

files {
 'ui/index.html',
 'ui/style.css',
 'ui/script.js'
}

dependencies {
 'es_extended',
 'oxmysql',
 'ox_lib'
}

Paso 4: Implementar la funcionalidad principal con IA

Solicitud de carga del vehículo del lado del servidor:

-- AI-Generated: server/database.lua
local vehicles = {}

CreateThread(function()
 local result = MySQL.query.await('SELECT * FROM vehicle_shop WHERE stock > 0')
 
 for i = 1, #result do
 local vehicle = result[i]
 vehicles[vehicle.model] = {
 model = vehicle.model,
 name = vehicle.name,
 price = vehicle.price,
 category = vehicle.category,
 stock = vehicle.stock
 }
 end
 
 print(('[^2INFO^7] Loaded %d vehicles from database'):format(#result))
end)

-- Secure server event for purchasing
RegisterNetEvent('vehicle_shop:server:purchaseVehicle', function(vehicleModel, paymentMethod)
 local src = source
 local xPlayer = ESX.GetPlayerFromId(src)
 
 -- Security check
 if not vehicles[vehicleModel] then
 return TriggerClientEvent('ox_lib:notify', src, {
 title = 'Error',
 description = 'Invalid vehicle model',
 type = 'error'
 })
 end
 
 local vehicleData = vehicles[vehicleModel]
 
 -- Payment processing
 if paymentMethod == 'cash' then
 if xPlayer.getMoney() >= vehicleData.price then
 xPlayer.removeMoney(vehicleData.price)
 -- Generate plate and spawn vehicle
 local plate = GeneratePlate()
 
 MySQL.insert('INSERT INTO owned_vehicles (owner, plate, vehicle) VALUES (?, ?, ?)', {
 xPlayer.identifier,
 plate,
 json.encode({model = vehicleModel, plate = plate})
 })
 
 TriggerClientEvent('vehicle_shop:client:spawnVehicle', src, vehicleModel, plate)
 else
 TriggerClientEvent('ox_lib:notify', src, {
 title = 'Insufficient Funds',
 description = ('You need $%d'):format(vehicleData.price),
 type = 'error'
 })
 end
 end
end)

Paso 5: Implementación del lado del cliente

Aviso de IA: Cree una sala de exposición del lado del cliente con controles de cámara y vista previa del vehículo.

-- AI-Generated: client/showroom.lua
local currentVehicle = nil
local cam = nil
local inShowroom = false

local showroomCoords = vector3(-42.34, -1097.35, 26.42)
local vehicleSpawnCoords = vector4(-47.52, -1097.29, 26.42, 340.0)

function OpenShowroom(category)
 inShowroom = true
 DoScreenFadeOut(500)
 Wait(500)
 
 -- Setup camera
 cam = CreateCam('DEFAULT_SCRIPTED_CAMERA', true)
 SetCamCoord(cam, -54.31, -1097.29, 28.42)
 PointCamAtCoord(cam, vehicleSpawnCoords.x, vehicleSpawnCoords.y, vehicleSpawnCoords.z)
 SetCamActive(cam, true)
 RenderScriptCams(true, false, 0, true, false)
 
 -- Request vehicles from server
 ESX.TriggerServerCallback('vehicle_shop:getVehicles', function(vehicles)
 SendNUIMessage({
 action = 'showVehicles',
 vehicles = vehicles,
 category = category
 })
 SetNuiFocus(true, true)
 end, category)
 
 DoScreenFadeIn(500)
end

RegisterNUICallback('previewVehicle', function(data, cb)
 if currentVehicle then
 DeleteEntity(currentVehicle)
 end
 
 local model = GetHashKey(data.model)
 RequestModel(model)
 
 while not HasModelLoaded(model) do
 Wait(10)
 end
 
 currentVehicle = CreateVehicle(model, vehicleSpawnCoords.x, vehicleSpawnCoords.y, 
 vehicleSpawnCoords.z, vehicleSpawnCoords.w, false, false)
 SetEntityAsMissionEntity(currentVehicle, true, true)
 SetVehicleOnGroundProperly(currentVehicle)
 SetVehicleDoorsLocked(currentVehicle, 2)
 
 cb('ok')
end)

Técnicas avanzadas de IA para sistemas complejos

Gestión de contexto de múltiples archivos

Al desarrollar sistemas interconectados como scripts de teléfono, proporcionar a la IA un contexto completo:

# Feed multiple files to Claude Code
claude-code analyze --files "server/*.lua,client/*.lua,config.lua" 
 --prompt "Add a garage system that integrates with the existing vehicle shop"

Incitación específica del marco

Distintos marcos requieren enfoques diferentes. A continuación, se explica cómo optimizar las indicaciones de IA para cada uno:

Para ESX:

Generate an ESX job script with:
- Grades/ranks system using ESX.Jobs
- Salary payments via ESX.GetJobs()
- Boss menu with society funds
- Use esx_society patterns

Para QBCore:

Create a QBCore gang system with:
- Gang territories using PolyZone
- Reputation system with QB.Shared.Gangs
- Stash/storage using qb-inventory
- Gang management via qb-gangmenu patterns

Para Scripts VRP:

Build a VRP business system using:
- vRP.getUserId for player identification
- vRP permissions system
- vRP money methods (giveMoney, tryPayment)
- vRPclient tunnel for client callbacks

Generación de esquemas de base de datos

La IA se destaca en la creación de estructuras de bases de datos optimizadas:

-- AI Prompt: "Create MySQL schema for advanced vehicle shop with financing"
-- Generated Result:

CREATE TABLE IF NOT EXISTS `vehicle_shop_catalog` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `model` varchar(60) NOT NULL,
 `name` varchar(60) NOT NULL,
 `manufacturer` varchar(60) DEFAULT NULL,
 `category` varchar(60) DEFAULT NULL,
 `price` int(11) NOT NULL,
 `stock` int(11) DEFAULT 10,
 `max_speed` int(11) DEFAULT NULL,
 `acceleration` float DEFAULT NULL,
 `braking` float DEFAULT NULL,
 `handling` float DEFAULT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `model` (`model`),
 KEY `idx_category` (`category`),
 KEY `idx_price` (`price`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS `vehicle_financing` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `identifier` varchar(60) NOT NULL,
 `vehicle_id` int(11) NOT NULL,
 `down_payment` int(11) NOT NULL,
 `weekly_payment` int(11) NOT NULL,
 `weeks_remaining` int(11) NOT NULL,
 `last_payment` timestamp DEFAULT CURRENT_TIMESTAMP,
 `repo_warning_sent` boolean DEFAULT FALSE,
 PRIMARY KEY (`id`),
 KEY `idx_identifier` (`identifier`),
 FOREIGN KEY (`vehicle_id`) REFERENCES `owned_vehicles`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Depuración y optimización con IA

Indicaciones de creación de perfiles de rendimiento

-- Prompt: "Add performance monitoring to this resource"
-- AI generates:

local performanceStats = {
 events = {},
 queries = {}
}

local function profileEvent(eventName, func)
 return function(...)
 local startTime = GetGameTimer()
 local result = {func(...)}
 local executionTime = GetGameTimer() - startTime
 
 performanceStats.events[eventName] = performanceStats.events[eventName] or {}
 table.insert(performanceStats.events[eventName], executionTime)
 
 if executionTime > 50 then
 print(('[^3WARNING^7] Event %s took %dms'):format(eventName, executionTime))
 end
 
 return table.unpack(result)
 end
end

-- Wrap existing events
RegisterNetEvent('vehicle_shop:server:purchaseVehicle', 
 profileEvent('purchaseVehicle', purchaseVehicleHandler))

Validación de seguridad

La IA puede identificar y solucionar vulnerabilidades de seguridad:

-- Prompt: "Add security validation to this client-to-server event"
-- Before (vulnerable):
RegisterNetEvent('giveWeapon', function(weapon)
 local src = source
 GiveWeaponToPed(GetPlayerPed(src), weapon, 250, false, true)
end)

-- After (AI-secured):
local allowedWeapons = {
 ['WEAPON_PISTOL'] = true,
 ['WEAPON_COMBATPISTOL'] = true
}

RegisterNetEvent('giveWeapon', function(weapon)
 local src = source
 local xPlayer = ESX.GetPlayerFromId(src)
 
 -- Multiple validation layers
 if not xPlayer then return end
 if not allowedWeapons[weapon] then
 return DropPlayer(src, 'Attempted to spawn invalid weapon')
 end
 if not xPlayer.hasPermission('weapons.spawn') then
 return TriggerClientEvent('ox_lib:notify', src, {
 title = 'Access Denied',
 type = 'error'
 })
 end
 
 -- Log the action
 print(('[^3WEAPON^7] %s spawned %s'):format(xPlayer.getName(), weapon))
 
 xPlayer.addWeapon(weapon, 250)
end)

Desarrollo de NUI con IA

Crear interfaces modernas para FiveM requiere experiencia en HTML/CSS/JavaScript. La IA agiliza este proceso:

Generación de componentes de React

// Prompt: "Create a React vehicle shop UI with category filtering"
// AI generates:

import React, { useState, useEffect } from 'react';
import './VehicleShop.css';

const VehicleShop = () => {
 const [vehicles, setVehicles] = useState([]);
 const [selectedCategory, setSelectedCategory] = useState('all');
 const [selectedVehicle, setSelectedVehicle] = useState(null);
 const [searchTerm, setSearchTerm] = useState('');

 useEffect(() => {
 window.addEventListener('message', handleMessage);
 return () => window.removeEventListener('message', handleMessage);
 }, []);

 const handleMessage = (event) => {
 const { action, data } = event.data;
 
 switch(action) {
 case 'showVehicles':
 setVehicles(data.vehicles);
 break;
 case 'updateStock':
 updateVehicleStock(data.model, data.stock);
 break;
 }
 };

 const filteredVehicles = vehicles.filter(vehicle => {
 const matchesCategory = selectedCategory === 'all' || 
 vehicle.category === selectedCategory;
 const matchesSearch = vehicle.name.toLowerCase()
 .includes(searchTerm.toLowerCase());
 return matchesCategory && matchesSearch;
 });

 const purchaseVehicle = (vehicle, paymentMethod) => {
 fetch(`https://${GetParentResourceName()}/purchaseVehicle`, {
 method: 'POST',
 headers: { 'Content-Type': 'application/json' },
 body: JSON.stringify({
 model: vehicle.model,
 paymentMethod: paymentMethod
 })
 });
 };

 return (
 <div className="vehicle-shop-container">
 <div className="shop-header">
 <h1>Premium Deluxe Motorsport</h1>
 <input 
 type="text"
 placeholder="Search vehicles..."
 value={searchTerm}
 onChange={(e) => setSearchTerm(e.target.value)}
 className="search-input"
 />
 </div>

 <div className="category-filters">
 {['all', 'sports', 'super', 'sedan', 'suv', 'motorcycle'].map(cat => (
 <button
 key={cat}
 className={`category-btn ${selectedCategory === cat ? 'active' : ''}`}
 onClick={() => setSelectedCategory(cat)}
 >
 {cat.toUpperCase()}
 </button>
 ))}
 </div>

 <div className="vehicles-grid">
 {filteredVehicles.map(vehicle => (
 <VehicleCard 
 key={vehicle.model}
 vehicle={vehicle}
 onSelect={() => setSelectedVehicle(vehicle)}
 />
 ))}
 </div>

 {selectedVehicle && (
 <VehicleDetails 
 vehicle={selectedVehicle}
 onPurchase={purchaseVehicle}
 onClose={() => setSelectedVehicle(null)}
 />
 )}
 </div>
 );
};

Errores comunes de la IA y sus soluciones

Problema 1: Funciones nativas obsoletas

Asunto: La IA sugiere nativos de FiveM obsoletos Solución: Especifique siempre la compilación del juego en el mensaje:

Use only FiveM natives compatible with game build 3095+
Replace deprecated natives like GetPlayerPed(-1) with PlayerPedId()

Problema 2: Fugas de memoria en bucles

Asunto: La IA crea bucles infinitos sin una limpieza adecuada Solución: Solicitar patrones de recolección de basura:

-- AI-improved version with cleanup
local activeThreads = {}

local function createManagedThread(id, func)
 if activeThreads[id] then
 -- Kill existing thread
 activeThreads[id] = false
 end
 
 activeThreads[id] = true
 
 CreateThread(function()
 while activeThreads[id] do
 func()
 Wait(0)
 end
 end)
end

-- Cleanup on resource stop
AddEventHandler('onResourceStop', function(resourceName)
 if GetCurrentResourceName() == resourceName then
 for id, _ in pairs(activeThreads) do
 activeThreads[id] = false
 end
 end
end)

Problema 3: Problemas de sincronización

Asunto: Desajustes de estado entre cliente y servidor Solución: Utilice IA para generar gestión de estados:

-- Prompt: "Create a synchronized state manager for client-server data"
-- AI generates:

-- Server-side state manager
local StateManager = {}
StateManager.states = {}

function StateManager:set(key, value)
 self.states[key] = value
 TriggerClientEvent('stateManager:sync', -1, key, value)
end

function StateManager:get(key)
 return self.states[key]
end

RegisterNetEvent('stateManager:requestSync', function()
 local src = source
 TriggerClientEvent('stateManager:fullSync', src, StateManager.states)
end)

-- Client-side state manager
local ClientState = {}

RegisterNetEvent('stateManager:sync', function(key, value)
 ClientState[key] = value
end)

RegisterNetEvent('stateManager:fullSync', function(states)
 ClientState = states
end)

-- Request initial sync
CreateThread(function()
 Wait(1000)
 TriggerServerEvent('stateManager:requestSync')
end)

Estrategias de prueba e implementación

Pruebas automatizadas con IA

Genere conjuntos de pruebas completos:

-- Prompt: "Create unit tests for the vehicle shop purchase function"
-- AI generates:

local function runTests()
 local testResults = {
 passed = 0,
 failed = 0,
 tests = {}
 }

 -- Test 1: Valid purchase with sufficient funds
 local function testValidPurchase()
 local mockPlayer = {
 identifier = 'test_player_1',
 money = 50000,
 getMoney = function() return 50000 end,
 removeMoney = function(amount) 
 mockPlayer.money = mockPlayer.money - amount
 return true
 end
 }
 
 local result = attemptPurchase(mockPlayer, 'adder', 45000)
 assert(result.success == true, 'Valid purchase should succeed')
 assert(mockPlayer.money == 5000, 'Money should be deducted correctly')
 
 return true
 end

 -- Test 2: Purchase with insufficient funds
 local function testInsufficientFunds()
 local mockPlayer = {
 identifier = 'test_player_2',
 money = 1000,
 getMoney = function() return 1000 end
 }
 
 local result = attemptPurchase(mockPlayer, 'adder', 45000)
 assert(result.success == false, 'Purchase should fail with insufficient funds')
 assert(result.error == 'insufficient_funds', 'Should return correct error code')
 
 return true
 end

 -- Run all tests
 local tests = {
 {name = 'Valid Purchase', func = testValidPurchase},
 {name = 'Insufficient Funds', func = testInsufficientFunds}
 }

 for _, test in ipairs(tests) do
 local success, error = pcall(test.func)
 if success then
 testResults.passed = testResults.passed + 1
 print(('[^2✓^7] %s passed'):format(test.name))
 else
 testResults.failed = testResults.failed + 1
 print(('[^1✗^7] %s failed: %s'):format(test.name, error))
 end
 
 table.insert(testResults.tests, {
 name = test.name,
 passed = success,
 error = error
 })
 end

 return testResults
end

-- Run tests on resource start in development mode
if Config.Debug then
 CreateThread(function()
 Wait(1000)
 local results = runTests()
 print(('Tests completed: %d passed, %d failed'):format(
 results.passed, results.failed
 ))
 end)
end

Monitoreo del rendimiento

-- Prompt: "Add performance monitoring for production deployment"
-- AI generates:

local Monitor = {
 metrics = {
 eventCalls = {},
 dbQueries = {},
 memoryUsage = {}
 }
}

function Monitor:trackEvent(eventName)
 self.metrics.eventCalls[eventName] = (self.metrics.eventCalls[eventName] or 0) + 1
end

function Monitor:trackQuery(queryType, duration)
 table.insert(self.metrics.dbQueries, {
 type = queryType,
 duration = duration,
 timestamp = os.time()
 })
end

function Monitor:getReport()
 local report = {
 uptime = GetGameTimer() / 1000,
 totalEvents = 0,
 averageQueryTime = 0,
 memoryUsage = collectgarbage('count')
 }
 
 for _, count in pairs(self.metrics.eventCalls) do
 report.totalEvents = report.totalEvents + count
 end
 
 if #self.metrics.dbQueries > 0 then
 local totalTime = 0
 for _, query in ipairs(self.metrics.dbQueries) do
 totalTime = totalTime + query.duration
 end
 report.averageQueryTime = totalTime / #self.metrics.dbQueries
 end
 
 return report
end

-- Export metrics endpoint
RegisterCommand('metrics', function(source)
 if source == 0 or IsPlayerAceAllowed(source, 'admin.metrics') then
 print(json.encode(Monitor:getReport(), {indent = true}))
 end
end, true)

Integración con recursos existentes

Al agregar scripts generados por IA a servidores existentes con Scripts de ESX o scripts independientes, siga estos patrones de integración:

Dependencias de recursos

-- config.lua - AI-generated configuration for compatibility
Config = {}

-- Framework detection
Config.Framework = nil

CreateThread(function()
 if GetResourceState('es_extended') == 'started' then
 Config.Framework = 'esx'
 ESX = exports['es_extended']:getSharedObject()
 elseif GetResourceState('qb-core') == 'started' then
 Config.Framework = 'qbcore'
 QBCore = exports['qb-core']:GetCoreObject()
 else
 Config.Framework = 'standalone'
 end
 
 print(('[^2INFO^7] Detected framework: %s'):format(Config.Framework))
end)

-- Framework-agnostic money functions
function GetPlayerMoney(source)
 if Config.Framework == 'esx' then
 local xPlayer = ESX.GetPlayerFromId(source)
 return xPlayer.getMoney()
 elseif Config.Framework == 'qbcore' then
 local Player = QBCore.Functions.GetPlayer(source)
 return Player.PlayerData.money.cash
 else
 -- Standalone implementation
 return exports['your_economy']:GetMoney(source)
 end
end

Lista de verificación de mejores prácticas

Antes de implementar scripts generados por IA:

  • [ ] Validación de seguridad:Todos los eventos de cliente a servidor validados
  • [ ] Pruebas de rendimiento:No hay bucles sin Wait()
  • [ ] Gestión de la memoria: Limpieza adecuada al detener el recurso
  • [ ] Índices de bases de datos: Índices en columnas consultadas con frecuencia
  • [ ] Error ManejoBloques try-catch alrededor de operaciones críticas
  • [ ] Explotación florestal:Registro estructurado para depuración
  • [ ] Configuración: Valores de configuración externalizados
  • [ ] Documentación: README con los pasos de instalación
  • [ ] Control de versiones: Versiones semánticas en fxmanifest
  • [ ] Licencia:Se incluye el archivo de licencia correspondiente

Aviso optimizado para un agente de desarrollo de FiveM

You are an expert FiveM developer with 5+ years of production experience managing high-population servers. Your expertise spans all major frameworks and you prioritize secure, performant code.

Conclusión

Las herramientas de inteligencia artificial como Claude Code transforman el desarrollo de FiveM de un proceso de aprendizaje de meses de duración a una creación de scripts productivos en cuestión de horas, lo que permite la creación rápida de prototipos y el desarrollo de sistemas complejos al tiempo que mantiene los estándares de seguridad y rendimiento.


¿Listo para mejorar el servidor? Explora nuestra colección seleccionada de guiones premium o revisa soluciones independientes que complementan sus recursos generados por IA.

Proporcione el contexto adecuado a la IA sin exponer secretos

Indique si el recurso utiliza ESX, QBCore, QBOX, ox_lib, oxmysql, NUI o código independiente, y pida a la herramienta que liste todas las dependencias que asume. No pegue claves de licencia, contraseñas de bases de datos, URLs de webhooks, datos de clientes o código de servidores privados en un servicio a menos que los términos de manejo de datos del servicio y su permiso para compartir ese código sean claros.

Revise manualmente los controladores de eventos generados, las devoluciones de llamada, los valores proporcionados por el jugador, las comprobaciones de permisos, la lógica de recompensas y las escrituras en la base de datos. Pruebe los cambios en el entorno de ensayo con permisos de jugador normal así como con permisos de administrador, inspeccione los registros del cliente y del servidor, y mantenga una copia de respaldo antes de la implementación en producción.

Revisión editorial y política de fuentes

La IA puede redactar código, pero no puede establecer que un evento esté autorizado o que exista una dependencia API. Requiere enlaces de fuente primaria, revisa cada evento de red en el lado del servidor, ejecuta lint/pruebas e inspecciona la diferencia antes de la puesta en escena. Nunca pegues secretos o datos privados de jugadores en un modelo.

Esta página fue revisada técnicamente el 9 de agosto de 2026. Los comandos y la configuración deben verificarse con la documentación principal vinculada y la versión exacta del recurso instalada en el servidor. Pruebe los cambios en el entorno de prueba, registre la línea de base y conserve una copia de reversión antes de cambiar la producción.