Este pequeño recurso de desarrollo hace que cada cliente conectado muestre la hora UTC del host de FXServer. Úsalo solo cuando sea el único propietario del reloj del juego. Si tu framework ya gestiona la hora y el clima, configura o extiende ese recurso en lugar de ejecutar dos sistemas de reloj.
Este ejemplo requiere soporte de estado para GlobalState. Detén otros recursos de sincronización de tiempo/clima en la instancia de prueba para que un controlador sea el dueño del reloj. Muestra UTC, no la zona horaria local del host del servidor.
Los ejemplos de configuración y código aquí están dirigidos a FiveM para GTA V Legacy. Enhanced tiene diferentes reglas de tiempo de ejecución y compatibilidad; consulta los cambios de Legacy a Enhanced de Cfx.re antes de aplicarlos a un servidor Enhanced.
Prepara la prueba
Verifica que el reloj del host sea preciso. Haz una copia de seguridad de la configuración del recurso de tiempo existente y usa un servidor aislado. Crea resources/[local]/utc_clock con los tres archivos siguientes. El servidor publica la hora; los clientes no pueden establecer valores de GlobalState en el servidor.
1. Declara el recurso
Guarda esto como fxmanifest.lua:
fx_version 'cerulean'
game 'gta5'
server_script 'server.lua'
client_script 'client.lua'
2. Publica UTC desde el servidor
Guarda esto como server.lua. El signo de exclamación inicial en os.date selecciona UTC en lugar de la zona horaria local del host:
CreateThread(function()
while true do
local now = os.date('!*t')
GlobalState.tutorialUtcClock = {
hour = now.hour, minute = now.min, second = now.sec
}
Wait(1000)
end
end)
AddEventHandler('onResourceStop', function(name)
if name == GetCurrentResourceName() then
GlobalState.tutorialUtcClock = nil
end
end)
3. Muestra el reloj compartido
Guarda esto como client.lua:
CreateThread(function()
while true do
local clock = GlobalState.tutorialUtcClock
if clock then
NetworkOverrideClockTime(clock.hour, clock.minute, clock.second)
end
Wait(1000)
end
end)
AddEventHandler('onResourceStop', function(name)
if name == GetCurrentResourceName() then
NetworkClearClockTimeOverride()
end
end)
Inicia, comprueba y detén
- Añade ensure utc_clock a server.cfg después de deshabilitar el controlador de reloj competidor en el servidor de prueba.
- En la consola del servidor, ejecuta refresh y ensure utc_clock. Únete con dos clientes y compara la hora del juego mostrada con la UTC actual.
- Vuelve a conectar un cliente, reinicia el recurso y repite la comparación. Inspecciona tanto los registros F8 como los del servidor.
- Ejecuta stop utc_clock en la consola del servidor para liberar esta anulación. Para restaurar tu sistema de tiempo anterior, elimina la nueva línea ensure y reinicia el recurso de tiempo original o el servidor.
Conoce los límites
Este ejemplo sigue un día UTC real de 24 horas; no acelera la luz del día ni selecciona una zona horaria regional de horario de verano. Los retrasos de red y de programación significan que no es una representación exacta de la hora real. No sincroniza el clima.
Consulta la documentación de state bags de Cfx.re y la función nativa para sobrescribir el reloj antes de integrar este patrón en un recurso más amplio.