Caindo através do mapa no FiveM: colisões não carregando, como corrigir

Jogadores caem através do mapa ao spawnar ou teletransportar? Corrija colisões tardias: arquivos .ybn faltando, streaming demais, RequestCollisionAtCoord e HasCollisionLoadedAroundEntity.

O sintoma: você spawna, teletransporta ou entra em um interior personalizado e cai através do chão, às vezes para o mar ou o vazio sob o mapa, ou cai por alguns segundos ao conectar antes de pousar. A causa é uma coisa: o jogo desenha o mundo antes de ter carregado a colisão que o torna sólido. Aqui está como corrigi-lo nos arquivos e em seus scripts.

Por que acontece

Dados de colisão (arquivos .ybn) são transmitidos como modelos. O jogo os carrega ao redor do jogador, e leva tempo. Quando um script move o jogador longe de uma vez ou um jogador spawna em um servidor ocupado, o jogador pode ser colocado antes do chão existir. A gravidade vence e o jogador cai.

Existem quatro causas usuais:

  • Um mapa personalizado não tem colisão, ou não está no stream.
  • O servidor faz stream de muito, então cada carga é lenta.
  • Um script teletransporta sem esperar que a colisão carregue.
  • A conexão é lenta, então os arquivos de recursos chegam atrasados para um jogador que ingressa.

Causa 1: .ybn faltando em um mapa personalizado

Se você cai apenas dentro de um MLO ou um mapa, procure no seu recurso primeiro:

text
my_mlo/
  fxmanifest.lua
  stream/
    my_mlo.ymap
    my_mlo.ytyp
    my_mlo.ybn      <- the collisions
  • Os arquivos .ybn devem estar dentro de stream. Um .ybn fora dele nunca é enviado aos jogadores.
  • Um pacote para várias partes de um prédio pode ter vários arquivos .ybn. Certifique-se de que todos eles vieram quando você copiou a pasta.
  • Se o pacote não tem .ybn nenhum, o autor não fez as colisões, e uma ferramenta de edição de mapa é necessária para construí-las. Entre em contato com o autor ou escolha outro mapa.
  • Verifique se o recurso está iniciado e o manifesto tem this_is_a_map 'yes'. Veja como instalar um MLO para o layout completo.

Causa 2: streaming demais

Cada jogador baixa e carrega os arquivos transmitidos de seus recursos. Texturas muito grandes, muitos carros de addon, roupas, peds e mapas usam o orçamento de streaming, e as colisões então carregam tarde porque ficam na fila atrás dos arquivos pesados.

Os sinais são uma junção lenta, texturas que aparecem tarde e avisos no console. Reduza e remova o que você não precisa: ativos superdimensionados e perda de textura mostra como. Um servidor mais leve carrega colisões mais rápido para todos.

Dica: depois de remover ativos, limpe seu próprio cache de cliente e teste novamente, pois um cache antigo pode ocultar o ganho. Veja limpar o cache do FiveM.

Causa 3: um script que não espera

Esta é a causa mais comum em teletransportes, respawns e seletores de spawn. A correção é congelar o jogador, solicitar a colisão, esperar até que carregue e depois deixar o jogador ir.

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

O que cada parte faz:

  • FreezeEntityPosition mantém o jogador imóvel, para que a gravidade não possa agir enquanto você espera.
  • RequestCollisionAtCoord diz ao jogo para começar a carregar a colisão nessas coordenadas. Chame-a em cada frame enquanto você espera.
  • HasCollisionLoadedAroundEntity retorna true quando a colisão ao redor do ped está lá.
  • O timeout para um loop infinito se a área nunca carregar, por exemplo quando o mapa não tem colisão nenhuma.

Use o mesmo padrão quando um jogador spawna após seleção de personagem e para veículos: congele o veículo com FreezeEntityPosition(vehicle, true) e espere em HasCollisionLoadedAroundEntity(vehicle).

Causa 4: spawning muito cedo ao conectar

Ao conectar, o primeiro spawn pode acontecer antes de a área estar pronta. Scripts de spawn e multicaráter que não esperam são a razão usual. Se o jogador fica invisível e congelado durante os primeiros segundos e depois cai, verifique seu script de spawn para o padrão acima. Para uma junção que trava na tela de carregamento, veja jogadores presos na tela de carregamento.

Se o problema ocorrer apenas para jogadores com conexões lentas, os arquivos ainda estão sendo baixados quando o jogador é colocado. Manter os arquivos transmitidos pequenos é a melhor ajuda, e uma tela de carregamento ou fade que mantém o jogador até que a verificação acima seja verdadeira evita a maioria das quedas visíveis.

Lista de verificação de depuração para um lugar

  1. Acontece com todos ou apenas com alguns jogadores? Todos apontam para os arquivos do mapa, alguns jogadores para cache ou velocidade.
  2. Acontece apenas em um lugar? Então é um recurso de mapa sem colisão lá.
  3. Pare esse recurso de mapa e tente novamente. Se você não cair mais, o mapa carece de colisão. Se um lugar base do jogo também faz você cair, o problema é a carga, não o mapa.
  4. Acontece apenas logo após um teletransporte? O script precisa do loop de espera acima.

Quando dois mapas se sobrepõem

Uma colisão também pode estar faltando quando um mapa remove os objetos do jogo base e o outro mapa não coloca sua própria colisão em seu lugar. Veja conflitos de mapa.

Lista de verificação

Sintoma Correção
Cair dentro de um mapa personalizado Adicione os arquivos .ybn à sua pasta stream
Cair após um teletransporte Congele, RequestCollisionAtCoord, espere por HasCollisionLoadedAroundEntity
Cair ao conectar Faça o script de spawn esperar que a colisão carregue antes de descongelar
Tudo carrega lentamente Reduza o tamanho e a contagem de ativos transmitidos
Apenas alguns jogadores caem Limpe seu cache e verifique sua conexão
Loop de espera infinito Adicione um timeout para que o loop termine mesmo se a área nunca carregar

Respostas rápidas

Por que caio através do mapa quando me teletransporto?

O jogo ainda não carregou a colisão ao redor da nova posição, então não há chão para pisar. Solicite a colisão no destino e espere até que seja carregada antes de descongelar o jogador.

Qual nativa espera que colisões carreguem?

HasCollisionLoadedAroundEntity(entity) retorna true quando a colisão ao redor dessa entidade está carregada. Chame RequestCollisionAtCoord(x, y, z) primeiro para que o jogo comece a carregá-la.

Por que acontece apenas em um mapa personalizado?

O mapa não tem arquivos de colisão .ybn, ou eles estão na pasta errada, ou faltam no stream. O modelo visível está lá mas nada sólido.

Scripts sem esse problema

Advanced BoostingBoosting de veículos pelo tablet: contratos da classe D à S+, crews e fila ao vivo.Ver script →Quest CreatorUm editor visual de missões e diálogos com NPCs, montado nó por nó dentro do jogo.Ver script →CCTV Security CamerasCâmeras posicionáveis, um tablet com várias telas ao vivo e fotos impressas como prova.Ver script →

Continue lendo