Servidores de Jogos

Salvando dados de jogadores: quando e como

Salvando dados de jogadores: quando e como

Nada irrita mais um jogador que perder o carro que comprou ou o dinheiro de uma noite de trabalho. Uma boa estratégia de salvamento evita isso sem sobrecarregar o banco.

Três momentos de salvar

1. Ao desconectar

O básico: em OnPlayerDisconnect, salve os dados que mudaram.

public OnPlayerDisconnect(playerid, reason)
{
    if (Jogador[playerid][jLogado])
        SalvarJogador(playerid);
    return 1;
}

2. Periodicamente

Se o servidor cair (crash, falta de energia), OnPlayerDisconnect pode não ser chamado. Um salvamento a cada 5 a 10 minutos limita a perda.

Distribua os salvamentos: em vez de salvar 300 jogadores no mesmo segundo, salve alguns a cada tick.

3. Imediatamente, em transações importantes

Compra de casa, veículo, transferência bancária, venda para outro jogador: salve na hora. São justamente os dados que ninguém aceita perder, e alvos de duplicação.

Salve só o que mudou

stock SalvarJogador(playerid)
{
    new query[256];
    mysql_format(Banco, query, sizeof(query),
        "UPDATE contas SET dinheiro = %d, nivel = %d, skin = %d WHERE id = %d",
        Jogador[playerid][jDinheiro],
        Jogador[playerid][jNivel],
        Jogador[playerid][jSkin],
        Jogador[playerid][jID]);
    mysql_tquery(Banco, query);
    return 1;
}
  • Use o ID numérico da conta no WHERE, não o nome;
  • Separe dados que mudam muito (dinheiro, posição) de dados que mudam pouco (e-mail, data de registro);
  • Use mysql_tquery (assíncrono) para não travar o servidor.

Evite duplicação de itens

Dupes clássicos acontecem quando o jogador desconecta no meio de uma troca. Para evitar:

  • Faça a transferência toda no servidor, validando os dois lados;
  • Salve os dois jogadores na mesma operação (idealmente numa transação SQL);
  • Bloqueie ações durante trocas pendentes.

Ao desligar o servidor

Em OnGameModeExit, salve todos os jogadores logados antes de mysql_close. Use comandos de desligamento controlados, com aviso e salvamento, em vez de matar o processo.

Backups

Salvar bem não substitui backup. Veja nosso post sobre backups do banco.

Hospede seu servidor com a VittHost

Os planos OPENMP-BR da VittHost incluem MySQL e rodam em servidores no Brasil com painel Pterodactyl, proteção DDoS, compatibilidade total com scripts SA-MP e teste grátis de 3 dias.

Compartilhar:

Pronto para hospedar seu próximo projeto?

VPS com painel pré-instalado em 1 clique. Ativação imediata.

Ver planos VPS