# QC-файл QC-файл - это файл с конфигами для компиляции модели(-ей) в Source. Обычно имеет расширение .qc Для того, чтобы работать с файлом данного расширения может подойти и обычный блокнот. ## Main-Parameters #### $modelname `$modelname "props/table.mdl"` - название и путь для будущей модели. Путь по-умолчанию начинается с папки `models` и не указывается в `modelname`. #### $model `$model "studio" "testmodel_reference.smd"` Параметр, указывающий какой SMD исходник использовать для компиляции модели. Таких параметров может быть более одного... Лимита не знаю, но как минимум 10 запросто. * `"studio"` - здесь можно указать любое название которое вздумается, это может быть только английский текст, без пробелов. Например "moyamodel1" или "moyamodel_testref" По сути эта часть ни на что не влияет, её суть проявляется в параметре боди-группы, но о них немного позже. * `"testmodel_reference.smd"` - здесь указывается имя SMD файла. Файл должен находится в этой же папке, что и сам QC файл. Каждый $model пишем с новой строки! #### $cdmaterials `$cdmaterials "models\testmodel\textures\"` Параметр, отвечающий за поиск текстур, которые используются на модельке. Здесь указываются пути до папок, в которых будет производится поиск. Как в случае с `$modelname`, папку `materials` не надо указывать, т.к. по-умолчанию поиск начинается именно с этой папки. Советую складировать текстуры ДЛЯ МОДЕЛЕЙ в папки после `materials/models`, чтобы не было проблем например с Hammer Editor, он не может использовать шейдер для моделей и такие текстуры находящиеся не в models будут засорять браузер текстур. Да и вам удобней будет искать в `materials/models/....` Параметров `$cdmaterials` может быть так-же много, каждый пишем с новой строки. Поиск производится ТОЛЬКО в указанных папках, в следующих подпапках модель уже ничего не увидит. Переадресацию можно будет сделать только прописав другой путь в самом VMT файле. #### $staticprop Мулипусенький параметр, отвечающий за то, будет ли модель статичной, т.е. просто какой-то проп на карте или эта модель сможет быть динамической, т.е. её можно будет крепить к чему-то, её можно передвигать, менять скины, запускать анимации. Динамическая модель находится всегда в памяти игры и грузит вычислительные мощьности. По этому всякое окружение надо делать с параметром `$staticprop` Никаких дополнительных приписок он не требует. Если этого параметра нет - модель автоматически считается динамической, т.е. `prop_dynamic` В случае, если модель компилируется для SFM, а не для карто-строения можно вообще игнорировать этот параметр. #### $surfaceprop `$surfaceprop "glass"` Параметр, отвечающий за "свойства" материала, из которого сделана модель. К сожалению Source поддерживает только одно свойство на всю модель, по этому бывает, что некоторые модели состоят из нескольких отдельных MDL файлов, чтобы например стекло в машине было стеклом, а сама машина железной. ℹ Список поддерживаемых "материалов" можно узнать тут - https://developer.valvesoftware.com/wiki/Surfaceprop Для физических моделей вроде ящика, бочки... всего, что можно переместить, оттолкнуть выстрелом, откинуть монтировкой.... нужен ещё один парметр, о нём ниже. (см. `$keyvalues`) Для SFM возможно этот параметр даже и не нужен, там "нету физики". Пожалуй этот параметр и колизия модели пригодится если надо будет например стрелять по этой модели. #### $sequence `$sequence idle "testmodel_reference.smd" act_idle 1 fps 30.00` Параметр, указывающий подключение анимации к модели. Любая модель даже статик проп, должна содержать IDLE анимацию. IDLE анимация, это просто состояние костей в модели так сказать в стандартном её состоянии / положении. * `"idle"` - название анимации * `"testmodel_reference.smd"` - smd исходник, для моделей у которой не должно быть анимаций, или это даже статик, можно просто указать саму модель, из неё возьмутся только кости и их координаты + анимация если она там есть. * `"act_idle"` - указывает при каком событии будет срабатывать анимация ℹ Полный список указан тут: https://wiki.facepunch.com/gmod/Enums/ACT * `"1"` - честно говоря загадочная цифра, я так и не понял, что она означает. Чаще всего в случае с и idle тут стоит 1...без 1 не скомпилится. * `"fps 30.00"` - скорость анимации. По умолчанию 30 это норма, можно искусственно замедлить или ускорить уже готовую анимацию, всего лишь изменяя это число. #### $collisionmodel ``` $collisionmodel "testmodel_col.smd" { $concave $mass 100.0 } ``` Параметр, отвечающий за колизию (модель столкновений) модели. Т.е. это модель, по которой мы бьём монтировкой, в которую попадают пули и прочее, на её основе на основную модель уже наносятся в нужных местах декали повреждений. * `"testmodel_col.smd"` - SMD исходник. Модель колизии должна состоять из минимального кол-ва мешей, они обязательно должны быть замкнутыми (вроде куба) и иметь на ВСЮ модель только 1 группу сглаживания. Так-же на модели должна быть ЛЮБАЯ текстура, это не на что не влияет, главное чтобы был какой-то ID на модели. * `"$concave"` - указывает, что модель столкновений должна быть ну скажем "фигурной" чтоли... Т.е. представьте, берём какой-то предмет, обтягиваем его плёнкой и получается что-то бесформенное, так будет выглядеть колизия, если не указать этот параметр. * `"$mass 100.0"` - вес модели в килограммах. По Wiki это "типа" килограммы, но на деле в игре 100/200 игрок поднимает как пушинку. Для основательных моделей советую прописывать вес от 300 и более. * `"$maxconvexpieces 99"` - позволяет превысить лимит "блоков" из которых состоит модель колизии. Советую это делать только в крайних случаях. 99 - макс количество блоков. Есть ещё несколько параметров, но они не слишком важны. О них можно прочитать на WIKI - https://developer.valvesoftware.com/wiki/$collisionmodel ## Additional-Parameters- #### $texturegroup Если вы хотите сделать скины для модели с возможностью переключения, используем команду `$texturegroup`. После строки `$cdmaterials` пишем: ``` $texturegroup "my_skin_group" { { "ladder01a" } { "ladder01b" } { "ladder01c" } } ``` * `my_skin_group` - любое название группы. * `ladder01a` / `ladder01b` / `ladder01c` - названия текстур **ВНИМАНИЕ:** В данном случае первая текстура ladder01a должна быть базовая! То есть наложена на модель в 3D эдиторе. Иначе скины переключатся не будут. Если Вы хотите изменять две текстуры на два или более аналогичных скина просто дописывайте их в строчку: ``` $texturegroup "my_skin_group" { { "rock_001a" "rock_002a" "rock_003a" } { "rock_001b" "rock_002b" "rock_003b" } { "rock_001c" "rock_002c" "rock_003c" } } ``` #### $bodygroup ``` $bodygroup "bg1" { studio "testmodel_ref_bg_1.smd" } ``` Параметр отвечающий за боди-группы модели. Боди группы, это такие дополнительные части модели, которые можно скрывать или показывать. **ВНИМАНИЕ:** меши, которые хранятся в бодигруппах постоянно хранятся в памяти, а следовательно большое кол-во высокополигональных мешей в бодигруппах могут значительно ухудшить производительность. * `"bg1"` - название группы * `studio "testmodel_ref_bg_1.smd"` - smd исходник модели группы, модель обязательно должна содержать такие-же кости как и сама основная модель ! Таких блоков может быть много (лимит не знаю, но более 20 точно). Каждый блок начинается с $bodygroup и содержит в фигурных скобках модель, путь до неё можно указывать как рассказывалось выше. Каждая боди-группа может состоять только из 1 модели. #### $scale `$scale 1.0` Параметр отвечающий за размер модели. Если вам лень переделывать модель, можно добавить этот параметр и насильно увеличить или уменьшить модель во время компиляции. * `1.0` - это стандартный размер модели (по умолчанию). Если не надо производить никаких манипуляций с размером, то этот параметр вообще не нужен. Т.е. если вы укажите например 0.5, то модель скомпилится в размере в 50% от её исходника, если укажите например 2.0 то модель будет больше в 2 раза. **ВНИМАНИЕ:** ни в коем случае не используйте данный параметр для моделей, в которых используется flex технология, т.е. лицевая анимация. Все координаты flex останутся на родных местах и при движении например рта, будет двигаться шея или чего ещё хуже. (не актуально для DMX, для формата DMX флексы не ломаются) Так-же этот параметр обязательно надо указывать перед всеми `$model` и `$bodygroup` т.е. сразу после `$modelname` #### $mostlyopaque / $opaque `$mostlyopaque` `$opaque` Параметры отвечающие за фикс проблем с отображением прозрачности на моделях. Для компиляции указывается ТОЛЬКО ОДИН из них. Так сказать по вкусу и по результату. Чаще всего нужен именно `$mostlyopaque`. Гайд по материалам с прозрачностью: https://steamcommunity.com/sharedfiles/filedetails/?id=875148802 #### $attachment ``` $attachment "mouth" "head" -1.80 4.00 0.00 rotate 0 90 90 ``` Параметр, отвечающий за установку аттачмента на модели. Аттачмент расчитывается от координат одной из костей модели. * `"mouth"` - имя аттачмента * `"head" `- имя кости, к которой крепится аттачмент Далее идут координаты, за счёт них можно немного сдвинуть сам аттачмент относительно кости по осям XYZ и по углам (rotate 0 90 90) #### $lod Параметр, с помощью которой к модели подключаются меши с меньшим количеством полигонов. Движок сам будет выбирать детализированность модели, учитывая мощность компьютера и расстояние от игрока до объекта. Другими словами — это нужно для оптимизации. ``` $lod 10 { replacemodel "wrench.smd" "wrench_LOD1.smd" } $lod 20 { replacemodel "wrench.smd" "wrench_LOD2.smd" } $lod 30 { replacemodel "wrench.smd" "wrench_LOD3.smd" } $lod 40 { replacemodel "wrench.smd" "wrench_LOD4.smd" } ``` * `$lod 10` - значение, которое мы указываем в параметре это расстояние после которого оригинальная модель будет заменятся на упрощенную. #### $keyvalues Свойство для физического пропа, разбиваться на мелкие деревяшки ``` $keyvalues { prop_data { base Wooden.Small } } ``` Продвинутая версия с пояснениями ``` $KeyValues { prop_data // свойства объекта { "base" "Metal.Large" // тип стоковых осколков "dmg.bullets" "1.0" // повреждение от пуль "dmg.club" "30.0" // повреждение от падения, удара "dmg.explosive" "0.0" // повреждение от взрывов "health" "20" // здоровье модели, 0 не получает урона "explosive_damage" "75" // урон от взрыва "explosive_radius" "250" // радиус взрыва "allowstatic" "1" // модель может быть физ и статичной } physgun_interactions // взаимодействие с гравипушкой / игроком / физикой { "onbreak" "explode" //что случиться если объект сломается "onfirstimpact" "break" //первое повреждение } fire_interactions // возгорание объекта { "flammable" "yes" //что случиться если объект загорится "ignite" "halfhealth" //загорится если здоровье снизится до 50% } break // модель разламывается на кастомные обломки { "model" "props/gibs/gibsmodel/gib01.mdl" // модель "health" "1" // здоровье модели "fadetime" "30" // время, за которое исчезнет "offset" "-2 4 1" // спавн обломка со смещением от центра изначальной модели. Иначе все обломки вывалятся фонтаном из центра. } } ``` Параметр, в котором указывается множество дополнительных свойств модели. Список проп-дат можно найти здесь - https://developer.valvesoftware.com/wiki/Prop_data_base_types Остальные KeyValues можно найти здесь - https://developer.valvesoftware.com/wiki/$keyvalues #### QCI файл Иногда хочется не засорять основной файл какими-то длинными параметрами, например списком анимаций или скинов. Для этого придуман файл QCI. По сути это тот-же самый QC но он используется как добавочный. В основном QC в нужном месте пишется `$include "ainmations/ainmation_list.qci"` Компилятор видит эту ссылку и подхватывает всё что там написано, туда можно перенести любые параметры. Путь прописывается аналогично smd или dmx файлу. **Основной QC** ``` $modelname "mymodels\testmodel.mdl" $model "studio" "testmodel_reference.smd" $cdmaterials "models\mymodels\testmodel\" $surfaceprop "metal" $sequence idle "testmodel_idle.smd" act_idle fps 30.00 $collisionmodel "testmodel_col.smd" { $concave $mass 100.0 } $include "skins.qci" ``` Подключаемый QCI (skins.qci) ``` $texturegroup "skinfamilies" { {"textura_1.vmt"} {"textura_2.vmt"} } ``` Что видит компилятор ``` $modelname "mymodels\testmodel.mdl" $model "studio" "testmodel_reference.smd" $cdmaterials "models\mymodels\testmodel\" $surfaceprop "metal" $sequence idle "testmodel_idle.smd" act_idle fps 30.00 $collisionmodel "testmodel_col.smd" { $concave $mass 100.0 } $texturegroup "skinfamilies" { {"textura_1.vmt"} {"textura_2.vmt"} } ```