Disabilita o riduci il traffico NPC e i ped in FiveM: nativi di densità

Spegni o riduci NPC, traffico e auto parcheggiate in FiveM con i nativi moltiplicatori di densità, la regola per-frame, routing bucket, rimozione di polizia e il costo di ogni opzione.

Sintomi tipici:

text
Streets full of NPCs and traffic, low fps in the city, or random police responses nobody asked for.

La popolazione in GTA è controllata da un insieme di nativi che chiami nel client. La trappola principale è che la maggior parte di essi si ripristina ogni frame. Questo articolo mostra i nativi, il loop di cui hanno bisogno, l'opzione lato server, e i compromessi di una città vuota.

L'unica regola: ogni frame

I moltiplicatori di densità si applicano solo al frame corrente. Chiamali una volta all'avvio e non fanno nulla un momento dopo. Devono essere eseguiti in un loop senza ritardo:

lua
CreateThread(function()
    while true do
        SetVehicleDensityMultiplierThisFrame(0.0)
        SetPedDensityMultiplierThisFrame(0.0)
        SetRandomVehicleDensityMultiplierThisFrame(0.0)
        SetParkedVehicleDensityMultiplierThisFrame(0.0)
        SetScenarioPedDensityMultiplierThisFrame(0.0, 0.0)
        Wait(0)
    end
end)

Un moltiplicatore è tra 0.0 (nessuno) e 1.0 (l'importo predefinito). Ogni nativo controlla una parte diversa:

Native Controlla
SetVehicleDensityMultiplierThisFrame Traffico in movimento
SetRandomVehicleDensityMultiplierThisFrame Veicoli casuali sulle strade
SetParkedVehicleDensityMultiplierThisFrame Auto parcheggiate in strada
SetPedDensityMultiplierThisFrame Pedoni che camminano
SetScenarioPedDensityMultiplierThisFrame Ped che fanno attività (interno, esterno)

SetScenarioPedDensityMultiplierThisFrame prende due valori, uno per l'interno e uno per l'esterno.

Riduci invece di rimuovere

Una città senza nessuno sembra rotta, e i giocatori lo notano. Usa un valore tra 0 e 1 per assottigliarlo:

lua
local traffic = 0.3
local peds = 0.4

CreateThread(function()
    while true do
        SetVehicleDensityMultiplierThisFrame(traffic)
        SetRandomVehicleDensityMultiplierThisFrame(traffic)
        SetParkedVehicleDensityMultiplierThisFrame(traffic)
        SetPedDensityMultiplierThisFrame(peds)
        SetScenarioPedDensityMultiplierThisFrame(peds, peds)
        Wait(0)
    end
end)

Prova prima 0.3 a 0.5, quindi regola secondo il tuo server. Metti i valori in un file config così puoi cambiarli senza toccare il codice.

Lato server: routing bucket

Il server può spegnere la popolazione per un intero routing bucket, che è utile per un'istanza come un interno o un evento, senza un loop client:

lua
-- server
SetRoutingBucketPopulationEnabled(bucketId, false)

Con questo, nessun NPC ambiente o traffico spawna per i giocatori in quel bucket. Il bucket 0 è il mondo predefinito. Lascialo acceso per il mondo principale e disabilitalo per le istanze private. Vedi routing bucket per come mettere i giocatori in uno.

Rimuovi la polizia e il dispatch

Impostare la densità a zero non ferma la risposta della polizia. I livelli voluti e il dispatch funzionano nei loro sistemi. Per rimuoverli, spegnerli uno per uno:

lua
CreateThread(function()
    SetMaxWantedLevel(0)
    SetCreateRandomCops(false)
    SetCreateRandomCopsNotOnScenarios(false)
    SetCreateRandomCopsOnScenarios(false)

    for service = 1, 15 do
        EnableDispatchService(service, false)
    end
end)

CreateThread(function()
    while true do
        if GetPlayerWantedLevel(PlayerId()) > 0 then
            SetPlayerWantedLevel(PlayerId(), 0, false)
            SetPlayerWantedLevelNow(PlayerId(), false)
        end
        Wait(500)
    end
end)

EnableDispatchService prende un indice di servizio e un booleano. Il loop su 1 a 15 copre la polizia, l'elicottero, i vigili del fuoco, l'ambulanza e altri servizi che il gioco definisce. Il loop del livello voluto cattura tutto ciò che sfugge.

Se mantengo la polizia sul tuo server per il roleplay, non disabilitare i servizi per i giocatori che sono in servizio. Gestisci quel caso nello script del tuo lavoro.

Altre cose che potresti voler spegnere

La popolazione è più che ped e auto. Questi nativi rimuovono alcune altre fonti, ognuno prende un booleano:

lua
SetGarbageTrucks(false)
SetRandomBoats(false)
SetRandomTrains(false)

Chiamali una volta all'avvio, non hanno bisogno di un loop per frame.

Compromessi di prestazione

Quello che guadagni. Ogni ped e veicolo è simulato, disegnato e sincronizzato. Ridurli riduce il costo del client e il numero di entità nella rete. Su PC deboli questo può essere una grande differenza fps. Per altri fix fps, vedi basso FPS in FiveM.

Quello che paghi. Un loop con Wait(0) viene eseguito ogni frame, quindi mantienilo minuscolo e metti i nativi in un unico thread. Un loop di cinque chiamate è economico, ma dieci script diversi ognuno con il suo loop non lo è. Controlla che il tuo server non imposti già la densità, e il tuo monitor di risorse in resmon.

L'atmosfera. Un mondo senza NPC è privo di vita. Ridurre il traffico e mantenere alcuni ped è un compromesso migliore, e le auto parcheggiate sono economiche da mantenere poiché non si muovono.

Gameplay. Molti script si affidano a ped o auto: una vendita di droga, una rapina con ostaggi, un furto con traffico. Testali con le tue impostazioni di densità, poiché un lavoro che ha bisogno di un passante fallirà in una città vuota.

Errori comuni

  • Chiamare i moltiplicatori una volta. Si ripristinano ogni frame, usa un loop.
  • Un lungo Wait nel loop. Con Wait(1000) la densità si applica un frame al secondo e gli NPC spawnano negli spazi vuoti. Deve essere Wait(0).
  • Due script con valori diversi. L'ultima chiamata del frame vince, quindi ottieni risultati incoerenti. Mantieni una sola fonte.
  • Dimenticare le auto parcheggiate. Traffico a zero e auto parcheggiate al valore predefinito lasciano comunque una strada piena di auto.
  • Aspettarsi che il server rimuova gli NPC che non possiede. La popolazione ambiente è lato client, a parte l'interruttore del routing bucket.

Checklist

Sintomo Soluzione
Gli NPC tornano dopo un momento Chiama i nativi di densità ogni frame con Wait(0)
Traffico sparito, auto parcheggiate rimangono Aggiungi SetParkedVehicleDensityMultiplierThisFrame
Ped seduti in scenari Aggiungi SetScenarioPedDensityMultiplierThisFrame(interno, esterno)
La polizia appare ancora Livello voluto 0, EnableDispatchService spento, polizia casuale spenta
Nessun NPC in un'istanza SetRoutingBucketPopulationEnabled sul server
La città si sente vuota Usa valori come 0.3 a 0.5 invece di 0.0
Tempo resmon alto Un solo loop, nessuno script duplicato

Risposte rapide

Perché gli NPC tornano dopo che ho impostato la densità a 0?

I nativi di densità durano solo per un frame. Se li chiami una volta, il gioco torna al valore predefinito nel frame successivo, quindi devono essere chiamati in un loop che viene eseguito ogni frame.

La disabilitazione degli NPC migliora le prestazioni?

Sì, meno ped e auto significa meno lavoro per il client, e più fps su macchine deboli. Rende anche la città vuota, quindi molti server riducono la densità invece di rimuoverla.

Come rimuovo la risposta della polizia?

Spegni i servizi di dispatch con EnableDispatchService, imposta il livello voluto a 0 e ferma i poliziotti casuali. Fai tutti e tre, poiché ognuno copre una parte diversa.

Script senza questo problema

Advanced BoostingBoosting di veicoli dal tablet: contratti dalla classe D alla S+, crew e coda in tempo reale.Vedi script →Quest CreatorUn editor visuale di missioni e dialoghi con gli NPC, costruito nodo per nodo in gioco.Vedi script →CCTV Security CamerasTelecamere posizionabili, un tablet multi-vista in diretta e foto stampate come prove.Vedi script →

Continua a leggere