О статье
После статьи про клифы возникло желание написать похожую статью про воду, но тут будет скорее просто разбор характеристик стандартной воды и пример ее кастомизации (насколько мне известно нельзя юзать несколько типов воды, они привязаны к базовому ландшафту). Так же понадобится самоподключающийся .mix архив.
Тестировалось только на 1.26.
Подготовка
База
Вода это те же тайлы, только рисуются поверх тайлов ланда и могут быть всячески анимированы.
Текстуры воды лежат по пути ReplaceableTextures\Water во вложенных mpq (A.mpq, B.mpq, C.mpq и т.п) и как и в случае с клифами зависят от базового ланда, т.е. выборочно подгружаются; они имеют имена Water*.blp где * это номер (по дефолту от 00 до 44).
Текстуры из дополнения ROC так же есть и в самом war3.mpq по тому же пути но у них в имени есть приставка по типу A_ , где первая буква характеризует ланд.
Текстуры воды лежат по пути ReplaceableTextures\Water во вложенных mpq (A.mpq, B.mpq, C.mpq и т.п) и как и в случае с клифами зависят от базового ланда, т.е. выборочно подгружаются; они имеют имена Water*.blp где * это номер (по дефолту от 00 до 44).
Текстуры из дополнения ROC так же есть и в самом war3.mpq по тому же пути но у них в имени есть приставка по типу A_ , где первая буква характеризует ланд.
Данные о воде хранятся в файле TerrainArt\Water.slk.
Длинный список обозначений:
- waterID - идентификатор воды;
 - height - высота воды, определяет на каком уровне по Z будет находится вода (0.0 это уровень рельефа, -1.0 это уровень мелководья, -2.0 это уровень глубоководья; положительные значения будут рисовать воду выше рельефа на котором она расположена);
 - impassable - проходима ли вода (0 - проходима, 1 - непроходима; летать можно в любом случае);
 - texFile - файл текстуры воды;
 
5-8 - Цвета на миникарте (от 0 до 255).
- mmAlpha - прозрачность;
 - mmRed - красный;
 - mmGreen - зеленый;
 - mmBlue - синий;
 
9-14 - Эти поля связаны с текстурой и влияют на саму текстуру.
- numTex - количество задействуемых текстур;
 - texRate - скорость смены текстур;
 - texOffset - с какой текстуры начинать анимацию (или сдвиг при анимации, хз зачем оно надо);
 - alphaMode - режим наложения текстуры (0 - Blend, 1 - Add, 2 - Mod, 3 - Mod 2X, 4 - Alpha Key);
 - lighting - влияет ли освещение на текстуру (0 - не влияет, 1 - влияет);
 - cells - размер текстуры, имеется ввиду сколько клеток будет занимать текстура;
 
15-25 - Эти поля влияют на движение тайлов.
- minX - минимальный предел движения по горизонтали;
 - minY - минимальный предел движения по вертикали (по дефолту minX minY и прочие выставлены на 0 и вода сама по себе не движется, меняется только текстура);
 - minZ - минимальный предел движения по высоте (угу, вода может быть анимирована по высоте, создавая эффект приливов и отливов);
 - maxX - максимальный предел движения по горизонтали;
 - maxY - максимальный предел движения по вертикали;
 - maxZ - максимальный предел движения по высоте;
 - rateX - скорость движения между пределами minX и maxX по горизонтали;
 - rateY - скорость движения между пределами minY и maxY по вертикали;
 - rateZ - скорость движения между пределами minZ и maxZ по высоте;
 - revX - инвертировать ли горизонтальное направление движения воды rateX при достижении горизонтальных пределов minX или maxX (чтоб вода могла туда-сюда течь; 0 - не инвертировать, 1 - инвертировать);
 - revY - инвертировать ли вертикальное направление движения воды rateY при достижении вертикальных пределов minY или maxY;
 
Пример где задействованы все эти поля.
26-13 - Эти поля связаны с волнами на стыке рельефа.
- shoreInFog - показывать ли волны в тумане войны (0 - не показывать, 1 - показывать);
 - shoreDir - директория с моделями волн;
 - shoreSFile - поддиректория и модель волны на стыке рельефа бег угла (станет ясно если глянуть на путь дефолтной волны Doodads\LordaeronSummer\Water\Shoreline\Shoreline0.mdx);
 - shoreSVar - количество вариаций модели shoreSFile (по дефолту везде стоит 0, похоже за ненадобностью, т.к. в самой модели можно заюзать множество анимаций с разной редкостью);
 - shoreOCFile - поддиректория и модель волны на стыке рельефа углом наружу;
 - shoreOCVar - количество вариаций модели shoreOCFile;
 - shoreICFile - поддиректория и модель волны на стыке рельефа углом внутрь;
 - shoreICVar - количество вариаций модели shoreICFile;
 
Где какие углы.
34-49 - Эти поля связаны с цветом воды основываясь на разнице между высотой воды и высотой рельефа под ней (линейная цветовая интерполяция).
- Smin_A - мелководье, минимальная прозрачность;
 - Smin_R - мелководье, минимальный красный;
 - Smin_G - мелководье, минимальный зеленый;
 - Smin_B - мелководье, минимальный синий;
 - Smax_A - мелководье, максимальная прозрачность;
 - Smax_R - мелководье, максимальный красный;
 - Smax_G - мелководье, максимальный зеленый;
 - Smax_B - мелководье, максимальный синий;
 - Dmin_A - глубоководье, минимальная прозрачность;
 - Dmin_R - глубоководье, минимальный красный;
 - Dmin_G - глубоководье, минимальный зеленый;
 - Dmin_B - глубоководье, минимальный синий;
 - Dmax_A - глубоководье, максимальная прозрачность;
 - Dmax_R - глубоководье, максимальный красный;
 - Dmax_G - глубоководье, максимальный зеленый;
 - Dmax_B - глубоководье, максимальный синий.
 
Нужный инструментарий
- Любой MPQ редактор (я юзаю Ladik's MPQ Editor).
 - Любой редактор для работы с SLK таблицами (тот же Microsoft Excel).
 
Кастомизируем воду
В данной статье мы будем извращаться над дефолтной водой Подземелья (DSha), а именно переделаем воду в лаву.
Как и в случае с файлами тайлов и клифов, файл воды TerrainArt\Water.slk нет смысла кидать в импорт мапы, поэтому создадим пустой .mix архив по этой статье и назовем его WaterCustom.mix, закинем туда файл TerrainArt\Water.slk который мы будем редактировать по ходу дела.
1) Определимся с текстурой и цветом - в нашем случае подойдет и текстура воды самого подземелья так что оставим поле texFile дефолтным, однако чтобы это больше походило на лаву сделаем ее полностью непрозрачной изменив поля Smin_A и т.д. (все 16 штук), поставив значения:
- Прозрачность : 255
 - Красный : 255
 - Зеленый : 255
 - Синий : 215
 
- mmAlpha : 128
 - mmRed : 224
 - mmGreen : 32
 - mmBlue : 0
 
Как по мне так наша лава слишком жидкая и мелкая.
2) Воспользуемся хитрушкой-заманушкой и вместо динамической смены текстуры сделаем движение одной текстуры по горизонтали/вертикали, так же увеличим ее размер. Изменим следующие значения:
- numTex : 1
 - texRate : 0
 - cells : 4
 - rateX : 4
 - rateY : 4
 - revX : 0
 - revY : 0
 
Надо что-то сделать с этими морскими волнами...
3) Неплохо было бы заменить модели волн на что-то типа всплеска лавы или разлета искр, но чисто для пример возьмем модельки огня которые я фастом сварганил - одна для shoreSFile и вторая для shoreOCFile/shoreICFile (модельки по этим путям мы запихнем в наш WaterCustom.mix):
- shoreDir : Doodads\Dungeon\Water
 - shoreSFile : DungeonShoreline
 - shoreOCFile : DungeonShorelineCorner
 - shoreICFile : DungeonShorelineCorner
 
Уже похоже на лаву, хотя огня кажется многовато.
4) Небольшие косметические изменения, например можно сделать так чтобы по лаве нельзя было перемещаться и чтобы ее было видно даже без источников света:
- impassable : 1
 - lighting : 0
 
Для того чтобы лава так же отображалась в редакторе надо немного "пропатчить" .mpq вара таким же образом как и наш WaterCustom.mix.

                                WC3
                            





