Variáveis por jogador e enums: organizando os dados do gamemode
Todo gamemode guarda informações de cada jogador: dinheiro, nível, emprego, se está logado. Organizar esses dados bem evita um dos bugs mais comuns do SA-MP e do open.mp: dados de um jogador aparecendo para outro.
O jeito desorganizado
new Dinheiro[MAX_PLAYERS];
new Nivel[MAX_PLAYERS];
new Emprego[MAX_PLAYERS];
new bool:Logado[MAX_PLAYERS];
// ... mais 80 arrays
Funciona, mas vira bagunça rapidamente.
Usando enum
enum E_JOGADOR
{
jID, // ID no banco de dados
jNome[MAX_PLAYER_NAME],
jDinheiro,
jNivel,
jEmprego,
Float:jVida,
bool:jLogado
}
new Jogador[MAX_PLAYERS][E_JOGADOR];
Uso:
Jogador[playerid][jDinheiro] += 500;
if (!Jogador[playerid][jLogado])
return SendClientMessage(playerid, -1, "Faça login primeiro.");
Tudo que pertence ao jogador fica num lugar só, com nomes claros.
Reset na conexão
O playerid é reutilizado. Quando um jogador sai, o próximo que entrar pode receber o mesmo ID. Se você não zerar as variáveis, ele herda o dinheiro e o nível do anterior.
static const JogadorVazio[E_JOGADOR];
public OnPlayerConnect(playerid)
{
Jogador[playerid] = JogadorVazio;
return 1;
}
Faça o mesmo com arrays soltos, timers, textdraws e flags de diálogo.
Enums para outras entidades
O mesmo padrão serve para casas, empresas, veículos e facções:
#define MAX_CASAS 500
enum E_CASA
{
cID,
cDono,
cPreco,
Float:cX, Float:cY, Float:cZ,
bool:cTrancada
}
new Casa[MAX_CASAS][E_CASA];
Cuidados
- Limites de array: verifique índices antes de acessar (
if (casaid < 0 || casaid >= MAX_CASAS)). O crashdetect ajuda a achar acessos fora do limite; - Tags: campos
Float:exigem valores decimais, e o compilador avisa quando você mistura tipos; - Memória: enums enormes multiplicados por
MAX_PLAYERSocupam memória. Guarde só o que precisa ficar em RAM e deixe o resto no banco.
Da memória para o banco
As variáveis vivem enquanto o servidor está ligado. Para persistir, salve no MySQL ao desconectar e em intervalos regulares. Veja nossos posts sobre banco de dados.
Hospede seu servidor com a VittHost
Os planos OPENMP-BR da VittHost incluem MySQL para você persistir os dados dos jogadores com segurança. Servidores no Brasil, painel Pterodactyl, proteção DDoS, compatibilidade total com scripts SA-MP e teste grátis de 3 dias.