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).
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
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
-- 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¿Qué calcula #(coords - cajero) dentro del bucle del cliente?
Pista
El símbolo # sobre la resta de dos vector3 es la longitud (distancia).
Completa el Wait dinámico: 0 mientras estás cerca, y descansa el resto del tiempo.
if #(coords - cajero) < Config.Distancia then sleep = endWait()Pista
Cerca: sleep = 0 para ir por frame. Siempre se espera la variable: Wait(sleep).
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:
CreateThread(function() while true do local coords = GetEntityCoords(PlayerPedId()) for _, cajero in ipairs(Config.Cajeros) do if #(coords - cajero) < Config.Distancia then -- mostrar 'Pulsa E' end end Wait(0) endend)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:
