Cómo funcionan las integraciones#
Ping Pong se comunica con el resto de tu servidor a través de unos pocos archivos pequeños y abiertos: custom/<framework>/server.lua para el dinero, los nombres y los identificadores, custom/<framework>/client.lua para los datos del jugador, y client/custom/ para las notificaciones, el aviso 3D, los sonidos y ox_target. Todos están fuera del escrow y puedes cambiarlos.
Capa | Compatibles | Sin ella |
|---|---|---|
Framework |
| Funciona standalone: las apuestas no mueven dinero, los nombres vienen de FiveM y los jugadores se guardan por licencia. |
Target |
| El aviso [E] - Ping Pong. |
Notificaciones |
| Notificaciones de ox_lib. |
Aviso 3D |
| Texto 3D integrado sobre un recuadro oscuro. |
Cada integración opcional se desactiva sin avisar. Si falta un recurso, su parte vuelve al comportamiento integrado, sin errores y sin nada que configurar.
Frameworks#
El framework se elige entre los que ya estén iniciados cuando arranca Ping Pong:
Recurso | Modo |
|---|---|
|
|
|
|
|
|
Ninguno |
|
Para forzar un modo en lugar de detectarlo, reemplaza la línea de detección en config/main.lua:
Config.Framework = 'qb' -- 'esx', 'qb' or 'standalone'Cada modo tiene una carpeta en custom/ — esx, qb y standalone — con un server.lua y un client.lua. El archivo de servidor responde cinco preguntas:
Función | Decide | Comportamiento de serie |
|---|---|---|
| Si un jugador puede cubrir una apuesta. | Efectivo en ESX, QBCore y Qbox. Ilimitado en standalone. |
| Cobra una apuesta. | Del efectivo, registrado como |
| Paga una victoria o un bote. | Al efectivo, registrado como |
| El nombre en el marcador, la lista de jugadores, las invitaciones y la tabla de clasificación. | El nombre del personaje en ESX y QBCore; el nombre de FiveM en standalone. |
| A quién pertenece una fila de la tabla de clasificación. | El identificador de ESX, el |
Apostar con el banco o con tu propia moneda#
Por defecto, las apuestas son en efectivo. Para usar el banco (o algo completamente distinto, como fichas de casino o una moneda VIP), cambia las tres funciones de dinero en el archivo de servidor de tu framework. Por ejemplo, ESX con la cuenta bancaria:
-- custom/esx/server.lua
function framework:getMoney(source)
local xPlayer = self:getPlayerFromId(source)
if not xPlayer then return 0 end
return xPlayer.getAccount('bank').money
end
function framework:removeMoney(source, amount)
local xPlayer = self:getPlayerFromId(source)
if not xPlayer then return false end
xPlayer.removeAccountMoney('bank', amount)
return true
end
function framework:addMoney(source, amount)
local xPlayer = self:getPlayerFromId(source)
if not xPlayer then return false end
xPlayer.addAccountMoney('bank', amount)
return true
endO QBCore y Qbox pagando con fichas de casino guardadas en ox_inventory:
-- custom/qb/server.lua
function framework:getMoney(source)
return exports.ox_inventory:GetItemCount(source, 'casino_chips') or 0
end
function framework:removeMoney(source, amount)
return exports.ox_inventory:RemoveItem(source, 'casino_chips', amount)
end
function framework:addMoney(source, amount)
return exports.ox_inventory:AddItem(source, 'casino_chips', amount)
endCambia las tres juntas.
getMoneyse consulta antes de cada apuesta,removeMoneyla cobra, yaddMoneypaga las victorias y los botes. Si una de ellas sigue usando efectivo, las apuestas salen de una cuenta y las victorias llegan a otra. Solo se ejecutan en el servidor.
ox_target#
Con Config.UseTarget = true, el aviso [E] se desactiva y cada modelo de mesa de Config.TableSkins (con y sin red) recibe tres opciones en el ojo del target, dentro de Config.InteractDistance: Play vs Player, Play vs Bot y Leaderboard. Se agregan en client/custom/target.lua una vez que se carga la primera mesa, y ox_target debe iniciarse antes que Ping Pong. Solo se admite ox_target.
Notificaciones, el aviso y los sonidos#
Tres funciones de client/custom/main.lua deciden cómo se ve y suena Ping Pong junto al resto de tu servidor:
Función | Qué hace | Predeterminado |
|---|---|---|
| Cada mensaje que ve un jugador. |
|
| El aviso [E] - Ping Pong sobre la mesa más cercana. |
|
| Los sonidos | Los sonidos propios de GTA V. |
Para usar otro sistema de notificaciones, cambia el cuerpo de Notification:
-- client/custom/main.lua
function Notification(msg, type)
exports['okokNotify']:Alert('Ping Pong', msg, 3000, type or 'info')
endLa rama qs-interface incluida maneja info, success y error. Agrégale un caso warning si quieres que Your opponent has left the match. también se muestre ahí.
Modelos de mesa y de raqueta#
Config.TableSkins lista los modelos de mesa que conoce Ping Pong, cada uno con y sin red, y le da a cada uno una etiqueta. El creador coloca Config.Creator.model — prop_table_tennis, la mesa azul. Para colocar otra, defínela ahí y mantenla en Config.TableSkins para que tenga su etiqueta y sus opciones de ox_target.
Config.TableSkins = {
{ net = 'prop_table_tennis', nonet = 'prop_table_tennis_nonet', label = 'Blue' },
{ net = 'prop_table_tennis_b', nonet = 'prop_table_tennis_b_nonet', label = 'Green' },
-- ...
}
Config.Creator = {
permission = 'command.pingpongcreator',
model = `prop_table_tennis_b`, -- the green table
rotateSpeed = 80.0,
heightStep = 0.05,
}La raqueta de los jugadores es la primera entrada de Config.RacketSkins; el bot sostiene prop_table_ten_bat. Las raquetas que sostiene un personaje se colocan en el hueso y los offsets de Config.Racket, y la pelota es prop_ping_pong (Config.Ball.model).
Idiomas#
Se incluyen 41 traducciones en locales/: árabe (ar), búlgaro (bg), bengalí (bn), catalán (ca), checo (cs), danés (da), alemán (de), griego (el), inglés (en), español (es), estonio (et), persa (fa), finés (fi), francés (fr), hebreo (he), hindi (hi), croata (hr), húngaro (hu), indonesio (id), italiano (it), japonés (ja), coreano (ko), lituano (lt), letón (lv), malayo (ms), neerlandés (nl), noruego (no), polaco (pl), portugués (pt), rumano (ro), ruso (ru), eslovaco (sk), esloveno (sl), sueco (sv), suajili (sw), tailandés (th), turco (tr), ucraniano (uk), urdu (ur), vietnamita (vi) y chino (zh). Elige uno en config/main.lua:
Config.Locale = 'es'Un solo archivo traduce las notificaciones y toda la interfaz, incluido el creador. Una clave que falta en una traducción se completa desde el inglés, con una advertencia Missing locale key en la consola; un código desconocido usa el inglés por completo. Para agregar un idioma, copia en.json, traduce los valores (nunca las claves), guárdalo con el nuevo código y pon Config.Locale en ese código.



