Garry's Mod: проблема с коллизиями кастомной карты
Ставишь кастомную карту в GMod, всё вроде работает, а через полчаса в чате: «проваливаюсь под текстуры», «застрял в стене», «пропы летят сквозь пол». Первая мысль — карта кривая, но чаще всего дело не в самом .bsp, а в том, что у сервера и клиента банально разные версии контента или недостающие файлы. Разберём по шагам, где искать причину и как это чинить, а не просто менять карту на другую в надежде, что повезёт.
Содержание
- Как понять, что дело именно в коллизиях, а не в лагах
- Несовпадение версии карты у клиента и сервера
- Настройка FastDL для карты и её контента
- Проверка целостности .bsp и упакованного контента
- Отсутствующие .nav файлы — почему боты и NPC ведут себя криво
- Недостающие текстуры и материалы: что реально ломает физику, а что только выглядит криво
- Практический чек-лист диагностики
Как понять, что дело именно в коллизиях, а не в лагах
Симптом «проваливаюсь под текстуры» может означать разные вещи, и от диагноза зависит лечение:
- Игрок реально проваливается под геометрию — падает в бесконечность или застревает под полом. Это либо дыра в физической коллизии, либо brush-энтити скомпилирован как непроходной для рендера, но solid для физики (или наоборот).
- Игрок видит текстуру, но проходит сквозь неё — классический случай рассинхрона: у клиента одна версия карты, у сервера другая. Визуально всё на месте, а хитбокс геометрии не совпадает.
- NPC/боты идут напролом через стены или зависают на месте — это почти всегда про отсутствующий или битый
.nav-файл, а не про физическую коллизию мира. - Пропы и рэгдоллы проваливаются сквозь пол в конкретных зонах — часто displacement-поверхности (ландшафт) с проблемами компиляции, либо func_detail вместо func_brush там, где нужна честная физика.
Включи developer 1 перед заходом на карту — сервер и клиент начнут подробно логировать warning'и о материалах и моделях при загрузке. Сохрани лог через condump (файл ляжет в garrysmod/condump/) и поищи "Missing", "not found", "couldn't load". Это самый дешёвый первый шаг диагностики — причина часто видна в первых же строках.
Несовпадение версии карты у клиента и сервера
Это причина №1 для «то работает, то нет» на кастомных картах в GMod, и вот почему она возникает так часто. Карта может попасть на сервер и к игроку двумя разными путями одновременно:
- Через Steam Workshop (коллекция аддонов, которую сервер подключает через
+host_workshop_collection <id>) — тогда клиент и сервер оба тянут файл с серверов Steam и по идее должны получить одинаковую версию. - Через ручную папку
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, что весь пакет подтягивается целиком.
Практический чек-лист диагностики
Когда репорт от игрока прилетел, а разбираться в теории некогда — вот порядок действий:
- Спроси у игрока точку на карте и сравни хэш локального .bsp с тем, что раздаётся через FastDL/воркшоп — отсекает половину случаев за минуту.
- Зайди сам с
developer 1иcondump, поищи "Missing"/"not found" в логе загрузки. - Проваливаются все и всегда в одном месте — баг компиляции, чинится пересборкой у автора; попроси фикс-патч или, если есть исходник, подправь
.vmfсам. - Проваливаются выборочно и непостоянно — почти наверняка рассинхрон версий: почисти кэш, убери дублирующийся источник карты.
- Это боты/NPC, а не игроки — проверь
.nav, пересобери черезnav_generate. - Обнови ротацию карт после фикса, чтобы старая версия не подхватилась снова — детали в материале про настройку ротации карт.
Поднять сервер 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.