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.