Este pequeno recurso de desenvolvimento faz com que cada cliente conectado exiba a hora UTC do host do FXServer. Use-o apenas quando for o único recurso que controla o relógio do jogo. Se o seu framework já gerencia tempo e clima, configure ou estenda esse recurso em vez de executar dois sistemas de relógio.
Este exemplo requer suporte a estado para GlobalState. Pare outros recursos de sincronização de tempo/clima na instância de teste para que apenas um controlador gerencie o relógio. Ele exibe UTC, não o fuso horário local do host do servidor.
A configuração e os exemplos de código aqui são voltados ao FiveM para GTA V Legacy. O Enhanced tem regras diferentes de runtime e de compatibilidade; verifique as alterações de Legacy para Enhanced do Cfx.re antes de aplicá-las a um servidor Enhanced.
Prepare o teste
Verifique se o relógio do host está preciso. Faça backup da configuração existente do recurso de tempo e use um servidor isolado. Crie resources/[local]/utc_clock com os três arquivos abaixo. O servidor publica a hora; os clientes não podem definir valores de GlobalState no servidor.
1. Declare o recurso
Salve isso como fxmanifest.lua:
fx_version 'cerulean'
game 'gta5'
server_script 'server.lua'
client_script 'client.lua'
2. Publique UTC do servidor
Salve isso como server.lua. O ponto de exclamação inicial em os.date seleciona UTC em vez do fuso horário local do 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. Exiba o relógio compartilhado
Salve isso 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)
Iniciar, verificar e parar
- Adicione ensure utc_clock ao server.cfg após desabilitar o controlador de relógio concorrente no servidor de teste.
- No console do servidor, execute refresh e ensure utc_clock. Conecte-se com dois clientes e compare o tempo de jogo exibido com o UTC atual.
- Reconecte um cliente, reinicie o recurso e repita a comparação. Inspecione os logs do F8 e do servidor.
- Execute stop utc_clock no console do servidor para liberar esta substituição. Para restaurar seu sistema de tempo anterior, remova a nova linha ensure e reinicie o recurso de tempo original ou o servidor.
Conheça os limites
Este exemplo segue um dia UTC real de 24 horas; ele não acelera a luz do dia nem seleciona um fuso horário regional de horário de verão. Atrasos de rede e agendamento significam que não é uma indicação precisa do horário real. Ele não sincroniza o clima.
Consulte as state bags da Cfx.re e a função nativa de substituição do relógio antes de integrar esse padrão a um recurso maior.