Antes de empezar#
Antes de instalar Ping Pong, asegúrate de que tu servidor cumple los requisitos mínimos. Cuatro cosas son obligatorias; todo lo demás es opcional y se detecta solo.
Requisito | Estado | Notas |
|---|---|---|
OneSync | Obligatorio | Declarado como dependencia: el recurso no arranca sin él. |
| Obligatorio | Guarda las mesas colocadas con el creador y la clasificación. |
| Obligatorio | Callbacks, el menú de la mesa, las notificaciones y las zonas de espectadores. |
| Obligatorio | Incluido en la descarga. Carga los modelos de las raquetas y está declarado como dependencia. |
Framework | Opcional |
|
| Opcional | Opciones de la mesa en el target eye en lugar del aviso [E] - Ping Pong. Desactivado por defecto. |
| Opcional | Notificaciones con su estilo en lugar de las de ox_lib. |
| Opcional | Dibuja el aviso [E] - Ping Pong en lugar del texto 3D integrado. |
Descargar Ping Pong#
Después de comprar Ping Pong, el recurso se vincula automáticamente a tu cuenta de CFX Portal.
Inicia sesión en CFX Portal con la misma cuenta que usaste al finalizar la compra, abre Granted Assets y descarga Ping Pong.
Después de extraer la descarga, deberías tener dos carpetas:
qs-pingpong/
├── config/ -- main.lua: everything you may edit
├── custom/ -- money, names and identifiers per framework (editable)
├── client/custom/ -- notifications, the 3D prompt and ox_target (editable)
├── server/custom/ -- the debug console commands (editable)
├── database/ -- sql.sql, to import once
├── locales/ -- 41 languages
└── web/ -- the interface, ready to use
pingpong-objects/ -- streams the racket modelsSolo
config/,custom/,client/custom/,server/custom/ylocales/se pueden editar. Todo lo demás está protegido por el escrow de assets de CFX y cada actualización lo reemplaza por completo. Mantén ambos nombres de carpeta tal como están:qs-pingpongpidepingpong-objectspor su nombre.
Instalar el recurso#
Mueve ambas carpetas al directorio resources de tu servidor. Pueden estar en cualquier lugar dentro de él, incluso en una carpeta de categoría:
resources/
└── [qs]/
├── pingpong-objects/
└── qs-pingpong/Una vez copiadas, abre tu server.cfg y asegúrate de que cada dependencia —y todo lo que deba detectar— arranque antes que Ping Pong:
ensure oxmysql
ensure ox_lib
# Framework
ensure es_extended
# ensure qb-core
# ensure qbx_core
# Optional
# ensure ox_target
ensure qs-interface
ensure qs-textui
ensure pingpong-objects
ensure qs-pingpongEl orden de carga importa. El framework y qs-textui se detectan una sola vez, cuando Ping Pong arranca, así que uno que arranque después no se encuentra: un framework tardío deja Ping Pong en modo standalone — las apuestas no mueven dinero — y un qs-textui tardío deja el aviso integrado en su lugar.
Importar la base de datos#
Ping Pong no crea sus tablas por sí solo. Importa database/sql.sql una vez, antes del primer arranque, con tu gestor de bases de datos —HeidiSQL, phpMyAdmin, DBeaver o Navicat— o con la línea de comandos de MySQL. Es seguro ejecutarlo de nuevo: ambas sentencias solo crean lo que falta.
CREATE TABLE IF NOT EXISTS `qs_pingpong_tables` (
`id` VARCHAR(32) NOT NULL,
`coords` LONGTEXT DEFAULT NULL,
`model` VARCHAR(64) NOT NULL,
`label` VARCHAR(128) NOT NULL DEFAULT '',
`price` INT NOT NULL DEFAULT 0,
`payment_method` VARCHAR(16) NOT NULL DEFAULT 'money',
`allowed_modes` TEXT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `qs_pingpong_leaderboard` (
`identifier` VARCHAR(60) PRIMARY KEY,
`name` VARCHAR(50) NOT NULL,
`elo` INT DEFAULT 1200,
`wins` INT DEFAULT 0,
`losses` INT DEFAULT 0,
`streak` INT DEFAULT 0,
`best_streak` INT DEFAULT 0,
`last_played` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);Tabla | Contiene |
|---|---|
| Una fila por cada mesa colocada con el creador: su ID (calculado según dónde está), la posición y la orientación como JSON en |
| Una fila por cada jugador que ha terminado un duelo puntuado: su nombre, su puntuación ELO (1200 al empezar), victorias, derrotas, racha de victorias actual y mejor racha, y cuándo jugó por última vez. |
Dar acceso al creador#
El creador de mesas está protegido por un permiso ACE, command.pingpongcreator por defecto. Dáselo a tu grupo de administradores en server.cfg e inclúyete en ese grupo:
add_ace group.admin command.pingpongcreator allow
add_principal identifier.license:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx group.adminSi tu staff ya está en group.admin, la primera línea es todo lo que necesitas. Los aces de server.cfg se leen cuando se ejecuta, así que reinicia el servidor después de añadirlos.
El nombre del permiso es Config.Creator.permission. Cámbialo por un ace propio y otorga ese en su lugar:
Config.Creator = {
permission = 'qs-pingpong.admin',
model = `prop_table_tennis`,
rotateSpeed = 80.0,
heightStep = 0.05,
}El servidor vuelve a comprobar el mismo ace en cada guardado, movimiento y borrado, así que un jugador sin él no puede cambiar las mesas ni enviando los eventos a mano.
Configurar el recurso#
Todo está en un único archivo comentado, config/main.lua. Se lee cuando arranca el recurso, así que reinicia qs-pingpong después de editarlo.
Sección | Contenido |
|---|---|
| El idioma —uno de 41 códigos— y la salida de depuración con sus dos comandos de consola. |
| A qué distancia debe estar un jugador para usar una mesa (2.5 m), para verla (30 m), para que lo reten en ella (15 m) y para ver un partido (15 m). |
| Opciones de ox_target en lugar del aviso [E]. |
| Apuestas activadas o desactivadas, el rango de la apuesta y el paso del deslizador, y cuánto paga una victoria contra el bot según la dificultad y la velocidad. |
| Puntuación activada o desactivada, el duelo más corto que cuenta, cuántos jugadores se muestran, la puntuación inicial y el factor K. |
| Los modos disponibles y sus límites de puntos, las velocidades de la pelota disponibles, y el tiempo de reacción, la probabilidad de fallo y el error de puntería de los tres bots. |
| La gravedad, el tamaño de la raqueta, el tiempo de espera entre golpes y el margen después de un saque; cómo bota la pelota y a qué velocidad viaja en cada nivel; y cómo se asigna el ratón a tu mitad de la mesa. |
| Cada cuánto se sincroniza un duelo (cada 16 ms) y cómo se corrige la pelota del segundo jugador. |
| La cámara detrás de cada extremo de la mesa; el anillo de bote, la flecha de golpe y el destello al golpear; y los sonidos de golpe, victoria y derrota. |
| Dónde se coloca cada jugador, cómo queda la raqueta en la mano de un ped, las animaciones de golpe, saque y reacción, y los personajes usados para el bot y los sustitutos. |
| Los modelos de la mesa y la raqueta, y el permiso, el modelo, la velocidad de rotación y el paso de altura del creador. |
| La tecla de interacción ( |
Los valores que conviene revisar primero:
Config.Locale = 'en' -- ar, bg, bn ... uk, ur, vi, zh
Config.Debug = false -- ships as true: turn it off on a live server
Config.UseTarget = false -- true = ox_target options instead of the [E] prompt
Config.Betting = {
enabled = true,
min = 100, -- smallest stake accepted against the bot
max = 10000, -- top of the stake slider
step = 100, -- slider step
}
Config.Leaderboard = {
enabled = true,
minMatchDuration = 15, -- seconds; shorter duels are not rated
topCount = 20, -- players listed
}
Config.ELO = {
base = 1200, -- starting rating
k = 32, -- how far one duel moves a rating
}
Config.Debugviene activado. Además de mostrar más información en la consola, registra dos comandos de consola que reinician o rellenan la clasificación, y dibuja la zona de espectadores alrededor de cada partido en curso para que todos la vean. Desactívalo antes de abrir el servidor a los jugadores.
Algunas claves del archivo no tienen efecto en esta versión: Config.AutoDetect, Config.TableModel, Config.ChallengeTimeout (las invitaciones siempre duran 30 segundos), Config.PeerJS, los valores multiplier de Config.SpeedLevels (la velocidad de la pelota viene de Config.Ball.speeds), y las entradas leaderboard, mouseLock y cameraToggle de Config.Keys.
Verificar la instalación#
Reinicia tu servidor y lee la consola. En una instalación correcta verás líneas como estas:
[qs-pingpong:INFO] Locale loaded: en (14 keys)
[qs-pingpong:INFO] Server framework loaded: esx
[qs-pingpong:INFO] Loaded 0 ping pong table(s) from SQL.
[qs-pingpong:INFO] Matchmaking initialized with 0 tablesServer framework loaded indica el modo que eligió Ping Pong: esx, qb (QBCore y Qbox) o standalone cuando no encontró ninguno. El número de mesas es cuántas mesas ha guardado el creador; si esa línea nunca aparece, o aparece un error de SQL en su lugar, la base de datos no se importó o oxmysql no está conectado.
Después entra a tu servidor y completa el primer recorrido:
Coloca una mesa
Escribe
/pingpongcreator, pulsa +, ponle nombre a la mesa y pulsa Select. Apunta a un suelo despejado, gírala conZ/X, haz clic izquierdo para colocarla y luego Save Table.Juega contra el bot
Acércate a la mesa y pulsa
E→ Play vs Bot → Ready. Cuando la pelota se lance en tu lado, mueve el ratón para llevar la raqueta hasta ella y haz un movimiento rápido hacia delante para pasarla al otro lado.Reta a alguien
Con un segundo jugador a menos de 15 m de la mesa, elige Play vs Player, selecciónalo de la lista, elige la configuración y pulsa Ready. Acepta desde su propia pantalla y el partido empieza para ambos.
Nada en el creador necesita un reinicio: las mesas nuevas, los nombres, los movimientos y los borrados llegan a todos los jugadores al instante. Uso cubre todo lo que puede hacer un partido.



