Criação

Criar Reinicializações Sem Interrupções para Seus Jogadores

Você pode usar as **Notificações de Reinicialização** para evitar que os jogadores sejam interrompidos de forma inesperada por reinicializações do servidor. Esse recurso é especialmente útil em experiências nas quais os jogadores podem estar no meio de uma partida, realizando uma missão importante, negociando itens, salvando progresso ou participando de alguma atividade que não deve ser encerrada sem aviso prévio. Primeiro, anexe um callback ao evento em seus scripts para que sua experiência seja capaz de detectar quando uma reinicialização do servidor estiver prestes a acontecer. A partir desse callback, você pode notificar os jogadores sobre a reinicialização iminente, exibindo uma mensagem na interface, enviando um aviso no chat, mostrando um temporizador de contagem regressiva ou usando qualquer outro método visual adequado ao estilo da sua experiência. Antes do fechamento do servidor, você pode solicitar que os jogadores salvem seu progresso, concluir ações pendentes, teleportá-los para novos servidores disponíveis ou executar qualquer outra lógica personalizada necessária para preservar a continuidade da experiência. Por exemplo, você pode impedir que novas partidas sejam iniciadas, bloquear compras temporariamente, registrar dados importantes no armazenamento persistente ou mover automaticamente os jogadores para uma instância atualizada do servidor. Ao implementar esse comportamento, é recomendável garantir que os jogadores recebam informações claras e com antecedência suficiente. Uma mensagem simples, como “O servidor será reiniciado em breve. Salvando seu progresso…”, pode reduzir frustração e ajudar os jogadores a entenderem o que está acontecendo. Também é importante que qualquer operação crítica, como salvamento de dados ou teletransporte, seja tratada com cuidado para minimizar perdas de progresso ou desconexões inesperadas. O evento ServerRestartScheduled contém os seguintes argumentos:

ArgumentoTipoDescrição
RestartTimeDateTimeO horário mais cedo em que a reinicialização externa está agendada para ocorrer. Para atualizações envolvendo muitos servidores, o horário real de reinicialização pode ser ligeiramente posterior a esse horário.
SourceEnum.CloseReasonPara reinicializações que você inicia, isso sempre será DeveloperUpdate.
AttributesDictionaryTabela flexível para indicar o propósito da reinicialização. Você pode usar isso para indicar o motivo da reinicialização, urgência, uma mensagem para o usuário, etc. A tabela ficará vazia se nenhum atributo for fornecido.

Enviaremos notificações para todas as reinicializações adiadas que você iniciar. A entrega ocorre em tempo real, com base no melhor esforço, geralmente em 1 a 2 segundos, e apresenta uma taxa de sucesso de 99,9%.

No Creator Hub, quando confirmando uma reinicialização do servidor, você pode anexar uma carga JSON personalizada à reinicialização que preencherá o campo de atributos no evento.

image1

Como Usar Notificações de Reinicialização

  1. Para começar, em um script do lado do servidor, conecte um callback a game.ServerRestartScheduled:

local roundInProgress = false -- Definido em outro lugar no código do jogo sempre que uma rodada começa ou termina
local restartPending = false

game.ServerRestartScheduled:Connect(function(restartTime, source, attributes)
    local msg = attributes and attributes.message or ""
    local timeStr = restartTime:FormatLocalTime("LTS", "en-us") -- já que isso é executado no servidor, estará em UTC
    -- Encaminhe esses campos para os clientes via remote:FireAllClients() para exibir mensagens personalizadas na sua UI
    print(string.format("Reinicialização do servidor em %s a partir da origem: %s. Motivo: %s.", timeStr, tostring(source), msg))

    if not roundInProgress then
        print("Sem rodada em andamento. Teleportando jogadores em 10 segundos")
        task.wait(10)

        -- Teleportando jogadores quando uma reinicialização for agendada os levará para um servidor na versão mais recente do lugar
        -- Certifique-se de adicionar código de tratamento de erros caso o teleporte falhe
        game:GetService("TeleportService"):TeleportAsync(game.PlaceId, game:GetService("Players"):GetPlayers())

    else
        -- Você pode adicionar código para teleportar jogadores após uma rodada terminar se restartPending for verdadeiro.
        restartPending = true
    end
end)

Em seguida, você pode utilizar o source salvo, o restartTime e os campos de attributes para preencher modais direcionados ao usuário ou teletransportar jogadores para fora do servidor.

Após o envio da reinicialização, assim que a notificação chegar ao servidor do jogo, o callback personalizado armazenará esses campos e os encaminhará aos clientes.

Quer aprender mais sobre Criação de games? Acesse: https://www.metablox.com.br

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *