Servidores de Jogos

Variáveis por jogador e enums: organizando os dados do gamemode

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_PLAYERS ocupam 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.

Compartilhar:

Pronto para hospedar seu próximo projeto?

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

Ver planos VPS