Введение
Автор: DigitalManiac

Данная серия туториалов (обучающих статей) предназначена для тех, кто решил научиться создавать карты для популярной игры Half-Life: Counter-Strike. Картостроение - это своего рода искусство, и для тех, кто намерен всерьез заниматься level-дизайном, не хватит только умения работать с редактором, нужно еще иметь как минимум хорошую фантазию и воображение, иначе все ваши карты будут просто-напросто мрачными и неинтересными.

Ну что ж, начнем! Для начала нужно обзавестить необходимыми программами. Скачайте с сайта http://collective.valve-erc.com следующее:

1. Редактор карт Valve Hammer Editor (неофициальное название - Worldcraft)
2. Компиляторы ZHLT
3. Конфигурационный файл half-life-cs_expert.fgd

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

Для начала стоит сказать, что все карты создаются из примитивов (брашей).

Браш (Brush) - это обычный многоугольник (куб, параллелепипед, цилиндр, конус, и т.д.). Из этих несложных геометрических фигур строятся все карты. Все фейсы браша должны быть плоскими (то есть, не иметь вогнутостей). Браши никак не реагируют на действия игрока, они являются неподвижными объектами, просто преграждающими движения игрока в виртуальном мире.

Все браши состоят из фейсов.

Фейс (Face) - это одна сторона браша. К примеру, обычный кубик состоит из 6 фейсов. Один фейс может состоять минимум из трех вершин, так как не меньше, чем тремя точками можно описать плоскость.

Текстура (Texture) - изображение, накладываемое на фейс. Только одна текстура может быть наложена на один фейс. Файлы текстур хранятся в упакованном виде в .wad файлах. Текстуры могут быть как простыми, так и анимированными. Так же, существуют специальные текстуры, но об этом позже.

Декаль (Decal) - Изображение, накладываемое на текстуру. Используется для нанесения на браш дополнительных эффектов, например пятен крови, следов от взрыва, трещин и т.д. Хранятся декали в файле decals.wad.

Энтити (Entity) - это то, что не является простым брашем, а взаемодействует с игроком в процессе игры. К примеру, вода, двери, стекла - все это энтити, так как эти объекты не просто существуют на карте как преграда, а еще и выполняют какую либо функцию. Все энтити делятся на два типа: point-based entity и solid-based entity. Первый тип - точечные энтити. То есть, их внешний вид, размер и форма заранее предопределены, а вы можете только изменять их параметры (к таким энтитям относятся источники света, точки появления игроков, ичсточники звука и т.д). Ко второму типу относятся энтити, которые создаются на основе брашей. Пользователь определяет размер, форму, внешний вид браша, а потом создает из него энтити. Можно сказать, что брашу присваиваются какие либо свойства. К таким видам энтити относятся двери, вода, кнопки и т.д.

Юнит (Unit) - единица измерения в Worldcraft. Один юнит равен примерно 2,5 сантиметрам в реальной жизни. Подробнее об этом можно прочитать в статье "Размеренные размеры".

Префаб (Prefab) - группа объектов, сохраненная для последующего использования. Некоторый набор префабов поставляется в комплекте с Worldcraft. Это различного рода ящики, компьютеры и пр. Так же, вы можете создавать свои префабы (это может быть любой обьект или их группа). Вообще, префабами пользоваться очень удобно, так как, имея, к примеру, готовый компьютер, вы легко можете поместить его на карту, и вам не приходится тратить время на его создание снова.

Компиляция (Compile) - процесс перевода карты из формата .map в формат .bsp.

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


Настройка редактора
Автор: DigitalManiac

Надеюсь, вы уже скачали и установили редактор карт Worldcraft (Valve Hammer Editor) и теперь можно переходить непосредтвенно к настройке программы. Следует только упомянуть, что Worldcraft должен находится на одном логическом и физическом диске с Half-Life.

Если вы впервые запускаете Worldcraft, то перед вами автоматически откроется меню Options, где необходимо настроить редактор. Если оно не появилось, то откройте его сами из меню Tools -> Options. В данном меню имеется 6 закладок, давайте рассмотрим их все по-порядку:

1. Game Configurations

Configuration - имя игры, для которой вы будете создавать карты. Вы можете добавить в это поле несколько игр, и для каждой впоследствии определить свою конфигурацию редактора. Для добавления названия игры, просто нажмите кнопку Edit, и появится меню в котором с помощью кнопки Add можно добавлять любое количество игр. Точно так же, с помощью кнопки Remove можно удалять внесенные в список названия игр, а кнопкой Copy копировать их.

Game Data Files - здесь нужно указать путь к .fgd файлу, в котором содержится информация о entities. Для каждой игры этот файл разный, так как в каждой игре используются различные энтити. В нашем случае, нужно подключить .fgd файл для Counter-Strike - это halflife-cs_expert.fgd.

Texture Format и Map Type - определяют формат файлов с текстурами, и тип разрабатываемых карт. Так как Worldcraft разработан для создания карт только для Half-Life и его модов, то эти параметры изменить нельзя.

Default PointEntity Class и Default SolidEntity Class - определяют какой объект из point-based entities и solid-based entities будут выбраны по умолчанию в соответствующих диалоговых окнах, при создании энтити.

Game Executable Directory - путь к папке с Half-Life, в которой находится hl.exe.

Mod Directory - путь к папке мода. Если вы разрабатываете карты для Half-Life, то укажите путь к папке Half-Life\valve.

Game Directory - путь к папке Half-Life\valve.

RMF Directory - путь к папке, которая будет открываться по умолчанию для сохранения и открытия сохраненных карт.

2. Build Programs

На вкладке Build Programs определяется местоположение программ, необходимых для компиляции карты, а так же путь к hl.exe и к папке, куда помещать откомпилированные карты. Если вы не собираетесь компилировать карту через Worldcraft, а будете делать это, например, .bat файлом, то можете пропустить эту вкладку.

Configuration - выберите здесь ранее указанную во вкладке Game Configurations игру, для которой будете настраивать пути к компиляторам. Если вы не можете выбрать здесь ни одну игру, но точно уверены что все правильно настроили на прошлой вкладке, то нажмите кнопку OK, а затем снова откройте меню Options через Tools -> Options.

Game executable - путь к исполняемому файлу Half-Life - hl.exe (он находится в папке c Half-Life).

В следующих четырех полях, нужно указать пути к программам-компиляторам. Так как мы все продвинутые мапперы [image] и используем ZHLT компиляторы, а не старые QTools (которые идут в комплекте с Worldcraft), то соответственно указываем пути к hlcsg.exe, hlbsp.exe, hlvis.exe и hlrad.exe.

Place compiled maps in this directory before running the game - путь к папке, в которую будут помещаться откомпилированные карты. Советую сразу указать путь к папке cstrike\maps, чтобы потом не копировать откомпилированные карты туда вручную.

3. Textures

На этой вкладке нужно указать пути к .wad файлам с текстурами, которые вы будете использовать на своих картах. Добавить их можно с помощью кнопки Add WAD, а удалить из списка кнопкой Remove. Стоит так же упомянуть несколько важных вещей. Во-первых, не используйте слишком много .wad файлов, лучше с помощью редактора Wally создайте один WAD, включающий все нужные вам текстуры. Во-вторых, знайте, что не все .wad файлы можно использовать. К таким .wad файлам относятся gfx.wad, pldecals.wad, fonts.wad, cached.wad и spraypaint.wad. Так же, позаботьтесь о том, чтобы среди подключаемых .wad файлов присутствовал WAD со специальными текстурами: AAATRIGGER, CLIP, ORIGIN и SKY. Они находятся в halflife.wad, но разумнее было бы перенести их в свой WAD, так как в halflife.wad содержится очень большое количество текстур, которые вы врядли будете использовать. И еще одно: если вы хотите иметь возможность использовать декали, то не забудьте подключить файл decals.wad.

4. General

Use independent window configurations - включив эту опцию, вы с легкостью сможете настроить вид и размер дочерних окон любым образом. Для того чтобы добавить новое окно, выберите в меню Window -> New Window.

Load default window positions with maps - включение этой опции позволяет загружать последнюю используемую конфигурацию окон при загрузке карты. Если эта опция отключена, то загрузить последнюю конфигурацию окон можно нажав на кнопку "Load Window State" на панели инструментов "Mapview". Если вы включили опцию "Use independent window configurations", то рекомендуется включить и эту опцию тоже.

Undo levels - количество последних действий, которые можно будет отменить. Уменьшение значения этого параметра приводит к повышению быстродействия, так как используется меньше ресурсов памяти для сохранения последних действий. Если вы захотите вовсе выключить эту функцию, то не следует устанавливать в качестве значения "0". Просто выберите пункт в меню Edit -> Disable Undo/Redo.

Allow grouping/ungrouping while Ignore Groups is checked - позволит группировку/разгруппировку обьектов, в то время как включена опция Ignore Groups.

Stretch arches to fit original bounding rectangle - примитив "Arch" (арка) является частью определенного круга. Если эта опция включена, то при создании арки ее размер будет равен размеру габаритной рамки. В противном случае при создании объекта "арка", рамкой будет задаваться размер круга, частью которого является арка. Рекомендуется включить эту опцию.

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

5. 2D views

Эта вкладка содержит настройки 2D-видов. Вообще-то значения по умолчанию вполне подходят, но так как при создании карты в большей степени приходится работать на 2D-полях, то лучше сразу настроить их наиболее эффективнее для себя.

Crosshair cursor - если эта опция включена, то курсор при наведении на браш будет становиться крестообразным. Это очень удобно, поэтому рекомендуется включить эту опцию.

Default to 15 degree rotations - включени этой опции позволит вращать браши на угол не по одному градусу, а сразу по 15. Это очень удобно для поворотов браша на фиксированные углы, вроде 15, 30, 45 градусов...

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

Draw Vertices - если эта опция включена, то вершины брашей в 2D-видах будут выделены светлыми маркерами.

White-on-Black color scheme - отображать сетку на 2D-видах белой на черном фоне. Если эта опция выключена, то сетка будет черная на белом фоне.

Keep group when clone-dragging - сохранять группы объектов при клонировании. Клонирование реализуется намного проще копирования: выделите объект, зажмите клавишу Shift, и перетащите объект. Этим самым вы склонируете объект. Если у вас несколько объектов объединены в группу, и вы их склонируете, то новые объекты тоже будут группой.

Center on camera after movement in 3D - если включить эту опцию, то при передвижении камеры в 3D-виде, изображение на 2D-видах будет центрироваться на новом положении камеры.

Use Visgroup colors for object lines - отображать группы объектов входящие в Vis-группы одним цветом.

Arrow keys nudge selected object/vertex - включение этой опции позволяет перемещать выделенный объект или вершину курсорными стрелками в активном окне 2D-вида.

Reorient primitives on creation in the active 2D view - при создании объекта ориентировать его верх по направлению к активному окну 2D-проекции. Например, если вы создаете цилиндр, то он будет обращен своей круглой стороной не вверх, а к активному окну 2D-вида.

Automatic infinite selection in 2D windows (no ENTER) - при растягивании рамки выделения автоматически будут выделяться все объекты, попавшие в рамку. Если же отключить эту опцию, то после растягивания рамки нужно будет еще нажать Enter, чтобы применить выделение. Включить/выключить эту опцию можно так же через панель инструментов "MapOperations".

Selection box selects by center handles only - при выключенной опции будут выделяться все объекты, часть которых попала в рамку при выделении. Иначе будут выделаться лишь те объекты, центр которых (помеченный крестиком) попал в рамку выделения.

Size - размер сетки на 2D-видах по умолчанию.

Intensity - яркость сетки. Чем меньше - тем лучше выделяются контуры объектов, поэтому советую установить не очень высокое значение.

Dotted Grid - отображать сетку точками в местах пересечения линий.

Highlight every 64 units - подсвечивать сетку каждые 64 юнитов.

Highlight every n grid lines - подсвечивать каждую n линию сетки.

Hide grid smaller than 4 pixels - при уменьшении масштаба на 2D-полях, если сетка становится размером меньше 4-х пикселей, то она просто превращается в серый фон, что очень мешает работе. Включение этой опции будет скрывать сетку размером меньше 4-х пикселей.

Highlight every 1024 units - подсвечивать сетку каждые 1024 юнитов.

6. 3D views

На этой вкладке содержатся настройки 3D-вида. Ничего сложного они из себя не преставляют:

Back clipping plane - ограничение прорисовки карты определенным растоянием от 500 до 10000 юнитов. Если при паботе в 3D-виде вы ощущаете какие либо "тормоза", то рекомендуется уменьшить это значение.

Filter textures - фильтр текстур. Если включен, то все текстуры будут перед выводом на экран проходить билинейную фильтрацию, и будут выглядеть намного лучше. Отключение этой опции приведет к незначительному увеличению скорости, но в этом случае сильно понизится качество. Ниже приведен пример фильтрованной и нефильтрованной текстуры:

Use mouselook navigation - если включить эту опцию, то можно будет в окне 3D-вида управлять камерой с помощью мышки, как это делается в самой игре. Клавиши W, A, S и D вам тоже пригодятся. Советую всем включить эту опцию.

Reverse mouse Y axis - реверс мыши по оси Y.

Forward speed - максимальная скорость движения камеры.

Time to top speed - промежуток времени, за который камера будет разгоняться от 0 до максимальной скорости.

Reverse selection order - выделять самый дальний объект, находящийся под курсором в 3D-виде.

Вот и все настройки Worldcraft. В следующей статье будет рассмотрен интерфейс редактора и его возможности, а после этого мы перейдем к созданию вашей первой карты!


Основы Worldcraft
Автор: DigitalManiac

Интерфейс Worldcraft представляет собой четыре рабочих поля (3D-вид, 2D-вид сверху, спереди и сбоку), меню и несколько панелей инструментов. По умолчанию все это выглядит следующим образом:

Настроить внешний вид редактора вам не составит никакого труда. Все панели инструментов можно произвольно перемещать по экрану. Вообщем, все можно расположить как кому удобно.

Теперь давайте подробнее рассмотрим панели инструментов Worldcraft и возможности, которые можно реализовать с их помощью.

1. Панель Map Tools

На этой панели находятся основные инструменты редактора.

Selection Tool (Shift + S) - инструмент выделения. Используется для выделения объектов на 3D и 2D-видах. C помощью Selection Tool можно помещать на карту префабы оригинальных размеров и трансформировать браши (изменять размеры, вращать и параллельно сдвигать их ребра).
Magnify (Shift + G) - с помощью этого инструмента можно увеличивать/уменьшать масштаб в 2D-видах.
Camera (Shift + C) - в этом режиме вы можете помещать камеры в рабочие области редактора.
Entity Tool (Shift + E) - с помощью этого инструмента вы можете помещать на карту point-based entity.
Block Tool (Shift + B) - в этом режиме вы можете создавать браши и помещать на карту префабы, изменяя их размеры, либо оставляя прежние.
Toggle Texture Application (Shift + A) - включает/выключает окно Face Properties, с помощью которого можно наносить текстуры на отдельные фейсы браша, а так же изменять размер текстур, двигать и вращать их.
Apply Current Texture (Shift + T) - используется для окрашивания всех фейсов активного браша в выбранную текстуру.
Apply Decals (Shift + D) - в этом режиме вы можете наносить декали.
Clipping Tool - (Shift + X) - этот инструмент применяется для обрезки частей брашей.
Vertex Tool (Shift + V) - режим вертексной манипуляции. С помощью манипуляции верстексами можно создавать объекты довольно сложной формы.
Path Tool (Shift + P) - инструмент создания путей для поездов, монстров и т.п.
Вот мы и разобрались с основной панелью инструментов. Позже мы еще вернемся к более подробному рассмотрению всех возможностей инструментов программы.

2. Панель Map Operations

С помощью этой панели вы с легкостью сможете выполнять различные операции над объектами и переключать некоторые параметры редактирования.

Carve - применить утилиту Carve к выделенному объекту (будет рассмотрена позже).
Group/Ungroup - сгруппировать/разгруппировать выделенные объекты.
Ignore Groups - игнорировать группу. Это позволит вам редактировать отдельный элемент группы, не разгруппировывая объекты.
Hide Selected/Unselected, Show All - скрыть выделенные/невыделенные объекты и показать все скрытые объекты.
Cut, Copy, Paste - вырезать, копировать, вставить - стандартные кнопки многих Windows-приложений.
Toggle Cordon State, Edit Cordon Bounds - отобразить кордонную рамку и редактировать границы кордонного выделения. Кордонное выделение используется для компиляции отдельных частей карты. То есть, компилироваться будет только та часть карты, которая находится в пределах установленной кордонной рамки. Если вы собираетесь таким образом компилировать некоторые участки своей карты, то не забудьте поместить в пределах кордонного выделения точку старта игрока.
Toggle Select-by-Handles - когда эта опция включена, вы сможете выделять объекты только нажатием на их центр, помеченный крестиком.
Toggle Auto-selection - если вы включите эту опцию, то при выделении объектов рамкой, они автоматически будут выделяться, иначе вам нужно будет после растягивания рамки еще и нажать Enter.
Texture Lock - закрепить текстуры на объектах. То есть, при передвижении объекта текстура на нем не будет сдвигаться.
Align to World/Face - эта кнопка переключает стиль выравнивания тестур. Существуют два варианта выравнивания: world и face. В первом случае текстура будет выравниваться относительно координат сетки, а во втором, текстура будет выравниваться относительно фейса на котором она расположена.
Run Map - открыть окно компиляции карты.

3. Панель Map View

На этой панели вы можете контролировать некоторые настройки представления.

Toggle Grid, Toggle 3D Grid - включить/выключить отображение сетки координат на 2D и 3D-видах.
Smaller Grid, Larger Grid - уменьшить/увеличить размер сетки.
Load, Save Window State - загрузить/сохранить конфигурацию окон.

4. Панель Textures

Панель Textures служит для выбора текущей текстуры.

Texture group - здесь вы можете выбрать все текстуры или только отдельный .wad файл.

Current texture - имя текущей текстуры. Немного ниже имени текстуры отображается сама текстура и ее размер.

Browse - включает броузер текстур, в котором вы можете найти текстуру по имени.

Replace - открывает окно замены текстур.

5. Панель New Objects

На этой панели контролируется создание всех объектов в Worldcraft.

toWorld (Ctrl + W) - удаляет все параметры выделенного объекта, делая его, таким образом, обычным брашем. Используется в тех случаях, когда из браш-энтити необходимо снова сделать простой браш.

toEntity (Ctrl + T) - делает из выделенного объекта solid-based энтити.

Categories - тут можно выбрать категорию объектов (примитивы или группы префабов).

Object - список объектов принадлежащих выбранной категории.

Faces - количество фейсов. Указывается только для цилиндров и конусов. Чем больше количество фейсов - тем круглее объект.

Create Prafab (Ctrl + R) - создать из выделенного объекта/объектов префаб.

6. Панель Filter Control

Это панель работы с Vis-группами. О Vis-группах вы узнаете в следующих туториалах, так что пока пропустим эту панель.

7. Статусная строка

For Help, press F1 - это единственная надпись, значение которой я не могу понять.

Selection information - информация о выделенном объекте. К примеру, на рисунке показано, что выбран браш с шестью фейсами.

Coordinates - координаты курсора.

Selection size information - высота, длина и ширина выделенного объекта.

Zoom size - масштаб в активном окне 2D-вида.

Grid information - показывает, включена ли опция Snap To Grid (меню Map -> Snap to grid), а затем указан текущий размер сетки.

8. Рабочие поля

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

2D top (x/y) - вид сверху.
2D front (y/z) - вид спереди.
2D side (x/z) - вид сбоку.
3D wireframe - 3D-вид, в котором представлены только контуры брашей.
3D flat - 3D-вид, в котором все браши и группы брашей будут представлены различными цветами и без текстур.
3D textured - 3D-вид, в котором все браши будут окрашены своими текстурами.

На последок еще одна фича: при нажатии Shift + Z, активное поле развернется на все рабочие поля. Чтобы вернуть размер поля в исходное положение, снова нажмите Shift + Z.
Это были основные сведения, которые необходимы для начала работы с редактором. Вскоре мы еще вернемся к более подробному рассмотрению всех возможностей Wolrdcraft, но сначала вам необходимо хоть немного попрактиковаться. В следующем туториале мы создадим с вами вашу первую карту, а уже после этого займемся подробным разбором редактора.

Если вы что-то не поняли из всего вышеописанного в этом туториале - не волнуйтесь, в течении работы вы во всем разберетесь.


Первая карта
Автор: DigitalManiac

Вот и настал долгожданный момент - сейчас вы создадите вашу первую карту!

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

Для начала нужно решить, что мы будем строить? Предлагаю начать с того, с чего начинают все новички. А именно с oneroom, то есть, с одной квадратной комнаты. Ну что ж, поехали!

Подлючите к вашему списку .wad файлов halflife.wad (он находится в каталоге valve/).

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

Сначала давайте создадим пол нашей комнаты, а потом окрасим его подходящей нам текстурой. Для этого выберите из панели Map Tools инструмент Block Tool, затем перейдите на 2D-вид сверху (по умолчанию это правое верхнее окно) и создайте контур браша, зажав левую кнопку мышки и растянув контур на сетке:

Изменить размеры контуров браша можно с помощью маркеров, появившихся по краям, после того как вы отпустили кнопку мышки:

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

Теперь нужно подогнать размеры браша. Давайте сделаем его размером 512х512х64 (текущий размер вы можете видеть в статусной строке редактора). После того как вы сделали контуры браша нужных вам размеров, нажмите Enter или выберите Create Object из контекстного меню (появляется при нажатии правой кнопкой мыши внутри контура браша), чтобы создать браш. Это и будет пол нашей комнаты.

Теперь нажмите на надпись Camera в левом верхнем углу 3D-окна, и выберите из появившегося списка 3D textured, чтобы перейти в режим 3D-вида с отображением текстур. Любуйтесь своим первым брашем!

Как видите, созданный браш автоматически окрасился текстурой, которая была в данный момент выбрана на панели Textures. Давайте исправим ситуацию и окрасим браш в нужную нам текстуру. Для этого нажмите кнопку Browse на панели Textures и найдите текстуру с именем tnnl_flr7. Выберите ее (кликнув на ней два раза). Теперь выделите браш пола и нажмите кнопку Apply Current Texture на пенели инструментов Map Tools. При этом активный браш полностью окрасится выбранной текстурой:

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

Теперь давайте создадим стены и потолок нашей комнаты. Делается это точно так же, как и при создании пола: выберите Block Tool из панели инструментов Map Tools, растяните контур браша, подгоните его размеры и положение и зафиксируйте результат (нажатием клавиши Enter или выбрав Create Object из контекстного меню). Сделайте стены 512 юнитов в высоту, а потолок таких же размеров как и пол. Убедитесь, что все браши соединены аккуратно, и в комнате не имеется щелей наружу, иначе вы не сможете правильно откомпилировать карту из-за этой ошибки (о возможных ошибках будет рассказано в отдельном туториале).

У меня получилось следующее:

Теперь нужно окрасить стены и потолок подходящими для этого текстурами. Стены, к примеру, окрасьте текстурой c1a3wall05, а потолок текстурой fifties_ceil01b. В итоге должно получиться что-то вроде этого:

Теперь осталось добавить точки появления игроков, источник света и откомпилировать карту.

Точки появления игроков и источник света - это point-based энтити. Для того чтобы их довавить на карту, нужно пользоваться инструментом Entity Tool.

Переключившись в режим добавления point-based entities, поместить точечную энтити на карту можно так: кликните левой кнопкой мыши на 2D-виде, после появления зеленого квадратика, откорректируйте его положение и нажмите Enter. Так же, можно поместить точечную энтити на карту, кликнув на какой либо объект в 3D-виде. Энтити установится в то место, куда вы кликнули.

Нам нужно три типа point-based энтитей:

info_player_start - точка появления Контр-террориста.
info_player_deathmatch - точка появления Террориста.
light - источник света.

Выбрать тип энтити можно как перед ее установкой на карту, так и после этого. Чтобы выбрать тип энтити до установки ее на карту, включите инструмент Entity Tool и выберите тип энтити на панели New Object. После помещения энтити на карту, ей автоматически присвоится выбранный тип.

Указать тип энтити после помещения ее на карту, можно выделив нужную энтити и выбрав пункт Properties из контекстного меню или из меню Edit -> Properties. В появившемся окне Object Propeties можно выбрать тип энтити и ее параметры (это относится как к point-based entities, так и к solid-based entities).

Энтити info_player_start и info_player_deathmatch необходимо устанавливать на некотором расстоянии от земли и друг от друга. Это делается для того, чтобы игроки не "застряли" при появлении. Установите внутрь созданной комнаты по одной точке появления для разных сторон (T и CT). Должно получиться что-то наподобии этого:

Аналогичным образом добавьте точечную энтити light, ориентируя ее по центру комнаты. Вот так:

При желании, вы можете поменять некоторые параметры лампочки, выделив ее и войдя в окно Properties. По умолчанию, параметр Brightness у лампочки имеет значение "255 255 255 200". Первы три значения - это цвет света лампочки в формате RGB (Red Green Blue), а четвертое значение - это яркость. Давайте сделаем желтый свет с яркостью, равной 300. Для этого установите в параметре Brightness значение "255 255 128 300".

Теперь осталось только откомпилировать карту. Это можно сделать двума способами: откомпилировать через Worldcraft или создать .bat файл для компиляции. Первый способ не очень приемлем, так как остаются неосвобожденными ресурсы компьютера, и карта компилируется медленнее. Второй способ самый лучший, но тем, кто не умеет работать с .bat файлами будет немного сложновато в нем разобраться. Вообщем, выбор за вами.

Вот мы с вами и создали вашу первую карту. В следующем туториале вы подробно узнаете о компиляции карты и, надеюсь, без проблем откомпилируете только что созданную мапу. Удачи!


Компиляция
Автор: DigitalManiac

Компиляция - это процесс перевода карты из формата .map в формат .bsp. Да-да, именно из формата .map, а не .rmf. .rmf формат используется в Worldcraft для того, чтобы сохранять дополнительную информацию о карте, которую .map формат не поддерживает. Под "дополнителной информацией" подразумевается информация о сгруппированых объектах, видимых и скрытых объектах, etc.

Надеюсь, вы уже скачали ZHTL-утилиты (Zoner Half-Life Tools). Теперь давайте разберемся что же это такое:

ZHLT-утилиты представляют собой 4 программы для компиляции карты, которые должны быть последовательно запущены из командной строки. Давайте рассмотрим их:

hlcsg.exe - делает общие вычисления геометрии карты и создает 4 файла оболочки для дальнейшей обработки с помощью hlbsp.exe.
hlbsp.exe - генерирует BSP-дерево карты и создает работоспособный .bsp файл.
hlvis.exe - обрабатывает видимые данные карты, что приводит к ускорению их отрисовки при игре.
hlrad.exe - обрабатывает свет на карте.

Запускать все четыре программы-компиляторы нужно в той последовательности, в которой они представленны выше. Для быстрой компиляции можно запустить только hlcsg.exe и hlbsp.exe, но в этом случае карта будет тормозить и на ней не будет обработан свет (вся карта будет ярко и равномерно освещена и без теней). Если ваша карта уже имеет довольно внушительные размеры, то при быстрой компиляции кроме hlcsg.exe и hlbsp.exe лучше компилировать ее и с hlvis.exe с параметром -fast, чтобы увеличить скорость отрисовки карты в игре и не наблюдать на экране 3fps.

У каждой из четырех программ-компиляторов есть свои параметры, которые указываются через командную строку. Они не являются обязательными, но все же ими следует пользоваться, чтобы указать наилучшие параметры компиляции. К примеру, можно для hlvis.exe можно указать параметр -full, чтобы запустить полную и наилучшую обработку видимой информации на карте. Подробнее о параметрах компиляторов можно узнать из следующего туториала - "Параметры ZHLT-компиляторов".

Все параметры компиляторов указываются через пробел, а после всех параметров должен быть передан путь к .map файлу с картой. Если вы не указали компиляторам ни одного параметра, то путь к .map файлу указывается через пробел, сразу-же после имени компилятора. Пример: hlcsg.exe maps/mapname.map.

Теперь давайте рассмотрим оба способа компиляции: посредством Worldcraft и с помощью .bat файла.

1. Компиляция посредством Worldcraft

Для того чтобы откомпилировать карту через Wolrdcraft, нужно сначала открыть вашу карту в редакторе, а затем нажать F9 или выбрать из меню File -> Run. После этого перед вами появится окно Run Map:

Это окно простой компиляции. Не обращайте на него внимания, а сразу жмите кнопку Expert и перед вами появится окно Run Map (Advanced) - вот оно нам и нужно!

В этом окне по умолчанию указаны 8 строк с различными командами и переменными. Все переменные начинаются с символа доллара ($). Значения переменных Worldcraft вы указывали при настройке редактора, на вкладках Build Programs и Game Configurations окна Options. Давайте рассмотрим все имеющиеся переменные:

$exedir - путь к папке с игрой, указанный в поле Game Executable Directory на вкладке Game Configurations.

$moddir - путь к папке мода, указанный в поле Mod Directory на вкладке Game Configurations.

$gamedir - путь к папке valve/, указанный в поле Game Directory на вкладке Game Configurations.

$path - путь к папке с картами, указанный в поле RMF Directory на вкладке Game Configurations.

$game_exe - путь к hl.exe, указанный в поле Game executable на вкладке Build Programs.

$csg_exe - путь к hlcsg.exe, указанный в поле CSG executable на вкладке Build Programs.

$bsp_exe - путь к hlbsp.exe, указанный в поле BSP executable на вкладке Build Programs.

$vis_exe - путь к hlvis.exe, указанный в поле VIS executable на вкладке Build Programs.

$light_exe - путь к hlrad.exe, указанный в поле RAD executable на вкладке Build Programs.

$bspdir - путь к папке, куда должен быть помещен .bsp файл карты после компиляции (Build Programs -> Place compiled maps...).

$file - имя карты.

$ext - расширение файла с картой.
Теперь давайте рассмотрим все 8 строк из окна компиляции, котрые являются почти такими же, как и в .bat файле:

Change Directory $exedir
$csg_exe $path\$file
$bsp_exe $path\$file
$vis_exe $path\$file
$rad_exe $path\$file
Copy File $path\$file.bsp $bspdir\$file.bsp
Copy File $path\$file.pts $bspdir\$file.pts
$game_exe +map $file -game cstrike -dev -console +deathmatch 1
А вот что получится после замены всех переменных их значениями (для примера я использовал свои значения переменных, так что у вас это будет выглядеть немного иначе):

Change Directory E:\Counter-Strike
E:\!Mapping\Zhlt\hlcsg.exe E:\!Mapping\Maps\mapname
E:\!Mapping\Zhlt\hlbsp.exe E:\!Mapping\Maps\mapname
E:\!Mapping\Zhlt\hlvis.exe E:\!Mapping\Maps\mapname
E:\!Mapping\Zhlt\hlrad.exe E:\!Mapping\Maps\mapname
Copy File E:\!Mapping\Maps\mapname.bsp E:\Counter-Strike\cstrike\maps\mapname.bsp
Copy File E:\!Mapping\Maps\mapname.pts E:\Counter-Strike\cstrike\maps\mapname.pts
E:\Counter-Strike\hl.exe +map mapname -game cstrike -dev -console +deathmatch 1
Теперь давайте разберемся, что же делает каждая из этих строк:

1. Устанавливает в качестве текущего каталога E:\Counter-Strike.
2. Запускает hlcsg.exe и передает ему путь к файлу с картой.
3. Запускает hlbsp.exe и передает ему путь к файлу с картой.
4. Запускает hlvis.exe и передает ему путь к файлу с картой.
5. Запускает hlrad.exe и передает ему путь к файлу с картой.
6. Копирует .bsp файл карты из папки E:\!Mapping\Maps в папку E:\Counter-Strike\cstrike\maps
7. Копирует .pts файл карты из папки E:\!Mapping\Maps в папку E:\Counter-Strike\cstrike\maps
8. Запускает hl.exe с параметрами +map mapname -game cstrike -dev -console +deathmatch 1
Вот так все просто! Сначала компилируется карта всеми четырьмя последовательно запущенными программами-компиляторами, потом .bsp и .pts файлы копируются в папку cstrike/maps/ и запускается игра.

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

Теперь давайте рассмотрим оставшиеся опции в окне компиляции Run Map (Advanced):

Run with visible objects only - если этот флаг отмечен, то компилировать будут только видимые объекты, а все скрытые проигнорируются.

Use Long filenames - разрешить использование длинных имен файлов, не сокращая их до 8 символов, подобно MS-DOS.

Ensure file post-exist - контролировать успешность создания файлов в процессе компиляции.

Use Process window - включить окно, в котором будет отображаться процесс компиляции.

Теперь, после того как все настроено, смело жмите кнопку Go!

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

2. Компиляция с помощью .bat файлов

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

.bat файл представляет собой текстовый файл, который содержит команды операционной системы. При запуске .bat файла, операционная система анализирует и выполняет каждую строку от начала до конца файла. Не выполняются только строки, начинающиеся с rem - это комментарии.

Создайте с помощью текстового редактора (notepad) файл с расширением .bat, например compile.bat. Далее, пишем следующие команды:

hlcsg.exe mapname.map
hlbsp.exe mapname.map
hlvis.exe mapname.map
hlrad.exe mapname.map

Ничего сложного. Мы как всегда последовательно запускаем в нужном порядке четыре программы-компиляторы, передавая им путь к .map файлу карты. Стоит заметить, что для корректной работы приведенного выше .bat файла необходимо переместить все программы-компиляторы и .map файл карты в папку, где находится .bat файл. А можно сделать проще - указать в .bat файле полные пути. Ниже приводится пример такого .bat файла (перед использованием измените пути на свои):

E:\!Mapping\Zhlt\hlcsg.exe E:\!Mapping\Maps\mapname.map
E:\!Mapping\Zhlt\hlbsp.exe E:\!Mapping\Maps\mapname.map
E:\!Mapping\Zhlt\hlvis.exe E:\!Mapping\Maps\mapname.map
E:\!Mapping\Zhlt\hlrad.exe E:\!Mapping\Maps\mapname.map
Теперь давайте создадим .bat файл для полной компиляции карты. Нам нужно всего лишь добавить несколько параметров для компиляторов:

E:\!Mapping\Zhlt\hlcsg.exe E:\!Mapping\Maps\mapname.map
E:\!Mapping\Zhlt\hlbsp.exe E:\!Mapping\Maps\mapname.map
E:\!Mapping\Zhlt\hlvis.exe -full E:\!Mapping\Maps\mapname.map
E:\!Mapping\Zhlt\hlrad.exe -dscale 1 -extra E:\!Mapping\Maps\mapname.map
Можете в конце .bat файла дописать команду для копирования .bsp файла в директорию cstrike/maps/, чтобы не копировать каждый раз вручную. Выглядит она так:

copy E:\!Mapping\Maps\mapname.bsp E:\Counter-Strike\cstrike\maps\mapname.bsp
Для большей гибкости .bat файлов, можно использовать переменные. Переменные определяются с помощью команды set. Полный синтаксис команды set такой: set имя_переменной=значение. Для использования значения переменной, просто напишите имя переменной, заключенное в знаки процента (%). Ниже приведен пример .bat файла, в котором в переменной mapname хранится имя карты, и его не нужно каждый раз указывать, передавая программе-компилятору.

set mapname=mymap.map
E:\!Mapping\Zhlt\hlcsg.exe E:\!Mapping\Maps\%mapname%
E:\!Mapping\Zhlt\hlbsp.exe E:\!Mapping\Maps\%mapname%
E:\!Mapping\Zhlt\hlvis.exe -full E:\!Mapping\Maps\%mapname%
E:\!Mapping\Zhlt\hlrad.exe -dscale 1 -extra E:\!Mapping\Maps\%mapname%
Так же, в начало .bat файла советую добавить команду @echo off, для того чтобы запретить вывод команды на экран перед ее выполнением.

Желательно создать себе два .bat файла. Один для полной компиляции, а другой для быстрой. Для быстрой компиляции запустите компиляторы с такими параметрами:

@echo off set mapname=mymap.map
E:\!Mapping\Zhlt\hlcsg.exe E:\!Mapping\Maps\%mapname%
E:\!Mapping\Zhlt\hlbsp.exe E:\!Mapping\Maps\%mapname%
E:\!Mapping\Zhlt\hlvis.exe -fast E:\!Mapping\Maps\%mapname%
rem hlrad.exe можно пропустить, ведь протестировать карту можно и без обработки на ней света.
И в завершение привожу пример своего .bat файла:

@echo off

rem Путь к каталогу с картами:
set MAPSPATH=E:\!Mapping\Maps

rem Путь к каталогу ZHLT:
set ZHLTPATH=E:\!Mapping\Zhlt

rem Путь к каталогу cstrike/maps:
set CSPATH=E:\Counter-strike\cstrike\maps

rem Имя карты:
set MAPNAME=mapname

rem Последовательный запуск всех программ-компиляторов
rem Если нужно - измените параметры компиляции:
%ZHLTPATH%\hlcsg.exe -nowadtextures -estimate %MAPSPATH%\%MAPNAME%
%ZHLTPATH%\hlbsp.exe -estimate %MAPSPATH%\%MAPNAME%
%ZHLTPATH%\hlvis.exe -full -estimate %MAPSPATH%\%MAPNAME%
%ZHLTPATH%\hlrad.exe -dscale 1 -extra -estimate %MAPSPATH%\%MAPNAME%

rem Копирование .bsp файла карты в каталог cstrike/maps
copy %MAPSPATH%\%MAPNAME%.bsp %CSPATH%\%MAPNAME%.bsp

rem После завершения компиляции выводим на экран сообщение 'COMPILE END':
echo COMPILE END
Все! Желаю всем быстрой и правильной компиляции!

ЗЫ. Не обращайте внимания на восклицательный знак в путях, приведенных для примера. Просто у меня такое название папки.


Параметры ZHLT-компиляторов
Автор: DigitalManiac & Alexnd

В этом туториале мы рассмотрим параметры ZHLT-компиляторов.

Формат команды для запуска утилит, как вы уже знаете, такой:

утилита -параметр1 -параметр2 ... имя_карты.map

Утилита - это один из файлов: hlcsg.exe, hlbsp.exe, hlvis.exe или hlrad.exe.

Параметры утилит всегда начинаются с тире (минуса). Можно не указывать параметры или указать несколько параметров через пробел. Если параметр используется с каким-то значением, то его нужно указывать так же через пробел, после указания параметра.

Например:
hlrad.exe -dscale 1 -extra mapname.map

Теперь давайте рассмотрим все имеющиеся параметры:

Общие | HLCSG | HLBSP | HLVIS | HLRAD
-texdata # -chart -low | -high -nolog -threads # -estimate -verbose -noinfo -dev # | -nowadtextures -wadinclude <файл> -noclip -onlyents -noskyclip -tiny # -brushunion # -hullfile <файл> | -leakonly -subdivide # -maxnodesize # -notjunc -noclip -nofill | -fast -full | -sparse -nomatrix -extra -bounce # -ambient r g b -maxlight # -circus -nopaque -smooth # -chop # -texchop # -notexscale # -coring # -dlight # -dscale # -nolerp -fade # -falloff # -scale # -gamma # -sky # -lights <файл> -noskyfix -incremental -dump

Общие параметры для всех утилит

-texdata # | Максимальный размер памяти для текстур. По умолчанию предел - 4Мб. Не рекомендуется превышать этот размер больше 2Мб.
-chart | Отображение BSP-статистики перед записью данных в BSP-файл. Лучше применять к HLRAD и HLVIS.
-low | -high | Устанока низкого или высокого приоритета выполнения компиляции. Установка низкого приоритета позволяет паралельно выполнять другие процессы без снижения производительности.
-nolog | Не создавать файлы отчета и сообщений об ошибках (.log и .err).
-threads # | Установка количества дочерних процессов. Важна для не-Windows систем.
-estimate | Отображение вместо стандартного индикатора хода компиляции: расчетного времени компиляции, сколько выполнено и сколько еще осталось обработать.
-verbose | Выдавать второстепенные сообщения.
-noinfo | Не выдавать в сообщениях информацию о настройках утилит.
-dev # | Уровень отображения внутренних отладочных сообщений. От 0 до 6. (0 - не отображать).

HLCSG

-nowadtextures | Включить все используемые текстуры внутрь BSP-файла.
-wadinclude <файл> | Включить из указанного wad-файла используемые текстуры внутрь BSP-файла. Перед именем файла можно задавать путь. Для включения нескольких wad-файлов укажите несколько параметров wadinclude.
-noclip | Не создавать ограничительные оболочки. С этим параметром карта создается без 3-х ограничительных оболочек, остается только видимая. Это полезно для ускорения компиляции на стадии разработки.
-onlyents | Обновить энтити в BSP-файле из MAP-файла. Чаще всего можно только редактировать энтити. При добавлении/удалении может произойти деорганизация остальных энтитей, особенно триггеров.
-noskyclip | Отключение автоматического ограничения SKY-брашами (небом). С эти параметром ускоряются HLVIS и HLRAD.
-tiny # | Установка площади, меньше которой удаляются браши. По умолчанию установлено 0.5 юнита. Опасно таким способом удалять лишние браши - BSP-дерево карты может повредиться.
-brushunion # | Установка границы в процентах для выдачи сообщения при пересечении брашей. Имеет смысл ставить 95% и больше при начальной отладке. Замедляет HLCSG дополнительными вычислениями для выдачи сообщений. По умолчанию выключена.
-hullfile <файл> | Загрузка из файла параметров ограничительной оболочки. Файл состоит из 3-х строк, которые обозначают в пространстве вершины "коробки". Каждая строка содержит 3 числа - X Y Z координаты соответственно.

HLBSP

-leakonly | Запуск BSP для поиска "дыр" (LEAKs). При нахождении дыр создается PTS-файл с информацией для их поиска.
-subdivide # | Установка уровня делителя поверхности в юнитах. По умолчанию стоит максималное значение - 240. Чем меньше это значение, тем больше r_speeds.
-maxnodesize # | Установка максимального размера портала. Установка меньшего размера разбивает пространство карты на большее количество блоков, что приводит к увеличению r_speeds, но это может помочь HLVIS быстрее и/или точнее расчитать визуальные участки, что снизит r_speeds.
-notjunc | Не разбивать браши на более мелкие в местах T-соединений. Данный параметр не используют при нормальной компиляции.
-noclip | Не обрабатывать ограничивающие оболочки и не писать их в BSP-файл. Если этот параметр применяется, то он должен быть указан и в HLCSG.
-nofill | Не заполнять пространство снаружи оболочки (игнорирует утечки LEAK). Лучше при этом не запускать HLRAD. Не применяется при нормальной компиляции.

HLVIS

-fast | Быстрая визуализация. Не используется для нормальной компиляции. Лучше использовать для быстрой компиляции без HLRAD.
-full | Полная визуализация. Используется при конечной компиляции. Увеличивает время компиляции за счет более детального анализа.

HLRAD

-sparse | Включить алгоритм low memory vismatrix (визуальная матрица с ограниченной памятью). HLRAD разбивает пространство карты на блоки (патчи). Из этих блоков создается матрица для вычисления освещения. Вы можете увидеть среди сообщений такое: visibility matrix: ... megs. За счет применения этого алгоритма происходит сжатие матрицы, и уменьшается расход памяти при работе HLRAD.
-nomatrix | Не использовать визуальную матрицу.
-extra | Включить наилучшее вычисление света.
-bounce # | Установка уровня световых отражений. Увеличение этого параметра улучшает тени и темные участки. Почти не влияет на скорость компиляции.
-ambient r g b | Установить уровень окружающего света. Осветляет черные поверхности. Значения красного, зеленого, синего от 0.0 до 1.0.
-maxlight # | Установить максимальный уровень освещенности. Ограничивает яркость на очень освещенных участках карты.
-circus | Включить режим "цирка" для выявления неосвещенных участков. Все черные точки (отраженный свет не учитывается) случайным образом заменяются на яркие, любого цвета.
-nopaque | Убрать блокирование света от энтитей с параметром zhlt_lightflags 2. Ускоряет компиляцию, только для теста.
-smooth # | Установить предел для сглаживания света (в градусах). По умолчанию HLRAD использует отдельное для каждой поверхности освещение (Phong shading). С этим параметром применяется сглаживание освещения (Phong smoothing) на поверхностях, если угол между поверхностями меньше чем указанный.
-chop # | Установить размер блока освещения (патча) для нормальных текстур. Увеличение размера патчей ведет к ускорению вычислений HLRAD, но ухудшению качества освещения.
-texchop # | Установить размер блока освещения (патча) для светящихся текстур. Лучше чтоб значение этого параметра равнялось половине от значения параметра chop.
-notexscale # | Не изменять размеры патчей при изменении размеров текстур. Если на карте размер текстур увеличен, то количество патчей не увеличивается.
-coring # | Установить минимальный порог освещенности для поверхностей.
-dlight # | Установить максимальный порог для прямого света. Этот параметр похож на maxlight, но он нормализует свет вместо простого "отброса" излишней яркости.
-dscale # | Установить умножение прямого света. Установка значения 1 дает реалистичные тени. Значение 0 дает полное отключение прямого света (так можно проверять отраженный свет). Значения 3-4 создают сильный контраст между тенями и освещенными участками, что полезно на картах типа пустыни или арктики.
-nolerp | Отключить смешивание отраженного света для близлежащих патчей. Используется ближайшее значение.
-fade # | Установить уровень затемнения для источников света. Чем больше значение, тем меньше распространяется свет. Этот параметр добавляет искуственное значение к нормальному способу вычисления прямого света. Отдельные объекты могут иметь собственные значения.
-falloff # | Установить способ расчета затемнения прямого света. 1 - 1:растояние, 2 - 1:растояние2.
-scale # | Установить глобальное умножение света. Чем больше, тем светлее. Производится в конце расчета освещения, так что можно регулировать уровень яркости на карте.
-gamma # | Установить уровень гамма-корекции. Производится в конце вычислений прямого и отраженного света.
-sky # | Установить влияние окружающего солнечного света на затененные поверхности.
-lights <файл> | Указать RAD-файл кроме стандартных lights.rad и имя-карты.rad.
-noskyfix | Отключить глобальное использование light_environment (глобальный уровень света от неба). По умолчанию учитывался только один light_environment. С применением этого параметра каждый light_environment работает отдельно.
-incremental Использовать или создавать файл со специальной информацией о свете. Полезно для отладки света и машин с ограниченной памятью.
Использование файла с данными о свете:
  1. Запустить HLRAD с параметром incremental, при этом создается большой файл (десятки мегабайт).
  2. Можно изменить объекты света - яркость, напраление, положение, цвета и т.д.
  3. Запустить HLCSG с параметром onlyents для обновления световых объектов.
  4. Запустить HLRAD с параметром incremental. Если в первый раз были установлены extra, chop, texchop, notexscale, их нужно так же указать. Другие параметры можно изменять.
-dump | Сохранить данные о патчах для отладки.
Изменение этитей
_fade # | Установить затемнение, чем больше, тем темнее. Применяется к энтитям light, light_environment, light_spot. Влияет только на прямой свет. По умолчанию значение равно 1.0. При приближении к 0.0 свет будет распространяться дальше, а при превышении 1.0 свет будет уменьшаться.
_falloff # | Установить способ расчета затемнения прямого света. 1 - 1:растояние, 2 - 1:растояние2. Применяется к энтитям light, light_environment, light_spot
zhlt_lightflags Установить опциональные флаги освещения. Применяется к любым брашевым энтитям.
Значения:
  • 0 - по умолчанию.
  • 1 - EmbeddedFix. Не использовать сложную корекцию освещения. Используется для исправления неправильно освещенных энтитей.
  • 2 - Opaque. Отбрасывать тени.
  • 3 - Комбинация флагов 1 и 2.
  • 4 - ConcaveFix. Используется только с Opaque для исправления освещения внутренней стороны искривленных этитей func_walls (например, арки).
  • 6 - Комбинация флагов 2 и 4.
light_origin | Установка выборочного расположения света. Применяется к любым брашевым энтитям. Чаще всего используется энтити info_target и в параметре браш-объектов - light_origin, указывается имя объекта info_target. Тогда, объект будет отбрасывать две тени (если для него не установлен флаг Opaque) - там, где он находится, и там, где расположет указанный объект info_target.


Свет
Автор: DigitalManiac

Свет - это електромагнитное излучение, воспринимаемое глазом. Его можно разделить на два типа: естественный и искуственный свет. В Half-Life, как и в реальной жизни, имеются оба варианта.

С этого заумного вступления я и решил начать данный туториал, посвященый свету.

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

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

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

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

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

Первым делом давайте разберемся с самым простым источником света - точечной энтитей ligth.

Для установки точечного источника света, просто поместите в нужное место на карте энтити light. В игре, из этой точки будет во все стороны распространяться свет.

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

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

Энтити light является искуственным источником света, поэтому, как и в реале, будет правильным создать и светило. К счастью вариантов имеется множество: лампы, фонари, огонь и т.д.

Итак, установив источник света light на карту, необходимо настроить его параметры:

Target - цель лампочки. Если она указана, то лампочка будет работать подобно прожектору. В противном случае, свет будет исходить во все стороны от источника, как обычно.
Name - имя объекта. С помощью имени лампочку можно включать/выключать.
Brightness - цвет и яркость лампочки, в формате "RRR GGG BBB Яркость". Первое значение (RRR) определяет красный цветовой оттенок лампочки, второе значение (GGG) - зеленый оттенок, и третье (BBB) - синий оттенок. Четвертое значение определяет яркость лампочки.
Appearance - стиль лампочки (мерцающая, мигающая, пульсирующая...).
Custom appearance - в этом параметре вы можете определить пульсирование лампочки, вписав латинские буквы от "A" до "Z" ("A" - самый темный, "Z" - самый светлый). При использовании данного параметра необходимо так же указать имя лампочки (независимо от того, будете ли вы его использовать). Пример: если в качестве значения параметра Custom appearance указать "abcdefedcba" (без кавычек), то лампочка будет пульсировать от темного света, до яркого, и обратно.

Флаги:
Initially dark - если этот флаг отмечен, то вначале лампочка будет выключена.

Примечание: если в параметре Brightness вы укажите значение "0 0 0 0", то на самом деле значение цвета будет равно "255 255 255", и яркость у лампочки будет средней, а не нулевой.

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

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

Параметры light_environment довольно просты:

Pitch yaw roll - угол, под которым падает свет на карту.
Pitch - угол отклонения направления света от горизонтали (значение "-90"). Значение больше "0" - отклонение вверх, а меньше "0" - вниз.
Brightness - цвет и яркость света (в таком-же формате как и у простого light).

Последний имеющийся в Half-Life тип света - направленный (энтити light_spot).

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

Name - имя объекта.
Target - имя объекта info_target, на который будет светить лампочка.
Inner (bright) angle - угол внутреннего конуса светового луча, который будет сформирован вокруг оси Pitch. Свет в этой области будет самым ярким.
Outer (fading) angle - угол внешнего конуса светового луча, который будет сформирован вокруг оси Pitch. Свет в этой области будет темнее.
Pitch - угол отклонения светового луча от горизонтали. Значение больше "0" - отклонение вверх, а меньше "0" - вниз.
Brightness - цвет и яркость лампочки.
Is sky - тип объекта. Есть два варианта: No и Yes. В первом случае объект будет как обычная лампочка (с направленным светом), а во втором - light_spot будет определять свойства окружающего света.
Appearance - тип лампочки (мерцающая, мигающая, пульсирующая...).
Custom appearance - в этом параметре вы можете определить пульсирование лампочки, вписав латинские буквы от "A" до "Z" (как было описано в случае с простой лампочкой).

Флаги:
Initially dark - если этот флаг отмечен, то вначале лампочка будет выключена.

Пример направленного света:

Для примера возьмем источник направленного света с такими параметрами:

Pitch = -90
Inner (bright) angle = 22.5
Outer (fading) angle = 45

В данном случае получится свет примерно такого вида:

Зеленая линия - это направляющая ось, заданная параметром Pitch.
Конус, сформированный синими линиями, определен параметром Inner (bright) angle.
Конус, сформированный красными линиями, определен параметром Outer (fading) angle.

И напоследок остается рассказать про текстурный свет.

Многие мапперы (особенно начинающие) не знают, что для каждой текустуры можно определить цвет и яркость света, исходящего от нее. Для этого необходимо указать компиляторам имена текстур, и значения света для них. Это можно сделать двумя способами.

Первый способ заключается в следующем: создайте в папке с компиляторами файл с именем lights.rad, и впишите в него строки такого формата:

texturename RRR GGG BBB Brightness

texturename - имя текстуры.
RRR GGG BBB Brightness - цвет и яркость света, излучаемого текстурой (подобно параметру Brightness у энтить).

Каждую текстуру и определение ее света необходимо писать в новой строке.

Теперь, при компиляции карты, все текстуры, чьи имена указаны в lights.rad, будут обрабатываться таким образом, что в игре от них будет исходить свет указанного цвета и яркости.

Второй способ указания компиляторам имена текстур и значения света для них - это создание на карте точечной энтити info_texlights, в который необходимо добавлять новые параметры. Название параметра - это имя текстуры, для которой необходимо изменить значение света, а значение параметра - это значение света для указанной текстуры.

Для того, чтобы добавить новые параметры в объект info_texlights, необходимо отключить кнопку Smart edit в окне Object Properties. Далее, жмите кнопку Add, после чего появится меню с параметрами Key и Value, где Key - это название параметра, а Value - значение.

Примечание: если энтити info_texlights отсутствует в вашем .fgd файле, то ее необходимо добавить туда вручную. Для этого откройте .fgd файл в каком-нибудь текстовом редакторе, и добавьте в конце следующую строку:

@PointClass color(255 128 0) = info_texlights : "Texture Light Config" []

На этом я и заканчиваю данный туториал.

При написании этого материала я постарался изложить всю информацию как можно более подробней и понятней. Надеюсь мне это удалось.


Основы Worldcraft (часть 2)
Автор: DigitalManiac

В третьем туториале "Основы Worldcraft" вы ознакомились с базовыми сведениями о инструментах редактора. Теперь, немного попрактиковавшись, давайте более подробно рассмотрим возможности Worldcraft.
Selection Tool (Shift + S) - инструмент выделения. Используется для выделения объектов на 3D и 2D-видах. C помощью Selection Tool можно помещать на карту префабы оригинальных размеров, трансформировать браши (изменять размеры, вращать и параллельно сдвигать их ребра) и клонировать объекты.

Для выделения объекта вам нужно просто кликнуть на нем в 3D или 2D-виде. Если вам нужно выделить несколько объектов, то делайте это, удерживая клавишу Ctrl. Так же, вы можете на 2D-виде зажать левую кнопку мышки, и растянуть рамку выделения. Все объекты, которые попадут в рамку - будут выделены.

С помощью инструмента Selection Tool вы можете клонировать объеткы. Для этого нужно выделить браш, зажать клавишу Shift, переместить его и отпустить сначала кнопку мышки, а затем клавишу Shift.

Для того чтобы изменить размеры браша, нужно сначала выделить его, после чего на его углах и ребрах появятся маркера, за которые можно растянуть/сжать браш.

Вращение браша осуществляется немного по-другому: выделите браш, а затем кликните на нем еще раз в 2D-виде, и его маркеры изменят свой вид на кружочки по углам. За эти кружочки можно вращать браш. Так же, зажав при вращении браша клавишу Shift, вы сможете поворачивать его на углы, кратные 15 градусам.

Для перемещения ребер браша, необходимо сначала выделить его (браш), а затем кликнуть на нем еще два раза в 2D-виде. После этого только с боков браша появятся маркеры, за которые вы можете параллельно перемещать его ребра.
Magnify (Shift + G) - с помощью этого инструмента можно увеличивать/уменьшать масштаб в 2D-видах. Для того чтобы приблизить изображение, кликните левой кнопкой мышки в 2D-виде, а чтобы отдалить - правой. Так же, вы можете использовать для этого клавиши плюс и минус или цифры, только следите за тем, чтобы окно с 2D-видом, на котором вы хотите применять масштабирование, было активно.
Camera (Shift + C) - в этом режиме вы можете помещать камеры в рабочие области редактора. Эти камеры используются только в редакторе - в игре их не будет. После того как вы включили этот режим, зажмите клавишу Shift, нажмите левую кнопку мышки на 2D-виде, и не отпуская ее, протяните линию, чтобы создать камеру. После этого на 2D-виде отобразится кружочек с отходящей от него линией. Кружок указывает точку, в которой установлена камера, а линия - направление взгляда. После создания камеры, вы можете с легкостью отредактировать ее. Если вам нужно изменить положение камеры, просто переместите кружочек в новое положение с помощью левой кнопки мышки. Точно так же можно именить направление взгляда. Для этого нажмите левой кнопкой мышки на окончание линии взгляда и, не отпуская ее, переместите как вам нужно.

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

Если у вас установлено несколько камер на карте, то вы можете перемещаться между ними с помощью клавиш PageUp/PageDown, но только при включенном режиме камеры.

Если вам необходимо удалить камеру, то активируйте ее и нажмите Delete.

Как было написано выше - в режиме камеры вы можете так же двигаться и в 3D-виде, тем самым, устанавливая новое положение и направление взгляда для активной камеры. Для движения в 3D-виде предусмотрено несколько дополнительных возможностей:
1. Зажав правую кнопку мышки, вы можете перемещаться вверх/вниз/влево/вправо не меняя направление взгляда.
2. Зажав правую и левую кнопки мышки вместе, вы можете перемещаться вперед/назад/влево/вправо не меняя направление взгляда.
3. Зажав клавишу Shift и правую кнопку мышки, вы можете перемещаться вперед/назад/влево/вправо не меняя направление взгляда, точно так же как и в предыдущем случае. Можно вместо клавиши Shift нажимать пробел - кому как удобно...

В дополнение темы про камеры, можно упомянуть про режим "свободного полета" в 3D-виде, без включения инструмента Camera и независимо от текущего вкюченного режима редактирования. Для этого, наведите курсор мыши на поле 3D-вида и нажмите клавишу z. Теперь вы можете свободно летать в 3D-виде с помощью мыши и клавиш W, A, S, D (так же, как и в режиме Camera). Чтобы выключить этот "режим свободного полета", снова нажмите клавишу z.
Entity Tool (Shift + E) - с помощью этого инструмента вы можете помещать на карту point-based entity. Включив Entity Tool, выберите нужный вам вид энтити на панели New Object и поместите точечную энтити на карту, откорректировав ее положение в 2D-виде и нажав Enter. Так же, можно поместить точечную энтити на карту, кликнув на какой либо объект в 3D-виде. Энтити сразу установится в то место, куда вы кликнули.

Чтобы изменить параметры энтити, активирйте ее и войдите в окно Properties. Это можно сделать через меню Edit -> Properties или нажав на выделенном объекте правой кнопкой миши и выбрав в контекстном меню пункт Properties. Так же вы можете войти в окно Properties, нажав клавиши Alt + Enter, когда нужный вам объект активен.
Block Tool (Shift + B) - в этом режиме вы можете создавать браши и помещать на карту префабы, изменяя их размеры, либо оставляя прежние. Как создать браш с помощью Block Tool, вы уже знаете из туториала "Первая карта", поэтому описывать снова этот процесс я не буду.

При создании браша, вы можете выбрать одну из пяти его форм, на панели New Object:

1. Block - обычный блок, куб (по умолчанию).
2. Wedge - клин.
3. Cylinder - цилиндр.
4. Spike - конус.
5. Arch - арка.

Стоит упомянуть, что Arch - это не форма примитива, а инструмент создания арок. После выбора объекта типа "Arch", растяните контур браша и зафиксируйте его (нажмите Enter или выберите пункт Create Object из контекстного меню). После этого перед вами появится окно Arch Properties:

Wall width - ширина стен арки. Вы можете "вывернуть" стены арки наружу, используя в отрицательное значение.

Number of Sides - количество сторон арки (чем больше сторон - тем круглее арка).

Arc - количество градусов, на которое распределится арка.

Start Angle - начальный угол арки.

Add Height - высота каждого последующего елемента арки над предыдущим.

Кнопка Circle - устанавливает значение параметра Arc равным 360.

Кнопка Preview - обновить чертеж рамки.

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

Для того чтобы поместить на карту префаб, изменив его размеры, вам нужно сначала выбрать тип префаба на панели New Object, а затем, создать префаб нужных вам размеров, точно так же, как вы создаете браши.

При создании, браш автоматически окрашивается текстурой, которая выбрана в данный момент на панели Textures. На префабы это не распространяется - они останутся окрашены своими текстурами.
Toggle Texture Application (Shift + A) - включает/выключает окно Face Properties, с помощью которого можно наносить текстуры на отдельные фейсы браша, а так же изменять размер текстур, двигать и вращать их. Давайте подробнее рассмотрим его:

При включенном окне Face Properties, вы можете выделять отдельные фейсы брашей на 3D-виде. Если вам нужно выделить сразу несколько фейсов, то следует пользоваться клавишей Ctrl. Так же, вы можете сначала выделить несколько брашей, а затем включить режим Toggle Texture Application.

Вы можете применить выбранную текстуру к какому либо фейсу, просто кликнув на нем правой кнопкой мыши в 3D-виде (важно чтобы было открыто окно Face Properties).

При клике левой кнопкой мышки на каком либо фейсе, его текстура станет текущей выбранной, а так же изменятся значения параметров в окне Face Properties, взависимости от параметров текстуры выбранного фейса.

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

Для того чтобы применить текущую текстуру вместе с текущими параметрами к какому либо фейсу, зажмите клавишу Alt и кликните на нужном фейсе в 3D-виде.

Теперь давайте подробно рассмотрим само окно Face Properties:

Scale (X/Y) - масштаб текстуры по X и Y. Вы можете использовать отрицательные значения, чтобы отразить текстуру.

Shift (X/Y) - сдвиг текстуры по X и Y.

Rotation - угол, на который повернута текстура.

Justify - выравнивание текстуры. Есть шесть вариантов выравнивания текстуры: L (Left) - по левому краю, R (Right) - по правому краю, Fit (Fit to face) - подогнать размер текстуры под размер фейса, T (Top) - по верхнему краю, B (Bottom) - по нижнему краю, C (Center) - по центру.

Treat as one - если у вас выделено несколько фейсов, то, отметив этот флаг, вы заставите редактор обрабатывать их как один фейс.

Align: World and Face - стиль выравнивания текстуры. Существуют два варианта выравнивания: world и face. В первом случае текстура будет выравниваться относительно координат сетки, а во втором, текстура будет выравниваться относительно фейса, на котором она расположена.

Texture Group - здесь вы можете выбрать все текстуры или только отдельный .wad файл. Кстати, около надписи Texture Group указаны размеры текущей выбранной текстуры.

Current Texture - имя текущей текстуры. Немного ниже имени текстуры отображается сама текстура.

Hide Mask - скрыть красную маску выделения. При скрытии маски выделения, само выделение не снимается.

Mode - здесь вы можете выбрать, что произойдет, когда вы кликните левой кнопкой мыши на каком либо фейсе. Есть шесть возможных вариантов:

  • Lift + Select
    •  - выделить фейс и сделать его текстуру и параметры текущими (по умолчанию).
  • Lift
    •  - сделать текстуру и параметры указанного фейса текущими без выделения файса.
  • Select
    •  - выделить фейс, не делая его текстуру и параметры текущими.
  • Apply (texture only)
    •  - применить текущую текстуру к указанному фейсу.
  • Apply (texture + values)
    •  - применить текущую текстуру и параметры к указанному фейсу.
  • Align to View
    •  - проэцировать текстуру на указанном фейсе относительно вида из камеры.
Apply Current Texture (Shift + T) - используется для окрашивания всех фейсов активного браша в выбранную текстуру. При этом параметры Scale, Shift, Justify и Align не меняются.
Apply Decals (Shift + D) - в этом режиме вы можете наносить декали на браши. Работает только при включенном инструменте Selection Tool.

Декали хранятся в файле decals.wad, так что если вы хотите использовать их, не забудьте подключить этот файл к списку .wad файлов, на вкладке Textures, в окне Tools -> Options.

Декали наносятся поверх текстуры, и ложатся параллельно ей. То есть, если у вас текстура повернута на 45 градусов, то декаль после нанесения на эту текстуру будет повернут точно так же. Но если потом вы повернете текстуру на другой угол - декаль с ней не повернется.

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

Как наносить декали на браши: выберите подходящий вам декаль из списка текстур на панели Textures, затем с помощью инструмента Apply Decals нанесите декаль куда вам нужно, просто кликнув на какой либо объект в 3D-виде. После этого, выключив инструмент Apply Decals, вы можете выделить декаль с помощью Selection Tool, и точно откорректировать его положение на 2D-видах.
Clipping Tool - (Shift + X) - этот инструмент применяется для обрезки частей активного браша. Вы можете разрезать браш на две части, или отрезать какую либо часть от браша.

1. Выделите объект, который вам нужно обрезать.

2. Включите инструмент Clipping Tool.

3. Протяните на 2D-виде линию среза через выделенный объект. Та часть объекта, которая выделится красной пунктирной линией, будет срезана после приминения обрезки.

4. После того, как вы расположите линию среза как вам нужно, необходимо применить обрезку нажатием клавиши Enter.

Вы можете переключаться между тремя способами обрезки, повторно нажимая кнопку инструмента Clipping Tool или с помощью гарячих клавиш Shift + X. Все три способа обрезки представлены на рисунках fig.2, fig.3 и fig.4.

Так же, если вы зажмете клавишу Ctrl, то при передвижении одной из точек линии среза, будут двигаться обе.

Для того чтобы разрезать браш на части, не удаляя ни одной из них - пользуйтесь способом обрезки, представленным на рисунке fig.3

Если при использовании инструмента Clipping Tool нажать клавишу o, то на 2D-видах будут отображаться размеры, так называемой "твердой" области объекта (которая не будет обрезана).

Vertex Tool (Shift + V) - режим вертексной манипуляции. С помощью вертексной манипуляции можно создавать объекты довольно сложной формы, так как вы имеете возможность перемещать отдельные вершины объекта. Подробное описание использования инструмента Vertex Tool вы можете прочитать в туториале "Вертексная манипуляция".
Path Tool (Shift + P) - инструмент создания путей для поездов, монстров и т.п.

Для того чтобы создать путь, включите инструмент Path Tool и проделайте следующие действия:

1. Зажмите Shift и левую кнопку мыши, затем протяните линию в 2D-виде. Этим самым вы создадите первые две точки пути.

2. В появившемся окне Path properties, укажите имя пути, направление пути (Oneway, Circular, Ping-pong) и тип энтити (path_corner или path_track).

3. Для добавления новых точек пути, кликните на какой либо существующей точки, зажмите клавишу Ctrl, и протяните новую точку пути.

Примечание: стартовая точка пути будет обведена зеленым кружком на 2D-виде.

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

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

При удалении первой точки пути, стартовой становится следующая за ней точка.
Вот и все! Надеюсь, с помощью этого туториала, вы хорошо разобрались с инструментами редактора. В следующих статьях мы подробно рассмотрим такие возможности Worldcraft, как вертекстная манипуляция, группы и Vis-группы, создание и использование префабов, создание entities и многое-многое другое...


Вертексная манипуляция
Автор: DigitalManiac

Вертексная манипуляция позволяет перемещать отдельные вершины и ребра браша, чтобы создавать объекты сложной формы. Есть только одно ограничение: все вершины одного фейса браша должны лежать на одной плоскости. То есть, браш не должен иметь вогнутостей, иначе возникнет ошибка.

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

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

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

2. Включите Vertex Tool. После этого, выбранный объект будет представлен в полупрозрачном виде с четко выделенными контурами. Вершины объекта будут отмечены белыми маркерами, а ребра - желтыми.

3. Кликните левой кнопкой мыши на вершинах/ребрах, которые вы хотите передвинуть (выделите их). Они поменяют цвет на красный (fig.3). Если у вас выделено несколько вершин/ребер, то при передвижении одного из них, будут передвигаться и остальные выделенные.

4. Выделенные вершины/ребра вы можете свободно передвигать по всем трем осям, но не забывайте про то, что браш не должен иметь вогнутостей. Старайтесь делать все аккуратно, чтобы не возникало ошибок, и не приходилось переделывать выполненную работу.

Примечание: передвигать выделенные вершины/ребра можно как в 2D, так и в 3D-виде.

Чтобы применить трансформацию объекта, необходимо выключить инструмент Vertex Tool. Для этого просто переключитесь на какой либо другой инструмент.

Вы можете переключаться между тремя режимами инструмента Vertex Tool. В разных режимах по-разному представлены маркеры вершин и ребер. В первом режиме (по умолчанию) одновременно показаны маркеры и вершин и ребер, во втором режиме - только маркеры вершин, и в третьем - только маркеры ребер.

Для того чтобы отменить проделанные действия в режиме вертексной манипуляции, вы должны сначала выключить инструмент Vertex Tool.

Разделение фейсов

Чтобы создать такую форму браша, которая представлена на рисунке, вам нужно будет разделить один из фейсов браша на два (fig.4). Для этого выделите два противоположных маркера (fig.3) и нажмите Ctrl + F. Если вы проделаете эту операцию между маркерами вершин, то между ними появится новое ребро. А если вы сделаете это между маркерами ребер, то эти ребра превратятся в вершины. В примере на рисунке, мы делим фейс между двумя ребрами (fig.4). Как видите, ребра стали вершинами, и между ними образовалось новое ребро. Теперь этот браш можно с легкостью трансформировать, как показано на рисунке fig.5. Результат проделанной работы представлен на рисунке fig.6.

Маштабирование вертексов

Маштабирование вертексов позволяет выделить несколько вершин и изменить их масштаб относительно указанной точки.

1. Выберите объект.

2. Включите инструмент Vertex Tool.

3. Выделите вершины, масштаб которых вы хотите изменить. К примеру, на рисунке ниже выделены все четыре вершины верхней плоскости браша.

4. Нажмите Alt + E, и появится небольшое окошко Scale, в котором вы можете указать значение, на которое нужно изменить масштаб вершин. Так же, после нажатия Alt + E, кроме окна Scale, на 2D-виде появится точка, обведенная белым кружком, которую вы можете свободно перемещать. По умолчанию, эта точка появится в центре, между всеми выделенными вершинами. Все выделенные вершины сдвинутся относительно этой точки, после того как вы введете какое либо значение в окне Scale (не закрывайте его при передвижении точки).

Объединение вертексов

Если два вертекса находятся в одной точке в пространстве, то их необходимо объединить в один. Сами подумайте, зачем один угол описывать двумя вертексами, если и одного вполне достаточно? Когда вы переместите один вертекс в ту же точку, где находится и другой, то появится диалоговое окно с вопросом "Merge Vertices?" (Объединить вектексы?). Жмите Yes, чтобы вертексы объединились в один. Если не объединить вертексы, находящиеся в одной точке, то возникнет ошибка.

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


Группы и VIS-группы
Автор: DigitalManiac

В этом туториале вы узнаете что такое группы и Vis-группы в Worldcraft, и как их использовать для облегчения работы в редакторе.

Обычные группы

Группа - это некоторое количество объектов объединенных вместе.

На рисунке показан пример группы объектов. Когда вы кликните на отдельном объекте, который не объединен в группу с другими, то он и выделится отдельно (рис. 2). Но если несколько объектов объединены в одну группу, то выделяя один объект из этой группы, вы там самым выделяете всю группу (рис. 3).

Группировать и разгруппировывать выделенные объекты можно с помощью кнопок Group selected objects и Ungroup selected objects на панели Map Operations.

Если вам нужно редактировать отдельный элемент группы, но вы не хотите разгруппировывать все объекты входящие в группу, то вам поможет кнопка Ignore Groups (игнорировать группу) на панели Map Operations.

Группировать можно как браши, так и энтити. Информация о группах объектов сохраняется только в .rmf-формате. Поэтому если вы сохраните вашу карту в .map-формат, то информация о группах потеряется.

Обычные группы могут так же быть и Vis-группами.

Vis-группы

Vis-группа - это группа объектов, отображением которой вы можете управлять. Тоесть, вы можете включать/выключать визуальное скрытие объектов на полях редактирования.

Примечание: Vis-группы никаким образом не относятся к vis-компилятору. VisGroup означает "visibility group", так что не путайтесь.

Допустим, на вашей карте есть следующая комната с мебелью:

Теперь давайте сделаем всю мебель в комнате одной Vis-группой. Выделите все объекты, которые вы хотите сделать Vis-группой, и нажмите кнопку Hide Selected Objects на панели Map Operations.

После проделанных выше операций, из выделенных объектов создастся новая Vis-группа, а так же, все выделенные объекты скроются на 3D и 2D-видах.

Имя новой Vis-группы появится на панели Filter Control. По умочанию, имя Vis-группы будет указывать количество объектов, пренадлежащих этой группе. В нашем случае, имя Vis-группы будет "3 objects", так как у нас в Vis-группу включено 3 объекта. Кстати, обычная группа в Vis-группе считается за один объект.

На панели Map Operations существует так же еще 2 кнопки для работы с Vis-группами. Первая, Hide Unselected Objects, создает новую Vis-группу из всех невыделенных объектов. А вторая кнопка, Show all visgroups, как понятно из названия, показывает все Vis-группы.

Вы можете изменить имя Vis-группы на панели Filter Control. Для этого выделите имя Vis-группы, а затем кликните по нему еще раз. После этого вы можете изменить имя Vis-группы (в данном примере имя "3 objects" изменено на "furniture").

Кликая слева от имени Vis-группы, вы можете включать/выключать иконку руки, указывающую на то, отображается данная Vis-группа на рабочих полях, или нет. После того как вы включили/выключили иконку руки, необхомо нажать кноку Apply, чтобы применить сделанные изменения.

Давайте рассмотрим, какие операции вы можете проделывать с помощью мышки на панели FilterControl:
  • Перетаскивать имя одной Vis-группы на имя другой. Это приведет к тому, что обе Vis-группы объединятся в одну. Новая Vis-группа будет называться так же, как называлась вторая Vis-группа, на которую вы перетащили имя первой.

  • Перетаскивать имя какой либо Vis-группы за пределы панели Filter Control. Это приведет к удалению данной Vis-группы. Заметьте, удаляется только Vis-группа, а не объекты пренадлежащие ей.
Вы можете выделить имя видимой Vis-группы на панели Filter Control, а затем нажать кнопку Mark, чтобы выделить данную группу.

При нажатии на кнопку Purge, будут удалены все Vis-группы, которые не содержат ни одного объекта.

Кнопка Edit включает окно Object Groups, в которм вы можете изменять имена и цвета существующих Vis-групп.

Поле Groups - здесь перечислены имена всех существующих Vis-групп. Чтобы выбрать какую либо Vis-группу, просто кликните на ее имени.

Name - имя текущей выбранной Vis-группы.

Color - после нажатия на эту кнопку, появится окно в котором вы можете выбрать цвет для текущей выбранной Vis-группы.

Remove - удаляет текущую выбранную Vis-группу.

New Group - создать новую (пустую) Vis-группу.

Close - сами догадайтесь.

Так же, с Vis-группами можно работать через окно Object Properties.

Выберите какой либо объект на карте, и откройте окно Object Properties. Если выделенный объект является энтитей, то у вас в окне Object Properties будет несколько вкладок. Выберите из них вкладку VisGroup.

Тут вы можете присвоить выделенный объект к какой нибудь существующей Vis-группе. Для этого, просто выберите в поле Member of group имя нужной Vis-группы, и выделенный объект автоматически присвоится данной Vis-группе.

Чтобы удалить выделенный объект из Vis-группы, кликните на строке (no group).

При нажатии на кнопку Edit groups, откроется уже знакомое вам окно Object Groups.

Конец!


Создание и использование префабов
Автор: DigitalManiac

Префаб (Prefab) - это группа объектов, сохраненная для последующего использования. Некоторый набор префабов поставляется в комплекте с Worldcraft. Это различного рода ящики, компьютеры и пр. Так же, вы можете создавать свои префабы (это может быть любой обьект или их группа). Вообще, префабами пользоваться очень удобно, так как, имея, к примеру, готовый компьютер, вы легко можете поместить его на карту, и вам не приходится тратить время на его создание снова.

Чтобы создать префаб, необходимо выделить все обекты, которые вы хотите сделать префабом, а затем нажать кнопу Create Prefab на панели New Objects или нажмите Ctrl + R. После этого перед вами появится окно Create Prefab:

В этом окне нужно указать имя и описание префаба, а так же библиотеку префабов, в которую вы хотите его поместить.

Name - имя (название) префаба.

Description - описание префаба.

Create in - здесь необходимо выбрать одну из существующих библиотек префабов, в которую будет помещен данный префаб.

Чтобы поместить на карту префаб, выберите библотеку префабов из списка Categories на панели New Objects, далее выберите нужный вам префаб из списка Objects, и нажмите кнопку Insert original prefab. Выбранный префаб будет помещен на карту и отцентрирован в 2D-видах.

Prefab Factory

Окно Prefab Factory позволяет с легкостью управлять имеющимися у вас библиотеками префабов: добавлять/удалять объекты и библиотеки, а так же редактировать имеющиеся префабы.

Вызвать данное окно можно через меню Tools -> Prefab Factory.

Библиотеки префабов хранятся в директории prefabs/, которая находится в директории редактора. Файлы с библиотеками префабов имеют расширение .ol. Вы можете добавлять/удалять библиотеки префабов, добавляя или удаляя .ol файлы из папки prefabs/. Так же, это можно делать через окно Prefab Factory. Давайте подробно рассмотрим его:

Select a Library - тут вы можете выбрать нужную вам библиотеку префабов.

Add Library - создать новую библиотеку. После нажатия на кнопку появится окно Edit Library, в котором необходимо ввети название библиотеки и ее описание.

Remove - удалить библиотеку.

Edit - редактировать библиотеку. После нажатия на на кнопку появится окно Edit Library, в котором вы можете изменить название и описание библиотеки.

Library Description - описание библиотеки.

Objects in library - список префабов, которые находятся в выбранной библиотеке.

Add object - добавить новый объект (префаб) в библиотеку. После нажатия на кнопку появится окно выбора файлов, в котором вы можете указать .map или .rmf файл, содержимое которого вы хотите сделать префабом.

Remove - удалить выбранный префаб из библиотеки.

Edit - редактировать выбранный префаб. После нажатия на кнопку выпадет меню, в котором вы можете выбрать два варианта редактирования. Первый - изменить название и описание префаба, а второй - изменить сам префаб.

Export object - экспортировать выбранный префаб в .map формат. После нажатия на кнопку появится окно, в котором требуется указать путь, куда необходимо экспортировать префаб.

Object notes - описание выбранного префаба.

Close - довольно сложная для понимания функция... лучше не трогать.

И напоследок, совет: не стоит злоупотреблять стандартными и чужими префабами - старайтесь использовать только свое, уникальное...


Entities
Автор: DigitalManiac

Энтити (Entity) - это то, что не является простым брашем, а взаемодействует с игроком в процессе игры. К примеру, вода, двери, стекла - все это энтити, так как эти объекты не просто существуют на карте как преграда, а еще и выполняют какую либо функцию. Все энтити делятся на два типа: point-based entity и solid-based entity. Первый тип - точечные энтити. То есть, их внешний вид, размер и форма заранее предопределены, а вы можете только изменять их параметры (к таким энтитям относятся источники света, точки появления игроков, ичсточники звука и т.д). Ко второму типу относятся энтити, которые создаются на основе брашей. Пользователь определяет размер, форму, внешний вид браша, а потом создает из него энтити. Можно сказать, что брашу присваиваются какие либо свойства. К таким видам энтити относятся двери, вода, кнопки и т.д.

Установка point-based entitites

1. Включите на панели инструментов Entity Tool или нажмите Shift + E, чтобы включить режим установки point-based entities.

2. Выбери нужный вам тип энтити из списка Objects на панели New Objects.

Примечание: при включенном иструменте Entity Tool, в списке Objects перечислены только точечные энтити.

3. Кликните в каком либо из 2D-видов, и откорректируйте расположение энтити с помощью мышки.

4. Нажмите Enter, или выберите из контекстного меню Create Object, чтобы создать точечную энтити в указанной точке.

Установка solid-based entitites

1. Создайте объект, который вы хотите сделать solid-based энтитей (можете не ограничиваться одним брашем).

2. Выделите данный объект.

3. Нажмите кнопку toEntity на панели New Objects, или Ctrl + T.

4. В появившемся окне Object Properties, укажите тип энтити и ее параметры.

Object Properties

В окне Object Properties, вы можете изменять тип энтити и ее параметры. Чтобы включить окно Object Properties, необходимо выделить нужную вам энтити (point-based или solid-based) и нажать Alt + Enter, или выбрать из контестного меню пункт Propeties.

Давайте подробнее рассмотрим это окно:

Вкладка Class Info

Class - тип энтити.

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

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

Angle - угол объекта. Необходимый параметр для некоторых энтитей. Значение параметра Angle колеблется от 0 до 359. Так же, при необходимости вы можете выбрать значение Up или Down (-1 или -2 соответственно).

Вкладка Flags

На этой вкладке содержатся флаги для выбранной энтити. Флаг - это переключаемый параметр. Тоесть, он может быть или включен или выключен - других значений не бывает.

Вкладка VisGroup

Данную вкладку мы уже обсуждали в туториале "Группы и Vis-группы", поэтому повторно я ее описывать не буду.

Примечание: подробно узнать о существующих в CS энтитис и их параматрах вы можете в разделе "Entities".

Entity Report

В Worldcraft существует полезное окно Entity Report, в котором перечислены все энтити, которые существуют на вашей карте. С помощью этого окна, вы можете с легкостью найти нужную вам энтити на карте, выделить ее, удалить, изменить параметры, и т.д. Включить данное окно можно из меню Map -> Entity Report...

Entities - список всех существующих на вашей карте entities.

Mark - выделить выбранную энтити.

Go to - выделить и отцентрировать в 2D-полях выбранную энтити.

Delete - удалить выбранную энтити.

Properties - вызвать окно Object Properties для выбранной энтити.

Поле Filter

В поле Filter вы можете искать энтити на вашей карте по различным свойствам и параметрам.

Радио-кнопки Everything, Brush entities и Point entities - показать все энтити, только solid-based энтити или только point-based энтити.

By key/value - отметив этот флаг, вы можете искать энтити по их key/value (параметр/значение). Если при этом отмечен флаг Exact, то в спике Entities будут отображаться только те энтити, параметр/значение которых точно совпадают с запрашиваемыми.

By class - отметив этот флаг, вы можете искать энтити по их типу.

Include hidden objects - если этот флаг отмечен, то поиск будет вестись так же и среди скрытых с помощью Vis-групп энтитей.

Конец!


Carve
Автор: DigitalManiac

Утилита Carve позволяет вырезать одним брашем дырку в другом. Например, вы можете вырезать круглую дырку в стене, используя Carve и цилиндр. Но все же не советую использовать утилиту Carve для этого - лучше вручную сделать круглую дырку, так как при использовании утилиты Carve, объект разбивается на более мелкие объекты:

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

Правильнее было бы сделать вручную таким вот образом:

Итак, как же работать с утилитой Carve? А очень просто: создайте браш таких размеров, каких вам нужна дырка (см. первый рисунок), и вставьте его в другой браш (браши), в котором нужно вырезать дырку. Затем, выделите этот браш и нажмите кнопку Carve with selected objects на панели Mapoperations Bar, или выберите из контекстного меню комманду Carve (на 2D-виде), или же нажмите Ctrl + Shift + C. После этого можете удалять данный браш, а на его месте останется дырка соответствующих размеров.

Пользуйтесь утилитой Carve осторожно, и не увлекайтесь - лучше все создавать вручную... Удачи!


Размеры в Half-Life
Автор: DigitalManiac

Ниже приведен список важных размеров в Half-Life.

Максимальная высота объектов, на которую игрок может взойти без прыжка:
  • Стоя: 18 юнитов
  • В присяде: 18 юнитов
Минимальная высота объектов над землей, которая необходима для того, чтобы игрок смог пройти под ними:
  • Стоя: 73 юнита
  • В присяде: 37 юнитов
Минимальная дистанция между объектами, которая необходима, чтобы игрок мог пройти между ними:
  • Дистанция: 33 юнита
Максимальная высота объектов, на которую игрок может запрыгнуть:
  • С прыжка стоя: 44 юнита
  • В прыжке из присяда: 44 юнита
  • В прыжке с присядом: 62 юнита
Максимальное расстояние между двумя объектами одинаковой высоты, на которое может прыгнуть игрок:
  • В прыжке из присяда: 99 юнитов
  • В прыжке при ходьбе: 109 юнитов
  • В прыжке с разгона: 239 юнитов
  • В прыжке с разгона с присядом: 259 юнитов
Вот и все! Используйте полученную информацию с умом на ваших картах.


Небо
Автор: DigitalManiac

Этот туториал целиком и полностью посвящен небу, которое встречается практически на каждой карте. Если у вас на карте есть открытые пространства (outdoor), тогда у вас так же обязательно должно быть небо. Сразу-же хочу сказать, что небо и sky-браши это не одно и тоже. Само небо - это 6 картинок в формате *.tga, размером 256х256. Почему именно 6 картинок? А потому что небо в Half-Life представлено в виде куба. Тоесть, вся карта как бы замыкается в огромный куб, на внутренних сторонах которого размещены 6 .tga картинок. Тоесть, 6 сторон неба.

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

К небу мы вернемся немного позже, а теперь давайте рассмотрим для чего-же нужны sky-браши.

Термин sky-браш означает браш, со всех сторон окрашенный текстурой sky (halflife.wad). Sky-браш нужен потому, что карты в Half-Life (и других играх, использующих Q-движок) не могут иметь открытых простанств в прямом смысле этого слова. Все области на карте должны иметь замкнутые пространства. Sky-браш как раз и поможет в соблюдении этого "правила".

Посмотрите на рисунок:

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

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

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

Теперь давайте вернемся к рассмотрению неба.

.tga рисунки неба находятся в папке cstrike\gfx\env\. Имена всех шести рисунков одного неба должны быть одинаковы, за исключением последних двух букв названия. Пример:

skynamebk.tga - задняя сторона неба
skynamedn.tga - нижняя сторона неба
skynameft.tga - передняя сторона неба
skynamelf.tga - левая сторона неба
skynamert.tga - правая сторона неба
skynameup.tga - верхняя сторона небаы

Две последние буквы в названии неба, как вы наверное уже догадались, означают положение рисунка на небе. Тоесть, указывают на сторону неба, на которой должно быть данное изображение. Вот так все просто и незамысловато...

Имя неба, которое вы хотите использовать на своей карте, должно быть указано в окне Object Properties. Его можно вызвать через меню Map -> Map properties...

Имя неба необходимо указать в параметре environment map (cl_skyname). Имя неба должно соответствовать именам .tga рисунков данного неба, но без последних двух букв.

Надеюсь вам все было понятно, и теперь вы сможете без проблем создать небо у себя на карте!


Размеренные размеры
Автор: Yarko

I. Пропорция во главе угла

Любой художник, архитектор или мап-дизайнер, начиная работу над своим произведением (если это, конечно, не сюрреализм или абстракция типа Q3Arena :)) всегда думает о пропорциях изображаемого объекта на полотне, в гипсе, камне или в пикселях. Если создатель предполагает, что его творение должно отражать РЕАЛЬНОСТЬ, то он, несомненно, должен побеспокоиться о том, чтобы пропорции в его мире были такими же, как и в мире реальном. Что же такое эта хитрая вещь - пропорции? Это просто численное соотношение размеров объектов. Именно пропорция, а не соответствие реальному размеру делает изображение РЕАЛЬНЫМ. Скажем, у вас есть фото 9х12, где вы стоите рядом со своим домом и собакой. Тот факт, что ваш фактический размер на фотографии не превышает нескольких сантиметров, нисколько не портит эффекта реальности изображения, т.к. на фотографии и дом тоже маленький, а собака все также меньше вас. С другой стороны, когда вы смотрите фильм в кинотеатре, на экране лица героев бывают просто гигантскими, - но опять же этот фактический размер не влияет на реальность восприятия. Для чего же такое пространно-философское вступление? Я хотел лишь подчеркнуть, что для реальности восприятия важна именно пропорция размеров, а не размеры сами по себе. В реальном мире для подсчета и соблюдения пропорций мы используем стандартизованные системы измерения. Французы, например, в конце XVIII века решили, что одна 40-миллионная доля меридиана Земли есть стандартная единица длины и назвали ее метром. И меряют этим самым метром необходимые им размеры. Другие люди используют иные стандарты измерения, но об этом позже. Однако в мире нашем, мапперском, мы вольно-невольно определяем размеры не в обычных величинах, а в непонятных даже многим из нас мистических "юнитах". Тут-то и встает вопрос: а как нам соблюсти все пропорции в мире WC? Мы ведь на уроках в школе не юнитами измеряли гипотенузу и катеты, а сантиметрами. Да и на физкультуре бегали стометровку, а не тысячеюнитовку. Вот и получается, что нам непременно нужно знать, какому реальному размеру мы можем сопоставить этот самый юнит.

II. Юнит = ?!

Таким образом, перед нами стоит двуединая задача: сопоставить юнит некоему реальному размеру, соблюдая при этом пропорции реального мира. Конечно, можно "от балды" назначить юнит равным чему угодно, но станет ли от этого "карточный" мир реальным? Нет. Значит "танцевать" нужно от соблюдения пропорций. Как я уже говорил ранее, пропорция - это соотношение размеров объектов. Так вот для того чтобы соблюсти правильные пропорции в мире WC, нам необходимо определить некий объект с эталонным, так сказать, размером. Нечто существующее и в нашем, мапперском, и в реальном мирах. Да так, чтобы этот эталонный размер был известен и в юнитах, и в метрах. С чем же человек привык соизмерять все вокруг? Правильно, с самим собой. В нашем случае наиболее полно, на мой взгляд, на роль эталонного размера подойдет рост игрока. На карте он всегда составляет ровно 72 юнита. А в реальности... Вот тут нас и поджидает настоящая засада. В реальности-то человек нестандартен! Какой рост выбрать для сопоставлений? Полный конфуз. Но не будем отчаиваться. Есть один способ решить и эту проблему.

III. Once upon a time...

Древние говорили, что для того чтобы победить противника, его нужно понять. И в нашем случае, чтобы "победить" размеры в WC, следует попытаться понять логику тех, кто придумал "юниты", т.е. логику создателей самой игры. Не знаю уж кто конкретно в ID Software эти самые "юниты" придумал (кто не в курсе - CS, как и HL "произрастают" из продуктов IDS), но некая логика в его действиях должна была быть. Так почему же он, нехороший человек, - спросите вы - не сделал юнит эквивалентным сантиметру, метру или дециметру? Или, в крайнем случае, двум, трем, ..., n сантиметрам? Что он, нестандартно мыслящий индивидуум? А вот как раз наоборот: он мыслил очень даже стандартно. Вот только имеется одна тонкость. В какой стране, по всей видимости, жил этот человек? В США. В Соединенных Штатах я прожил больше года и был поражен тем, что в Америке, в отличие от Европы, люди почти не пользуются системой СИ, где длина измеряется в сантиметрах, дециметрах, метрах и километрах. В их традиционной системе - это дюйм, фут, ярд и миля (морская и сухопутная). Как известно, дюйм, фут и ярд имеют следующую размерность:

1 дюйм = 2,54 см;
1 фут = 12 дюймов = 30,48см;
1 ярд = 3 фута = 36 дюймов = 91,44 см.

Теперь из приведенных выше американских единиц длины выберем наиболее подходящую на роль юнита. И вот здесь я выдвигаю следующую гипотезу:

1 юнит = 1 дюйм.

Попробую это продемонстрировать. Какой у нас основной критерий? Соответствие роста игрока в среде WC некоему стандартному росту в реальном мире. Кстати говоря, в той же Америке человеческий рост так и измеряется - в футах и дюймах. Вот что мы имеем в случае юнит = дюйм.

Рост игрока = 72 юнита = 72 дюйма = 6 футов = 182,88 см.

Итак, если юнит - это дюйм, то рост игрока в 72 юнита примерно соответствует 183 сантиментрам в реальности, что вполне адекватно размеру рослого спецназовца, рейнджера или десантника, "про которых", собственно, и игра.

IV. От теории к практике

Таким образом, мы определили, что 1 юнит = 2,54 см. Далее несложно узнать ответ на сакраментальный вопрос - сколько юнитов в одном метре:

1 м = 100 / 2,54 = 39,370... юнитов.

Ну а если при этом для удобства округлить получившийся результат в большую сторону, мы получим практическую формулу:

1 м = 40 юнитов.

Исходя из данной практической формулы, получается, что

1 юнит = 100 / 40 = 2,5 см;
рост игрока = 72 x 2,5 = 180 см.

Погрешность при этом небольшая - не более 1,6%, а удобства несравнимо большие, чем у точной формулы. Мы все визуально представляем, что такое метр, дециметр и сантиметр. Что же такое юнит/дюйм или, в нашем практическом случае, его упрощенная версия - 2,5 сантиметра? Очень просто. Слово "дюйм" происходит от голландского "duim" - буквально "большой палец". 2,5 см - это примерно ширина большого пальца руки взрослого человека (ростом в 72 юнита :)), толщина хоккейной шайбы или половина длины спичечного коробка. Длина того же коробка - уже 2 юнита. 4 юнита - это дециметр, 8 юнитов - 20 см. Таким образом, масштабная сетка в WC имеет следующее разрешение:

1 юнит = 2,5 см - ширина большого пальца руки, а также толщина хоккейной шайбы;
2 юнита = 5 см - длина спичечного коробка;
4 юнита = 1 дециметр - ширина дисковода для 3,5 - дюймовых дискет;
8 юнитов = 20 см - примерно ширина стандартного листа А4;
16 юнитов = 40 см - также примерно длина стандартного листа А3;
32 юнита = 80 см - средняя длина шага взрослого человека;
64 юнита = 1,6 м - два человеческих шага;
128 юнитов = 3,2 м - высота потолка в некоторых "сталинках";
256 юнитов = 6,4 м - высота двух этажей в доме стандартной планировки;
512 юнитов = 12,8 м - ориентировочно ширина баскетбольной площадки.

Полезной может также быть "обратная" таблица соответствия размеров в метрах и юнитах:

0,1 м = 4 юнита - на 4-х-юнитовой масштабной сетке - одно деление;
0,5 м = 20 юнитов - 10 дел. на сетке в 2 юн. или 5 дел. на сетке в 4 юн.;
1 м = 40 юнитов - 10 х 4 юн. или 5 х 8 юн.;
2 м = 80 юнитов - 10 х 8 юн. или 5 х 16 юн.;
3 м = 120 юнитов - 15 х 8 юн.;
4 м = 160 юнитов - 10 х 16 юн. или 5 х 32 юн.;
5 м = 200 юнитов - 25 х 8 юн.;
6 м = 240 юнитов - 30 х 8 юн.;
7 м = 280 юнитов - 35 х 8 юн.;
8 м = 320 юнитов - 10 х 32 юн. или 5 х 64 юн.;
9 м = 360 юнитов - 45 х 8 юн.;
10 м = 400 юнитов - 25 х 16 юн.;
15 м = 600 юнитов - 75 х 8 юн.;
16 м = 640 юнитов - 10 х 64 юн. или 5 х 128 юн.;
20 м = 800 юнитов - 25 х 32 юн.;
25 м = 1000 юнитов;
50 м = 2000 юнитов;
75 м = 3000 юнитов;
100 м = 4000 юнитов;
. . . . . . . . . .
Расстояние от полюса до экватора = 10 тыс. км = 0,4 млн. юнитов :).

Кстати говоря, такие понятия как "дюйм" и "фут" не настолько нам чужды, как это может показаться на первый взгляд. Эти две единицы, наряду с вершком, аршином, саженью, верстой и милей, входили в стандартную русскую систему измерений. Вот, например, "ворлдкрафтовские" эквиваленты некоторых из них:

1 фут = 12 дюймов = 12 юнитов (30 см по формуле 1 юнит = 2,5 см);
1 аршин = 28 дюймов = 28 юнитов (45 см, 1 юнит = 2,5 см);
1 сажень = 7 футов = 84 дюйма = 84 юнита (210 см, 1 юнит = 2,5 см).

Кстати, исходя из такого "древнерусского" прошлого дюйма и фута, можно предположить, что упомянутый ранее гипотетический автор "юнитов" был просто-напросто "ну очень старым" русским :).

V. Добавим немножко дегтя...

Ну что ж, имея готовые формулы и таблицы, можно было бы смело брать в руки рулетку, и, как говорят военные, "на местности" составлять точный план будущей карты. Но есть одно "но". Если вы, скажем, собираетесь измерить и отобразить на карте точные копии достаточно объемных помещений и сооружений (туннели, склады, здания и т.д.), то у вас не должно быть проблем. Но если вы хотите сделать реальную модель своей квартиры, офиса или другого помещения с достаточно ограниченным объемом, при запуске такой карты у вас может возникнуть ощущение некоторой нереальности размеров получившихся комнат - они будут казаться меньшими, чем в реальности. Почему же это происходит? Ответ, на мой взгляд, кроется уже не в особенностях WC, а в самом игровом интерфейсе. При игре в 3D-action - игры мы пока еще почти не пользуемся виртуальными шлемами и костюмами. Наша визуальная связь с компьютерным миром происходит через экран монитора, который не только показывает нам окружающее плоским, но также значительно сокращает наш угол зрения, особенно угол бокового обзора. На больших пространствах это сильно не сказывается, однако в компактных объемах прилично влияет на восприятие виртуального мира. Попробуйте, например, надеть на голову картонную коробку с небольшим прямоугольным вырезом для глаз, соответствующим вашему углу взгляда на монитор (сантиметров 15 в диагонали) и попробуйте побегать в ней по квартире или офису, которые хотите смоделировать. вы будете постоянно натыкаться на стены. Добавьте сюда большую неповоротливость компьютерного игрока (неспособность проходить и пролазить в достаточно узких местах, в которых обычный человек легко протиснется) а также тот факт, что изображение на мониторе плоское, а не объемное - и вы получите ответ на вопрос, почему малые объемы кажутся нам еще более малыми. Таким образом, можно сформулировать еще одну "ловушку для мапперов", звучащую примерно так: Господа, не делайте на карте слишком узких пространств с реальными размерами, - вы получите комнаты, которые будут казаться еще меньше, чем на самом деле. Но если вам все-таки необходимо сделать нечто подобное офису или квартире, смело искажайте размеры помещений в сторону увеличения. И не забывайте, что стремление к реальности размеров важно лишь до тех пор, пока оно не убивает насмерть Его Величество Геймплей.


Как сделать overview для карты
Автор: Fer

Что это и зачем оно нужно?

С появлением CS версии 1.4, а точнее - HL версии 1.1.0.9, появилась такая фича, как "Free overview" (наблюдение за всей картой с высоты птичьего полета в режиме spectator'а). Фича, конечно, любопытная, но... о, несчастье! Полноценную карту в этом режиме можно увидеть только на официальных картах, идущих "в комплекте" с CS. А как-же остальные, а главное - ваши карты, созданные ценою бессонных ночей? Черный экран, зеленая сетка и все? Получается: нарисовать (украсть) текстуры, придумать (украсть) идею, воплотить ее с помощью VHE в жизнь и вдобавок waypoint'ы для ботов сделать... А карта все еще неполноценная? Да... добавила Valve работы мапперам :) Ладно, не унывайте! тут на пол-часа работы!

Что вам понадобится?

Я понимаю, это банально, но буз HL 1.1.0.9 и CS 1.4 вы точно не обойдетесь ;) Еще вам понадобится нрафический редактор. Как говорил некий Шрек из одноименного мультфильма "...У луковицыесть слои, и у людоедов есть слои...". Так вот, ваш редактор также должен поддерживать слои. Paint Shop Pro - подойдет (или просто Fotoshop).

Шаг первый. "Understanding", так сказать.

Немного побраузив по корневой директории CS 1.4, вы несомненно найдете папочку overviews/, в которой находятся следующие файлы:

1. Рисунки в формате .bmp, размером 1024x768 точек, 8-bit цветности, название которых совпадает с названиями соответствующих карт. Это и есть "map overview'ы", тоесть, те 2D-исунки карт, которые мы наблюдаем в spectator'а. Возьмем на заметку, что подложкой карты служит прямоугольник 1024х768 точек, цвета "0 255 0" (RGB). А сама карта занимает максимально возможную площадь от подложки.

2. Текстовые файлы с названиями соответствующих карт и описанием неких переменных внутри. Это "overview description'ы".

вывод: для того чтобы сделать overview для своей карты, нам нужно создать рисунок своей карты в формате .bmp 1024x768 точек, с одноименным названием, и текстовый файл-description с описанием свойств нашего рисунка, таких, как масштаб, высота базового уровня карты и т.д. (об этом всем - чуть позже...).

Тренироваться будем на карте cs_italy (Почему? Я ее не люблю и с удовольствием поставлю над ней следственный эксперимент...). Итак, закидываем файлы cs_italy.bmp и cs_italy.txt в архив, а оригиналы удаляем из их родной cstrike/overviews директории...

Шаг второй. Готовимся screenshot'ить.

Если вы - бывалый папарацци в CS, этот абзац - не для вас.
Итак, запускаем CS, заходим в Configuration -> Controls, находим команду "Take screen shot", и определяем для нее клавишу, например, [F12].

Также нам понадобятся клавиши "Move forward", "Move back", "Move left (strafe)", Move right (strafe)", "Jump", "Duck", "Swim up", "Swim down", "Fire" - назначенная левой кнопке мыши и "Weapon special function" - назначенная правой кнопке мыши. Примечание: все это я пишу не из-за того, что считаю вас полностью некомпетентными в управлении CS, а наоборот: сейчас даже маленький ребенок так мрачно биндит и алиасит, что глаза на лоб лезут, а нам понядобятся "чистое" и удобное для работы управление.

Далее порядок действий очень прост. Убедившичь, что CS запущен с поддержкой консоли и в режиме 1024х768, создаем сервер сетевой игры: Play CS -> Play on LAN -> Create, выбираем нашу карту (cs_italy), жмем Ok - игра загружена. При выборе команды выберите Spectator, кнопка [6]. Если у вас установлены боты - не страшно, мы их потом кикнем. В режиме Spectator'а выбираем вид "Free map overview" (перебор видов производится кнопкой [Jump]). Видим черный экран - для этой карты нет 2D-плана (map overview'а).

Шаг третий. Делаем первый screenshot и description.

Теперь открываем консоль (по умолчанию кнопка [~]) и набираем команду dev_overview 1. Убираем консоль. Должно получиться нечто такое:

Теперь можно кикнуть ботов (если они появились). Для PODBot нажимаем [=], и в менюшке выбираем "Remove all bots" (кнопка [7]). Вместе с ботами обычно исчезает и мешающая нам зеленая сетка, если она не исчезла, ее можно убрать нажатием [Jump]. Дальше избавимся от HUD'а (верхняя и нижняя информационная панель): набираем в консоли hud_draw 0.

Что-ж, у нас - почти то что нам нужно: 1024х768 карта на зеленом (0 255 0) фоне. В верхней части экрана - постоянно обновляющаяся служебная информация о карте, которой мы воспользуемся для заполнения overview description'а. Для удаления ее с экрана можно воспользоваться консольной командой dev_overview 2. Для выхода из режима dev_overview, пользуйтесь командой dev_overview 0.

Информационная строка джля карты cs_italy изначально выглядит так:
Overview: Zoom 1.57, Map Origin (-248.00, 16.00, 192.00), Z Min 673.00, Z Max -289.00, Rotated 0
где: Zoom A - масштаб 2D-overview'а относительно натуральной величины карты.

Map Origin (X, Y, Z) - координаты самой нижней-левой-глубокой точки карты в пространстве при взгляде сверху (извините за такое мрачное пояснение... Все рано понимание этой переменной вам ненужно :) )

Z Min Ztop - Z-координата самой верхней точки карты.

Z Max Zbottom - Z-координата самой нижней точки карты.

Rotated B - угол поворота карты по оси Z.

Помните! Для каждой карты все эти переменные - уникальны!

Итак, информационную строку переписали на бумажку, потом убрали ее с экрана командой dev_overview 2. Теперь можно сделать первый screenshot: помнится, кнопка [F12]?

Ставим игру на паузу командой pause, если сервер этого не позволит, то сначала вспользуйтесь командой pausable 1. Кнопками [Alt]+[Tab] сворачиваем игру в панель задач (Кто не в WindowsXP - я не виноват! :) В противном случае - пока что просто выйдите из игры). В корневом каталоге HL проверим наличие скриншота cs_italy0000.bmp. Теперь браузим в директорию cstrike/overviews и создаем там текстовый файл cs_italy.txt, который заполняем поглядывая на нашу бумажку где мы записали информационную строку:

Шаг четвертый. Довоим до ума .bmp-шку и тестируем!

Готовый decscription сохраняем (естественно, в cstrike/overviews). Открываем наш скриншот в Paint Shop и приводим его в 8-ми битной глубине цвета: нажимаем [Shift]+[Ctrl]+[3], в появившемся окошке ничего не меняем, жмем [Ok]. Результат сохраняем как .bmp-шку все туда-же, в cstrike/overviews, именуем ее, как и прложено: cs_italy.bmp.

Ну что, посмотрим что получилось? О'кей, [Alt]+[Tab'ом] возвращаемся в игру (кто вышел из игры - запускайте ее снова), возвращаем все режимы на свои места: прописываем в консоли dev_overview 0, hud_draw 1 и делаем restart. Заходим в режим Spectator'а, кнопкой [Jump] переходим в Free map overview. Ну как? неплохо? Вся карта с высоты птичьего полета! Только есть две проблемы: 1. Если по вашей карте уже поскакали боты, то вы, наверное, заметили, что все они находятся как-то высока над картой? Обратите внимание на жетенькие вектора указывающие на точное положение игрока и своей длиной дающие понять, насколько высоко "забрался" он отновительно некоего "уровня моря". Так вот этим уровнем и является та переменная, которую нам нужно подогнать. А пока что она имеет значение самой нижней точки карты Z Max + 1. И второе: очень хотелось бы видеть все проходы и внутренности домов, а не только одни крыши! Везет-же тем у кого карта типа oneroom под открытым небом! :)

Шаг пятый. Решаем проблему с "уровнем моря".

Поехали! Кикаем ботов, убираем HUD, прописываем в консоли режим dev_overview 1. Теперь расскаж об управлении в этом режиме:

[Move forward], [Move back] - сдвиг карты по оси X.

[Move left (strafe)], [Move right (strafe)] - сдвиг карты по оси Y.

[Fire], [Weapon special function] - увеличение\уменьшение масштаба.

Этими трема степенями свободы нам пользовать не придется, и если вам хочеться поэкспериментировать, потом верните все в исходное состояние, чтобы центры и масштабы всех ваших скриншотов совпадали!

[Jump], [Duck] - перемещение по оси Z нижнего среза карты (меняется значение Zbottom переменной ZMax).

[Swim up], [Swim down] - перемещение по оси Z верхнего среза карты (меняется значение Ztop переменной ZMin).

А этими кнопками мы сейчас воспользуемся в полной мере! Для начала выясним координату Z "уровня моря": жмем кнопку [Jump] до тех пор, пока какой-нибудь фрагмент карты не обрежется (закрасится зеленым цветом). первым обрезается респаун контеров на координате -240.00, значит, это и есть самое низкое место на карте. Значение "-240.00" запишем на листик, а потом заменим им временное, обведенное у меня на втором рисунке оранжевым цветом. Первая проблема успешно решена!

Шаг шестой. Решаем проблему с "крышами".

Тут уже придется чуть больше попотеть, но работа творческая, так что не уснете! Для начала, кнопкой [Duck] вернем респаун контеров на законное место (значение ZMax = -241.00). Теперь кнопками [Swim up] , [Swim down] опускаем верхний срез карты, оголяя все туннельчики, переходики, кишечки и комнатки. Всего понядобится 2-3 скриншота для демонстрации всех закоулков карты. Сделали? О'кей, я тоже сделал:

№ п.п. | Значение ZMin | Имя сохраненного файла скриншота
1 | 161.00 | cs_italy0001.bmp
2 | 73.00 | cs_italy0002.bmp
3 | -40.00 | cs_italy0003.bmp

На скриншоте №1 хорошо видно внутренности всех помещений. №2 демонстрирует рыночную палатку, крытый проход с рынка к респауну террористов и выход из винного погреба к респауну террористов. №3 сделан только ради второго этажа дома с заложниками.

Теперь открываем Pint Shop и в нем открываем наш самый первый скриншот cs_italy0000.bmp, он автоматом становится layer'ом "Background". Затем открываем cs_italy0001.bmp, правой кнопкой мышки жмем на изображении, в выпавшей менбшке выбираем "Copy". Переходим к открытому ранее cs_italy0000.bmp, правой кнопкой мышки жмем на изображении, в выпавшей менбшке выбираем "Paste as layer". Теперь cs_italy0001.bmp скопировался к cs_italy0000.bmp и занял layer над бэкграундом, те же манипуляции производим и с двумя оставшимися скриншотами. В итоге у насполучился "бутерброд" из наших скриншотов, это хорошо видно в окошке "Layer Palette":

Теперь нам нужно из трех верхних слоев (layer'ов) удалить все зеленые области. Это проще всего сделать инструментом "Magic Wand". выбрав этот инструмент и оставив видимым и активным только нужный нам layer (это делается нажатием на иконку, изображающую очки в окне "Layer Palette"), щелкаем поочереди на все зеленые области и удаляем их нажатием кнопки [Del]. Зеленый фон должен остаться только на бэкграунде. Закончив удаление зеленых областей, делаем видимыми все layer'ы и методом подбора, изменяя значения "Layer opacity" и "Layer blend mode" выбираем оптимальное соотношение прозрачности слоев, добиваясь хорошей видимости всех скрытых мест. Обратите особое внимание на темные области карты (длинная кишка, ведущая от дома с террористами в сторону рынка), они не должны оставаться слишком темными, иначе во время игры они будут сливаться с окрыжающим черным фоном.

Готово? Теперь превратим наш "бутерброд" в обычный однослойный рисунок: "Layers" -> "Merge" -> "Merge all (flatten)". Слои исчезли, а результат перенесся в background. Далее приведем наш рисунок к 8-ми битному цвету: [Shift]+[Ctrl]+[3], жмем [Ok]. Карта готова, сохраняем ее в cstrike/overviews вместо нашего первого опытного экземпляра. Не забудьте подрихтовать значение "уровня моря" в cs_italy.txt. Все, теперь можно тестировать!


Руководство по созданию waypoints для PODBot
Автор: Ranger & DigitalManiac

1. Waypoint's - что это такое ?

Waypoint'ы - это точки на карте, которые использует бот для навигации. Они позволяют боту двигаться по карте, не сталкиваясь с препятствиями, находить места для установки бомбы, заложников. Эти точки не отображаются во время игры. Боты знают, по какому пути идти, используя соединения между этими точками. Для того, чтобы боты могли бегать по всем закоулкам карты, waypoint'ы должны быть расположены повсюду на карте. Без них боты будут просто стоять на месте либо выбирать направление движения случайно, при этом натыкаясь на стены и другие препятствия. Waypoint'ы также позволяют боту "знать" где на данной карте находятся цели - заложники, места для установки бомб. Этот документ описывает команды, необходимые для создания или изменения файла путей (для POD-бота). При создании или редактировании путей необходимо, чтобы НЕ БЫЛО подключенных к текущей игре ботов, иначе могут произойти фатальные ошибки (с потерей всех не сохраненных данных). Создайте LAN Game, подключитесь к игре, расположите точки и их соединения на карте с помощью команд, приведенных ниже. Далее сохраните файл путей, отсоединитесь от сервера, затем опять создайте игру, на этот раз с ботами, для того, чтобы проверить, насколько хорошо (или плохо) они двигаются по только что созданным точкам.

2. Как точки путей выглядят на карте?

Точки отображаются в виде вертикальных линий, которые выглядят, как молнии, или что-то типа этого. Вертикальная линия, с помощью которой отображается точка, имеет такую же высоту, как и игрок. Различные типы точек имеют разные цвета. Waypoint'ы хранятся в файле с таким же именем, как и у названия карты, но с расширением ".pwf" вместо ".bsp" для карт. Например, для карты de_dust файл путей будет иметь имя de_dust.pwf и будет хранится в папке Half-Life\cstrike\PODBot\WPTDefault\. Файл путей автоматически загружается при открытии карты (если он существует). Если же его нет, необходимо создать его, используя инструкции, указанные ниже.

3. Кратко о консольных командах для редактирования путей.

Доступны следующие консольные команды (ЧУВСТВИТЕЛЬНЫЕ к регистру):

"waypoint on" - включает отображение Waypoint'ов
"waypoint on noclip" - включает редактирование путей с читом Noclip, который позволяет проходить сквозь стены
"waypoint off" - выключает отображение Waypoint'ов.
"waypoint add" - добавляет точку в место, где в это время расположен игрок (т.е. вы). После выбора команды появляется всплывающее меню, позволяющее указать различные типы точек.
"waypoint delete" - удаляет точку, ближайшую к игроку.
"waypoint find x" - показывает направление к точке номер x
"waypoint showflags" - показывает все флаги, установленные для точки
"waypoint addflag" - позволяет вручную добавить флаг к точке.
"waypoint delflag" - позволяет выбрать флаг текущей точки, подлежащий удалению.
"waypoint setradius x" - выставляет радиус зоны для текущей точки равным х
"waypoint stats" - отображает статистику о количестве точек различных типов, поставленных на карте.
"waypoint check" - проверяет правильность установки точек (осуществляется автоматически при сохранении).
"wayzone calcall" - вычисляет радиус зоны для всех точек на карте (не нужен для бота версии 1.4х и выше).
"waypoint save" - сохраняет текущие пути в файл (с проверкой точек и соединений).
"waypoint save nocheck" - то же самое, но сохраняет даже при наличии ошибок.
"waypoint load" - загружает Waypoint'ы из файла (без сохранения текущих изменений).
"autowaypoint" - отображает статус режима autowaypoint.
"autowaypoint on" - включает автоматическую расстановку точек (при движении игрока по карте).
"autowaypoint off" - выключает режим автоматической расстановки точек.
"pathwaypoint" - отображает статуй режима pathwaypoint.
"pathwaypoint on" - включает режим отображения соединений между точками.
"pathwaypoint off" - выключает режим соединений.
"pathwaypoint add x" - соединяет ближайшую к вам точку с той, номер которой вы укажете в команде
"pathwaypoint delete x" - рассоединяет ближайшую к вам точку и ту точку, номер которой вы укажете в команде
"debuggoal x" - Заставляет ботов использовать точку номер х в качестве Точки Назначения

Для того, чтобы использовать команды, приведенные выше, необходимо использовать консоль. вы должны начать игру с включенной консолью (используйте строку "hl.exe -console" для запуска игры). Для открытия консоли нажмите клавишу "~", введите команду и нажмите "~" для возвращения к игре.

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

bind a "waypoint add"
bind d "waypoint delete"
bind l "waypoint load"
bind w "waypoint save"

Тогда клавиша a будет служить для добавления точки, d - для удаления, l - для загрузки и w - для сохранения файла путей. Кроме того, эти команды можно сохранить в конфигугационном файле, и потом только вызывать его при необходимости редактирования командой exec.

Командой "waypoint add" можно добавить waypoint в то место, где расположен игрок. Точки waypoint'ов могут быть поставлены везде, где может пройти игрок. При установке точки вы услышите звук, подтверждающий действие. После ввода команды на экран будет выведено меню, позволяющее выбрать тип точки.

"Normal Waypoint" (Обычная точка)
Ставит точку, которая используется для обычного передвижения по карте от одной точки к другой. Необходимо ставить такие очки повсюду на карте (но придерживаясь определенной дистанции между ними), так как боты используют их для того, чтобы прятаться и варьировать пути движения. Цвет точек зеленый.

"Terrorist Important Waypoint" и "Counter Important Waypoint" (Точка, важная для террористов и Точка, важная для контров)
Это стратегические точки для каждой из команд. Боты используют их для патрулирования по карте. Как они это делают, зависит от типа карты. На DE_ картах необходимо поставить много таких точек для контр-террористов вокруг места, где устанавливается бомба и только 2-3 стратегические точки для террористов. Контр-террористы будут почти всегда выбирать в качестве цели точки, важные для CT и только иногда пойдут к точкам, важным для террористов. Террористам разрешено идти к точкам, важным для любой из команд. Система выбора важных точек меняется в зависимости от типа карты, например для CS_ карт все наоборот. Точка для террористов красная, для контров синяя.

"Ladder" ("Лестница")
Эти точки необходимо ставить на лестнице, если вы хотите, чтобы боты ее использовали. Нижнюю точку поставьте, когда вы уже подошли вплотную к лестнице. Наверху лестницы необходимо поставить вторую точку. Ставьте ее когда вы уже находитесь над лестницей. Если лестница очень длинная, можно поставить несколько таких точек межу этими крайними. В большинстве случаев этот тип точек необходимо соединять вручную с помощью команды pathwaypoint add . Если между точками не будет соединения, боты НЕ БУДУТ использовать лестницу. Цвет фиолетовый.

"Rescue Point" ("Точка спасения")
Данная точка должна быть установлена только на cs_ картах. Это место, куда контр-террористы должны вести заложников. Обычно ставится только 1 штука (в зависимости от того, сколько Зон Спасения есть на карте). Цвет белый.

"Goal Point" ("Цель карты")
Поставьте ее там, где расположены цели карты. На DE_ картах это место установки бомбы, на cs картах - это место, откуда надо уводить заложников. Для AS карт это точка, куда надо двигаться VIP'ам. Цвет фиолетовый (как и для лестниц)

"Camp Start" ("Кемперское место")
Это точка, где боты будут кемперить. Для того, чтобы ее поставить, смотрите туда же, куда должен смотреть бот, когда начнет кемперить. Для того, чтобы он присел при этом, просто держите кнопку приседания, когда добавляете точку.

Также надо указать:
"Camp End" ("Направление взгляда")
выбрав это вы установите конечную точку, в которую будет смотреть бот во время того, как будет кемперить. Смотрите прямо по направлению, куда должен смотреть бот и добавьте точку.

Замечание: вы не можете добавить этот тип точки до того, как поставите точку типа "Кемперское место". Обычный цвет - голубой, если вы установите флаг для точки, она будет с красным или синим оттенком.

"Jump" ("Прыжок")
Это одна из первых возможностей обучения в POD (планируется значительное расширение таких возможностей). После выбора этого ваши движения будут контролироваться и если вы прыгнете, нормальная точка будет поставлена в месте начала прыжка, другая - в месте приземления. Т.е. тип точек является стандартным, но красная линия связи между точками покажет, что это соединение типа "Прыжок". Также можно создать такое соединение между уже существующими точками. Для этого необходимо, чтобы в месте прыжка и приземления уже были ранее созданы точки. При этом позиция точек будет модифицирована с учетом ее начального положения и места прыжка.

Замечание: для установки точки, где необходимо присесть, просто держите кнопку приседания во время добавления точки.

Как вы заметили, не существует отдельных путей для разных команд. Это уменьшает время создания файла путей.

Командой "waypoint delete" можно удалить точку, ближайшую к игроку. Точка должна быть на расстоянии максимум 40 юнитов от игрока (1/2 высоты игрока). Вам необходимо стоять вплотную к точки для ее удаления. Это позволяет избежать случайного удаления точки, которая находится далеко от вас. При успешном удалении вы услышите подтвержающий звук.

"waypoint addflag/deleteflag" дает возможность добавить некоторые дополнительные параметры для точки. Первый, "Block with hostage" используется редко. Если вы установите этот параметр для точки, Бот не будет использовать его, если за ним следуют заложники. Два других параметра необходимы для того, чтобы сделать снайперскую точку специфической для команды.

С помощью "waypoint save" можно сохранить информацию о точках в файл. Перед сохранением (если вы не добавите аргумент "nocheck"), точки и пути будут проверены на наличие грубых ошибок и если что-либо не так, вам будет об этом сообщено и ничего не будет сохранено. Во время проверки CS "подвиснет" на некоторое время, поэтому не волнуйтесь, игра не зависла, просто подождите! Файл waypoint'ов будет иметь такое же имя, как и текущая карта, с расширением "*.pwf". Файл будет сохранен в папку "cstrike/PODBot". Текущее имя игрока будет сохранено в качестве имя создателя путей.

Команда "waypoint load" очистит все waypoint'ы на текущей карте и загрузит их из файла waypoint'ов. Это хороший способ для того, чтобы отменить те изменения, которые вы сделали после последнего сохранения.

Замечание: не существует способа отмены изменения одной последней точки. вы должны использовать "waypoint delete" для удаления точек по одной.

Команда "autowaypoint" позволяет автоматически устанавливать точки, когда вы ходите по карте. Для включения этой функции введите: "autowaypoint on". Когда вы перемещаетесь по карте, новая точка будет установлена автоматически на расстоянии 200 юнитов от уже установленных. Если другая точка установлена в радиусе 200 юнитов, новая тока установлена не будет. Поэтому если вы хотите установить несколько точек близко одна к другой, необходимо пользоваться командой "waypoint add".

Если вам не нравится, как была установлена точка автоматически, вы можете удалить ее с помощью команды "waypoint delete", предварительно отключив функцию "autowaypoint".

Когда используете функцию автоматической расстановки точек, старайтесь держатся центра проходов и всегда ставить точки по ОБЕ стороны дверей. Для этого вам придется поставить некоторые точки вручную с помощью команды "waypoint add".

Не используйте функцию авторасстановки точек для лестниц или прыжков!

Команда "pathwaypoint" позволяет отобразить соединения между точками (соединения, по которым боты будут двигаться от одной точки к другой). Включите эту функцию с помощью команды "pathwaypoint on". Когда вы подойдете вплотную к точке, вы увидите белые или желтые линии, соединяющие эту точку с некоторыми другими, которые бот будет считать "достижимыми" при движении из нее. Если соединение двустороннее, линия будет желтая, белая линия соответствует одностороннему соединению. "Достижимыми" точками считаются точки, между которыми нет препятствий. Некоторые точки не будут считаться достижимыми по разным причинам. Например, точки, висящие в воздухе над ботом не будут считаться достижимыми, так как не может подпрыгнуть достаточно высоко. Также точки, находящиеся слишком далеко от текущего местоположения, не будут достижимыми.

Боты будут двигаться от одной точки к другой ТОЛЬКО если межу точками существует соединение. Поэтому при создании путей к карте очень рекомендую включать режим Pathwaypoint для того, чтобы вы могли всегда видеть соединения между точками. Также необходимо проверять, существуют ли соединения между точками в ОБЕИХ НАПРАВЛЕНИЯХ. Если существует соединение от точки А к точке В, это не значит что существует соединения от В к А.

Команда "pathwaypoint add " позволяет вручную создать соединения между двумя точками. Это необходимо в тех случаях, когда путь между точками блокирован каким либо препятствием (например, дверью) и вы хотите создать соединение между этими точками. Также точки типа "лестница" в большинстве случаев должны быть соединены вручную. Подойдите близко к точке, ОТ которой необходимо создать соединение и используйте команду "pathwaypoint add x", причем хдолжно быть заменено на номер точки, К которой необходимо создать соединение. Номер точки выводится в левый верхний угол экрана когда вы находитесь рядом с точкой.

Например, если вы хотите создать соединение между точками номер 250 и 251, сначала необходимо стать рядом с точкой номер 250. После этого ввести в консоли: "pathwaypoint add 251". После этого вы должны видеть белую линию соединения между этими точками. Обратите внимание, что это ОДНОСТОРОННЕЕ соединение. Ели вы хотите, чтобы боты бегали и в обратном направлении, необходимо стать рядом со второй точкой и добавить соединение к первой.

Одностороннее соединение

Двустороннее соединение

Команда "pathwaypoint delete x" похожа на "add" команду. Только она не добавляет, а удаляет соединение от начальной точки до конечной. Это может понадобится в некоторых случаях, например для дверей, которые открываются только с одной стороны.

После добавления точек проверьте, используя режим "pathwaypoint on" реальную достижимость точек. Иногда случается, что вы добавляете точку вроде бы близко от другой и также вроде бы между этими точками нет препятствий, однако ядро Half-Life не считает точку достижимой. Поэтому необходимо проверить соединения для точек в ОБЕИХ направлениях. Обычно нет необходимости следить за этим, однако в некоторых ситуациях необходимо потратить некоторое время соединяя точки вручную (например, для лестниц).

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

4. Что такое WayZone?

Боты будут выбирать точку в пределах этого радиуса, как точку куда следует идти, это просто делает движение не таким "статическим". Точки типа "Лестница", "Кемперское место" и "Цель карты" всегда имеют радиус 0. Не пытайтесь изменить его. После того, как POD-бот вычислил все Зоны, необходимо проверить для всех точек, являются ли они действительно достижимыми в радиусе WayZone. Старайтесь быть внимательными при установке радиуса. Возле углов лучше уменьшить радиус. Также желательно поставить радиус 0 для некоторых узких дверных проемов. Для того, чтобы вручную установить радиус зоны, необходимо, находясь возле точки, ввести в консоли "waypoint setradius x", где x - значение радиуса, которое требуется присвоить точке. Допускаются значения от 0 до 128. Чем больше, тем больше радиус. Также заметьте, что если включен режим pathwaypoints, радиус будет показан синими линиями (если он не равен 0).

Некоторые советы и уловки при создании путей

Начинайте создание waypoint'ов с команды "waypoint on". Далее набирайте в консоли "autowaypoint on" и "pathwaypoint on". После этого бегая по всей карте, попытайтесь расставить waypoint'ы во всех местах и закоулках, чтобы в последствии бот бродил по всей карте. Следующий шаг - регулирование радиуса waypoint'ов. В узких проемах и проходах следует сделать радиус путей маленьким, а в некоторых случаях и вообще установить в "0", чтобы бот правильно продвигался в этих местах и не цеплялся на углы и стены. Далее, нужно продумать места всех стратегических точек на карте. Потом просто двигайтесь к месту где вы хотите их установить, удаляйте нормальные waypoint'ы и место них ставьте стратегические. Потом размещайте целевые вэйпоинты, точки спасения (если они нужны) и вэйпоинты лестниц. Теперь сохраните и протестируйте все пути на карте с помощью комманды "debuggoal x", где x - номер вэйпоинта который будет служить боту точкой назначения. Просто "укажите" боту путь к какой либо точке, и проследите насколько правильно бот будет двигаться к ней. Если у вас при сохранении вэйпоинтов выдается ошибка - то всегда будет указан номер вэйпоинта с ошибкой. Для нахождения "неправильного" вэйпоинта следует пользовать командой "waypoint find x", где x - номер нужного вэйпоинта. Если у вас включена команда "pathwaypoint on" - то появятся зеленые лучи, которые укажут путь к вэйпоинту с указаным номером. С помощью команды "waypoint find -1" можно выключить зеленый луч.

Следует также упомянуть, что не существует waypoint'ов для разбивающихся предметов. Бот будет автоматически разбивать их, если они будут блокировать его путь (удостоверьтесь что линия связи между путями проходит через разбивающийся предмет).

Также не имеется никакого waypoint'а для кнопок. Если бот видит кнопку - он будет нажимать ее случайным образом (тоесть, может подойти и нажать, а может просто пройти мимо).

Частые ошибки новичков

1. Размещение ненужных waypoint'ов

Waypoint внутри окна был вероятно установлен для того, чтобы помочь боту пролезть в него. Однако это всегда кончается неудачей. Если боты видят "чистую" линию соединения к другому вэйпоинту, то они уверены что смогут беспрепятственно пройти к нему. Было бы лучше удалить вэйпоинт из окна, и с помощью команды "pathwaypoint add" соединить вэйпоинт который перед окном, с вэйпоинтом которых за окном.

2. Не подходящий радиус

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

3. Отсутствие связи между путями, плохой вэйпоинт лестницы

Во-первых, линия связи от нормального вэйпоинта до вэйпоинта лестницы не самая удачная. Лучше было бы сделать угол соединения между ними под более прямым углом. Но действительно плохая ошибка в том, что не имеется никакого соединения между вэйпоинтом лестницы, и нормальной точкой пути находящейся выше. А теперь посмотрим вниз от верхнего нормального вэйпоинта:

А вот это еще хуже! Имеется односторонняя связь между верхним нормальным вэйпоинтом до вэйпоинта лестницы, да еще и под таким углом. Бот никогда не будет использовать такую лестницу. Игра с такими waypoint'ами кончилась бы для бота тупым кружением около отдельного вэйпоинта, только потому что автор путей забыл соединить их. Ситуацию легко исправить, вручную соединив вэйпоинт лестницы с нормальным верхним вэйпоинтом.

4. Неправильное размещение стратегического вэйпоинта

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

5. Плохой угол приближения к вейпоинту лестницы

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

6. Слишком близкое расположение путей

На рисунке показано два вейпоинта, которые расположены слишком близко. Это замедлит бота (из-за более высокого количества вэйпоинтов) и кроме того будет давать отрицательный результат для навигации ботов и системе предотвращения столкновения. Попробую объяснить:

В DLL PODBot есть установленный радиус для вэйпоинтов, при входе в который, бот "думает" что он достиг вэйпоинта. Для разных типов вэйпоинтов этот радиус разный. Те вэйпоинты, что показаны на рисунке будут достигнуты ботом, когда он будет находится внутри радиуса 50 юнитов от центра вэйпоинта. Что имеется ввиду под значением 50 юнитов, вы можете узнать установив радиус вэйпоинту с помощью команды "waypoint setradius 50" - и вы увидите радиус размером 50 юнитов. На рисунке расстояние между вэйпоинтами составляет примерно 16 юнитов. Так что если бот достигает вэйпоинта №1, то он также думает что достиг и вэйпоинта №2 без любого движения, что является плохим для точного передвижения. Кроме того, пути обрабатываются таким образом, что когда два бота имеют в качестве цели один и тот-же вэйпоинт, начинается поиск альтернативного вэйпоинта для одного из ботов. Так что если один бот хочет достигнуть вэйпоинта №1, то вэйпоинт №2 будет назначен второму боту. А так как вэйпоинты находятся на очень маленьком расстоянии - боты столкнутся и увязнут друг в друге. Так что пытайтесь избежать такой расстановки вэйпоинтов любой ценой!

7. Отсутствие вэйпоинтов в некоторых местах

Посмотрите внимательно на рисунок. Видимо автор этих вэйпоинтов думал так: "О, хорошо! У меня установлены вэйпоинты там где должны бегать боты, и я не хочу чтобы они бегали еще где-то в других местах, поэтому я не буду там ставить вэйпоинты...". Это неправильно! Это правда, что PODBot использует вэйпоинты для своего основного движения, так что место которое на рисунке без вэйпоинтов бот не будет стремится достигнуть. Но это полностью наоборот когда начинается бой. Если бот начинает бой с кем либо, то он перестает пользоваться системой вэйпоинтов, а начинает передвигаться подобно Realbot. Так что во время очередной перестрелки бот может отбежать в такие места на карте, где "заботливый" автор вэйпоинтов не удосужился поставить пути. По окончании боя, бот снова "захочет" переключиться в режим движения по вэйпоинтам, а рядом их нету. Тогда бот будет просто тупо стоять на месте до конца раунда. вывод: ставьте вэйпоинты везде на карте, даже если вы сомневаетесь что бот достигнет этих мест. вы никогда не сможете предугадать, что может случиться с ботом во время боя, и куда он "вздумает" отбежать.


Half-Life Editing Tips by DaveJ (перевод)
Автор: DaveJ / Перевод: DigitalManiac

Представляю вам перевод статьи немалоизвестного маппера Dave Johnson'а, в которой он дает 51 совет по редактированию карт для Half-Life. Итак, приготовьтесь узнать много нового, полезного и интересного!

Совет #1

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

Совет #2

Очень важно правильно и умело подбирать текстуры. Пройдитесь по оригинальным уровням Half-Life, осмотритесь и найдите подходящий вам стиль, будь это стиль лабораторий начальных уровней (до аварии во время эксперимента), или архитектура boot_camp. Сделайте скриншоты стен, пола, потолка, крыш, внутри и снаружи, везде... Затем загрузите их в вашу программу, с помощью которой вы обычно просматриваете рисунки, и внимательно изучите. Используйте эти скриншоты в качестве примера, чтобы решить как использовать текстуры на своей карте. Я делаю так всегда, до тех пор, пока не пойму идею на 95%.

Совет #3

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

Совет #4

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

Совет #5

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

Совет #6

Анализируйте все. Если у вас не получается заставить entity делать то что вам нужно, то возьмите лист бумаги, и нарисуйте схему. Это поможет вам представить последовательность событий и обнаружить ошибку.

Совет #7

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

Совет #8

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

Совет #9

Старайтесь чтобы текстуры максимально соответствовали одна другой. Особенно на углах стен. Не допускайте того, чтобы текстура на одной стороне не соответствовала текстуре на другой:

Левое изображение на рисунке никуда не годится, среднее уже лучше, а правое вообще идеально!

Совет #10

Следите за r_speeds. Откройте консоль и наберите там developer 1 и r_speeds 1 и в углу экрана появится небольшой индикатор. Пройдитесь по стандартным картам от Valve, и посмотрите на показатели r_speeds (wpoly). Сравните полученные результаты с результатами со своей карты. Если ваши значения r_speeds намного превышают значения Valve'овских карт - то вам придется уменьшать детализацию в тех местах карты, где это случается. Но помните, что показатели r_speeds не совсем верны, пока вы не откомпилируете карту с полным vis. Для того чтобы отключить индикатор r_speeds, наберите в консоли r_speeds 0. Также, r_speeds можно проверять на слух. Для этого зайдите в ХЛ, возьмите RPG, расстреляйте весь боезапас и продолжайте удерживать кнопку мыши. вы будете слышать щелчки. Чем они быстрее - тем лучше ;)

Совет #11

Используйте текстуры выгодно. Многие текстуры нарисованы для использования на нескольких поверхностях. Смотрите:

Я был впечатлен тренировочным уровнем в Half-Life, где использовался данный метод. Используйте эту возможность максимально еффективно, и распределяйте ваши текстуры по нескольким брашам.

Совет #12

Силуэты смотрятся замечательно. Поместите монстра в темную комнату, и за ним установите источник света. Это сделает его вид более зловещим, да и вообще эффект отличный =)

Совет #13

Пытаетесь создать область покрытую травой? Хорошо, сделайте ее наиболее натуральной на вид. Присмотритесь к участкам, покрытым текстурой травы или скал, и вы наверняка заметите что на них очень отчетливо видны повторения текстуры. Это совсем неестественно:

Я бы вам посоветовал в таких случаях увелить размер текстуры (Scale) по X и Y в два раза и повернуть ее эдак на 30 градусов. После этих простых манипуляций, ваша трава будет выглядеть более естественно (см. рисунок). Можете попробовать сделать тоже самое и со скалами.

Совет #14

Не переусердствуйте с ореолами около источников света. Уровни переполненные env_glow-эффектом около каждой ламочки выглядят менее привлекательными. Это не значит что такие ореолы не нужно использовать, но все-же стоит знать меру, и не ставить их около каждого источника света.

Совет #15

Используйте колонны на углах. Конечно, не нужно их ставить на каждох углу. Устанавливайте их там, где углы смотрятся убого.

Также, следует убедится что колонны не мешают движению игрока (используйте эту конструкцию вместе с советом #21).

Совет #16

Примечание: В этом совете Дэйв Джонсон говорил что нужно использовать CLIP-браши вместе со SKY-брашами. Но это было давно, и сейчас этот совет уже неактуален, так как теперь при компиляции SKY-браши по умолчанию создают ограничивающие плоскости. Так что я пропустил этот момент, чтобы никого не запутывать...

Совет #17

Тщательно компилируйте ваши карты!!! Нет ничего хуче, чем, скачав карту, узнать, что она откомпилирована не полностью и играть на ней возможно только со скоростью 3fps. Так что компилируйте ваши карты полностью, и с full vis'ом.

Совет #18

Не используйте префабы по всей карте. Да, это намного быстрее, но смотрится ужасно. Судите сами: почти на каждой новой карте можно обнаружить торговый автомат с напитками! А самые худшие уровни имеют по 5 штук таких автоматов, притом выставленных в один ряд. Так что используйте префабы аккуратно, и как можно реже.

Совет #19

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

Совет #20

Максимально протестируйте вашу карту. Играйте на ней снова и снова, пока вам окончательно не надоест. Только так вы сможете обнаружить места, которые требуют улучшения. Записывайте на лист бумаги все обнаруженные вами ошибки, а потом исправляйте их. Дайте вашим друзьям и знакомым потестировать вашу карту. Потом выслушайте всех и примите их замечания во внимание. В конце-концов, отошлите вашу карту на сайт с обзорами для тестирования. Сделайте вашу карту идеальной!

Совет #21

Пожалуйста, используйте CLIP-браши! Особенно на DM-картах, где часто приходиться убегать из-под обстрела. Очень неприятно, если мы становимся легким фрагом только из-за того, что зацепились около стены. Взгляните сюда:

Очень легко в исполнении, и очень полезно в игре. Так делайте это!

Совет #22

Если вы создаете DM-карту, то проследите чтобы респауны игроков находились не очень далеко от оружия и брони. Нет ничего неприятнее, если вас каждый раз убивают только из-за того, что вам всякий раз после респауна приходится долго бежать за оружием. Я не имею ввиду, что нужно ложить броню и оружие около каждого респауна, просто убедитесь, что игрок доберется до оружия в течении 5 секунд, а до брони в течении 8-ми.

Совет #23

Декали прекрасно подходят для создания атмосферы. Текстуры устроены так, что они повторяются на брашах. Поэтому используйте декали для внесения некоторой разнообразности.

Совет #24

Если вы хотите некоторой атмосферы на ваших картах, то добавьте темные участки. Вот это у меня никогда не получается. Я думаю что каждый участок карты должен быть хорошо освещен - но это не так. Не спроста же в Half-Life присутствует фонарик. Так что делайте на ваших картах некоторые места в меру темными, и поставьте туда пару Headcrab'ов :))

Совет #25

Хорошо, вы хотите создать грандиозную сингл-карту. Но это не подразумевает то, что нужно использовать все возможные виды монстров на ней. Это частое заблуждение. Обычно, даже самые большие карты не имеют более трех разновидностей монстров (не считая профессоров и Barney). Так они выглядят гораздо убедительней.

Совет #26

Stretch. (Вот тут я его не понял! Возможно DaveJ имел ввиду растягивать события на ваши сингл-уровнях, чтобы играть было интереснее?).

Совет #27

Некоторые углы даже с колоннами выглядят непривлекательно. В этом случае попробуйте сделать так, как сделано на уровнях в Half-Life. Тоесть, сделайте углы закругленными.

Все что вам нужно сделать, это создать 12-ти сторонний (можно 16-ти сторонний) цилиндр, и обрезать лишнее с помощью Clip Tool.

Совет #28

Освещение с помощью entity все еще актуально. С тех пор как в QuakeII было предложено текстурное освещение, когда поверхности излучают свет взависимости от текстуры, использование light entity в качестве источников света заметно уменьшилось. Хотя даже в QuakeII они были широко распространены, но не настолько, как в любительских картах. А вот в Half-Life light энтити весьма редко встречаются (можете декомпилировать любую карту от Valve и самостоятельно в этом убедиться). Но это не значит что они совсем не нужны - в этом случае их бы просто напросто убрали. Light entity используются для достижения таких эффектов, как пульсирующий свет, включающийся\выключающийся и т.д.

Совет #29

Spotlight - это великолепное решение, если вы хотите сделать красивую карту. Я советую вам скачать лучшие DM-карты от headshot или ztn. Посмотрите, какой прекрасный эффект могут дать spotlight. После этого научитесь хорошо использовать light_spot entity.

Совет #30

Повторение отстойно! Надоедают не только повторяющиеся текстуры, но и звуки и энтити. Например, если вы пытаетесь имитировать звуки боя - реализуйте несколько различных вариантов. Не допускайте повторения одного и того-же .wav файла снова и снова. Ведь это уже не будет похоже на бой, правда? Другой пример: у вас есть длинный корридор с лампами на потолке. Скорее всего он выглядит повторяющимся со всеми своими лампами и одинаковым освещением.

Вот мой корридор... Первая картинка - вид в WorldCraft, средняя - вид корридора, когда включены все лампы. Как видно, он выглядит плоским и повторяющимся. Но посмотрите на последний скриншот, на нем корридор выглядит не только намного лучше, но и интереснее предыдущего. Все что я сделал, это выключил две из пяти ламп (заменил текстуру +0~fifties_lgt2 на +a~fifties_lgt2).

Совет #31

вы собираетесь ставить на вашей карте Barney или ученых? Будут ли они особо важными для прохождения уровня (например, Barney должен открыть какую либо дверь)? Если да - то пожалуйста, не забудьте удостовериться что если игрок вдруг убьет их, то игра автоматически заргузит последний autosave. Все что вам нужно сделать - это использовать player_loadsaved энтити. Назовите ее, например, 'barneydeath' (без кавычек). Затем, в параметрах Barney в поле Trigger Target впишите имя player_loadsaved энтити (в данном случае 'barneydeath'). Потом в поле Trigger Conditions установите значение Death. Теперь если Barney умрет, то автоматически загрузится последняя сохраненная игра. Если вы хотите отключить триггер после того как Barney выполнит свою цель, просто установите триггер, который сработает после того как Barney сделает то что должен, а в поле killtarget укажите имя player_loadsaved энтити.

Совет #32

Следите за обновлениями своего софта. Не пропускайте выхода новых версий ваших редакторов (WorldCraft, QuArK, BSP, QeRadiant...). Это не только предотвратит возможную потерю вашей работы из-за какого либо бага старой версии, но еще и внесет массу новых возможностей, реализованных в новых версиях редактора. И обязательно имейте у себя последнюю версию Half-Life. Так как тем людям, кто решил поиграть на вашей карте будет намного проще обновить свой HL, чем искать старую версию игры. Согласно теории, в последних версиях ХЛ можно запустить старые карты, а наоборот нет.

Совет #33

Я всегда путаюсь с FX Amount... Чтобы у вас не случилось подобных ситуаций, запомните навсегда, что FX Amount 0 делает объект полностью прозрачным, а FX Amount 255 - полностью непрозрачным. Кстати, FX Amount 96 идеально подходит для окон ;)

Совет #34

Постарайтесь, чтобы все размеры на картах были кратными 4, 8 и 16. Возможно вам и удобнее, если ваши стены размером 50 юнитов в высоту и 100 в ширину, но со времен Wolfenstein3D практически все 3D движки хорошо работают только со стандартизированными размерами, кратными 4, 8 и 16. Поэтому если вы делаете, например, стену, то старайтесь сделать ее шириной 32 или 64 юнита. В этом случае движку будет намного легче их обрабатывать. Очевидно, что такие стены будут также быстрее обрабатываться CSG и BSP компиляторами.

Совет #35

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

Совет #36

Хотите сделать на карте пар? Попробуйте так: установите на карте env_sprite в том месте, где бы хотите видеть пар. Заметьте, что пар будет подниматься вверх, а его начало будет не в центре энтити - скорее, энтити будет в центре спрайта. Так что поднимите env_sprite на 32 юнита выше того места, откуда будет идти пар. Потом установите Sprite Name = sprites/xsmoke3.spr, Render Mode = Additive, FX Amount около 128. Также не забудьте отметить флаг Start On. Также неплохой будет установить Scale = 2.

Совет #37

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

Несколько подпорок (всместе с CLIP-брашами) сделают стены намного привлекательнее.

Совет #38

Окружающие звуки рулят! Env_sound - прекрасное решение для создания атмосферы в игре. Для тех кто не знает, объясняю: эта энтити нужна для указания игре, как нужно обрабатывать звуки. К примеру, если игрок пройдет около такой энтити, у которой Room Type = 'Tunnel Large', то все звуки станут звучать как в огромном туннеле. Этот эффект будет работать до тех пор, пока другой env_sound не изменит его.

Совет #39

Тумана не существует! Позвольте вам еще раз повторить одну вещь - тумана в Half-Life не существует! Да, он может имитировать дымку под водой, но это единстренный случай. Кстати, func_illusionary может работать как вода, и тоже может имитировать туман. Но поскольку он работает как вода, то в нем тоже можно утонуть :( Если вам все-же нужен туман, то попробуйте перейти на Unreal или QuakeIII.

Совет #40

Планируйте. Многие профессиональные мапперы из таких компаний-гигантов как Valve, ID, Epic, Ritual, Raven и других, сначала рисуют свои карты на бумаге, прежде чем начнут создавать их. Лично я не делаю этого, но многим будет легче если они сначала спланируют основную структуру карты на листке. Я не говорю, что все должны работать именно так. Насколько мне известно, некоторые люди из вышеупомянутых компаний начинают работу сразу-же в редакторе. вы вольны вибирать любой из методов, и ни один из них ничем не хуже другого. (Некоторые даже пишут для себя генераторы случайных карт =)).

Совет #41

Если вы хотите работать в больших компаниях, таких как Valve или ID Software, то будьте готовы к трудной и усердной работе. Основное что вам нужно - это иметь большой опыт в левел-дизайне, так как это является главным фактором, на который в первую очередь обращают внимание. Убедитесь что все ваши работы достаточно хороши и профессиональны. Также вам поможет умение работать в комманде. Хорошо будет также уметь рисовать свои текстуры и программировать различные утилиты облегчающие работу маппера. И наконец, вам понадобится решительность, удача и еще раз опыт!

Совет #42

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

Совет #43

Дайте всем увидеть! Если вы решили поместить на карту важный для прохождения выключатель или кнопку, то дайте всем его увидеть. Существует множество карт, на которых кнопки спрятаны в темных комнатах. Если вам все-таки обязательно нужно сделать так, то дайте хоть как-то понять игроку что ему нужно использовать фонарик. В противном случае разместите рядом с кнопкой какой либо источник света, или установите у кнопки _minlight = 0.2, чтобы она была немного светлее.

Совет #44

R_speeds все еще слишком высокий? Вот один трюк: в зависимости от масштаба текстуры, движек использует разное количество полигонов для ее прорисовки. Например, текстура размером 128х128, нанесенная на браш такого-же размера имеет масштаб равный 1.00, и для ее отрисовки понадобится 2 полигона. А если та-же текстура 128х128 будет нанесена на браш размером 256х256, то для ее отрисовки потребуется уже 8 полигонов. Так что если во втором случае увеличить масштаб текстуры по X и Y до значения 2.00, то количество полигонов снизится до двух! Смотрите:

Как видите, увеличение масштаба текстуры всего в два раза может уменьшить r_speeds на 75%! Попробуйте...

Примечание: этот совет работает не во всех случаях! По умолчанию, фейсы браша разбиваются на блоки размером 240х240, а размер текстуры не влияет на это. Поэтому вышеприведенный совет работает лишь в тех случаях, когда поверхность на которой он применяется имеет размеры больше чем 240х240.

Совет #45

Мир - это не спичечный коробок. Не все мире квадратное и не все расположено под прямым углом. И чем это поможет в картостроении? А вот чем:

Взгляните на рисунок. Самый простой способ - это делать квадратные корридоры между комнатами и я тоже так делаю. Но если вы хотите сделать что либо интереснее, то постройте корридор под углом между двумя комнатами (как на третьем рисунке), но не забывайте про r_speeds и о правильном текстурировании.

Совет #46

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

Совет #47

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

Совет #48

Запомните: некоторые существа выглядят гораздо интереснее в группах, чем по одиночке. Headcrab'ы, к примеру, хороши группами по 2-3, Houndeye - стаями по 5 особей, а Alien Slave неплохо смотрятся по двое. G-man'а лучше ставить всегда одого, а главное, игрок не должен видеть более двух Barney одновременно. Три одинаковых охранника выглядят очень глупо. А вот ученых можно использовать большими количествами - так как у них имеются разнообразные скины, и они не будут похожи один на другого.

Совет #49

Браши неба отличаются от всех остальных тем, что они всегда состоят из 12-ти полигонов. Это потому что браши неба не разбиваются на полигоны как обычные браши с обычными текстурами, и они видны только через SKY-браши. Как я уже говорил, небо состоит из 12 полигонов, по 2 полигона на каждую сторону, и рендерится за пределами обычных брашей. Вот тут и становится понятно преимущество SKY-брашей - они не влияют на r_speeds в отличии от обычных брашей. Это означает что с помощью них можно снизить число полигонов на карте. Каким образом? Для этого нужно все невидимые для игрока поверности покрыть текстурой SKY:

На этом простом примере мы видим проход по которому может пройти игрок. Игрок никогда не сможет увидеть верхнии стороны брашей справа и слева от него, так что их можно покрыть текстурой SKY. Это может сохранить немало полигонов. Главное удостоверьтесь что игрок никогда не сможет увидеть поверхности покрытые SKY-текстурой (ведь он может спокойно залезть на какой нибудь ящик, или даже на Barney). Этот метод лучше всего использовать на открытых пространствах, где уже есть достаточно неба. Также, следует быть предельно осторожным используя light_environment, так как могут произойти некоторые странные вещи.

Примечание: этот совет уже не актуален сегодня, так как вместо SKY-брашей теперь используется текстура NULL.

Совет #50

Сохраняйте нас... Создавайте на ваших сингл-картах autosave перед теми местами, где происходят серьезные стычки с врагами, и перед теми местами где игрок может запросто погибнуть. Это позволит игроку не начинать игру из далека, что весьма скучно. Используйте trigger_autosave.

Совет #51

Quake-движок, на котором основан Half-Life разбивает полигоны в местах соприкосновения брашей:

На левом рисунке вы видите изображение из игры. Оба браша - не энтити, поэтому полигоны на них разбиты как показано на среднем рисунке. Если маленький браш сделать энтитей (например, func_wall), то он не будет разбивать полигоны большого браша (как показано на правом рисунке). Хоть там и не показаны полигоны малого браша, но они все равно там есть, только обрабатываются как entity-полигоны. вывод: делайте из всех мелких объектов энтити, чтобы они не разбивали полигоны контактирующих с ними больших брашей на большее количество. Этот метод позволяет довольно неплохо снизить r_speeds.

Примечания Автора:

Надеюсь, мои советы помогут как новичкам так и профессионалам в картостроении. Но вы должны понять, что это всего лишь советы а не правила. Их не обязательно придерживаться. Существует множество случаев, когда вы можете проигнорировать все выше сказанное, и сделать вашу карту более лучше. Хорошая карта вовсе не должна соответствовать этим советом - каждый в праве делать как ему хочеться. Так что используйте понравившиеся советы, и ничем не ограничивайте себя. Используйте все прочитанное с пользой, ведь эти советы я писал как раз для того чтобы повысить качество самодельных карт, поделившись с вами тем, что я узнавал на протяжении многих лет в картостроении. Я жду от вас новых и хороших карт!


Движок на дровах, или немного о теории BSP
Автор: Yarko

Создание карт, как и любое другое искусство, требует от автора не только досконального владения его непосредственным инструментом, но также знания, хотя бы в общих чертах, фундаментальных основ той области, в которой он работает. Художники, например, для лучшего понимания строения человеческого тела изучают анатомию. Так же и в ремесле картостроителя – знание основных принципов 3D-графики для совершенствования профессионального мастерства дизайнера уровней просто необходимо.

В данной статье рассмотрен принцип работы 3D-движка на основе широко применяемой BSP-технологии. Продемонстрирован процесс формирования специального иерархического массива – древа BSP. Показано использование BSP-древа, а также пути его оптимизации.

Корень проблемы

Даже начинающий левел-дизайнер в курсе, что подавляющее большинство современных 3D-игр построено на основе так называемой полигонной графики. Это означает, что весь компьютерный мир и его объекты представлены в виде комбинации большого количества разных по форме и размерам плоских граней-многоугольников, называемых "полигонами". В таком мире (обычно именуемом "картой" или "уровнем"), например, цилиндр и конус будут выглядеть соответственно как призма и пирамида с правильным многоугольником в основании. При этом чем мельче разбиение на полигоны, тем выше детализация уровня и его реалистичность.

Вместе с тем, мало лишь спроектировать мир из полигонов. Необходимо сделать так, чтобы созданная трехмерная карта правильно отображалась на мониторе, причем в условиях постоянного изменения позиции наблюдателя в реальном времени. Таким образом, необходимо определить способ получения проекции объемной сцены на воображаемую поверхность экрана наблюдателя в зависимости его местоположения, ориентации взгляда и перспективы (рис.1).

рис.1

Проекция с учетом ориентации и перспективы – дело несложное, скажете вы. Но как же обойтись с теми частями карты, которые должны быть закрыты от взора наблюдателя, скажем, непрозрачной стеной или ящиком? Иными словами, необходимо определить такой способ проецирования 3D-мира на экран монитора, чтобы отображать только реально видимые из данной точки поверхности (или их видимые части).

На первый взгляд, достаточно ограничиться следующим алгоритмом:

1. Измеряем расстояние от точки наблюдателя до каждого полигона карты.

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

Что же мы получим? Прорисовывая полигоны по мере их приближения к точке наблюдателя, мы автоматически решаем вопрос о невидимых частях карты – если один полигон (более ближний) закрывает собой другой (очевидно, более дальний), то он (ближний), прорисовываясь позднее, закроет собой невидимую часть дальнего полигона.

Едва ли не единственное достоинство такого алгоритма состоит в том, что он предельно прост в реализации. Однако недостатки более весомы:

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

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

рис.2

вырастим дерево…

В связи с приведенными выше соображениями, был разработан алгоритм работы 3D-движка на основе так называемой технологии BSP, суть которой состоит в следующем.

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

Что это за чудо-матрица, спросите вы. И как ее получить?

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

рис.3

Как видно из рисунка, подобное "растение" состоит из узловых точек (называемых "нодами") и линий-связей между ними. У древа есть корень – некая самая главная узловая точка, связанная с одним или двумя нодами более низкого уровня. Те, в свою очередь, связаны с нодами еще более низкой иерархии и т.д. Ну, это все голая теория. Як кажуть у нас на Французщіні [image], retournons aux nos moutons, т.е. вернемся к нашим баранам – в случае BSP-технологии в качестве нодов выступают полигоны карты, а само древо строится следующим образом – продемонстрируем на простом примере.

Пусть наша карта представляет собой комнату с прямоугольной колонной посредине (рис.4).

рис.4

Для простоты иллюстрации, отбросим пол и потолок – суть метода от этого не пострадает. Обозначим имеющиеся восемь стен-полигонов S1, S2…S8 (рис.5).

рис.5

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

рис.6

Как видно, плоскость разреза пересекла полигоны S6 и S8, и в результате вместо этих двух поверхностей мы получили четыре – S6a, S6b, S8a и S8b. Кроме того, относительно полигона S1 вся карта оказалась разбита на две самостоятельные части. Причем одна из них (фронтальная) находится полностью с лицевой части полигона S1, а вторая (тыльная) – полностью с оборотной стороны.

Теперь собственно о древе. Как мы уже определились, в качестве корня древа выступает полигон S1. Изобразим корневой нод S1 и пару исходящих из него связей с двумя нодами более низкого порядка (рис.7). Слева от нода S1 будем размещать полигоны фронтальной части карты, а справа – тыльной, поэтому соответствующие линии-связи обозначим буквами "Ф" и "Т".

рис.7

Рассматривая две полученные части карты по отдельности, выберем в каждой из них некий главный полигон, после чего в обеих частях осуществим описанную выше операцию разбиения. При этом заметим, что поскольку полигон S1 в древе уже учтен, он не входит ни в одну из двух рассматриваемых частей. Пусть во фронтальной части в качестве корня выбран полигон S5, а в тыльной – S2. В этом случае разбивка карты примет вид, показанный на рис.8.

рис.8

Как видно из рисунка, тыльная по отношению к S1 часть карты оказалась, в свою очередь, разбита надвое плоскостью полигона S2, причем полигон S7 также разделился на два полигона – S7a и S7b. Вместе с тем, фронтальная по отношению к S1 часть изменений не претерпела, т.к. она вся находится по одну сторону (собственно, лицевую) от секущей плоскости полигона S5.

Разместим выбранные два локальных корня S5 и S2 в нашем древе в качестве двух подчиненных ноду S1 (рис.9).

рис.9

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

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

рис.10

рис.11

Изложенный выше процесс рекурсивного разбиения пространства карты на две части (т.е. двоичного разбиения) и определяет название технологии – Двоичное разбиение пространства, по-английски Binary Space Partitioning (сокращенно – BSP). Полученное же в результате древо именуется древом BSP (BSP Tree).

Деревянное рисование

Теперь о том, как с помощью "выращенного" BSP-древа определить порядок прорисовки полигонов карты в зависимости от местоположения наблюдателя. Для наглядности рассмотрим пару примеров.

Пусть точка наблюдателя V1 расположена так, как показано на рис.12.

рис.12

Начнем анализ с корневого нода древа. Так как точка наблюдателя находится с лицевой стороны полигона S1, то логично утверждать, что сначала следует прорисовать полигоны, находящиеся с тыльной стороны S1, затем сам полигон S1, ну а потом уже иметь дело с полигонами, которые расположены спереди S1. Для лучшего запоминания такого порядка нанесем на древо в районе нода S1 соответствующую стрелку (рис.13) – она будет определять порядок как бы "прохождения" нода S1.

рис.13

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

рис.14

Теперь по полученной схеме определяем порядок прорисовки поверхностей карты. Начнем с корня древа нода S1. Для того, чтобы его пройти, как видно по стрелке, необходимо сначала пройти нод S2, затем прорисовать сам полигон S1, после чего пройти нод S5. Чтобы, в свою очередь, пройти по стрелке нод S2, нужно пройти нод S6b, затем прорисовать полигон S2, после чего пройти нод S3. Восстанавливая подобным образом логическую цепочку для всего древа, получим следующую последовательность прорисовки полигонов карты:

S6b – S7b – S2 – S7a – S8bb – S3 – S4 – S8ba – S1 – S5 – S6a – S8a

Заметим, что нас совершенно не интересуют полигоны, которые расположены тыльной стороной к точке наблюдения – все равно их не будет видно. Таким образом, удалив из указанной выше последовательности полигоны S2 и S3, получаем окончательный порядок прорисовки поверхностей:

S6b – S7b – S7a – S8bb – S4 – S8ba – S1 – S5 – S6a – S8a

Для полноты картины рассмотрим еще один вариант местоположения наблюдателя, – пусть он находится в точке V2 (рис.15).

рис.15

Произведя описанный выше анализ ориентации поверхностей по отношению к точке наблюдателя, получаем соответствующую схему прохождения нодов древа (рис.16).

рис.16

Действуя и далее по аналогии с предыдущим случаем, определяем искомый порядок прорисовки полигонов:

S5 – S6a – S8a – S6b – S7b – S8ba – S3 – S7a – S8bb

Оптимизация древа

Таким образом, BSP-древо позволяет движку корректно и быстро определять последовательность, с которой следует прорисовывать поверхности трехмерной карты.

Вместе с тем, сам по себе порядок внесения полигонов в BSP-древо является в общем случае произвольным. Поэтому для одной и той же карты можно построить множество вариантов BSP-древа, при этом мы получим не только разнообразие архитектуры (т.е. формы) древа, но также и разное количество нодов. Если, например, в нашем случае при построении древа полигоны вносить в последовательности S5; S6; S7; S8; S4; S3; S2; S1, то в результате ветвление линий-связей всегда будет идти в одну сторону (т.е. либо во фронтальном, либо в тыльном направлении), причем не произойдет ни одного дополнительного разбиения существующих поверхностей, количество нодов будет равно восьми (против двенадцати в предыдущем случае), а BSP-древо примет "линейный" вид (рис.17).

рис.17

От того, какой именно вариант древа избран в качестве рабочего, зависит быстродействие движка.

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

Чем дальше в лес…

Подводя итог данной работы хотелось бы заметить, что применение BSP-технологии делает возможным реализацию ряда дополнительных способов оптимизации работы 3D-движка. Среди них метод на основе применения блоков визуальности (виз-блоков), позволяющий отсекать целые группы заведомо невидимых полигонов, а также использование так называемых HINT-брашей, с помощью которых можно влиять на процесс автоматизированного BSP-разбиения при компиляции.

BSP-древо весьма эффективно сочетается с так называемым глобальным усечением (global clipping). Дело в том, что наш взгляд (как в реальности, так и в компьютерном мире) не является панорамным, он ограничен неким объемным сектором обзора. Поэтому при обработке конечного изображения трехмерной сцены вполне можно отбросить выпадающие из поля нашего зрения участки карты. Соответствующий процесс фильтрации невидимых частей называется глобальным усечением и происходит он заметно быстрее с использованием древа BSP.

Как говорил Козьма Прутков, нельзя объять необъятное. Также и в рамках одной статьи невозможно рассказать обо всех нюансах BSP-ориентированного движка. В заключение лишь добавлю, что технологию двоичного разбиения пространства изобрели и впервые опубликовали в 1979-1980 годах три техасских ученых – Генри Фукс (Henry Fuchs), Зви Кедем (Zvi Kedem) и Брюс Нейлор (Bruce Naylor).

Чем они, несомненно, заслужили нашу признательность и уважение.


Первые шаги на пути к нирване картостроения
Автор: EuGenius

Сначала по традиции немного слов о том, что же вы прочтете в этой статье. Из нее вы не узнаете, как сделать воду или дерево на карте. Из нее вы также не узнаете о разных приемах, которые помогают сделать карту более красивой. Кроме того, вы даже не узнаете, что представляет из себя браш. "Так что же тогда?", - спросите вы. Отвечаю: это - вводная статья. В ней пойдет речь о том с чего начать, с чего можно начать и о способах начинания того, с чего нужно начать...

Располагайтесь по удобнее. Мы начинаем...
И так, с чего же все обычно начинается? Все начинается с возникновения желания научиться делать карты для любимой игры (конечно же, для CS). Но не просто так, а с определенной целью. Я делю эти цели на 4 группы:

1. Создание ремейка известной карты (cs_assault, de_dust, cs_estate...) Ну, здесь все понятно. Если вы уже довольно опытный игрок и пробегали не один час на этих уровнях, то у вас естественно возникают некоторые идеи по поводу той или иной карты ("... а хорошо бы на ассаулте выкинуть к черту мост, сделать подземный ход прямо к заложникам и добавить окон в ангар..."). Все это конечно хорошо, но начинать, пожалуй, стоит не с этого. Довольно трудно поначалу сделать уровень хоть немного похожий на оригинал. Почему? Об этом немного позже...

2. Создание карты, действие которой происходит в своей школе/институте или в компьютерном клубе (в котором насижено уже ой сколько часов). Надо признаться, это тоже не самая лучшая идея. Да, конечно, идея сделать карту de_oko_za_oko, где главной целью терроров было бы взорвать кабинет_директора/деканат_института или cs_ee_zvali_nikita, где контры должны вытащить техничку, запертую в WC, безусловно интересна. Но сделать такую карту тоже очень и очень не просто. Вернее сделать то можно, но сходство с реальным объектом будет минимально ввиду отсутствия каких либо навыков в маппинге. Но ведь это сходство и является главной фишкой карты, без которой она теряет 80% интересности. Но когда появится опыт (а опыт появляется, как правило, тогда, когда начинаешь четко понимать, что ту или иную идею сможешь реализовать, а другую - нет), то можно вернуться к этому замыслу и сделать все на высшем уровне. Да сделать так, что на этой карте будет интересно играть не только учащимся этой школы/института или посетителям компьютерного клуба, а и тем, кто эти заведения ни разу не видел.

3. Создание карты, которая лишена всякого сценария и представляет собой арену для боя. Обычно эти карты не балуют игрока командной игрой и уж тем более какими-либо графическими красотами. Игровой процесс представляет из себя жесткий дезматч. В большинстве случаев это - карты типа OneRoom (одна большая комната с деталями в виде ящиков, перегородок и т.п). Реже встречается разновидность этих типов карт - "арена с фичами и приколами". Ну, например, пол карты - двигающиеся платформы. Или вся разборка происходит в воде, а игроки должны успеть скупиться, пока падают. Или в стены вмонтированы огромные вентиляторы... Надо сказать, что для того, чтобы сделать такую карту, глубоких познаний и навыков в маппинге не требуется. Достаточно лишь мысленно представлять себе эту карту. С создания подобных карт большинство и начинают.

4. Создание новой карты с сюжетом.

Довольно редко кто старается сразу сделать карту со смыслом и сюжетом (пункт 4), пусть даже и заезженным. В основном, все проходят через один из первых трех пунктов. Просто созданные ремейки/арены/школы редко получаются удачными. И это понятно - ведь в процессе создания этих карт происходит освоение редактора, основных приемов. Более того, эти карты чаще всего остаются незаконченными. Просто автор понимает, что лучше сделать что-то новое. Он чувствует в себе силы. Так потихоньку приходит опыт... Ну, здравствуй, четвертый пункт!
Что же дальше? А дальше, какую бы цель мы не избрали, нам нужно как-нибудь начинать воплощать в жизнь то, что мы задумали. В этом нам поможет специальный редактор карт. Этих редакторов есть несколько. Мне известны WorldCraft (Valve's Hammer Editor), QuArK, QERadiant. Для создания карт под Half-Life и его модификаций (чем CS собственно и является) больше всего подходит первый - Valve's Hammer Editor, далее VHE. Другие редакторы тоже вполне работоспособны, но использовать VHE стоит хотя бы потому, что в интернете все хелпы по созданию карт (их еще называют туториалами или туторами - от англ. tutorials) рассчитаны именно на этот редактор.

OK. Редактор скачан и проинсталлирован. Далее его нужно настроить для работы. Это не трудно. Если лень читать встроенный хелп на английском, то можно найти в ру-уа-нете статью по настройке редактора. Вот одна из них.

...Редактор настроен. Все готово для работы. Уже не терпится приступить к созданию будущего шедевра. Запускаем редактор, выбираем в меню File пункт New и ...запускается какое-то непонятное окно, разбитое на четыре маленьких окошечка. Все черное, какие-то решетки... - полный бред! "А где же контейнер как на ассаулте? А как мне сделать дом? И как тут ваще можно что-то сделать?! И что это за лампочка слева на панели?..." Да уж, не все оказалось так просто, особенно если раньше не видел 3DMax, LightWave и т.п. Но не стоит отчаиваться. На самом деле все довольно просто. Надо только почитать нужный туториал, где рассказывается про браш и элементы интерфейса редактора, и все прояснится.

Прочитали? Попробовали? Я же говорил, что это не трудно. А теперь приступим к созданию карты. Ставим на пустое место первый браш и сохраняем карту. Зачем? Если в сети произойдет скачок напряжения, а у вас нет источника бесперебойного питания, или бабушка выдернет штекер компьютера из розетки для того, чтобы включить стиральную машину или пылесос, то весь ваш труд просто исчезнет - очень обидно, особенно если работа долго не сохранялась. Не забывайте почаще нажимать Ctrl+S! Так вот, сохраняем карту: нажимаем эту комбинацию клавиш, или выбираем пункт в меню и ... опа, выскакивает до боли знакомое окно с просьбой ввести имя сохраняемого файла. Как, разве вы еще не придумали название для карты? Тогда поговорим немного об этом.
Я думаю, что название карты - одна из важнейших составляющих карты. Сами посудите: что первее всего увидит игрок? Не скриншот, не саму карту, а именно ее название. Будь то окно выбора карт для запуска сервера или хранилище карт в интернете, игрок всегда в первую очередь видит название карты. Поэтому к выбору названия карты стоит подходить серьезно. Здесь тоже есть несколько путей:

1. Тематическое название. Хорошо если вы делаете карту с определенной тематикой. Подобрать название к такой карте обычно довольно легко. Если это древний заброшенный город, то хорошо подойдет название de_ancient_town или взятое из NeedForSpeed сs_celtic_ruins и т.п. Если вы делаете карту с текстурами из cs_italy, то можно взять глобус Италии и выбрать подходящий итальянский городок для названия - de_torino, cs_neapol... В общем, что тут говорить? Тут и так все ясно.

2. Карта-ремейк. Тут тоже все просто. Пишем оригинальное название карты и приделываем какой-нибудь кусок. Так получились cs_assault_upc, сs_assault2k, cs_delta_assault. Можно лишь посоветовать писать оригинальное название впереди, а свой довесок в конце. Это для того, чтобы все карты одного семейства находились в списке рядом. Удачных вам cs_assault_water и de_aztec_v_more_krovi...

3. Карта-арена, без темы и сюжета. Ну, здесь можно задействовать всю свою фантазию. Попытайтесь придумать как можно более яркое, необычное и запоминающееся название. Не следует использовать скучные слова типа box, killer, death, и т.п. Лучше пусть это будет de_porvi_vseh_nafig или cs_i_love_ak47. Желательно, конечно, чтобы название как можно больше подходило к нутру карты.

4. Карта распространенного типа. Да, я говорю о mansion'ах, villa'х им подобных картах. Тут дать какой-то совет трудно. Естественно, вы можете использовать cs_best_mansion или de_villa2003, но вызовет ли интерес такое название? Зацепит ли оно глаз игрока, бороздящего просторы инета в поисках новой интересной карты? В общем, уверен, вы придумаете что-нибудь интересное. Думаю, что название cs_ghosthouse вполне подойдет. Надо будет только вставить на карту пару леденящих душу звуков, развесить паутину и использовать текстуры с гнилым деревом. Ну а de_proklyaty_stary_dom - самое центровое название для ру-уа-нета.

В любом случае, какое название вы ни выбрали, очень желательно удостовериться, не существует ли в природе карта с подобным именем. Для этого нужно зайти на самые большие хранилища карт в интернете (www.jolt.co.uk, www.daddeln.de) и задать поиск с придуманным названием. Если уровней с похожими именами не найдется, то можно вздохнуть с облегчением и приняться за работу.
Итак, название выбрано. А если не выбрано, то назовите как-нибудь (например, mymap), потом будет видно. Теперь начинаем класть браши. Ставим одну стену, потом вторую... стоп. А какого размера они будут на готовом уровне? Меня это сначала тоже очень озадачило. Вам очень повезло, так как уже есть очень хорошая статья "размеренные размеры", которую написал маппер Yarko. А когда я учился, такой статьи еще не было. Но я довольно быстро сообразил, что удобнее всего отталкиваться от размеров игрока. Если у вас нет halflife-cs_expert.fgd, то настоятельно рекомендую вам его скачать, т.к. после его установки респаун игрока с кубика меняется на картинку (спрайт) (привычное изображение контра). Теперь о размере того или иного объекта на карте, будь то стена, ящик, дверной проем или что-то еще, можно судить относительно размера игрока, что довольно удобно. Что касается меня, то ваш покорный слуга всегда начинает создание карты с того, что ставит респаун игрока.

По началу довольно трудно соблюсти пропорции. И уж тем более трудно сразу браться за создание карты-ремейка, поскольку там пропорции важны как ни где. Но со временем привыкаешь, узнаешь стандартные размеры стен, и выдержка нужных пропорций перестает быть проблемой.
При создании первой карты забудьте о новых текстурах. И без них найдется много работы. Нужно ведь будет узнать, как сделать дверь, воду, дерево, свет и т.п. Также можете забыть о hint-брашах, vis-блоках и других не нужных для начинания вещах. Стоит, пожалуй, знать только о том, что нужно избегать огромных комнат с кучей мелких деталей. Потом вы поймете почему. А пока не забивайте голову подобной ерундой.

Дальше каждый создает свой уровень по-своему. У каждого свой стиль. И это хорошо, ведь благодаря этому и получаются в итоге разные и непохожие друг на друга карты. Но что делать, если что-то не получается? Лучше всего постараться разобраться самому. Поищите в интернете какие-нибудь туторы по этому поводу. Поищите ответ на форумах. Если туторы не помогли, и вы убедились, что на форумах подобная проблема не обсуждалась, то можете спросить об этом на тех же форумах в разделах "помощь" или "новички". Вам обязательно помогут. А если не помогут, а начнут "смеяться", то это всего лишь означает, что это уже заезженная тема, которая всех очень достала. Поэтому еще раз повторю: смотрите внимательно, не говорили ли об этой проблеме ранее.
Карта более-менее закончена. Компилируется нормально. Все работает. И вам естественно хочется поделиться плодами своей работы с остальными. Перед тем, как показывать карту друзьям, и уж тем более на форумах (тем более на мапперских), обязательно ее нужно протестировать. Самый лучший вариант - боты. Для ботов, ясен пень, нужны вейпоинты (waypoints - пути, по которым бегают боты). Если уж вы освоили редактор и сделали карту, то разобраться в том, как делаются вейпоинты, вам не составит никакого труда. Я в этом уверен. Есть хорошая статья по созданию вейпов, в которой все предельно ясно. К тому же наличие путей для PODBot'а в архиве с картой добавляет ей прилично очков при просмотре. Ведь игрок сможет не только посмотреть уровень, а и опробовать его в деле (для этого же вы создавали карту, в конце концов). Но вернемся к тестированию... Вейпоинты готовы. Первым делом, я думаю, стоит проверить, нормально ли игроки появляются на карте. Как? Очень просто. Стартуем карту, выбираем режим spectator и впускаем на уровень ботов. Запускаем ровно столько ботов, сколько у вас точек появления игроков (respawn'ов). И если некоторые из подопытных дохнут сразу в начале раунда, то это значит, что вы слишком близко друг к другу поставили респауны. А если игроки застревают в полу или в стенах при появлении, значит, нужно точки появления игроков поставить подальше от этих стен, или поднять чуть выше над полом... Хорошо для проверки баланса запустить ботов и дать им поиграть самим. И если вейпы сделаны нормально, и боты нигде не цепляются, то обратите внимание на счет. Если у одной из команд слишком большой перевес в счете, то об этом стоит задуматься. Посмотрите, в каком месте встречаются команды, и почему у одной из них такой перевес. Попытайтесь это исправить. После такого тестирования карта уже будет намного лучше. Тогда можно и показать...
Лучше всего запаковывать карты в zip-архив. Это оптимальный вариант для интернета. Ни в коем случае не создавайте самораспаковывающихся exe-архивов. Они обычно вызывают недоверие со стороны игроков. "Мало ли какой там вирус может быть", - поэтому используйте всегда zip. Положите туда саму карту, вейпоинты, ну и можно маленький текстовый файл с таким названием: mapname.txt. Где mapname - имя вашей карты. В этом текстовике можете написать название карты, имя автора карты, e-mail автора карты и т.п. Писать нужно обязательно английскими буквами. Поскольку русский текст будет виден только обладателям русифицированных версий CS, коих, поверьте, очень мало. Остальные же увидят набор закорючек.

Запаковали? Ну и отлично! Теперь надо выложить карту где-нибудь в интернете. Это нужно для того, чтобы вы могли дать ссылку на скачивание на форуме (или друзьям). Есть много бесплатных хостов. Найдите подходящий, зарегистрируйтесь там и получите свой сайт. Теперь осталось только закачать туда свой zip-файл с картой.

Теперь, когда карта создана, дополнена вейпоинтами, протестирована, правильно запакована и благополучно выложена в интернет, можно отправиться на один из форумов и представить там свою работу. Но будьте готовы к тому, что ваша карта может вызвать критику. Критиковать могут все подряд. Но если вы протестировали карту перед этим, то вероятность гневной критики резко снижается. А если уж это и произошло, то примите к сведению все замечания и постарайтесь все исправить. В конце концов, критика, пусть даже гневная и неприятная, намного лучше, чем когда тебя не замечают вовсе...
Ну вот. Первые шаги сделаны. Теперь вы - маппер. У вас за плечом есть карта, а может уже и не одна. А если нет, так чего же вы ждете?! Это же так прекрасно - создавать свои миры!

На этом разрешите откланяться.


Делаем вэйпоинты (часть 1)
Автор: LLIHULLEJIb

Просьбы помочь сделать вэйпойнты или объяснить, как они делаются, возникают постоянно. Это понятно: допустим, человек сделал свою карту, показал её друзьям, отнёс в ближайший клуб, где она особым успехом не пользуется, и дальше судьба этой карты практически определена. Другой вариант: все стандартные карты поднадоели, а к менее известным картам вэйпойнтов нет. В обоих случаях выход один: сделать вэйпойнты к карте самому и играть с ботами. Распространено мнение, что боты играют тупо, и на них разве что можно тренировать точность стрельбы. В общем-то, это отчасти верно, но отчасти это зависит и от того, насколько удачные вэйпойнты вы используете. Сделать игру с ботами столь же интересной, как с людьми, сейчас, увы, невозможно, но зато вполне возможно сделать её достаточно интересной, чтобы появилось желание играть. И большей частью это зависит от того, насколько грамотно сделаны вэйпойнты.

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

По сути дела, если вы собираетесь сделать вэйпойнты к карте, то перед вами стоят две взаимоисключающие задачи: сделать вэйпойнты качественно и сделать вэйпойнты быстро. В какую сторону склоняться - решать вам. В зависимости от этого время, потраченное на создание, будет лежать в диапазоне от 2 до 10 часов, что требует большого терпения, но если вы создаёте карты для CS, то, безусловно, этим качеством обладаете. К тому же даже в самом худшем случае по крайней мере половину из этих десяти часов вам придётся провести в игре с ботами с целью выявления небольших ошибок, на исправление которых уйдут считанные минуты. Вообще, алгоритм создания вэйпойнтов таков:

1. Знакомство с картой или игра на ней с людьми, что предпочтительнее.
2. Непосредственное создание вэйпойнтов.
3. Тестирование вэйпойнтов с одним ботом.
4. Тестирование вэйпойнтов в игре.

Обязательным по сути дела является только пункт номер 2. Это как раз и есть тот случай, когда на всё дело уйдёт 2-3 часа. Однако результат может оказаться таким, что вы в вэйпойнтах только разочаруетесь, а если нет, то особого удовольствия от игры с ботами не получите. (Возможны удачные варианты, но только как исключения.) Пункт номер 1 является ключевым для создания именно интересных вэйпойнтов. Дело в том, что "интересность" игры определяет на 90 процентов грамотная организация тактики. Поэтому вы должны хорошо знать, какая из сторон первой успевает добежать до определённого места, какие позиции выгоднее всего занимать сторонам, насколько легко эти позиции удерживать и т.д. Если вы играли с людьми на этой карте, то всё это должны были прочувствовать на себе, поскольку делали это сами и видели, как и что именно делают другие. В этом случае вам известна оптимальная тактика, и при конструировании вэйпойнтов остаётся только её учитывать. Если же вам не приходилось играть с людьми, то лучше всё-таки сделать это; в противном случае многие тактические тонкости могут быть не учтены, так как вам многое придётся додумывать самому. Впрочем, я понимаю, что это не для всех людей может быть важно, поэтому решать в конечном итоге вам.

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

Резюме WaypointsHowToDo.html

В данном разделе собрана основная информация, содержащаяся в стандартном описании (WaypointsHowToDo.html). Подчёркиваю, что это не перевод, а вольное изложение теории, с небольшими изменениями и дополнениями.

Итак, вэйпойнты - это точки (набор трёх координат), которые используются ботами для ориентации при движении по карте. С их помощью боты узнают о том, на каких местах карты надо чаще бывать, какие выгодные позиции можно занимать, просчитывают кратчайшие и безопасные маршруты к интересующему их месту, а также ориентируются в окружающем пространстве, не натыкаясь на стены и не падая с высоты. Чтобы перейти в режим редактирования вэйпойнтов, необходимо в консоли набрать "waypoint on". Существует возможность загрузки встроенного чита командой "waypoint on noclip", который позволяет летать сквозь стены, что иногда полезно при редактировании, а в некоторых случаях и незаменимо. Команда "waypoint off" выключает режим редактирования. Во время редактирования вэйпойнтов запрещено загружать ботов на сервер - это чревато зависанием. (Хотя это можно делать, если соблюдать осторожность; об этом ниже.)

Вэйпойнты изображаются вертикальными линиями разных цветов. Само понятие "точка" относится к центру этой линии. Цвет линии зависит от назначения вэйпойнта:

Цвет линии | Название вэйпоинта | Описание вэйпоинта
Зеленый | Normal Waypoint (Обычная точка) | Служит для ориентации бота в пространстве. Когда бот бежит по какому-нибудь маршруту, он пробегает именно по таким точкам. У этих точек есть и другие функции, они рассматриваются ниже.
Красный | "Terrorist Important Waypoint" (Главная точка для террористов) | Установленная такая точка говорит о том, что это место является важной позицией с тактической точки зрения для террористов. Поэтому террористы будут стремиться бегать к таким точкам.
Синий | "Counter Important Waypoint" (Главная точка для контр-террористов) | Описание аналогично предыдущей точке, за исключением стороны.
Сиреневый | Ladder Waypoint (Лестничная точка) | Размещается на лестницах.
Сиреневый | Goal Waypoint (Основная точка карты) | Служит для указания ботам, что в этом месте можно выполнить основное задание карты, в зависимости от её типа: найти заложников, заложить бомбу или, будучи VIP, спастись.
Белый | Rescue Waypoint (Точка спасения заложников) | На CS-картах указывает боту, что сюда нужно привести заложников для их спасения.
Голубой | Camp Waypoint (Кемперская точка) | Указывает боту, что это место довольно безопасное, так что на нём можно спрятаться от врага. Можно также покемперить.
Бело-алый | Camp Waypoint (Кемперская точка для террориста) | То же, что и предыдущая точка, но только для террориста. Имеет смысл использовать там, где обычно устраивается засада.
Бело-фиолетовый | Camp Waypoint (Кемперская точка для контр-террориста) | То же, что и предыдущая точка, но только для контр-террориста.

Следующие команды позволяют управлять вэйпойнтами:

waypoint add - поставить точку в то место, где сейчас находитесь вы. Появляющееся меню позволяет уточнить тип точки.

waypoint delete - удалить ближайшую к вам точку. Она удалится в том случае, если вы находитесь достаточно близко к ней (в пределах 40 юнитов).

waypoint find x - показать направление к точке с номером x. Действие данной команды отключается вводом значения x = -1.

waypoint teleport x - мгновенно переместиться на точку с номером x. Правда, команда немного глючит: иногда, появляясь на новой точке, вы не можете двигаться, и в этом случае приходится использовать чит waypoint on noclip.

Существует способ расставлять точки автоматически. Включить его можно командой "autowaypoint on", выключить, соответственно - "autowaypoint off". А набрав "autowaypoint", вы получите информацию о том, включён ли в данный момент этот режим. Смысл автоматической простановки точек заключается в следующем: в этом режиме идёт постоянная проверка, есть ли точки, находящиеся от вас не дальше, чем на 200 юнитов. Если таких точек нет, то автоматически на этом месте ставится новая обычная точка. Таким образом, если вы побежите по прямой там, где нет точек, они будут автоматически проставляться через каждые 200 юнитов. На мой взгляд, этот режим совершенно бесполезный. Большинство точек, даже обычных, необходимо расставлять в определённых местах, а не через 200 юнитов. Кроме того, на прямых расстояние между точками может быть и больше, чем 200 юнитов, а в некоторых местах вэйпойнты приходится ставить очень близко. Так что пользоваться этим режимом не рекомендую.

Каждая точка может иметь несколько свойств. Во-первых, любая точка имеет количественную величину, которая называется Waypoint Radius (радиус). Радиус точки позволяет боту при движении пробегать не непосредственно через точку, а чуть в стороне от неё. Радиус принимает значения от 0 до 128 и при добавлении новой точки устанавливается автоматически, исходя из информации о расположенных рядом стенах и других препятствиях. Радиус может быть ненулевым только у обычных и главных точек, для остальных типов он должен быть равен нулю.

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

waypoint setradius x - установить радиус ближайшей точки равным x, x = 0..128.

waypoint calcall - вычисляет оптимальные радиусы у всех точек на карте. Команда пришла из старых версий, и сейчас её использовать не нужно, потому что оптимальный радиус автоматически проставляется, когда вы ставите новую точку.

waypoint showflags - показать установленные флаги для точки.

waypoint addflag - установить флаг для ближайшей точки. вызывает соответствующее меню. Наряду с флагом "Block With Hostage" для кемперской точки доступны ещё два флага, которые изменяют тип кемперской точки. С помощью этих флагов можно превратить кемперскую точку в кемперскую точку для террористов или в кемперскую точку для контр-террористов. Так что эти два флага по сути дела не являются флагами: они задают способ поменять тип точки.

waypoint delflag - команда, обратная предыдущей. Удаляет флаг у ближайшей точки, при этом вызывает соответствующее меню.

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

Пути могут быть односторонними и двухсторонними. Односторонний путь показывает, что от точки 1 можно пробежать к точке 2, но обратно напрямик вернуться запрещено. Такой путь изображается белой горизонтальной линией между точками, если стоять вблизи точки 1, и не изображается никак, если стоять вблизи точки 2. Односторонние пути нужны, например, там, где можно спуститься на более нижний ярус, но обратно подняться напрямик нельзя, даже в прыжке. Двухсторонний путь, существующий между точками 1 и 2, означает, что разрешено движение между точками 1 и 2 в любом направлении. Он обозначается жёлтой линией между точками 1 и 2, вне зависимости от того, вблизи какой из этих двух точек вы стоите.Пути проставляются автоматически при создании новых точек. Обычно точка автоматически соединяется двухсторонними путями с точками, находящимися поблизости от данной. Однако часто бывают ситуации, когда пути автоматически проставляются неправильно или не так, как вам бы этого хотелось. Поэтому очень большая часть времени уходит на то, чтобы править пути вручную.

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

Формально пути можно разделить на три вида. Первый вид - это обычный путь, который говорит боту о том, что между точками, соединяющимися этим путём, нет препятствий. В результате по такому пути бот просто перебежит от одной точки к другой. Второй вид путей - путь с прыжком. Count Floyd (автор PODBot’ов, прим. ред.) описывает это не как путь, а как Jump Waypoint (Прыговая точка), но с точки зрения пользователя это вовсе не точка, а путь. Такой путь изображается красным, а не жёлтым (белым) цветом, и говорит боту о том, что для достижения следующей точки необходимо совершить прыжок. Наконец, третий вид пути - путь с приседанием. В описании, опять же, это представлено не как путь, а как свойство точки. Однако по своей сути это опять же является путём, поскольку, если, допустим, точка 1 - нормальная, а точка 2 сделана с приседанием, то движение бота будет следующим. Он добежит до точки 1, далее присядет, доползёт до точки 2, на ней встанет и побежит дальше. Таким образом, все пути, приходящие в точку 2, можно считать путями с приседанием. Такие пути изображаются белым или жёлтым цветом, то есть так же, как обычные, но сама точка, к которой надо ползти, изображается вдвое укороченной вертикальной линией. Такая точка ставится в положении "присев". Важно, кстати, заметить, что к кемперским точкам невозможно провести путь с приседанием. Сделать кемперскую точку в положении "присев", конечно, можно, но для кемперской точки это означает совсем другое: то, что бот, который прибежит на эту точку, должен кемперить сидя, а не стоя.

С помощью следующих команд можно редактировать пути:

pathwaypoint on - включить показ путей и радиусов точек.

pathwaypoint off - действие, обратное предыдущей команде.

pathwaypoint - показать, включён или выключен показ путей и радиусов точек. Непонятно, правда, какой в этой команде смысл.

pathwaypoint add x - соединить ближайшую к вам точку обычным путём с точкой, имеющей номер x.

pathwaypoint delete x - удалить путь от ближайшей точки к точке с номером x.

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

Создаваемые вами вэйпойнты сохраняются в файлах, имеющих название карты и расширение pwf. По умолчанию вэйпойнты сохраняются в директорию …\cstrike\PODbot\WPTDefault. Существуют следующие команды управления всеми вэйпойнтами:

waypoint load - считать данные о вэйпойнтах из файла и проинициализировать их.

waypoint save nocheck - сохранить данные о всех вэйпойнтах в файл.

waypoint check - сделать проверку работоспособности вэйпойнтов. По этой команде проверяется возможность пробежать от каждой точки ко всем остальным.

waypoint save - сделать проверку работоспособности вэйпойнтов и сохранить их в файл. Играть с ботами можно только на вэйпойнтах, сохранённых подобным образом, в противном случае могут появиться проблемы.

waypoint stats - вывести статистику по вэйпойнтам.

При сохранении вэйпойнтов ваш ник сохраняется как имя автора вэйпойнтов. При поверке на ошибки и инициализации (то есть при использовании команд waypoint save, waypoint check и waypoint load) компьютеру необходимо совершить огромное число вычислительных операций, из-за чего в течение некоторого времени КС будет находиться в "подвисшем" состоянии. В зависимости от числа точек и мощности процессора это состояние может длиться до минуты.

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

Удобный конфиг

Чтобы сделать вэйпойнты быстро, вам необходимо забиндить основные команды редактора вэйпойнтов. В этом случае не придётся запоминать большинство вышеописанных команд. Лучше всего создать отдельный файл с биндами и прочими настройками (его можно назвать, например, wptedit.cfg) и перед началом редактирования вэйпойнтов подгружать его командой exec. Вот образец такого файла:

alias clmenu "wait; wait; slot10; wait; wait; slot10; wait; wait; slot10; wait; wait; slot10"
alias dev1 "developer 1"
alias dev0 "developer 0"
bind "F2" "waypoint save"
bind "F3" "waypoint load"
bind "F4" "waypoint save nocheck"
bind "F5" "dev1; wpon; wait; wait; dev0"
alias wpon1 "waypoint off; wait; waypoint on; alias wpon wpon2"
alias wpon2 "waypoint on noclip; alias wpon wpon1"
wpon1
bind "F6" "dev1; awpon; wait; wait; dev0"
alias awpon awpon1
alias awpon1 "autowaypoint on; alias awpon awpon2"
alias awpon2 "autowaypoint off; alias awpon awpon1"
bind "F7" "dev1; pfwon; wait; wait; dev0"
alias pfwon1 "pathwaypoint on; alias pfwon pfwon2"
alias pfwon2 "pathwaypoint off; alias pfwon pfwon1"
pfwon1
bind "F8" "dev1; waypoint stats; wait; wait; dev0"
bind "F9" "addbot 0 1"
bind "F10" "addbot 0 2"
bind "F11" "sv_restartround 1"
bind "F12" "dev1; waypoint showflags; wait; wait; dev0"
bind "Del" "waypoint delete"
bind "End" "waypoint delflag"
bind "Ins" "waypoint add; menuselect 1; clmenu"
bind "[" "waypoint add; menuselect 2; clmenu"
bind "]" "waypoint add; menuselect 3; clmenu"
bind ";" "waypoint add; menuselect 4; clmenu"
bind "'" "waypoint add; menuselect 5; clmenu"
bind "," "waypoint add; menuselect 6; clmenu"
bind "." "waypoint add; menuselect 7; clmenu"
bind "/" "waypoint add; menuselect 8; clmenu"
bind "\" "waypoint add; menuselect 9; menuselect 1; clmenu"
bind "Home" "waypoint addflag; menuselect 1; clmenu"
bind "PgUp" "waypoint addflag; menuselect 2; clmenu"
bind "PgDn" "waypoint addflag; menuselect 3; clmenu"
bind "KP_INS" "waypoint setradius 0"
bind "KP_END" "waypoint setradius 16"
bind "KP_DOWNARROW" "waypoint setradius 32"
bind "KP_PGDN" "waypoint setradius 48"
bind "KP_LEFTARROW" "waypoint setradius 64"
bind "KP_RIGHTARROW" "waypoint setradius 80"
bind "KP_HOME" "waypoint setradius 96"
bind "KP_UPARROW" "waypoint setradius 112"
bind "KP_PGUP" "waypoint setradius 128"
alias grav1 "sv_gravity 80; dev1; echo GRAVITY=80; dev0; alias grav grav2"
alias grav2 "sv_gravity 800; dev1; echo GRAVITY=800; dev0; alias grav grav1"
alias grav grav1
bind "g" grav
bind "SPACE" "waypoint delete; waypoint add; menuselect 1; clmenu"
mp_timelimit 240
mp_roundtime 9
mp_freezetime 0
debuggoal -1
waypoint find -1
dev1
echo "Ready for waypointing!"
wait
dev0

С помощью этого конфига вы получаете следующие возможности:

F2 – проверить на ошибки и сохранить вэйпойнты
F3 – загрузить вэйпойнты
F4 – сохранить вэйпойнты без проверки на наличие ошибок
F5 – переключение режима: ходить / летать сквозь стены
F6 – переключение режима: ставить вэйпойнты вручную / ставить автоматически
F7 – включение / выключение показа путей и радиусов точек
F8 – статистика по вэйпойнтам
F9, F10 – добавить бота (соответственно, террориста или контера) для тестирования
F11 – быстрый перезапуск раунда
F12 – показать флаги у данной точки
Del – удалить ближайшую точку
End – удалить один из флагов данной точки (открывает соответствующее меню)
Ins – поставить обычную точку
[ и ] – поставить главную тактическую (соответственно террористскую или контерскую) точку
; – поставить лестничную точку
‘ – поставить точку для вывода заложников
, и . (то есть < и >) – поставить кемперскую точку с указанием граничных направлений
/ – поставить основную точку карты
\ – приготовиться к постановке прыговой точки; она будет поставлена при следующем вашем прыжке
KP: 0,1,2,3,4,6,7,8,9 на правой клавиатуре – установить радиус точки соответственно в 0, 16, 32, 48, 64, 80, 96, 112 или 128 юнитов
g – переключатель гравитацию: 80/800. Полезная вещь, поскольку зачастую надо быстро попасть куда-нибудь наверх, а бежать обычным путём долго.
Пробел – подвинуть ближайшую обычную точку (симулятор). Часто бывает нужно немного передвинуть точку на небольшое расстояние, что в данном случае и можно сделать с помощью этой клавиши. Заметьте, это только аналог передвижения: на самом деле удаляется прежняя точка и ставится новая, поэтому если вы изменяли свойства точки (радиус и флаг для блокировки заложников) и редактировали пути, идущие от и к этой точке, то при таком "перемещении" точки эти данные исчезнут, и их нужно вводить заново. Если же нажать эту клавишу, когда поблизости нет ни одной точки, то она просто добавит новую точку.

Безусловно, вы можете изменить назначение клавиш так, как будет удобно именно вам. При редактировании точек многие стандартные назначения вам будут не нужны. Например, вам абсолютно не понадобится прикручивать глушители и рассматривать точки из снайперского прицела, поэтому смело можете перебиндить клавишу с командой +attack2. В то же время вам могут пригодиться такие команды как +use или радиокоманды, поэтому эти клавиши лучше не переназначать.

Некоторые команды забиндить нельзя, поскольку они используют числовые параметры. Поэтому при необходимости эти команды придётся вводить из консоли. Таких команд всего 5:

pathwaypoint add x – добавить путь от ближайшей точки к точке с номером x.

pathwaypoint delete x – удалить путь от ближайшей точки к точке с номером x.

waypoint find x – указать направление на точку с номером x (для отмены указания нужно ввести –1).

waypoint teleport x – мгновенно переместиться на точку с номером x.

debuggoal x – отправить всех бегающих ботов на точку с номером x, применяется при тестировании (для отмены этого нужно ввести –1).

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

Перед тем, как делать вэйпойнты

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

Вторая вещь, которая может повлиять на игру с ботами, - это некоторые объекты на карте, которые представляют мудрость непостижимой глубины для ботского разума. И здесь, увы, от вас ничего не будет зависеть: если, допустим, на карте есть лифт, то научить ботов пользоваться им абсолютно правильно и только тогда, когда это нужно, ни за что не получится. Именно поэтому необходимо хотя бы немного знать карту, чтобы заранее предвидеть, насколько много таких сложных объектов на карте, и как они могут повлиять на игру. Возможно, что карта вообще окажется неиграбельной для ботов. Пример такой карты - Cs_Sibiria, где существует три объекта, которые боты не умеют использовать: запертая на замок дверь, который нужно разбить, поворачивающиеся ручки-выключатели и открывающийся с задержкой люк. На карте Cs_Siege есть лифт, но правильно воспользоваться им ботам удаётся крайне редко. Помимо лифтов на поведение ботов могут влиять разные переключатели, которые боты используют от случая к случаю, не задумываясь о последствиях такого использования. Например, на Cs_Delta_Assault бот, выбегающий из ангара через главный выход, может нажать на кнопку закрытия ворот и после этого долго в буквальном смысле ломиться в закрытую дверь. С разбиваемыми объектами (func_breakable) проблем быть не должно, поскольку если путь проходит через такой объект, бот автоматически его разбивает. С объектами func_illusionary проблемы, скорее, будут у вас, поскольку боты через эти объекты всё видят, даже если они непрозрачные, и получают перед вами преимущество. Ещё один довольно опасный объект - вода, хотя, в принципе, научить ботов не тонуть очень просто, гораздо сложнее (но тоже возможно!) научить ботов погружаться, там, где это надо. И, естественно, всякие транспортные средства, как управляемые, так и нет, для ботов таковыми не являются, поэтому никакие ваши усилия не заставят ботов самопроизвольно кататься на них.

Таким образом, на данном этапе ваша задача - установить, много ли подобных объектов на карте и окончательно определиться с тем, стоит делать вэйпойнты или нет. Идеальными картами для игры с ботами можно считать такие, где практически нет никаких entities, сделанных не для красоты, а именно для их использования. Среди таких карт большинство известных: De_Aztec, De_Cbble, De_Dust, De_Dust2, De_Inferno, De_Storm, De_Train, De_Vertigo, Cs_Militia и т.д. Примеры карт, на которых обязательно будут проблемы с ботами: Cs_Mansion, Cs_Sibiria, Cs_Siege.

Как бот движется по точкам

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

Итак, вы запустили бота. Что он будет делать? Прежде всего, он выберет себе точку назначения, то есть ту точку, к которой он будет стремиться прибежать. В качестве такой точки может быть выбрана главная точка (красная или синяя), кемперская точка или основная точка карты (сиреневая), а также точка вывода заложников. Какую точку именно выбрать в данный момент - решает сам бот. Это зависит от ряда факторов, например, для бота дефенсивного типа выше вероятность выбирать в качестве точки назначения кемперскую. Вполне можно предположить, что чем больше на карте точек какого-либо типа, тем чаще боты будут бегать к этим точкам. На практике, однако, это наблюдается не так явно. Кроме того, есть ещё одна тонкость, описанная в мануале. На картах, где атакующей стороной являются террористы (DE), контр-террористам разрешено выбирать в качестве точки назначения только синие точки, и лишь иногда - красные, в то время как террористам разрешено посещать и красные и синие точки с одинаковой вероятностью. На картах, где атакуют контр-террористы (AS и CS), всё наоборот: террористам разрешено выбирать в качестве точки назначения красные точки, и лишь иногда - синие, в то время как контр-террористам разрешено бегать и к синим и к красным. То же самое касается и кемперских точек для контр-террористов и террористов. Этот факт нужно иметь в виду, однако на другое утверждение мануала - что соотношение чисел главных точек атакующей и защищающейся сторон должно быть примерно 1:2 - обращать особого внимания не стоит. Обычно примерно так и получается при грамотной расстановке главных точек, но если соотношение будет другим - ничего страшного в этом не будет.

Итак, бот выбрал себе точку назначения. Дальше он просчитывает маршрут, каким он к этой точке побежит, то есть определяет номера точек, через которые надо пробежать, чтобы достичь точки назначения. Маршрут выбирается обычно самым минимальным по расстоянию. Это приводит к тому, что, например, террорист, решивший заложить бомбу, будет бегать к месту закладки всё время одним и тем же маршрутом, то есть через одни и те же точки. Правда, боты пытаются разнообразить свои маршруты, это, скорее всего, сделано для того, чтобы боты как можно реже врезались друг в друга. Делается это в том случае, если два бота выбрали в качестве точки назначения одну и ту же точку, или просто на каком-то этапе маршруты ботов совпадают, и им предстоит бежать часть пути по одним и тем же точкам. В этом случае боты могут выбирать и не минимальный маршрут; а там, где возможно, они бегут по соседним точкам, расположенным недалеко друг от друга. Если таких точек нет, то нет и альтернативизации маршрута.

Таким образом, точка назначения выбрана и составлен маршрут достижения этой точки. Оба эти процесса происходят очень быстро. Сразу после этого бот начинает двигаться в соответствии с маршрутом от одной точки к другой. Когда он достигает точки назначения, он тут же придумывает себе другую точку назначения, составляет маршрут движения к ней и бежит. Так, предоставленный сам себе, он будет бесконечно патрулировать карту. Если вы разрешаете ботам использовать файлы опыта (.PXP) для каждой карты, то в этих файлах сохраняется информация об опасности каждого маршрута по критерию, в скольких случаях бот, двигаясь по данному маршруту, смог достигнуть точки назначения.

Отдельно следует сказать про движение ботов, которые выполняют миссию карты. На DE-картах бот, имеющий в самом начале раунда бомбу, всегда придумывает в качестве точки назначения основную точку карты и бежит закладывать туда бомбу. Поэтому его маршрут движения всегда один и тот же. Но если бот подберёт обронённую бомбу, то он не сразу побежит к месту закладки. Сначала он достигнет той точки назначения, которая была задумана им до этого, а уж после побежит закладывать бомбу. На CS-картах история практически такая же. Бот, решивший спасать заложников, бежит к основной точке кратчайшим путём. Забирая заложников, бот двигается на точку спасения заложников также кратчайшим путём. Но если бот увидит заложников, стоящих на его дороге, то он их заберёт (Любят боты-контры заложников, даже у людей всегда их отбирают!), но не сразу побежит спасать. Сперва он добежит до точки, которую задумал раньше. Причём в этом случае возможен достаточно серьёзный глюк, связанный с тем, что при таком движении боты совершенно не реагируют на флаги точек "Блокировать с заложниками". Поясню на примере. Допустим, на карте Cs_Assault один проворный бот выводил заложников, но был застрелен закемперившимся терром недалеко от места спасения. Мимо измученных заложников пробегал другой контр, отомстил терру-кемперу за товарища и забрал заложников с собой. Казалось бы, до места вывода - рукой подать. Но не тут-то было, оказывается, контр в качестве точки назначения задумал точку, находящуюся где-нибудь внутри ангара, да ещё и на втором этаже. И пока он до той точки не добежит, он заложников отводить не пойдёт. Да к тому же кратчайший маршрут контра будет пролегать по вентиляционной трубе, где у всех точек расставлен флаг "Блокировать с заложниками". Но контр на этот флаг никак не среагирует, потому что с его точки зрения в данный момент он заложников не выводит, хотя они и бегут за ним. В результате заложники застрянут у входа в вентиляцию, а контр, достигший задуманной им точки, выберет в качестве точки назначения точку спасения заложников и побежит к ней. На этом примере явно видна одна из недоработок программы POD-Bot.

Что касается AS-карт, то там VIP также бегает к точке спасения одним и тем же путём, кратчайшим с его точки зрения. Однако на AS-картах есть способ заставить VIP бегать разными дорогами! (Об этом ниже.) На DE и CS-картах этот способ не работает.

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

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

Этот эффект - прыжок и приседание бота при невозможности достичь точки обычным способом - можно и нужно широко использовать. Вовсе необязательно ставить прыговой путь там, где боту нужно совершить прыжок, достаточно соединять точки обычным путём. На рисунке 1 представлен пример такого места, где вместо прыгового пути поставлен обычный.

Рисунок 1

При движении бот на некоторое время (0,5 секунды) останавливается перед верхним ящиком, но потом запрыгивает на него. Аналогично для пути с приседанием. Например, выше было сказано, что любая точка, поставленная с приседанием, будет означать, что все пути, идущие к этой точке, являются путями с приседанием. Это действительно для всех типов точек, кроме кемперских, потому что кемперская точка, поставленная с приседанием, означает, что бот должен кемперить на ней сидя. А если нужно, чтобы бот не только кемперил сидя, но ещё и подходил к этой точке с приседанием? В подавляющем большинстве случаев для этого не нужно ничего дополнительно делать. Потому что бот, видя, что у него не получается добежать до кемперской точки обычным способом, сам догадается присесть.

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

К объектам, которые способны заставить ботов двигаться не по точкам, относятся:

Враги. В этом случае бот отстреливается и стрейфится. Иногда на него находит агрессия, и он бежит прямо на врага, безостановочно стреляя. Чаще всего таким образом он расправляется с жертвой, но после этого он возвращается на последнюю точку, на которой увидел врага, даже если она достаточно далеко. Когда бот убегает с поля боя или прячется от врагов, он по точкам, судя по всему, ориентируется. Кроме того, Count Floyd советует ставить обычные (зелёные) точки не только на дорогах, но и в тех местах, где бот бы мог спрятаться от врага (Например, за разного рода препятствиями типа ящиков и стен.) Когда бот спасается от врага, он ищет безопасные с его точки зрения точки. Безопасными он считает кемперские точки, а также обычные, которые имеют как можно меньший радиус.

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

Бомба, лежащая на земле - для террористов, Defuser Kit - для контр-террористов.

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

Заложники - для контр-террористов. На карте Cs_Docks два заложника стоят в подвале за решёткой. Естественно, бот их видит сквозь решётку и бежит напрямик к ним. И очень удивляется, почему не может добежать. Другой пример: на Cs_Militia можно иногда видеть заложников, бегущих за контром в канализацию. Выше я писал, что заложников боты выводят всегда одним и тем же путём. В том числе и на этой карте, а в канализацию заложники попадают по другой причине: просто два заложника стоят на довольно оживлённом перекрёстке, и случайно пробегающий мимо контр-террорист не сочтёт для себя обузой их забрать. Это, кстати, и приводит к нехорошим последствиям, которые я описал выше на примере Cs_Assault.

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

Выключатели. Когда бот оказывается недалеко от выключателя, он во что бы то ни стало решит проверить, что делает эта кнопка. (Впрочем, не на все выключатели он реагирует по непонятной причине.) В результате он бежит к выключателю напрямик. К сожалению, это самый тяжёлый случай, поскольку тут бот даже не понимает, что выключатель может находиться через стену в соседней комнате или на другом этаже. К чему это приводит, думаю, объяснять не стоит. На одном только Cs_Mansion есть четыре места, где из раунда в раунд можно видеть бьющихся головой о стену ботов только лишь для того, чтобы в очередной раз включить или выключить свет. На Cs_Militia такое место - на чердаке рядом с решёткой, где бот может пытаться попасть к выключателю прямо сквозь пол, хотя прочность последнего не вызывает никаких сомнений…

Прочие объекты непонятной природы. То есть, для создателей карт они-то как раз понятны, но ботам могут приходить в голову совсем неожиданные вещи. Всякие хитрые мультипереключатели, триггеры, объекты с задержкой и прочие вещи просто не под силу ботскому разуму. В лучшем случае боты просто не будут обращать на эти объекты никакого внимания, а в худшем - начнут глючить, да так, что играть на карте станет просто невозможно. Именно поэтому вы должны быть уверены, что на вашей карте число таких объектов сведено к минимуму. В качестве примера могу привести карту De_Bahrain. На ней в одном месте на довольно оживлённой дороге висит колокол, при ударе по которому раздаётся колокольный звон. Пробегавшие мимо боты буквально сходили с ума: они начинали бросаться на этот колокол, лазили под ним, но ни ударить не догадались, ни уходить оттуда не собирались, оставаясь там до конца раунда. В результате играть в эту карту оказалось невозможным, и всё время, потраченное на создание вэйпойнтов к этой карте, оказалось потраченным зря.

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

Читать дальше...


Делаем вэйпоинты (часть 2)
Автор: LLIHULLEJIb

Продолжение. Начало в первой части...

Советы по созданию точек и путей

Наконец-то мы добрались до основного! Карта просмотрена, выучена, и объектов, способных заставить ботов глючить, нет совсем или не очень много. Можно приступать к непосредственному созданию вэйпойнтов.

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

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

Рисунок 2

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

Таким образом, принцип прост: ставим точки так, как удобней нам, и сразу проверяем пути, которые проставились автоматически. Если что не так, то лучше исправлять сразу, не оставляя на потом. Правда, здесь есть два нюанса. Во-первых, вы должны быть уверены, что вам не придётся корректировать сами точки. Если вы исправили неправильные пути, а затем решили одну из точек заменить на точку другого типа, то все ваши исправления исчезнут, поскольку при замене точки все пути, идущие к ней и от неё, проставятся автоматически заново. И вам придётся снова повторять те же операции. Отсюда становится понятным, зачем вам нужно хорошо знать карту: в этом случае вы сразу будете знать, где ставить кемперские точки, где главные, и вам не придётся впоследствии делать замены. Лучше сразу ставить точки всех типов именно туда, где они должны быть. Это тоже экономит время. Во-вторых, есть одна особенность, связанная с тем, что от одной точки не может исходить больше, чем 8 путей. Если на какой-то небольшой территории вам приходится ставить много точек, то путей на всех не хватит, и между каким-то точками, находящимися на достаточно близком расстоянии, путей не будет. В таких местах пути следует контролировать особенно тщательно. Следует убирать пути, по которым боты будут бегать редко, и оставлять самые важные.

Алгоритм действий при постановке точек примерно следующий. вы выбираете тип точки, а также сразу определяете, будут ли пути, идущие к ней, путями с приседанием. Ставите точку, используя забинденные клавиши, при необходимости предварительно приседаете. Для создания кемперских точек конкретной команды (T или CT) ставите соответствующие флаги. При необходимости ставите флаг "Блокировать с заложниками". Контролируете радиус точки, а дальше смотрите на пути, которые соединяются с данной точкой. При необходимости корректируете их командами из консоли. Необходимо проверять не только пути, исходящие из точки, но и пути, которые могут приходить в данную точку. Эти пути могут быть односторонними и поэтому с данной точки не будут видны. Чтобы их заметить, придётся пробежать по всем окрестным точкам. Поскольку после простановки каждой точки пробегать все соседние весьма утомительно, то пути лучше контролировать после простановки нескольких точек, когда вы покроете ими некоторую территорию. Таким образом, в консоль вам придётся вводить только две команды: Pathwaypoint Add X и Pathwaypoint Delete X, что весьма удобно - достаточно ввести их полностью лишь один раз. По окончании раунда можете также пользоваться командой Waypoint Teleport X, чтобы быстрее попасть туда, где вы были перед окончанием раунда. Однако не стоит часто пользоваться этой командой, поскольку обычно в среднем бежать до любой точки карты с ближайшего респауна - 10-15 секунд.

Если вы не знаете, с какого участка карты начать, то советую начать именно с двух респаунов. Поскольку боты, появляясь на респауне, заново определяют, на какой точке они находятся, следует заполнить точками весь респаун. Например, я пользуюсь командой Sv_RestartRound 1 столько раз, сколько мест рождения игроков на карте, и каждый раз ставлю на месте появления обычную точку. В итоге получается некоторая отправная база. Кстати, будьте очень внимательны с точкой, имеющей номер 0. При её удалении вас может просто выкинуть из КС. Count Floyd писал, что этот глюк исправлен, но я на собственном опыте убедился, что если он и исправлен, то лишь частично. Поэтому точку с номером 0 всегда ставьте так, чтобы не пришлось её удалить. Если вы поставите её на респауне на месте появления игрока, то тем самым обеспечите её неприкосновенность в дальнейшем.

Заполнив респауны, начинайте заполнять точками все окрестные дороги, постепенно стремясь к тому, чтобы соединить точками два респауна. Здесь всё зависит от архитектуры карты, поэтому сложно дать какие-либо практические советы. Главный совет, пожалуй, таков: ставьте точки так, как бегаете по карте сами. Например, если вы бежите по дороге и срезаете угол, то ставьте и точки точно также. Вы сами для себя должны решить, что именно вы хотите от ботов. Для меня, например, очень важно, чтобы боты как можно быстрее бежали к месту сражения. Поэтому, когда я ставлю точки, я всегда на углах ставлю их как можно ближе к углам, на прямых стараюсь точки ставить на одной прямой. На рисунке 3 (вид сверху) видна разница.

Рисунок 3

Слева показан участок дороги, на котором вэйпойнты поставлены, например, так, как они были во многих стандартных файлах. Бота, бегущего по таким точкам, обогнать очень легко, даже если он с ножом. Бота, бегущего по правому варианту, обогнать, если он с ножом, достаточно сложно, и прибегать на место сражения вы будете практически одновременно, а не с опережением на несколько секунд. Правда, у варианта, которым пользуюсь я, есть и недостатки. Главный из них заключается в том, что если на точке номер 1 или номер 3 встретятся два бота, то разбежаться им будет достаточно сложно, и они почти наверняка столкнутся. Но здесь, как я и написал выше, вы сами должны решить, что для вас важнее. Для меня важнее прибегать с ботами на место сражения одновременно.

На больших открытых пространствах вовсе не нужно ставить точки везде, где только можно. Помните, что боты используют зелёные точки только для достижения других точек. Поэтому если через какую-либо обычную зелёную точку не ведёт ни один кратчайший маршрут от одной точки назначения до другой, то боты, скорее всего, ни разу не пробегут через эту обычную точку. Выходит, что она просто лишняя. Не ставьте таких лишних точек, помните: чем больше точек, тем дольше (причём зависимость экспоненциальная) грузятся вэйпойнты, и тем больше они занимают в памяти. Стремитесь к минимизации. Приведу такой пример: на карте De_Dust в стандартном файле было около 600 точек. Когда я сделал вэйпойнты к этой карте заново, там оказалось около 450 точек, при этом значительно увеличилась "полезность" каждой из них, а следовательно, повысилось качество движения ботов. Впрочем, принцип минимизации нужно применять не везде: существуют такие места на карте, где точками приходится сорить направо и налево, но это бывает оправданно, поскольку иногда только таким способом можно заставить ботов делать красивые трюки.

Если вы затрудняетесь, какие из точек, которые вы хотите поставить, могут оказаться лишними, то попробуйте ставить точки таким нехитрым способом, который условно можно назвать "метод основных дорог". Сущность этого способа понятна из рисунка 4. Допустим, вы имеете большое открытое пространство, которое всё целиком заполнять точками бессмысленно. Представьте, как вы бы пересекали это пространство, если бежали бы, например, со стороны хода 1 к ходу 2, и создайте соответствующую линию из вэйпойнтов. Затем аналогично постройте линии от хода 2 к ходу 3 и от хода 3 к ходу 1. В результате у вас получились кратчайшие дороги, которыми и будут пользоваться боты, пересекающие данную местность. (Показаны толстыми линиями.) Теперь, если это можно и нужно, вы можете поставить несколько дополнительных точек, которые будут способствовать разнообразию движения ботов, если они бегут в паре. Если какие-нибудь области получаются слишком пустыми, то их тоже можно заполнить точками, ставя их не очень часто, практически на максимальном расстоянии, на котором они будут автоматически соединяться путями с соседними точками.

Рисунок 4

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

Ещё одна вещь, о которой вы должны помнить, оставляя пустые пространства, - это то, что во время битвы боты, стрейфясь, могут перебежать на это пустое пространство и в итоге по окончании битвы не найти точки. По собственному опыту могу сказать, что такого я пока не замечал. Например, если на рисунке 4 не заполнять точками весь оставшийся левый верхний угол, то ничего страшного, наверное, не будет. Если только на этом месте часто происходят столкновения противоборствующих сторон и проводятся решающие бои, то несколько точек там лучше всё-таки поставить.Когда вы ставите новую точку, ей автоматически проставляется радиус. Радиус может быть в диапазоне от 0 до 128, хотя опытным путём установлено, что против ввода отрицательных значений программа не возражает. Автоматически проставляемый радиус если и следует корректировать, то только в сторону понижения. Если вы пользуетесь "методом основных дорог", то большие радиусы могут привести к вихлянию ботов из стороны в сторону, поэтому для этих точек радиусы лучше уменьшать примерно до 48.

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

Создание прыгового пути имеет ряд особенностей. Выбрав соответствующий пункт меню, вы должны совершить прыжок точь-в-точь так, как хотите, чтобы его совершал бот. В результате у вас появятся две точки, соединённые прыговым путём: первая - в месте прыжка, вторая - в месте приземления. Обе точки будут иметь нулевой радиус. Его увеличение приводит к тому, что боты будут совершать прыжок не от самой точки, а от любого места в пределах радиуса. В некоторых местах это оправдано. Кроме того, вторая из точек (та, которая появляется при приземлении), может совсем не иметь путей, соединяющих её с соседними точками. Эту недоработку можно обойти, ставя сначала точку на месте приземления, а потом совершая прыжок, приземляясь, соответственно, рядом с поставленной ранее точкой. При этом новая точка создаваться не будет, а прыговой путь будет проведён к ранее поставленной точке. Причём сама точка всё же претерпит небольшие изменения: её радиус изменится и будет равен 0, и сама точка может немного сдвинуться ближе к тому месту, где вы реально приземлились. Точно также можно совершать прыжок от уже имеющихся точек, и в этом случае прыговой путь будет проводиться именно от них. Однако помните, что в этом случае у точки, от которой вы прыгнули, обнулится радиус, а самое печальное, что игра полностью обновит все пути, которые идут от этой точки и к ней. Это означает вот что: если вы поставили точку и долго-долго убирали все ненужные пути, которыми она соединялась с соседними, то впоследствии, совершив прыжок от этой точки (когда ставите прыговой путь), вы увидите, что все удалённые пути появятся заново, как ни в чём не бывало! На приведение в порядок путей уходит масса времени, а если их ещё и по несколько раз убирать… Поэтому выгоднее сначала создавать прыговые пути, затем - корректировать остальные, хотя такой порядок возможен не всегда.

Если вы заполняете точками что-то типа двухъярусной комнаты (например, входная комната на Cs_Mansion), то лучше сначала заполнить нижний ярус, а потом - верхний. Потому что, во-первых, заполняя второй ярус, вы будете видеть пути, идущие сверху вниз, и сможете проверить, будет ли бот терять HP, следуя по таким путям. Во-вторых, программа иногда в таких случаях соединяет нижние точки с верхними двухсторонними путями, и вы, опять же, увидите: если путь жёлтый, а не белый, значит, это произошло, и вам придётся спуститься вниз и удалять ненужные пути.

Вообще, большая часть неправильных путей создаётся именно при создании точек на какой-нибудь высоте. В этом случае программа очень любит ставить пути от верхних точек к нижним там, где спускаться нельзя из-за потери HP. Такие пути нужно обязательно убирать, желательно вообще не иметь на карте путей, следуя по которым, бот теряет HP, потому что бот не обращает внимания на свои проценты здоровья. Кроме того, при работе на высоте может не оказаться путей, идущих вниз, там, где они должны быть. А самое плохое, что могут оказаться пути, идущие снизу вверх. Таким образом, в таких местах карты надо особенно тщательно просматривать пути. Впрочем, если вы и упустите эти ошибки из виду, то достаточно быстро обнаружите их при тестировании.

Если с крыши или откуда-нибудь ещё можно свалиться, то рано или поздно разбушевавшийся во время битвы бот оттуда свалится. На это вы вэйпойнтами повлиять не можете. Хуже, когда бот, например, прибегает на край крыши, чтобы покемперить там, а в итоге пробегает край и падает. Существует способ замедления скорости движения ботов. Вы должны проложить путь с приседанием к той точке, которая стоит на краю. Бот падает с крыши, потому что пробегает точку по инерции. Когда он ползёт, такого не происходит. Поэтому, чтобы замедлить скорость бота, используйте пути с приседанием. вы, конечно же, помните, что к кемперским точкам не может быть проведено путей с приседанием. (Кемперская точка, поставленная в положении "сидя", означает, что бот будет на ней кемперить сидя.) Поэтому если надо замедлить скорость бота при подходе к кемперской точке, поставьте рядом с кемперской точкой обычную в положении "присев". И соедините кемперскую точку с остальными через эту обычную точку. (См. рисунок 5; кружок с чёрной точкой внутри - это точка, поставленная с приседанием).

Рисунок 5

Недостаток способа: часть пути, как можно догадаться, бот будет ползти. Однако это, наверное, лучше, чем тупые полёты с крыши.

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

Рисунок 6

Возвращаемся к прыжкам. У прыговых путей есть одна особенность, похожая на глюк. Бот практически всегда прыгает на максимальное расстояние независимо от того, как далеко расположена точка приземления. Кроме того, прыгнувший бот обладает огромной инерцией, и если путь резко изменяет направление после прыжка, бот может в такой поворот не вписаться и по инерции от прыжка пробежать дальше точки приземления. В некоторых случаях это недопустимо. Например, вы хотите, чтобы бот запрыгивал на небольшой карниз, как на рисунке 7 и кемперил на нём.

Рисунок 7

Обычный прыжок сделать нельзя: по инерции бот пролетит мимо и свалится вниз. Можно было бы сделать не прыговой путь, а обычный, чтобы бот подбежал прямо к карнизу и запрыгнул на него оттого, что у него не получается добежать до точки обычным путём. Но и для этого способа есть препятствие. Дело в том, что бот считает, что достиг точки, несколько раньше, чем он реально оказывается на ней. Для разного типа точек это расстояние разное. Поэтому бот не станет прыгать, подбежав к карнизу: он окажется на достаточно близком расстоянии, чтобы считать, что он уже на кемперской точке, и сядет кемперить под карнизом. Такой способ подходит только для достаточно широких карнизов. Поэтому остаётся один реальный способ: делать прыжок под достаточно острым углом к карнизу, в этом случае у бота не хватит инерции, чтобы свалиться с него. (См. рисунок 7).

Впрочем, существует ещё один способ борьбы с инерцией. Но он работает в том случае, если точка приземления - не кемперская. Заключается он в том, чтобы заменить путь, идущий от точки приземления, с обычного на прыговой. (См. рисунок 8)

Рисунок 8

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

Существует ещё одна хитрость заставить ботов выполнять то, что обычными средствами не получается. Дело в том, что точки можно ставить за пределами карты, то есть внутри стен. Напоминаю: бот считает, что он достиг точки даже в том случае, если он находится на некотором расстоянии от неё. Получается, что точка может быть "спрятана" в стене, но бот всё равно пробежит по ней. Такие точки можно использовать для того, чтобы "приблизить" бота к стене в том случае, если это необходимо. Например, вы хотите, чтобы бот нажимал на кнопку (См. рисунок 9), которая нажимается не кликом, а надавливанием. Если просто поставить точку рядом с кнопкой, то ничего не получится: бот посчитает, что достиг точки, ещё до того, как коснётся стены. В результате он на кнопку не нажмёт. Если же "задвинуть" точку в стенку за кнопкой, то мы добьёмся нужного результата. Только не ставьте точки слишком далеко за стенами, в этом случае бот не сможет их достичь. Чтобы поставить точку внутри стены, пользуйтесь читом noclip.

Рисунок 9

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

Рисунок 10

Наличие у точки зоны достижения можно использовать в самых разнообразных ситуациях. Например, на карте Cs_Assault, чтобы спрыгнуть с синего ящика и не потерять HP, нужно попасть точно на наклонную поверхность бордюра. (См. рисунок 11.) Всё бы хорошо, но программа бота, увы, не фиксирует факт вашего приземления на наклонную поверхность. Поэтому, если вы попробуете создать такой прыговой путь, точка приземления поставится уже на самой земле, что в данном случае бессмысленно. выход из данной ситуации есть. вы ставите точку приземления не на наклонную поверхность бордюра, а чуть дальше, на сам бордюр.

Рисунок 11

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

Теперь настало время рассказать о том, как делать вэйпойнты на воде. В описании к боту написано, что у ботов проблемы с погружением вглубь. Есть способ, который позволяет эти проблемы решать. В качестве примера возьмём известную карту Cs_Docks.

Если у вас на карте просто полоска воды, и надо сделать так, чтобы бот не тонул, то сделать это достаточно просто. Просто ставите вэйпойнты у поверхности воды или чуть-чуть выше. (См. рисунок 12.)

Рисунок 12

Однако заставить бота погружаться в воду не так просто. Происходит это по следующей причине. Бот знает, на каком расстоянии расположена следующая точка по маршруту, и рассчитывает время, за которое он должен успешно добраться до этой точки. Если реально время оказывается значительно больше, то бот считает, что у него не получилось добраться до следующей точки и возвращается на предыдущую, после чего повторяет попытку. При погружении в воду игрок движется медленнее, чем просто при движении. Поэтому если вы просто расставите точки сверху вниз, ничего не получится: бот будет пытаться погрузиться, но постоянно возвращаться наверх. Отсюда вывод: чтобы бот не реагировал на время достижения следующей точки и не возвращался к предыдущей, нужно расстояние между точками уменьшить, причём уменьшить настолько, чтобы бот при своей скорости погружения успевал бы достичь следующей точки раньше, чем решал бы, что это у него не получилось. Именно таким способом следует решать проблему погружения. А чтобы стоящие слишком близко точки не сливались в одну, их можно расположить по небольшой спирали. В этом случае у ботов ещё будет горизонтальная составляющая скорости, что в данном случае идёт на пользу, поскольку в целом бот движется быстрее. На карте Cs_Docks есть затопленный колодец, образующий дополнительный ход. Именно в него должны погружаться боты. Как это сделано, показано на рисунке 13.

Рисунок 13

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

При всплытии таких проблем не наблюдается, так что обратный путь можно преодолевать по вертикальной прямой, ставя точки на обычном расстоянии. Надо сказать, что создание подобных мест потребует от вас огромного терпения, поскольку придётся очень много и очень долго возиться с путями, убирая большинство из них, и оставляя только пути между соседними точками. Чтобы не задыхаться под водой, используйте встроенный чит noclip.

А для особо терпеливых и трудолюбивых могу рассказать о том, как заставить ботов забираться на наклонные поверхности, по типу той, которая показана на рисунке 14. Человек по такой поверхности забирается, постоянно зажав кнопку "вперёд" и двигаясь очень медленно. Если же кнопку отпустить, вы сразу же свалитесь вниз. Для ботов подобные условия, конечно, специфичны, но, как это ни странно, решение этой проблемы точно такое же, как и решение проблемы с погружением ботов. За исключением того, что здесь точки придётся ставить ещё чаще, настолько часто, чтобы бот достигал при движении каждой следующей точки раньше, чем думал бы, что это у него не получилось. Каждая точка соединяется только со следующей и с предыдущей.

Рисунок 14

Думаю, не стоит даже упоминать о том, сколько времени вы можете потратить, убирая лишние пути в таких местах. Однако, в любом случае, сам факт есть: по таким поверхностям ботов научить забираться можно. Всё зависит от того, стоит ли их этому учить на каждой конкретной карте, то есть, представляет ли то место, куда они могут так забраться, какой-нибудь тактический интерес.

Из рисунка 14 непонятно, зачем ботам взбираться на эту наклонную стену. На самом деле там наверху расположена обычная кемперская точка, просто она расположена внутри стены. (См. рисунок 15.) Просто из-за наличия зоны достижения бот решает, что он добрался до точки раньше, чем он оказывается на ней. В результате он в самый последний момент скатывается со стены со словами "I’m In Position". Если задвинуть кемперскую точку дальше, за стену, то такого не будет.

Рисунок 15

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

Лестничные точки. Используйте их на всех лестницах. На очень коротких лестницах достаточно одной лестничной точки, но не меньше. На очень длинных лестницах вы можете ставить больше, чем две точки. Точки нужно ставить именно туда, где они должны стоять. Чтобы поставить нижнюю точку, подойдите к лестнице и совсем немного (буквально однократное нажатие кнопки "вперёд") взберитесь на неё. В этом положении поставьте нижнюю точку. Верхняя точка ставится примерно в таком положении, как показано на рисунке 16, - чтобы ваша голова была чуть выше уровня конца лестницы.

Рисунок 16

Все проблемы на лестницах возникают только из-за неправильно проложенных путей. Помните, что на лестницах надо обязательно прокладывать пути так, как они должны быть, потому что автоматически они не соединяются. Сначала разберёмся с нижней точкой. Необходимо следить за тем, чтобы боты подходили к лестницы практически под прямым углом - в противном случае они могут сваливаться. Поэтому рекомендуется напротив лестницы (См. рисунок 17) ставить обычную точку нулевого радиуса, и только эту точку соединять с лестничной. Кстати, когда вы ставите лестничную точку (нижнюю), она автоматически соединяется только с одной точкой, которая ближе всех к ней. Это стоит использовать.

Рисунок 17

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

Поставив верхнюю точку, соедините вручную нижнюю с верхней. Путь между лестничными точками должен быть двухсторонним. Также от верхней лестничной точки желательно не иметь никаких путей, идущих к другим точкам нижнего яруса. Обычно парочка таких путей ставится автоматически, и их надо вручную убрать.Наконец, вам надо на верхнем уровне также поставить одну единственную точку, которая будет соединена с лестничной, и сделать так, чтобы она соединялась с верхней двухсторонним путём. Этим вы также обеспечите прямой угол подхода бота к лестнице.

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

Рисунок 18

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

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

Лестничные точки имеют радиус 0, и изменение его ни к чему хорошему не приведёт.

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

Основные точки карты. Здесь стоит рассмотреть отдельно все три вида карт, поддерживаемые POD-Bot.

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

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

Чтобы разнообразить процедуру закладки бомбы, ставьте на каждый бомбплейс несколько точек, от 3 до 7. Причём ставить их лучше в труднодоступные места - на открытом пространстве боты-контры бомбу и так найдут. Если на карте несколько бомбплейсов, на них нужно ставить одинаковое количество основных точек, иначе к тому месту, на котором этих точек будет больше, боты будут бегать чаще.На AS-картах основные точки ставятся там, где спасается VIP. Здесь, в общем-то, никаких сложностей нет.

Выбрав в качестве точки назначения основную точку, бот всегда бежит к ней одним и тем же путём. Можно ли это изменить? Можно, но только на AS-картах. Процедура заключается в том, что вы ставите основные точки не только в местах спасения VIP, но и ещё где-нибудь. Просто VIP всегда выбирает в качестве назначения только основные точки. Добежав до одной, он начинает бежать к другой (если он не спасся), поэтому поставьте одну основную точку на альтернативную дорогу, по которой VIP не бегает, и в результате он будет в половине раундов бегать по старой дороге, в половине - по новой. Однако не стоит увлекаться и ставить основные точки на всех дорогах. Ведь настоящее-то место спасения - одно или два, и рано или поздно VIP должен прибежать туда. Если вы поставите слишком много мнимых основных точек, то VIP очень долго будет плутать по карте, пока найдёт ту точку, с которой он реально спасётся. Если на карте одно место спасения - поставьте максимум ещё 2 основных точки, если два места спасения - поставьте ещё 3.

На CS и DE-картах такой способ не работает, и понятно, почему. На CS картах поставленная лишняя основная точка никак не скажется на движении контр-террористов, на DE-картах бот, прибегающий на такую мнимую точку, будет отвлекать всех других своим криком "Need Backup!" и ничего больше.

Как быть, если на карте два совмещённых сценария? Например, на карте Cs_Rush есть и заложник, и бомба у террористов. Ставить основные точки и у заложника и на месте закладки - это не дело. Да и кроме того, террористы в любом случае не будут закладывать бомбу, потому что у карты префикс CS. Вот если изменить его на DE, тогда можно добиться кое-какого результата. Переименовываем карту в De_Rush и ставим основные точки на месте закладки, а также ставим точку спасения заложника. А у самого заложника ставим несколько главных контерских точек, чтобы контр-террористы часто сюда прибегали. В результате террористы успешно закладывают бомбу, а контр-террористы вполне нормально юзают и выводят заложника.

В описании к боту написано, что основные точки карты и точки спасения заложников должны иметь радиус 0. В принципе, наверное, из-за того, чтобы обеспечить точность выполняемых на этих точках операций. Однако, думаю, что изменение радиуса основной точки, если она стоит, к примеру, в центре места закладки, вполне допустимо, чтобы боты закладывали бомбу не на саму точку, а в некоторой зоне вокруг неё.

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

Представьте, что вы встретили врага, пострелялись с ним, и настало время перезарядиться. Куда вы отбежите? Естественно, за ящик, который стоит рядом, чтобы не находиться на линии огня. Вот и боты пытаются сделать то же самое. Они ищут безопасные точки, а к таким они относят кемперские точки и обычные точки, у которых радиус как можно меньше. Другой пример: вы купили AWP. Не пойдёте же вы с ней на раш! Вы займёте удобную для себя позицию и будете спокойно ждать. Это не кемперство, это снайперство! Почему бы ни дать ботам возможность точно также выбирать удобную позицию? А когда у вас осталось 10 HP, то разве вы не спрячетесь подальше, предоставив вашим товарищам возможность отстреливать врагов? И боты делают то же самое, они иногда убегают с поля боя и ищут безопасные места. Вот именно для этого нужны кемперские точки, для ботов они представляют собой ничто иное, как самые безопасные точки. Ну а уж то, что они кемперят на них - так ведь и люди этим балуются. Так что кемперские точки нужны на карте обязательно. Ставить их нужно практически по всей карте, их число должно составлять процентов 12–18 от всех точек на карте. Ставьте их за ящиками, за поворотами, на более выгодных позициях, в общем, везде, где только можно. Только не ставьте их на открытых местах.

Чтобы поставить кемперскую точку, нужно совершить ряд действий. Сама точка состоит из двух, каждая из которых указывает направление, между которыми должен смотреть бот, находясь на этой точке. Точка, поставленная с приседанием, говорит о том, что бот, находясь на ней, присядет. Таким образом, вы должны встать на место, где собираетесь поставить кемперскую точку, повернуться в одном из ограничивающих направлений, присесть, если необходимо, и поставить Campstart Waypoint, а затем повернуться в сторону другого ограничивающего направления и поставить Campend Waypoint. Последнюю операцию необходимо проделывать даже в том случае, если второе направление с самого начала рисуется правильно. Если угол между задающими направлениями слишком большой, то бот может смотреть в произвольном направлении. Кроме того, он реагирует на звуки, издаваемые врагами, и может поворачиваться в ту сторону, откуда они слышатся.

Помните, что к кемперским точкам не может приходить путей с приседанием. В большинстве случаев бот догадается присесть сам, а если это всё-таки нужно ему объяснить, то пользуйтесь схемой, изображённой на рисунке 5.

Кемперские точки должны всегда иметь радиус 0!

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

Честно говоря, на мой взгляд, такого инструмента, как главные точки, явно недостаточно, чтобы можно было объяснить ботам, как именно играть на конкретной карте. Понятно, что в самом начале раунда игроки будут стремиться занять выгодные позиции, до которых они смогут добежать, не встречая противника. Однако дальше, по мере развития боёв и передвижения противника, нужно принимать решения, которые зависят каждый раз от конкретной ситуации. Что нужно делать каждый раз, ботам объяснить невозможно, они это решают сами, и решают, практически ни на что не ориентируясь, то есть случайным образом. Если вы находитесь на одной части карты и видите, что с другого фланга ваших сильно потеснили, то несколько человек отправятся туда на помощь своим. Боты этого никогда не сделают, или сделают по команде "Taking Fire, Need Assistance!", но все сразу, обнажив этот фланг. В общем, возможности наши явно ограничены в реализации продвинутой ботской тактики, но будем довольствоваться тем, что имеем.

Главные точки делятся на два типа. Во-первых, это обычные главные точки, которые бот выбирает в качестве точек назначения. Добегая до такой точки, он тут же придумывает себе новую точку назначения и бежит к ней. Во-вторых, это кемперские главные точки, на которых бот ещё на некоторое время задерживается. Честно говоря, я затрудняюсь, относятся ли главные кемперские точки больше к главным или к кемперским, но то, что с помощью них можно лучше организовывать тактику, это факт. Таким образом, основной принцип расстановки точек при организации тактики выглядит так: ставьте обычные главные точки там, куда надо прорываться, а кемперские главные точки ставьте там, где обычно создаётся засада. Единственное различие засады людей от засады ботов будет в том, что боты будут не двигаясь сидеть на своих точках и спокойно ждать врага, а люди всё-таки более любопытны.На мой взгляд, главные точки лучше ставить с расчётом на начало раунда. Понятно, что в середине раунда может случиться всякое, даже, например, стороны могут поменяться местами на карте - но все случаи предусмотреть невозможно, а начало раунда по крайней мере бывает в каждом раунде. Таким образом вы обеспечите правильность движения ботов хотя бы на первую минуту.

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

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

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

Чтобы не ограничиваться теорией, стоит привести какой-нибудь пример. Вот как бы я расположил главные точки на всем известной карте De_Dust. Начнём с базы террористов. В её окрестностях - пара-тройка CT точек, чтобы контры могли бегать по всей карте. У входа в тоннель - достаточное количество кемперских T точек, чтобы ловить особо проворных контр-террористов. В середине тоннеля - и T и CT точки, на выходе к воротам - кемперские CT точки, на выходе из тоннеля к бомбплейсу - несколько T точек, а также в большом количестве CT точки, как обычные, так и кемперские. Если из тоннеля со стороны террористов заворачивать вправо - там также несколько CT кемперских точек. Внизу под мостом - обычные точки CT, а со стороны террористов - много T точек, как обычных, так и кемперских. Поскольку боты бегают закладывать бомбу всегда только через тоннель, под мостом стоит поставить побольше T точек, для равномерного распределения террористов по карте. На самом известном снайперском месте со стороны CT (Рядом с ящиками, откуда просматривается и мост, и дорога под мостом.), конечно же, кемперские CT точки. Оставшаяся область - респаун контров и всё, что рядом с ним, равномерно заполнено и T и CT точками. Конечно, здесь всё это представлено упрощённо. Как видите, реализация тактики очень зависит от того, как вы сами её понимаете. Наверняка найдутся люди, которые видят тактику по-другому, не так, как здесь изложено. Именно поэтому никогда не будет вэйпойнтов, созданных разными людьми, которые (вэйпойнты) были бы похожи, как две капли воды. В идеальных вэйпойнтах, сделанных к одной карте двумя разными людьми, практически всё будет одинаково: и расстановка основных и кемперских точек, и пути, и прочее. Единственное, чем они будут различаться - это расстановкой главных точек, определяющих тактику.

В заключение этого раздела хочу напомнить, чтобы при создании вэйпойнтов вы чаще сохранялись командой waypoint save nocheck. Лучше перестраховываться, чем потом делать ещё раз то, что вы уже сделали.

Читать дальше...


Делаем вэйпоинты (часть 3)
Автор: LLIHULLEJIb

Продолжение. Начало во второй части...

Тестирование вэйпойнтов

Наконец, настал тот долгожданный момент, когда вы расставили точки по всей карте. Что нужно делать дальше? Во-первых, вы должны проверить вэйпойнты на ошибки и сохранить их. Во время создания вэйпойнтов вам следовало использовать команду waypoint save nocheck для сохранения без проверки на ошибки. Теперь же нужно использовать команду waypoint save. Однако перед ней советую сделать две вещи: во-первых, сохранитесь последний раз командой waypoint save nocheck, а во-вторых, перезапустите раунд командой sv_restartround 1. Просто если у вас на карте есть ошибки, которые обнаружатся при сохранении, то вам придётся эти ошибки исправлять до того, как закончится время раунда. В противном случае по истечении времени игра может зависнуть - я сталкивался с этим не раз. Девяти минут вполне достаточно, чтобы исправить все ошибки, которые найдёт компилятор вэйпойнтов. Итак, вы перезапускаете раунд и набираете команду waypoint save. По этой команде сначала производится ряд тестов вэйпойнтов на играбельность, и если возникают какие-то ошибки, вам нужно их исправить. Часто в сообщении об ошибке указывается номер точки, с которой связана ошибка. В этом случае вы командой waypoint teleport x перемещаетесь на указанную точку и исправляете ошибку, затем повторяете попытку сохраниться. И так до тех пор, пока не получите желанное сообщение "waypoints saved". Помните, что играть можно только в вэйпойнты, не содержащие никаких ошибок. Если компилятор обнаружил ошибку, то теоретически вы можете загрузить ботов и играть с ними на таких вэйпойнтах, но в результате могут появиться разного рода глюки.

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

Во время сохранения процессор тестирует вэйпойнты и выполняет огромное количество вычислений, из-за чего на некоторое время CS "зависает". То же самое происходит и при загрузке и инициализации вэйпойнтов.

После того, как вэйпойнты успешно сохранены, вам обязательно нужно их загрузить ещё раз. Делается это командой waypoint load. По этой команде вэйпойнты не только загружаются, но и инициализируются. Инициализация заключается в том, что вэйпойнты загружаются в память в таком виде, в каком их используют боты. Именно поэтому после каждого удачного сохранения вэйпойнты нужно загружать. Если этого не сделать, то попытка добавить бота на сервер закончится зависанием последнего.Если вы удачно сохранили и загрузили вэйпойнты, то рекомендуется вам самим провести ряд тестов на карте, прежде чем вы начнёте играть с ботами. При таком тестировании вы выявите такие ошибки, которые непременно бы обнаружили себя сразу во время игры и испортили бы впечатление от неё. Загрузите бота за свою команду и побегайте за ним в течение десяти минут. (Можно загрузить бота и за чужую команду, но, чтобы он вас не убивал, включите чит noclip.) Если он не допустил никаких ошибок при движении, то это может говорить об отсутствии ошибок, которые бы проявляли себя слишком часто. Кроме того, вы можете протестировать некоторые отдельные сложные места на карте, в которых сомневаетесь, что бот будет выполнять там то, что вы от него хотите. Используйте для этого команду debuggoal x, где x - номер точки, куда вы отправляете бота. Бот должен успешно достигать точки x. Если вдруг вы выявили ошибку, то перед её исправлением обязательно уберите бота с сервера. Категорически запрещается одновременно иметь бегающих ботов на сервере и при этом редактировать вэйпойнты. Точно также запрещено добавлять ботов на сервер, если до этого не были инициализированы вэйпойнты. Если с момента последней инициализации вы добавили хотя бы одну точку или даже просто добавили один путь, вэйпойнты нужно заново сохранить и загрузить, лишь затем можно добавлять бота. Нарушение этих правил приведёт к таким последствиям, что вам придётся жать на одну известную кнопку, расположенную на системном блоке. Также помните, что вы могли забиндить некоторые клавиши, которые используете в обычной игре, по-другому. Например, на клавишу, на которой у вас обычно команда "+attack2", вы могли забиндить команду "waypoint add". В результате, увлёкшись тестированием, вы можете нажать на эту клавишу, чтобы нанести тупому боту, не делающему то, что вы от него хотите, альтернативный удар ножом, а в результате поставите ещё одну точку. Поверьте, месть бота за это будет очень страшной: он просто повесит вам сервер…

Таким образом, если вы добросовестно проверили самые сложные места на карте и уверены, что бот будет бегать абсолютно нормально, можете выходить из режима создания вэйпойнтов и загружать ботов. Но лучше на всякий случай перезагрузить сервер. Дальше, собственно, начинается то, для чего вы так старательно и мучительно создавали эти вэйпойнты. Единственное, что хочу ещё заметить: на первых порах игры внимательно следите за ботами, не совершают ли они ошибок. Достаточно некоторое время поиграть на карте с ботами, чтобы понять, что именно можно сделать лучше, какие места чуть-чуть исправить и т.д. Не поленитесь затем это сделать, и таким образом вы в конце концов очень сильно повысите качество ваших вэйпойнтов. Кроме того, особенно внимательно следите за тактикой ботов, её в любом случае придётся подгонять под ту, которую вы себе представляете. Можете считать, что в ваших вэйпойнтах нет ошибок, если вы не выявили ни одного недостатка после часа игры. Однако это вовсе не означает, что их там на самом деле нет, просто оставшиеся ошибки будут проявляться настолько редко, что здесь уже появляется вопрос: а имеет ли смысл тратить время на поиск таких ошибок и их исправление?

В заключение этого раздела пара слов о том, можно ли менять карту во время редактирования вэйпойнтов. В принципе, можно. Но здесь могут быть две проблемы. Во-первых, при смене карты могут не показываться пути и радиусы точек - вроде бы Count Floyd исправил этот глюк, но иногда он всё же проявляется. Во-вторых, при смене карты обязательно вводите команды debuggoal –1 и waypoint find –1 (если, конечно же, вы пользовались этими командами на предыдущей карте). Если этого не сделать, последствия будут непредсказуемыми.

Ошибки и их устранение

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

Ошибки, возникающие при редактировании вэйпоинтов

Проблема | Причина и методы решения
При удалении точки с номером 0 сервер зависает. | Глюк POD-Bot, решить эту проблему невозможно.
При смене карты не показываются пути и радиусы точек. | Также глюк POD-Bot. Создайте сервер заново.
При добавлении новой точки у уже существующих соседних точек убирается путь. | Из каждой точки может исходить не более 8 путей. Если их уже 8, то при добавлении новой точки один из старых путей убирается.
Прыговой путь не создаётся. | Из данной точки уже исходит 8 путей. Даже если вы их все удалите, то при прыжке точка обновится, и все 8 путей появятся заново, прежде чем вы успеете приземлиться. Придётся удалить несколько точек вокруг, затем создать прыговой путь, а затем вернуть эти точки на место.
Прыговой путь появился там, где он не должен быть, а там, где он был раньше, теперь обычный путь. | Глюк, возникающий достаточно редко, когда от одной точки отходит более чем один прыговой путь. Придётся удалять все неправильные пути и создавать их заново.

Ошибки, возникающие при сохранении вэйпоинтов

Сообщение об ошибке | Что нужно делать
“You didn’t set any Terrorist (Counter, Goal, Rescue) Point!” | Чтобы боты могли бегать по карте, на ней обязательно должны быть точки назначения. Поэтому на любой карте должны быть хотя бы в единственном экземпляре главные точки, как T, так и CT, а также основные точки карты, а на CS-картах - ещё и точки вывода заложников.
“Node X isn’t connected with other Waypoint!” | Точка с номером X не соединена путями с другими точками. Такого быть не должно. Телепортируйтесь на эту точку и исправьте ошибку.
“Path broken from Nr. X to Y! One or both of them are unconnected”. | Основной принцип движения по точкам - это возможность от любой точки добежать до любой другой по проложенным путям. При сохранении компилятор проверяет эту возможность. Сперва он проверяет, можно ли от точки с номером 0 добежать до всех остальных точек, а затем проверяет, можно ли от каждой из точек добежать до точки с номером 0. Если можно, значит, отсюда автоматически следует, что можно добежать от любой точки до любой другой. Данное сообщение означает, что подобная проверка не удалась. Одна из точек X и Y всегда будет 0. Телепортируйтесь на другую указанную точку и проверьте пути у всех соседних точек. Ошибка должна быть где-то рядом: либо на эту точку нельзя попасть от соседних, либо с этой точки нельзя убежать на соседние.
“Node X Pathindex Y points to itself!” | Ошибка могла возникнуть по двум причинам. Либо вы вручную указали "pathwaypoint add x", стоя прямо на этой точке, либо вы совершили прыжок, прокладывая прыговой путь, таким образом, что точка прыжка совпадает с точкой приземления. Телепортируйтесь на точку X и наберите в консоли "pathwaypoint delete x", где X, естественно, номер точки.
“Node X Camp_End position not set!” | Когда ставите кемперскую точку, у неё обязательно необходимо указывать второе задающее направление, даже если оно по умолчанию ориентировано правильно. Телепортируйтесь на точку X и поставьте CampEnd Waypoint.

С остальными ошибками я не встречался, поэтому описывать их не буду.

Ошибки, возникающие при загрузке вэйпоинтов

Сообщение об ошибке | Причина ошибки
"No waypoints for this map, Can’t create Bot!" | - Возникает при попытке добавить ботов на карте, к которой нет вэйпойнтов. - Файл находится не в директории, заданной переменной WPTFolder, а где-нибудь ещё. По умолчанию файл должен находиться в директории …cstrike\PODBot\WPTDefault. - Была переименована карта и файл вэйпойнтов. Однако название карты хранится в самом файле вэйпойнтов (с 17 по 48 байты). Нужно загрузить файл в любом текстовом редакторе, воспринимающем кодировку целиком, и вручную поменять имя.
"Waypoints changed/not initialised, can’t create Bot!" | Чтобы добавить бота, необходимо инициализировать вэйпойнты. Сохраните вэйпойнты и загрузите их ещё раз.
"Waypoint file … doesn’t exist!" | Скорее всего, при смене карты вы использовали верхний регистр, вводя её название. POD-Bot реагирует на изменение регистра, поэтому не может найти соответствующий файл. Вводите название карты строчными буквами.
"No experience Data File or old one - starting new!" | Это просто сообщение, которое появляется, когда вы используете файлы опыта. Оно означает, что либо файла опыта нет, либо вы изменили вэйпойнты, поэтому старый файл опыта уже не действителен.

Ошибки, записываемые в файл PODERROR.TXT

Сообщение об ошибке | Причина ошибки
"POD Bot Waypoints are not for this map!" | Изменено название карты и файла вэйпойнтов. Необходимо изменить название, хранящееся внутри файла вэйпойнтов. (См. предыдущую таблицу.)
"mapname.pwf doesn’t exist!" | Нет файла с вэйпойнтами к загружаемой карте. Зачем делать каждый раз об этом запись в файле PODError.txt, я не знаю.
"Findpath Dest Invalid!" | Вы тестировали вэйпойнты на одной карте и использовали команду debuggoal X, а затем сменили карту, и на новой карте точек оказалось меньше, чем X. Загрузившийся бот увидел, что его посылают буквально вникуда, и подвесил вам сервер. Чтобы такого не было, при смене карты вводите "debuggoal –1".
"No Path from X to Y!" | Такое сообщение записывается в том случае, если вы играете на карте, сохранённой с ошибкой "Path broken from Nr. X1 to Y1! One or both of them are unconnected". Появление этой ошибки будет сопровождаться глюками ботов. Так что лучше эти ошибки исправлять.
"No Path from X to Y! (with Hostage)" | Бот не может найти дорогу от точки X до точки Y, при этом он тащит заложников. На всех возможных путях стоит флаг "Block With Hostage". На движении ботов это практически никак не сказывается, тем более что ошибка могла появиться по следующей причине: бот мог увидеть заложников, находясь на точке с вышеуказанным флагом. Естественно, какой бы он себе маршрут не придумал, самая первая точка будет иметь этот флаг, а значит, появится данная ошибка. Обращать на неё внимания особо не стоит.

Вывод: все сообщения, записываемые в файл "PODError.txt", достаточно бесполезны, и особо увлекаться их исправлением не стоит. Иногда стоит очищать этот файл, а то со временем он разрастается до огромных размеров.

Ошибки ботов во время игры

Неправильные действия ботов | Как это исправить
Боты (все) не бегают по карте, а упираются в ближайшую стенку и тупо прыгают. | Возможно, изменилась версия карты.
Боты (все) бегут к одной точке и прыгают над ней. | Вы пользовались командой debuggoal x. Отключите её, введя debuggoal –1.
Один из ботов тупо прыгает на месте около стены. | Здесь вариантов очень много: - Он только что упал с крыши и всё ещё надеется туда запрыгнуть. Скоро он поймёт, что сильно переоценил свои возможности. - Бот бежал за товарищем, который сказал ему "Follow Me!" В результате товарищ завернул за угол, а этот бот не успел и потерял товарища из виду. Если поблизости есть точки, то бот вскоре прекратит биение в стену и начнёт нормально двигаться. - Поблизости нет ни одной точки. Когда бот не видит точек поблизости, он бежит в случайном направлении. Это случайное направление всегда указывает на ближайшую стену. - Возможно, за стеной находится нечто интересное, что привлекло любопытного бота: например, выключатель. Поскольку боты - прекрасные электрики, то они всегда проверяют исправность системы освещения. Исправить это, увы, нельзя. Разве что попробуйте проложить путь подальше от такой стены. - Может быть, бот увидел оружие или бомбу, которая залетела куда-нибудь в щель между ящиками. Упрямый бот будет лезть напролом, и это тоже не исправить.
Бот перебегает от точки к точке, останавливается на каждой и подолгу прыгает. | Странная ошибка, которая проявляется крайне редко. Причина возникновения неизвестна.
Бот сваливается в яму, хотя через неё идёт прыговой путь. | Скорее всего, этот бот бежал за своим товарищем, который сказал "Follow Me!" В этом случае бот ориентируется не по точкам, а по товарищу. Поэтому в таком месте он обязательно забудет прыгнуть. Выходом может быть только одно: уменьшите значение переменной botsfollowuser в файле PODBot.cfg, лучше всего до нуля.
Бот всегда выводит заложника, бежит ставить бомбу или бежит к месту спасения VIP одним и тем же путём. | Боты стараются использовать кратчайшие маршруты. Бежать разными путями можно заставить только VIP на AS-картах, об этом см. раздел "Советы по созданию точек и путей".
Бот бежит с заложниками туда, где они пройти не могут, хотя флаг "Block With Hostage" стоит везде, где надо. | Недоработка в программе; см. раздел "Как бот движется по точкам".
Бот недовыводит заложников, и они остаются стоять рядом с местом спасения. | Скорее всего, заложники застревают где-нибудь в пути и прибегают к месту спасения уже тогда, когда бот бежит назад. Попробуйте поставить точку спасения заложников подальше вглубь зоны спасения.
Бот прибегает на место закладки бомбы, кричит "Need Backup!", а затем с бомбой в руках бежит на другое место закладки. | Странная ошибка, которая стала часто появляться в КС 1.5. Причина возникновения неизвестна.
Боты падают с лестниц. | Прочитайте о том, как нужно ставить лестничные точки. См. раздел "Советы по созданию точек и путей".
Бот не разминирует бомбу, заложенную на небольшой возвышенности типа ящика. | Видя бомбу, бот перестаёт бежать по точкам и движется прямо к ней. Если она стоит на ящике, то боту нужно на этот ящик запрыгнуть, чтобы он смог её правильно разминировать. Однако он пытается разминировать её с земли, и в итоге не может это сделать. Возможно, стоит убрать точку для закладки с ящика, но ведь люди-то всё равно будут туда её закладывать. Так что определённого решения проблема не имеет.
Боты часто врезаются друг в друга и "склеиваются" на некоторое время. | Полностью неисправимо, но, возможно, точки стоят слишком редко, и боты не могут правильно разбежаться.
Боты застревают где-нибудь в стене или в потолке. | Из-за чего это происходит, я объяснить не могу, но совершенно точно, что это связано с точками. Попробуйте в этом месте поставить их как-нибудь по-другому.
Боты слишком часто (редко) бегают в какую-либо область карты. | Уточните тактику, поставьте побольше главных точек туда, где боты бывают нечасто, и уберите несколько главных точек оттуда, где боты бывают слишком часто.

На этом, наверное, всё. Спасибо всем, кто это прочитал и воспользуется полученной информацией. Удачной вам игры с ботами!


ambient_generic

Ambient_generic позволяет вставлять на карту звуки.
Name - имя объекта.
Path/filename.wav of WAV - путь к звуковому файлу в формате WAV.
Volume - громкость воспроизведения звука.
Dynamic presets - "стиль" воспроизведения. Например, можно сделать проигрывание звука пульсированным, возрастающим, etc.
Start volume - начальная громкость.
Fade in time - время (вначале воспроизведения), на протяжении которого звук будет переходить от стартовой громкости (Start volume), до установленного максимума (Volume).
Fade out time - время (в конце воспроизведения), на протяжении которого звук будет переходить от установленного максимума (Volume), до стартовой громкости (Start volume).
Остальные параметры влияют на стиль (тип, способ, и т.д.) воспроизведения звука. Объяснить их трудно - это нужно слышать, так что если хотите, то поэкспериментируйте сами.

Флаги:
Play everywhere - звук будет слышен в любой точке карты.
Small radius - маленький радиус слышимости звука (800 юнитов).
Medium radius - средний радиус (1250 юнитов).
Large radius - большой радиус (2000 юнитов).
Start silent - вначале звук выключен.
Is NOT looped - проигрывать звуковой файл только один раз.


armoury_entity

При помощи этого объекта можно положить на карту любой вид оружия или амуниции (кроме ножа и пистолетов).
Item - тип оружия (амуниции).
Count - количевство штук.


button_target

Этот объект работает также как и func_button, только не может двигаться, и активируется выстрелом по нему.
Target - имя объекта, который активируется при выстреле в кнопку.
Master - имя объекта multisource.

Флаги:
Use activates - кнопка будет активироваться от use'а.
Start on - вначале, кнопка будет окрашена текстурой, которая соответствует нажатому состоянию (если используется переключаемая текстура).


cycler

С помощью этого объекта можно поместить на карту модель.
Name - имя объекта.
Model - путь к .mdl файлу с моделью.
Остальные параметры - это параметры отображения, с помощью которых можно сделать полупрозрачную модель, или имитацию голограммы, или еще что нибудь интересное...


cycler_sprite

Этот объект позволяет вставлять на карту анимированные спрайты. При выстреле по объекту во время паузы между сменами кадров - текущий кадр сменится на следующий.
Name - имя объекта. При активации объекта, анимация будет останавливаться/воспроизводиться.
Sprite - путь к спрайту.
Frame per seconds - скорость смены кадров в секунду.


cycler_wreckage

С помощью cycler_wreckage, на карту можно поместить клубы дыма (как от дымовой гранаты).
Name - имя объекта.
Framerate - скорость смена анимации (кадров в секунду).
Sprite name - путь к файлу со спрайтом дыма.
Scale - масштаб спрайта.

Флаги:
Toggled - переключаемый (можно включать\выключать).
Start ON - вначале включен.


env_beam

Этот объект используется для создания лучей различных видов (лазерный, электрический).
Name - имя объекта.
Start entity - имя первого объекта (от которого луч происходит).
Ending entity - имя конечного объекта. Луч будет "рисоваться" от Start entity, до Ending entity.
Render FX - тип луча (мигающий, пульсирующий...).
Brightness - яркость луча. Чем значение (0 - 255) выше, тем луч более яркий.
Beam color - цвет луча, в формате RGB.
Radius - радиус луча.
Life - время "жизни" луча в секундах, после чего он исчезнет. Если значение "0" - то луч будет "работать" вечно.
Width of beam - ширина луча (0 - 255). Введенное значение будет умножено на 0.1 пикселя (n * 0.1). Например, если нужен луч равный 5 пикселям, то установите значение "50".
Ammount of noise - уровень искривления луча (0 - 255).
Sprite name - спрайт луча (по дефолту sprites/laserbeam.spr).
Texture scroll rate - скорость смены кадров спрайта.
Frames per 10 seconds - скорость анимации луча.
Starting frame - этот параметр указывает с какого кадра начать анимацию. Например, у вас на карте рядом расположены несколько лучей, и не очень красиво выглядит когда они все сменяются одинаково. Тогда для каждого луча можно установить разное значение этого параметра.
Strike again time - время в секундах, после которого луч снова "оживет". Этот параметр используется тогда, когда значение Life больше нуля.
Damage / seconds - повреждения за секунду (если игрок попадет под луч, или луч попадет в игрока).

Флаги:
Start on - если указано имя (Name), то луч отключен в начале раунда, а этот флаг включит его.
Toggle - переключаемый луч. Тоесть, луч можно включать\выключать при активации.
Random strike - если этот флаг включен, то луч будет появляться через случайные промежутки времени (от "0" до значения Strike again time).
Ring - не используется.
Start sparks - если включен, то из объекта Start entity будут сыпаться искры.
End sparks - если включен, то из объекта Ending entity будут сыпаться искры.
Decal end - луч будет оставлять следы ожога там, куда он попадет.
Shade start - затененное начало луча.
Shade end - затененный конец луча.

Луч можно сделать непредвиденным. Тоесть, если не указать Ending entity, то луч будет исходить из объекта Star entity в случайном направлении. А можно сделать прикол и покруче: не указать ни Start entity, ни Ending entity, тогда лучи будут возникать на карте случайным образом!


env_beverage

При активации, данная энтити создает банку с напитком, который востанавливает 1 процент здоровья.
Name - имя объекта (для активации).
Capacity - количество банок с напитком всего. Тоесть, если значение равно "1", то вывалится только одна банка, и сколько не активируй env_beverage после этого - ничего не добъешся.
Beverage type - тип напитка. Возможный выбор: Coca-cola, Sprite, Diet Coke, Orange, Surge, Moxie, или случайный тип. Тип напитка ни на что, кроме визуального представления, не влияет.


env_blood

Этот объект выбрасывает кровь на карту.
Name - имя объекта (для активации).
Blood color - не обращайте внимание на выпадающий список в этом параметре, а сами ставьте нужное значение: 1 - красная кровь, 2 - желтая (кровь мутантов).
Amount of blood - количество крови. Чем значение выше - тем будет больше крови.

Флаги:
Random direction - разбрызгивать кровь в случайно определенную сторону. Если флаг не включен, то кровь будет разбрызгиваться только в сторону, определенную стрелочкой Angle.
Blood stream - поток крови. Вместо простого разбрызгивания, кровь будет вылетать струей!
On player - если флаг включен, то кровь будет литься не из env_blood, а из игрока, который активирует env_blood.
Spray decals - кровь будет оставлять следы на карте, а не просто выбрызгиваться и исчезать.


env_bubles

Этот объект создает на карте область, в которой будут всплывать пузырьки. Кстати, объект env_bubles является единственным env_ объектом "семейства" solid-based entities.
Name - имя объекта.
Bubble density - количество пузырьков.
Bubble frequency - частота возникновения пузырьков. Чем выше это значение, тем чаще будут появлятся новые пузырьки.
Speed of current - скорость движения. Чем выше, тем быстрее пузырьки будет двигаться по направлению, определяемому стрелочкой Angle (по дефолту пузырьки движутся снизу вверх).

Флаги:
Start off - при начале раунда пузырьки выключены. Чтобы включить их, нужно активировать env_bubles.


env_explosion

Этот объект создает взрыв на карте, который может наносить игроку повреждения.
Name - имя объекта. Обязательно введите этот параметр, иначе вы не сможете запустить взрыв.
Magnitude - мощность взрыва (сила и радиус).

Флаги:
No damage - не наносит повреждений.
Repeatable - можно взрывать не один раз.
No fireball - без вспышки.
No smoke - без дыма.
No decal - не оставляет следов.
No sparks - без искр.


env_fade

Эта энтити используется для затемнения экрана игрока.
Name - имя объекта.
Duration - длительность перехода от нормального состояния, до затемненного (в секундах).
Hold fade - длительность задержки затемненного экрана, после полного затемнения.
Fade alpha - уровень непрозрачности затемнения (0 - полностью прозрачное, 255 - полностью непрозрачное).
Fade color - цвет затемнения в формате RGB (Red Green Blue).

Флаги:
Fade from - указывает, что затемнение будет происходить резко, а переход с темного экрана назад - постепенно. Короче, все наоборот!
Modulate - если этот флаг отмечен, то объект будет создавать не совсем затемнение, а как бы фильтр цветов. Тоесть, если в параметре Fade color указано значение, например "255 0 0", то будет эффект прибора ночного видения в красном цвете. Вообщем, кто заинтересовался - поэкспериментируйте сами, так как это может быть не очень понятно на словах.
Activator only - затемняет экран только у активировавшего его игрока, а не у всех.


env_fog

С помощью этого объекта можно реализовать на карте туман. Но к сожалению, CS пока его не поддерживает.


env_funnel

Этот объект создает множество спрайтов-частиц, которые начинают собиратся в одной точке (там где расположен env_funnel).
Name - имя объекта (для активации). Env_funnel можно активировать только один раз.

Флаги:
Reverse - запускает env_funnel наоборот. Тоесть, частицы будут не собираться, а разлетатся из точки где расположен env_funnel.


env_global

Этот объект используется для "запоминания" информации на картах.
Name - имя объекта (для активации).
Global state to set - имя глобальной переменной. Тоесть, те установки, которые вы хотите изменить. Это также значение для других объектов, которые запрашивают глобальные установки (например, multisource).
Trigger mode - режим переключения. С его помощью устанавливаются значения переменных (off (выкл), on (вкл), dead (труп), toggle (переключить)), на момент активации env_global. Если установить значение Trigger mode на Toggle, то всегда, при активации env_global, другие объекты, использующие глобальные установки, будут переключаться (вкл\выкл), начиная с начального значения Initial state.
Initial state - устанавливает начальное значение глобальных переменных (off, on, dead).

Флаги:
Set initial state - устанавливает начальное значение не при активации env_global, а при загрузке карты.


env_glow

Этот объект используется для создания дымки\размытия\ореола около источников света. Чем вы дальше от env_glow, тем размытее становится еффект.
Name - имя объекта (для включения\выключения размытия).
Render mode - режим отображения. Установите Glow.
FX amount - уровень прозрачности дымки (0 - 255).
Model - путь к файлу спрайта с дымкой.
Sprite scale - размер дымки. Тоесть, чем больше значение - тем больше радиус размытия.


env_laser

Этот объект исполузуется для создания лучей различных видов (схож с env_beam).
Name - имя объекта.
Render FX - тип луча (мигающий, пульсирующий...).
Target of laser - цель лазера. Начало лазера будет появляться из объекта env_laser, и попадать в цель, чье имя указано в этом параметре.
Brightness - яркость луча. Чем значение (0 - 255) выше, тем луч более яркий.
Beam color - цвет луча, в формате RGB.
Width of beam - ширина луча (0 - 255). Введенное значение будет умножено на 0.1 пикселя (n * 0.1). Например, если луч равным 5 пикселей, установите значение "50".
Ammount of noise - уровень искривления луча (0 - 255).
Sprite name - спрайт луча (по дефолту sprites/laserbeam.spr).
End sprite - путь к файлу спрайта, который будет "рисоваться" на конце луча.
Texture scroll rate - скорость смены кадров спрайта.
Starting frame - этот параметр указывает с какого кадра начать анимацию. Например, у вас на карте рядом расположены несколько лучей, и не очень красиво выглядит когда они все сменяются одинаково. Тогда для каждого луча можно установить разное значение этого параметра.
Damage / seconds - повреждения за секунду (если игрок попадет под луч, или луч попадет в игрока).

Флаги:
Start on - если указано имя (Name), то луч отключен в начале раунда, а этот флаг включит его.
Start sparks - если включен, то из объекта Start entity будут сыпаться искры.
End sparks - если включен, то из объекта Ending entity будут сыпаться искры.
Decal end - луч будет оставлять следы ожога там, куда он попадет.

Если на карте есть несколько объектов с одинаковым именем, и это имя указать в качевстве цели для лазера, то лазер будет случайным образом переходить на эти объекты. А начало лазера всегда остается в одной точке - там где установлен env_laser.


env_message

Env_message нужен для того, чтобы выводить сообщение из файла titles.txt на экран.
Name - имя объекта, чтобы в последствии его можно было активировать.
Target - цель, которая активируется после появления на экране сообщения.
Message name - код сообщения из файла titles.txt (pak0.pak).
Sound effect - звуковой эффект.
Volume - громкость звука.
Sound radius - радиус распространения звука.

Флаги:
Play once - проигрывает звуковой файл только один раз.
All clients - сообщение отображается для всех игроков, а не только для того, кто активировал env_message.

Не следует использовать данный объект в CS - лучше юзайте game_text.


env_render

Этот объект позволяет изменять параметры отображения объектов.
Name - имя объекта, чтобы в последствии его можно было активировать для изменения параметров отображения цели, указанной в поле Target.
Target - цель env_render, которой нужно изменять параметры отображения.
Остальные параметры, это параметры отображения, которые будут установлены объекту, чье имя указано в параметре Target.

Флаги:
No renderfx - отключить использование параметра Render FX для Target-объекта.
No renderamt - отключить использование параметра FX amount для Target-объекта.
No rendermode - отключить использование параметра Render mode для Target-объекта.
No rendercolor - отключить использование параметра FX color для Target-объекта.


env_shake

Энтити env_shake создает эффект землетрясения.
Name - имя (для активации).
Amplitude - амплитуда землетрясения.
Effect radius - радиус создаваемой встраски.
Duration - длительность землетрасения (в секундах).
0.1 - jerk, 255.0 - rumble - сила встряски (0.1 - 255.0).

Флаги:
Global shake - если этот флаг отмечен, то землетрясение будет глобальным (на всей карте). В этом случае значение параметра Effect radius игнорируется.


env_shooter

Этот объект выбрасывает из себя определенное количество моделей (спрайтов).
Name - имя (для активации).
Number of gibs - количество выбрасываемых моделей.
Delay between shots - задержка между активацией env_shooter, и выбросом моделей.
Gib velocity - скорость вылета моделей.
Course variance - отклонения от прямой при полете.
Gib life - длительность "жизни" выброшенных моделей (в секундах), после чего они исчезнут.
Model - путь к файлу с моделью для выброса. Также можно вручную ввести путь к спрайту, который env_shooter тоже будет выбрасывать.
Material sound - звук издаваемый при падении модели на землю.
Gib scale - размер частиц (работает со спрайтами).
Gib skin - скин модели. Откройте модель, например, в Half-Life Model Viewer, и посмотрите какие скины у нее есть, а потом укажите нужный.

Флаги:
Repeatable - можно активировать не один раз.

Если вы выбрасываете с помощью env_shooter спрайты, то установите Render mode: additive. Это нужно, чтобы "подложка" спрайта была в игре невидимой.


env_sound

Env_sound позволяет изменять установки воспроизведения звука, в зависимости от типа помещения. Например, музыка в маленькой комнате с бетонными стенами должна звучать иначе, чем в большой комнате с металлическими стенами. С помощью env_sound это легко реализовать.
Radius - радиус действия. Когда игрок заходит в эту зону, то установки звука меняются, в зависимости от указаного типа помещения (Room type).
Room type - тип помещения (большая комната, тоннель, помещение с металичекими стенами, под водой...).

Когда игрок попадает в зону действия env_sound, установки воспроизведения звука изменяются. Но когда игрок выходит из этой зоны, установки не переключаются в исходное положение - их нужно снова переключить другим объектом env_sound.


env_spark

Этот объект создает исры через определенные промежутки времени.
Name - имя объекта.
MaxDelay - максимальное время задержки между воспроизведением искр.

Флаги:
Toggle - можно включать\выключать искры с помощью активации объекта.
Start on - если установлено имя, то искры при начале игры будут выключены, а этот флаг их включит.


env_sprite

С помощью объекта env_sprite можно вставлять спрайты на карту.
Name - имя объекта. При активации можно включать\выключать спрайт.
Framerate - скорость смены кадров в секунду (для анимированных спрайтов).
Path/filename.spr of sprite - путь к спрайту.
Sprite scale - масштаб спрайта.

Флаги:
Start on - если указано имя Name, то спрайт вначале появится невидимым (выключенным), а этот флаг включит его.
Play once - "прокручивать" анимацию только один раз.

Установите Render mode: additive, а FX amount: 0 - это нужно, чтобы "подложка" спрайта была в игре невидимой.


func_bomb_target

Эта энтити позволяет более точно, чем info_bomb_target определить зону закладки бомбы на картах de_***. Если на карте имеется энтити func_bomb_target, то info_bomb_target игнорируется.


func_breakable

С помощью этой энтити можно создать разрушаемый браш на карте.
Name - имя обьекта. После активации func_breakable разрушается.
Target on break - имя обьекта, который func_breakable активирует после того как разрушится.
Strength - прочность объекта.
Material type - тип материала.
Gibs direction - направление частиц (Random или Relative to attack). Если первое (по дефолту) - то ничего интересного не произойдет. Но если вы выберите Relative to attack - то после выстрела осколки полетят не куда попало, а в зависимости от того куда вы выстрелите - большинство частиц вылетят в том-же направлении в котором вошла пуля.
Delay before fire - время задержки между разрушением браша и активацией обьекта, имя которого указано в параметре Target on break.
Gib model - путь к файлу с моделью (*.mdl), которая будет использована в виде осколков.
Spawn on break - указывается обьект который вывалится из браша после разрушения. В КС не работает.
Explode magnitude - мощность взрыва во время разрушения обьекта. Если взрыва не надо - оставьте значение "0".
Остальные параметры - это параметры отображения.

Флаги:
Only trigger - объект будет разрушатся только при активации.
Touch - если отмечено, то объект будет разрушаться при прикосновении.
Pressure - объект разрушится при давлении.
Instant crowbar - объект разрушится мгновенно от удара ломом (монтировкой). Но так как монтировки в КС нету - этот флаг не работает (нож - не монтировка).


func_button

С помощью func_button можно создать кнопку, которой в последствии можно активировать другие обьекты. После нажатия кнопка будет двигаться в направлении указанном стрелочкой Angle. Так же, можно поставить значение Up или Down.
Name - имя кнопки.
Speed - скорость движения после нажатия.
Targetted object - имя объекта который кнопка должна активировать после нажатия.
Health - прочность кнопки. Если этот параметр выше нуля, то для активации кнопки в нее нужно будет стрелять. Активируется кнопка после того, как повреждения нанесенные ей привысят указанное значение.
Lip - расстояние в юнитах, на которое будет сдвигатся объект func_button после нажатия.
Master - имя точечного объекта multisource.
Sounds - звук при активации.
Delay before reset - числовое значение, которое определяет через какой промежуток времени кнопку можно будет активировать снова. Если значение "-1", то повторно кнопку активировать не получится.
Delay before trigger - задержка между нажатием кнопки и активацией объекта, имя которого указано в параметре Targetted object.
Locked sound, Unlocked sound, Locked sentence, Unlocked sentence - все это звуки при нажати на кнопку которая не работает, звуки тревоги при нажатии, и остальная ненужная халфовская чушь...

Флаги:
Don't move - если включен, то кнопка не будет двигаться после активации.
Toggle - кнопка будет "зажата" после активации. Чтобы ее деактивировать - нужно будет нажать еще раз.
Sparks - из неактивной кнопки будут вылетать искры.
Touch activates - кнопка будет активироваться если ее тронуть.


func_buyzone

Func_buyzone служит для создания на карте зоны закупки оружия и амуниции для террористов и контр-террористов.
Team - комманда, для котрой сделана эта зона закупки. Можно поставить только для КТ, только для Т, или сразу для обоих.


func_conveyor

С помощью этого объекта можно сделать конвейер на карте.
Name - имя конвейера, чтобы в последствии можно было включать\выключать его.
Conveyor speed - скорость движения (прокрутки) конвейера.
А остальное - это параметры отображения.

Флаги:
No push - если включен, то конвейер не будет двигать другие объекты (только игрока).
Not solid - конвейер становится нематериальным.

Чтобы было видно что конвейер двигается, браш нужно окрашивать текстурой, которая начинается со слова SCROLL (например, SCROLL_CONV3). А направление движения конвейера определяется стрелочкой Angle.


func_door

С этим можно создать дверь которая сдвигается в сторону (вверх, вниз...).
Name - имя двери, чтобы в последствии ее можно было активировать.
Kill target - имя объекта, который необходимо уничтожить после активации func_door, на все оставшиеся раунды.
Speed - скорость открытия и закрытия двери.
Master - имя точечного объекта multisource.
Move sound, Stop sound - звук при открытии дверей, и при остановке.
Delay before close - промежуток времени между открытием и закрытием дверей. Если значение равно "-1", то дверь после открытия в данном раунде больше не закроется.
Lip - по дефолту дверь сдвигается ровно на расстояние своей ширины\высоты. Параметр Lip может изменить это: если поставить отрицательное значение, то дверь будет глубже въезжать в стену, если указать положительное значение, то наоборот.
Damage inflicted when blocked - количество повреждений наносимых игроку при блокировании двери.
Target - цель которую дверь активирует после открытия.
Delay before fire - время задержки между закрытием двери и активацией объекта, имя которого указано в параметре Target.
Fire on close - имя объекта, который дверь активирует после закрытия.
Health - прочность дверей. Если этот парамет выше нуля, то в дверь можно будет стрелять, и она откроется когда количество нанесенных ей повреждений превысит указанное значение.
Locked sound, Unlocked sound, Locked sentence, Unlocked sentence - звуки при попытке открытия закрытых дверей (и другие звуки, при других действиях...).

Флаги:
Starts open - дверь сначала будет открытой.
Don't link - ???
Passable - дверь будет нематериальной, и через нее можно будет ходить.
Toggle - если включен, то дверь после открытия закрываться не будет пока ее снова не активировать.
Use only - дверь можно будет открывать только если нажать кнопку "use" (по дефолту "Е").


func_door_rotating

Эта энтити позволяет создать на карте вращающуюся дверь.
Name - имя двери.
Kill Target - имя объекта, который необходимо уничтожить после активации двери.
Speed - скорость открытия и закрытия двери.
Master - имя точечного объекта multisource.
Move sound, Stop sound - звук издаваемый дверью при открытии\остановке.
Delay before close - время от открытия до закрытия. Если установленно значение "-1", то дверь после открытия больше в данном раунде не закроется.
Lip - действие этого параметра в func_door_rotating не понятно, да и не нужно.
Damage inflicted when blocked - количество повреждений, которые нанесутся игроку если он блокирует дверь.
Target - имя объекта, который активирует дверь после открытия.
Delay before fire - время задержки между открытием двери, и активацией объекта, имя которого указано в параметре Target.
Fire on close - имя объекта, который активируется после закрытия двери.
Health - прочность двери. Если двери нанесут повреждения которые превысят указанное значание, то она откроется.
Locked sound, Unlocked sound, Locked sentence, Unlocked sentence - звуки при попытке открытия закрытых дверей (и другие звуки, при других действиях...).
Distance - этот параметр определяет угол (в градусах) на который будет открыватся дверь.

Флаги:
Starts open - дверь сначала будет открытой.
Don't link - ???
Passable - дверь будет нематериальной, и через нее можно будет ходить.
Toggle - если включен, то дверь после открытия закрываться не будет пока ее снова не активировать.
Use only - дверь можно будет открывать только если нажать кнопку "use" (по дефолту "Е").
Reverse dir - если установлен, то дверь будет открыватся в противоположную сторону.
One-way - дверь будет открыватся только в одну сторону.
X asis, Y asis - данные флаги указывают, по какой оси будет открыватся дверь.


func_escapezone

Зона спасения террористов на ES_*** картах.


func_friction

С помощью этой энтити можно создать скользкую область.
Percentage of standard - уровень сцепления игрока с поверхностью. Допустимые значения от 0 до 100. Чем значение меньше - тем сильнее игрок будет скользить.

Браш func_friction будет в игре нематериальным - поэтому его нужно тонким слоем накладывать поверх пола.


func_guntarget

Этот объект является движущейся целью. Траэктория движения указывается с помощью объектов path_corner.
Name - имя объекта.
Speed - скорость движения объекта (юнитов в секунду).
First stop target - имя первого объекта path_corner.
Fire on damage - имя объекта, который активирует func_guntarget, когда количество повреждений превысит указанное значение в параметре Damage to take.
Damage to take - количество повреждений, которые нужно нанести объекту func_guntarget, прежде чем он начнет движение, и активирует объект, чье имя указано в параметре Fire on damage.


func_healthcharger

При активации этого объекта, игроку начнет постепенно прибавляться здоровье (health). Максимум за один раз может прибавиться до 30 поинтов.
Global entity name - имя объекта env_global.


func_hostage_rescue

Эта энтити позволяет более точно, чем info_hostage_rescue определить место спасения заложников на карте. Если на карте имеется энтити func_hostage_rescue, то info_hostage_rescue не действует.


func_illusionary

Func_illusionary делает объект нематериальным.
Name - имя объекта.
Contents - по дефолту стоит Empty, но если поставить Volumetric Light, то внутри func_illusionary-браша можно будет плавать как в воде (игрок, так же, будет задыхаться).
Minimum light level - освещенность объекта, независимо от внешнего освещения.


func_ladder

Энтити func_ladder создает в игре невидимое зону, по которой можно лазить. С помощью этого объекта создаются лестницы.


func_mortar_field

Этот объект определяет место на карте, куда можно вызвать авиаудар.
Name - имя объекта.
Spread radius - точность наносимого удара, а точнее, радиус разброса бомб.
Repeat count - количество бомб сбрасываемых за один налет.
Targeting - способ наведения: Random - случайный, Activator - в точку активирования, Table - в место, куда указывает панель управления авиаударом.
X controller, Y controller - эти параметры должны совпадать с именами объектов momentary_rot_button, используемых для наведения с помощью панели управления авиаударом.


func_pendulum

Эта энтити создает на карте маятник - объект, который будет покачиваться из стороны в сторону.
Name - имя маятника.
Speed - скорость покачивания.
Distance - дистанция, на которую будет покачиваться маятник (в градусах).
Damping - этот параметр отвечает за замедление маятника. Если значение установленно, то маятник будет постепенно останавливатся, и в конце концов "застынет" посередине дистанции. Чем значение параметра Damping больше, тем быстрее произойдет остановка маятника.
Damage inflicted when blocked - повреждения, которые получит игрок если станет на пути у маятника.

Флаги:
Start on - сразу будет покачиваться.
Passable - делает маятник нематериальным, и через него можно будет ходить.
Auto-return - при активации, маятник будет возвращаться в исходную позицию.
X asis, Y asis - ось, по которой будет покачиватся маятник.


func_plat

Func_plat создает платформу, которая поднимается вверх когда игрок заходит на нее. Платформу нужно создавать в верхней позиции - она автоматически появится в нижней позиции в игре.
Name - имя платформы, для ее активации.
Move sound - звук при движении.
Stop sound - звук при остановке.
Sound volume - громкость звука.
Travel altitude - расстояние в юнитах. Если положительное значение, то платформа появится ниже на указанное число юнитов. А если значение отрицательное, то наоборот - платформа появится выше на указанное число юнитов. И в том, и в другом случае она все равно будет двигаться вверх.
Speed - скорость движения (подъема).
Minimum light level - уровень подсветки платформы, независимо от внешнего света.

Флаги:
Toggle - если установлен, то при активации платформа будет двигатся вверх\вниз.


func_platrot

Тоже самое что и func_plat, только при движении func_platrot еще и вращается. Как и func_plat - func_platrot нужно устанавливать в верхней позиции.
Name - имя для активации.
Move sound - звук при движении.
Stop sound - звук при остановке.
Sound volume - громкость звука.
Speed of rotation - скорость поворота платформы.
Travel altitude - расстояние в юнитах. Если положительное значение, то платформа появится ниже на указанное число юнитов. А если значение отрицательное, то наоборот - платформа появится выше на указанное число юнитов. И в том, и в другом случае она все равно будет двигаться вверх.
Spin amount - угол вращения платформы.
Minimum light level - уровень подсветки платформы, независимо от внешнего освещения.

Флаги:
Toggle - если установлен, то при активации платформа будет двигатся вверх\вниз.
X asis - по дефолту, платформа вращается по оси Z. Если отметить этот флаг, то она будет вращатся вокруг оси X.
Y asis - то же самое, только по оси Y.


func_pushable

Позволяет создать объект, который можно передвигать.
Name - имя объекта.
Target on break - цель, которую объект активирует когда разрушится.
Strength - "жизнь" объекта.
Material type - тип материала, из которого сделан объект.
Gibs direction - два варианта - или Random или Relative to attack. Если первое (по дефолту) - то ничего интересного не произойдет. Но если вы выберите Relative to attack - то после выстрела осколки полетят не куда попало, а в зависимости от того куда вы выстрелите - большинство частиц вылетят в том-же направлении в котором вошла пуля.
Delay before fire - время задержки между разрушением объекта, и активацией объекта, чье имя указано в параметре Target on break.
Gib model - модель обломков.
Spawn on break - предмет, который вывалится из объекта когда тот разрушится. В CS не работает...
Explode magnitude - сила взрыва при разрушении.
Hull size - размер объекта. Ставьте "0" - Point size.
Friction - трение между объектом и поверхностью.
Buoyancy - плавучесть объекта. Определяет насколько объект "уйдет" в воду, если его туда сбросить.
Minimum light level - уровень освещения объекта, независимо от внешнего света.

Флаги:
Breakable - если этот флаг установлен, то объект можно будет еще и разбить.


func_recharge

При активации этого объекта, у игрока начнет постепенно прибавляться количество бронежилета. Максимум за один раз может прибавиться до 30 поинтов.
Global entity name - имя объекта env_global.


func_rot_button

С помощью данного объекта можно создать рычаг, который поворачивается на определенный угол при нажатии, и после нажатия активирует указанный объект.
Name - имя объекта.
Targetted object - объект, который рычаг активирует после нажатия.
Master - имя точечного объекта multisource.
Speed - скорость поворота рычага.
Health - если указно значение больше 0, то в рычаг можно выстрелить, и он активируется.
Sounds - звук при повороте рычага.
Delay before reset - задержка между поворотом рычага, и его возвращением в исходную позицию.
Delay before trigger - задержка между нажатием рычага, и активацией объекта, имя которого указано в параметре Target.
Distance - угол поворота рычага (в градусах).

Флаги:
Not solid - делает рычаг не материальным.
Reverse dir - рычаг будет поворачиватся в противоположную сторону.
Toggle - если рычаг нажать, то он после этого не будет возвращатся в начальное положение, пока его снова не активируют.
X asis - по дефолту рычаг вращается по оси Z. Если отмечен этот флаг, то рычаг будет вращатся по оси X.
Y asis - то же самое, только по оси Y.
Touch activates - рычаг будет активироватся когда до него дотронутся.


func_rotating

С помощью этой энтити, можно создать вращающийся объект.
Name - имя объекта. При активации останавливается\начинает вращатся.
Rotation speed - скорость вращения.
Volume - громкость звука.
Friction - трение. Определяет насколько скорость вращения будет замедлятся, если установлен флаг Acc/Dcc.
Fan sounds - звук при вращении.
WAV name - путь к WAV-файлу со своим звуком.
Damage inflicted when blocked - уровень повреждений, которые нанесутся игроку, если он попытается блокировать объект своим телом.

Флаги:
Start on - в начале будет крутиться. Иначе, сначала нужно будет активировать объект, чтобы он начал вращение.
Reverse direction - будет вращатся в противоположную сторону.
X asis - по умолчанию объект вращается по оси Z. Если отмечен этот флаг, то он будет вращатся по оси X
Y asis - то же самое, только по оси Y.
Acc/Dcc - если отмечен, то объект будет разгоняться\замедляться.
Fan Pain - если включен, то будет наносить повреждения игроку когда он просто дотронется до объекта.
Not solid - делает объект не материальным - никого цеплять не будет.
Small radius - маленький радиус распространения (слышимости) звука.
Medium radius - средний радиус распространения звука.
Large radius - большой радиус распространения звука.


func_tank

Эта энтити используется для создания управляемой пушки.
Name - имя пушки (обязательно!). Оно нужно, чтобы управлять пушкой.
Target - имя объекта ambient_generic. Это звук при стрельбе из пушки.
Yaw rate - скорость горизонтального движения пулемета.
Yaw range - сектор горизонтального движения в градусах.
Pitch rate - скорость вертикального движения пулемета.
Pitch range - сектор вертикального движения пулемета в градусах.
Barrel length - длина ствола. Тоесть расстояние в юнитах от центра вращения до конца ствола.
Barrel horizontal - расстояние в юнитах от центра вращения, до центра ствола по горизонтали.
Barrel vertical - тоже самое, только по вертикали.
Smoke sprite - имя спрайта дыма при стрельбе.
Flash sprite - имя спрайта, имитируещего огонь на конце ствола (sprites/muzzleflash2.spr).
Sprite scale - масштаб спрайта.
Rotate sound - звук при вращении пулемета.
Rate on fire - скорострельность (выстрелов в секунду).
Damage per bullet - убойная сила пуль.
Firing persistence - "настойчивость" пулемета. Используется для неуправляемых пушек, которые стреляют во все что движется. Тоесть, если цели уже нет в "поле зрении" пушки, то она все равно будет продолжать огонь.
Bullet accuracy - точность выстрелов.
Minimum target range - минимальный целевой диапазон.
Maximum target range - максимальный целевой диапазон.
Bullets - тип пуль.

Флаги:
Active - используется для автопушек. Стреляет во все что движется.
Only direct - стреляет только по видимым целям.
Controllable - этот флаг указывает что пушкой можно управлять.

Чтобы пушка заработала, нужно сделать еще следующее:
Установите флаг Controllable, чтобы пушкой можно было управлять.
Создайте позади пушки браш окрашенный текстурой AAATRIGGER, и сделайте из него func_tankcontrols. В качастве мишени (поле Target) укажите имя func_tank'а.
Над пулеметом разместите CLIP-браш, чтобы игрок не мог в плотную подойти к пушке, и тем самым препятствовать ее движению.
Создайте около пулемета объект ambient_generic, с именем указанным в поле Target объекта func_tank. Во флагах укажите радиус звука. Так же, отметьте там Start silent - при старте не звучать, и Not looped - не повторять звук. И еще укажите путь к звуку в поле Path/filename.wav of WAV.


func_tankcontrols

Определяет область, из которой игрок сможет управлять пушкой.
Tank entity name - имя объекта func_tank.


func_tanklaser

Это то-же самое, что и func_tank, только стреляет лазерными лучами.
Env_laser Entity - имя объекта env_laser.

Объект env_laser нужно устанавливать примерно на конце ствола func_tanklaser. С этого места будет исходить лазерный луч при выстреле.


func_tankmortar

Этот объект очень похож на func_tank, только стреляем минами, и при выстрелах не видно траектории полета пуль.
Explosion magnitude - сила взрыва при выстрелах.

Остальные параметры и флаги точно такие же, как и у объекта func_tank.


func_trackautochange

Эта энтити позволяет переместить поезд (платформу) с одного пути на другой (можно на разных этажах).
Name - имя объекта (обязательно!).
Move sound - звук при движении (повороте).
Stop sound - звук при остановке.
Sound volume - громкость звука.
Travel altitude - высота подъема\опускания. По умолчанию будет подниматся\опускатся на указанное растояние, но можно изменить с помощью флагов.
Spin amount - угол поворота (в градусах).
Train to switch - имя поезда (платформы) для которого изменяется путь.
Top track - имя последнего объекта path_corner, определяющего конец одного пути.
Bottom track - имя первого объекта path_corner, определяющего начало нового пути.
Move\rotate speed - скорость подъема\опускания и вращения (юнитов в секунду).
Minimum light level - уровень освещенности объекта, независимо от внешнего освещения.

Флаги:
Auto activate train - не работает.
Relink track - не работает.
Start at bottom - если отмечен, то платформа появится в нижней позиции, и будет подниматся при активации.
Rotate only - только вращатся. Тоесть платформа не будет опускатся\подниматся, а только вращатся.
X asis - по дефолту платформа вращается по оси Z. Если установить этот флаг, то она будет вращатся по оси X.
Y asus - тоже самое, только по оси Y.

Реализация платформы:
В конечном объекте path_track первого пути, по которому платформа двигается изначально, не должен быть указан параметр Next stop target (следующая точка назначения). Вместо этого введите параметр Fire on dead end (запускать при достижении конца пути) - имя стрелки func_trackautochange. Теперь когда платформа подъедет к данной точке, она остановится, и активирует стрелку. После подъема\опускания\поворота, платформа продолжит ехать по пути, определенному параметром Bottom track в func_trackautochange.


func_trackchange

Func_trackchange позволяет перемещать управляемый поезд (func_tracktrain) с одного пути на другой. Поезд не будет двигатся после переключения пути, поэтому важно использовать управляемый поезд.
Name - имя объекта (обязательный параметр).
Move sound - звук при движении (повороте).
Stop sound - звук при остановке.
Sound volume - громкость звука.
Travel altitude - высота подъема\опускания. По умолчанию будет подниматся\опускатся на указанное растояние, но можно изменить с помощью флагов.
Spin amount - угол поворота (в градусах).
Train to switch - имя поезда (платформы) для которого изменяется путь.
Top track - имя последнего объекта path_corner, определяющего конец одного пути.
Bottom track - имя первого объекта path_corner, определяющего начало нового пути.
Move\rotate speed - скорость подъема\опускания и вращения (юнитов в секунду).
Minimum light level - уровень освещенности объекта, независимо от внешнего освещения.

Флаги:
Auto activate train - не работает.
Relink track - не работает.
Start at bottom - если отмечен, то платформа появится в нижней позиции, и будет подниматся при активации.
Rotate only - только вращатся. Тоесть, платформа не будет опускатся\подниматся, а только вращатся.
X asis - по дефолту платформа вращается по оси Z. Если установить этот флаг, то она будет вращатся по оси X.
Y asus - тоже самое, только по оси Y.


func_tracktrain

Эта энтити создает движущуюся платформу (поезд), которая будет ехать по определенному заранее пути. При создании, модель платформы необходимо ориентировать направо (на оси X - вид сверху). В самой игре, платформа появится в начальной точке движения, определяемой объектом path_track, и будет направлена на вторую точку пути.
Важной частью объекта func_tracktrain является ORIGIN-браш. Его расположение определяет как поезд (платформа) будет двигатся по точкам пути.
Другой важной частью является объект func_traincontrols. Он позволяет игроку определять движения поезда (вперед\назад), и его скорость. Просто создайте AAATRIGGER-браш на том месте платформы, где находится ее панель управления. Теперь из зоны этого браша (предварительно обращенного в func_traincontrols) игрок сможет упралять поездом (платформой).
Name - имя объекта (обязательный параметр!).
Sound - звук издаваемый поездом\платформой.
First stop target - имя начальной точки пути.
Distance between the wheels - расстояние между колесами. Определяет как поезд будет поворачивать вокруг углов. В качастве значения, обычно подходит длина поезда.
Height above track - высота поезда над объектами path_track. Низом поезда, считается центр ORIGIN-браша.
Initial speed - скорость платформы в начале раунда. Если значание положительное, то она начнет сразу двигатся. Для неуправляемых платформ, этот параметр является постоянной скоростью, но ее можно изменить с помощью path_track.
Speed - максимальная скорость для управляемых поездов (юнитов в секунду).
Damage on crash - сила повреждения игроку, если он вдруг попадет между поездом и препятствием.
Bank angle on turns - угол наклона поезда на поворотах.

Флаги:
No pitch (X-rot) - если отмечен, то поезд поворачивается только вокруг оси X.
No user control - игрок не может управлять поездом.
Passable - поезд становится нематериальным, и через него можно пройти.


func_train

Эта энтити создает движущуюся платформу, которой нельзя управлять. Она двигается по пути определенному объектами path_corner. Когда вы определяете путь из объектов path_corner - платформа при движении будет ориентироватся на них своим центром.
Name - имя объекта. При активации платформа будет ехать\останавливатся.
First stop target - укажите тут имя первого объекта path_corner.
Move sound - звук при движении.
Stop sound - звук при остановке.
Speed - скорость движения (юнитов в секунду).
Damage on crush - количество повреждений, которые получит игрок, если попадет между поездом (платформой) и препятствием.
Sound volume - громкость звука.
Minimum light level - уровень подсветки объекта, независимо от внешнего освещения.

Флаги:
Not solid - делает объект не материальным.


func_traincontrols

Определяет область, в которой игрок сможет управлять поездом. При движении поезда, func_traincontrols передвигается с ним.
Train name - имя поезда, которым должен управлять объект func_traincontrols.


func_vehicle

Эта энтити создает движущуюся платформу\машину, которая двигается в любом направлении, по желанию игрока. Кроме того вам понадобится еще и func_vehiclecontrols, и два объекта path_track, с помощью которых осущевствляется движение вперед и назад. При создании, модель машины нужно ориентировать направо (вид сверху), а в игре он появится на первом объекте path_track, и будет направлен на второй.
Name - имя машины. Установить обязательно!
First stop target - имя первой точки пути path_track.
Sound - звук издаваемый машиной.
Length of the vehicle - длина машины в юнитах.
Width of the vehicle - ширина машины в юнитах.
Height above track - высота над дорогой.
Initial speed - начальная скорость. Чтобы при начале раунда машина стояла на месте - ставьте значение 0.
Speed - скорость движения машины (юнитов в секунду).
Damage on crush - повреждения, наносимые при столкновении.
Volume - громкость звука.
Bank angle on turns - угол наклона машини при поворотах.
Minimum light level - уровень освещенности объекта, независимо от внешнего освещения.

Флаги:
No pitch (X-rot) - повороты только по оси Z.
No user control - игрок не может управлять автомобилем.
Passable - делает объект нематериальным - через него можно ходить.


func_vehiclecontrols

Определяет область, из которой игрок может управлять автомобилем (func_vehicle). При движении машины, func_vehiclecontrols будет двигатся вместе с ней.
Vehicle name - имя управляемой машины.


func_vip_safetyzone

Определяет область спасения VIP'а, на as_*** картах.


func_wall

Этот объект создает стену на карте, которой можно поменять параметры отображения. Например, сделать ее видимой или невидимой.

Если дать объекту func_wall имя (Name) и окрасить переключающейся текстурой, то с помощью активации объекта можно будет переключать текстуру.


func_wall_toggle

Этот объект очень похож на func_wall, только при активации он будет появлятся\исчезать.

Флаги:
Start invisible - сначала объект будет невидимым.


func_water

С помощью этого объекта можно создать на карте воду.
Параметры func_water такие-же как и у func_wall, за исключением:
Contents - тут можно выбрать тип жидкости (вода, слизь, лава).
Wave height - высота колыхания волн.

Флаги такие-же как и у func_door.


game_counter

Этот объект нужен для подсчета активаций, после чего (если количество активаций достигает указанной границы) активируется указанный объект.
Name - имя для активации.
Target - имя объекта, который активируется после достижения указанных активаций game_gounter'а.
Deley before trigger - задержка в секундах после достижения лимита активаций, и активацией объекта Target.
Killtarget - имя объекта, который уничтожится после достижения указанного количества активаций game_counter'а на все оставшиеся раунды.
Master - имя объекта multisource или game_team_master.
Init value - начальное значение счетчика.
Limit value - количество необходимых активаций.

Флаги:
Remove on fire - удалять объект game_counter, после достижения указанного количества активаций (удаляется на все оставшиеся раунды).
Reset on fire - сбрасывать значение счетчика, при достижении указанного числа активаций.


game_counter_set

Этот объект используется для изменения значения счетчика game_counter.
Name - имя для активации.
Target - имя объекта game_counter, значение которого нужно сменить.
Master - имя объекта multisource или game_team_master.
New value - новое значение счетчика game_counter, имя которого указано в параметре Tаrget (значение изменится после активации game_counter_set).

Флаги:
Remove on fire - уничтожить объект после активации, на все последующие раунды.


game_end

Game_end используется для завершения игры на данной карте, и смены карты на следующую, указанную в mapcycle.txt.
Name - имя для активации.
Master - имя объекта multisource или game_team_master.


game_player_equip

Этот объект используется для снаряжения оружием игрока, который его активирует.
Name - имя для активации.
Master - имя объекта multisource или game_team_master.
Остальные параметры определяют какое снаряжение давать игроку, а какое нет.

Флаги:
Use only - экипирует игрока только когда он активирует use'ом (по дефолту кнопка "E") данный объект.


game_player_hurt

Этот объект, при активации, отнимает у игрока указанное количевство жизни.
Name - имя для активации.
Damage to apply - количевство повреждений.
Master - имя объекта multisource или game_team_master.

Флаги:
Remove on fire - уничтожить объект после активации, на все последующие раунды.


game_player_team

Этот объект дает возможность игроку, который его активировал, сменить команду.
Name - имя для активации.
Game_team_master to use - имя объекта game_team_master, который указывает комманду в которую попадет игрок.
Master - имя объекта multisource или game_team_master.

Флаги:
Remove on fire - уничтожить объект после активации, на все последующие раунды.
Kill player - уничтожать игрока после смены комманды.
Gib player - разорвать игрока на мясо после смены команды.


game_score

С помощью этого объекта можно добавлять, или отнимать фраги у игрока.
Name - имя для активации.
Points to add (+/-) - количевство фрагов которые нужно добавить/отнять.
Master - имя объекта multisource или game_team_master.

Флаги:
Allow negative - можно сделать количество фрагов у игрока отрицательным значением.
Team points - добавляет/фраги всей комманде, к которой пренадлежит игрок.


game_team_master

Game_team_master работает как реле на карте, которое активирует указанный объект, только после выполнение указанного действия, указанной коммандой. Этот объект очень схож с объектом multisource, только с game_team_master можно разделять действия для разных комманд.
Name - имя для активации.
Target - имя объекта, который нужно будет активировать.
Delay before trigger - задержка, перед активацией объекта Target.
Kill target - имя объекта, который нужно уничтожить после активации game_team_master'а.
Trigger state - состояние переключателя. Допустимые значения: on, off и toggle. Если значение off - будет действовать только на выключенные объекты, on - только на выключенные, а toggle - будет действовать как триггер (будет переключать все объекты).
Team index - индекс комманды ("1" - террористы, "2" - контр-террористы, а "-1" - любая комманда).
Master - имя объекта multisource или game_team_master.

Флаги:
Remove on fire - удалить объект после активации, на все оставшиеся раунды.


game_team_set

При активации, этот объект изменяет индекс комманды указанного объекта game_team_master, на индекс комманды, к которой принадлежит игрок, активировавший game_team_set.
Name - имя для активации.
Target - имя объекта game_team_master, значение индекса комманды которого нужно изменить.
Delay before trigger - задержка, перед изменением индекса комманды у объекта, чье имя указанно в параметре Target.
Kill target - имя объекта, который нужно уничтожить после активации game_team_set.
Master - имя объекта multisource или game_team_master.

Флаги:
Remove on fire - удалить объект после активации, на все оставшиеся раунды.


game_text

Этот объект позволяет выводить текст на экран.
Name - имя объекта, для активации.
Target - имя объекта, который активируется после запуска game_text.
Message text - текст сообщения. Если вам нужно вывести несколько строк, то используйте комбинацию символов "\n" там, где нужно перевести строку.
X (0 - 1.0 = left to right) (-1 = center) - позиция текста на экране, по оси X. Значение "-1" установит координаты по центру экрана.
Y (0 - 1.0 = top to bottom) (-1 = center) - позиция текста на экране, по оси Y. Значение "-1" установит координаты по центру экрана.
Text effect - эффект при отображении сообщения.
Color1 - цвет текста.
Color2 - цвет подсветки.
Fade in time - время появления текста.
Fade out time - время исчезания текста.
Hold time - задержка текста на экране (от появления, до исчезания).
Scan time - задержка перед прорисовкой букв и строк (при использовании эффекта Scan out).
Text chanel - один из четырех каналов отображения сообщения. При использовании одного и того-же канала разными объектами game_text - предыдущая информация уничтожается.
Master - имя объекта multisource или game_team_master.

Флаги:
All players - отображать сообщения на экранах всех игроков, а не только у того, кто его активирует.


game_zone_player

Этот объект используется для запуска определенного события, в зависимости от места расположения игроков.
Name - имя объекта, для активации.
Target for IN players - имя объекта, который запускается для всех игроков, которые находятся в зоне действия game_zone_player'а.
Target for OUT players - имя объекта, который запускается для всех игроков, которые находятся вне зоны действия game_zone_player'а.
Counter for IN players - имя объекта game_counter, значение которого будет равно количевству игроков, которые находятся в зоне действия game_zone_player'а.
Counter for OUT players - имя объекта game_counter, значение которого будет равно количевству игроков, которые находятся вне зоны действия game_zone_player'а.
Master - имя объекта multisource или game_team_master.


gibshooter

Gibshooter используется для выброса на карту крови и костей.
Name - имя объекта.
Number of gibs - количество кровавых частиц (костей).
Delay between shots - задержка в секундах, перед выбросом.
Gib velocity - скорость вылета.
Course variance - отклонение от прамой при полете.
Gib life - длительность "жизни" выброшенных частиц, после чего они постепенно исчезнут.

Флаги:
Repeatable - можно активировать не один раз.


hostage_entity

Этот объект указывает место появления заложника.
Model - путь к модели заложника.
Skin - скин модели.


info_bomb_target

Определяет место закладки бомбы на картах de_***. Но лучше использовать func_bomb_target, так как с ним можно более точно указать границы зоны, в которой можно закладывать C4.


info_compile_parameters

Этот объект используется для указания параметров ZHLT-компиляторов, вместо указания их через командную строку. Все параметры данной энтити соответствуют параметрам ZHLT-компиляторов, подробнее о которых можно прочитать здесь.


info_hostage_rescue

Определяет зону спасения для заложников на картах cs_***. Но лучше использовать func_hostage_rescue, так как с ним можно более точно указать границы зоны спасения.


info_map_parameters

В этом объекте можно указать какая комманда может покупать оружие на карте, а какая нет. Так же, можно указать радиус взрыва бомбы на de_*** картах.
Weapon_buying - указание, какая комманда может покупать оружие, а какая нет.
Bomb radius - радиус взрыва бомбы (по умолчанию 500).


info_null

Энтити info_null используется для указания цели объекту light_spot. Просто укажите ему имя Name, и в поле Target объекта light_spot, укажите это имя. Теперь light_spot будет светить на info_null (это будет его цель).


info_player_deathmatch

Эта энтити определяет на карте место появления террориста. Ставить ее нужно немного выше уровня земли, чтобы игрок при появлении не "застрял" в полу.


info_player_start

Эта энтити определяет на карте место появления контр-террориста. Ставить ее нужно немного выше уровня земли, чтобы игрок при появлении не "застрял" в полу.


info_target

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


info_teleport_destination

Этот объект является местом, куда игрок телепортируется если попадет в trigger_teleport.


info_texlights

Днный объект используется как альтернатива файлу lights.rad. Чтобы использовать данный объект, необходимо вручную добавлять в него параметры, подобно multi_manager. Название параметра - это имя текстуры, для которой необходимо изменить значение света, а значение параметра - это значение света для указанной текстуры (как в параметре Brightness энтити light).

Если данный объект отсутствует в вашем .fgd файле, то его необходимо добавить туда вручную, добавив следующую строку:
@PointClass color(255 128 0) = info_texlights : "Texture Light Config" []


info_vip_start

Эта энтити определяет на карте место появления VIP'а. Ставить ее нужно немного выше уровня земли, чтобы игрок при появлении не "застрял" в полу.


infodecal

С помощью объекта infodecal, можно вставлять на карту декали. Этот объект используеться немного по-другому, нежели все остальные: чтобы поместить на карту декаль, необходимо сначала включить кнопку "Apply decals" (Shift + D). Далее, выберите нужный декаль из файла decals.wad, и потом, на 3D-виде, кликните левой кнопкой мышки там, где вы хотите расположить декаль, и на том месте появится объект infodecal с выбранным вами декалем.
Name - имя объекта.
Texture - имя текстуры декаля.

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


item_battery

С помощью этого объекта можно поместить на карту батарею для подзарядки энергии бронежилета (как в ХЛ).
Name - имя объекта.
Target - имя объекта, который активируется после того, как игрок возьмет батарею.
Delay before trigger - задержка перед активацией объекта, чье имя указано в поле Target.
KillTarget - имя объекта, который уничтожится после того как игрок возьмет батарею.

Флаги:
Not in deathmatch - буквально переводится как "Не в дезматче". Тоесть, по идее этот флаг не дает появится объекту на карте в дезматч-игре. В КС этот флаг действует так: если он отмечен - объект не появится на карте, а если не отмечен - то появится.


item_healthkit

С помощью этого объекта можно поместить на карту аптечку для подзарядки энергии здоровья (как в ХЛ).
Name - имя объекта.
Target - имя объекта, который активируется после того, как игрок возьмет аптечку.
Delay before trigger - задержка перед активацией объекта, чье имя указано в поле Target.
KillTarget - имя объекта, который уничтожится после того, как игрок возьмет аптечку.

Флаги:
Not in deathmatch - буквально переводится как "Не в дезматче". Тоесть, по идее этот флаг не дает появится объекту на карте в дезматч-игре. В КС этот флаг действует так: если он отмечен - объект не появится на карте, а если не отмечен - то появится.


item_longjump

С помощью этого объекта, можно поместить на карту longjump-рюкзак, для увеличения дальности прыжков (как в ХЛ).
Name - имя объекта.
Target - имя объекта, который активируется после того, как игрок возьмет longjump.
Delay before trigger - задержка перед активацией объекта, чье имя указано в поле Target.
KillTarget - имя объекта, который уничтожится после того, как игрок возьмет longjump.

Флаги:
Not in deathmatch - буквально переводится как "Не в дезматче". Тоесть, по идее этот флаг не дает появится объекту на карте, в дезматч-игре. В КС этот флаг действует так: если он отмечен - объект не появится на карте, а если не отмечен - то появится.

Вообще, не рекомендуется использовать item_ объекты на картах, так как они были задуманы для ХЛ, а в КС будут выглядеть нереалистично (кроме аптечки).


light

Этот объект помещает на карту источник света (лампочку).
Target - цель лампочки, на которую она будет светить. Если цель не указана - то лампочка будет работать как обычно.
Name - имя объекта. С помощью имени лампочку можно включать/выключать.
Brightness - цвет и яркость лампочки.
Appearance - тип лампочки (мерцающая, мигающая, пульсирующая...).
Custom appearance - в этом параметре вы можете определить пульсирование лампочки. Впишите буквы от "A" до "Z" ("A" - самый темный, "Z" - самый светлый), и укажите имя лампочки (независимо от того, будете ли вы его использовать). Например, если вы напишите в этом параметре abcdefedcba, то лампочка будет пульсировать от самого темного света, до яркого, и обратно.

Флаги:
Initially dark - вначале будет выключена.

Если в параметре Brightness вы укажите значение "0 0 0 0", то в самом деле, значение цвета будет равно "255 255 255", и яркость у лампочки будет средней, а не нулевой.


light_environment

Light_environment используется для указания параметров окружающего света, исходящего от бесконечно удаленного источника.
Pitch yaw roll - угол света.
Pitch - угол отклонения светового луча от горизонтали (значение "-90"). Значение больше "0" - отклонение вверх, а меньше "0" - вниз.
Brightness - цвет и яркость света.


light_spot

Light_spot позволяет создать направленный источник света на карте.
Name - имя объекта.
Target - объект info_target, на который будет светить лампочка.
Inner (bright) angle - угол внутреннего конуса светового луча, который будет сформирован вокруг оси Pitch. Свет в этой области будет самым ярким.
Outer (fading) angle - угол внешнего конуса светового луча, который будет сформирован вокруг оси Pitch. Свет в этой области будет темнее..
Pitch - угол отклонения светового луча от горизонтали. Значение больше "0" - отклонение вверх, а меньше "0" - вниз.
Brightness - цвет и яркость лампочки.
Is sky - тип объекта. Есть два варианта: No и Yes. В первом случае объект будет как обычная лампочка (с направленным светом), а во втором - light_spot будет определять свойства окружающего света.
Appearance - тип лампочки (мерцающая, мигающая, пульсирующая...).
Custom appearance - в этом параметре вы можете определить пульсирование лампочки. Впишите буквы от "A" до "Z" ("A" - самый темный, "Z" - самый светлый), и укажите имя лампочки (независимо от того, будете ли вы его использовать). Например, если вы напишите в этом параметре abcdefedcba, то лампочка будет пульсировать от самого темного света, до яркого, и обратно.

Флаги:
Initially dark - лампочка вначале будет выключена.


momentary_door

Momentary_door позволяет создать на карте сдвигающуюся дверь, которую можно активировать только при помощи momentary_rot_button.
Name - имя объекта.
Kill target - имя объекта который необходимо уничтожить после активации momentary_door, на все оставшиеся раунды.
Speed - скорость открытия двери.
Master - имя объекта multisource.
Move sound - звук при открытии дверей.
Stop sound - звук при остановке дверей.
Delay before close - временная задержка перед закрытием двери (после открытия).
Lip - по дефолту дверь сдвигается ровно на расстояние своей ширины\высоты. Параметр Lip может изменить это: если поставить отрицательное значение, то дверь будет глубже въезжать в стену, если указать положительное значение, то наоборот.
Damage inflicted when blocked - количевство повреждений наносимых игроку, когда его прижмет дверью.
Target - цель которую дверь активирует после открытия.
Delay before fire - время задержки между закрытием двери и активацией объекта, имя которого указано в параметре Target.
Fire on close - имя объекта который активируется после закрытия двери.
Health shoot open - прочность дверей. Если этот парамет выше нуля, то в дверь можно будет стрелять, и она откроется когда количество нанесенных ей повреждений превысит указанное значение.
Locked sound, Unlocked sound, Locked sentence, Unlocked sentence - звук при попытке открыть закрытую дверь (и другие звуки, при других действиях...).
Minimum light level - уровень освещенности объетка, независимо от внешнего освещения.

Флаги:
Starts open - вначале открыта.
Don't link - ???
Passable - дверь будет нематериальной, и через нее можно будет ходить.
Toggle - если этот флаг включен, то дверь после открытия закрываться не будет, пока ее снова не активировать.
Use only - дверь будет открываться только при нажатии кнопки "use".


momentary_rot_button

С помощью этого объекта можно создать кнопку (вентиль, рычаг...), которая будет открывать дверь momentary_door. Дверь будет постепенно открываться, взависимости от того, насколько повернут объект momentary_rot_button. Чтобы поворачивать объект momentary_rot_button, в игре следует зажать кнопку "use". Пока кнопка зажата - momentary_rot_button будет вращаться, а momentary_door будет открываться.
Name - имя объекта.
Targetted object - имя объекта momentary_door.
Speed - скорость вращения кнопки.
Master - имя объекта multisource.
Sound - звук при вращении.
Distance - угол (в градусах), на который можно повернуть объект momentary_rot_button.
Auto-return speed - скорость вращения, при возвращении кнопки в исходную позицию.
_minlight - уровень подсветки объетка, независимо от внешнего освещения.

Флаги:
Hack door - описать этот флаг трудно, поэтому давайте рассмотрим его действие на примере: создайте два объекта momentary_rot_button. Затем, укажите им одинаковую цель (Target). Этой цели на карте может не существовать - главное, чтобы в полях Target обеих объектов было одинаковое значение! После этого, у одного из объектов momentary_rot_button, укажите флаг Hack door. Теперь в игра он будет материальным (по дефолту momentary_rot_button в игре нематериальный). Теперь, когда вы активируете другой объект momentary_rot_button (у которого нет флага Hack door), то объект с флагом Hack door тоже будет вращаться. Таким-же образом сделан вращающийса мост в Half-life (в тренирочном курсе).
Not useable - кнопку нельзя активировать кнопкой "use" (при этом нужно активировать, например, триггером).
Auto return - автоматически возвращать кнопку в исходную позицию.
X axis - вращение по оси X (по дефолту используется ось Z).
Y axis - вращение по оси Y (по дефолту используется ось Z).

Так как momentary_rot_button является вращающимся объектом, не забудьте при его создании добавить к нему браш-ось (окрашенный текстурой ORIGIN).


multi_manager

Этот объект может контролировать до 16 различных объектов на карте.
Name - имя объекта multi_manager.

Флаги:
Multithreaded - позволяет активировать объект другим игрокам, независимо от того, включен ли он в данный момент.

Для того чтобы добавить какие либо действия в объект multi_manager, необходимо для начала отключить кнопку Smart edit (около угла объета Angle). Далее, жмите кнопку Add - после чего появится меню с параметрами Key и Value. Key - это имя объекта для активации, а Value - задержка перед активацией.

Пример: у вас определены такие ключи/значения:
Targetname multi - (имя самого объекта multisource)
sound1 0
sound2 10
Тогда, после активации объекта multi, сначала активируется объект sound1, а через 10 секунд объект sound2.


multisource

Этот объект позволяет создать некий сценарий, когда нужно выполнить несколько условий, для активации чего либо.
Name - имя объекта (обязательно). Укажите это имя в параметре Master всех остальных объектов, который будут использоваться multisource'ом.
Target - имя объекта, который нужно активировать после выполнения определенных условий.
Global state master - имя глобальной переменной, устанавливаемой объектом env_global, которую можно использовать для управления состоянием данного объекта multisource.

Пример использования:
Допустим, вы хотите открыть дверь только тогда, когда нажаты две кнопки. Для этого вам нужно в параметр Master обеих кнопок вписать имя объекта multisource, а в параметре Target объекта multisource, указать имя двери. Вот и все - теперь дверь откроется только тогда, когда будут нажаты обе кнопки.


path_corner

Объект path_corner нужен для создания связанного пути для func_train.
Name - имя объекта.
Next stop target - имя следующего объекта path_corner, к которому продолжит движение платформа func_train.
Fire on pass - имя объекта, который должен быть активирован когда поезд будет проезжать эту точку пути.
Wait here (secs) - время, на протяжении которого поезд будет стоять на данной точке пути, а только потом продолжит движение.
New train speed - во время проезда поезда через данную точку пути, ему можно сменить скорость движения на другую, указанную в этом параметре.
New train rot. speed - новая скорость вращения поезда.

Флаги:
Wait for retrigger - если этот флаг включен, то поезд остановится на данной точке пути, и продолжит двигаться дальше только после активации.
Teleport - если этот флаг установлен, то на данную точку пути поезд будет мгновенно телепортирован.
Fire once - только один раз активирует объект Fire on pass.


path_track

Этот объект является точкой пути для объекта func_tracktrain.
Name - имя объекта.
Next stop target - следующая точка пути (path_track). Если слудующая точка не указана, то func_tracktrain остановится на текущей.
Fire on pass - имя объекта, который должен быть активирован, когда поезд будет проезжать эту точку пути.
Branch path - имя дополнительной точки пути. Служит, например, для имитации стрелки на рельсах. После активации path_track'а, поезд будет двигаться не к точке Next stop target, а к точке Branch pass.
Fire on dead end - если Next stop target не указан (или объект не активирован для переключения на Branch path), то данный объект path_track считается точкой окончания пути. А параметр Fire on dead end активирует указанный в нем объект, когда поезд достигает этой точки (тоесть, конца пути).
New train speed - с помощью этого параметра можно изменить скорость поезда. При проезде через эту точку, скорость поезда изменится взависимости от значения параметра New train speed.

Флаги:
Disabled - выключен.
Fire once - только один раз активирует объект Fire on pass.
Branch reverse - при проезде этой точки пути стрелка автоматичечки переключится.
Disable train - выключить (остановить) поезд, когда он будет на этой точке пути.


player_weaponstrip

С помощью этого объекта, у игрока можно отобрать все оружие (в том числе и нож).
Name - имя для активации.


trigger_auto

Trigger_auto активирует указанный объект сразу после загрузки карты.
Target - цель, которую должен активировать триггер.
Delay before trigger - задержка перед активацией. Рекомендуется установить небольшую задержку перед активацией (0.5 секунд), чтобы остальные объекты на карте точно успели появится.
KillTarget - имя объекта, который нужно уничтожить после активации trigger_auto, на все оставшиеся раунды.
Trigger state - состояние переключателя.

Флаги:
Remove on fire - уничтожить объект после активации, на все оставшиеся раунды.


trigger_camera

Trigger_camera позволяет установить камеру, из которой можно будет наблюдать за определенными точками карты.
Target - цель, на которую будет указывать камера. Целью может быть любой именованный объект на карте.
Delay before trigger - задержка между "выключением" камеры (после указанного времени наблюдения - Hold time), и уничтожением объекта, имя которого указано в параметре KillTarget
KillTarget - объект, который нужно уничтожить после активации камеры на все оставшиеся раунды.
Name - имя камеры.
Hold time - время, на протяжении которого игрок будет смотреть в камеру.
Path corner - имя первого объекта path_corner, от которого камера начнет свое движение к слудующему path_corner.
Initial speed - стартовая скорость движения камеры.
Acceleration units/sec^2 - ускорение движения камеры.
Stop deceleration units/sec^2 - торможение камеры перед окончанием движения.

Флаги:
Start at player - первой точкой появления камеры будет место, где находятся "глаза" игрока.
Follow player - камера будет следить за игроком.
Freeze player - игрок не сможет двигаться, когда активирована камера.


trigger_changetarget

Trigger_changetarget позволяет сменить значения параметра Target любому другому объекту.
Target - цель, которой нужно изменить значение параметра Target.
Delay before trigger - задержка между активацией trigger_changetarget, и изменением значения объекту Target.
KillTarget - имя объекта, который нужно уничтожить после активации trigger_changetarget, на все оставшиеся раунды.
Name - имя объекта, для активации.
New target - новое значения параметра Target для изменяемого объекта.


trigger_counter

После определенного количевства активаций этого объекта, он активирует другой объект, чье имя указано в параметре Target.
Target - имя объекта, который должен активироваться.
Name - имя триггера. Если имя не указано, то для активации trigger_counter нужно пройти через него.
Kill target - имя объекта, который нужно уничтожить после активации trigger_counter, на все оставшиеся раунды.
Master - имя объекта multisource.
Delay before trigger - задержка перед активацией объекта Target.
Count before activation - необходимое количевство активаций trigger_counter.

Флаги:
Pushables - если этот флаг установлен, то триггер можно активировать не только при его пересечении, а еще и, например, затолкнув в него func_pushable.


trigger_gravity

Этот объект позволяет изменять уровень гравитации на карте для игрока, который его активирует.
Target - имя объекта, который активируется при активации trigger_gravity.
Name - имя, с помощью которого можно будет включать/выключать trigger_gravity.
Kill target - имя объекта, который нужно уничтожить после активации trigger_gravity, на все оставшиеся раунды.
Master - имя объекта multisource.
Delay before trigger - задержка перед активацией объекта Target.
Gravity - уровень гравитации. Значение этого параметра варьируется от 0 до 1, где 1 - это нормальный уровень гравитации.

Флаги:
Pushables - если этот флаг установлен, то trigger_gravity будет действовать не только на игроков, но и на объекты func_pushable.

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


trigger_hurt

С помощью этого объекта можно наносить повреждения.
Name - имя, с помощью которого можно будет включать/выключать trigger_hurt.
Target - имя объекта, который активируется при активации trigger_hurt.
Master - имя объекта multisource.
Damage - уровень повреждений.
Delay before trigger - задержка перед активацией объекта Target.
Damage type - тип повреждений (от огня, от холода...).

Флаги:
Target once - активирует объект Target только один раз.
Start off - в начале игры появляется выключенным.
FireClientOnly - в CS этот флаг не нужен, так как используется только в играх с другими персонажами (например, с монстрами).
TouchClientOnly - в CS этот флаг не нужен, так как используется только в играх с другими персонажами (например, с монстрами).


trigger_multiple

После пересечения, trigger_multiple активирует указанный объект на карте.
Target - имя объекта, который активируется при пересечения trigger_multiple.
Name - имя, с помощью которого можно будет включать/выключать trigger_multiple.
Kill target - имя объекта, который нужно уничтожить после активации trigger_multiple, на все оставшиеся раунды.
Master - имя объекта multisource.
Delay before trigger - задержка после пересечения триггера, и перед активацией объекта Target.
Delay before reset - задержка перед следующей активацией триггера. Тоесть, когда триггер активирован, то повторно его можно будет активировать только через определенное время.

Флаги:
Pushables - если этот флаг установлен, то триггер можно будет активировать pushable-объектами, а не только при пересечении его игроком.


trigger_once

После пересечения, trigger_once активирует указанный объект на карте.
Target - имя объекта, который активируется при пересечения trigger_once.
Name - имя, с помощью которого можно будет включать/выключать trigger_once.
Kill target - имя объекта, который нужно уничтожить после активации trigger_once, на все оставшиеся раунды.
Master - имя объекта multisource.
Delay before trigger - задержка после пересечения триггера, и перед активацией объекта Target.

Флаги:
Pushables - если этот флаг установлен, то триггер можно будет активировать pushable-объектами, а не только при пересечении его игроком.

По сути, trigger_once это тоже самое что и trigger_multiple, но с одним отличием - ему нельзя задать задержку перед повторной активацией.


trigger_push

Trigger_push используется для толкания игрока.
Target - имя объекта, который активируется когда игрок зайдет в trigger_push.
Name - имя, с помощью которого можно будет включать/выключать trigger_push.
Kill target - имя объекта, который нужно уничтожить после активации trigger_push, на все оставшиеся раунды.
Master - имя объекта multisource.
Delay before trigger - задержка после пересечения триггера, и перед активацией объекта Target.
Speed of push - скорость, с которой триггер будет толкать (двигать) игрока.

Флаги:
Once only - толкать только один раз.
Start off - триггер будет выключен вначале.
Pushables - если этот флаг установлен, то trigger_push будет толкать (двигать) не только игрока, но и объекты func_pushable.


trigger_relay

Trigger_relay - это реле. С помощью него можно, например, активировать несколько объектов одним триггером. Для этого установите на карту триггер, и несколько объектов trigger_relay. Далее, в поле Target триггера укажите имена всех объектов trigger_relay (они должны быть одинаковые). Теперь после пересечения триггера, будут активироваться объекты trigger_relay, которые в свою очередь будут активировать другие указанные объекты. Таким образом, при активации одного объекта, мы активируем сразу несколько.
Name - имя объекта для активации.
Target - цель, которую должен активировать trigger_relay.
Delay before trigger - задержка после активации триггера, и перед активацией объекта Target.
Kill target - имя объекта, который нужно уничтожить после активации trigger_relay, на все оставшиеся раунды.
Trigger state - состояние триггера (off, on, toggle). Если установлен в "off" - то триггер действует только на выключенные объекты, если "on" - действует только на включенные, а если установлен в "toggle" - работает как обычный триггер.

Флаги:
Remove on fire - удалять trigger_relay после активации, на все оставшиеся раунды.


trigger_teleport

Trigger_teleport позволяет телепортировать игрока в указанную точку на карте.
Target - имя объекта info_teleport_destination (телепортер будет телепортировать в точку, где находится info_teleport_destination).
Name - имя объекта для активации.
Kill target - имя объекта, который нужно уничтожить после активации trigger_teleport, на все оставшиеся раунды.
Delay before trigger - задержка после активации триггера, и перед телепортацией в точку, где находится объект info_teleport_destination.

Флаги:
Pushables - триггер может активироваться не только игроками, но и объектами func_pushable.


xen_hair

Этот объект позволяет установить на карте нечто, похожее на траву (вы могли видеть подобное на планете Xen в HL).
Name - имя объекта.

Флаги:
Sync movemen - если у вас несколько таких объектов на карте, и у них отмечен флаг Sync movemen, то они будут одинаково колыхаться. Иначе каждый будет это делать "по своему".


xen_plantlight

Этот объект позволяет установить на карте интересный вид растительности с планеты Xen (HL), при приближении к которому, его верхий колыхающийса отросток засунется внутрь растения, и при этом активирует указанный объект.
Target - имя объекта, который будет активирован после того, как
Name - имя объекта.


xen_spore_large

Этот объект позволяет установить на карте вид растительности с планеты Xen (HL), представляющий собой огромную шарообразную верхушку на нескольких высоких тонких стволах.
Name - имя объекта.


xen_spore_medium

Этот объект позволяет установить на карте вид растительности с планеты Xen (HL), представляющий собой небольшую шарообразную верхушку на нескольких не очень высоких тонких стволах.
Name - имя объекта.


xen_spore_small

Этот объект позволяет установить на карте вид растительности с планеты Xen (HL), представляющий собой маленькую шарообразную верхушку на нескольких невысоких тонких стволах.
Name - имя объекта.


xen_tree

Этот объект позволяет установить на карте вид растительности с планеты Xen (HL), представляющий собой что-то в виде большого когтя. При приближении к этому виду растительности, он начинает бить игрока своим острым концом, таким образом нанося ему повреждения.
Name - имя объекта.


Параметры отображения объектов
Автор: DigitalManiac

Многие браш-объекты (solid-based entities) позволяют регулировать их параметры отображения. Эти параметры разделены на четыре категории: Render FX, Render mode, FX amountи FX color.

Render FX

Параметр Render FX указывает визуальное представление объекта. Например, мигание, пульсирование, искажение...

  • Normal
  • Slow pulse
  • Fast pulse
  • Slow wide pulse
  • Fast wide pulse
  • Slow fade away
  • Fast fade away
  • Slow become solid
  • Fast become solid
  • Slow strobe
  • Fast strobe
  • Faster strobe
  • Slow flicker
  • Fast flicker
  • Constant glow
  • Distort
  • Hologram (Distort + fade)
Render mode

Render mode определяет как будет отображатся объект. Существует шесть режимов отображения:

Normal - нормальное отображение (по умолчанию).

Color - в этом режиме текстуры объекта изменяются в зависимости от цвета, указанного в параметре FX color. Уровень прозрачности контролируется параметром FX amount.

Texture - этот режим позволяет изменять прозрачность объекта. Уровень прозрачности определяется в параметре FX amount.

Glow - совместно с энтити env_glow, позволяет создать эффект ореола вокруг источников света. FX color определяет цвет дымки, а параметр FX amount определяет уровень ее прозрачности.

Solid - этот режим используется для объектов с текстурами имеющими прозрачные области. Объекты, имеющие текстуры с прозрачными областями, должны использовать данный режим отображения, и параметр FX amount равный 255.

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

FX amount

Обычно этот параметр используется для указания прозрачности объекта. Значения параметра от 0 до 255, как раз и определяют прозрачность: 0 - полностью прозрачный, 255 - полностью не прозрачный.

FX color

Для режимов отображения, которые требуют указания цвета (Color и Glow), параметр FX color определяет нужный цвет.


Световые лучи
Автор: DigitalManiac

Cейчас вы научитесь создавать световые лучи! 8-)

Для начала постройте, например, фонарь (из которого будет исходить световой луч):

Далее, создайте браш такой формы, какой должен быть луч, и окрасьте его текстурой FADE2 (или FADE1 - halflife.wad). А нижнюю сторону браша "закрасьте" текстурой BLACK:

Потом, выделите браш-луч, и сделайте из него энтити func_illusionary с такими пропертис:

Render mode - additive.
FX amount - примерно 30 (чем значение меньше, тем луч прозрачнее).

Теперь, осталось откомпилировать карту, и вы увидите красивый световой луч :)

Также, можно создать вращающиеся лучи. Для этого, создайте луч(и) как в прошлом примере, и не забудьте про ось (ORIGIN-браш), так как это вращающийся объект. Когда все готово, выглядеть должно примерно так:

Как видно на рисунке - есть лампочка, два луча, и ось вращения. Теперь, выделяем оба луча и ось, и делаем из всех трех объектов энтити func_rotating, с такими пропертис:

Render mode - additive.
FX amount - около 30.
Rotation speed - скорость вращения луча.

Флаги:
Start ON - установите этот флаг чтобы лучи сразу вращались. Иначе, сначала нужно будет активировать объект, чтобы он начал крутиться.
Not solid - при установке этого флага, лучи будут нематериальными (чтобы никого не цепляли при вращении).
Также, не забудьте отметить нужую ось вращения (X или Y). По умолчанию объект будет вращаться по оси Z.

Вот и все! После компиляции вы увидите вращающиеся лучи:


Камеры
Автор: DigitalManiac

Вы уже, наверное, встречали камеры на картах (например, на cs_assault или cs_militia). В этой главе вы научитесь создавать подобное и на своей карте.

Что-же собой представляет камера? А ничего сложного - просто точечный объект trigger_camera, который должен быть установлен на той точке карты, откуда в игре можно будет обозревать участки мапы. Камеры используются для двух случаев:
1. Чтобы можно было осматривать определенные участки карты с других мест уровня.
2. Для того, чтобы при старте уровня игрокам еще не выбравшим команду, показывались части карты из установленных камер (если камер несколько - картинка будет меняться через небольшие промежутки времени).

Для создания камеры на своей карте, вам (как уже говорилось) потребуется point-based entity - trigger_camera, а также любой другой именованный (!) объект, который будет служить целью для камеры (если подходящего нет - используйте точечную энтити info_target). После установки объекта trigger_camera, определите у него следующие параметры:

Target - цель, на которую будет указывать камера.
Name - имя камеры, для активации.
Hold time - время, на протяжении которого игрок будет смотреть в камеру.

Флаги: (необязательно)
Follow player - камера будет следить за игроком.
Freeze player - игрок не сможет двигаться, пока камера активирована.
Полный список параметров объекта trigger_camera можно найти здесь.

Теперь осталось только создать какой-либо объект (кнопку, монитор и т.д.), при помощи которого игрок сможет активировать камеру.

Также, можно использовать движущуюся цель (например, func_tracktrain), тогда камера будет следить за ней. А можно и камеру сделать движущейся, но это немного сложнее:

Установите на карту точки пути для камеры, с помощью объектов path_corner. Далее, укажите имя первого объект path_corner в параметре Path corner объект trigger_camera. Теперь, камера при активации начнет двигаться к указанному объекту path_corner, а от него ко второму (указанному в параметра Next stop target первого объекта path_corner), и так далее...

Также, не забудьте определить еще и такие параметры объекта trigger_camera, в случае с движущейся камерой:

Initial speed - стартовая скорость движения камеры.
Acceleration units/sec^2 - ускорение движения камеры, начиная со стартовой скорости.
Stop deceleration units/sec^2 - торможение камеры перед окончанием движения камеры.

Вид из камер, установленных на карте, будет также показываться при старте карты, пока игрок еще не выбрал команду и модель игрока. Например, на de_dust тоже есть камеры, и вначале уровня вы можете просмотреть определенные участки карты из них, но в игре из них нельзя наблюдать, так как не создано ни одного объекта которым можно было бы активировать их.


Звуки
Автор: DigitalManiac

Звуки - это как раз то, что придает карте больше реалистичности. В нашей повседневной жизни (в реале), мы практически всегда слышим какие либо звуки. Точно также должно быть на карте. Не только звуки выстрелов, взрывов, и переговоров игроков. Для полной реалистичности нужно добавить еще и звуки окружающей среды. А как это реализовать, вы и узнаете в этой главе.

Звуки на карту вставляются с помощью точечной энтити ambient_generic. Давайте подробно рассмотрим ее параметры:

Name - имя объекта. Если присвоить имя объекту ambient_generic, то можно будет включать\выключать его. Таким образом можно создать множество интересных эффектов.
Path/filename.wav of WAV - путь к звуковому файлу в формате WAV. Файлы со звуками, которые вы хотите воспроизводить на своей карте, должны обязательно находиться в папке cstrike/sound/.
Volume - громкость воспроизведения звука.
Dynamic presets - "стиль" воспроизведения. Например, можно сделать проигрывание звука пульсированным, возрастающим, etc.
Start volume - начальная громкость.
Fade in time - время (вначале воспроизведения), на протяжении которого звук будет переходить от стартовой громкости (Start volume), до установленного максимума (Volume).
Fade out time - время (в конце воспроизведения), на протяжении которого звук будет переходить от установленного максимума (Volume), до стартовой громкости (Start volume).

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

Флаги:
Play everywhere - звук будет слышен из любой точки карты.
Small radius - маленький радиус слышимости звука (800 юнитов).
Medium radius - средний радиус (1250 юнитов).
Large radius - большой радиус (2000 юнитов).
Start silent - вначале звук выключен.
Is NOT looped - проигрывать звуковой файл только один раз (без повторов).

С параметрами думаю все понятно. Поехали дальше...

Env_sound

С помощью env_sound можно изменять установки воспроизведения звука, в зависимости от типа помещения. Например, музыка в маленькой комнате с бетонными стенами, должна звучать иначе, чем в большой комнате с металлическими стенами. С помощью env_sound это легко реализовать.
Radius - радиус действия. Когда игрок заходит в эту зону, то установки звука меняются, в зависимости от указаного типа помещения (Room type).
Room type - тип помещения (боьшая комната, тоннель, помещение с металичекими стенами, под водой...).

Примечание: когда игрок попадает в зону действия env_sound, установки воспроизведения звука изменяются. Но когда игрок выходит из этой зоны, установки не переключаются в исходное положение - их нужно снова переключить другим объектом env_sound. Не забывайте про это!

Тип материала

Вы, наверное, играя в КС (ХЛ) уже заметили, что если ходить по разным текстурам (материалам), то слышен характерный для них звук. Например, при ходьбе по металлу - слышно звучание металла, по снегу - скрип снега, и так далее... Вам наверное интересно как это реализуется? Рассказываю:

В папке cstrike/sound/ есть файл materials.txt. В этом файле описано звучание для разных текстур:

'M' metal - металл
'V' ventillation - вентиляция
'D' dirt - грязь
'S' slosh liquid - жидкость
'T' tile - черепица
'G' grate (Concrete is the default) - бетон
'W' wood - дерево
'P' computer - компьютер
'Y' glass - стекло
'N' snow - снег

Следует упомянуть, что два слэша "//" означают начало комментария, который оканчивается в конце строки. Их не следует воспринимать как определение звуков для текстур.

Так вот, чтобы присвоить какое либо звучание текстуре, следует поместить имя текстуры после буквы определяющей тип звучания. Например, строка 'N snow' означает что текстура с именем "snow" должна иметь звучание снега, и так далее...

Внимание: не нужно редактировать файл materials.txt! Просто назовите используемые на карте текстуры именами, определенными в нем. Потому что, если вы вдруг решите отредактировать этот файл, то вам придется также поместить его в архив с картой. А если так начнет делать каждый - подумайте что получится: файл materials.txt будет каждый раз заменяться на новый, и старые определения будут теряться... Короче, будет плохо =)

Вот я и рассказал вам про звуки!


Поезда
Автор: DigitalManiac

То что энтити называются func_train и func_tracktrain, совсем не означает что это должны быть именно поезда. Можно сделать из них любой движущийся объект, например, как на карте de_survivor автор создал орла, кружащего над каньоном.

Давайте сначала разберемся с func_tracktrain:

Name - имя объекта. Присвоив func_tracktrain'у имя, в последствии его можно активировать (включать/выключать).
Sound - звук издаваемый поездом\платформой при движении.
First stop target - имя начальной точки пути (path_track).
Distance between the wheels - расстояние между колесами. Определяет как поезд будет поворачивать на поворотах.
Height above track - высота поезда (оси) над объектами path_track.
Initial speed - скорость платформы в начале раунда. Если значание положительное, то она начнет сразу двигатся. Для неуправляемых платформ, этот параметр является постоянной скоростью, но ее можно изменить с помощью параметра path_track - New train speed.
Speed - максимальная скорость для управляемых поездов (юнитов в секунду).
Damage on crash - сила повреждения, которые нанесутся игроку, если он вдруг попадет между поездом и каким либо препятствием.
Bank angle on turns - угол наклона поезда на поворотах.

Флаги:
No pitch (X-rot) - если отмечен, то поезд поворачивается только вокруг оси Z.
No user control - игрок не может управлять поездом.
Passable - поезд будет нематериальным, и через него можно пройти.

При создании, модель поезда необходимо ориентировать налево (на запад) (на оси Z - вид сверху). В самой игре он появится в начальной точке движения, определяемой объектом path_track, и будет направлена на вторую точку пути.

Важной частью объекта func_tracktrain является ось (ORIGIN-браш). Его расположение определяет как поезд будет двигаться по точкам пути.

Другой важной частью при создании управляемого поезда является объект func_traincontrols. Он позволяет игроку определять движения поезда (вперед\назад), и его скорость. Просто создайте браш, окрашенный текстурой AAATRIGGER на том месте поезда, где находится его панель управления. Теперь из зоны этого браша (предварительно обращенного в func_traincontrols) игрок сможет упралять поездом (платформой).

У объекта func_traincontrols есть только один параметр - Train name. В качестве значения нужно указать имя поезда, которым нужно управлять из этого объекта.

Путь func_tracktrain'а определяется объектами path_track. Пргосто расставьте их как вам нужно, и укажите в параметре поезда First stop target имя первого объекта path_track, с которого нужно начинать движение.

Параметры объекта path_track:

Name - имя объекта.
Next stop target - следующая точка пути (path_track). Если слудующая точка не указана, то func_tracktrain остановится на текущей.
Fire on pass - имя объекта, который должен быть активирован, когда поезд будет проезжать эту точку пути.
Branch path - имя дополнительной точки пути. Служит, например, для имитации стрелки на рельсах. После активации path_track'а, поезд будет двигаться не к точке Next stop target, а к точке Branch pass.
Fire on dead end - если Next stop target не указан (или объект не активирован, для переключения на Branch path), то данный объект path_track считается точкой окончания пути. А параметр Fire on dead end активирует указанный в нем объект, когда поезд достигает этой точки (тоесть, конца пути).
New train speed - с помощью этого параметра, можно изменить скорость поезда. При проезде через эту точку, скорость поезда изменится взависимости от значения параметра New train speed.

Флаги:
Disabled - выключен.
Fire once - только один раз активирует объект Fire on pass.
Branch reverse - после проезда этой точки пути, стрелка автоматичечки переключится.
Disable train - выключить (остановить) поезд, когда он будет на этой точке пути.

Взгляните на рисунок:

Думаю объяснять особо не нужно. Красная линия показывает путь поезда через установленные объекты path_trach.

В параметрах func_tracktrain'a указано следующее:

First stop target: p1
Initial speed: 300
Damage on crash: 100

Флаги:
No user control

Тоесть, мы создали неуправляемый игроком поезд, который вначале игры начнет ехать со скоростью 300 юнитов в секунду, и если игрок попадет под него - ему конец =) А на точке пути p6 поезд остановится. Но если в параметре объекта p6 Next stop target указать имя объекта p1, то поезд будет вечно ездить по кругу.

Теперь давайте разберемся с другим видом поездов - func_train. Для начала, как всегда рассмотрим его параметры:

Name - имя объекта. При активации платформа будет ехать\останавливатся.
First stop target - имя первого объекта path_corner.
Move sound - звук при движении.
Stop sound - звук при остановке.
Speed - скорость движения (юнитов в секунду).
Damage on crush - количество повреждений, которые получит игрок, если попадет между поездом, и препятствием.
Sound volume - громкость звука.
Флаги:
Not solid - делает объект не материальным.

Как видите, параметры func_train'а схожи с параметрами func_tracktrain'a. Но чем-же эти объекты отличаются друг от друга? Во-первых, func_train движется по пути, указанном объектами path_corner, а не path_track. Во-вторых, func_train не может быть управляемым. А в-третьих, func_train в отличии от func_tracktrain'а, при поворотах пути не вращается. Например, на повороте func_train просто изменит направление движения, когда func_tracktrain сам повернется, и поедет дальше.

Теперь давайте разберемся с параметрами объекта path_corner:

Name - имя объекта.
Next stop target - имя следующего объекта path_corner, к которому продолжит движение платформа func_train.
Fire on pass - имя объекта, который должен быть активирован, когда поезд будет проезжать эту точку пути.
Wait here (secs) - время, на протяжении которого, поезд будет стоять на данной точке пути, а только потом продолжит движение.
New train speed - во время проезда поезда через данную точку пути, ему можно сменить скорость движения на другую, указанную в этом параметре, иначе следует оставить прежнюю.

Флаги:
Wait for retrigger - если этот флаг включен, то поезд остановится на данной точке пути, и продолжит двигаться дальше только после активации.
Teleport - если этот флаг установлен, то на данную точку пути поезд будет мгновенно телепортирован с предыдущей.
Fire once - только один раз активирует объект Fire on pass.

Все! Вроде разобрались...

Следует еще только добавить, что поезд можно перемещать с одного пути на другой (как, например, в Half-life: поезд заежает на платформу, потом она вращается, и уже поезд продолжает движение по новому пути). Реализовать это можно с помощью func_trackautochange и func_trackchange.


Лифты
Автор: DigitalManiac

В этой главе описано создание лифтов на картах.

Давайте как всегда начнем с самого простого - func_plat:

Func_plat создает платформу, которая поднимается вверх, когда игрок заходит на нее. Платформу нужно создавать в верхней позиции - она автоматически появится в нижней позиции в игре.

Параметры этого объекта очень просты:

Name - имя платформы, для ее активации.
Move sound - звук при движении.
Stop sound - звук при остановке.
Sound volume - громкость звука.
Travel altitude - расстояние в юнитах. Если положительное значение, то платформа появится ниже на указанное число юнитов. А если значение отрицательное, то наоборот - платформа появится выше на указанное число юнитов. И в том, и в другом случае она все равно будет двигаться вверх.
Speed - скорость движения (подъема).

Флаги:
Toggle - если установлен, то при активации платформа будет двигатся вверх\вниз.

Также, существует другой вид такой платформы - func_platrot. Это тоже самое что и func_plat, только при движении func_platrot еще и вращается. Так как это вращающийся объект, то для него еще нужна ось (ORIGIN-браш) - не забудьте про нее =)

Параметры func_platrot почти ничем не отличаются от параметров func_plat:

Name - имя для активации.
Move sound - звук при движении.
Stop sound - звук при остановке.
Sound volume - громкость звука.
Speed of rotation - скорость поворота платформы.
Travel altitude - расстояние в юнитах. Если положительное значение, то платформа появится ниже на указанное число юнитов. А если значение отрицательное, то наоборот - платформа появится выше на указанное число юнитов.
Spin amount - угол вращения платформы.

Флаги:
Toggle - если установлен, то при активации платформа будет двигатся вверх\вниз.
X asis - по дефолту, платформа вращается по оси Z. Если отметить этот флаг, то она будет вращатся вокруг оси X.
Y asis - то же самое, только по оси Y.

Как видите, создать простую поднимающуюся платформу не составит никакого труда.

А теперь давайте рассмотрим более интересный вид лифта:

Вспомните, например, cs_siege - там есть лифт, который двигается вверх\вниз от нажатия кнопки. Реализуется это довольно просто: лифт - это func_door, а кнопки - это обычные func_button'ы.

Для начала, создайте из простых брашей модель лифта. Далее, выделите все его части, и сделайте из них func_door, с такими пропертис:

Name - имя лифта, чтобы в последствии его можно было активировать.
Speed - скорость движения.
Move sound, Stop sound - звук при движении лифта, и при остановке.
Lip - по дефолту лифт проезжает ровно на расстояние своей ширины\высоты. Параметр Lip может изменить это: если поставить отрицательное значение, то лифт будет проезжать дальше на указанное значение, если указать положительное значение, то наоборот.
Damage inflicted when blocked - количество повреждений, которые нанесутся игроку, если его прижмет лифтом.

Флаги:
Toggle - если включен, то лифт после передвижения от одной точке к другой, назад возвращаться не будет, пока его снова не активировать.

Также, не забудьте указать направление движения лифта стрелочкой Angle (или up\down).

Лифт готов! Теперь на каждом из двух этажей создайте кнопки, которые будут активировать лифт:

Targetted object - впишите сюда имя лифта.
Sounds - звук при активации.
Delay before reset - числовое значение, которое определяет через какой промежуток времени кнопку можно будет активировать снова. Если значение "-1", то повторно кнопку активировать не получится!
Delay before trigger - задержка между нажатием кнопки и активацией объекта, имя которого вписано в графу Targetted object. Советую установить небольшую задержку перед активацией, чтобы игрок после нажатия на кнопку успел зайи в лифт.
Флаги:
Don't move - если включен, то кнопка не будет двигаться после активации.
Touch activates - кнопка будет активироваться если ее тронуть. Если не хотите - не отмечайте это флаг =)

Теперь нужно настроить лифт на "правильное" движение. Посмотрите на такое расположение лифта:

При таком расположении, если лифт активировать - то он поедет вверх на растояние своей высоты, и в конечном итоге окажется в правильной позиции:

А если у нас этажи расположены по другому, например так:

То после активации, лифт продвинется совсем не так как мы ожидали:

В этом случае нам поможет параметр func_door - Lip. Просчитайте на сколько юнитов не доезжает лифт (или проезжает), и введите данное значение в параметр Lip объекта func_door. К примеру, рассмотренная на рисунках можель лифта не доезжает до второго этажа на 24 юнита, тогда в параметре Lip нужно ввести значение "-24" (без кавычек). Как видите - теперь все нормально:

Кстати, объект func_button может также двигаться. Так что можно создать кнопку в самом лифте, и при движении лифта сделать так, чтобы кнопка двигалась с ним, как будто это один объект =)

Также, вы можете создать множество других видов лифтов. Не забывайте про func_train - с ним можно реализовать намного больше возможностей, чем было описано в этойт статье! Подробнее про func_train читайте в главе "Поезда".


Спрайты и модели
Автор: DigitalManiac

В этой главе описано использование спрайтов и моделей на картах. Давайте по порядку:

Чтобы вставить на карту спрайт, можно использовать один из двух точечных энтитис env_sprite или cycler_sprite. Для начала рассмотрим параметры env_sprite:

Name - имя объекта. При активации можно включать\выключать отображение спрайта.
Framerate - скорость смены кадров в секунду (для анимированных спрайтов).
Path/filename.spr of sprite - путь к файлу .spr со спрайтом. По дефолту, спрайты находятся в директории cstrike/sprites/.
Sprite scale - масштаб спрайта. Значение по умолчанию равно единице (1) - это реальный размер спрайта. Чем это значение выше - тем больше будет "растягиваться" спрайт в ширину и высоту. Например, если установлено значение "2", то спрайт в игре будет отображать в два раза большем масштабе.

На первом рисунке Sprite scale = 1, а на втором Sprite scale = 2. Надеюсь, что мне удалось объяснить этот параметр :)

Флаги:
Start on - если указано имя Name, то спрайт вначале появится невидимым (выключенным), а этот флаг включит его.
Play once - если спрайт анимированнный, то анимация будет "прокручиваться" только один раз.

Поместите объект env_sprite на ту точку карты, где должен находиться спрайт, и определите параметры объекта. Но! В игре спрайт будет отображаться с черной "подложкой", что никому не нужно. Чтобы это исправить, установите в параметрах объекта Render mode: glow (additive), а FX amount: 0 - теперь "подложка" будет невидимой в игре.

Слудующий объект, с помощью которого можно поместить спрайт на карту - это cycler_sprite. Чем-же он отличается от env_sprite? А тем, что при выстреле в cycler_sprite, при паузе между сменами кадров - текущий кадр сменится на следующий. Эту возможность можно использовать для создания очень интересных эффектов - нужно только подключить свою фантазию ;)
А второе отличие в том, что при активации cycler_sprite'а (можно кнопкой "use" в игре), анимация будет останавливаться/воспроизводиться, а env_sprite будет становиться невидимым (выключаться).

Параметры объекта cycler_sprite ничем не отличаются от параметров env_sprite, за исключением того, что у cycler_sprite их немного меньше:

Name - имя объекта.
Sprite - путь к файлу .spr со спрайтом.
Frame per seconds - скорость смены кадров в секунду.

Вот со спрайтами и разобрались... Теперь разберемся с моделями:

Для вставки моделей на карту не нужно использовать ничего нового, в этом случае нам нужен объект cycler (если вы используете halflife-cs-exeprt.fgd v0.7.7), или cycler_sprite (если версия .fgd ниже 0.7.7). Просто в параметре Model (Sprite) - укажите путь к модели .mdl (cstrike/models/). Параметр Frame per seconds в этом случае определяет скорость смены анимации модели.

У многих моделей существует не одна анимация (действие). Если такая модель вставлена на карту, то в игре при ее активации, анимация сменится на следующую.

Вот и с моделями разобрались =)


CLIP-браши
Автор: DigitalManiac

CLIP-браши, это браши окрашенные текстурой CLIP (halflife.wad). Они нужны для того, чтобы создавать на карте непроходимые зоны (например, на краях карты). Можно, конечно, ставить просто стену, отправлять ее to Entity - func_wall с соответствующими параметрами отображения, но все-же проще поставить CLIP-браш.

В процессе компиляции этот браш обрабатывается так, что в игре он будет невидимый и непроходимый.

Попробуйте сделать это у себя на карте, чтобы хорошо понять как это работает. Кстати, CLIP-браши вы можете найти, например, на карте CS_ESTATE (около респауна контров), на AS_OILRIG (около вертолета), и еще на многих картах...


Текстуры с прозрачными областями
Автор: DigitalManiac

На многих картах есть лестницы, решетки... В игре между перекладинами на лестнице (или дырки на решетке) прозрачная область. Через нее все видно, но если посмотреть на некомпилированую карту, то можно заметить что там лестница представляет собой один браш. А там где в игре прозрачные места, в ВК синяя основа с регистром R=0 G=0 B=255 (RGB-формат). Попробуйте в игре пострелять по этим прозрачным местам... вы увидите что на них остаются декали от ваших выстрелов (пуль). Как-же это исправить? А вот об этом я вам и расскажу:

Стоит, кстати, сказать что имена всех текстур с прозрачной основой начинаются с символа"{".

Так вот, как-же решить вышеизложенную проблему с появлением декалей от пуль, при выстреле в невидимые части обьектов с прозрачными областями? А очень просто:
Сначала установите обьект с прозрачной текстурой, потом отправляете его to Entity в func_illusionary, и задаете такие параметры:

Render mode = solid
FX amount = 255 (именно эти два параметра делают синие части невидимыми в игре)
Остальные параметры оставьте без изменения.

Энтити func_illusionary делает браш как-бы нематериальным, то есть сквозь него можно ходить, стрелять... Не слишком реально? Тогда делаем дальше:
Потом наносим поверх этого браша (уже энтити) тонким слоем (какой-то рецепт торта:))) ) CLIP-браш. Вот теперь через наш обьект можно и стрелять и смотреть, а декалей от пуль на нем оставатся не будет!
Посмотрите на рисунок, который наглядно демонстрирует все это дело:

Конечно в случае с лестницей о CLIP-браше можно забыть, так как там место него будет func_ladder (подробнее читайте в главе "Лестницы").

Вот и разобрались с этим делом...


r_speeds
Автор: DigitalManiac

... вот и подошли к самому проблемному делу для мапперов, а именно r_speeds! Что-же это такое, и с чем его едят? Значит так: r_speeds это количество полигонов, которые обрабатывает движок. Например на кубе 6 фейсов - уже есть 6 полигонов.

Так значит зачем-же этот r_speeds нужен? А-а-ааа, он-то как раз и не нужен никому - чем он выше, тем меньше FPS. Чтобы узнать r_speeds на вашей карте, для начала запустите ее, потом откройте (опустите) консоль и пропишите в ней следующее:
developer 1
r_speeds 1
...и после этого вы узреете в вверху экрана бегущие циферки:

1. Это ваш ФПС.
2. А это нам не нужно...
3. Вот это и есть количество полигонов (wpoly).
4. А вот это тоже не нужно =).

Говорил когда-то Клиф, что количество wpoly нигде не должно превышать 600. Но это было давно - тогда еще компы слабые были :) Теперь уже можно и побольше допустить...

Теперь самое главное: когда вы бегаете по карте, вы видите на экране картинку - часть карты на которой, конечно-же, существуют обьекты (стены, ящики, пол, потолок...). В зависимости от того сколько объектов автор создал на карте - будеть зависеть и количество полигонов.

Ну вы уже поняли что это такое? Тогда начнем разговор о самом основном - о советах про снижение r_speeds на карте.

1. Движок обрабатывает все что видит игрок, и все что находится за энтитями. Например если у вас ящик - энтити, то движек прорисует все что есть за ящиком. Понятно? Так что старайтесь, не делать на карте стены func_wall'ами :) Так, поехали дальше...

2. Старайтесь не делать больших открытых пространств, и переграждайте видимость игрока всевозможными ящиками, стенами, ну и т.д.... Также не следует создавать на карте множество мелких предметов. Почему? Во-первых, больше обьектов - больше полигонов - больше r_speeds - меньше FPS -больше тормозит карта:( - поэтому много мелких частей (да и не только мелких) о-очень мешают игре. Во-вторых все браши соприкасающиеся с другими, разбивают их на дополнительные полигоны. Вот взгляните на эту "схему", и вы все сразу поймете:

Как видите, соприкасающиеся браши бьются на дополнительные полигоны. Так что вы уже, наверное, поняли почему нельзя создавать на карте очень много мелких предметов (тем более, если они соприкасаются с другими объектами). Хотя эта проблема разрешима! Нужно просто делать отступы между брашами в размере 1-го юнита. Тогда браши не соприкасаются, и соответственно не разбиваются на дополнительные полигоны. Способ второй: сделать мелкие браши энтитями. Энтити не разбивают соприкасающиеся с ними объекты на дополнительные полигоны:

Только за вами остается выбор какой способ использовать (лучше сделать мелкие браши энтитями, так как зазор в один юнит при детальном рассмотрении виден очень хорошо).

3. Рассмотрим следующую конструкцию:

Тут просто браши-колонны. R_speeds равен 146 полигонов. Теперь сделаем верхние и нижние части колонн func_wall'ами:

На рисунке: части обведенные краным - func_wall'ы, а там где обведенно зеленым - отступ в 1 юнит, который делать было и не надо (мы-же перевели "подставки" в func_wall, а энтити не разбивает браши при компиляции (было показано только для примера!)). Но если бы вы не сделали "подставки" энтитями - то отступ не помешал (тогда бы браш не "разбился" на более мелкие). Эффект очевиден! - после этой несложной процедуры r_speeds упал со 146 полигонов до 102.

Вывод: мелкие частицы (как уже упоминалось) лучше переводить в func_wall'ы. Тогда r_speeds снижается, причем неплохо снижается. Но! - энтити не отбрасывают теней. Поэтому если вы сделаете ящик энтитей, то тени не увидите, хотя r_speeds сбросите.

А выход оказывается есть, но только если у вас ZHLT выше версии 2.2. Если так и есть, то в параметрах энтитис (solid-based entity's), есть такой параметр, как Light Flags (Zhlt 2.2+), и по дефолту его значание установленно Normal, а если поставить Opaque + Embedded Fix, то появятся тени! Поняли? Дальше...

4. Есть один прикол: SKY-фэйсы (ну, окрашенные SKY-текстурой). Как известно, SKY-фэйсы и SKY-браши не обрабатываются движком как полигоны (например небо - за полигоны не считается:) ). Так вот: если у вас, например, есть на карте высокий ящик, верхний фэйс которого никто не сможет увидеть ни откуда (разве-что с выключенным sv_gravity:) ), то окрасьте этот фэйс текстурой SKY - он не обработается как полигон, и wpoly будет меньше. Конечно, один полигон вас не спасет, но если таких мест на мапе много, то этот способ о-очень пригодится, тем более если у вас завышенные показатели wpoly.

5. Еще один сущевственный совет от меня: всегда соединяйте браши, обрезая их углы. Не вот так:

А вот так:

Во первых вид в игре красивее. А во вторых иногда получается что wpoly бывает и меньше... Как видите, сущевствует куча методов снижения r_speeds.

5. Сущевствует еще один метод снижения r_speeds - браши с HINT и SKIP текстурами. Но об этом вскоре будет отдельная статья (потому-что очень долго расказывать и показывать).

Фууух! Вот и рассказал немного:) про полигоны... Так что перед тем как создавать новую карту - подумайте, можно ли будет ее реализовать с таким количеством полигонов, которое не будет превышать предельно допустимую норму.

Суть всего вышеизложенного должна быть вам понятна :)

Желаю вам низкого r_speeds везде и всегда...


Лестницы
Автор: DigitalManiac

Вы уже, наверное, встречали в КС лестницы (надеюсь что все знают что это такое:) ), например на CS_ASSAULT, CS_MILITIA... Сейчас я вам как реализовать это на вашей карте.

Сначала ставим браш, и закрашиваем его текстурой лестницы (текстура на прозрачной основе!), например {LADDER1. Высота лестницы может быть любая, и конечно лестница не должна быть толстой сбоку - сделайте ее плоской - пару юнитов. Потом отсылаем браш-лестницу to Entity, и выбираем там func_illusionary с соответствующими параметрами (зачем все это нужно, читай в главе 4). Потом, когда это готово, мы ставим перед лестницей еще один тоненький браш такой-же высоты и ширины, как и наша лестница. Далее закрашиваем его текстурой AAATRIGGER, и отправляем to Entity в func_ladder. Именно по этому func_ladder'у в игре и можно будет лазить (он будет невидим).

У вас возможно возник вопрос: почему мы не "облепили" нашу лестницу CLIP-брашами, как было показано в главе 10? А все потому, что CLIP-брашами мы "облепливаем" func_illusionary для того, чтобы в игре нельзя было через него пройти (энтити func_illusionary делает обьект нематериальным, и через него можно ходить, стрелять...). А в примере с лестницей CLIP-браш нам заменит func_ladder - через него тоже нельзя пройти, игрок по нему лазит (вверх - вниз:) ). Но если у вас лестница стоит не впритык к стене (как на CS_ASSAULT на базе Тероров), то надо или с другой стороны "прикрыть" ее также func_ladder'ом (тогда игрок сможет и с другой стороны лазить), или-же залепить CLIP-брашем.

Когда вы все построили, то оно должно выглядеть так:

А если лестница не возле стены (как описано выше), то должно получится так:

Если вы и с другой стороны вместо CLIP-браша решили поставить еще один func_ladder.

Или-же вот так:

Если вы с другой стороны поставили CLIP-браш.

Вот я и рассказал вам как строить лестницы...


Стекла
Автор: DigitalManiac

Сейчас я расскажу вам как создать на карте стекла.

Значит так! Сначала нужна, конечно-же, дырка (рама) для стекла. Если ее у вас еще нету, то сделайте ее с помощью утилиты Carve. Потом, когда все готово, пора создавать стекло:

1. Стекло неразбиваемое

Делаем браш-стекло (ну, конечно-же, тонкий) и закрашиваем его текстурой, имя которой начинается на "glass" (например glass_bright). Потом отсылаем этот браш-стекло to Entity и выбираем там func_wall со следующими параметрами:
Render mode: Texture
FX ammount: 0-255 (0 - полностью прозрачное, 255 - полностью непрозрачное, так что ставьте что-то среднее). А другие параметры оставьте без изменений.
Вот и получилось неразбиваемое стекло, осталось только карту откомпилировать...

2. Разбиваемое стекло

Делайте все точно также как и в случае с неразбиваемым стеклом, только отсылайте не в func_wall а в func_breakable с такими параметрами:
Render mode: Texture
FX ammount: (нужное число от 0 до 255)
Strength: жизнь стекла (если, например, 1 то стекло разобьется от одного выстрела или удара, а если, например, 100 то надо будет потратить много патронов)
Material type: тип материала - конечно-же ставьте Glass.
Вот и получилось разбиваемое стекло.

3. Стекло разбиваемое от триггера

Делайте все также как и с простым разбиваемым стеклом, только еще в пропертис func_breakable'а надо добавить имя (Name) и во флагах поставить Only trigger. Теперь осталось только триггер поставить (trigger_multiple, func_bomb_target-(с нужными пропертис)...), и дать в качестве цели (target) имя стекла.

Вот такой вид стекло имеет в ВК:

Такой вид оно будет иметь после компиляции (если вы конечно сделали все правильно:) )

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

Такое стекло реализовывается с помощью двух брашей. Делайте так, как бы вы делали простое стекло, только вместо одного плоского браша - ставьте два. Далее, окрасьте один из них текстурой стекла, а с внутренней стороны текстурой {BLUE, и отправьте его To Entity в func_wall с такими пропертис:
Render mode: solid
FX amount: 255
А второй окрасьте текстурой стекла, и также сделайте из него func_wall с такими параметрами:
Render mode: texture
FX amount: 0 - 255 (уровень прозрачности стекла)
Вот визуальный пример:

Вот как это будет выглядеть в игре:

Ну вот и все... Теперь попробуйте сделать стекло у себя на карте!


Двери
Автор: DigitalManiac

Вот и подошли к дверям...

Основных типов дверей 2: отъезжающие и открывающиеся.
Стандартный размер дверей 64х4х96 юнитов.

1. Отъезжающие
Давайте сначала разберемся каким образом можно реализовать открытие дверей:
1. От кнопки\рычага.
2. От use'a
3. От триггера

Кнопка\рычаг
Сначала, конечно, нужно сделать проем для дверей. Теперь, когда проем готов, вставляем в него браш-дверь.
Примерно так:

Теперь отсылаем браш-дверь to Entity в func_door. Потом определяем такие параметры:
Name - если дверь открывать кнопкой\рычагом (и триггером), то этот параметр обязателен - с помощью него мы и активируем дверь.
Speed - скорость открытия дверей.
Move sound - звук при открытии.
Stop sound - звук после открытия\закрытия.
Delay before close - время до закрытия (после открытия:) ). Если стоит значение "-1" то дверь не будет закрываться (только в одном раунде - в начале следующего она снова будет закрыта).
Damage inflicted when blocked - повреждения, которые нанесутся игроку если от встанет в проеме когда дверь будет закрыватся - его этой дверью хряснет:).
Target - имя обьекта, который дверь после открытия активирует (короче, это не обязательно!).
Ну а остальные параметры не важны (лично я ими никогда не пользуюсь) - не трогайте их...

Flags (флаги):
Starts open - при начале раунда открыта.
Passable - делает дверь нематериальной - через нее можно пройти.
Toggle - если флаг включен, то двери после открытия, закрыть можно будет только еще раз активировав (кнопкой, триггером, use'ом...).
Use only - Дверь будет открыватся только от Use'a (стандартная клавиша "Е" - в игре). З.Ы. Вот я и рассказал как двери делать открывающимися от Use'a:)
Остальные флаги не важны...

Кстати, в закладке Class info (там где вы выставляете параметры энтитям) есть такая вещь, как Angle: эта стрелочка указывает в какую сторону (на 3D-виде) будет отъезжать дверь. Также можно поставить Up\down, чтобы дверь отъезжала, соответственно, вверх\вниз.

Теперь надо сделать кнопку\рычаг для открытия дверей.

Кнопка
Делаем где-то около дверей (ну, как хотите) маленький браш-кнопку (закрашенный кнопочной текстурой).
Вот так:

Теперь отсылаем браш-кнопку to Entity в func_button со следующими пропертис:
Targetted object - здесь вписываем имя двери, которую нужно этой кнопкой открыть.
Delay before reset - время, через которое кнопку снова можно будет активировать. Лучше ставьте "0".
Во флагах ставьте Don't move чтобы кнопка не двигалась после нажатия. Если не отметить этот флаг, то кнопка будет двигатся в направлении указаном стрелочкой Angle.
Флаг Touch activates - если отмечен, то кнопка активируется когда до нее дотронется игрок, а не активирует.
Вот и готова кнопка!

Рычаг
Это, по моему, совсем ненужная фича, но если кому-то нужно, то вот рецепт создания:
Сначала нам нужна дверь (!обязательно дайте ей имя!). Когда дверь готова, делаем около нее браш-рычаг, можно сделать его из нескольких брашей:

Потом делаем ось вращения - браш закрашенный текстурой ORIGIN (точкой вращения служит центр браша). Запомните это - еще понадобится!

Получится примерно так:

Далее выделяем наш рычаг (браш\браши) и ось вращения (ORIGIN-браш), и отправляем его to Entity в func_rot_button c такими пропертис:
Targetted object - имя двери которую надо открыть.
Speed - скорость вращения рычага.
Delay before reset - время через которое снова можно будет активировать рычаг после его использования.
Distance (deg) - угол вращения в градусах. Если поставить 90 - то рычаг повернется на 90 градусов, ну и так далее...

Flags\флаги
Not solid - если включен, то в игре рычаг будет нематериальным - не будет цеплять игрока (я всегда это ставлю, если конечно пользуюсь рычагом вместо кнопки:) ).
Reverse dir - будет вращатся в обратную сторону. По дефолту крутится, вроде-бы, против часовой стрелки.
Toggle - короче, если нажали рычаг, он покрутился, а обратно не будет - только если его снова нажать.
X asis и Y asis - ну ось, по которой будет крутится рычаг. Если как на рисунке, то Y.
Touch activates - активируется только от прикосновения игрока.
Фуууу, разобрались...

Триггер (trigger)
Триггер - это браш окрашенный текстурой AAATRIGGER и отосланный to Entity в trigger_*** энтити (trigger_multiple, trigger_once...). В игре триггер невидим! Но после того как игрок пересечет его (или просто зацепит), то он активирует указанный обьект.

Чтобы открыть дверь триггером, надо сначала создать ее (дверь), и дать ей уникальное имя. Когда готова, то создаем около нее браш-триггер окрашенный текстурой AAATRIGGER, и расположим ее около двери. Вот так:

Теперь выделяем браш-триггер, и отсылаем to Entity в trigger_multiple с такими параметрами:
Target - впишите сюда имя двери. Когда игрок пересечет триггер - он активирует дверь, и она откроется. На рисунке триггер расположен только с одной стороны двери, в этом случае дверь можно будет открыть только с этой стороны. Обычно надо распологать два триггера с разных сторон двери (с одинаковыми параметрами).
Delay before reset - время, через которое триггер снова можно будет активировать после одного использования (ставьте 0).

Flags\флаги
Pushables - если этот флаг установлен, то триггер можно будет активировать не только игрокам, но и затолкнув в него, например, ящик (func_pushable).
Вот и рассказал вам как сделать отъезжающую дверь.

2. Открывающиеся
Открывающиеся двери (как на cs_militia) активируются как и отъезжающие (триггер, кнопка, use).
Делаем точно так-же как и в случае с отъезжающими дверьми: дырка, браш-дверь...

Когда браш-дверь готова (to Entity не отправлять!), строим ось - дверь-же вращаемая, поэтому нужна ось вращения. Точкой вращения будет центр ORIGIN-браша. Должно получится где-то так:

Потом делайте браш-дверь и браш-ось (!выделять оба обьекта!) и отправляйте to Entity в func_door_rotating с такими пропертис:
Точно такие-же как и у func_door'а, только еще:
Distance (deg) - угол вращения. Поставите 90 - повернется на 90 градусов. Ну, вы поняли:).
Ну а остальное не трогайте...

Flags\флаги
Starts open - в начале раунда дверь будет открыта.
Revers dir - ставьте чтобы дверь открывалась в противоположную сторону.
Toggle - если отмечена, то после открытия двери она не закроется пока снова ее не активировать.
X asis и Y asis - ось по которой дверь будет открыватся. Короче, не трогайте эти флаги - не будет-же дверь у вас вверх или вниз открыватся:).
Use only - если отмечена, то дверь можно будет открыть только активировав (в игре).

Двери еще можно сделать со стеклом. Для этого "вырежьте" в дверях (func_door_rotating) дырку, и вставьте туда другую дверь (тоже func_door_rotating) с текстурой стекла. Далее нужно организовать одновременное открытие дверей и стекла, и с одной скоростью. Тоесть, стекло должно вертеться вместе с дверью, по такой-же оси, как будто стекло и дверь, это одно целое, и скорость открытия обоих дверей должна быть одинаковая. Потом, дайте одно имя и двери с дыркой, и двери-стеклу, и открывайте их, например, с помощью триггера. Теперь будет дверь со стеклом... НО! Стекло должно быть прозрачное. Для этого просто измените параметры отображения двери-стекла на такие-же, как и у обычного стекла (Render mode: Texture, FX amount: от 0 до 255 (прозрачность стекла)).
Точно также, со стеклом, можно сделать не вращающуюся дверь, а отъезжающую. Просто и дверь, и дверь-стекло должны одновременно активироваться (с помощью имени), и вместе съезжать в одну сторону, с одинаковой скоростью.

И напоследок еще одно важное примечание: если имя двери не указано, тогда она будет открываться автоматически, когда игрок к ней притронется (func_door_rotating будет открываться от игрока, как на cs_militia).

Вот и разобрались с дверьми. Теперь попробуйте реализовать это на своей карте.


Вода
Автор: DigitalManiac

В этой главе я расскажу вам как создать воду на вашей карте.

Для начала нужно сказать что воду можно реализовать двумя способами:
  • Просто создать браш, окрашенный текстурой воды.
  • Создать solid-baset entity - func_water.
Давайте рассмотрим каждый способ подробнее.

1. Первый способ создания воды такой:
Просто построить браш окрашенный текстурой воды. Имена "водяных" текстур начинаются с восклицательного знака ( ! ), например !waterblue. После создания такого браша, в игре в нем можно будет плавать, тонуть... НО! В случае если вы предпочтете такой способ создания воды, то знайте - ваша вода не будет иметь волн, и не сможет двигатся. В этом случае нам поможет второй способ.

2. Второй способ создать воду, это использовать entity func_water.
Для начала создайте браш, окрашенный текстурой воды. Потом выделите его, и нажмите To Entity, а там выберите func_water, с такими параметрами:
Render mode - ставьте texture, чтобы вода была прозрачной.
FX ammount - уровень прозрачности (от 0 до 255).
Contents - тип воды (просто вода, кислота, или лава).
Wave height - уровень колыхания волн.
Также, у объекта func_water есть параметры как и у func_door'а. Это сделано для того, чтобы воду можно было двигать. Например, в халфе есть места, где вода начинает подниматься - это просто вода двигается вверх (как дверь). Чтобы сделать такое на своей карте, просто укажите воде параметры движения (там скорость, угол...), и не забудьте про имя. После этого создайте что-либо, что будет активировать func_water. Вот и все - вода будет двигатся.

Думаю я понятно объяснил как создать воду, и теперь пора переходить к более сложным примерам. Сейчас мы обсудим как создать воду с течением, и водопад.

Вода с течением
Для создания воды с течеием, которое будет двигать игрока, нужно 3 объекта: func_water, func_conveyor и trigger_push.

1. Создайте браш-воду. Используйте текстуру начинающуюся на SCROLL, например SCROLLWATER1. Это нужно, чтобы был эффект движения воды. Потом обратите этот браш в func_conveyor, и установите нужную скорость, и укажите направление движения с помощью стрелочки Angle. Установите флаги No push и Not solid. Not push - это чтобы конвейер не двигал игрока, потому что от конвейера нам нужет только эффект движения воды, а передвижением игрока займется trigger_push. А флаг Not solid нужно включить, чтобы конвейер был нематериальным (это-ж типа вода).

2. Сделайте копию объекта func_conveyor, и переведите ее в func_water. Установите параметры отображения: Render mode - Texture, FX amount - 0. После этого объект func_water будет невидимым. Нам нужен только эффект воды, а не ее отображение (этим func_conveyor займется).

3. Сделайте еще одну копию func_conveyor, и переведите ее в trigger_push. Установите направление движения стрелочкой Angle, и незабудьте указать скорость передвижения.

Вот теперь вода с течением готова - она и течет:) и двигает игрока по направлению течения.

Водопад
Для начала нужно создать браш, который будет водопадом. Окрасьте этот браш текстурой +1LASERFALL (halflife.wad). Текстура +1LASERFALL - анимированная, так что в игре будет эффект движения воды. Потом делаем из этого браша энтити func_illusionary, с такими параметрами:
Render mode - texture.
FX ammount - уровень прозрачности.
Contents - Empty.
Вот водопад и готов! Теперь возле него можно поставить ambient_generic, со звуком воды, и env_sprite, со спрайтом брызг (а лучше несколько, если водопад широкий).

Я надеюсь вы поняли все выше изложенное, и теперь прекрасно знаете как создать воду на карте во всех ее проявлениях :)


Counter-Strike Mapping

Данный файл содержит материалы с когда-то существовавшего в Сети, популярного сайта Counter-Strike Mapping, посвященного созданию карт для Half-Life: Counter-Strike.

Так как данный архив является копией сетевой версии сайта, то могут наблюдаться некоторые ошибки в навигации внутри материалов и другие несоответствия. Если вы вдруг обнаружите какие-то ошибки, пожалуйста, напишите мне об этом по адресу digitalmaniac@ua.fm и я постараюсь исправить эти ошибки в будущем.

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

Раздел "Статьи" содержит материалы от разных авторов, посвященные различным темам картостроения.

Раздел "Entities" содержит справочник по всем объектам entities в Counter-Strike.

В разделе "Старые материалы" содержатся мои старые туториалы по маппингу. Так как я писал их еще тогда, когда сам только начинал заниматься картостроением, то нетрудно догадаться что там имеется довольно большое количество ошибок и неверных утерждений. Но несмотря на это, "мусором" данные материалы считать нельзя. Они во многом дополняют раздел "Туториалы".

Примечание: так как проект Counter-Strike Mapping больше не существует, врядли будет наблюдатся какое-то пополнение в материалах. Особенно это касается раздела "Туториалы".

За более подробной информацией по картостроению и просто для общения с хорошими людьми, посетите наш форум - http://half-life2.ru/forum.

Со всеми вопросами, предложениями и просто так можете писать мне на мыло - digitalmaniac@ua.fm.

Форум: http://half-life2.ru/forum
Мой e-mail: digitalmaniac@ua.fm

DigitalManiac