QBCore a fondo: el jugador y su dinero · Lección 2/4 · 10 min

El objeto Player y su dinero

En el servidor, Player representa al jugador. Con él lees y mueves su dinero de forma segura.

En el servidor todo gira en torno al objeto Player: lo obtienes a partir del source (su ID de servidor). Dentro está PlayerData (datos) y Functions (acciones).

lua
local QBCore = exports['qb-core']:GetCoreObject()

local Player = QBCore.Functions.GetPlayer(source)
if not Player then return end -- siempre comprobar (puede no estar cargado)

Obtener el jugador

Leer y mover dinero

lua
-- QBCore tiene tres tipos de dinero por defecto: 'cash', 'bank' y 'crypto'
local cash = Player.PlayerData.money['cash']
local bank = Player.PlayerData.money['bank']

-- También con la función (más seguro):
local efectivo = Player.Functions.GetMoney('cash')

-- Mover dinero (el 3er argumento es el motivo, para los logs)
Player.Functions.AddMoney('cash', 500, 'venta-pescado')
Player.Functions.RemoveMoney('bank', 200, 'compra-tienda')

Dinero con QBCore

TODO esto va en el SERVIDOR. El dinero se mueve donde está la autoridad. Nunca des dinero desde el cliente. RemoveMoney devuelve true/false según si el jugador tenía suficiente: úsalo para validar.

Ejemplo: cobrar validando que tiene saldo

lua
RegisterNetEvent('tienda:server:comprar', function()
  local src = source
  local Player = QBCore.Functions.GetPlayer(src)
  if not Player then return end

  local precio = 1500
  if Player.Functions.RemoveMoney('bank', precio, 'compra-tienda') then
    -- RemoveMoney devolvió true: tenía saldo y se le ha cobrado
    QBCore.Functions.Notify(src, 'Compra realizada', 'success')
  else
    QBCore.Functions.Notify(src, 'No tienes suficiente dinero', 'error')
  end
end)

Cobro validado

Practica lo aprendido

0/3
Rellena los huecos

Obtén el jugador en el servidor a partir de su source y comprueba que existe.

1local Player = QBCore.Functions.(source)
2if not Player then end
Pista

El jugador puede no estar cargado todavía; por eso siempre el guard justo después.

Test

¿Cómo lees el efectivo ('cash') de un jugador desde su PlayerData?

Corrige el error

Este cobro no valida si el jugador tiene saldo. Usa el valor que devuelve RemoveMoney para decidir.

Este código tiene un fallo:

1local Player = QBCore.Functions.GetPlayer(source)
2if not Player then return end
3Player.Functions.RemoveMoney('bank', 1500, 'compra')
4QBCore.Functions.Notify(source, 'Compra realizada', 'success')

Reescríbelo corregido:

Pista

RemoveMoney devuelve true/false según el saldo. Envuelve el cobro en un if y notifica el error si devuelve false.

Reto: prográmalo tú

Haz un evento de servidor que cobre 250 del banco del jugador y solo dé un mensaje de éxito si RemoveMoney devolvió true.

Escríbelo tú en tu editor (VS Code) y pruébalo en tu servidor. Aquí se aprende haciéndolo, no copiando.

Ver pista

Usa if Player.Functions.RemoveMoney('bank', 250, 'motivo') then ... else ... end.

Escribe aquí tu solución:

¿Qué tal esta lección?