Cadere attraverso la mappa in FiveM: collisioni non caricate, come risolvere

I giocatori cadono attraverso la mappa al spawn o teleport? Corregi le collisioni tarde: file .ybn mancanti, troppo streaming, RequestCollisionAtCoord e HasCollisionLoadedAroundEntity.

Il sintomo: spawn, teletrasporto o cammino in un interno personalizzato e cadi attraverso il pavimento, talvolta nel mare o nel vuoto sotto la mappa, o cadi per alcuni secondi alla connessione prima di atterrare. La causa è una sola: il gioco disegna il mondo prima di aver caricato la collisione che la rende solida. Ecco come risolverlo nei file e nei tuoi script.

Perché accade

I dati di collisione (file .ybn) vengono trasmessi come modelli. Il gioco li carica intorno al giocatore e richiede tempo. Quando uno script sposta il giocatore lontano tutto in una volta, o un giocatore spawn su un server affollato, il giocatore può essere posizionato prima che il pavimento esista. La gravità vince e il giocatore cade.

Ci sono quattro cause comuni:

  • Una mappa personalizzata non ha collisione, o non viene trasmessa.
  • Il server trasmette troppo, quindi ogni carico è lento.
  • Uno script teletrasporta senza aspettare la collisione.
  • La connessione è lenta, quindi i file di risorse arrivano tardivamente per un giocatore che si unisce.

Causa 1: .ybn mancante in una mappa personalizzata

Se cadi solo dentro un MLO o una mappa, guarda prima la sua risorsa:

text
my_mlo/
  fxmanifest.lua
  stream/
    my_mlo.ymap
    my_mlo.ytyp
    my_mlo.ybn      <- the collisions
  • I file .ybn devono essere dentro stream. Un .ybn fuori da esso non viene mai inviato ai giocatori.
  • Un pacchetto per diverse parti di un edificio può avere diversi file .ybn. Assicurati che tutti siano arrivati quando hai copiato la cartella.
  • Se il pacchetto non ha .ybn affatto, l'autore non ha creato le collisioni, e uno strumento di editing della mappa è necessario per costruirle. Contatta l'autore o scegli un'altra mappa.
  • Controlla che la risorsa sia avviata e che il manifest abbia this_is_a_map 'yes'. Vedi come installare un MLO per il layout completo.

Causa 2: troppo streaming

Ogni giocatore scarica e carica i file trasmessi delle tue risorse. Texture molto grandi, troppi auto addon, vestiti, ped e mappe usano il budget di streaming, e le collisioni quindi si caricano tardivamente perché si accodano dietro i file pesanti.

I segni sono un join lento, texture che appaiono tardivamente e avvisi nella console. Riduci e rimuovi ciò che non ti serve: asset sovradimensionati e perdita di texture mostra come. Un server più leggero carica collisioni più velocemente per tutti.

Suggerimento: dopo aver rimosso gli asset, cancella la tua cache client e prova di nuovo, poiché una vecchia cache può nascondere il guadagno. Vedi cancella la cache di FiveM.

Causa 3: uno script che non aspetta

Questa è la causa più comune nei teletrasporti, nei respawn e nei selettori di spawn. La correzione è congelare il giocatore, richiedere la collisione, aspettare che si carichi, e solo allora lasciare andare il giocatore.

lua
local function teleportSafe(coords)
    local ped = PlayerPedId()

    FreezeEntityPosition(ped, true)
    SetEntityCoordsNoOffset(ped, coords.x, coords.y, coords.z, false, false, false)

    RequestCollisionAtCoord(coords.x, coords.y, coords.z)

    local timeout = GetGameTimer() + 5000
    while not HasCollisionLoadedAroundEntity(ped) and GetGameTimer() < timeout do
        RequestCollisionAtCoord(coords.x, coords.y, coords.z)
        Wait(0)
    end

    FreezeEntityPosition(ped, false)
end

Quello che ogni parte fa:

  • FreezeEntityPosition mantiene il giocatore fermo, così la gravità non può agire mentre aspetti.
  • RequestCollisionAtCoord dice al gioco di iniziare a caricare la collisione a quelle coordinate. Chiamalo ogni frame mentre aspetti.
  • HasCollisionLoadedAroundEntity restituisce true quando la collisione attorno al ped è lì.
  • Il timeout interrompe un ciclo infinito se l'area non carica mai, ad esempio quando la mappa non ha collisione affatto.

Usa lo stesso modello quando un giocatore spawn dopo la selezione dei personaggi, e per i veicoli: congela il veicolo con FreezeEntityPosition(vehicle, true) e aspetta su HasCollisionLoadedAroundEntity(vehicle).

Causa 4: spawn troppo presto alla connessione

Alla connessione, il primo spawn può accadere prima che l'area sia pronta. Lo spawn e gli script multicarattere che non aspettano sono la solita ragione. Se il giocatore è invisibile e congelato durante i primi secondi e poi cade, controlla il tuo script di spawn per il modello sopra. Per un join che è bloccato sulla schermata di caricamento, vedi giocatori bloccati sulla schermata di caricamento.

Se il problema si verifica solo per i giocatori con connessioni lente, i file vengono ancora scaricati quando il giocatore viene posizionato. Mantenere i file trasmessi piccoli è il miglior aiuto, e uno schermo di caricamento o sbiadimento che mantiene il giocatore finché il controllo sopra non è vero evita la maggior parte delle cadute visibili.

Checklist di debug per un posto

  1. Accade a tutti, o solo ad alcuni giocatori? Tutti puntano ai file della mappa, alcuni giocatori a cache o velocità.
  2. Accade solo in un posto? Allora è una risorsa di mappa senza collisione lì.
  3. Ferma quella risorsa di mappa e prova di nuovo. Se non cadi più, la mappa manca di collisione. Se un posto del gioco base ti fa cadere anche, il problema è il carico, non la mappa.
  4. Accade solo subito dopo un teletrasporto? Lo script ha bisogno del ciclo di attesa sopra.

Quando due mappe si sovrappongono

Una collisione può anche mancare quando una mappa rimuove gli oggetti del gioco base e l'altra mappa non mette la sua collisione al loro posto. Vedi conflitti di mappa.

Checklist

Sintomo Soluzione
Cadi dentro una mappa personalizzata Aggiungi i file .ybn alla sua cartella stream
Cadi dopo un teletrasporto Congela, RequestCollisionAtCoord, aspetta HasCollisionLoadedAroundEntity
Cadi alla connessione Fai aspettare lo script di spawn per la collisione prima che si scongeli
Tutto si carica lentamente Riduci la dimensione e il numero degli asset trasmessi
Solo alcuni giocatori cadono Cancella la loro cache e controlla la loro connessione
Ciclo di attesa infinito Aggiungi un timeout in modo che il ciclo termini anche se l'area non carica mai

Risposte rapide

Perché cado attraverso la mappa quando mi teletrasporto?

Il gioco non ha ancora caricato la collisione intorno alla nuova posizione, quindi non c'è un pavimento su cui stare in piedi. Richiedi la collisione nella destinazione e aspetta che venga caricata prima di scongelare il giocatore.

Quale native aspetta che le collisioni si carichino?

HasCollisionLoadedAroundEntity(entity) restituisce true quando la collisione attorno a quella entità è caricata. Chiama prima RequestCollisionAtCoord(x, y, z) in modo che il gioco inizi a caricarla.

Perché accade solo su una mappa personalizzata?

La mappa non ha file di collisione .ybn, oppure si trovano nella cartella sbagliata, oppure mancano dallo stream. Il modello visibile è lì ma nulla di solido è.

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