Pular para o conteúdo
RPScripts

Como Sincronizar o Relógio do Jogo FiveM com UTC

Por Luke

Sincronização em tempo real para FiveM - Mods gratuitos para FiveM

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

  1. Adicione ensure utc_clock ao server.cfg após desabilitar o controlador de relógio concorrente no servidor de teste.
  2. 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.
  3. Reconecte um cliente, reinicie o recurso e repita a comparação. Inspecione os logs do F8 e do servidor.
  4. 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.

Ver state bags do Cfx.re e o native de substituição do relógio antes de integrar o padrão em um recurso maior.

Documentação de referência

Fonte: lua.org

Seleção premium para o seu servidor

  • elevador de carro
    • ESX
    • QBCore
    • vRP
    US$ 4,99€ 4,99£ 3,99AU$ 7,99R$ 25,99CHF 4,99JP¥ 790
  • Pré-visualização do recurso KS Loadingscreen FiveM
      US$ 13,99€ 12,99£ 10,99AU$ 20,99R$ 71,99CHF 11,99JP¥ 2.220
    • Polícia de Origen
      • QBCore
      US$ 23,00€ 20,99£ 17,99AU$ 33,99R$ 116,99CHF 18,99JP¥ 3.640
    • Mirror Park Hood
        US$ 8,00€ 7,99£ 6,99AU$ 11,99R$ 40,99CHF 6,99JP¥ 1.270
      • Polícia de Origen
        • ESX
        US$ 23,00€ 20,99£ 17,99AU$ 33,99R$ 116,99CHF 18,99JP¥ 3.640
      Ver a loja