Skip to content

Anti-cheat

Anti-cheat

Todas as decisões de dinheiro e estoque são feitas no servidor. O cliente apenas desenha a bomba e relata o que aconteceu; ele nunca decide quanto algo custa ou quanto combustível entrou.

O que o servidor valida

  • Sessões de bomba. Abrir uma bomba solicita um token de sessão ao servidor. O pagamento exige esse token, e os litros cobrados são limitados pelo tempo que a sessão realmente esteve aberta com a taxa de fluxo configurada. Um cliente que alegue ter recebido mais do que a bomba fisicamente poderia entregar é limitado ao que o relógio permite.
  • Expiração de sessão. Os tokens são de uso único, vinculados ao jogador que os abriu e descartados após PumpSessionTimeout. Uma sessão expirada não cobra nada.
  • Verificações de distância. Comprar, reabastecer, carregar, trocar bateria, encher um galão, encomendar estoque e cada ação do painel verificam novamente no servidor se o jogador realmente está naquela estação, com uma margem de DistanceSlack metros para compensar o atraso de posição do ped.
  • Limitação de taxa (Rate limiting). Cada evento e callback consome um token de um balde por jogador que se recarrega em PerSecond e nunca acumula além de Burst. Uma tecla presa continua funcionando; um loop de spam esbarra em um bloqueio quase imediatamente.
  • Limitação de valores (Clamping). Preços, salários, pedidos, retiradas e depósitos passam por validação de limites e tipos no lado do servidor. Nada acima de MaxAmount é aceito de forma alguma, e os preços são mantidos dentro de Config.Refuel.PriceLimits.
  • Verificações de permissão em cada ação. As permissões da equipe são revalidadas no lado do servidor a cada requisição, nunca confiando na interface (UI). Contratar, demitir e editar qualquer pessoa que possua a permissão employees é restrito apenas ao proprietário, impedindo que um funcionário se promova. A transferência e a revenda são exclusivas para o proprietário e exigem que o nome da estação seja digitado novamente.
  • Estoque e banco são estados do servidor. Uma venda só ocorre se a estação realmente tiver os litros e o cliente realmente tiver o dinheiro; ambos os lados são atualizados na mesma etapa do lado do servidor.
config.lua
Config.AntiCheat = {
    RateLimit = { Burst = 14, PerSecond = 6 },
    MaxLitresPerPay = 200.0,
    LitreGrace = 3.0,
    PumpSessionTimeout = 900,
    DistanceSlack = 15.0,
    MaxAmount = 100000000,
    MaxWage = 25000,
    JerryPourTimeout = 600,
}
Configuração Finalidade
RateLimit Tamanho do burst e taxa de recarga do balde de eventos por jogador
MaxLitresPerPay Limite máximo rígido para uma única sessão de bomba ou carregador, independentemente do tempo
LitreGrace Margem de tolerância na verificação de tempo, em litros. Cobre um tick com lag
PumpSessionTimeout Segundos que uma sessão permanece válida
DistanceSlack Metros extras permitidos além do raio de uma estação
MaxAmount Limite máximo para qualquer valor em dinheiro aceito de um cliente
MaxWage Maior salário que um proprietário pode definir para um funcionário
JerryPourTimeout Segundos em que um despejo inacabado é lembrado antes que o restante não possa mais ser resgatado

Ajustes

Os padrões atendem bem a um servidor normal. Os dois que vale a pena mexer:

  • LitreGrace — aumente em um ou dois litros se jogadores com conexões ruins estiverem sendo prejudicados na bomba. Mantenha o valor baixo; é combustível gratuito.
  • RateLimit.Burst — aumente se um pátio de combustível genuinamente movimentado começar a recusar ações. Reduza se quiser um controle mais rigoroso.

Aumentar excessivamente MaxLitresPerPay ou DistanceSlack remove a proteção para a qual essas verificações existem. Só altere esses valores se jogadores honestos estiverem sendo visivelmente bloqueados.