- Автор темы
- #1
Что вы узнаете в этом руководстве:
Запаковка мода
Тестирование
Точки остановки(Breakpoints)
Filepatching
Перекомпиляция(Вишенка на тортике)
P.S. Дочитали до конца?
Вы просто замечательны
Благодарности:
- Настройка и использование официальных инструментов DayZ Tools
- Запаковка своего первого мода
- Проверка и отладка его в игре
- Изменение мода без перезагрузки игры
Что вам нужно, чтобы начать:
- Установленная версия игры DayZ и установленные инструменты DayZ Tools
- DayZ Tools вы можете найти в своей библиотеке Steam(Библиотека -> Инструменты) после покупки игры
- Вам нужно хоть однажды запустить DayZ, чтобы не наткнутся на связанные с этим проблемы
- Более 15 Гб, а лучше больше, свободного места на диске(желательно на SSD, чтобы экономить время)
- Что-нибудь посмотреть, поесть и попить пока будут распаковывать файлы игры (это занимает некоторое время)
Настройка диска P и перемещение данных игры
Диск P:\ это виртуальный диск, который используется для моддинга.
Он ссылается на распакованные данные игры и очень удобен для хранения всего, что связано с модификациями игры, в том числе и скриптами.
Предположим, что вы хотите хранить все эти данные в папке "C:\Users\<Название вашего профиль Windows>\Documents\DayZ Projects" (именно такой путь мне по умолчанию предложил DayZ Tools)
Тогда вам не нужно выполнять пункты ниже, до распаковки игры. Достаточно лишь проверить, что указана верная папка в Path to the Project Drive
Если вы хотите, чтобы ссылались на другую папку, то нужно выполнить следующие шаги:
![Smile :) :)](/f/styles/default/xenforo/smilies/k/smile.gif)
Что в этом шаге происходит?
Данные из папки с игрой переносятся в папку для моддинга и распаковываются.
Это необходимо, чтобы изучать файлы игры и смотреть, что и как сделано и на их основе уже делать моды.
Распаковывать файлы необходимо при каждом обновлении игры, чтобы всё было актуально и не создавать себе лишних проблем из-за этого.
Для скриптеров, по идее, надо копировать и распаковывать лишь scripts.pbo, что лежит в папке с игрой и подпапке dta, например "C:\Program Files (x86)\Steam\steamapps\common\DayZ\dta\scripts.pbo"
И только лишь его держать актуальным, ну возможно, что ещё gui.pbo из той же папки (для создания своих интерфейсов(UI))
Автор пока не проверял эту гипотезу. Вы можете её проверить самостоятельно, либо дождаться автора.
Либо не морочить себе голову и распаковывать всегда всё. По идее, при обновлениях должны распаковываться только изменённые файлы, тем самым сокращая время, но это не точно...
Когда процесс завершиться, вам нужно как раз-таки сэмулировать диск P
Для этого в DayZ Tools во вкладке Tools выбираете пункт Mount Drive P (возможно, что для этого запросит права администратора)
Для проверки, что диск появился, можете зайти в Проводник -> Этот компьютер и в подразделе "Устройства и диски" увидеть диск P
В нём как раз и будут лежать распакованные файлы игры
Он ссылается на распакованные данные игры и очень удобен для хранения всего, что связано с модификациями игры, в том числе и скриптами.
Предположим, что вы хотите хранить все эти данные в папке "C:\Users\<Название вашего профиль Windows>\Documents\DayZ Projects" (именно такой путь мне по умолчанию предложил DayZ Tools)
Тогда вам не нужно выполнять пункты ниже, до распаковки игры. Достаточно лишь проверить, что указана верная папка в Path to the Project Drive
Если вы хотите, чтобы ссылались на другую папку, то нужно выполнить следующие шаги:
- Запускаем DayZ Tools
- Открываем Settings и снимаем галку у пункта "Default" для строки Path to the Project Drive(он же диск P).
-
- Нажимаете на иконку папки и выбираете новый путь до места, где у вас будут хранится все файлы по моддингу
- Как закончите, нажимаете кнопку Apply
- Тут всё просто. Открываем Tools и выбираем Extract Game Data.
- В появившемся окне сверяем пути и если всё ОК, то подтверждаем операцию
![Smile :) :)](/f/styles/default/xenforo/smilies/k/smile.gif)
Что в этом шаге происходит?
Данные из папки с игрой переносятся в папку для моддинга и распаковываются.
Это необходимо, чтобы изучать файлы игры и смотреть, что и как сделано и на их основе уже делать моды.
Распаковывать файлы необходимо при каждом обновлении игры, чтобы всё было актуально и не создавать себе лишних проблем из-за этого.
Для скриптеров, по идее, надо копировать и распаковывать лишь scripts.pbo, что лежит в папке с игрой и подпапке dta, например "C:\Program Files (x86)\Steam\steamapps\common\DayZ\dta\scripts.pbo"
И только лишь его держать актуальным, ну возможно, что ещё gui.pbo из той же папки (для создания своих интерфейсов(UI))
Автор пока не проверял эту гипотезу. Вы можете её проверить самостоятельно, либо дождаться автора.
Либо не морочить себе голову и распаковывать всегда всё. По идее, при обновлениях должны распаковываться только изменённые файлы, тем самым сокращая время, но это не точно...
Когда процесс завершиться, вам нужно как раз-таки сэмулировать диск P
Для этого в DayZ Tools во вкладке Tools выбираете пункт Mount Drive P (возможно, что для этого запросит права администратора)
Для проверки, что диск появился, можете зайти в Проводник -> Этот компьютер и в подразделе "Устройства и диски" увидеть диск P
В нём как раз и будут лежать распакованные файлы игры
Настройка Workbench'a
- Запустите Workbench, нажав на соответствующую кнопку в DayZ Tools
- В открывшейся программе зайдите в Options
- В строке Source data directory укажите P:\ (Это нужно, чтобы подсказать инструменту, где надо искать распакованные файлы игры)
- Нажмите OK и дождитесь перезапуска программы
Создаём свой первый мод
С помощью Workbench'a на диске P (В инструменте он называется SourceData) создаём папку FirstMod
![Wink ;) ;)](/f/styles/default/xenforo/smilies/k/wink.gif)
Далее в папке FirstMod создаём файл config.cpp, так как такого расширения в Worbench'e нет, то придётся его создать через Проводник
Чтобы быстро попасть в папку FirstMod в проводнике, достаточно нажать ПКМ и выбрать пункт Open file location
В config.cpp вставляем код ниже и сохраняем файл
Это базовый конфиг с официальной вики, который необходим нам для корректной работы нашего первого мода
Теперь нам надо создать наш скрипт.
Для этого, в папке с модом создаём папку и называем её WorldScripts
А в ней создаём файл MyScript.c, копируем в него код ниже и сохраняем
Если два раза нажать на созданный файл, то он откроется через инструмент, встроенный в Workbench, в котором мы будем часто работать - Script Editor
Мод готов, теперь его надо запаковать.
- Нажать правую кнопку мыши(ПКМ) по названию SourceData и в выпадающем меню выбираем New -> New Folder
- В появившемся окне вписываем название папки - FirstMod
![Wink ;) ;)](/f/styles/default/xenforo/smilies/k/wink.gif)
Далее в папке FirstMod создаём файл config.cpp, так как такого расширения в Worbench'e нет, то придётся его создать через Проводник
Чтобы быстро попасть в папку FirstMod в проводнике, достаточно нажать ПКМ и выбрать пункт Open file location
В config.cpp вставляем код ниже и сохраняем файл
C++:
class CfgPatches
{
class FirstMod
{
requiredAddons[]=
{
// ""
};
}
}
class CfgMods
{
class FirstMod
{
type = "mod";
class defs
{
class worldScriptModule
{
value = "";
files[] = {"FirstMod/WorldScripts"};
}
}
}
}
Теперь нам надо создать наш скрипт.
Для этого, в папке с модом создаём папку и называем её WorldScripts
А в ней создаём файл MyScript.c, копируем в него код ниже и сохраняем
C++:
modded class PlayerBase // modded keyword for modding existing class
{
override void OnJumpStart() // overriding existing function
{
super.OnJumpStart(); // call the original jump function so we don't break stuff
Print("My first mod, yay!"); // our modded print
}
}
Мод готов, теперь его надо запаковать.
- В DayZ Tools выбираем Addon Builder и ждём его загрузки
- Заходим в Options
- Проверяем, что в пункте Path to project folder указан наш диск P
- Именно в нём сей инструмент будет искать то, что нужно запаковать
- В Addon source directory указываем путь до нашего мода, в нашем случае это будет P:\FirstMod
- Не забываем, что указываем путь таким образом, чтобы все файлы попали в мод
- Например, если бы мы указали путь только до нашего скрипта P:\FirstMod\WorldScripts, минуя файл config.cpp, что лежит на уровень выше, то ничего бы не заработало бы, так как игра просто бы не увидела наш скрипт
- Не забываем, что указываем путь таким образом, чтобы все файлы попали в мод
- На диске P создаём папку @FirstMod, как раз в её вложенной папке addons будут лежать запакованные файлы
- В ней создаём папку addons(с маленькой буквы "a", так как, как говорят на официальной вики, таким образом сервера на Linux смогут увидеть мод)
- В Addon Builder'e, в пункте Destination directory... указываем как раз путь до папки addons
- Отмечаем галочками пункты Clear temp folder, Binarize и Enable extended logging, если они не отмечены
- Жмём жёлтую кнопку Pack
- Если всё ОК, то появится дополнительное окно, оповещающее что всё чётко - Build successful
- Если же что-то пойдёт не так, то в этом окне будет код ошибки, а по кнопке Logs можно будет найти файл AddonBuilder.rpt с более подробными логами и определить, в чём же ошибка
- Проверяем, что в P:\@FirstMod\addons создался файл FirstMod.pbo(название как раз берётся от названия папки)
- Если распаковать этот мод, то внутри него будет папка worldscripts, с файлом myscript.c внутри и забинаренный файл конфига config.bin
- Всё, наш мод готов к тестированию
Так как наш мод меняет метод в классе, который используется только на клиенте, то тестировать мы будем тоже с помощью клиента, без использования сервера.
С помощью оффлайн миссии:
Теперь нам нужно понять, выполнился ли наш скрипт и записалась ли в специальный файл с логами скриптов строчка "My first mod, yay!", которая указана в функции Print()
Для этого нужно найти этот файл:
С помощью оффлайн миссии:
- Создаём папку singleplayer.ChernarusPlus
- .ChernarusPlus означает, что запускаться миссия будет на карте Чернарусь
- Внутри неё создаём файл инициализации - init.c
- Он как раз-таки запускается при старте миссии
- В него вставляем код
-
C++:
class CustomMission: MissionGameplay { void CustomMission() { } }; Mission CreateCustomMission(string path) { return new CustomMission(); } void main() { // Create player PlayerBase player = PlayerBase.Cast( ( GetGame().CreatePlayer( NULL, "SurvivorF_Linda", "2200 10 2200", 0, "NONE") ) ); // Set your gear player.CreateInInventory("TShirt_Black"); // Select player GetGame().SelectPlayer(NULL, player); }
-
- Отлично, оффлайн миссия готова
- Запускаем командную строку Windows
- Это можно сделать, вбив в поиске cmd
- Или нажав сочетание клавиш Win + R и уже там вбить cmd
- Открываем папку, где лежит игра и DayZDiag_x64.exe
- Если ничего не меняли при установке, то папка с игрой будет где-нибудь здесь
- C:\Program Files (x86)\Steam\steamapps\common\
- На будущее могу посоветовать этот путь, или прямо до игры закрепить на панели быстрого доступа в Проводнике
- ПКМ на папке -> Закрепить на панели быстрого доступа
- Если ничего не меняли при установке, то папка с игрой будет где-нибудь здесь
- Копируем этот путь в буфер обмена
- Это можно сделать, нажав на адресную строку в проводнике
- Либо, удерживая Shift, нажать ПКМ на DayZDiag_x64.exe
- Тогда в контекстном меню появится новый пункт Копировать как путь
- Его то и нужно будет нажать
- Это можно сделать, нажав на адресную строку в проводнике
- Вставляем получившееся в командную строку
- Должно получиться "C:\Program Files (x86)\Steam\steamapps\common\DayZ\DayZDiag_x64.exe"
- Добавляем к этой строчке, через пробел параметры
- -mod=P:\@FirstMod
- -mission=P:\singleplayer.ChernarusPlus
- Получаем в итоге "C:\Program Files (x86)\Steam\steamapps\common\DayZ\DayZDiag_x64.exe" -mod=P:\@FirstMod -mission=P:\singleplayer.ChernarusPlus
- Нажимаем Enter и ждём, когда игра запуститься в оконном режиме
- Если нужен полный экран, то нажимаем Esc и далее сочетание клавиш Alt + Enter
- Отлично, вы великолепны!
Теперь нам нужно понять, выполнился ли наш скрипт и записалась ли в специальный файл с логами скриптов строчка "My first mod, yay!", которая указана в функции Print()
Для этого нужно найти этот файл:
- Нажимаем кнопку Windows или в строке поиска вставляем %appdata%
- Так же этот путь можно вставить в адресную строку Проводника
- Попадаем в папку C:\Users\ВАШЕ НАЗВАНИЕ ПРОФИЛЯ WINDOWS\AppData\Roaming
- Поднимаемся на уровень выше, в AppData
- Проваливаемся в папке Local
- Так же в эту папку можно попасть, нажав на кнопку Game Logs в меню View у DayZ Tools
- Так же в эту папку можно попасть, нажав на кнопку Game Logs в меню View у DayZ Tools
- Ищем в ней папку DayZ
- Заходим в неё и ищем файл с названием script_..._. log (вместо точек будет дата и время создания файла - запуска игры)
- Для удобства, можно отсортировать по Дате изменений, чтобы новые файлы были в начале списка
- В этом файле, ближе к концу вы должны увидеть строчку
- SCRIPT : My first mod, yay!
- Если ещё несколько раз попрыгаете в игре, то на каждый прыжок в script.log будет записана строчка из нашего скрипта
Всё время при тестах искать этот файл script.log неудобно, поэтому разработчики в Workbench, в Script Editor'e реализовали консоль вывода.
Так давайте теперь настроем инструмент так, чтобы ей можно было пользоваться:
Так давайте теперь настроем инструмент так, чтобы ей можно было пользоваться:
- Нам нужно, чтобы Workbench увидел наш мод
- Находим папку, где у нас установлены инструменты
- Это можно сделать, нажав на кнопку Tools Directory в выпадающем меню View в DayZ Tools
- Либо через проводник, папка лежит в той же родительской папке, что и игра
- Например, в C:\Program Files (x86)\Steam\steamapps\common\DayZ Tools
- Это можно сделать, нажав на кнопку Tools Directory в выпадающем меню View в DayZ Tools
- Далее нужно провалиться в папку Bin
- И затем найти папку Workbench
- В ней найти экзешник workbenchApp.exe
- Скопировать путь до него
- Должно получиться что-то по типу
- "C:\Program Files (x86)\Steam\steamapps\common\DayZ Tools\Bin\Workbench\"
- К этому пути добавляем название экзешника workbenchApp.exe и параметр -mod=P:\@FirstMod
- А в начале строки добавляем команду start /D
- В итоге должно получиться:
- start /D "C:\Program Files (x86)\Steam\steamapps\common\DayZ Tools\Bin\Workbench" workbenchApp.exe -mod=P:\@FirstMod
- Нажимаем Enter и ждём загрузки Workbench
- Когда он загрузится, открываем Script Editor (Editors -> Script Editor)
- Ищем в нём окно с названием Projects
- В нём ищем папку World('scripts/4_World')
- Другие папки можете закрывать, для удобства поиска
- Если мы всё сделали правильно, то в этой папке мы можем увидеть наш скриптовый файл MyScript.c
- Открываем его в редакторе, дважды нажав по нему ЛКМ
- Теперь запускаем игру с подключённой оффлайн миссией
- Можете использовать команду start /D
- Тогда получится вот такая строчка start /D "C:\Program Files (x86)\Steam\steamapps\common\DayZ" DayZDiag_x64.exe -mod=P:\@FirstMod -mission=P:\singleplayer.ChernarusPlus
- В правом нижнем углу при загрузке игры мы можем увидеть всплывающее сообщение, означающее, что Script Editor видит игру
- Делаем прыжок и открываем Script Editor
- В нём ищем окно Output, в котором должна быть наша фраза
- SCRIPT : My first mod, yay!
- Шикарно, это теперь тоже работает и мы немного сэкономили время на поиске файла с логами и чтение их именно оттуда
Теперь нужно узнать о мощном инструменте, который очень пригодится при отладке и определении, как те или иные части друг с другом взаимодействуют и передают информацию
- В нашем файле, MyScript.c, у шестой строчки ставим курсор и нажимаем кнопку F9
- Либо заходим в меню Debug и нажимаем на кнопку Insert Breakpoint
- Замечаем, что напротив нашей шестой строчки появился красный кружок, который как раз и означает, что у этой строчке, при выполнении скрипта нужно остановиться
- Если ещё раз нажать на F9, то красная точка исчезнет
- Есть ещё более быстрый способ размещения точек остановки
- Достаточно напротив строчки нажать ЛКМ в том само месте, где вы видели точку остановки, то есть между цифрой и текстом
- Достаточно напротив строчки нажать ЛКМ в том само месте, где вы видели точку остановки, то есть между цифрой и текстом
- Можете заметить, что не у всех строчек кружок красный и заполненный, например, если поставить точку остановки у четвёртой строчки, то мы получим кружок, но с восклицательным знаком внутри
- Это означает, что на этой строчке не будет никакой остановки
- Если для строчек с одной фигурной скобкой это нормально, то для строчки с командой это будет означать, что до этого места скрипт по какой-то причине не доходит и эту причину вам нужно будет выяснить
- Либо заходим в меню Debug и нажимаем на кнопку Insert Breakpoint
- В игре прыгаем и видим, что всё замерло
- Переходим в Script Editor и видим, что в красном кружке теперь появилась жёлтая стрелочка, которая обозначает, где мы сейчас находимся
- В Output у нас пока никакой надписи нет, так как мы ещё не прошли шестую строчку и функция Print() не выполнилась
- Нам нужно продолжить выполнение скрипта, поэтому в меню Debug нажимаем на кнопку Continue, либо нажимаем кнопку F5
- Так же можно управлять дебаг режимом в специальном окне Debug
- Тут как раз есть вспомогательные команды, которые помогут вам разобраться, что происходило до точки остановки и где
- Так же можно управлять дебаг режимом в специальном окне Debug
- В Output появляется наша заветный текст
- Радуемся!
Отлично, мы можем теперь видеть в консоле логи и расставлять точки остановки.
Теперь попробуем при запущенной игре, через Script Editor добавить новый вызов функции Print() только уже с другим текстом после нашего текущего вызова Print():
Сохраняем файл с помощью сочетания клавиш Ctrl + S и совершаем прыжок в игре
Хмм, в Output пишется только вызов одной функции Print()
Это происходит из-за того, что Workbench не видит изменений в моде и его снова нужно запаковать, перезапустить игру и Workbench
Сами понимаете, что это сжирает львиную долю времени и делает невозможным нормальную отладку сложных скриптов.
Поэтому в дело вступает параметр запуска -filepatching
Чтобы этот параметр заработал, нам нужно, чтобы распакованные файлы мода и запакованные лежали в папке с игрой
Мы знаем, как это избежать и оставить все файлы на диске P
Для этого воспользуемся стандартным линковщиком и сделаем так, чтобы как бы наша папка с распакованным модом была в папке с игрой.
Запускаем командную строку(cmd) и выполняем следующую команду
mklink /J "C:\Program Files (x86)\Steam\steamapps\common\DayZ\FirstMod" "P:\FirstMod"
Вместо C:\Program Files (x86)\Steam\steamapps\common\DayZ у вас свой путь до папки с игрой
В консоли должны увидеть успешный результат
А в папке с игрой появится папка FirstMod с иконкой стрелочки
Теперь запускаем нашу игру с дополнительным параметром, должно получиться как-то так:
start /D "C:\Program Files (x86)\Steam\steamapps\common\DayZ" DayZDiag_x64.exe -mod=P:\@FirstMod -mission=P:\singleplayer.ChernarusPlus -filePatching
Если мы добавим ещё один вызов функции Print() и сохраним наш скрипт, то достаточно лишь будет перезапустить игру, чтобы увидеть изменения.
Вот, уже сэкономили время на запаковке мода и перезапуске Workbench'a
Важный нюанс(Нужно правда это перепроверить, я как-то этим не занимался
):
Если добавляются новые файлы(и возможно классы), то надо заново перепаковывать мод со всеми вытекающими
Теперь попробуем при запущенной игре, через Script Editor добавить новый вызов функции Print() только уже с другим текстом после нашего текущего вызова Print():
C++:
Print("TEST");
Хмм, в Output пишется только вызов одной функции Print()
Это происходит из-за того, что Workbench не видит изменений в моде и его снова нужно запаковать, перезапустить игру и Workbench
Сами понимаете, что это сжирает львиную долю времени и делает невозможным нормальную отладку сложных скриптов.
Поэтому в дело вступает параметр запуска -filepatching
Чтобы этот параметр заработал, нам нужно, чтобы распакованные файлы мода и запакованные лежали в папке с игрой
Мы знаем, как это избежать и оставить все файлы на диске P
Для этого воспользуемся стандартным линковщиком и сделаем так, чтобы как бы наша папка с распакованным модом была в папке с игрой.
Запускаем командную строку(cmd) и выполняем следующую команду
mklink /J "C:\Program Files (x86)\Steam\steamapps\common\DayZ\FirstMod" "P:\FirstMod"
Вместо C:\Program Files (x86)\Steam\steamapps\common\DayZ у вас свой путь до папки с игрой
В консоли должны увидеть успешный результат
А в папке с игрой появится папка FirstMod с иконкой стрелочки
Теперь запускаем нашу игру с дополнительным параметром, должно получиться как-то так:
start /D "C:\Program Files (x86)\Steam\steamapps\common\DayZ" DayZDiag_x64.exe -mod=P:\@FirstMod -mission=P:\singleplayer.ChernarusPlus -filePatching
Если мы добавим ещё один вызов функции Print() и сохраним наш скрипт, то достаточно лишь будет перезапустить игру, чтобы увидеть изменения.
Вот, уже сэкономили время на запаковке мода и перезапуске Workbench'a
Важный нюанс(Нужно правда это перепроверить, я как-то этим не занимался
![Smile :) :)](/f/styles/default/xenforo/smilies/k/smile.gif)
Если добавляются новые файлы(и возможно классы), то надо заново перепаковывать мод со всеми вытекающими
Перекомпиляция(Вишенка на тортике)
Окей, мы сэкономили время, но можно же ещё сэкономить ![Wink ;) ;)](/f/styles/default/xenforo/smilies/k/wink.gif)
Вам не нужно перезапускать каждый раз игру при внесении изменений в скрипт, достаточно лишь нажать сочетание клавиш Ctrl + F7 или нажать на кнопку Recompile File on Host в меню Debug
![Wink ;) ;)](/f/styles/default/xenforo/smilies/k/wink.gif)
Вам не нужно перезапускать каждый раз игру при внесении изменений в скрипт, достаточно лишь нажать сочетание клавиш Ctrl + F7 или нажать на кнопку Recompile File on Host в меню Debug
P.S. Дочитали до конца?
Вы просто замечательны
Благодарности:
- Официальной вики (недавно Jacob_Mango обновил инструкции и они стали в себя включать много полезной инфы)
-
DayZ:Modding Basics - Bohemia Interactive Community
community.bistudio.com
-
Workbench Script Debugging – DayZ - Bohemia Interactive Community
community.bistudio.com
-
- Статье на Medium
Вложения
Последнее редактирование: