Caer a través del mapa en FiveM: colisiones no cargadas, cómo reparar

¿Los jugadores caen a través del mapa al aparecer o teletransportarse? Soluciona colisiones tardías: archivos .ybn faltantes, demasiado streaming, RequestCollisionAtCoord y HasCollisionLoadedAroundEntity.

El síntoma: apareces, te teletransportas o entras en un interior personalizado y caes a través del suelo, a veces al mar o al vacío bajo el mapa, o caes durante unos segundos al conectarte antes de aterrizar. La causa es una sola cosa: el juego dibuja el mundo antes de que haya cargado la colisión que lo hace sólido. Aquí se explica cómo repararlo en los archivos y en tus scripts.

Por qué ocurre

Los datos de colisión (archivos .ybn) se transmiten como modelos. El juego los carga alrededor del jugador, y tarda tiempo. Cuando un script mueve al jugador lejos de una vez, o un jugador aparece en un servidor ocupado, el jugador puede ser colocado antes de que el suelo exista. La gravedad gana y el jugador cae.

Hay cuatro causas habituales:

  • Un mapa personalizado no tiene colisión, o no se transmite.
  • El servidor transmite demasiado, por lo que cada carga es lenta.
  • Un script se teletransporta sin esperar a que se cargue la colisión.
  • La conexión es lenta, así que los archivos de recursos llegan tarde para un jugador que se une.

Causa 1: .ybn faltante en un mapa personalizado

Si solo caes dentro de un MLO o un mapa, mira su recurso primero:

text
my_mlo/
  fxmanifest.lua
  stream/
    my_mlo.ymap
    my_mlo.ytyp
    my_mlo.ybn      <- the collisions
  • Los archivos .ybn deben estar dentro de stream. Un .ybn fuera de él nunca se envía a los jugadores.
  • Un paquete para varias partes de un edificio puede tener varios archivos .ybn. Asegúrate de que todos llegaron cuando copiaste la carpeta.
  • Si el paquete no tiene .ybn en absoluto, el autor no hizo las colisiones, y se necesita una herramienta de edición de mapas para construirlas. Contacta al autor o elige otro mapa.
  • Comprueba que el recurso se inicia y que el manifiesto tiene this_is_a_map 'yes'. Ve how to install an MLO para el diseño completo.

Causa 2: transmitir demasiado

Cada jugador descarga y carga los archivos transmitidos de tus recursos. Texturas muy grandes, demasiados coches adicionales, ropa, peds y mapas usan el presupuesto de streaming, y las colisiones se cargan tarde porque se colan detrás de los archivos pesados.

Las señales son una unión lenta, texturas que aparecen tarde, y advertencias en la consola. Reduce y elimina lo que no necesitas: oversized assets and texture loss muestra cómo. Un servidor más ligero carga colisiones más rápido para todos.

Consejo: después de que eliminaste activos, limpia tu propia caché de cliente y prueba de nuevo, ya que una caché antigua puede ocultar la ganancia. Ve clear the FiveM cache.

Causa 3: un script que no espera

Esta es la causa más común en teletransportes, reapariciones y selectores de aparición. La solución es congelar al jugador, solicitar la colisión, esperar hasta que se cargue, y solo entonces dejar ir al jugador.

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

Lo que hace cada parte:

  • FreezeEntityPosition mantiene al jugador quieto, así que la gravedad no puede actuar mientras esperas.
  • RequestCollisionAtCoord le dice al juego que comience a cargar la colisión en esas coordenadas. Llámalo cada fotograma mientras esperas.
  • HasCollisionLoadedAroundEntity devuelve verdadero cuando la colisión alrededor del ped está allí.
  • El timeout detiene un bucle infinito si el área nunca se carga, por ejemplo cuando el mapa no tiene colisión en absoluto.

Usa el mismo patrón cuando un jugador aparece después de la selección de personaje, y para vehículos: congela el vehículo con FreezeEntityPosition(vehicle, true) y espera en HasCollisionLoadedAroundEntity(vehicle).

Causa 4: aparecer demasiado temprano al conectarse

En la conexión, la primera aparición puede ocurrir antes de que el área esté lista. Los scripts de aparición y multipesonaje que no esperan son la razón habitual. Si el jugador es invisible y congelado durante los primeros segundos y luego cae, comprueba tu script de aparición para el patrón anterior. Para una unión que se cuelga en la pantalla de carga, ve players stuck on the loading screen.

Si el problema ocurre solo para jugadores con conexiones lentas, los archivos aún se descargan cuando se coloca al jugador. Mantener los archivos transmitidos pequeños es la mejor ayuda, y una pantalla de carga o atenuación que mantiene al jugador hasta que la comprobación anterior sea verdadera evita la mayoría de las caídas visibles.

Lista de verificación de depuración para un lugar

  1. ¿Ocurre para todos, o solo para algunos jugadores? Todos apuntan a los archivos del mapa, algunos jugadores a caché o velocidad.
  2. ¿Ocurre solo en un lugar? Entonces es un recurso de mapa sin colisión allí.
  3. Detén ese recurso de mapa e intenta de nuevo. Si ya no caes, el mapa carece de colisión. Si un lugar del juego base también te hace caer, el problema es la carga, no el mapa.
  4. ¿Ocurre solo justo después de un teletransporte? El script necesita el bucle de espera anterior.

Cuando dos mapas se solapan

Una colisión también puede faltar cuando un mapa elimina los objetos del juego base y el otro mapa no pone su propia colisión en su lugar. Ve map conflicts.

Lista de verificación

Síntoma Solución
Caer dentro de un mapa personalizado Añade los archivos .ybn a su carpeta stream
Caer después de un teletransporte Congela, RequestCollisionAtCoord, espera a HasCollisionLoadedAroundEntity
Caer al conectarse Haz que el script de aparición espere a la colisión antes de descongelar
Todo se carga lentamente Reduce el tamaño y la cantidad de activos transmitidos
Solo algunos jugadores caen Limpia su caché, y comprueba su conexión
Bucle de espera infinito Añade un timeout para que el bucle termine incluso si el área nunca se carga

Respuestas rápidas

¿Por qué caigo a través del mapa cuando me teletransporto?

El juego aún no ha cargado la colisión alrededor de la nueva posición, así que no hay suelo para estar. Solicita la colisión en el destino y espera hasta que se cargue antes de descongelar al jugador.

¿Qué nativa espera a que las colisiones se carguen?

HasCollisionLoadedAroundEntity(entity) devuelve verdadero cuando la colisión alrededor de esa entidad está cargada. Llama a RequestCollisionAtCoord(x, y, z) primero para que el juego comience a cargarla.

¿Por qué ocurre solo en un mapa personalizado?

El mapa no tiene archivos de colisión .ybn, o están en la carpeta incorrecta, o faltan en el stream. El modelo visible está allí pero nada sólido está.

Scripts que evitan este problema

Advanced BoostingBoosting de vehículos desde una tablet: contratos de clase D a S+, crews y cola en vivo.Ver script →Quest CreatorUn editor visual de misiones y diálogos con NPC, nodo a nodo dentro del juego.Ver script →CCTV Security CamerasCámaras colocables, una tablet con vista múltiple en vivo y fotos como prueba.Ver script →

Sigue leyendo