МАГИСТЕРИУМ в T3Ed:   создать, избавиться, исправить

Автор Tiens, 28 сентября 2009 13:06:40

« назад - далее »

0 Пользователи и 5 гостей просматривают эту тему.

Tiens

ВОПРОС:   Можно ли поворачивать браши под прямыми углами в 90 и 180 градусов, чтобы не крутить вручную?

Лучше браши вообще не крутить - чем больше их трогаешь, тем больше шанс заполучить вечную BSP-дырку.

При создании браши в окошке "Brush Builder" (браш-билдер) достаточно поменять местами её размеры (чтобы посмотреть результат, жми кнопку "Build").

А уже готовую браш лучше редактировать в режиме "Vertex Editing" (кнопка с рисунком "крестик+стрелка" рядом с "Camera Movement"): включаешь режим, далее ЛКМ на браш, далее зажимаешь одновременно Alt и Ctrl и обводишь квадратиком нужную тебе стенку браши, далее отпускаешь кнопки, далее зажимаешь Ctrl и тянешь выделенную стенку браши в нужную тебе сторону. Чтобы выйти из режима Vertex Editing, щелкни на пиктограмму Camera Movement. Далее ребилдинг.


ВОПРОС:   Беру комнату-браш. Как узнать её точный размер?

Если ты про уже готовую браш, то тут только "на глазок". Меняешь размер сетки на поле и прикидываешь, какие примерно габариты у данной комнаты.


ВОПРОС:   Как создать комнату какой-нить другой формы кроме куба?

Самое простое - использовать примитивы, т.е. стандартные строительные формы. Их пиктограммы находятся слева, на вертикальной панели, второй раздел сверху - зеленый кубик Cube Builder, плоскость Sheet Builder, конус Cone Builder и т.п.

Кстати, для создания обычных прямоугольных комнат я советую использовать именно примитив Cube Builder. Через него это делать гораздо проще и быстрее.

ЭТАПЫ:
1) Щелкнуть по нужной пиктограмме -> откроется окошко с параметрами.
2) Вручную ввести габариты браши и щелкнуть кнопку Build -> красный куб изменит форму.
3) Если результат не понравился - заново пункт 2. Если результат понравился - жми кнопку Close (окошко закроется), выдели красный куб (или то, во что он превратился), перетащи его на нужное место и жми на нужный тебе вид браши (Add / Subtract).



Windows XP Professional SP3, Intel Core 2 CPU 6400 @ 2.13GHz each CPU (4.26GHz total), Random Access Memory 3.25Gb, NVIDIA GeForce 9600 GT, Motherboard ASUS P5KC, Monitor Resolution 1680x1050

Lolkab

Цитата: Tiens от 04 января 2011 02:01:05
ВОПРОС:   Беру комнату-браш. Как узнать её точный размер?

Если ты про уже готовую браш, то тут только "на глазок". Меняешь размер сетки на поле и прикидываешь, какие примерно габариты у данной комнаты.

Всё-таки можно. В режиме Vertex Editing он показывает размер.
0. Всегда будь готов к переустановке системы. 1. В любой непонятной ситуации переустанавливай систему.
2. Если переустановка системы не помогла, переустанови систему ещё раз. 3. Если понятную ситуацию лень решать непонятными методами, её можно считать условно непонятной и переустановить систему.

Tiens

ВОПРОС:   Как сделать свою загрузочную картинку?

ЭТАПЫ:

1) создать в Фотошопе свою картинку таких же габаритов, что и собственное разрешение экрана. Затем принудительно поменять размеры изображения на 512х512 или 1024х1024.

2) Конвертировать это изображение в DDS формат.

Например, для конвертирования картинки через "DDS Converter 2" подойдут следующие настройки (кнопка Options, раздел - формат DDS): графа Tool - галка на nVidia; графа DXTc format - галка на DXT1c или DXT3; графа Options - Build mipmaps - без галки; графа Filter - надпись Triangle или Box (Default), остальное - чисто.

3) теперь настало время определиться, в какой именно момент ты хочешь видеть свою загрузочную картинку, и переименовать её в соответствии с назначением. Тут имеются два варианта, причем можно использовать как только один из них, так и оба одновременно. Итак, твоя загрузочная картинка может проигрываться:

а) вместо загрузочной картинки по умолчанию "Гарретт на крыше". Она видна во время запуска игры (т.е. загрузки главного меню) и при загрузке миссии, при условии что данная миссия не имеет собственной загрузочной картинки. В этом случае имя твоего файла должно быть "Loading1.dds".

б) в качестве загрузочной картинки к определенной карте (загрузочной зоне миссии), по примеру родных (оригинальных) миссий, состоящих из двух загрузочных зон, где к каждой зоне приписана своя загрузочная картинка. В этом случае имя твоего файла должно быть "ИМЯ_ФАЙЛА_ЗАГРУЗОЧНОЙ_ЗОНЫ.dds". Например, так двум частям оригинальной миссии Шейлбриджская Колыбель с именами HauntedHouse1.ibt и HauntedHouse2.ibt соответствуют загрузочные картинки HauntedHouse1.dds и HauntedHouse2.dds.

4) скопируй свою картинку в папку редактора ...\CONTENT\T3\PCTextures\DynamicallyLoaded. Для того, чтобы в твоей миссии картинка работала, добавь её вместе с папкой в архив с миссией.
Windows XP Professional SP3, Intel Core 2 CPU 6400 @ 2.13GHz each CPU (4.26GHz total), Random Access Memory 3.25Gb, NVIDIA GeForce 9600 GT, Motherboard ASUS P5KC, Monitor Resolution 1680x1050

Serge

#78
Цитата: Tiens от 04 января 2011 02:01:05
ВОПРОС:   Как создать комнату какой-нить другой формы кроме куба?

Бывает так, что примитивами создавать требуемую геометрию сложно,  долго и неудобно. Например, нужны ломаные стены в каком-нибудь подземелье. Для таких случаев (и не только таких) существует еще несколько способов.

1. Через 2D editor. См. посты выше.
2. Отредактировать примитив в Vertex Editing. См. посты выше.
3. Нарисовать строительный браш вручную:

Для этого нажимаем кнопку Freehand Polygon Drawing на панели слева. Не забываем выставить привязку к сетке (Toggle Drag Grid). Удерживая нажатым Ctrl, ПКМ указываем, где должны располагаться вершины браша. Тут главное  учесть что, при создании браша, вершины соединит в той последовательности, в какой вы их указали, а последнюю замкнет с первой. Поэтому следует избегать пересечения граней, т.к. это может привести к BPS дырам в дальнейшем.




После того как указали все вершины, на свободном месте ПКМ (Сtrl удерживать уже не надо) и в выпадающем меню выбираем CREATE BRUSH. В появившимся окне Depth указываем глубину выдавливания. Все браш готов.

4. Отсечь все ненужное от примитива с помощью Brush Cliping:

Для начала выбираем стандартный примитив, например Cube. Кликаем на него в окне проекции и жмем Brush Cliping на панели слева. Теперь необходимо создать секущую прямую. Для этого удерживая Ctrl, ПКМ указываем две точки, через которые она пройдет. Появятся маркеры, соединенные красной прямой. Отсекать будет ту часть браша, с какой стороны от прямой расположена красная черточка. При необходимости измените направление нажав на кнопку Flip Clipping Normal на панели слева.


Теперь нажимаем Clip Selected Brushes и отсекаем лишнее.

Немного усложним задачу. Если создать 3 точки, то в окне перспективы можно задать положение секущей плоскости и, например, срезать один из углов куба.



Еще немного о Brush Cliping. С помощью этой функции можно отсекать части не только от строительного браша, но и уже от готового положительного или отрицательного браши.
А если нажать на Split Selected Bruhes , то указаный браш разделится на два на указанной линии (плоскости).

Tiens

#79
ВОПРОС:   Почему на моей карте NPC, когда пугаются, не бегут к маркеру-орлу в панике, а стоят на месте и вертятся по сторонам?

Либо твой маркер слишком высоко над полом (или внутри меша, или в стене, короче, вне зоны досягаемости для АИ), либо у тебя плохо просчитан NavMesh (пространство пола для хождения АИ, те самые красные квадратики по полу), либо этот орел не их вида (маркеры для чудовищ, людей и зверей - разные).
Windows XP Professional SP3, Intel Core 2 CPU 6400 @ 2.13GHz each CPU (4.26GHz total), Random Access Memory 3.25Gb, NVIDIA GeForce 9600 GT, Motherboard ASUS P5KC, Monitor Resolution 1680x1050

Tiens

#80
ВОПРОС:   Существуют ли какие-либо ограничения на размер уровней в T3Ed?

Для T3Ed существует принципиальная разница между "уровнем" и "картой" ("загрузочной зоной"). УРОВЕНЬ может состоять из нескольких ЗАГРУЗОЧНЫХ ЗОН / КАРТ, а потому ощутимого ограничения на размер УРОВНЯ (т.е. непосредственно миссии) просто нет. А следовательно, когда речь идет об ограничения в TDS и T3Ed, имеется ввиду исключительно ограничения в пределах одной ЗАГРУЗОЧНОЙ ЗОНЫ / КАРТЫ.

В принципе, ограничения в размере файла карты существуют. Известный и пока непреодолимый максимум это количество зон = 1024. Но в реале карта начинает капризничать намного раньше.

Также критичны следующие объемы Vertex Pool:
- общий объем игрового пространства Dynamic Vertex Pool = 3145728
- количество мешей Static Vertex Pool = 2621440
- общий объем пространства теней Static Shadow Vertex Pool = 1572864

Однако все показатели Vertex Pool можно увеличить самому. Для этого достаточно дописать в файле user.ini в папке редактора увеличенные объемы Vertex Pool, а также добавить в архив со своей миссией файл user_patch.ini с этими же цифрами. Например, цифры могут быть такие (все ограничения увеличены в три раза):

[PCVertexPools]
DynamicVertexPool=9437184
StaticVertexPool=7864320
StaticShadowVertexPool=4718592

Еще существует некое неявное ограничение, которое проявляется в том, что карта, беспроблемно прошедшая ребилдинг, перестает запускаться в тестовом режиме, т.е. вылетает во время загрузки. Если других ошибок нет, то в данном случае считается, что достигнут предельный размер уровня. По этому поводу очень много споров и расхожих мнений, и никому еще не удалось однозначно доказать прямую зависимость размера уровня от чего-либо, хотя уже есть некоторые догадки.

Пока известен только один возможный виновник того, что загрузочная зона достигает своего предела. Это количество свойств объектов, измененных прямо на карте. Похоже, что T3Ed ведет подсчет задействованным свойствам, и лимит, отведенный под изменения на карте, слишком мал. Однако можно оттянуть наступление этой критической черты, если первоначально создавать новые объекты, либо изменять свойства уже имеющимся исключительно в Actor Browser, а на карту добавлять только объекты с подогнанными свойствами. К сожалению, просто невозможно сделать миссию так, чтобы не потребовалось изменить хотя бы несколько свойств прямо на карте. К тому же, в любом случае теоретически в какой-то момент должно быть достигнуто общее ограничение на количество задействованных свойств, т.е. бесконечно расширять загрузочную зону не получится.


ВОПРОС:   Как исправить низкий FPS? Можно ли как-нибудь самому оптимизировать мою карту?

Постараюсь обобщить мнения разного народа, чужие эксперименты и свой собственный опыт. Говорю сразу, что это не жесткие правила, а скорее советы, на которые стоит ориентироваться, но которые при желании и определенной изобретательности можно обойти.

Итак, в первую очередь наш главный инструмент оптимизации это, безусловно, разбиение пространства на зоны. При этом надо учитывать следующие особенности:

1) FPS просчитывается по направлению взгляда играющего и падает тем больше, чем дальше от игрока противоположная стенка. Это значит, что "чисто бааальшие площади" надо оставить быкам в малиновых пиджаках под разборки, а самому приступить к визуальному обману зрителя:
- усложнять пространство перед играющим,
- создавать пейзаж в кубе для неба (вспомни The Bridge),
- уменьшать/увеличивать размеры объектов (чтобы игрок думал, что они дальше/ближе, чем есть на самом деле),
- поднимать яркость уровня (визуально поднимает освещенность, что позволяет убрать лишние источники света),
- искривлять уходящее вдаль пространство...
Короче, выясни весь набор женских штучек по визуальной коррекции собственной фигуры, - и вперед!

2) куда и откуда бы игрок не смотрел, перед его глазами должно быть не более 15 эмиттеров (Emitters) - это пламя светильников, молнии, дым и т.п. Иначе они просто исчезают прямо на глазах играющего. Правда, в зависимости от FPS на конкретном месте и количества частиц в самих эмиттерах, их число можно поднять до 25.

3) куда и откуда бы игрок не смотрел, перед его глазами должно быть не более 4-х теневых источников света - это свет, где в свойстве Flesh Light Type указан такой тип освещения как FL_Omni. Причем, если нет эмиттеров, то количество таких "лампочек" можно смело поднять до 7. Правда, если на определенном месте изначальное FPS ниже 15 (если твой максимальный FPS = 25), то лучше его вообще не освещать. Короче, твоя главная задача - избавиться от тех "лампочек", без которых можно обойтись. О том, какие хитрости тут можно пустить в ход, напишу чуть позже.

4) освещенные области ("шары" света от источников) не должны перекрывать друг друга. Машина просчитывает такие участки дважды, из-за чего и чувствительно падает FPS. Если тебе удавиться как нужен, например, алтарь с тенями в две стороны, то поставь его так, чтобы больше вообще никаких "лампочек" в кадр не попадало, с какой стороны ни подойти.

5) можно распределить различные факторы по степени их влияния на FPS от большего к меньшему:
- то, насколько широко раскинулось пространство перед игроком, а также то, насколько правильно (т.е. без глюков и дыр) построено это самое пространство;
- источники света;
- количество теней от объектов;
- количество NPC;
- количество эмиттеров;
- туман.

В редких случаях внезапно появившаяся BSP-дыра говорит не об ошибке в построении брашей, а о том, что данная зона перегружена этими самыми факторами влияния на FPS.

ОБЩИЕ СОВЕТЫ:
1) используй по максимуму пространство "небесного куба", но никогда не вставляй туда больше 2-х источников света. Кстати, за счет тумана можно сделать так, что в "небесном кубе" вообще не будет источников света. Как, например, в ОМ "Особняк Капитана Мойры".

2) идеальный размер одной зоны рабочего пространства 512 на 512 и 1024 в высоту. Но если немножко попариться, её можно растянуть до 2500х2500х2500.

3) сами по себе меши (static mesh) ни на размер уровня, ни на FPS не влияют. Влияют их тени. А еще тени от текстур. Даже если эти тени оказались вне зоны освещения и не видны игроку. А потому всегда избавляйся от лишних теней.

Кстати, вообще полезно регулярно повторять операцию с лишением теней всех объектов/текстур и оставить выставление теней на самый последний момент. Это ускорит и облегчит ребилдинг.

4) обычно для того, чтобы FPS был на приемлемом уровне, достаточно зонирования с помощью разделителей зон (зеленых плоскостей), но все мы иногда сталкиваемся с проблемными зонами - большими залами или улицами со сложной архитектурой и большим количеством NPC, источников света или эмиттеров. Машина плохо просчитывает сложное зонирование, поэтому идеальное перекрытие для зоны - не "листочек" портала зоны, а обычная стена (даже невидимая). Переходы между проблемными зонами должны либо выходить в тупичок с хорошим FPS, либо являться локальными телепортами (т.е. по местной локации, а не на другую карту).

Если несколько зон подряд будут насквозь просматриваться через переход, то никакое зонирование не спасет - либо упадет FPS, либо игроку вместо дальней улицы будет подмигивать небо. В данном случае наличие двери или еще какого меша, закрывающего собой глюк, не помогает поднять FPS - машина "за людей" в данном вопросе считает только стены (стенки синих и рыжих брашей).

Локальные телепорты можно сделать двумя способами: либо с помощью скриптов (т.е. посылаешь большой привет Обливиону с его вариантом "тронул дверь - загрузился в домик"), либо используешь Teleport Volume и оформляешь вход и выход так, чтобы игрок не заметил перехода. Дело в том, что "местный" телепорт не показывает загрузочной картинки и вообще момент перехода не уловить - хлоп!, и ты уже там.

5) туман и все подобные эффекты понижают FPS, но все же не так критично, как источники света.

6) ошибка, связанная с размерами Vertex Pool, чаще всего означает обычный глюк при ребилдинге, когда машине кажется, что твой уровень слишком "размазан" по одному из осевых направлений от "нуля". Лично мне часто помогает перетаскивание всей карты (или новопостроенного кусочка) на место, более равномерно распределенное вокруг "центра" сетки. Машина во время ребилдинга заново пересчитывает все браши и успокаивается.

СОВЕТЫ ПО ОСВЕЩЕНИЮ:
1) "бестеневые" источники света (FL_OmniNoShadow, FL_AmbientVertex, FL_SpotNoShadow, FL_DirectionalNoShadow и FL_Project) предпочтительнее дающих тень. Даже если у них большая область "воздействия".

2) вместо источников света используй текстуры стекла, окон, лавы и другие подобные. Они сами "подсвечиваются" и не нуждаются в дополнительном освещении. Правильное сочетание "светящейся" текстуры, эмиттера и опции "Render - TexturePan" (текстура "плывет" по поверхности) может дать ошеломляющий результат.

3) в принципе, можно соорудить пространство из одной или нескольких больших площадей, но тогда забудь про "лампочки" (FPS настолько упадет, что уровень может не запуститься). Вместо источников света поднимаешь яркость всего уровня (в опциях Level Properties - Properties - ZoneLight - AmbientBrightness) и обыгрываешь текстуры и эмиттеры.

4) можно вручную раздвинуть искусственные ограничения движка на освещение уровня. По сути, это переложит некоторые заботы движка на видеокарту игрока. Соответственно, следует принимать во внимание, что этот метод работает эффективно только на более-менее новых компьютерах, а значит, для страховки среди тестеров обязательно должен быть кто-нибудь со слабой машиной. К сожалению, этот метод не избавляет от проблем с зонированием. Однако это позволит увеличить количество источников света (иногда - аж в 2 раза), а также это поднимет нижнее значение FPS на уровне.

Итак, чтобы раздвинуть лимит на освещение, на каждой из карт (загрузочных зон) нашей миссии идем в главное меню -> "Level Properties" и находим группу свойств "Zone Info". Печатаем цифры вручную:

- Max Light Count = 255
- Max Lighting Poly Count = 150000
- Min Light Count = 1
- Min Lighting Poly Count = 1

5) особенно эффективно, если использовать вместо источников света типа FL_Omni источники света типа FL_Spot. Хитрость в том, что источник света FL_Omni испускает свет из центра некой сферы во всех направлениях одновременно, а источник света FL_Spot светит только в одном направлении, а потому FL_Spot воздействует на производительность в несколько раз меньше, чем FL_Omni. Также важно то, что оба типа освещения дают тени и могут быть скомбинированы с каким-нить мешем в фонарь или светильник, а это значит, что светильники на основе FL_Spot можно применять так же широко, как и FL_Omni.

Итак, для примера рассмотрим, как сделать светильник с источником света FL_Spot. Советую для практики сначала создать лампу FL_Spot на тестовой карте, а лишь затем внести её в Actor Browser. Учти, что если захочется увидеть в окне Flesh Renderer результат от очередного изменения в свойствах светильника, тебе надо немного сдвинуть твою лампу. Изначальное положение источника света относительно лампы (Light Hardpoint Offset) и направление луча света (Light Hardpoint Rotation) будут зависеть от того, какой меш ты выберешь.

СВОЙСТВА лампы:
*) группа свойств "Lighting":
- Flesh Light Type = FL_Spot
- Light Damping = 0.5   (это для того, чтобы переход между светом и тенью был не слишком резким)

- Light Hardpoint Offset:   (это положение точки крепления источника света)
--- x = 0
--- y = 0
--- z = 150

- Light Hardpoint Rotation:   (это поворачивает направление "лучей света")
--- Pitch = 0
--- Roll = -16500
--- Yaw = 0

- Light Shape:
--- Dot Bias = 0
--- Light Cone = 110   (это угол освещения)
--- Light Inner Radius = 0
--- Light Period = 0
--- Light Phase = 0
--- Light Radius = 56   (это дальность освещения)

- Shadow Extrusion Distance = 512   (лучше менять это свойство у светильника прямо на карте и только тогда, когда имеются проблемы с тенями. Верное число подбирается экспериментами. Иногда требуется цифра 1024.)

*) группа свойств "Render":
- Object Mesh = GENxLIGHTfixAh

Напоследок нужно сказать, что даже если на своем собственном компьютере миссия будет зажигать на сверх-скоростях, то на чужих машинах даже самая тщательная оптимизация, к сожалению, не дает 100-процентного положительного результата. Среди игроков обязательно найдутся те, у кого будет то тормозить, то вылетать, то глючить. Единственный способ хоть как-то защититься от подобных проблем это целенаправленно набирать тестеров с разношерстными машинами, чтобы были тесты и на слабых компах, и на сильных, и на середнячках. Тогда полученная статистика будет ближе к реальному положению дел.
Windows XP Professional SP3, Intel Core 2 CPU 6400 @ 2.13GHz each CPU (4.26GHz total), Random Access Memory 3.25Gb, NVIDIA GeForce 9600 GT, Motherboard ASUS P5KC, Monitor Resolution 1680x1050

Zontik

[off]И несмотря на все вышеперечисленное, люди продолжают творить, обходя эти невероятные ограничения. Если кто после этого при мне станет жаловаться на ограничения в DromEd'е - буду громко смеяться.
Мое уважение и восхищение вам, создатели![/off]
Дайте глазам отдохнуть! Тёмное место

Tiens

#82
В ДОПОЛНЕНИЕ К ПОСТУ ОБ ОПТИМИЗАЦИИ:

Локальные телепорты внутри одной загрузочной зоны - очень удобный инструмент как при оптимизации карты, так и при планировании пространства. Однако многие боятся его применять, поскольку это может позволить игроку мухлевать, т.е. прятаться от погони, телепортировавшись в неохраняемое место. И это мнение совершенно не обосновано. Для T3Ed не проблема телепортировать NPC-преследователя туда же, куда телепортируется убегающий игрок. Данный метод уже применен в моей фан-миссии "The Cabal: Furious Flames" и в "The Cabal: Knife to the Heart" (автор Nomad). Рассмотрим, как это сделать, на тестовой карте:

ТУТОРИАЛ "Стражники-NPC телепортируются вслед за Гарреттом":

1) Для начала на абсолютно чистой карте создай две большие комнаты (комната N1 и комната N2). Они станут твоими зонами для телепортации, поэтому как-нибудь пометь их "входы" (места перехода между зонами). Затем создай 3 телепортационных плеерстарта (Playerstarts) и 3 вольюма (Volumes). Два плеерстарта и два вольюма будут телепортационными порталами, поэтому каждый из этих вольюмов должен окружать свой "вход" в каждой комнате, а каждый из плеерстартов - служить выходом при телепортации из другой комнаты и находиться в непосредственной близости к "входу" данной комнаты (но вне пределов вольюма). Третий плеерстарт будет "точкой возврата" для NPC, поэтому помести её где-нить в центре комнаты N1. Третий вольюм будет служить маркировкой "неохраняемой секции", поэтому он должен со всех сторон окружать комнату N2.



2) добавь несколько стражников в комнату N1 и создай для них патрульный путь (Patrol Path). Затем добавь этим стражам следующие скрипты:

a) Имя скрипта: "Teleport_Guard_To_Part1" - этот скрипт телепортирует NPC в комнату N1, когда тот пересечет вольюм входа в комнату N1.

CONDITIONS:
- When linked volumes [Trigger Script: ToPart1] are breached by objects at the end of [MYSELF].
ACTIONS:
- Teleport the objects at the end of [MYSELF] to Destination Teleporter [Part1].
- Reset script conditions and actions.

b) Имя скрипта: "Teleport_Guard_To_Part2" - этот скрипт телепортирует NPC в комнату N2, когда тот пересечет вольюм входа в комнату N2.

CONDITIONS:
- When linked volumes [Trigger Script: ToPart2] are breached by objects at the end of [MYSELF].
ACTIONS:
- Teleport the objects at the end of [MYSELF] to Destination Teleporter [Part2].
- Reset script conditions and actions.

c) Имя скрипта: "Guard_Goes_Back_To_Patrol" - этот скрипт телепортирует NPC обратно к патрульному пути, когда тот успокоится.

CONDITIONS:
- Logic [AND] operator:
  -- Query if linked volumes [Trigger Script: AreaOutOfPatrol] contains the linked objects at the end of [MYSELF].
  -- Logic [OR] operator:
     --- When my alert state changes to [ALERTSTATE_GREEN]
     --- When my behaviour state changes to [STATE_RETURNING]
     --- When my behaviour state changes to [STATE_PATROL]
ACTIONS:
- Teleport the objects at the end of [MYSELF] to Destination Teleporter [BackToPatrol].
- Delay [0.01] GAME seconds.
- Reset script conditions and actions.

3) Теперь свяжи всех стражников со всеми вольюмами с помощью связей Trigger Script Link и переименуй все связи в соответствии со скриптами. Также добавь соответствующие скриптам имена телепортов назначения (Destination Teleporter Name) в свойства всех телепортов.



4) Теперь настало время позаботиться о телепортации Гарретта. Для чего добавь соответствующие месту имена телепортов назначения (Destination Teleporter Name) в свойства обоих телепортирующих вольюмов (тех, что служат "входами" в комнаты).

Теперь игрок может, убегая в портал телепорта, увести за собой и стражников. После телепортации стражники продолжат преследование. А если игрок сможет спрятаться, то NPC обыщут пространство, успокоятся, телепортируются назад к своим постам и продолжат патрулирование.

В принципе, это всё. В моей миссии это так и работает.

Однако скрипт на возвращение "Guard_Goes_Back_To_Patrol" можно немного усложнить (автор модификации - Nomad). Если тебе не хочется, чтобы игрок видел, как успокоившийся стражник растворялся в воздухе, то этот скрипт будет выглядеть так:

CONDITIONS:
- Fire this condition every [10] seconds of GAME time
- Query if linked volume(s) [Trigger Script: AreaOutOfPatrol] contains the linked object(s) at end of [MYSELF]
- Logic[NOT] operator
  -- Query if this object is within view
  -- Logic [OR] operator
     --- While the AI is in the behaviour state [STATE GREEN ALERT]
     --- While the AI is in the behaviour state [STATE RETURNING]
     --- While the AI is in the behaviour state [STATE PATROL]
ACTIONS:
- Teleport the object(s) at end of [MYSELF] to Destination Teleporter[BackToPatrol]
- Delay [0.10] GAME seconds
- Reset script conditions and actions
Windows XP Professional SP3, Intel Core 2 CPU 6400 @ 2.13GHz each CPU (4.26GHz total), Random Access Memory 3.25Gb, NVIDIA GeForce 9600 GT, Motherboard ASUS P5KC, Monitor Resolution 1680x1050

Tiens

ВОПРОС:   Существует ли в T3Ed ограничение на количество полигонов?

Что касается брашей (brush), то, насколько я знаю, такого лимита нет. Однако максимальный предел детализации импортируемого меша (static mesh) находится где-то на уровне в 10тыс. полигонов, и, соответственно, разумное количество полигонов на объект составляет примерно 3000-4500 полигонов. Если данный меш не подходит для T3Ed, либо неправильно воспринимается редактором, то игра/редактор вылетит во время загрузки тестового режима.
Windows XP Professional SP3, Intel Core 2 CPU 6400 @ 2.13GHz each CPU (4.26GHz total), Random Access Memory 3.25Gb, NVIDIA GeForce 9600 GT, Motherboard ASUS P5KC, Monitor Resolution 1680x1050

Tiens

ВОПРОС:   Моя миссия будет из нескольких карт, т.е. у меня имеются три загрузочных зоны и Гаррет может телепортироваться из одной в другую.
                   Как сделать, чтобы задания и всё остальное работало на этих трех картах, как в единой миссии?


Это просто, хотя и требует внимательности. Кстати, это было практически в каждой родной миссии TDS. Так что если что забудешь, сверяйся с какой-либо родной миссией.

Чтобы не повторять весь туториал Комага о целях и финальной паковке миссии, я остановлюсь только на тех отличающихся моментах, которые зависят от количества карт в миссии. Всё, что я не упомянула, делается точно так, как в миссии с одной загрузочной зоной, т.е. есть в туториале Комага.

I. Файлы карт и цели:
Предположим, миссия в целом будет называться "Cabal", а значит, что три её части должны называться по формуле "имя миссии + цифра от единицы и выше", т.е. "Cabal1", "Cabal2" и "Cabal3". Соответственно, имена файлов, готовых к конвертации в IBT-формат, должны быть - Cabal1.unr, Cabal2.unr и Cabal3.unr. На карте "Cabal1" будет начало миссии, а на карте "Cabal3" - конец.

Имя миссии "Cabal" (и только оно) должно использоваться в разделе Conversations, поскольку для создания целей совершенно неважно, сколько карт в миссии. В качестве Map Name в разделе Conversation Properties > Usage должна быть только одна позиция под именем миссии "Cabal".

Также имя миссии должно быть на каждой карте в свойствах уровня, т.е. в LevelInfo > Properties > LevelInfo > ConversationPackage должно быть написано "Cabal".

Имена карт (т.е. файлов карт, например, Cabal1.unr) важны для системы телепортов, а также свойств уровня на каждой карте. Таким образом, на карте Cabal1.unr в LevelInfo > Properties > LevelInfo > Title должно быть написано "Cabal1".

Также в свойствах уровня на каждой карте должно быть уникальное название данной карты, т.е. у карты Cabal1.unr в LevelInfo > Properties > LevelInfo > LevelEnterText будет надпись "T_LevelEnterTextCabal1", а у карты Cabal2.unr - надпись "T_LevelEnterTextCabal2".

II. Файл Entry:
Теперь о том, что надо написать в файле Entry.unr.

В свойствах EnterMissionInfoInn в разделах Properties > EnterMissionInfo > EnterMissionBriefingFileName и EnterMissionVisibleObjectivesFileName вместо "Inn.txt" пишем "Cabal.txt" (т.е. имя миссии).

В свойствах ExitMissionInfoEntry в разделе Properties > ExitMissionInfo > ExitMissionDestMapName пишем имя карты "Cabal1", а в ExitMissionDestTeleportName пишем название стартового телепорта (например, "Cabal_Start"). Для проверки стоит загрузить карту Cabal1.unr и удостовериться, что имя телепорта (в нашем случае это "Cabal_Start"), с которого стартует миссия и которое можно посмотреть в свойстве "TeleportDestName", написано правильно.

III. Текстовые файлы:
Что касается тех названий миссии и карт, что будут видимы игроку в меню, то тут тоже все просто. Переходим в папку Thief3\CONTENT\T3\Books\English.

В папках "Briefings" и "DeBriefings" используем имя миссии. Т.е. в каждой папке в файле Cabal.sch будет:
--------------------------------
VERSION 2.0
TextEntry
Cabal
lang_english 2004-02-20 21:36:00 "Hard times came!..."
lang_french 2004-04-23 12:22:18 "До чего же тяжкие настали времена!..."
--------------------------------

В папке "String_Tags", в файле MapRooms.sch под именем миссии будет игровое название всей миссии:
--------------------------------
VERSION 2.0
TextEntry
T_EnterMissionNameCabal
lang_english 2004-02-29 21:48:00 "THE CABAL: Furious Flames."
lang_french 2004-03-25 13:58:31 "ЗАГОВОР: Неистовое Пламя."
--------------------------------

В файле Misc.sch под именами карт, входящих в миссию, будет игровое название каждой загрузочной зоны:
--------------------------------
VERSION 2.0
TextEntry
T_LevelEnterTextCabal1
lang_english 2004-02-29 21:48:00 "Furious Flames. South Quarter."
lang_french 2004-04-29 12:12:22 "Неистовое Пламя. Южный Квартал."

TextEntry
T_LevelEnterTextCabal2
lang_english 2004-02-29 21:48:00 "Furious Flames. Stonemarket."
lang_french 2004-04-29 12:12:22 "Неистовое Пламя. Стоунмаркет."

TextEntry
T_LevelEnterTextCabal3
lang_english 2004-02-29 21:48:00 "Furious Flames. Hammer Factory."
lang_french 2004-04-29 12:12:22 "Неистовое Пламя. Фабрика Хаммеритов."
--------------------------------

В файле Quotes.sch используем имя миссии:
--------------------------------
VERSION 2.0
TextEntry
T_CabalLoadingQuote0
lang_english 2010-04-25 08:51:06 "...Garrett's memoirs"
lang_french 2010-04-25 08:51:06 "...мемуары Гарретта"
--------------------------------

IV. Настройка сложности:
А теперь сделаем так, чтобы все три загрузочные зоны были связаны в единую миссию общим исполнением целей.

Нам понадобятся следующие 4 эктора:
1. EnterMissionInfo
2. ExitMissionInfo
3. DifficultyInfo
4. DifficultyAIMap2

Создание экторов EnterMissionInfo, ExitMissionInfo и DifficultyInfo для миссий из нескольких карт ничем не отличается от создания этих экторов для миссий из одной карты. Просто везде, где от тебя требуется указать имя уровня, карты или миссии, вписывай имя миссии ("Cabal").

Для того, чтобы создать эктор DifficultyAIMap2, в Actor Browser ищем Actor > Marker > DifficultyAIMap2. Создаем "дочку" этого маркера и называем её, например, "DifficultyAIMap2Cabal". "Дочка" автоматически получит весь нужный набор свойств и скриптов, поэтому больше ничего менять не требуется. Если по какой-либо причине все же потребуется изменить свойства этому эктору, то их надо менять ТОЛЬКО через Actor Browser.

Теперь о том, как правильно размещать по картам эти 4 эктора:
1. EnterMissionInfo - должен быть на каждой карте.
2. ExitMissionInfo - должен быть на той карте, где игрок должен будет закончить миссию. Если таких карт несколько (например, Cabal2.unr и Cabal3.unr), то эктор должен быть на каждой из этих карт.
3. DifficultyInfo - должен быть на каждой карте.
4. DifficultyAIMap2 - должен быть на каждой карте, КРОМЕ той, где начинается миссия.

ПРИМЕР:
Cabal1.unr - тут будет начало миссии, т.е. тут нужны EnterMissionInfo и DifficultyInfo.
Cabal2.unr - тут не будет ни начала, ни конца миссии, т.е. тут нужны DifficultyAIMap2, EnterMissionInfo и DifficultyInfo.
Cabal3.unr - тут будет конец миссии, т.е. тут нужны ExitMissionInfo, DifficultyAIMap2, EnterMissionInfo и DifficultyInfo.

Как и раньше, все эти экторы надо размещать внутри задействованного игрового объема, а также на каждой карте от эктора EnterMissionInfo к DifficultyInfo должна идти стрелка связи "Trigger Script Link".

Первой особенностью является то, что на тех картах, где будет размещаться DifficultyAIMap2, надо зайти в свойства к эктору DifficultyInfo (имеется ввиду тот эктор DifficultyInfoCabal, что расположен прямо на карте), выставить Properties > Scripts > bEnableScriptInherit = False, а также удалить все скрипты из раздела Properties > Scripts > Trigger Scripts.

Вторая особенность проявляется только, если в своей миссии ты используешь родную систему скриптов, "прячущих" некоторых NPC на легком и нормальном уровне сложности. Это скрипты "AIDensityLow" и "AIDensityNormal", которые находятся в Trigger Script Browser > Difficulty > Objectives Inintialization. Итак, эта система скриптов требует, чтобы от эктора DifficultyInfo расходился целый веер связей "Trigger Script Link" к тем NPC, которые должны "исчезнуть". Однако, если на карте присутствует DifficultyAIMap2, то этот веер связей должен исходить как раз от маркера DifficultyAIMap2.

Также не забудь открыть Entry.unr и по всем правилам заменить старый DifficultyInfo на новый DifficultyInfoCabal.

По различиям это всё.
Windows XP Professional SP3, Intel Core 2 CPU 6400 @ 2.13GHz each CPU (4.26GHz total), Random Access Memory 3.25Gb, NVIDIA GeForce 9600 GT, Motherboard ASUS P5KC, Monitor Resolution 1680x1050

Tiens

В ДОПОЛНЕНИЕ К ПОСТУ О МИССИИ ИЗ НЕСКОЛЬКИХ КАРТ:

ЦИТАТА:   ...Имена карт (т.е. файлов карт, например, Cabal1.unr) важны для системы телепортов...
ВОПРОС:   А как создавать телепорты между картами?

Телепорты между загрузочными зонами создаются по тому же принципу, что и локальные телепорты. Только браш типа Volume (точка старта) и эктор PlayerStart (точка прибытия) располагаются на разных картах. В качестве примера будет телепорт из ОМ "Канун дня Св. Эдгара".

Точка старта находится на карте HammerIntro2.unr (это загрузочная зона с фабрикой) и данный Volume имеет следующие свойства (раздел Properties > Teleport):

* Prompt For Teleport = TRUE -> активирует экранную заставку, спрашивающую разрешения игрока на телепортацию
* Teleport Destination = Shitro2 -> это введенное вручную имя точки прибытия
* Teleport Display Name = T_LevelEnterTextHammerIntro1 -> это ссылка на художественное название загрузочной зоны (в данном случае это "Территория Собора")
* Teleport Map = HammerIntro1 -> это название той загрузочной зоны, где находится точка прибытия
* Use Player Orientation = FALSE -> это свойство задает ориентацию относительно сторон света, в которой окажется игрок после телепортации. Ставим его на FALSE, чтобы игрок зависел только от ориентации точки прибытия (эктора PlayerStart).

Напоминаю, что, когда будешь строить собственную браш Volume, то выставленную Volume трогать нельзя - чуть сдвинешь/изменишь размеры, и она перестает работать, приходится её удалять и строить заново.

Точка прибытия находится на карте HammerIntro1.unr (это загрузочная зона с церковью) и данный PlayerStart имеет следующие свойства (раздел Properties > Teleport):

* Teleport Dest Name = Shitro2 -> это введенное вручную имя точки прибытия. Обрати внимание на то, что оно должно до копейки совпадать с тем именем, что указано в свойствах точки старта Volume. Иначе игра глюкнет при телепортации.

Напомню, что эктор PlayerStart можно найти в Actor Browser в разделе Marker –> Keypoint –> NavigationPoint –> PlayerStart.
Windows XP Professional SP3, Intel Core 2 CPU 6400 @ 2.13GHz each CPU (4.26GHz total), Random Access Memory 3.25Gb, NVIDIA GeForce 9600 GT, Motherboard ASUS P5KC, Monitor Resolution 1680x1050

Tiens

В ДОПОЛНЕНИЕ К ПОСТУ О МИССИИ ИЗ НЕСКОЛЬКИХ КАРТ:

ВОПРОС:   В стартовой карте моей миссии имеется два PlayerStart-а со скриптами на активацию заданий и сумму лута. А в двух других картах тоже должно быть два PlayerStart-а с этими скриптами?

Нет, в готовой к паковке миссии только самый первый PlayerStart (c которого стартует миссия) должен иметь скрипты на запуск целей и подсчет лута, а остальные - обычные телепорты. Иначе всякий раз, когда игрок телепортируется в очередную загрузочную зону, у него будут обнуляться цели и лут.

Однако, если миссия еще не готова и тебе надо тестировать выполнение целей на остальных картах миссии по отдельности, то можешь эти скрипты временно оставить. Главное, не забудь их удалить перед паковкой.

Тот "безымянный" PlayerStart, что используется редактором для загрузки игрока в режиме game-mod, должен быть всегда - по одной штуке на загрузочную зону. Иначе у тебя из редактора игровой режим не запустится.
Windows XP Professional SP3, Intel Core 2 CPU 6400 @ 2.13GHz each CPU (4.26GHz total), Random Access Memory 3.25Gb, NVIDIA GeForce 9600 GT, Motherboard ASUS P5KC, Monitor Resolution 1680x1050

Tiens

ВОПРОС:   Имеет ли значение цифра, которая написана в свойствах карты в графе LeveInfo > MapNumber ? У меня по умолчанию стоит цифра 10.

Эта цифра отвечает за то, какую именно текстуру игрок увидит в качестве "плана местности" во время игры. Разработчики назвали эту подборку текстур "Hand Drawn Maps" ("карты, нарисованные вручную"). Вот их перечень:

HDMap_0=Castle
HDMap_1=Clocktower
HDMap_2=Dungeon
HDMap_3=HammerIntro
HDMap_4=HauntedHouse
HDMap_5=Inn
HDMap_6=KeeperCompound
HDMap_7=Museum
HDMap_8=PaganIntro
HDMap_9=SeasideMansion
HDMap_10=SouthQuarter
HDMap_11=Stonemarket
HDMap_12=Docks
HDMap_13=OldQuarter
HDMap_14=Auldale
HDMap_15=ClocktowerFurnace
HDMap_16=EntireCity
HDMap_17=KeeperCompoundLowerLibraries
HDMap_18=PaganIntro0
HDMap_19=Castle0

Соответственно, цифра 10 это план Южного Квартала.

Какую из этих "карт" использовать в свойствах уровня данной конкретной загрузочной зоны, зависит только от тебя.
Windows XP Professional SP3, Intel Core 2 CPU 6400 @ 2.13GHz each CPU (4.26GHz total), Random Access Memory 3.25Gb, NVIDIA GeForce 9600 GT, Motherboard ASUS P5KC, Monitor Resolution 1680x1050

Tiens

ВОПРОС:   Как сделать какой-либо активный предмет неуязвимым (например, переносной ящик), т.е. чтобы его было невозможно сломать?

Свойства объекта (Properties) - раздел Health:
- Death Response = None
- Health State = Disabled
Windows XP Professional SP3, Intel Core 2 CPU 6400 @ 2.13GHz each CPU (4.26GHz total), Random Access Memory 3.25Gb, NVIDIA GeForce 9600 GT, Motherboard ASUS P5KC, Monitor Resolution 1680x1050

Tiens

ВОПРОС:   Как сделать так, чтобы в момент, когда игрок ворует некий особо ценный предмет, включалась сигнализация (т.е. загорался красный свет и проигрывался звук сирены)?

Берем два объекта - кубок (лут) и источник света. Настраиваем:

1) Источник света (свойства Properties):
* Раздел Advanced - свойство bOutOfWorld = TRUE -> чтобы был временно невидим
* Раздел Lighting - свойство LightColor... => задать нужный цвет

2) Кубок (свойства Properties):
* Раздел Scripts - свойство TriggerScripts... => добавить следующий скрипт:

COND.
- when I'm frobbed by player
ACT.
- set [bOutOfWorld] to [FALSE] от linked objects of [Trigger Script]
- play sound schema [XXX] in 2D Sound
   =>  вместо ХХХ будет имя звуковой схемы сирены

3) Кубок соединить с источником света связью Trigger Script Link - стрелка должна идти от кубка к источнику света.
Windows XP Professional SP3, Intel Core 2 CPU 6400 @ 2.13GHz each CPU (4.26GHz total), Random Access Memory 3.25Gb, NVIDIA GeForce 9600 GT, Motherboard ASUS P5KC, Monitor Resolution 1680x1050