Как написать игру на source

Если вы хотите научиться разрабатывать игры, моддинг существующих игр — отличное начало для изучения дизайна и создания прототипов без необходимости изобретать велосипед. В этой статье мы будем использовать Source Engine от Valve (на этом движке созданы Portal, Left 4 Dead, Half-Life и Team Fortress 2) для создания RPG-подобных квестов в Half-Life 2: Episode 2.

Обратите внимание, что эта статья подразумевает, что у вас есть базовые знания по Source SDK Hammer Editor и Face Poser, так что это проект не для начинающих, а скорее для программистов среднего уровня.

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

Для освоения этого материала вы должны знать, как создавать и компилировать карты, размещать сущности и настраивать триггеры, прежде чем повторять действия, описанные здесь. Если вы захотите добавить свои диалоги, вам нужно знать ещё и как создавать и сохранять сцены в Face Poser. Ничего страшного, если вы никогда не работали с Source SDK раньше — в интернете полно статей, описывающих, как им пользоваться. Начните с Valve Developer Wiki, которая содержит множество полезных статей по теме, затем сходите на design3 (кстати, я один из участников проекта) за пошаговыми видеоинструкциями по Source Engine. Минимальные системные требования для использования инструментов, описанных выше, такие же, как для запуска Half Life 2: Episode 2: процессор на 1.7 ГГц, 512 Мб RAM, DirectX 8.1 и Windows не ниже XP. Ещё вам понадобится микрофон.

Подготовка

Прежде чем мы начнём, убедитесь, что у вас есть всё необходимое. Во-первых, вам нужна установленная копия Half-Life 2: Episode 2. Мы будем использовать эту игру, потому что это самая новая одиночная игра на движке Source, к которой можно написать мод. Если у вас нет второго эпизода, скачайте его с то простой Half-Life 2 тоже должен подойти.

Если вы хотите добавить свой диалог в эту RPG, вам понадобится приложение для обработки аудио. Мы будем использовать Audacity — оно свободное, имеет открытый исходный код и отлично подходит для наших задач.

Нам также понадобится патч Phoneme Extractor, который поможет Face Poser лучше работать с Windows 7/Vista. Скачайте его и следуйте инструкциям по установке. Без него не будет работать соединение текста диалога со звуковой подложкой.

Дальше ставьте GCFScape. Он даст нам возможность открывать файлы кеша от игр Steam, так что мы сможем достать оттуда необходимые нам файлы. С его помощью мы будем вынимать аудио для нашего мода.

Если вы ещё этого не сделали, установите Source SDK. Для этого откройте Steam и переключитесь на вкладку «Инструменты». Вам понадобится своя карта, с которой мы будем работать (я буду называть её «основная карта»). Это может быть что угодно: от нескольких простых комнат до обширного ландшафта. Иллюстрация 1 — скриншот уровня, который я использовал для этой статьи, вы можете скачать его здесь.

Иллюцстрация 1 — наш уровень в Hammer Editor

Иллюстрация 1 — наш уровень в Hammer Editor

Сейчас наш уровень — просто грубый прототип, который полностью не текстурирован и не детализирован. Лучше всего именно с этого и начинать, а деталями заниматься уже в самом конце. Итак, давайте уже начинать делать нашу RPG. Не забывайте вовремя сохраняться! Некоторые нововведения в Hammer’е не полностью поддерживаются в Episode 2 и могут вызвать аварийное завершение редактора.

Создаём структуру квеста

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

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

Иллюстрация 2 — конвенция имён, которую мы будем использовать

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

Прежде чем мы всё-таки начнём делать квесты, нам нужно разбить их на меньшие компоненты, а именно:

  • Trigger Start: запускает задание;
  • Sprite: показывает, где квест может быть начат;
  • Giver: NPC, который даёт это задание;
  • Scene Start: диалог, описывающий задание;
  • Sound Start: звук, который уведомляет игрока о получении задания;
  • Text Start: текст, описывающий задание;
  • Relay Content: прослойка, которая запускает необходимые для квеста процессы (например, спаунер NPC);
  • Quest Components: основное содержимое квеста — после выполнения оно должно запустить Relay Complete;
  • Relay Complete: прослойка, которая настраивает уровень для последующего задания;
  • Text End: текст, который описывает, как выполнить задание;
  • Sprite: снова появляется, чтобы указать, с каким NPC нужно поговорить;
  • Trigger End: триггер, инициирующий окончание задания;
  • Scene End: заключительный диалог;
  • Sound End: звук, знаменующий окончание задания;
  • Next Quest Activation: если есть следующее задание, оно активируется здесь.

Если вы что-то из этого не поняли, не переживайте — пока мы просто составляем список всего необходимого. Это список лишь для одного задания, так что нам понадобится создать действительно много всяких сущностей. Чтобы не засорять мозг лишним, мы будем использовать VisGroups для разделения заданий и сокрытия того, что сейчас не нужно. VisGroups позволяет вам обозначить группы кистей и сущностей и быстро скрывать или показывать их. Если группа скрыта во время компиляции, всё, что содержится в этой группе, будет пропущено и не появится в игре. Это очень удобно, ведь вы можете избирательно просматривать отедльные группы объектов, сосредоточившись на них, а ничто другое вам мешать не будет.

Создание шаблона задания

Мы будем использовать шаблоны (instancing) — отличный инструмент Hammer Editor’а. Это позволит ссылаться нашей основной карте на другие. Мы создадим экземпляр задания, который в дальнейшем будем использовать как шаблон. После того, как мы его закончим, мы сможем просто раскопировать его и немного отредактировать настройки копий так, чтобы каждое задание стало уникальным. Таким образом, нам не придётся делать одну и ту же нудную работу много раз. К сожалению, Episode 2 не полностью поддерживает эту технологию, поэтому нам придётся конвертировать экземпляры в уровни перед компиляцией (мы коснёмся этого позже).

Для того, чтобы настроить наш шаблон задания, нам нужен новый файл карты. В Hammer’е выбирайте File, затем New, карту сохраните как «quest_instance» в папке «instances» в том же месте, где лежит ваша основная карта.

Иллюстрация 4 — так должен выглядеть наш quest_instance после добавления всех сущостей.

Иллюстрация 4 — так должен выглядеть наш quest_instance после добавления всех сущостей.

Лучше всего размещать сущности как можно ближе к координатам (0,0,0). Также стоит размещать их выше плоскости XY, чтобы не потерять при переносе. Для правильного размещения вы можете воспользоваться Selection Tool. Наш шаблон будет автоматически добавлять выбранный нами префикс ко всем сущностям внутри него. Триггеры и выставление некоторых значений буду описаны позднее, так что не переживайте, если вам показалось, что мы что-то упустили.

Нам понадобятся все сущности, упомянутые в списке выше. Давайте начнём с добавления NPC. Выберите Entity Tool, найдите npc_citizen в выпадающем списке и разместите его у начала координат. Этот парень будет давать нам задание. Нажмите Alt+Enter, чтобы открыть его настройки, и дайте ему имя «giver». Выставьте параметр Prevent picking up weapons? на Yes. Примените настройки нажатием на Apply и перейдите на панель Flags. Выставьте флаг Not Commandable, иначе наш работодатель будет всюду таскаться за игроком по карте. Выставьте ещё Don't drop weapons и Ignore player push (чтобы он не уступал дорогу игроку).

Теперь нам понадобится триггер, который будет отслеживать, подошёл ли игрок к… Давайте называть его Гриша, потому что «этот парень» или «quest giver» звучат не очень хорошо. Так вот, чтобы отслеживать, подошёл ли игрок к Грише, создайте кисть со следующими размерами: 64 юнита в высоту, 32 юнита в ширину, 4 юнита в длину — и разместите объект прямо перед Гришей. Назначьте этому объекту текстуру nodraw, чтобы она не рендерилась. Чтобы изменить текстуру, выделите объект, переключитесь на Toggle texture, нажмите кнопку Browse, используйте фильтр по nodraw, двойным кликом выберите его и примените параметры (кнопка Apply). Затем назначьте этой сущности триггер, нажав Ctrl+T и выбрав func_button из списка. Назовите его «trigger_start» и измените скорость (speed) до нуля. Снова сохраните изменения.

Теперь давайте добавим спрайт, который будет уведомлять игрока, что у этого NPC есть задание. Поместите сущность env_sprite сверху от головы Гриши и откройте окно Object Propeties, нажав Alt+Enter. Назовите его «Sprite». Теперь нам нужно изменить режим ренедринга, чтобы спрайт отображался в игре корректно. В том же окне найдите опцию Render Mode и выберите World Space Glow из выпадающего меню. Вы можете изменить текстуру этого спрайта, используя это меню, если хотите. Убедитесь, что во кладке Flags стоит галочка напротив Start on.

Займёмся диалогом. Найдите в списке сущностей logic_choreographed_scene и поместите его за Гришей. Нам понадобится минимум две таких на каждый квест — одна для начального диалога, вторая для заключительного — так что скопируйте её и вставьте вторую поверх первой. Дайте им имена «scene_start» и «scene_end» соответственно. Добавление собственно диалога мы рассмотрим несколько позже.

Кроме всего этого, нам ещё нужны звуковые уведомления о том, что игрок получил задание и о том, что он его выполнил. Создайте две сущности ambient_generic, поместите их рядом с NPC и назовите «sound_start» и «sound_end». Если у вас нет своих подходящих звуков, используйте platselevbell1.wav (вводить нужно в поле Sound Name). На вкладке флагов все три опции должны быть отмечены галочкой.

После этого нам нужно добавить текст, который будет описывать задание. Создайте две сущности game_text и назовите их «text_start» и «text_end». Выставьте для обеих достаточно высокий параметр Hold Time (порядка 99999), чтобы текст не исчез, пока мы сами его не уничтожим. Нам нужно, чтобы текст был сбоку экрана и не мешал игроку, так что выставьте у обеих сущностей поля X и Y на 0.1.

Нам понадобится несколько прослоек, чтобы систематизировать триггеры. Прослойка (relay) — сущность, которая при активации запускает другие сущности. Одна прослойка обычно запускает действия, которые должны выполняться в одно время и в одном месте, чтобы ими было удобнее управлять. Создайте две сущности logic_relay и разместите их рядом с Гришей. Назовие их «relay_content» и «relay_complete». Эти две прослойки будут запускать все сущности в задании. Особенности конкретного задания придумайте сами — вам нужно установить для игрока цель вроде «собрать столько-то таких-то предметов» или «добраться до такого-то места». Для проверки выполнения этих условий вы можете использовать такие сущности, как math_counter или сущности областей вроде trigger_once. Когда эти сущности выяснят, что задание пройдено, они должны будут запустить «relay_complete», который, в свою очередь, запустит всё необходимое для ознаменования конца задания.

Добавим ещё один триггер напротив Гриши. Он будет практически идентичным стартовому триггеру, поэтому просто скопируйте «trigger_start» и переименуйте его в «trigger_end». Убедитесь, что флаг Starts locked включен. Убедитесь, что эти сущности не перекрывают друг друга и что стартовый триггер находится перед хитбоксом NPC (иначе игра будет путаться, выбираете ли вы триггер или «кнопку»), используя виды сверху и сбоку. Чтобы определить местонахождение хитбокса, выберите Гришу — вокруг него появится жёлтая рамка.

Теперь настроим триггеры, как показано на Иллюстрации 5. Вам пока не стоит переживать за триггеры в квадратных скобках, их мы добавим позже. Выберите перечисленные сущности, откройте их Object Properties, зайдите во кладку Outputs и настройте всё в соответствии с таблице ниже. Убедитесь, что вы сохраняете все изменения (кнопка Apply)!

Иллюстрация 5 — настройка триггеров. Заголовки: Выбранная сущность  Активировать по...  Активируемая сущность  Что активировать у сущности

Иллюстрация 5 — настройка триггеров.
Заголовки: Выбранная сущность Активировать по… Активируемая сущность Что активировать у сущности

Размещаем шаблоны

Наш шаблон готов, теперь мы можем размещать такие шаблоны по карте и настраивать их более детально. Разместите «func_instance» где вам удобно, откройте его Object Properties и под VMF Filename найдите ваш файл «quest_instance». Обратите внимание, что поиск работает несколько багованно, так что вам может потребоваться ввести путь к файлу вручную. Теперь вы можете раскопировать этот шаблон по карте: создайте столько заданий, сколько хотите.

Выберите первое задание и дайте ему импортировать все необходимые сущности (нажимайте Instancing, Collapse, Selection). Hammer даст всем сущностям префикс, по умолчанию «AutoInstance-». Всё импортированное будет выделено, нам останется только добавить их в одну группу через VisGroups. Откройте Object Properties и выберите там вкладку VisGroups. Вы увидите примерно следующее:

Иллюстрация 6 — настройка VisGroups

Иллюстрация 6 — настройка VisGroups

«Sewer» и «Main level» — группы, которые я создавал раньше, так что это нормально, что у вас их нет. Нажмите на «Edit Groups» и вы увидите следующее:

Иллюстраци 7 — добавление областей и сущностей в группы

Иллюстраци 7 — добавление областей и сущностей в группы

Здесь вы можете создать новые группы, которые потом будете использовать. Нажмите «New group» и вы увидите новый элемент в списке. Переименуйте его в «Quest_n», где n — номер задания. Как закончите с этим, нажмите «Close», вы увидите свою группу в главном списке. Отметьте чекбоксами для добавления сущностей в группу, нажмите «Apply», затем снова «Close». Тперь вы можете скрывать или просматривать группы, используя панель управления VisGroup, как показано ниже. Делайте так с каждым вашим заданием.

Иллюстрация 8 — готовая группа

Иллюстрация 8 — готовая группа

Добавление собственных звуковых файлов

Наша РПГ была бы крайне скучна без диалогов, раскрывающих историю, так что мы запишем их через Audacity. Для начала у вас должен быть микрофон. Из-за особенностей работы Face Poser вам стоит записывать по одному предложению за раз. С Audacity всё просто — настройте микрофон, нажмите на красную кнопку, скажите что-то, остановите запись и сохраните файл в формате .wav. Если у вас возникли какие-то проблемы, можете смело использовать встроенную справку, она очень хорошо сделана. Как закончите, создайте папку «RPG» и поместите в неё все файлы. Папку эту переместите в C:/Program Files/Steam/steamapps/half-life episode two/ep2/sounds/. Сохранение всех файлов в папку на один уровень выше «sounds» принципиально — иначе движок их просто не увидит.

Идём дальше. Создайте файл «sound_script», чтобы движок мог связать наши звуки в редакторе с игрой. Запустите GCFScape, перейдите к File->Open, перейдите к своей папке «steamapps» и откройте файл «episode two content.gcf». После того, как GCFScape его прогрузит, вам нужно будет найти файл «game_sounds_manifest.txt», который размещён в «/steamapps/ep2/scripts». Нажмите на него правой кнопкой мыши и выберите «Extract» и разместите этот манифест в «/steamapps/half-life 2 episode two/ep2/scripts». С GCFScape мы закончили, можете закрывать его.

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

Listing_1

Файл манифеста можно уже закрывать. Создадим файл «rpg_sounds.txt», на который мы ссылаемся и запишем в него следующее:

Listing_2

Первая строка — имя звука, которое отобразится в Face Poser: «rpg_sounds» — префикс, а вторая часть — собственно имя. Вы можете менять их как вам угодно. Следующие четыре строки говорят движку, что ему с этими звуками делать, примите их просто как данное. Последняя строчка — .wav файл, который будет загружаться, и относительный путь от папки «/steamapps/half-life 2 episode two/ep2/sound/». Всё, что вам нужно сделать — поместить в эту папку все свои звуковые файлы и убедиться, что их имена и расширения совпадают с указанными в скриптовом файле.

Если у вас стоит Windows Vista или Windows 7, нам придётся немного помочь Face Poser. Как указано выше, вам для этого понадобится патч Phoneme Extractor. Тут стоит упомянуть, что Source SDK обновляет себя каждый раз, как вы его запускаете, поэтому патч нужно ставить каждый раз, как вы открываете Source SDK. Да, это утомительно, но это самый простой путь, поверьте.

С открытым Face Poser мы начнём создавать новую сцену. Под меню «Choreography» нажмите «New». Я порекомендую вам сразу же её сохранить. Имя выберите сами, а папка для сохранения — «/steamapps/half-life episode two/ep2/Scenes/RPG_MOD/». Её потом будет гораздо проще найти, если вы дадите ей какой-то префикс, например, «RPG_». Теперь Face Poser попросит вас дать имя главному действующему лицу (Actor). Назовите его «!_targetN», где N — число от 1 до 8, т.к. у нас будет до восьми NPC в каждой сцене. Hammer будет использовать того NPC, которого вы укажете. У нас пока есть только Гриша, поэтому назовём действующее лицо «!_target1». Сделайте правый клик по имени действующего лица, которое появилось в меню «Choreography», затем перейдите к New->Channel->Create Channel box. Назовите этот канал «Audio». Теперь создайте ещё один канал и назовите его «Anim» (для анимации).

Теперь нам необходимо отсортировать наши аудиозаписи. В списке вкладок в нижней части экрана Face Poser дважды нажмите на «Phoneme Editor». В открывшемся окне нажмите «Load» и выберите .wav файл, который вы хотите добавить. Затем нажмите на «Re-extract», и Face Poser предложит вам написать содержимое аудиофайла текстом. Впишите его. Теперь, если вы нажмёте на кнопку проигрывания, вам будет показано лицо действующего лица, губы которого будут двигаться. Можете сохранять всё и закрывать это окно. Эти действия необходимо повторить для каждого звукового файла.

Иллюстрация 9 — проигрывание анимации и звуковой подложки

Иллюстрация 9 — проигрывание анимации и звуковой подложки

Если вы хотите добавить жесты, выражения лица или другую анимацию, Вам стоит делать это сейчас. Я не буду рассказывать, как это сделать в этой статье, вы можете прочитать об этом где-то ещё. Далее сохраните свою сцену (Choreography->Save). Теперь осталось применить эту сцену к нашему NPC.

Добавление стороннего аудио к NPC

Теперь нам нужно настроить диалог. Нам нужно добавить созданные нами сцены к «scene_start» и «scene_end», которые мы создавали раньше. Для этого нажмите Alt+Enter, чтобы открыть Object Properties, там найдите опцию «Scene file». Назначьте ей недавно созданную сцену и сохраните изменения. То же самое сделайте для «scene_end».

Активация событий

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

Игроку нужно убить пять врагов. Каждый раз, когда умирает враг, math_counter увеличивается на единицу. Когда счётчик доходит до пяти, math_counter вызывает logic_relay. В свою очередь, logic_relay прекращает спаун мобов, активирует NPC и «relay_complete».

Настройка автосохранения

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

Конец игры

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

Иллюстрация 10 — сущности для титров

Иллюстрация 10 — сущности для титров

Заключение

Я рассказал всё, что хотел. Теперь вы можете создавать любые виды заданий, умеете работать с триггерами и, в общем-то, можете начинать писать свои несложные моды к играм. Удачи!

Источник: «DIY RPG: Make Your Own RPG With The Source Engine»

Время на прочтение
6 мин

Количество просмотров 14K

В мире существует множество игровых движков, но нет ни одного движка, похожего на Source своей историей и особенностями.

В этом (пилотном) уроке мы разберем простейшие действия с исходными кодами SDK, а также внесем наше первое изменение в код Half-Life 2.

Вступление

Немножко терминов

Сам по себе Source SDK — набор утилит и программ, помогающих в разработке собственных уровней и модификаций для игры, а также исходные коды Half-Life 2 и эпизодов.

Игра/Мод (Для сурса нет никакой разницы, игра это или мод :p) — скомпилированные исходные коды SDK.

Так почему же именно Source?!

  1. Модульность. Это может показаться минусом для некоторых, но почти все подсистемы движка вынесены в отдельные модули, каждый из которых может быть заменен без пересборки всего движка.
  2. Чрезвычайная гибкость. При достаточном количестве усилий вы можете сделать на Source игру абсолютно любого жанра.
  3. Движок и SDK разрабатывались огромным количеством людей, поэтому код SDK (а также утекший в сеть три раза код движка разных версий, но об этом позже ( ͡° ͜ʖ ͡°) ) состоит из множества разных стилей программирования! Я почти уверен, что именно работа с Source SDK подарила мне умение (но не желание…) читать чужой код.
  4. Порог вхождения. Он не слишком низок и не слишком высок. Достаточно знать C++ и уметь вчитываться в документацию!
  5. К моменту появления идеи о написании туториала у автора попросту не было новой версии юнити.

Что нам необходимо?

  1. Ну прежде всего хотя бы базовые знания C++ (Достаточно знать его на уровне Си с классами).
  2. Любая Microsoft Visual Studio с Multibyte MFC Library и Microsoft Build Tools 2013 (v120/v120_xp). Чтобы не морочить себе голову, можно просто установить VS2013.
  3. Git for Windows или любой другой.
  4. Steam с установленным Source SDK Base 2013 [Single|Multi]player (также необходимо в свойствах «игры» установить бета-версию upstream, иначе мод будет падать)
  5. В будущем также знание HLSL, но не сейчас :)

Введение в сурс дела

Репозиторий

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

git clone https://github.com/ValveSoftware/source-sdk-2013.git

Выбор ветки

Если вы хотите написать свой первый мод для Half-Life 2/Episode 1/2, то используйте директорию sp/ и Source SDK Base 2013 Singleplayer.

Если же вы извращенец и хотите написать свой первый мод для Half-Life 2: Deathmatch, то используйте директорию mp/ и Source SDK Base 2013 Multiplayer.

ВАЖНО: Туториал будет рассматривать программирование под ветку SP, поэтому пути, содержащие hl2 в пересчете на MP могут содержать hl2mp вместо hl2!!!

Стиль кода

Клиентские (client.dll) классы именуются с префиксом C_, а серверные (server.dll) — с префиксом C:

// client.dll
class C_BaseWeapon { ... };
// server.dll
class CBaseWeapon { ... };

Поля класса именуются с префиксом m_, использование венгерской нотации рекомендуется (на то есть свои причины, которые здесь обсуждать нет смысла):

class C_SomeClientClass {
private:
    float m_flTime = 0.0;
};
extern float g_flSomeFloat;
static float s_flSomeStaticFloat;
void SomeFunction(float flValue);

Структура кода

SDK, так же как и движок, разделён на несколько частей.

Список проектов сгенерированных проектов

  • client.dll
    Клиентская часть игры.
    Отвечает за рендеринг, предсказания и ввод.
    Расположена: src/game/client/
  • server.dll
    Серверная часть игры.
    Отвечает за игровую логику, ИИ и т.д.
    Расположена: src/game/server/
  • tier1.lib
    Библиотека, содержащая в себе множество полезных фич, например UTL («валвовская» версия STL), interface convention и т.д.
    Расположена: src/tier1/
  • raytrace.lib
    Библиотека, внезапно содержащая в себе функции и типы, предназначенные для рейтрейсинга. Честно говоря, я так и не понял, что библиотека для компиляторов делает здесь.
    Используется компилятором vrad и, судя по утечкам исходных кодов, редактором уровней Valve Hammer Editor.
    Расположена: src/raytrace/
  • mathlib.lib
    Библиотека, содержащая в себе множество типов и функций, используемых в «повседневной» математике Source.
    Расположена: src/mathlib/
  • vgui_controls.lib
    Библиотека, содержащая в себе реализации разных элементов (кнопки, панели) VGUI2.
    Используется почти повсеместно.
    Расположена: src/vgui2/vgui_controls/

VPC

Source SDK имеет свой генератор проектов (sln, Makefile, etc.) с блэкджеком и… кхм…
Называется он Valve Project Creator и находится в src/devtools/bin.

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

Вот пути до некоторых таких файлов:

src/game/client/client_episodic.vpc
src/tier1/tier1.vpc
src/utils/vrad/vrad_dll.vpc

ВАЖНО: При внесении ЛЮБЫХ изменений в VPC файл решение должно быть заново перегенерировано!

Генерация проектов

Проекты генерируются вызовом скрипта, расположенного в директории src/.
В самом простом случае — достаточно просто открыть src/creategameprojects.bat.
После генерации в src/ будет находиться games.sln.

Исключение HL2

SDK имеет внутри себя также разделение на HL2 и Episodic. Использование второго позволит нам иметь некоторые фичи, например отдельную от стамины шкалу заряда фонарика.

И поэтому, чтобы не компилировать лишний код, мы можем просто исключить HL2 из скриптов:

  1. Откройте src/creategameprojects.bat в любом текстовом редакторе.
  2. Удалите из командной строки часть /hl2
  3. Сохраните файл и сгенерируйте проект.

Другие скрипты

Рядом с creategameprojects.bat также лежит его клон для bash а также два интересных файла — createallprojects.bat и его клон для bash.

Эти два скрипта заставляют VPC создавать проекты не только для чистых библиотек мода, но и для различных утилит, таких как vrad (Radiosity!) или height2normal.

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

Первичная сборка и запуск

Сборка

Чтобы удостовериться, что вы всё сделали правильно, необходимо собрать всё сгенерированное решение. Итак, собираем (вы же ведь открыли решение в IDE?):

  1. Переключите конфигурацию в Release.
    ВАЖНО: При сборке в Debug мод крайне нестабилен!!!
  2. Соберите ВСЁ решение (F6)
  3. Если сборка закончилась с ошибками, повторите шаг 2.
  4. Если ошибки повторяются, пересоздайте проекты (creategameprojects) и повторите все шаги начиная с 1.

После сборки в папке game/mod_hl2/bin/ или game/mod_episodic/bin/ должны появится наши клиентская и серверная библиотеки!

Запуск — Способ 1 — Steam

  1. Копируем нашу папку mod_xxx в путь/до/Steam/steamapps/sourcemods/
  2. Перезапускаем Steam (либо запускаем, если еще этого не сделали…)
  3. Ищем в библиотеке «My First Episodic Mod» или «My First HL2 Mod»
  4. В свойствах устанавливаем дополнительные параметры командной строки:
    -dev -console
  5. Запускаем, в консоли запускаем карту sdk_vehicles (SP) или dm_lockdown (MP)

Запуск — Способ 2 — Visual Studio

Я рекомендую использовать именно этот способ — не копировать же бинарники мода каждый раз после сборки!

  1. Заходим в свойства проекта (не решения!!!) во вкладку Debugging
  2. В поле Command вписываем:
    путь/до/steam/steamapps/common/Source SDK Base 2013 XXXX/hl2.exe
  3. В поле Working Directory вписываем:
    путь/до/steam/steamapps/common/Source SDK Base 2013 XXXX/
  4. В поле Command Arguments вписываем:
    -game "путь/до/репо/xx/game/mod_xxx/" -debug -dev -console
  5. Сохраняем, запускаем (F5)!
  6. Запускаем, в консоли запускаем карту sdk_vehicles (SP) или dm_lockdown (MP)

Если карта загрузилась и вы можете передвигаться и двигать камеру мышью — сборка успешна!

Первая модификация в коде

Функции семейства Msg()

Функции Msg(), DevMsg(), Warning(), DevWarning() и ConColorMsg() являются чем-то вроде классического printf(), но в мире программирования под Source SDK. Эти функции так или иначе выводят какой-то текст в консоль разработчика и debug output.

// somewhere in tier0/dbg.h
void Msg( const tchar* pMsg, ... );

// somewhere in code
Msg( "This is a message! %dn", 42 );

Говорящий пистолет!

Давайте научим пистолет писать сообщение с количеством патронов в магазине:

  1. Откройте src/game/server/hl2/weapon_pistol.cpp (Server (Episodic/HL2)/HL2 DLL/weapon_pistol.cpp)
  2. Найдите там метод void CWeaponPistol::PrimaryAttack( void ) (Где-то вокруг строки 255)
  3. Аккурат после строчки BaseClass::PrimaryAttack(); добавьте какое-нибудь сообщение, например:
    BaseClass::PrimaryAttack(); // где-то на строке 251
    Msg( "weapon_pistol: m_iClip1 = %dn", m_iClip1 );
  4. Соберите мод, запустите и откройте карту
  5. Поскольку мы писали в аргументы -dev, чит-команды включены по умолчанию, поэтому пишите в консоль пресловутый impulse 101 и пробуйте стрелять из пистолета!

Заключение

Чему мы научились?

[Я надеюсь, что] из данного урока мы выяснили:

  • Что вообще такое Source SDK и с чем его едят
  • Как генерировать проекты используя VPC
  • Как печатать что-то в консоль разработчика

Что дальше?

Во второй части мы разберем систему сущностей Source SDK.

Полезные ссылки

  • Valve Developer Community и его раздел про SSDK
  • Мой мод [SP] с многочисленными фиксами

From Valve Developer Community

Jump to: navigation, search

EnglishDeutschFrançaisMagyarPolskiPortuguêsРусский简体中文正體中文한국어

Icon-translate.png

Ваша первая карта

  1. Приступаем к работе
  2. Навигация по окнам
  3. Базовое строительство
  4. Создание комнаты
  5. Наложение текстур
  6. Добавление энтити объектов
  7. Создание энтити брашей
  8. Добавления света
  9. Добавление проп-моделей
  10. Сохранение и компиляция
  1. Зайдите в Steam, откройте вкладку Library, затем вкладку Tools и запустите Source SDK.
  2. Выберите движок, и игру, для которой создается карта.
  3. Запустите Hammer, редактор уровней для Source:
    Запуск Hammer'а для создание карты под Half-Life 2: Deathmatch
  4. В меню File, выберите New:
    Hammer newwindow.png
  5. Появится пустая карта.
    Hammer emptyworkspace.png

Bug.png Bug: Абсолютно пустые и чёрные окна создания карты означают, что Hammer запустил стороннюю ветвь движка Source для игры, над которой вы работаете. Если вы столкнулись с этим, сбросьте Source SDK Game Configuration.


Ваша первая карта

← Категория:Дизайн уровней

Навигация по видам

Retrieved from «https://developer.valvesoftware.com/w/index.php?title=Getting_Started:ru&oldid=246511»

Categories:

  • Russian
  • Pages with uncategorized bugs
  • Level Design:ru
  • Level Design Tutorials:ru

Да, именно играем, а не модим или разрабатываем, смотрим на скриншот ниже. В нашей первой статье мы расскажем, как сделать первые шаги в создании собственных карт с помощью Source SDK.

play source sdk

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

  • Базовые элементы, текстуры и компиляция
  • Триггеры и двери
  • Работа с освещением, cubemaps и HDR
  • Собственные текстуры

Этот урок будет сфокусирован на создании однопользовательских карт для Half-Life 2, но полученные навыки пригодятся вам и в работе над любыми другими играми, от Garry’s Mod до Portal 2. В руководстве будут затронуты некоторые моменты работы с Source SDK, изменившиеся после ввода системы SteamPipe.

Приступаем

Для первого эксперимента с дизайном уровней давайте сразу отправимся в редактор. Инструменты Source SDK больше не запускаются через Steam. Вместо этого нужно зайти в папку SteamSteamAppscommon и найти игру, для которой вы хотите сделать карту. В нашем случае это папка half-life 2, далее заходим в папку bin. Среди прочего вы найдёте здесь программы, являющиеся частью SDK. Если запускать через стим, то SDK может не очень правильно все переварить и постоянно выдавать ошибки. Там все дело в правильных путях к подгружаемым файлам, опустим этот момент, все прекрасно работает при запуске hammer в папке игры.

Запускаем hammer.exe (на будущее добавьте ярлык на рабочий стол). Вы уже могли слышать про Hammer – это редактор движка Source, в котором и создаются все карты. Здесь вы проведёте большую часть времени, работая над картой или модом. С первого взгляда такого не скажешь, но Hammer – очень мощная утилита.

Создаём новую карту выбором пункта меню File>New. Экран разделится на четыре части. В левой верхней части расположен 3D-вид, где можно перемещаться по карте, словно в режиме noclip. Остальные части – это 2D-виды, где правая верхняя показывает карту сверху, а нижние с боковых сторон.

sdk new

Инструменты

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

Selection Tool

The Selection Tool

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

Magnify

Magnify

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

Camera

Camera

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

Entity Creation Tool

Entity Creation Tool

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

Block Creation Tool

Block Creation Tool
Этот инструмент вам придётся использовать очень часто. Пожалуй, в Hammer он самый важный. Он создаёт блоки – то, что у вас будет стенами, полом, потолком и т.д. Перетащите инструмент на 2D-вид, там он отобразится белым пунктирным контуром. Выбрав нужную позицию для блока, жмите Enter для его создания.

Texture Application Mode

Texture Application Mode

Этот инструмент нужен для наложения нескольких текстур на один блок. Выбор инструмента откроет вот такое меню:

Face Edit Sheet

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

Apply Current Texture to Selection

Apply Current Texture to Selection
Не совсем понимаю, для чего здесь этот инструмент. Вообще никогда им не пользовался. Он накладывает текущую текстуру на всё, что у вас выделено.

Decal Appliance Tool/Overlay Appliance Tool

Decal and Overlay Appliance Tools

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

Clipping Tool

The Clipping Tool
Этот инструмент используется для отсечения части блока. На картинке ниже показан блок и голубая линия с белыми квадратами на концах.

clip tool line

Линия – это инструмент отсечения. Для её создания просто перенесите инструмент на желаемый 2D-вид. Белая часть блока – та, что сохранится. Когда вас устраивает результат, нажимайте Enter.

clip tool 1

clip tool 2

Vertex Manipulation Tool

Vertex Manipulation Tool

Этот инструмент нужен для создания сложных форм путём манипулирования вершинами блоков. Выделите блок, затем выберите этот инструмент. Должно выглядеть примерно вот так:

vertex manipulation look

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

Блок, не приводящий к ошибке:

Non-error causing

Блок, приводящий к ошибке:

Error-Causing

Базовые конструкции

Всё, что есть на уровне, представляет из себя либо блок (brush), либо объект (entity). Блоки – это статичная геометрия мира, например, стены, пол и здания. Всё остальное, включая предметы, оружие, врагов и модели – это объекты. Давайте сделаем пол в комнате с помощью блока.

Выбираем инструмент Block Tool в левой панели. Для создания блока жмём и растягиваем конструкцию на виде сверху. Заметьте, что его границы привязываются к сетке, это позволяет избежать нежелательных зазоров между разными блоками. Создаём блок 512×512 единиц. Вы увидите, как он появится на двух нижних видах.

Сделать сетку помельче можно, нажав на значок Smaller Grid в верхней панели. Уменьшите высоту блока с помощью боковых видов (16 единиц будет достаточно) и нажмите Enter. Чтобы посмотреть на своё творение в 3D-виде, наведите на него курсор и нажмите Z – так вы сможете передвигаться клавишами WASD, а мышью поворачивать камеру. Вы должны увидеть блок со стандартной текстурой (при этом нужно переключиться в вид с текстурами, нажав на 3D Textured в меню View), как показано в правой части экрана.

sdk 3d textured

Попробуйте проделать то же самое для создания стен своей комнаты. Обычная стена имеет высоту 128 единиц и толщину 8-16 единиц. (Размер большинства текстур 128×128, и таким образом мы убедимся в их правильном наложении. Кроме того, для движка предпочтительнее размеры блоков в виде степени с основанием 2, но это не жёсткое правило). После этого создайте потолок, перетащив пол вверх с зажатой клавишей Shift на одном из боковых видов.

На этом этапе я должен указать на первое правило Hammer: сохраняйтесь чаще! Программа славится вылетами в самый неподходящий момент, и даже лучшие из нас тратили впустую по нескольку часов работы. Ctrl+S – это бесценная комбинация клавиш. Для больших карт даже рекомендуется сохранять несколько резервных копий на случай потери или повреждения данных.

Текстуры

Оглядите получившуюся комнату 3D-камерой. Вы заметите, что все блоки выглядят одинаково, как кирпичная стена. Это далековато от идеала, так что взглянем на меню текстур в правой части.

В правой части редактора вы должны видеть вот такое меню:

Applying Textures

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

sdk-tutorial-1

Теперь вы видите эту оранжевую текстуру в правой части экрана. Чтобы наложить её на свои стены, поочерёдно выделите их, удерживая Сtrl, затем нажмите Apply Current Texture в левой панели.

Если хотите наложить текстуру только на одну поверхность блока, нажмите Toggle Texture Application, открыв небольшое окно. Теперь выберите пол комнаты в 3D-виде и, нажав Browse, выбирайте другую текстуру. В 3D-виде показывается, как изменилась только одна из сторон блока. Это окно также пригодится для выравнивания и поворота текстур.

sdk-tutorial-2

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

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

Объекты

Статичные стены – это хорошо, но если вы хотите хоть какой-то интерактивности, вам понадобятся объекты. Объекты бывают двух типов: блоковые (создаются из уже знакомых вам блоков) и точечные (point entities). Давайте остановимся на вторых.

Нажмите на значок под названием Entity Tool. В правой части экрана найдите два выпадающих списка. Второй из них включает в себя множество объектов, которые вы можете поместить на карту. В этом списке вы, помимо всего прочего, найдёте врагов (npc_zombie), предметы (weapon_rpg) и спецэффекты (env_spark). Не поддавайтесь искушению пробовать каждый из них и найдите info_player_start. Этот объект определяет точку появления игрока на карте. Перейдите на 3D-вид и расположите где-нибудь зелёного Фримена (этот объект тоже помогает оценить масштабы карты). Как и блоки, объекты можно двигать по карте на 2D-видах (а вот размеры изменять нельзя). Чтобы поворачивать уже выделенный объект, нажмите на него ещё раз.

sdk-tutorial-3

Теперь игрок может появиться в игре. Давайте поможем ему, разместив рядом item_suit и weapon_crowbar. С такой же лёгкостью можно добавлять на карту и другие объекты – добавьте немного item_healthkit или какое-нибудь оружие и патроны к нему. В качестве противников поместите на уровень парочку npc_headcrab, только подальше от игрока, чтобы его не застали врасплох! Это самый простой вид NPC, их продуманное поведение потребует немалых усилий, но на этом этапе достаточно просто добавить их на карту.

Если хотите разнообразить и расширить карту, добавьте ещё несколько комнат и коридоров.

sdk-tutorial-4

Уверен, что даже при наличии оружия и врагов ваш уровень выглядит довольно безжизненным. На картах Valve более сложные детали представлены предварительно подготовленными моделями (props). Есть три основных типа моделей: prop_static, не подлежащие взаимодействию и перемещению, prop_physics, которые можно поднимать или перемещать гравипушкой, и prop_dynamic, которые можно присоединять к другим объектам, изменять их анимацию и проделывать другие интересные вещи.

Начнём с простого: разместим на карте объект prop_static. Он появится в виде маленького куба и мы должны назначить ему модель. Откройте свойства объекта двойным кликом на 3D-виде или выбрав Properties на 2D-виде. В этом меню меняются различные опции всех объектов, включая входные и выходные данные, контролирующие их функции и необходимые для скриптовых событий.

Пока что выберите World Model и нажмите Browse: здесь вы увидите все модели, существующие в игре. Как и в случае с текстурами, список можно фильтровать по названию. Например, фильтр «foliage» покажет деревья и различные растения для обустройства уровня за пределами помещения. Попробуйте подобрать другие ключевые слова для поиска нужных вам моделей. Вкладка Info покажет поддерживаемый тип модели (static, physics или dynamic). Когда найдёте, что вам нужно, расположите объект на карте с помощью 2D-видов.

sdk-tutorial-5

Таким же образом добавьте несколько моделей prop_physics – к примеру, бочек, которые можно расшвыривать гравипушкой (в Hammer она называется weapon_physcannon). Следите, чтобы добавленные модели нигде не пересекались с блоками.

Компиляция

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

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

sdk-tutorial-6

Если вы довольны своей картой, жмите File>Run Map. Вам предложат сохраниться, если вы этого ещё не сделали и дадут на выбор несколько опций. Оставьте все переключатели выставленными по умолчанию и проверьте, чтобы опция «Don’t run the game after compiling» была отключена. В поле «Additional game parameters» пропишите «-dev -toconsole» без кавычек. Это даёт больше информации на экране во время игры и автоматически включает читы. Теперь жмите OK и ждите несколько секунд. Вам покажут кучу информации о том, как проходит процесс компиляции, после чего игра должна благополучно запуститься.

sdk-tutorial-end

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

Мои первые шаги в Source Engine (на основе HL2).

В интернете множество различных, но подобных инструкций по сборке куба с точкой появления игрока и источником света внутри. Именуется это всё туториалом «моя первая карта». Так званные туториалы не посвящают в саму суть картостроения на Source, мало того учат делать катастрофические ошибки с первых шагов. Из-за подобного туториала мне пришлось в дальнейшем сносить мои первые карты и делать их заново с нуля, поэтому я решил написать свой туториал.
И так, к моменту, когда вы приступите изучать данный урок вы должны:

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


1. Строим куб с игроком внутри.


Source это движок БСП геометрии, поэтому нашу комнату-куб мы будет делать из блоков — брашей (brush агл. – кисть, почему кисть не знаю). Очень важно правильно строить начальную геометрию, это напрямую будет влиять на скорость компиляции (рассмотрим позже) и на оптимизацию в игре. В принципе брашевая технология не менялась со времён Квэйка 2. Во многих туториалов советуют создать кубик и с помощью волшебной функции получить полость внутри неё. НИКОГДА так не делайте, это даст «кривую» геометрию, каждую стенку мы лучше будем делать вручную.

Ну что ж запускаем редактор и во вкладке file создаём новый проект.

Как и положено перед нами черно окно аксонометрической проекции, и 3 окна 2D проекции.
Когда мы начнём строить наш первый браш он автоматически окрасится выбранной текстурой. А выбрать её можно тут:

Нажмём кнопочку Browse для выбора текстуры. Если у вас мод на HL2 а не чистый проект, то вы уведете груду различных текстур, отсеивать нужные можно с помощью поля filter. Наберите в этом поле dev.

Development текстуры — это технические текстуры которыми окрашена ваша карта на ранних стадиях разработки. Это очень удобно, можно всегда проверить правильно ли сделаны размеры и пропорции, кроме того у нас тут есть набор текстур стандартов для перил, дверей, лестниц и т.п. Выберу я пожалуй текстуру серой клетки для пола.
Наконец то можно построить пол нашей будущей комнаты, хотя нет… Мы не определились с размерами. Единицы измерения в редакторе юниты, в одном юните один дюйм или 2,54 сантиметра. Все размеры особенно основной геометрии карты нужно проставлять использую двоичную логику, так у нас будет всё быстрее работать. Я не буду вдаваться в теорию двоичных исчислений, просто скажу что размеры мы будем получать возводя двойку в квадрат. (2, 4, 16, 32, 64, 128, 256, 512, 1024… ) И так пол у меня будет по ширине и длине 512 юнитов, а высоту или толщину 16 (выбирайте всегда 16 или 8 для толщины стен). Вы можете сделать пол своего размера, как вам нравиться, но соответствовать размеры должны двоичной логике.

Выбираем инструмент создания блоков Shift+b, или кликаем по иконке инструмента.

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

Что такое? Я не могу сделать блок меньше 64 юнитов? Всё просто, по стандартным настройкам у нас стоит привязка к сетке (это помогает быстрее строить основную геометрию, избегая ошибок) и минимальный размер сетки в 64 юнита. Что бы уменьшить размер сетки воспользуемся панелью управления сеткой.

Кликаем 2 раза по кнопке с минусом, что бы размер сетки стал 16 и ещё раз, если вы собрались делать толщину 8, можно оставить и 64, это внешняя стена её никто никогда не увидит снаружи, так что не важно.
Кстати вы можете всегда приблизить или отдалить проекцию колёсиком мышки.

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

Маленький шажок и большой прыжок для всего человечества. Хочется теперь посмотреть на свою работу со всех сторон.
Воспользуемся инструментом камерой Shift+c, или кликаем по иконке инструмента.

Теперь в окнах проекциях можно манипулировать камерой и угол обзора в 3D проекции будет меняться. В самом же окне проекции мы меняем угол обзора камерой как от первого лица, кроме того можем перемещаться по карет используя W,S,A,D.
Всё полюбовались полом, пора строить стены. Для неё я выберу dev текстуру, стандарт для стены с пометкой 128, думаю уже понятно, что стандартная высота стены в HL2 128 дюймов. Я создал стенку чуть дальше пола с размерами 128 высота, 16 ширина, 512 длина. Присобачим к полу её чуть позже, возникла другая беда, текстура «сьехала».

Для этого я воспользуюсь инструментом редактирования текстур Shift+a, или кликаю по иконке инструмента.

У нас курсор превратится в в банку-заливки и появится такое окно:

Я выделяю курсором нужную мне поверхность стены, которая будет в сторону комнаты, на остальные мне плевать. (можно выделять несколько поверхностей при зажатой кнопке Ctrl) А в окне редактирования текстур клацну кнопку T. T-top выравнивание по вершине, так же можно выравнивать по левому краю, правому краю, нижнему краю, менять саму текстуру, редактировать её размер, поворот, в ручную менять положение, отзеркаливать. Это всё освоите самостоятельно, методом тыка. Единственное что расскажу, если вы клацнете по соседней поверхности правой кнопкой мыши, она окрасится в такую же текстуру и так же выровняется, этот приём упростит вашу жизнь при дальнейшем текстурированию карты.

Теперь переместим стенку куда нам надо. Для этого выбираю инструмент выделения Shift+s, или кликаю по иконке инструмента.

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

Если «схватить» выделенный браш, то можно перетащить его куда надо. Кроме того обратите внимание на квадратики по углам браша, мы можем его растянуть, клацните на браш 1 раз, теперь у нас вместо квадратиков кружочки, можно и повернуть. Это всё можно сделать, используя специально меню, вызывается оно при помощи Ctrl+m.

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

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

Комната готова, хочется зайти и протестировать, для этого нужно создать внутри комнаты свет и точку появления игрока. Эти объекты называется энтитями, энтити бываю 2х типов, брашевые и точечные. Точечные создаются через специальный инструмент а брашевые и БСП геометрии. Энтити это функциональный объекты которые создаются на карте, к примеру монстры, игрок, дверь, свет и т.п.
Для создания энтити воспользуемся специальным инструментом Shift+E, или кликаем по иконке инструмента.

При этом у нас активировалось это окно:

В окошке Objects выбираем info_player_start и жмякаем мышкой в окне 3D проекции по полу в центре комнаты, или туда где хотите что бы появлялся игрок.

Выделенного «игрока» можно вращать и перемещать, так же как и брашевую стенку.
Создайте аналогичным образом на потолке в центре комнаты объект Light.

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

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

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


2. Теория оптимизации.


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

Судя по надписям на текстуре, стандарт двери 48×108 и вместе с рамой 56×112. Не очень удачные размеры, особенно если учесть пропорцию к игроку и окружающему. Поставьте info_player_start напротив двери и увидите какой игрок маленький, почему все двери в ХЛ2 столь гигантские как в сталинках я не знаю. Если вы решите делать двери своего размера, боюсь, прийдется делать все модели дверей с нуля.

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

Теперь можно разрезать в одном из окно проекции:

Я сделал разрез в левом нижнем окне, вернее сделал разметку будущего разреза, что бы подтвердить его нужно клацнуть Enter. Та часть блока которая красная будет удалена при разрезании, что бы поменять какая часть будет удалена, ещё раз клацните по инструменту разрезки, а можно ничего и не удалять, просто разрезать на 2 части.

Сделайте теперь дверь размером 56×112 и толщиной 2 дюйма сами, если будет надо, выровняйте текстуру на ней.
Теперь сделаем дыру в стене под дверь, опять же воспользуемся резкой, когда мы делали дверь, резать было не обязательно, можно было просто масштабировать, как я показывал в прошлой главе. Сначала я сделаю два вертикальных разреза, это важно! Если бы я сделал сначала горизонтальный разрез по всей длине стены, был бы не очень удачный разрез листьев (что такое листья и с чем их едят чуть позже) и усложнился бы процесс текстурирования стены.

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

Если вы хотите выделить кусок двери переключите в меню на режим Solids. Доделывайте дыру и всовывайте в неё дверь.

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

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

Где то так. Что? Как я это сделал? Где нашел текстуру дерева в этом громадном каталоге? Это вы уже и сами должны уметь, достаточно рассказал.

Теперь запускаем компиляцию F9, но на этот раз поставьте галочку на против Don’t run the game after compiling, потому что запускать карту мы не будем, лучше почитаем лог компиляции.

Что-то странного бреда полно, а сверху написано leaked, что означает дырку. Дырки в «космос» за пределы карты в основной геометрии могут создавать массу проблем и различные графические артефакты, кроме того вся наша оптимизация летит к чертям. Для того что бы найти дырку заходим из главного меню Map -> Load Pointfile, в результате на карте появится красный сплайн, который будет проходить прямо через нашу дырку.

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

Я, конечно, говорил что углы так стыковать не стоит, но другого выхода тут нет.

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

Всегда покрывайте недоступные игроку поверхности этой текстурой.

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

Теперь опять запустим компилятор F9, проверьте что б у вас не было дырок, иначе листья не разрежутся. После компиляции заходим из главного меню в Map -> Load Portal File.

Вот они! Наши листья. Комната условно разделилась на 2 части. Обратите внимание на листья созданные досками, они явно в игре ни как не помогут, за то увеличивают время компиляции карты. Это не проблема когда у нас одна недокомната, но большая проблема когда здоровенная, сильно детализированная карта. Что бы избежать такой трудности в будущем превратим наши доски в брашевую энтитю. Для этого выделим все доски одновременно и нажмём Ctrl + T, у нас появится такое окошко.

Это окно свойств и настроек только что созданной брашевой энтитей. Обратите внимание на надпись func_detail в выпадающем списке, это название нашей энтити, браши автоматически превращаются func_detail при переводе их в энтитю. Можно конечно теперь и другую энтитю указать, но нам именно func_detail и нужен, это специальная энтитя браши которой не учавствуют в разразе на листья. Смотрите дверь не превратите в func_detail случайно, а то получится дырка.
Кстати если вы в режиме группировки переключитесь на режим Groupe, заметите что доски теперь выделяются одновременно все и можно вызывать окошко любой энтити при помощи Alt +Enter. Если захотите превратить доски обратно в обычные браши, выделите энтитю и нажмите Ctrl +Shift +W.
Опять компилируем карту и снова загружаем Portal File.

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

А теперь я хочу что бы вы сделали вот такой Г-образный коридор (не забудьте увеличить сетку, что бы его легче было строить и потолок не удаляйте, это я так, что бы лучше было видно)

Здесь у нас образовался угол и не совсем корректный стык.

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

Создать такой угол можно с помощью обрезки, но есть способ проще, выделите нужный браш и примените инструмент свободной трансформации вершин Shift+V, или кликаем по иконке инструмента.

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

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

Теперь расставьте источники освещения в коридоре и пора запускать карту. В игре активируем в настройках консоль и прописываем в ней:

sv_cheats 1
mat_waiframe 1

В этом режиме мы можем видеть сквозь стены что прорисовывается движком, а что нет. И что мы видим?

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

У нас получилось 3 листа, лист коридора возле двери первый, лист продолжения коридора, второй и лист комнаты третий. И так вот, мы находимся в листе 2 и напрямую видим лист 1, поэтому доски в нём и прорисовываются. Нужно сделать разрез листов вручную.

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

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

Другое дело! Подумайте сами, как отрезать видимость комнаты из коридора.


3. Немного неба.


Открываем опять нашу карту, удаляем потолок и все источники света, они теперь будут от неба. И строим сверху кубо-образную конструкцию покрытую текстурой toolsskybox, а видимые теперь сверху поверхности окрашиваем в nodraw. А на самый верх карты ставим точечную энтитю light_environment, эта энтитя отвечает за освещение от солнца.

Обратите внимание как я построил коробку неба, как продолжение комнаты вверх, многие новички заключают сразу всю карту в одну большую коробку. Этого категорически нельзя делать, небо точно так же влияет на разрез листьев как и другие браши. Да же если вы откроете исходник карты ХЛ2, где было большое просторное небо, увидите что на самом деле оно разрезано на своеобразные комнатки, что бы каждая часть локации в не поле зрения игрока не грузилась.

Вроде всё ок. Компилим и запускаем, смотрм, радуемся.

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

Кстати небо мрачноватое у нас по стандарту. Давайте поищем другое, для этого в фильтре текстур наберите sky.

Как видите одно небо состоит из дофига текстур и имена этих текстур пишуться по принципе sky_ИмяТекстуры_КакаяЧастьНеба. Мне вот приглянулось небо под название sky_day02_04. Что бы поменять небо заходим в Map -> MapProperties…, увидим что-то такое:

Вот в строке SkyBox Texture Name я и пропишу понравившееся небо.

Сверху над комнатой сделаю брашевые перекладины, будто тут был потолок когда-то. А под солнцем сделаю направленный источник света light_spot, для эффекта более красивых теней.

Компилим, запускаем.

А тени то еле видно. Давайте разбираться.

Начнём редактировать текстуру пола.

Видите пункт ligtmap scale? Он отвечает за размер карты теней, чем он меньше тем чётче тени, поменяю на 2. Теперь у текстуры пола более чёткие тени, это не влияет на производительность карты, но нагружает компилятор. Что бы просмотреть размер карты теней сразу на всех текстурах, в окне 3D проекции щёлкните в левый верхний угол на слово camera и поменяйте режим камеры на 3D Ligtmap Gird.

Желтая сетка, это текстуры с картой теней 2, а синяя с 16.

Компилим, смотрим.

Чёткие тени, даже чересчур, тут надо попробовать 4-6 прописать, это вы уже сами.
Спасибо за внимание туториал окончен.


Примечание:


Осталось пожелать вам удачи, и посочувствовать что в 2012+ году решили осваивать достаточно старый хоть и простой в освоении движок. А так же, не упущу возможность прорекламировать собственную разработку: www.moddb.com/mods/alchemilla-mod

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

Итак, для того, что бы начать работать с Source SDK нам понадобится.

  • Steam, Инструменты: , Source SDK BASE2013 SP
  • Скачиваем и распаковываем на диск source-sdk-2013
  • Проходим шаги

Первый запуск

По пути (SteamsteamappscommonSource SDK Base 2013 Singleplayerbin) hammer.exe

Два раза кликните по нему.

Жмем Add и называем «Chernilnica»

Открываем

Заполняем:

Game Data Files — Add — Base.fgd / halflife.fdg

Default Point Entity — info_player_start

Game Ex. Dir — $SteamUserDirSource SDK Base 2013 Singleplayer

Game Dir $SteamUserDirSource SDK Base 2013 Singleplayermymod

Hammer VMF $SteamUserDirSource SDK Base 2013 Singleplayermymodmaps

Build Programms

$SteamUserDirSource SDK Base 2013 Singleplayerhl2.exe
$SteamUserDirSource SDK Base 2013 Singleplayerbinvbsp.exe
$SteamUserDirSource SDK Base 2013 Singleplayerbinvrad.exe
$SteamUserDirSource SDK Base 2013 Singleplayerbinvvis.exe
$SteamUserDirSource SDK Base 2013 Singleplayermymod

Открываем путь Source SDK Base 2013 Singleplayer и создаем папку mymod и файл gameinfo в формате текста и следующим содержимым

«GameInfo»
{
game «Source Engine Test»
title «~»
title2 «Source Test»
type singleplayer_only
FileSystem
{
SteamAppId 243730 // This will mount all the GCFs we need (240=CS:S, 220=HL2).

// The code that loads this file automatically does a few things here:
//
// 1. For each «Game» search path, it adds a «GameBin» path, in <dir>bin
// 2. For each «Game» search path, it adds another «Game» path in front of it with _<langage> at the end.
// For example: c:hl2cstrike on a french machine would get a c:hl2cstrike_french path added to it.
// 3. For the first «Game» search path, it adds a search path called «MOD».
// 4. For the first «Game» search path, it adds a search path called «DEFAULT_WRITE_PATH».
//

//
// Search paths are relative to the base directory, which is where hl2.exe is found.
//
// |gameinfo_path| points at the directory where gameinfo.txt is.
// We always want to mount that directory relative to gameinfo.txt, so
// people can mount stuff in c:mymod, and the main game resources are in
// someplace like c:program filesvalvesteamsteamappshalf-life 2.
//
SearchPaths
{
// First, mount all user customizations. This will search for VPKs and subfolders
// and mount them in alphabetical order. The easiest way to distribute a mod is to
// pack up the custom content into a VPK. To «install» a mod, just drop it in this
// folder.
//
// Note that this folder is scanned only when the game is booted.
game+mod sourcetest/custom/*

// We search VPK files before ordinary folders, because most files will be found in
// VPK and we can avoid making thousands of file system calls to attempt to open files
// in folders where they don’t exist. (Searching a VPK is much faster than making an operating
// system call.)
game_lv hl2/hl2_lv.vpk
game+mod sourcetest/sourcetest_pak.vpk
game |all_source_engine_paths|hl2/hl2_sound_vo_english.vpk
game |all_source_engine_paths|hl2/hl2_pak.vpk
game |all_source_engine_paths|hl2/hl2_textures.vpk
game |all_source_engine_paths|hl2/hl2_sound_misc.vpk
game |all_source_engine_paths|hl2/hl2_misc.vpk
platform |all_source_engine_paths|platform/platform_misc.vpk

// Now search loose files. We’ll set the directory containing the gameinfo.txt file
// as the first «mod» search path (after any user customizations). This is also the one
// that’s used when writing to the «mod» path.
mod+mod_write+default_write_path |gameinfo_path|.

// Add the HL2 directory as a game search path. This is also where where writes
// to the «game» path go.
game+game_write sourcetest

// Where the game’s binaries are
gamebin sourcetest/bin

// Last, mount in shared HL2 loose files
game |all_source_engine_paths|sourcetest
game |all_source_engine_paths|hl2
platform |all_source_engine_paths|platform
}
}
}

Запускайте хаммер, все работает!

Что это такое?

Возможно вы новичок и не имеете представления что такое программирование на C++ и что стоит за этими всеми названиями: «компиляция», «класс», «интерфейс» и так далее,
в таком случае, вы должны приобрести базовые навыки программирования на языке C++, после чего можно будет полноценно выполнять поставленные задачи перед программистом мода.
Source SDK предоставляет исходный код для модификации движка игры.
Это означает что вы обладая определенными знаниями и инструментами можете при наличии у вас этого исходного кода внести в него нужную вам функциональность.
Что такое движок?
Например есть некая игра которую вы запускаете на вашем компьютере.
Игра состоит из программного кода и файлов с данными.
Файлы с данными нетрудно понять что это — то из чего строится игровой мир, графика, модели карты, и т.д.
А код — это то что выполняется процессором, грубо говоря, чтоб эти файлики могли отображаться на экране, двигаться и звучать.
Эту программную часть и называют «движок».
Движок состоит из нескольких систем, каждая отвечает за свою задачу (рендеринг графики, работа с файлами, обработка комманд, работа с сетью, организация игровой сцены, игровые объекты…)

С чего начать?

Что понадобиться чтобы модифицировать игру?
1. Знание С++. Некоторые полезные ресурсы посвященные программированию:
http://firststeps.ru
http://sources.ru
http://rsdn.ru
http://codenet.ru
http://msdn.microsoft.com

2. Исходники из Source SDK. Скачать всегда можно при помощи Steam.

3. Microsoft Visual Studio 7.1. Работа над кодом производится в данной среде для работы с проектами Visual С++ 7.1 от фирмы Microsoft.
Возможно есть другие пути компиляции проектов Visual С++ но это отдельная тема.

4. Знание как устроен Source SDK.
Часто программисту нужно самому менять те данные которыми оперирует код и знать каким образом эти данные организуются.
Для этого необходимо:
— изучить документацию по Source SDK: http://www.valve-erc.com/srcsdk;
— знать какие есть команды и настройки консоли для разрабочиков модов;
— понимать как создаются карты (bsp);
— понимать как создаются материалы (vmt/vtx);
— понимать как создаются модели (mdl);
— понимать как создаются звуковые скрипты и ресурсные файлы.
Эти вопросы рассматриваются в других туториалах.
5. Игра Half-Life для запуска вашего собственного мода.

После того как вы создали новый мод (Play GamesTools/Source SDKCreate a ModModify Half-Life 2) открываем файл src/Game_sdk.sln
Файл sln — это Solution — решение, такой вот термин в Visual Studio.
Почему не называют его проектом как в Visual Studio 6?
Решение (.sln) состоит из нескольких проектов (.vcproj), которые можно генерировать все сразу или по отдельности.
Данный файл решения состоит из двух проектов:
client — клиент
hl — сервер
Зачем их два, а если у нас например, не будет мультиплеера в игре?
В любом случае, будь то мультиплеер или синглплеер движок будет состоять из двух частей. Это обясняется тем что сам механизм имитации игрового мира разделен на две зависящие друг от друга стороны.
Что делает сервер, а что клиент, в чем их разница?
Сервер выполняет имитацию виртуальной реальности в реальном времени позволяя синхронизировать различные игровые объекты;
к серверу присоединяются клиенты которые тоже являются этими объектами, один или несколько, вообще в движке Source может быть до 255 клиентов.
В случае сетевой игры через интерент или локальную сеть, запускается общий сервер который синхронизирует всех клиентов,
а в одиночной игре работают только свой локальный сервер и клиент.
За что отвечает клиент? Он выполняет ввод управления от игрока и вывод информации в том числе поступившей от сервера.
Тоесть он реализует интерфейс с игроком.
Обычно все что невозможно (нет надобности) каким-либо образом выводить для игрока не выполняется на клиенте.
Вообщето клиент имитирует примерно то же что и сервер, но не может превышать больше полномочий чем сервер.
Поэтому для сервера важно только то что клиент может передавать состояние игрока,
и может вносить разные настройки сервера, предусмотренные разработчиками.

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

В результате компиляции этого кода получается два DLL модуля (клиент и сервер).

Серверный код находится в директории src/dlls.
В нем содержится иерархия серверных классов, в котором одни классы являются базовыми для порождаемых дочерних классов. При проектировании классов все общие свойства нескольких дочерних классов содержатся в родительском.
Серверные классы обычно имеют имена подобные CИмя (CBaseEntity, CBasePlayer).
Сервер отвечает за суть происходящего в игре, для него не важно как это нужно отображать на экране игрока, важна сама логика происходящего.
В результате сборки проекта src/dlls/hl_sdk.vcproj получается файл server.dll.

Код клиента находится в директории src/cl_dll.
Содержит иерархию клиентских классов. Классы клиента обычно имеют имена подобные C_Имя (C_BaseEntity, C_BasePlayer).
Все классы игровых объектов которые участвуют в имитации мира имеют соответствующий класс на стороне сервера.
Здесь содержится код управлющий рендерингом моделей, озвучкой, обработка GUI-интерфейса, вывод текстовых сообщений,
обработка ввода клавиатуры и мыши и т.д.
В результате сборки проекта src/cl_dll/client_sdk.vcproj получается файл client.dll.
Если поместить DLL файлы клиента и сервера в директорию bin вашего мода, движок сможет их подключить при запуске.

Общий код лежит в директориях src/public и src/game_shared.

В директории linux_sdk содержатся файлы для создания специального для этой платформы файла компиляции — Makefile, если вы занкомы с Unix, то уже догадались что он нужен для компиляции порта сервера под Linux.

Кроме того в Source SDK есть разные вспомогательные исходники, которые непосредственно не относятся к движку игры, их можно найти в директории src/utils
Это различные утилиты, ну например вы решили сделать какойто свой редактор для файлов в форматах движка Source, вам могут потребоваться такие исходники.

Вникаем в подробности

Для начала сделаем первый шаг в программировании мода.
Открываем файл src/dlls/hl2_dll/hl2_player.cpp
Находим реализацию метода PlayerUse, который отвечает за нажатие на клавишу USE

void CHL2_Player::PlayerUse (void)

Добавим после строки

CBaseEntity *pUseEntity = FindUseEntity ();

строку

if (pUseEntity && (m_afButtonPressed & IN_USE)) Msg («Hello MOD!\n»);

Перед началом сборки следует обратить внимание на конфигурацию.
Заходим в BuildConfiguraion Manager…Active Solution configuration.
У проектов есть две конфигурации Release HL2 и Debug HL2.
В результате и первой и второй получаются файлы server.dll и client.dll, но в чем различия Release и Debug?
Debug предназначен для отладки (содержит отладочную информацию для отладчиков) и обычно более медленно работает,
Release — создает оптимизированный код для окончательной версии мода.
Поскольку покачто это не имеет большого значения, можно выбрать Release.
Проверьте в какую директорию будут записаны файлы полученные при сборке проектов.
Для этого кликните правой кнопкой в Solution Explorer на client и выберите Properties,
затем Configuration propertiesCustom Build StepGeneral,
В поле Command Line должно содержаться примерно следующее

if exist «путь_к_моду/bin/client.dll» attrib -r «путь_к_моду/bin/client.dll»
copy «$(TargetDir)»client.dll «путь_к_моду/bin»
if exist «путь_к_моду/bin/client.pdb» attrib -r «путь_к_моду/bin/client.pdb»
if exist «$(TargetDir)»client.pdb copy «$(TargetDir)»client.pdb «путь_к_моду/bin/client.pdb»

В поле Outputs (выбрать <Edit…>)

путь_к_моду/bin/client.dll
путь_к_моду/bin/client.pdb

Кроме DLL, студия также сохраняет специфические .PDB файлы, которые содержат информацию которая нужна для отдладки.
То же самое выполнить и для проекта hl.
Правой кнопкой в Solution Explorer на client,
затем PropertiesConfiguration propertiesCustom Build StepGeneral
Установки аналогичны толко для файла server.dll.

Сборка файлов выполняется коммандой BuildBuild Solution.
В окне вывода (Output) мы можем видеть вывод процесса сборки:

—— Build started: Project: client, Configuration: Release HL2 Win32 ——

Compiling…

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

———————- Done ———————-

Build: 2 succeeded, 0 failed, 0 skipped

Сгенерированные в результате файлы автоматически копируются в директорию bin вашего мода (в соответствии установкам Custom Build Step).

Теперь если запустить игру с нашими изменениями при использовнии каких-либо предметов (поднимите какойто предмет клавишей USE) мы должны видеть сообщение «Hello MOD!».
Запускать мод можно с помощью файла run_mod.bat в директории вашего мода.

Рассмотрим подробнее параметры командной строки для запуски собственных модов.
Вот пример:

hl2.exe -steam -dev -condebug -developer 2 -ent_messages_draw 1 -game NAME_OF_MOD

hl2.exe -steam — это запуск игры (изменять не нужно)
-dev (или -console) — включить командную консоль
-condebug — запись лога сообщений из консоли в файл console.log
-developer 1 или 2 — уровень отладки
-ent_messages_draw 1 — отобржать сообщения о происходящие работе сообщений
-game NAME_OF_MOD — какой мод запускать (указывается имя директории мода в директории Half-life2)

Копаем глубже…

Запомните одну из очень ценных возможностей имеющуюся в Visual Studio — это поиск в файлах с кодом.
Find in Files — поиск в файлах или Ctrl+Shift+F с клавиатуры.
С помощью поиска вы можите исследовать исходный код, и находить самые важные для вас места для модификации.

Первым делом следует рассмотреть базовые вещи с которых нужно начинать знакомство с устройством движка.
Серверу и клиенту предоставляются различные программные интерфейсы которые предоставляют огромный список различных возможностей.
Например,
IPhysics — обработка физики;
IMaterial — огранизация системы материалов;
ICommandLine — работа с коммандами консоли;
IBaseFileSystem — запись/чтение файлов;
IEngineSound — вывод звука;
IInput — ввод клавиатуры или мышки;
и так далее…
Этот список довольно длинный, детальное рассмотрение требует большего объема чем данный туториал.

Чтобы в определенном месте кода сделать проверочный вывод информации на экран например чтобы проконтролировать как выполняется код — используйте вспомогательные функции:
UTIL_ClientPrintAll, ClientPrint или Msg

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

Понравилась статья? Поделить с друзьями:
  • Как написать игру на lazarus
  • Как написать имя на английском поля
  • Как написать имя мухаммад на арабском языке
  • Как написать имя мая на английском
  • Как написать имя красиво на телефоне