Todo lo que otros scripts pueden usar de Theme Park: los dos comandos de chat, los exports de servidor y el export de cliente, y los eventos que informan a tus recursos de lo que pasa en el parque — atracciones a las que se sube y que terminan, rondas de autos de choque, partidas de dardos, rondas de canastas y compras. Funcionan igual en servidores ESX, QBCore, Qbox y standalone.
Comandos#
Los jugadores no necesitan ningún comando para usar el parque: las atracciones, los juegos y los puestos se abren con la tecla de subir (consulta Uso). Theme Park registra dos comandos:
Comando | Quién puede usarlo | Qué hace |
|---|---|---|
| Jugadores con el ace | Abre el panel de configuración, donde todo el parque se configura y se guarda en la base de datos. Consulta Uso. |
| Todos | Guarda el souvenir que el jugador lleva en las manos. Asignado a J por defecto. |
Quién puede abrir el panel de configuración#
Cualquiera puede escribir el comando, pero el panel solo se abre para un jugador cuyo ace permita command.themeparkconfig. Dáselo a tu grupo de administradores en server.cfg:
add_ace group.admin command.themeparkconfig allowSer administrador en ESX, QBCore o Qbox no basta por sí solo: el panel solo comprueba este ace. Un jugador sin él ve You do not have permission to change the theme park settings. y la consola del servidor lo nombra. Cómo poner a tu staff en group.admin se explica en Instalación.
Cambiar el nombre del comando de configuración#
El nombre se cambia en Settings → Commands → Settings command, escrito sin la barra. Es el único ajuste que necesita un reinicio: guárdalo, luego reinicia qs-themepark (o el servidor) y el nuevo nombre funciona para todos. La sugerencia del chat sigue el nuevo nombre.
La tecla para guardar#
/themeparkputaway se registra como un key mapping de FiveM llamado Theme park: put the souvenir away, en J por defecto. Cada jugador puede asignarla a otra tecla en el menú de pausa de GTA: Settings → Key Bindings → FiveM. El panel de la tienda y la pista que se muestra al llevar un souvenir muestran la tecla que el jugador asignó.
Un souvenir guardado sale de las manos del jugador; no va al inventario. También se guarda cuando el jugador muere o compra otro, y solo se oculta — no se guarda — mientras conduce, monta en una atracción o come.
Exports#
Llámalos desde cualquier recurso con exports['qs-themepark']. En los exports de servidor, src es el id de servidor de un jugador.
Ids de atracciones#
Cada export y evento nombra una atracción con uno de estos ids:
Id | Atracción |
|---|---|
| Noria |
| Montaña rusa |
| Torre de caída |
| Sky drop |
| Sillas voladoras |
| Autos de choque |
Exports de servidor#
Export | Devuelve |
|---|---|
| El id de la atracción en la que está o a la que sube el jugador ( |
| Una tabla |
| Lo que cuesta ahora una atracción: el precio propio de la atracción, o el precio del parque cuando el de la atracción es |
|
|
| Da un pase de día, o añade los minutos al que está activo. Devuelve la hora Unix en que caduca, o |
| Los diez mejores jugadores de dardos, el mejor primero: una lista de |
| La mejor puntuación de dardos del jugador, o |
| Lo mismo que |
| La mejor puntuación de canastas del jugador, o |
| El id de menú del souvenir que lleva el jugador ( |
| Nada. Quita el souvenir de las manos del jugador, como hace |
-- server script of your own resource
local park = exports['qs-themepark']
local function parkInfo(src)
-- Is the player on a ride? ('coaster', 'sky'... or false)
local ride = park:IsOnRide(src)
if ride then print(('Player %d is on %s'):format(src, ride)) end
-- What the roller coaster is doing right now
local coaster = park:GetRideState('coaster')
if coaster and coaster.enabled and coaster.state == 'WAITING' then
print(('Coaster leaves in %d s, %d/%d seats taken'):format(coaster.timer, coaster.seatsTaken, coaster.seatsTotal))
end
-- Prices and the day pass
print(('The Ferris wheel costs $%d'):format(park:GetRidePrice('wheel')))
if not park:HasPass(src) then
local expires = park:GivePass(src, 60) -- one hour; nil if no character is loaded yet
if expires then print('Pass valid until ' .. os.date('%H:%M', expires)) end
end
-- Leaderboards
for i, row in ipairs(park:GetDartsLeaderboard('today')) do
print(i, row.name, row.score)
end
local best = park:GetHoopsBestScore(src) -- nil if the player never finished a round
-- Free the player's hands
if park:GetCarriedSouvenir(src) then
park:ClearCarriedSouvenir(src)
end
endUn pase de
GivePassfunciona aunque el pase de día no esté a la venta, se guarda como uno comprado (sobrevive a reconexiones y reinicios) y se publica en el registro de Discordeconomycon el nombre del recurso que lo dio. No disparapassBought.Las clasificaciones guardan una línea por jugador — su mejor partida — y solo cuentan partidas jugadas hasta el final: todos los dardos lanzados, o una ronda de canastas jugada hasta la bocina.
'today'sigue el reloj del servidor.GetBestScoreyGetHoopsBestScoretambién aceptan el identificador del jugador tal como se guarda en las tablas de puntuaciones en lugar de un id de servidor.
Estado de la atracción#
GetRideState informa de la fase propia de cada atracción en mayúsculas. Todas las atracciones informan CLOSED mientras no funcionan.
Atracción | state | Notas |
|---|---|---|
|
| Sin |
|
|
|
|
|
|
|
|
|
enabled pasa a false en cuanto la atracción se desactiva en el panel, incluso mientras los que ya van en ella terminan su viaje. seatsTaken y seatsTotal cuentan cabinas, asientos o coches; queue es 0 en todas las atracciones menos la noria.
Export de cliente#
IsOnRide() devuelve el id de la atracción en la que está o a la que sube el jugador local, o false. Úsalo para mantener oculto tu HUD, o para bloquear un menú o un emote mientras el jugador está en una atracción.
-- client script of your own resource
local ride = exports['qs-themepark']:IsOnRide()
if ride then
print('You are on the ' .. ride)
endEventos#
Ajustes aplicados#
qs-themepark:settingsApplied se dispara en el servidor y en cada cliente cuando los ajustes guardados se cargan por primera vez, y de nuevo tras cada guardado o restablecimiento en el panel. No lleva argumentos: lee lo que necesites con los exports.
-- server side
AddEventHandler('qs-themepark:settingsApplied', function()
local price = exports['qs-themepark']:GetRidePrice('coaster')
print(('Theme Park settings applied: the roller coaster costs $%d'):format(price))
end)Eventos de servidor#
Theme Park los dispara en el servidor con TriggerEvent, así que un script de servidor de otro recurso los escucha con AddEventHandler. src es el id de servidor del jugador.
Evento | Argumentos | Cuándo |
|---|---|---|
|
| Un jugador ocupó un asiento (en la noria: entró en una cabina). |
|
| Un pasajero dejó la atracción por cualquier motivo: la atracción terminó, se bajó, la atracción cerró o salió del servidor. |
|
| Terminó una ronda de autos de choque con conductores. |
|
| Terminó una partida de dardos, jugada hasta el final o no. |
|
| Terminó una ronda de canastas, jugada hasta la bocina o no. |
|
| Un jugador compró un pase de día en la taquilla o en un panel de atracción. |
|
| Se entregó un pedido de comida o souvenirs. |
|
| El mismo pedido, solo para puestos de comida. Se dispara justo después de |
Resultados de dardos y canastas
Campo | Significado |
|---|---|
| El número de la diana o de la pista de canastas (su fila en |
| Los puntos de la partida de dardos, o de la ronda de canastas. |
| Solo canastas: las canastas encestadas y los balones lanzados. |
| La puntuación alcanzó un nivel de premios. |
| El premio entregado, como texto ( |
|
|
Pedidos de la tienda
Argumento | Significado |
|---|---|
| El id del puesto en la lista de puestos ( |
|
|
| Lo que se entregó: una lista de |
| El dinero pagado, después del reembolso de cualquier línea que no se pudo entregar. |
Una recompensa por atracciones, juegos y compras, desde tu propio script de servidor:
local park = exports['qs-themepark']
local rides = {}
AddEventHandler('qs-themepark:server:rideBoarded', function(src, rideId, method, price)
print(('%s boarded %s (%s, $%d)'):format(GetPlayerName(src), rideId, method, price))
end)
-- Every fifth ride: a free hour on every ride
AddEventHandler('qs-themepark:server:rideFinished', function(src, rideId)
if not GetPlayerName(src) then return end -- already left the server
rides[src] = (rides[src] or 0) + 1
if rides[src] % 5 == 0 then
park:GivePass(src, 60)
TriggerClientEvent('chat:addMessage', src, { args = { 'Theme Park', 'Five rides! The next hour is on us.' } })
end
end)
AddEventHandler('playerDropped', function()
rides[source] = nil
end)
AddEventHandler('qs-themepark:server:dartsFinished', function(src, result)
if result.reason == 'done' and result.won then
TriggerEvent('my-achievements:unlock', src, 'darts_winner')
end
end)
AddEventHandler('qs-themepark:server:hoopsFinished', function(src, result)
if result.reason == 'done' then
print(('%s scored %d (%d/%d baskets)'):format(GetPlayerName(src), result.score, result.makes, result.shots))
end
end)
AddEventHandler('qs-themepark:server:bumperRoundEnded', function(results, winnerSrc)
if winnerSrc then
print(('%s won the bumper cars with %d hits'):format(results[1].name, results[1].hits))
end
end)
AddEventHandler('qs-themepark:server:shopBought', function(src, vendorId, shopType, items, total)
for _, line in ipairs(items) do
if line.id == 'teddy' then
TriggerEvent('my-quests:progress', src, 'buy_giant_teddy')
end
end
end)Eventos de cliente#
El servidor los envía a cada cliente, para las animaciones de las atracciones y las pantallas de los juegos. Léelos en un script de cliente y compara src con tu propio id de servidor para reaccionar solo al jugador local. Para todo lo que paga o cuenta, usa los eventos de servidor de arriba.
Subir a una atracción y bajarse
Evento | Argumentos |
|---|---|
|
|
|
|
|
|
|
|
|
|
-- client script: react when the local player gets on the roller coaster
local me = GetPlayerServerId(PlayerId())
RegisterNetEvent('qs-themepark:coaster:onBoard', function(src, car, place)
if src ~= me then return end
print(('You sit in car %d, seat %s'):format(car + 1, place))
end)Termina una partida de dardos o una ronda de canastas
qs-themepark:darts:finish — (targetId, result) y qs-themepark:hoops:finish — (laneId, result). result contiene los campos de los eventos de servidor (total para dardos; score, makes y shots para canastas; won, prize y reason para ambos), más:
Campo | Significado |
|---|---|
| El jugador que jugó. |
| Los puntos que necesita el nivel de premios más bajo. |
| Si se entregó un premio. |
|
|
| Solo dardos: qué nivel de premios alcanzó la puntuación. |
Solo escucha estos eventos. Dispararlos tú mismo no cambia nada en el parque: los asientos, las puntuaciones, los pagos y los premios se deciden en el servidor, nunca se toman de un cliente. Un
TriggerEventpropio solo engañaría a los demás recursos que los escuchan.



