# 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"}
}
```