← Blog

Configurar um servidor FiveM para drift: física, scripts e handling

Par Benjamin D. · PDG

· Mis à jour le 12 Gwengolo 2026 · Lecture 9 min

Sumário

Montar a física de um servidor FiveM drift é um trabalho de precisão: não basta jogar alguns carros no stream e esperar que o traseiro solte. Handling coerente, pontuação sincronizada e tickrate estável são o tripé de qualquer comunidade de drift que pretende durar mais de um fim de semana. Este guia percorre a parte técnica, arquivo por arquivo.



Base técnica de um servidor FiveM drift: artifacts, OneSync e ordem de recursos

Antes de mexer em qualquer curva de tração, vale acertar a fundação. Comunidades de drift dependem de dois fatores que o jogador percebe na pele: consistência de física entre clientes e sincronização de veículos em alta velocidade. Ambos passam por escolhas feitas no server.cfg e na versão dos artifacts.

Game build e artifacts

Vários recursos modernos usados em drift — pneus de drift nativos, novos modelos de veículos, flags de handling recentes — só existem a partir de builds específicas do GTA V. Forçar a build no server.cfg evita que metade dos jogadores caia em Failed to load ao entrar:

# server.cfg — fundação
sv_hostname "Drift Zone BR | Touge & Tandem"
sv_maxclients 48
sv_licenseKey "SUA_CHAVE_CFX"

# build necessária para pneus de drift e veículos DLC recentes
set sv_enforceGameBuild 3095

# rede
set onesync on
set onesync_population false
set onesync_distanceCullVehicles true

Desligar onesync_population é quase obrigatório em servidor de drift: NPCs e trânsito ambiente consomem slots de entidade e atrapalham tandem em circuito fechado. Já onesync_distanceCullVehicles reduz o tráfego de rede de veículos distantes, o que ajuda quando 30 carros estão derrapando ao mesmo tempo.

Ordem de carregamento

A ordem dos ensure importa. Recursos de stream com handling customizado precisam carregar antes dos scripts que consultam esse handling, e o script de pontuação deve vir depois do framework, senão ele tenta registrar callbacks inexistentes.

ensure mapmanager
ensure chat
ensure spawnmanager
ensure sessionmanager
ensure basic-gamemode
ensure hardcap

# veículos e handling
ensure [vehicles]

# lógica de drift
ensure drift_score
ensure drift_tyres
ensure drift_leaderboard

Se a comunidade vai crescer, a parte de infraestrutura precisa acompanhar: CPU Ryzen de alta frequência (FiveM é fortemente monothread), NVMe para leitura rápida dos assets de stream e proteção anti-DDoS ativa por padrão. Quem prefere partir direto para a configuração de física sem montar toda a pilha do zero pode usar uma hospedagem FiveM já pronta com painel Pterodactyl e console em tempo real.



Handling.meta: os parâmetros que definem o comportamento em drift

O coração de um servidor FiveM drift é o handling.meta. É ele que decide se o carro fica preso no asfalto, se rodopia no primeiro toque de volante ou se mantém um ângulo controlável de 45 graus por toda a curva.

Estrutura mínima de um recurso de handling

drift_cars/
├── fxmanifest.lua
├── stream/
│   └── sultanrs_drift.ytd
└── data/
    ├── handling.meta
    └── vehicles.meta
-- fxmanifest.lua
fx_version 'cerulean'
game 'gta5'

files {
    'data/handling.meta',
    'data/vehicles.meta'
}

data_file 'HANDLING_FILE' 'data/handling.meta'
data_file 'VEHICLE_METADATA_FILE' 'data/vehicles.meta'

Parâmetros que realmente mudam o drift

ParâmetroFunçãoFaixa típica em drift
fInitialDriveForceForça de tração inicial; define quanto o carro consegue quebrar o traseiro0.30 – 0.45
fTractionCurveMaxAderência máxima lateral1.90 – 2.30
fTractionCurveMinAderência após perda de grip1.20 – 1.60
fTractionCurveLateralÂngulo em que o pneu perde lateral; valores altos alongam o deslize18.0 – 25.0
fLowSpeedTractionLossMultPerda de tração em baixa velocidade — essencial para saídas de traseira0.80 – 1.60
fTractionBiasFrontDistribuição de aderência entre eixos0.47 – 0.52
fSteeringLockÂngulo máximo de esterço; sem isso não existe contraesterço50.0 – 70.0
fAntiRollBarForceRigidez lateral da suspensão0.20 – 0.50
fBrakeBiasFrontDistribuição de freio; valores baixos ajudam o e-brake0.40 – 0.55
<Item type="CHandlingData">
  <handlingName>SULTANRS_DRIFT</handlingName>
  <fMass value="1450.000000" />
  <fInitialDriveForce value="0.380000" />
  <nInitialDriveGears value="6" />
  <fDriveInertia value="1.100000" />
  <fInitialDriveMaxFlatVel value="185.000000" />
  <fBrakeForce value="1.050000" />
  <fBrakeBiasFront value="0.450000" />
  <fHandBrakeForce value="0.900000" />
  <fSteeringLock value="62.000000" />
  <fTractionCurveMax value="2.100000" />
  <fTractionCurveMin value="1.400000" />
  <fTractionCurveLateral value="22.500000" />
  <fTractionSpringDeltaMax value="0.150000" />
  <fLowSpeedTractionLossMult value="1.250000" />
  <fCamberStiffnesss value="0.000000" />
  <fTractionBiasFront value="0.490000" />
  <fSuspensionForce value="2.400000" />
  <fAntiRollBarForce value="0.320000" />
  <strModelFlags>440010</strModelFlags>
  <strHandlingFlags>0</strHandlingFlags>
  <strDamageFlags>0</strDamageFlags>
</Item>

Metodologia de ajuste

Mudar dez valores de uma vez é receita para não saber o que funcionou. O fluxo prático:

  1. Ajuste primeiro fSteeringLock — sem ângulo de esterço não há contraesterço possível.
  2. Calibre fInitialDriveForce até o carro quebrar o traseiro em segunda marcha com meio acelerador.
  3. Trabalhe fTractionCurveLateral em passos de 1.0 até o deslize ficar sustentável, não abrupto.
  4. Só então mexa em fLowSpeedTractionLossMult para as transições e saídas lentas.
  5. Finalize com suspensão e barra estabilizadora, que afetam a transferência de peso nas mudanças de direção.

Depois de cada alteração, use refresh e restart drift_cars no console do painel, e reentre no veículo — o handling é aplicado na criação da entidade. A documentação das estruturas de dados está disponível na documentação oficial do FiveM.

Pneus de drift nativos

A partir das builds recentes, existe um modo de pneu de drift nativo do próprio jogo, que altera a curva de aderência sem tocar no handling.meta. Útil como toggle por jogador:

-- client.lua
RegisterCommand('drifttyres', function()
    local ped = PlayerPedId()
    local veh = GetVehiclePedIsIn(ped, false)
    if veh == 0 then return end

    local state = not IsDriftTyresSet(veh)
    SetDriftTyresEnabled(veh, state)
    SetVehicleDriftTyresEnabled(veh, state)

    TriggerEvent('chat:addMessage', {
        args = { 'DRIFT', state and 'Pneus de drift ativados' or 'Pneus normais' }
    })
end, false)


Scripts de pontuação de drift: ângulo, combo e sincronização

A pontuação é o que transforma um circuito em competição. A lógica base é simples: medir o ângulo entre o vetor de direção do veículo e o vetor de velocidade real, multiplicar por velocidade e acumular enquanto o deslize se mantiver.

Cálculo do ângulo de derrapagem

-- drift_score/client.lua
local score, combo, driftAngle = 0, 1.0, 0.0
local MIN_SPEED = 8.0      -- m/s (~29 km/h)
local MIN_ANGLE = 12.0     -- graus para validar o drift
local MAX_ANGLE = 90.0     -- acima disso é rodada

local function getDriftAngle(veh)
    local speed = GetEntitySpeed(veh)
    if speed < MIN_SPEED then return 0.0, speed end

    local vel = GetEntityVelocity(veh)
    local fwd = GetEntityForwardVector(veh)
    local dot = (fwd.x * vel.x + fwd.y * vel.y) / speed
    dot = math.max(-1.0, math.min(1.0, dot))

    return math.abs(math.deg(math.acos(dot))), speed
end

Loop de acúmulo com combo

CreateThread(function()
    while true do
        local wait = 250
        local ped = PlayerPedId()
        local veh = GetVehiclePedIsIn(ped, false)

        if veh ~= 0 and GetPedInVehicleSeat(veh, -1) == ped then
            wait = 50
            local angle, speed = getDriftAngle(veh)
            driftAngle = angle

            if angle > MIN_ANGLE and angle < MAX_ANGLE then
                score = score + (angle * speed * 0.02 * combo)
                combo = math.min(combo + 0.01, 5.0)
            elseif combo > 1.0 then
                -- fim do drift: envia ao servidor e zera
                TriggerServerEvent('drift:submit', math.floor(score), combo)
                score, combo = 0, 1.0
            end

            if HasEntityCollidedWithAnything(veh) then
                score, combo = 0, 1.0
            end
        end

        Wait(wait)
    end
end)

Repare no Wait variável: fora do veículo o thread roda a 250 ms, dentro sobe para 50 ms. Em um circuito com 40 jogadores, esse detalhe faz diferença real no FPS do cliente e evita que o recurso apareça no topo do resmon.

Validação no servidor

Nunca confie na pontuação enviada pelo cliente sem filtro. Um teto por evento e um intervalo mínimo entre submissões cortam a maior parte dos injectors de score:

-- drift_score/server.lua
local lastSubmit, MAX_SCORE = {}, 250000

RegisterNetEvent('drift:submit', function(value, combo)
    local src = source
    local now = GetGameTimer()

    if type(value) ~= 'number' or value < 0 or value > MAX_SCORE then
        return DropPlayer(src, 'Pontuação de drift inválida.')
    end

    if lastSubmit[src] and (now - lastSubmit[src]) < 1500 then return end
    lastSubmit[src] = now

    -- persistência: arquivo JSON ou banco de dados
    SaveDriftRun(src, math.floor(value), combo)
    TriggerClientEvent('drift:leaderboardUpdate', -1, GetTopRuns(10))
end)

AddEventHandler('playerDropped', function()
    lastSubmit[source] = nil
end)

Zonas de pontuação

Para circuitos definidos, delimite polígonos ou esferas e aplique multiplicadores por trecho. Um touge descendente pode valer 1.5x, enquanto o estacionamento de aquecimento vale 1.0x. A verificação é barata com GetDistanceBetweenCoords executado no mesmo thread já existente, sem criar loops adicionais.



Ajustes finais no server.cfg, desempenho e manutenção

Com física e pontuação prontos, sobra a parte que mantém o servidor FiveM drift estável quando o Discord enche em uma noite de evento.

Convars úteis

# limites e qualidade de rede
set sv_scriptHookAllowed 0
set sv_authMaxVariance 1
set sv_authMinTrust 5
sets tags "drift, tandem, brasil, custom cars"
sets locale "pt-BR"

# convars do recurso de drift
setr drift_minAngle 12.0
setr drift_maxScore 250000
setr drift_comboDecay 0.015
setr drift_leaderboardSize 25

# administração
add_ace group.admin command.restart allow
add_principal identifier.license:SUA_LICENSE group.admin

Manter sv_scriptHookAllowed 0 é básico em qualquer comunidade competitiva: com o script hook liberado, qualquer menu externo injeta handling e destrói a legitimidade das tabelas de pontuação.

Diagnóstico de desempenho

  • txAdmin ou o console do painel mostram o tickrate; abaixo de 45 ms por tick de servidor, o tandem começa a apresentar rubber banding.
  • No cliente, resmon 1 revela quais recursos passam de 0.10 ms — scripts de drift mal escritos com Wait(0) permanente são os campeões.
  • Assets de stream com texturas em 4K multiplicam o consumo de VRAM dos jogadores. Para drift, 2K resolve e reduz o tempo de download inicial.
  • SSD NVMe reduz sensivelmente o tempo de carregamento dos .ytd/.yft no início da sessão.

Rotina de manutenção

  1. Backups automáticos antes de qualquer alteração em handling.meta — um valor errado em fMass derruba a jogabilidade inteira.
  2. Versione a pasta resources com Git; reverter um commit é mais rápido que refazer tuning.
  3. Reinicie o processo em janela de baixo movimento, nunca no meio de um evento de tandem.
  4. Teste cada carro novo em ambiente isolado antes de subir para produção.
  5. Mantenha RCON e senhas administrativas longas e exclusivas; combine com ACEs restritos por grupo.

Quem prefere gerenciar tudo por conta própria em um ambiente isolado pode usar VPS Pterodactyl e subir múltiplas instâncias de teste. E se a comunidade rodar outros títulos em paralelo, vale conferir Todos os nossos servidores de jogos ou os tutoriais publicados no Blog da Fly-Serv.



Conclusão

Drift em FiveM é engenharia de detalhe: cada décimo em fTractionCurveLateral, cada milissegundo de Wait e cada validação no lado do servidor pesam no resultado final. Comece pelo handling, valide a pontuação contra manipulação, monitore o tickrate e documente cada ajuste. Com essa disciplina, o circuito se mantém fluido mesmo com dezenas de carros em tandem simultâneo.



FAQ

Por que meu handling customizado não é aplicado no veículo?

Três causas comuns: o data_file 'HANDLING_FILE' está ausente no fxmanifest.lua, o handlingName não corresponde ao definido em vehicles.meta, ou o recurso carrega depois de outro que sobrescreve o mesmo nome. Verifique a ordem dos ensure no server.cfg e saia/entre no carro após o restart, já que o handling é lido na criação da entidade.

Como evitar que jogadores enviem pontuações falsas de drift?

Valide sempre no lado do servidor: defina um teto máximo por corrida, exija intervalo mínimo entre submissões, confira o tipo da variável recebida e compare com a velocidade máxima teórica do veículo. Complemente com sv_scriptHookAllowed 0, ACEs restritos e registro em log de todas as pontuações acima da média para revisão manual.

Qual tickrate e quantos slots suportam eventos de tandem?

Para tandem com física intensa, mantenha o tempo de tick do servidor estável abaixo de 50 ms. Na prática, 32 a 48 slots ativos funcionam bem em CPU de alta frequência, desde que onesync_population esteja desativado e os recursos pesados sejam auditados com resmon. Acima disso, divida os jogadores por instâncias ou circuitos separados.