MAATRIX GAMES / Блог / Garry's Mod: проблема с коллизиями кастомной карты

Garry's Mod: проблема с коллизиями кастомной карты

MAATRIX GAMES

Ставишь кастомную карту в GMod, всё вроде работает, а через полчаса в чате: «проваливаюсь под текстуры», «застрял в стене», «пропы летят сквозь пол». Первая мысль — карта кривая, но чаще всего дело не в самом .bsp, а в том, что у сервера и клиента банально разные версии контента или недостающие файлы. Разберём по шагам, где искать причину и как это чинить, а не просто менять карту на другую в надежде, что повезёт.

Как понять, что дело именно в коллизиях, а не в лагах

Симптом «проваливаюсь под текстуры» может означать разные вещи, и от диагноза зависит лечение:

  • Игрок реально проваливается под геометрию — падает в бесконечность или застревает под полом. Это либо дыра в физической коллизии, либо brush-энтити скомпилирован как непроходной для рендера, но solid для физики (или наоборот).
  • Игрок видит текстуру, но проходит сквозь неё — классический случай рассинхрона: у клиента одна версия карты, у сервера другая. Визуально всё на месте, а хитбокс геометрии не совпадает.
  • NPC/боты идут напролом через стены или зависают на месте — это почти всегда про отсутствующий или битый .nav-файл, а не про физическую коллизию мира.
  • Пропы и рэгдоллы проваливаются сквозь пол в конкретных зонах — часто displacement-поверхности (ландшафт) с проблемами компиляции, либо func_detail вместо func_brush там, где нужна честная физика.

Включи developer 1 перед заходом на карту — сервер и клиент начнут подробно логировать warning'и о материалах и моделях при загрузке. Сохрани лог через condump (файл ляжет в garrysmod/condump/) и поищи "Missing", "not found", "couldn't load". Это самый дешёвый первый шаг диагностики — причина часто видна в первых же строках.

Несовпадение версии карты у клиента и сервера

Это причина №1 для «то работает, то нет» на кастомных картах в GMod, и вот почему она возникает так часто. Карта может попасть на сервер и к игроку двумя разными путями одновременно:

  1. Через Steam Workshop (коллекция аддонов, которую сервер подключает через +host_workshop_collection <id>) — тогда клиент и сервер оба тянут файл с серверов Steam и по идее должны получить одинаковую версию.
  2. Через ручную папку garrysmod/maps/ на сервере плюс раздачу через FastDL или обычный sv_allowdownload.

Проблема начинается, когда админ однажды залил карту руками в maps/, а потом она попала ещё и в воркшоп-коллекцию — теперь один и тот же слаг существует в двух источниках с разными таймстампами. Клиент с уже закэшированным воркшоп-файлом продолжает грузить старую версию, даже если ты обновил .bsp на сервере: у сервера geometry v2, у части игроков в кэше — v1, и коллизии физически не совпадают, потому что это разные файлы.

Как проверить руками:

md5sum garrysmod/maps/gm_construct_custom.bsp

и сравнить с тем, что реально раздаётся клиентам (через FastDL — смотри следующий раздел). Если хэши не совпадают с тем, что ты только что залил, — где-то висит старая копия, либо в кэше Steam Workshop, либо в закэшированных файлах самого движка (garrysmod/download/maps/, если раньше карта скачивалась через обычный sv_downloadurl).

Практическое правило: выбери один источник карты и придерживайся его. Если карта раздаётся через FastDL — не клади её ещё и в воркшоп-коллекцию сервера, и наоборот. При обновлении bsp меняй имя файла (например, добавь суффикс версии: gm_construct_custom_v2.bsp) вместо перезаписи старого — так не останется шансов, что кто-то доиграет на устаревшей геометрии из локального кэша.

Поднять сервер Garry's Mod за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Настройка FastDL для карты и её контента

FastDL — это раздача карты, материалов и моделей через обычный HTTP(S), а не через встроенный (и очень медленный) download сервера Source. Если её нет или она настроена криво, часть игроков либо не докачает файлы вовсе, либо получит их с задержкой — и в этот момент коллизии могут временно не совпадать, пока докачка не завершится.

В server.cfg:

sv_allowdownload 1
sv_allowupload 0
sv_downloadurl "https://fastdl.тво-домен.ru/gmod/"

На веб-сервере структура папок должна зеркалить структуру сервера GMod:

fastdl/gmod/
├── maps/
│   └── gm_construct_custom.bsp.bz2
├── materials/
│   └── models/props_custom/…
└── models/
    └── props_custom/…

Карту и тяжёлый контент стоит паковать в .bz2 (bzip2) — движок Source умеет докачивать сжатые файлы напрямую и распаковывать их сам, это сильно экономит трафик:

bzip2 -k garrysmod/maps/gm_construct_custom.bsp

Если раздаёшь через Lua-аддон, а не голый FastDL, используй resource.AddFile() в autorun/server, чтобы явно указать движку, какие файлы обязательны для докачки:

resource.AddFile("materials/models/props_custom/crate01.vmt")
resource.AddFile("materials/models/props_custom/crate01.vtf")
resource.AddFile("models/props_custom/crate01.mdl")

Сама .bsp обычно докачивается автоматически при коннекте, если сервер отдаёт её по sv_downloadurl, но упакованные в неё кастомные материалы — не всегда, особенно если их нет в базовых VPK игр (Half-Life 2, CS:S). Нехватка материалов не ломает физическую коллизию (она печётся в геометрию при компиляции), но создаёт путаницу: игрок видит фиолетово-чёрную шашечку и решает, что «карта сломана», хотя пол под ним на месте. Если не уверен, что сам сервер настроен правильно, — посмотри гайд по подъёму сервера Garry's Mod.

Проверка целостности .bsp и упакованного контента

Прежде чем чинить «коллизии», убедись, что сам файл карты не битый и все нужные ресурсы реально лежат внутри pak-лампы .bsp (это встроенный zip-архив внутри карты, куда мапперы кладут кастомные текстуры и модели, чтобы не раздавать их отдельно).

Список содержимого pak-лампы:

bspzip -list garrysmod/maps/gm_construct_custom.bsp

Если в списке нет ожидаемых materials/… или models/… — значит маппер не упаковал их при компиляции, и без внешней раздачи через FastDL или аддон эти ресурсы вообще не попадут к игрокам. Извлечь и проверить содержимое можно так:

bspzip -extractfiles garrysmod/maps/gm_construct_custom.bsp ./extracted/

Для более глубокого разбора геометрии (какие brush-энтити какого типа, что помечено как solid, где стоят clip-брaши) пригодятся внешние инструменты: BSPSource декомпилирует .bsp обратно в .vmf, который можно открыть в Hammer и посмотреть структуру карты; Crowbar и VIDE помогают разобраться с моделями и их коллизионными хитбоксами (.phy/.mdl), если проваливается не мир, а конкретный проп.

Важный нюанс: физическая коллизия brush-геометрии печётся компилятором VBSP на этапе сборки и не зависит от того, докачал ли клиент текстуры. Если что-то проваливается у всех одинаково (а не выборочно, как при рассинхроне версий) — причина в компиляции: brush помечен как func_detail без нужных флагов, схлопнулась коллизия сложной displacement-поверхности, либо в карте есть утечка (leak), из-за которой VBSP не построил физику для части геометрии. Чинится только пересборкой у автора карты — покерка на сервере тут не поможет, и это стоит честно сказать игрокам, если карта стороннего мапера.

Отсутствующие .nav файлы — почему боты и NPC ведут себя криво

Здесь важно не путать два типа коллизий. .nav-файл — это не физическая геометрия мира, а карта навигации для ботов и NextBot-сущностей (зомби в Zombie Survival, NPC-хосты в PropHunt, боты TTT). Если файла нет или он не соответствует текущей версии карты, AI ходит сквозь стены, застревает в углах или вообще стоит на месте — визуально похоже на «баг с коллизиями», хотя игрока это не касается напрямую.

Проверить, есть ли nav-файл для карты:

ls garrysmod/maps/*.nav

Если файла нет — сгенерировать его можно прямо в игре (нужны читы и, как правило, локальный/тестовый запуск, а не боевой сервер под нагрузкой):

sv_cheats 1
nav_generate

Игра перезайдёт на карту в спец-режиме, построит сетку автоматически и сохранит .nav рядом с картой. Автогенерация не идеальна на сложных многоуровневых картах (лестницы, вентиляция, тонкие мостики) — после неё стоит пройтись и подправить проблемные зоны через nav_edit 1, либо прогнать раунд с ботами и посмотреть, где они массово застревают. Если карта регулярно обновляется, старый .nav от прежней геометрии может не совпадать с новой — лечится тем же nav_generate заново. Общая логика «нав-меш живёт отдельно от физической коллизии» разобрана и на другом движке в нашем материале про проблемы с bot navigation mesh.

Недостающие текстуры и материалы: что реально ломает физику, а что только выглядит криво

Разделим два случая, которые админы регулярно путают:

Пропавшая текстура НЕ ломает коллизию. Если у брaша нет материала на клиенте, движок покажет фиолетово-чёрную шашечку, но физическая форма геометрии, запечённая VBSP при компиляции, остаётся на месте. Игрок увидит уродливую текстуру, но не провалится.

Пропавший tools-материал не про докачку. Мапперы используют служебные текстуры вроде tools/toolsclip, tools/toolsplayerclip, tools/toolsinvisible — они не видны в игре и не требуют раздачи клиенту, потому что компилятор строит из них физику ещё на этапе сборки .vmf → .bsp у самого маппера. Если в консоли есть warning про отсутствие tools/* материала — это обычно значит, что карта скомпилирована без чистки лишних ссылок, а не то, что игроку чего-то не хватает.

Таблица — что реально нужно докачивать клиенту, а что нет:

Тип контентаНужна докачка клиентуВлияет на коллизию
Геометрия brush/displacement (в самом .bsp)Нет, идёт вместе с картойДа, напрямую
Кастомные .vmt/.vtf (видимые текстуры)Да, если не упакованы в pak-лампуНет, только визуал
tools/* служебные материалыНет, не рендерятсяКосвенно — только через компиляцию карты
Кастомные модели пропов .mdl/.phyДаДа, если у модели своя физическая форма (.phy)
.nav файлДа (или генерируется локально)Только для AI/ботов, не для игрока

Отдельно про кастомные модели: у пропа может быть свой .phy-файл с физической формой, отличной от визуальной модели (упрощённый collision mesh). Если докачался .mdl, но не .phy, физика откатится к дефолтному bounding box — отсюда пропы, которые визуально стоят на полке, а физически парят в воздухе. Если ставишь такие пропы через воркшоп, проверь по гайду про установку аддонов из Steam Workshop, что весь пакет подтягивается целиком.

Практический чек-лист диагностики

Когда репорт от игрока прилетел, а разбираться в теории некогда — вот порядок действий:

  1. Спроси у игрока точку на карте и сравни хэш локального .bsp с тем, что раздаётся через FastDL/воркшоп — отсекает половину случаев за минуту.
  2. Зайди сам с developer 1 и condump, поищи "Missing"/"not found" в логе загрузки.
  3. Проваливаются все и всегда в одном месте — баг компиляции, чинится пересборкой у автора; попроси фикс-патч или, если есть исходник, подправь .vmf сам.
  4. Проваливаются выборочно и непостоянно — почти наверняка рассинхрон версий: почисти кэш, убери дублирующийся источник карты.
  5. Это боты/NPC, а не игроки — проверь .nav, пересобери через nav_generate.
  6. Обнови ротацию карт после фикса, чтобы старая версия не подхватилась снова — детали в материале про настройку ротации карт.

Поднять сервер Garry's Mod за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Частые вопросы

Можно ли починить коллизии кастомной карты, не имея .vmf-исходника?

Частично — можно закрыть проблемную зону дополнительными invisible-брашами через небольшой аддон-патч, но это костыль, а не решение. Полноценно чинится только пересборкой карты автором.

Почему на одной карте у части игроков всё нормально, а у части — проваливаются?

Почти всегда рассинхрон версий: у части клиентов закэширована старая копия карты (воркшоп или старый FastDL-кэш), а сервер уже раздаёт новую геометрию.

Обязательно ли класть .nav в FastDL?

Нет, .nav можно сгенерировать локально командой nav_generate на машине с той же версией карты — раздавать отдельно не обязательно, если на сервере он уже лежит рядом с картой в maps/.

Как понять, виновата компиляция карты или докачка файлов?

Если баг стабильно воспроизводится у всех в одном месте карты — это компиляция. Если он «плавающий» и пропадает после переподключения или очистки кэша — это про докачку и версии.

Нужно ли паковать текстуры прямо в .bsp через pak-лампу?

Для небольших карт — да, удобнее: один файл, никаких проблем с путями на FastDL. Для тяжёлых карт с кучей моделей лучше раздавать материалы отдельно через FastDL/аддон, чтобы не раздувать сам .bsp.