Im FiveM-Spiel durchfallen: Kollisionen nicht geladen, wie zu beheben

Spieler fallen beim Spawnen oder Teleportieren durch die Karte? Behebe verzögerte Kollisionen: fehlende .ybn-Dateien, zu viel Streaming, RequestCollisionAtCoord und HasCollisionLoadedAroundEntity.

Das Symptom: Du spawnst, teleportierst dich oder gehst in ein benutzerdefiniertes Interieur und fällst durch den Boden, manchmal ins Meer oder das Nichts unter der Karte, oder du fällst ein paar Sekunden beim Verbinden, bevor du landest. Die Ursache ist eine Sache: Das Spiel zeichnet die Welt, bevor es die Kollision geladen hat, die sie stabil macht. Hier erfahren Sie, wie Sie sie in den Dateien und in Ihren Skripten beheben.

Warum es passiert

Kollisionsdaten (.ybn-Dateien) werden wie Modelle gestreamt. Das Spiel lädt sie um den Spieler herum, und es dauert Zeit. Wenn ein Skript den Spieler auf einmal weit weg bewegt oder ein Spieler auf einem vollen Server spawnt, kann der Spieler platziert werden, bevor der Boden existiert. Die Schwerkraft gewinnt und der Spieler fällt.

Es gibt vier übliche Ursachen:

  • Eine benutzerdefinierte Karte hat keine Kollision, oder sie wird nicht gestreamt.
  • Der Server streamt zu viel, daher ist jede Last langsam.
  • Ein Skript teleportiert, ohne zu warten, bis die Kollision geladen ist.
  • Die Verbindung ist langsam, daher kommen die Ressourcendateien spät für einen Spieler, der beitritt.

Ursache 1: fehlende .ybn in einer benutzerdefinierten Karte

Wenn du nur in einem MLO oder einer Karte durchfällst, schau dir zuerst seine Ressource an:

text
my_mlo/
  fxmanifest.lua
  stream/
    my_mlo.ymap
    my_mlo.ytyp
    my_mlo.ybn      <- the collisions
  • Die .ybn-Dateien müssen sich in stream befinden. Eine .ybn außerhalb wird nie an die Spieler gesendet.
  • Ein Pack für mehrere Teile eines Gebäudes kann mehrere .ybn-Dateien haben. Stelle sicher, dass alle beim Kopieren des Ordners mitgenommen wurden.
  • Wenn das Pack keine .ybn hat, hat der Autor die Kollisionen nicht erstellt, und ein Karten-Bearbeitungs-Tool ist erforderlich, um sie zu erstellen. Kontaktiere den Autor oder wähle eine andere Karte.
  • Überprüfe, dass die Ressource gestartet ist und das Manifest this_is_a_map 'yes' hat. Siehe how to install an MLO für das vollständige Layout.

Ursache 2: zu viel Streaming

Jeder Spieler lädt und lädt die gestreamten Dateien deiner Ressourcen. Sehr große Texturen, zu viele Addon-Autos, Kleidung, Peds und Karten verwenden das Streaming-Budget, und Kollisionen werden dann später geladen, da sie hinter den schweren Dateien warten.

Zeichen sind ein langsamer Join, Texturen, die spät erscheinen, und Warnungen in der Konsole. Verkleinere und entferne, was du nicht brauchst: oversized assets and texture loss zeigt wie. Ein leichterer Server lädt Kollisionen schneller für alle.

Tipp: Nachdem du Assets entfernt hast, lösche deinen eigenen Client-Cache und teste erneut, da ein alter Cache den Gewinn verbergen kann. Siehe clear the FiveM cache.

Ursache 3: ein Skript, das nicht wartet

Dies ist die häufigste Ursache bei Teleports, Respawns und Spawn-Selektoren. Die Lösung ist, den Spieler einzufrieren, die Kollision anzufordern, zu warten, bis sie geladen ist, und erst dann den Spieler gehen zu lassen.

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

Was jeder Teil macht:

  • FreezeEntityPosition hält den Spieler still, daher kann Schwerkraft nicht wirken, während du wartest.
  • RequestCollisionAtCoord sagt dem Spiel, es soll die Kollision an diesen Koordinaten laden. Rufe sie jedem Frame auf, während du wartest.
  • HasCollisionLoadedAroundEntity gibt wahr zurück, wenn die Kollision um den Ped vorhanden ist.
  • Der Timeout stoppt eine Endlosschleife, falls das Gebiet nie lädt, z. B. wenn die Karte überhaupt keine Kollision hat.

Verwende das gleiche Muster, wenn ein Spieler nach Charakterauswahl spawnt, und für Fahrzeuge: Friere das Fahrzeug mit FreezeEntityPosition(vehicle, true) ein und warte auf HasCollisionLoadedAroundEntity(vehicle).

Ursache 4: zu frühes Spawnen beim Verbinden

Beim Verbinden kann der erste Spawn vor der Bereitschaft des Bereichs passieren. Spawn- und Mehrfach-Charakter-Skripte, die nicht warten, sind der übliche Grund. Wenn der Spieler unsichtbar und eingefroren während der ersten Sekunden ist und dann fällt, überprüfe dein Spawn-Skript auf das obige Muster. Für einen Join, der auf dem Ladebildschirm hängt, siehe players stuck on the loading screen.

Wenn das Problem nur für Spieler mit langsamen Verbindungen auftritt, werden die Dateien noch heruntergeladen, wenn der Spieler platziert wird. Die gestreamten Dateien klein zu halten ist die beste Hilfe, und ein Lade- oder Fade-Bildschirm, der den Spieler hält, bis die obige Prüfung wahr ist, vermeidet die meisten sichtbaren Fälle.

Debugging-Checkliste für einen Ort

  1. Passiert es jedem oder nur einigen Spielern? Jeder zeigt auf die Kartendateien, einige Spieler auf Cache oder Geschwindigkeit.
  2. Passiert es nur an einem Ort? Dann ist es eine Kartenressource ohne Kollision dort.
  3. Stoppe diese Kartenressource und versuche es erneut. Wenn du nicht mehr durchfällst, der Karte Kollision. Wenn ein Basis-Spiel auch dich durchfallen lässt, ist das Problem die Last, nicht die Karte.
  4. Passiert es nur direkt nach einem Teleport? Das Skript braucht die obige Warteschleife.

Wenn zwei Karten sich überlappen

Eine Kollision kann auch fehlen, wenn eine Karte die Basis-Spiel-Objekte entfernt und die andere Karte nicht ihre eigene Kollision an deren Stelle setzt. Siehe map conflicts.

Checkliste

Symptom Lösung
Falle in einer benutzerdefinierten Karte Füge die .ybn-Dateien zu ihrem stream-Ordner hinzu
Falle nach einem Teleport Friere ein, RequestCollisionAtCoord, warte auf HasCollisionLoadedAroundEntity
Falle beim Verbinden Mache das Spawn-Skript warten, bis die Kollision geladen ist, bevor es entsperrt
Alles lädt langsam Verringere die Größe und Anzahl der gestreamten Assets
Nur einige Spieler fallen Lösche ihren Cache und überprüfe ihre Verbindung
Endlose Warteschleife Füge einen Timeout hinzu, damit die Schleife beendet wird, auch wenn das Gebiet nie lädt

Kurze Antworten

Warum falle ich durch die Karte, wenn ich teleportiere?

Das Spiel hat die Kollision um die neue Position noch nicht geladen, daher gibt es keinen Boden zum Stehen. Fordere die Kollision am Ziel an und warte, bis sie geladen ist, bevor du den Spieler entsperrst.

Welche Native wartet, bis Kollisionen geladen sind?

HasCollisionLoadedAroundEntity(entity) gibt wahr zurück, wenn die Kollision um diese Entität geladen ist. Rufe zuerst RequestCollisionAtCoord(x, y, z) auf, damit das Spiel beginnt, sie zu laden.

Warum passiert es nur auf einer benutzerdefinierten Karte?

Die Karte hat keine .ybn-Kollisionsdateien, oder sie sind im falschen Ordner, oder sie fehlen im Stream. Das sichtbare Modell ist dort, aber nichts Solides.

Scripts ohne dieses Problem

Advanced BoostingFahrzeug-Boosting per Tablet: Aufträge von Klasse D bis S+, Crews und eine Live-Warteschlange.Script ansehen →Quest CreatorEin visueller Editor für Quests und NPC-Dialoge, Node für Node im Spiel gebaut.Script ansehen →CCTV Security CamerasPlatzierbare Kameras, ein Live-Tablet mit Multi-View und ausgedruckte Beweisfotos.Script ansehen →

Weiterlesen