Skip to content

Configuración

Todas las opciones de Cuxial Tablet: las secciones de shared/config.lua, los catálogos de data/, qué edita el panel de administración y los hooks que conectan tus propios recursos.

shared/config.lua y los archivos de data/ contienen los valores de fábrica. En el primer arranque se escriben en la base de datos y, desde entonces, casi todo se edita en vivo desde /tabletadmin. Solo unas pocas opciones se leen del archivo en cada arranque.

Después del primer arranque, editar shared/config.lua o data/*.lua no cambia lo que ven los jugadores. Edita desde el panel de administración, o usa Fábrica en una sección del panel para volver a cargar los valores del archivo. Las excepciones son las opciones estáticas.

Opciones estáticas ​

Se leen de shared/config.lua en cada arranque y no aparecen en el panel.

OpciónTipoPor defectoQué hace
debugbooleanfalsetrue imprime consultas y eventos en consola. La convar cuxial_tablet_debug a 1 hace lo mismo.
ui.accentstring (hex)configurableColor de acento de la interfaz.
ui.soundsbooleantruetrue reproduce sonidos de interfaz en las acciones.
commands.adminstring'tabletadmin'Comando que abre el panel de administración, sin barra.
admin.permissionstring'admin'Permiso necesario para el panel, las operaciones y la moderación de noticias, directos y galería. Consulta Permisos.

El nombre que sale en la cabecera de la tablet viene de las claves UI_SHELL_BRAND, UI_SHELL_BRAND_A y UI_SHELL_BRAND_B de locales/en.json y locales/es.json.

Tablet · tablet ​

OpciónTipoPor defectoQué hace
enabledbooleantruefalse impide a todos abrir la tablet. El panel de administración sigue funcionando.
keybindstring'F1'Tecla por defecto. Cambiarla exige que los jugadores vuelvan a conectar; cada jugador puede reasignarla en los ajustes de teclas de GTA. Se aceptan botones del ratón como MOUSE_BUTTON.
startPagestring'player'Página que se muestra al abrir: player, news, jobsOnline, jobsCity, crosshair o vip.
rememberPagebooleantruetrue reabre en la última página visitada.
prop.modelstring'prop_cs_tablet'Prop que se lleva en la mano.
prop.bonenumber60309Hueso al que se engancha. 60309 es la mano izquierda.
prop.offsettable{ x = 0.0, y = 0.0, z = 0.03 }Desplazamiento respecto al hueso.
prop.rotationtable{ x = 10.0, y = 160.0, z = 0.0 }Rotación del prop.
anim.dict, anim.clipstringanimación de tabletAnimación que se reproduce con la tablet abierta.
anim.flagnumber50Flag de la animación. 50 es parte superior y bucle.
canOpen.deadbooleanfalsetrue permite abrirla muerto o herido.
canOpen.swimmingbooleanfalsetrue permite abrirla nadando.
canOpen.drivingbooleanfalsetrue permite abrirla siendo el conductor.
canOpen.passengerbooleantruetrue permite abrirla de pasajero.
canOpen.cuffedbooleanfalsetrue permite abrirla esposado.
pages.player, pages.news, pages.jobsOnline, pages.jobsCity, pages.crosshair, pages.vipbooleantruefalse quita esa página de la tablet.

VIP · vip ​

OpciónTipoPor defectoQué hace
accountstring'coins'Cuenta de dinero del framework que guarda las coins. Debe existir. Consulta Instalación.
cooldownMsnumber2000Milisegundos que un jugador debe esperar entre dos compras.
stockModestring'perItem''perItem' mantiene un stock global por artículo y descuenta cada venta. 'none' ignora el stock.
newDaysnumber7Días que un artículo lleva la etiqueta nuevo desde que entra al catálogo.
topSellersCountnumber5Artículos marcados top ventas, por ventas de los últimos 30 días.
cart.maxItemsnumber10Líneas máximas en el carrito.
gift.enabledbooleantruetrue permite regalar artículos a jugadores conectados.
gift.feePctnumber0Porcentaje que se añade al precio al regalar.
gift.messageMaxLennumber120Longitud máxima del mensaje del regalo.
wallet.transfer.enabledbooleantruetrue permite transferir coins entre jugadores.
wallet.transfer.feePctnumber5Porcentaje que se pierde como comisión en cada transferencia.
wallet.transfer.minnumber10Coins mínimas por transferencia.
wallet.transfer.maxPerDaynumber5000Coins que un jugador puede enviar al día. 0 quita el tope.
wallet.historyLimitnumber50Movimientos que se muestran en la cartera.
codes.prefixstring'VIP'Prefijo de los códigos canjeables, como en VIP-XXXX-XXXX. Hasta 12 caracteres.
codes.redeemPerHournumber10Intentos de canje por hora y jugador.
loyalty.enabledbooleantruetrue activa los niveles de lealtad.
loyalty.tierstable[]cuatro nivelesNiveles ordenados por spent, ver abajo.

Cada nivel de lealtad:

CampoTipoQué hace
idstringNombre interno.
labelstringNombre que ve el jugador.
spentnumberCoins gastadas necesarias para alcanzar el nivel. El primer nivel es 0.
discountPctnumberDescuento en los precios de la tienda.
extraDailyDaybooleantrue añade un día extra al final de cada ciclo diario.
accentstring (hex)Color del nivel.

Los niveles por defecto son Bronce (0 coins, sin descuento), Plata (2.500 coins, 3 %), Oro (10.000 coins, 6 %, día extra) y Diamante (30.000 coins, 10 %, día extra).

Recompensa diaria · daily ​

OpciónTipoPor defectoQué hace
enabledbooleantruefalse oculta la pestaña de la diaria.
cycleDaysnumber7Días del ciclo. Debe coincidir con los días de data/daily.lua.
claimWindowHoursnumber24Horas entre dos reclamos.
breakStreakOnMissbooleantruetrue reinicia la racha en 1 cuando un jugador reclama tras más de graceHours sin reclamar. false nunca la rompe.
graceHoursnumber48Horas sin reclamar antes de que la racha quede en riesgo. Nunca menos que claimWindowHours.
streakBonusPctnumber5Porcentaje de coins extra por día de racha, solo en premios de coins.
streakBonusMaxPctnumber50Tope del bonus de racha.
rescue.enabledbooleantruetrue permite pagar para conservar una racha en riesgo.
rescue.pricenumber150Coins por rescate.
rescue.maxPerCyclenumber1Rescates permitidos por ciclo.

Pase de temporada · pass ​

OpciónTipoPor defectoQué hace
enabledbooleantruefalse oculta la pestaña del pase y detiene el XP.
season.namestring'SEASON 1'Nombre que se muestra.
season.numbernumber1Número de temporada. Cambiar el nombre o el número inicia una temporada nueva para todos.
season.endsAtnumber0Hora Unix, en segundos, del fin de temporada que se muestra en el pase. 0 no muestra fecha.
totalTiersnumber15Niveles. Debe coincidir con los niveles de data/pass.lua.
xpPerLevelnumber1000XP por nivel.
premiumPricenumber3000Coins para activar el premium de la temporada.
xpSources.dailynumber100XP por reclamo diario.
xpSources.shopPerCoinnumber1XP por coin gastada en la tienda o en cajas.
xpSources.jobCompletenumber150XP por trabajo completado. Consulta EmitJobCompleted.
xpSources.playtimePerMinnumber2XP por minuto conectado. 0 lo desactiva.
missions.weeklyCountnumber3Misiones activas cada semana, elegidas de data/missions.lua.
missions.resetDaynumber1Día en que se reinicia la semana: 1 lunes a 7 domingo.

Cajas · cases ​

OpciónTipoPor defectoQué hace
enabledbooleantruefalse oculta la pestaña de cajas.
showOddsbooleantruetrue muestra las probabilidades por rareza en cada nivel.
multiOpennumber[]{ 1, 3, 5 }Cantidades que un jugador puede abrir a la vez.
stripLengthnumber40Tarjetas en la tira de la ruleta.
winnerIndexnumber32Posición de la tarjeta ganadora en la tira. Como máximo stripLength.
pity.enabledbooleantruetrue garantiza una legendaria tras un número de aperturas sin ella.
pity.legendaryAfternumber50Aperturas sin legendaria antes de forzar una.

Noticias · news ​

OpciónTipoPor defectoQué hace
enabledbooleantruefalse apaga las noticias; la página no muestra nada y nadie puede publicar.
trendingCountnumber3Entradas que se muestran como tendencia.
autoTrendingLikeThresholdnumber500Likes a partir de los que una entrada pasa a tendencia.
publisherJobsstring[]{ 'journalist', 'reporter' }Trabajos que pueden publicar. El staff siempre puede.
allowAnonLikesbooleanfalsetrue acepta likes de jugadores sin personaje cargado.
pageSizenumber20Entradas por página del feed.
categoriesstring[]siete categoríasCategorías que se ofrecen al redactar. Las categorías ya usadas por entradas guardadas se suman a la lista.

Directos · live ​

OpciónTipoPor defectoQué hace
enabledbooleantruefalse apaga los directos.
broadcasterJobsstring[]{ 'journalist', 'reporter', 'police' }Trabajos que pueden emitir. El staff siempre puede.
maxDurationSecnumber14400Duración máxima de un directo, en segundos.
maxViewersnumber50Espectadores por directo.
enc.width, enc.bitrate, enc.fpsnumber960, 1500000, 20Perfil de vídeo que se usa cuando el relay está configurado.
chat.enabledbooleantruetrue activa el chat del directo.
chat.maxLennumber140Longitud máxima de un mensaje del chat.
chat.perMinutenumber20Mensajes por minuto y espectador.
camera.propstring'prop_v_cam_01'Prop de cámara que lleva el locutor.
camera.bonenumber28422Hueso al que se engancha. 28422 es la mano derecha.
camera.offset, camera.rotationtablever archivoPosición y rotación del prop.
camera.animDict, camera.animClip, camera.animFlagstring, string, numberanimación de cámara al hombroAnimación que se reproduce mientras se emite.
camera.lensForwardnumber0.30Metros por delante del prop donde se coloca la cámara de la emisión.
camera.zoomMin, camera.zoomMaxnumber20.0, 60.0Rango de campo de visión del zoom.
camera.stopKeystring'BACK'Tecla por defecto que corta el directo. Cambiarla exige que los jugadores vuelvan a conectar.

Mira · crosshair ​

OpciónTipoPor defectoQué hace
enabledbooleantruefalse apaga toda la función.
hideNativebooleantruetrue oculta la retícula del juego mientras la mira propia está activa.
allowHitmarkerbooleantruefalse quita el hitmarker y los números de daño a todos.
allowDamageNumbersbooleantruefalse quita los números de daño a todos. Necesita allowHitmarker.
tickMsnumber50Milisegundos entre actualizaciones del estado de la mira.
maxLayersnumber6Capas por mira.
maxSizenumber64Tamaño máximo de una capa, en píxeles a 1080p.
gallery.enabledbooleantruetrue activa la galería comunitaria.
gallery.maxPerPlayernumber5Entradas que puede publicar un jugador.
gallery.nameMaxLennumber24Longitud máxima del nombre de una entrada.
gallery.pageSizenumber30Entradas por página.
defaults.enabledbooleanfalsetrue activa la mira propia a los jugadores que no han configurado nada.
defaults.presetstring'classic_cross'Preset inicial, por id de data/crosshair_presets.lua.
defaults.colorstring (hex)'#ffffff'Color inicial.
defaults.alwaysShowbooleanfalsetrue la dibuja sin apuntar.
defaults.dynamictable{ enabled = true, moveGap = 4, sprintGap = 8, vehicleGap = 6, aimGap = -2, smooth = 0.2 }Separación dinámica inicial: separación extra al moverse, esprintar y conducir, reducción al apuntar, y suavizado.
defaults.perWeapon.enabledbooleanfalsetrue empieza con un perfil por grupo de arma.
hitmarkerDefaults.enabledbooleantrueHitmarker activo para los jugadores que no han configurado nada.
hitmarkerDefaults.stylestring'cross'cross, x, ring o dot.
hitmarkerDefaults.soundbooleantruetrue reproduce un tick al impactar.
hitmarkerDefaults.volumenumber0.35Volumen del tick, de 0 a 1.
hitmarkerDefaults.showDamagebooleantruetrue muestra el número de daño.
hitmarkerDefaults.durationMsnumber220Duración del marcador, de 100 a 600.
weaponGroupsstring[]ocho gruposGrupos de arma que se ofrecen para los perfiles por arma: melee, pistol, smg, rifle, shotgun, sniper, heavy, throwable.

data/crosshair_presets.lua contiene los 146 presets y los valores por defecto de cada tipo de capa. Se lee del archivo en cada arranque y no se edita desde el panel.

Trabajos · jobs ​

OpciónTipoPor defectoQué hace
onlineRefreshSecnumber5Segundos que se guardan en caché los recuentos de servicio.
city.startModestring'waypoint''waypoint' marca las coordenadas del trabajo en el mapa. 'event' dispara un evento de cliente con el id del trabajo.
city.startEventstring''Evento de cliente que se dispara cuando startMode = 'event' y el trabajo no tiene evento propio.

Catálogos · data/ ​

Los archivos de data/ son los catálogos de fábrica. Se entregan con filas de muestra que apuntan a ítems habituales del inventario; sustitúyelas por las tuyas desde el panel de administración. Cada fila tiene los campos de abajo.

Tienda · data/shop.lua ​

CampoQué hace
idÚnico y estable. Nunca reutilices un id: el stock y el historial lo referencian.
enabledfalse oculta el artículo.
itemKeyNombre del ítem en el inventario.
name, descriptionSe muestran en la tarjeta.
categoryUna de las categorías listadas al final del archivo (shopCategories).
raritycommon, rare, epic o legendary.
priceCoins.
amountUnidades del ítem principal.
stockUnidades a la venta con stockMode = 'perItem'. -1 es ilimitado.
imageURL completa o ruta dentro de la carpeta de imágenes del inventario. Vacío usa la imagen del inventario para itemKey.
bundleÍtems extra que se entregan con el principal: { itemKey, amount, label, metadata }.
metadataMetadatos del ítem principal.
featuredtrue lo muestra en el orden de destacados.
discount.pct, discount.untilAtOferta flash: porcentaje y hora Unix de su fin. 0 es sin oferta.
limited.untilAtHora Unix tras la cual el artículo sale de la tienda. 0 es permanente.
requires.loyaltyTierId del nivel de lealtad necesario para comprar. Vacío es ninguno.
addedAtHora Unix en que el artículo entró al catálogo, para la etiqueta nuevo. El panel la rellena.
sortOrden manual, menor primero.
themeTema de la tarjeta. Vacío o uno de shopThemes.
preview3dtrue muestra el botón Ver en 3D.
previewModelModelo que se muestra en 3D. Vacío usa itemKey como modelo de arma.

Diaria · data/daily.lua ​

Una fila por día del ciclo: day, enabled, kind (item, coins o cash), itemKey, amount, label, milestone y metadata.

Pase · data/pass.lua ​

Una fila por nivel: level, free y premium. Cada premio tiene kind (item, coins, cash o none), itemKey, amount, label, milestone y metadata.

Cajas · data/cases.lua ​

  • tiers: id, enabled, label, accent, price, image (vacío usa images/cases/<id>.webp de la interfaz) y weights, la probabilidad de common, rare, epic y legendary, que suman 1.
  • pool: los premios, compartidos por todos los niveles: id, enabled, kind, itemKey, name, rarity, amount, image y metadata.

Misiones · data/missions.lua ​

id, enabled, label, type, target, xp e icon. El tipo decide qué cuenta target:

TipoObjetivo
jobsTrabajos completados
playtimeMinutos conectado
dailyReclamos diarios
shopCoins gastadas
distanceMetros recorridos
casesCajas abiertas

Trabajos online · data/jobs_online.lua ​

id, enabled, job (nombre del trabajo en el framework), name, image, description, category, color y priority (mayor primero).

Empleos · data/jobs_city.lua ​

id, enabled, name, image, description, coords y event (evento de cliente de este trabajo cuando startMode = 'event'; vacío usa jobs.city.startEvent). Las coordenadas se eligen en el mundo desde el panel de administración.

Las imágenes de trabajos y cajas son rutas dentro de la carpeta web/dist del recurso, como images/cityjobs/trucker.webp.

Hooks ​

La carpeta hooks/ contiene adaptadores Lua que conectan la tablet con tus propios recursos. Edítalos con libertad; mantén los nombres de las funciones y la forma de lo que devuelven.

ArchivoFunciónDevuelveDe fábrica
hooks/server/vehicles.luaGetVehicles(src){ name, model, plate, class?, status }[] con status uno de garage, out, destroyed, impoundLee qbx_vehicles
hooks/server/properties.luaGetProperties(src){ name, address, type }[] con type uno de house, apartment, garage, businessLee nolag_properties
hooks/server/playtime.luaGetWorkedHours(citizenid), GetSessionMinutes(src)Horas enteras, minutosHoras de la tabla player_jobs_activity si existe; minutos de sesión contados por la tablet
hooks/server/stats.lua, hooks/client/stats.luaGetStats(src), GetStats(){ label, value, max?, icon? }[] estadísticas extra del perfilVacío
hooks/server/xp.luaOnJobCompleted(cb), EmitJobCompleted(src, info)—Escucha cuxial_jobs:server:JobCompleted
hooks/server/images.luaGetItemImage(itemKey), GetItemLabel(itemKey)URL de la imagen y etiqueta de un ítem del inventarioDetecta ox_inventory o qb-inventory

Cuando el recurso de origen no está en marcha, el adaptador devuelve una lista vacía y la tablet funciona igual.

hooks/server/vehicles.lua
lua
function Hooks.GetVehicles(src)
    local player = CuxialTablet.getPlayer(src)
    if not player then return {} end
    local rows = MySQL.query.await('SELECT plate, vehicle FROM my_vehicles WHERE owner = ?', { player.citizenid })
    local out = {}
    for i, v in ipairs(rows or {}) do
        out[i] = { name = v.vehicle, model = v.vehicle, plate = v.plate, status = 'garage' }
    end
    return out
end

Cambios habituales ​

Usar una cuenta de dinero existente para las coins

Desde el panel, sección VIP, pon account en bank. O, antes del primer arranque:

shared/config.lua
lua
vip = {
    account = 'bank',
    ...
},

Arrancar los empleos desde tu propio recurso de trabajos

Sección Trabajos del panel: city.startMode = event y city.startEvent = myjobs:client:start. El evento recibe el id del trabajo.

lua
RegisterNetEvent('myjobs:client:start', function(jobId)
    -- arrancar el trabajo
end)

Apagar la economía VIP y conservar el resto

Sección Tablet del panel: pages.vip = false. La página desaparece y no hacen falta coins.

Cambiar la tecla de la tablet

Sección Tablet del panel: keybind = F2. Los jugadores que ya habían entrado conservan su asignación y pueden cambiarla en los ajustes de teclas de GTA.

© Cuxial