SCRIPT

Documentación de Pase de temporada

ov-battlepass

Pase de temporada para qb-core: 250 niveles, carril gratuito y carril VIP, misiones diarias y semanales, cajas con premios, titulos, buzon de recompensas y un panel de administracion independiente (ov-battlepass-admin) incluido en el mismo producto.

Que hace

ov-battlepass da a los jugadores una progresion de temporada. Ganan XP jugando, suben de nivel y reclaman recompensas desde una interfaz propia que se abre con /pase (tecla F7 por defecto).

Requisitos

Instalacion

El recurso viene protegido con Asset Escrow de Cfx.re: se descarga del Portal de Cfx.re con la cuenta Cfx.re del comprador y solo funciona en servidores de esa cuenta. Segun el fxmanifest.lua de ov-battlepass, quedan sin cifrar la interfaz (html/), los archivos config/config.lua, config/config_admin.lua, config/config_crates.lua, config/config_levels.lua, config/config_missions.lua, config/config_rewards.lua, config/config_xp.lua y locales/es.lua. El panel ov-battlepass-admin deja sin cifrar su carpeta nui/.

  1. Descarga el recurso desde el Portal de Cfx.re y copia las carpetas ov-battlepass y ov-battlepass-admin en resources/.
  2. Base de datos: no hace falta importar nada. Al arrancar, el recurso crea sus 14 tablas con prefijo ov_battlepass_ (CREATE TABLE IF NOT EXISTS). La carpeta sql/ incluye 01_schema.sql solo como copia de cortesia para revisarlo o aplicarlo a mano. El comando de consola ovbp esquema comprueba que las tablas existan.
  3. Declara en ox_inventory (archivo data/items.lua) los items de las cajas ovbp_caja_comun, ovbp_caja_vip, ovbp_caja_elite y ovbp_caja_legendaria, con consume = 1 y server = { export = 'ov-battlepass.openCrate' }. El recurso incluye las imagenes en html/img/ (ovbp_caja_*.png); copialas a las imagenes de tu inventario si quieres el icono en la mochila. Los nombres de los items de premio de config/config_crates.lua tambien deben existir en tu ox_inventory; los que falten se descartan del sorteo y se avisa en consola.
  4. Agrega en server.cfg (despues de sus dependencias y de qb-core): `` ensure oxmysql ensure ox_lib ensure qb-core ensure ox_inventory ensure ov-battlepass ensure ov-battlepass-admin ``
  5. Concede el permiso de administracion (ACE por defecto ov.battlepass): `` add_ace group.admin ov.battlepass allow ` Tambien tienen acceso los jugadores cuyo grupo de qb-core este en Admin.groups (por defecto god y admin`).
  6. Ajusta las fechas de la temporada en config/config.lua (Config.Season.startsAt y endsAt; los valores incluidos son de ejemplo) y reinicia el servidor.
  7. Este recurso no lee convars del server.cfg.

Configuracion

Los archivos de config/ sirven de semilla en la primera arrancada. Los ajustes que cambies despues desde el panel o con /pasead se guardan en la tabla ov_battlepass_settings y mandan sobre lo escrito en los archivos.

config/config.lua

ClaveValor por defectoPara que sirve
Config.Season.id, .code, .name1, 'S1', 'TEMPORADA 1'Identidad de la temporada activa.
Config.Season.startsAt / .endsAt'2026-10-01 00:00:00' / '2026-10-31 23:59:59'Ventana de la temporada (hora del servidor). Cambialas para tu servidor.
Config.Season.maxLevel250Niveles de la temporada.
Config.Season.rewards'config_rewards'Fichero de recompensas en uso.
Config.Time.dailyResetHour5Hora del reinicio diario de misiones.
Config.Time.weeklyResetDay / weeklyResetHour1 / 5Dia (1 = lunes) y hora del reinicio semanal.
Config.Time.offsetHours0Correccion manual de la hora si la maquina esta en UTC.
Config.Open.command'pase'Comando que abre el pase.
Config.Open.keybind'F7'Tecla por defecto (el jugador la puede cambiar).
Config.Open.blockWhileDeadtrueImpide abrirlo estando muerto.
Config.UI.themecolores de marcaColores de la interfaz.
Config.UI.soundenabled = true, volume = 0.5Sonidos de la interfaz.
Config.Economy.hardCapPerOperation5000000Tope por operacion de dinero; el validador rechaza recompensas que lo superen.
Config.Persistence.saveDebounceMs10000Agrupacion del guardado de XP y nivel.
Config.Persistence.xpLogRetentionDays60Dias que se conserva el registro de XP.
Config.Persistence.mailboxGraceDays14Dias que sobrevive el buzon tras cerrar la temporada.

config/config_levels.lua: Levels.mode = 'flat' (opciones flat, linear, table) y Levels.flat.xpPerLevel = 2000. El progreso se guarda como XP total, asi que cambiar la curva recalcula los niveles de todos.

config/config_xp.lua

ClaveValor por defectoPara que sirve
XP.sourceslista blanca de fuentesCada fuente define xp, cooldown, maxPerHour. Una fuente que no este aqui no da XP. Ejemplos: playtime (200 XP, cada 5 min activos), on_foot_km (150), driving_km (250), job_complete (500), delivery (500), race_complete (750), mission_complete (1000), event_win (3000).
XP.counters13 contadoresMetricas declaradas que usan las misiones.
XP.dailyCap.total60000Tope de XP libre por dia (enabled = true).
XP.multipliers.weekendvalue = 2.0, dias 6 y 7Multiplicador de fin de semana.
XP.multipliers.seasonFinalelastDays = 3, value = 2.0Multiplicador de los ultimos dias.
XP.multipliers.stackfalseSi es false, solo se aplica el mayor multiplicador activo.
XP.antiAbusemaxSpeedKmh = 260, maxTeleportMeters = 150, requireDriverSeat = trueLimites del conteo de kilometros.

config/config_missions.lua: Missions.dailyCount = 5, Missions.weeklyCount = 4, Missions.deterministicSeed = true, y los pools Missions.daily y Missions.weekly (una mision nueva es una fila con id, label, desc, counter, target, xp, icon).

config/config_rewards.lua: Rewards.templates (plantillas por tipo de nivel), Rewards.pattern (hitos 50/100/150/200, nivel 250 y una caja cada 10 niveles), Rewards.overrides (ajustes nivel a nivel) y Rewards.vip (valores iniciales del carril VIP: trackEnabled = false, mode = 'disabled').

config/config_crates.lua: CrateLoot.settings (cooldownMs = 1500, maxRolls = 10) y CrateLoot.boxes, con guaranteed, rolls y pool ponderado por caja.

config/config_admin.lua: Admin.ace = 'ov.battlepass', Admin.groups = { 'god', 'admin' }, Admin.command = 'pasead', Admin.bootCommand = 'ovbp', Admin.requireBothChecks = false, Admin.maxManualXp = 100000, Admin.allowSetLevel, Admin.allowRevokeClaims, Admin.logAllActions = true.

Comandos y permisos

Jugadores

Comando / teclaEfecto
/pase o tecla F7Abre o cierra el pase.

Administracion (ACE ov.battlepass o grupo en Admin.groups; la consola siempre puede)

ComandoEfecto
/paseadminAbre el panel visual (recurso ov-battlepass-admin). Sin tecla por defecto; se asigna en Ajustes > Teclas > FiveM.
/paseadAyuda del comando de texto.
/pasead vipEstado del carril VIP; con on / off lo enciende o apaga.
`/pasead vip modo [disabledperksmanualany]`Elige el criterio VIP.
`/pasead vip perk addquitarlista [id]`Gestiona los identificadores de perk que cuentan como VIP.
/pasead vip tabla [tabla] [colCitizenid] [colPerk] [colActive] [colExpiry]Define la tabla externa de perks (solo lectura).
/pasead vip comprobarVerifica que esa tabla exista.
/pasead vip dar [id o citizenid] [dias] / vip quitar [id o citizenid] / vip concesionesConcesiones VIP manuales.
/pasead ajustes y `/pasead ajuste [clave] [valordefecto]`Ver y cambiar ajustes en caliente.
/pasead recompensa ver [nivel], `recompensa set [nivel] [freevip] [json], recompensa limpiar [nivel] [freevip]`Edita las recompensas de un nivel.
/ovbpEstado general. Subcomandos: validar, esquema, temporada estado, temporada activar [code], temporada cerrar [code], xp [id] [cantidad], jugador [id], volcar, ayuda.

Exports del servidor (los usan otros scripts): AddXp(ref, fuente, opciones), AddCounter(ref, contador, delta), AddDistance(ref, metros, velocidad, esConductor), GetCounter, GetProgress, GetLevel, GetTotalXp, HasLevel, IsVip, GetUnlocks, HasUnlock(ref, tipo, id), GetSnapshot, GetMultiplier, GetDailyCap, GetSources, CanUseSource, IsReady, GetMissions, GetMissionSummary, GetMissionPools, GetClaimSummary, GetMailbox, OpenCrate, y el gancho de inventario openCrate. Tambien hay eventos de servidor (sin RegisterNetEvent, un cliente no puede dispararlos): ov-battlepass:server:addXp y ov-battlepass:server:addCounter, ademas de ov-battlepass:server:crateOpened que se emite al abrir una caja. Ejemplo:

exports['ov-battlepass']:AddXp(source, 'job_complete')
exports['ov-battlepass']:AddCounter(source, 'locations_visited', 1)

Exports del cliente: GetState, GetProgress, GetLevel, IsVip, GetMissions, OpenPass, ClosePass, IsPassOpen. El evento de cliente ovbp:client:open (y close, toggle) permite abrir el pase desde otro menu.

Como se usa

  1. El jugador abre el pase con /pase o F7 y ve su nivel, su XP y las tarjetas de recompensa de cada carril.
  2. Gana XP jugando: tiempo activo, caminando, conduciendo y con las acciones que tu servidor conecte a AddXp (trabajos, entregas, carreras, eventos, etc.).
  3. Al subir de nivel, la recompensa pasa a estar disponible; el jugador la reclama desde la tarjeta o con "reclamar todo".
  4. Las cajas se entregan al inventario y se abren usandolas; si no cabe todo el loot, la caja no se abre y se conserva.
  5. En la seccion de misiones, el jugador completa las diarias y semanales y reclama su XP.
  6. Si una recompensa no se pudo entregar, queda en el buzon para canjearla despues.
  7. Los hitos (niveles 50, 100, 150, 200 y 250) otorgan titulos.

Para administradores

Preguntas frecuentes

Necesito importar el SQL? No. Las tablas se crean al arrancar. sql/01_schema.sql es solo una copia de cortesia.

El jugador no recibe XP por sus trabajos. Solo dan XP por si solos el tiempo activo, los kilometros a pie y los kilometros conduciendo. El resto de fuentes (trabajos, entregas, eventos...) requieren que tu script llame a AddXp.

La temporada aparece cerrada o no suma XP. Revisa que las fechas de Config.Season incluyan el dia actual y usa /ovbp temporada estado. Las fechas incluidas son de ejemplo.

Las cajas no se abren. Comprueba que declaraste los items ovbp_* en ox_inventory con el export ov-battlepass.openCrate y que los items de premio existan; la consola avisa de los que falten.

Puedo cambiar el numero de niveles o su coste? Si: Config.Season.maxLevel y config/config_levels.lua. Al cambiar la curva, los niveles se recalculan desde la XP total.

Como veo los errores? En la consola del servidor, con el prefijo [ov-battlepass]; /ovbp validar repite la validacion de la configuracion.

Actualizaciones y soporte

Las versiones nuevas aparecen en el Portal de Cfx.re y en la tienda. Antes de actualizar, guarda una copia de la carpeta config/ y de tus ajustes. Los ajustes hechos desde el panel viven en la base de datos y no se pierden al reemplazar el recurso. Para soporte, abre un ticket en el Discord de la tienda: [enlace de soporte]. Indica las versiones de ov-battlepass (0.3.0 en el manifest actual) y ov-battlepass-admin (1.0.0), y el mensaje de la consola.