Proyecto final: tu primer cajero (ATM) · Lección 2/4 · 10 min

El esqueleto y la zona del cajero

fxmanifest, config con las coords y un cliente que detecta cuándo estás cerca (con Wait dinámico).

lua
fx_version 'cerulean'
game 'gta5'
author 'TuNombre'
description 'Cajero simple'
version '1.0.0'

shared_scripts {
  '@es_extended/imports.lua',
  'config.lua',
}
client_scripts { 'client.lua' }
server_scripts { 'server.lua' }

fxmanifest.lua

lua
Config = {}
Config.Tecla = 38            -- E
Config.Distancia = 1.5
Config.Cajeros = {
  vector3(147.4, -1035.5, 29.3),
  vector3(-1212.9, -331.9, 37.7),
}

config.lua

lua
-- client.lua: detecta cercanía con Wait dinámico (módulo de rendimiento)
CreateThread(function()
  while true do
    local sleep = 1000
    local ped = PlayerPedId()
    local coords = GetEntityCoords(ped)
    for _, cajero in ipairs(Config.Cajeros) do
      if #(coords - cajero) < Config.Distancia then
        sleep = 0
        -- texto de ayuda simple
        BeginTextCommandDisplayHelp('STRING')
        AddTextComponentSubstringPlayerName('Pulsa ~INPUT_PICKUP~ para usar el cajero')
        EndTextCommandDisplayHelp(0, false, true, -1)
        if IsControlJustReleased(0, Config.Tecla) then
          abrirCajero()
        end
      end
    end
    Wait(sleep)
  end
end)

client.lua

Fíjate en el Wait dinámico: descansa 1s y solo va por frame cuando estás cerca de un cajero. Así el recurso es prácticamente gratis en rendimiento.

Practica lo aprendido

0/3
Test

¿Qué calcula #(coords - cajero) dentro del bucle del cliente?

Pista

El símbolo # sobre la resta de dos vector3 es la longitud (distancia).

Rellena los huecos

Completa el Wait dinámico: 0 mientras estás cerca, y descansa el resto del tiempo.

1if #(coords - cajero) < Config.Distancia then
2 sleep =
3end
4Wait()
Pista

Cerca: sleep = 0 para ir por frame. Siempre se espera la variable: Wait(sleep).

Corrige el error

Este bucle corre cada frame siempre y mata el rendimiento. Arréglalo con un Wait dinámico (descansa cuando no estás cerca).

Este código tiene un fallo:

1CreateThread(function()
2 while true do
3 local coords = GetEntityCoords(PlayerPedId())
4 for _, cajero in ipairs(Config.Cajeros) do
5 if #(coords - cajero) < Config.Distancia then
6 -- mostrar 'Pulsa E'
7 end
8 end
9 Wait(0)
10 end
11end)

Reescríbelo corregido:

Pista

Crea local sleep = 1000 al inicio del bucle, ponlo a 0 cuando estés cerca y usa Wait(sleep).

Reto: prográmalo tú

Añade un tercer cajero en otras coordenadas y prueba que el texto sale en los tres.

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

Ver pista

Añade otro vector3 a Config.Cajeros; saca coords con un comando que imprima GetEntityCoords.

Escribe aquí tu solución:

¿Qué tal esta lección?