Настройка инструментов для скриптинга

PR9INICHEK

Переводчик DZR
Ур
7
 
Что вы узнаете в этом руководстве:
  • Настройка и использование официальных инструментов 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
Если вы хотите, чтобы ссылались на другую папку, то нужно выполнить следующие шаги:
  1. Запускаем DayZ Tools
  2. Открываем Settings и снимаем галку у пункта "Default" для строки Path to the Project Drive(он же диск P).
    1. 1640695116482.png
    2. 1640695189543.png
  3. Нажимаете на иконку папки и выбираете новый путь до места, где у вас будут хранится все файлы по моддингу
  4. Как закончите, нажимаете кнопку Apply
Теперь распаковываем данные игры:
  1. Тут всё просто. Открываем Tools и выбираем Extract Game Data.
    1. 1640695450186.png
    2. 1640695490472.png
  2. В появившемся окне сверяем пути и если всё ОК, то подтверждаем операцию
    1. 1640695598349.png
Этот процесс может занять длительное время, поэтому посмотрите что-нибудь, перекусите и попейте чаю :)

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

Для скриптеров, по идее, надо копировать и распаковывать лишь scripts.pbo, что лежит в папке с игрой и подпапке dta, например "C:\Program Files (x86)\Steam\steamapps\common\DayZ\dta\scripts.pbo"
И только лишь его держать актуальным, ну возможно, что ещё gui.pbo из той же папки (для создания своих интерфейсов(UI))
Автор пока не проверял эту гипотезу. Вы можете её проверить самостоятельно, либо дождаться автора.
Либо не морочить себе голову и распаковывать всегда всё. По идее, при обновлениях должны распаковываться только изменённые файлы, тем самым сокращая время, но это не точно...


Когда процесс завершиться, вам нужно как раз-таки сэмулировать диск P
Для этого в DayZ Tools во вкладке Tools выбираете пункт Mount Drive P (возможно, что для этого запросит права администратора)
1640696302949.png


Для проверки, что диск появился, можете зайти в Проводник -> Этот компьютер и в подразделе "Устройства и диски" увидеть диск P
1640696424282.png


В нём как раз и будут лежать распакованные файлы игры
1640696525591.png

Настройка Workbench'a

  1. Запустите Workbench, нажав на соответствующую кнопку в DayZ Tools
    1. 1640696871296.png
  2. В открывшейся программе зайдите в Options
    1. 1640696955814.png
  3. В строке Source data directory укажите P:\ (Это нужно, чтобы подсказать инструменту, где надо искать распакованные файлы игры)
  4. Нажмите OK и дождитесь перезапуска программы

Создаём свой первый мод

С помощью Workbench'a на диске P (В инструменте он называется SourceData) создаём папку FirstMod
  1. Нажать правую кнопку мыши(ПКМ) по названию SourceData и в выпадающем меню выбираем New -> New Folder
    1. 1640697294232.png
  2. В появившемся окне вписываем название папки - FirstMod
    1. 1640697439895.png
Так же папку можете создать через проводник, но лучше всё же привыкать к использованию Workbench'a ;)

Далее в папке FirstMod создаём файл config.cpp, так как такого расширения в Worbench'e нет, то придётся его создать через Проводник
Чтобы быстро попасть в папку FirstMod в проводнике, достаточно нажать ПКМ и выбрать пункт Open file location
1640697754178.png


В 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, копируем в него код ниже и сохраняем
1640698197082.png

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
 }
}
Если два раза нажать на созданный файл, то он откроется через инструмент, встроенный в Workbench, в котором мы будем часто работать - Script Editor
1640698338126.png

Мод готов, теперь его надо запаковать.
Запаковка мода
  1. В DayZ Tools выбираем Addon Builder и ждём его загрузки
    1. 1640857411399.png
  2. Заходим в Options
    1. 1640857935387.png
  3. Проверяем, что в пункте Path to project folder указан наш диск P
    1. 1640858055825.png
    2. Именно в нём сей инструмент будет искать то, что нужно запаковать
  4. В Addon source directory указываем путь до нашего мода, в нашем случае это будет P:\FirstMod
    1. Не забываем, что указываем путь таким образом, чтобы все файлы попали в мод
      1. Например, если бы мы указали путь только до нашего скрипта P:\FirstMod\WorldScripts, минуя файл config.cpp, что лежит на уровень выше, то ничего бы не заработало бы, так как игра просто бы не увидела наш скрипт
  5. На диске P создаём папку @FirstMod, как раз в её вложенной папке addons будут лежать запакованные файлы
  6. В ней создаём папку addons(с маленькой буквы "a", так как, как говорят на официальной вики, таким образом сервера на Linux смогут увидеть мод)
  7. В Addon Builder'e, в пункте Destination directory... указываем как раз путь до папки addons
    1. 1640860996566.png
  8. Отмечаем галочками пункты Clear temp folder, Binarize и Enable extended logging, если они не отмечены
  9. Жмём жёлтую кнопку Pack
  10. Если всё ОК, то появится дополнительное окно, оповещающее что всё чётко - Build successful
    1. 1640861025674.png

    2. Если же что-то пойдёт не так, то в этом окне будет код ошибки, а по кнопке Logs можно будет найти файл AddonBuilder.rpt с более подробными логами и определить, в чём же ошибка
  11. Проверяем, что в P:\@FirstMod\addons создался файл FirstMod.pbo(название как раз берётся от названия папки)
    1. Если распаковать этот мод, то внутри него будет папка worldscripts, с файлом myscript.c внутри и забинаренный файл конфига config.bin
  12. Всё, наш мод готов к тестированию
Тестирование
Так как наш мод меняет метод в классе, который используется только на клиенте, то тестировать мы будем тоже с помощью клиента, без использования сервера.
С помощью оффлайн миссии:
  1. Создаём папку singleplayer.ChernarusPlus
    1. .ChernarusPlus означает, что запускаться миссия будет на карте Чернарусь
  2. Внутри неё создаём файл инициализации - init.c
    1. Он как раз-таки запускается при старте миссии
  3. В него вставляем код
    1. 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);
      }
  4. Отлично, оффлайн миссия готова ;)
Теперь нужно запустить игру через специальный EXEшник для отладки(дебаггинга):
  1. Запускаем командную строку Windows
    1. Это можно сделать, вбив в поиске cmd
    2. Или нажав сочетание клавиш Win + R и уже там вбить cmd
  2. Открываем папку, где лежит игра и DayZDiag_x64.exe
    1. Если ничего не меняли при установке, то папка с игрой будет где-нибудь здесь
      1. C:\Program Files (x86)\Steam\steamapps\common\
      2. На будущее могу посоветовать этот путь, или прямо до игры закрепить на панели быстрого доступа в Проводнике
        1. ПКМ на папке -> Закрепить на панели быстрого доступа
        2. 1640860140694.png
  3. Копируем этот путь в буфер обмена
    1. Это можно сделать, нажав на адресную строку в проводнике
      1. 1640860211948.png
      2. 1640860226163.png
    2. Либо, удерживая Shift, нажать ПКМ на DayZDiag_x64.exe
      1. Тогда в контекстном меню появится новый пункт Копировать как путь
      2. Его то и нужно будет нажать
  4. Вставляем получившееся в командную строку
    1. Должно получиться "C:\Program Files (x86)\Steam\steamapps\common\DayZ\DayZDiag_x64.exe"
  5. Добавляем к этой строчке, через пробел параметры
    1. -mod=P:\@FirstMod
    2. -mission=P:\singleplayer.ChernarusPlus
  6. Получаем в итоге "C:\Program Files (x86)\Steam\steamapps\common\DayZ\DayZDiag_x64.exe" -mod=P:\@FirstMod -mission=P:\singleplayer.ChernarusPlus
  7. Нажимаем Enter и ждём, когда игра запуститься в оконном режиме
    1. Если нужен полный экран, то нажимаем Esc и далее сочетание клавиш Alt + Enter
  8. Отлично, вы великолепны!
Нажимаем кнопку для прыжка, обычно это Пробел(Space)
Теперь нам нужно понять, выполнился ли наш скрипт и записалась ли в специальный файл с логами скриптов строчка "My first mod, yay!", которая указана в функции Print()
Для этого нужно найти этот файл:
  1. Нажимаем кнопку Windows или в строке поиска вставляем %appdata%
    1. Так же этот путь можно вставить в адресную строку Проводника
  2. Попадаем в папку C:\Users\ВАШЕ НАЗВАНИЕ ПРОФИЛЯ WINDOWS\AppData\Roaming
  3. Поднимаемся на уровень выше, в AppData
  4. Проваливаемся в папке Local
    1. Так же в эту папку можно попасть, нажав на кнопку Game Logs в меню View у DayZ Tools
      1. 1640874755294.png
  5. Ищем в ней папку DayZ
  6. Заходим в неё и ищем файл с названием script_..._. log (вместо точек будет дата и время создания файла - запуска игры)
    1. Для удобства, можно отсортировать по Дате изменений, чтобы новые файлы были в начале списка
  7. В этом файле, ближе к концу вы должны увидеть строчку
    1. SCRIPT : My first mod, yay!
  8. Если ещё несколько раз попрыгаете в игре, то на каждый прыжок в script.log будет записана строчка из нашего скрипта
Всё время при тестах искать этот файл script.log неудобно, поэтому разработчики в Workbench, в Script Editor'e реализовали консоль вывода.

Так давайте теперь настроем инструмент так, чтобы ей можно было пользоваться:
  1. Нам нужно, чтобы Workbench увидел наш мод
  2. Находим папку, где у нас установлены инструменты
    1. Это можно сделать, нажав на кнопку Tools Directory в выпадающем меню View в DayZ Tools
      1. 1640862347234.png
    2. Либо через проводник, папка лежит в той же родительской папке, что и игра
      1. Например, в C:\Program Files (x86)\Steam\steamapps\common\DayZ Tools
  3. Далее нужно провалиться в папку Bin
  4. И затем найти папку Workbench
  5. В ней найти экзешник workbenchApp.exe
  6. Скопировать путь до него
  7. Должно получиться что-то по типу
    1. "C:\Program Files (x86)\Steam\steamapps\common\DayZ Tools\Bin\Workbench\"
  8. К этому пути добавляем название экзешника workbenchApp.exe и параметр -mod=P:\@FirstMod
  9. А в начале строки добавляем команду start /D
  10. В итоге должно получиться:
    1. start /D "C:\Program Files (x86)\Steam\steamapps\common\DayZ Tools\Bin\Workbench" workbenchApp.exe -mod=P:\@FirstMod
  11. Нажимаем Enter и ждём загрузки Workbench
  12. Когда он загрузится, открываем Script Editor (Editors -> Script Editor)
  13. Ищем в нём окно с названием Projects
  14. В нём ищем папку World('scripts/4_World')
    1. Другие папки можете закрывать, для удобства поиска
  15. Если мы всё сделали правильно, то в этой папке мы можем увидеть наш скриптовый файл MyScript.c
    1. 1640863324118.png
  16. Открываем его в редакторе, дважды нажав по нему ЛКМ
  17. Теперь запускаем игру с подключённой оффлайн миссией
    1. Можете использовать команду start /D
    2. Тогда получится вот такая строчка start /D "C:\Program Files (x86)\Steam\steamapps\common\DayZ" DayZDiag_x64.exe -mod=P:\@FirstMod -mission=P:\singleplayer.ChernarusPlus
  18. В правом нижнем углу при загрузке игры мы можем увидеть всплывающее сообщение, означающее, что Script Editor видит игру
    1. 1640863516407.png
  19. Делаем прыжок и открываем Script Editor
  20. В нём ищем окно Output, в котором должна быть наша фраза
    1. SCRIPT : My first mod, yay!
    2. 1640863642769.png
  21. Шикарно, это теперь тоже работает и мы немного сэкономили время на поиске файла с логами и чтение их именно оттуда
Точки остановки(Breakpoints)
Теперь нужно узнать о мощном инструменте, который очень пригодится при отладке и определении, как те или иные части друг с другом взаимодействуют и передают информацию
  1. В нашем файле, MyScript.c, у шестой строчки ставим курсор и нажимаем кнопку F9
    1. Либо заходим в меню Debug и нажимаем на кнопку Insert Breakpoint
      1. 1640863989616.png
    2. Замечаем, что напротив нашей шестой строчки появился красный кружок, который как раз и означает, что у этой строчке, при выполнении скрипта нужно остановиться
      1. 1640864047906.png
    3. Если ещё раз нажать на F9, то красная точка исчезнет
    4. Есть ещё более быстрый способ размещения точек остановки
      1. Достаточно напротив строчки нажать ЛКМ в том само месте, где вы видели точку остановки, то есть между цифрой и текстом
        1. 1640864169680.png
    5. Можете заметить, что не у всех строчек кружок красный и заполненный, например, если поставить точку остановки у четвёртой строчки, то мы получим кружок, но с восклицательным знаком внутри
      1. 1640864258715.png
      2. Это означает, что на этой строчке не будет никакой остановки
      3. Если для строчек с одной фигурной скобкой это нормально, то для строчки с командой это будет означать, что до этого места скрипт по какой-то причине не доходит и эту причину вам нужно будет выяснить
  2. В игре прыгаем и видим, что всё замерло
  3. Переходим в Script Editor и видим, что в красном кружке теперь появилась жёлтая стрелочка, которая обозначает, где мы сейчас находимся
    1. 1640864893769.png
  4. В Output у нас пока никакой надписи нет, так как мы ещё не прошли шестую строчку и функция Print() не выполнилась
  5. Нам нужно продолжить выполнение скрипта, поэтому в меню Debug нажимаем на кнопку Continue, либо нажимаем кнопку F5
    1. Так же можно управлять дебаг режимом в специальном окне Debug
      1. 1640865053839.png
    2. Тут как раз есть вспомогательные команды, которые помогут вам разобраться, что происходило до точки остановки и где
  6. В Output появляется наша заветный текст
  7. Радуемся!
Filepatching
Отлично, мы можем теперь видеть в консоле логи и расставлять точки остановки.
Теперь попробуем при запущенной игре, через Script Editor добавить новый вызов функции Print() только уже с другим текстом после нашего текущего вызова Print():
C++:
Print("TEST");
Сохраняем файл с помощью сочетания клавиш 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 у вас свой путь до папки с игрой
В консоли должны увидеть успешный результат
1640866975179.png

А в папке с игрой появится папка FirstMod с иконкой стрелочки
1640866994253.png


Теперь запускаем нашу игру с дополнительным параметром, должно получиться как-то так:
start /D "C:\Program Files (x86)\Steam\steamapps\common\DayZ" DayZDiag_x64.exe -mod=P:\@FirstMod -mission=P:\singleplayer.ChernarusPlus -filePatching

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

Перекомпиляция(Вишенка на тортике)
Окей, мы сэкономили время, но можно же ещё сэкономить ;)

Вам не нужно перезапускать каждый раз игру при внесении изменений в скрипт, достаточно лишь нажать сочетание клавиш Ctrl + F7 или нажать на кнопку Recompile File on Host в меню Debug

P.S. Дочитали до конца?
Вы просто замечательны
1640868006221.png


Благодарности:
  1. Официальной вики (недавно Jacob_Mango обновил инструкции и они стали в себя включать много полезной инфы)
  2. Статье на Medium
 

Вложения

  • 1640858759201.png
    1640858759201.png
    6,2 KB · Просмотры: 15
  • 1640858967296.png
    1640858967296.png
    26,3 KB · Просмотры: 14
Последнее редактирование:

PR9INICHEK

Переводчик DZR
Ур
7
 
Теперь ещё добавим немного оптимизации.
Всё время запускать игру через командную строку и вбивать ручками параметры не комильфо.
  • Поэтому создадим файл с расширением .bat(батник) на диске P и впишем нашу команду туда
    • start /d "C:\Program Files (x86)\Steam\steamapps\common\DayZ" DayZDiag_x64.exe -mod=P:\@FirstMod -mission=P:\singleplayer.ChernarusPlus -window -filePatching
  • Сохраним батник с понятным названием, например StartOfflineMission
  • Запустим Script Editor и в меню Plugins -> Settings выберем пункт DayZ Run
  • В поле value мы должны указать путь до нашего батника без расширения самого файла
  • Должен получится C:\Users\ВАШЕ НАЗВАНИЕ ПРОФИЛЯ WINDOWS\Documents\DayZ Projects\StartOfflineMission.bat
    • Просто указать вместо C:\Users\ВАШЕ НАЗВАНИЕ ПРОФИЛЯ WINDOWS\Documents\DayZ Projects диск P:\ не получится :(
  • Теперь с помощью сочетания клавиш Ctrl + 2 или нажав на кнопку DayZ Run в меню Plugins можно быстро запускать игру
    • А отредактировав батник, можно указывать другие моды и параметры для их запуска
Окей, мы теперь запускаем игру, а как же теперь нам её "убить" или перезапустить
Для этих целей создаём отдельные батники и прописываем их в пункты DayZ Kill и DayZ Restart соответственно

Для "убийства" процесса нужно выполнить следующую команду
taskkill /f /im DayZDiag_x64.exe

+
можно создать батник для запуска Workbench с нужным модом
В нём будет такая команда или около того ;)
start /D "C:\Program Files (x86)\Steam\steamapps\common\DayZ Tools\Bin\Workbench" workbenchApp.exe -mod=P:\@FirstMod


Если вдруг столкнётесь с проблемой запуска батников, то можете попробовать отладить, например раскомментив строчки с вызовом функции Print() в \scripts\editor\plugins\dayztools.c
Логи по Workbench'у лежат в C:\Program Files (x86)\Steam\steamapps\common\DayZ Tools\Bin\Logs\Workbench
 
Последнее редактирование:

PR9INICHEK

Переводчик DZR
Ур
7
 
Щепотки оптимизации
Наведение порядка на диске P

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

Изменение директории для диска P
Если вы захотели выделить себе отдельное место, создали логический диск или даже купили отдельный диск для моддинга, то нужно будет изменить папку по умолчанию, на которую ссылается диск P
Для этого запускаем DayZ Tools, заходим в Settings, убираем галочку у поля Default, у строчки Path to Project Drive и указываем нужный путь.
У меня это логический диск E(отделил 50 Гб от SSD)
1640874284664.png

Нажимаем кнопку Apply и подтверждаем перезапуск
1640874312285.png

Иногда может не перезапуститься автоматом, поэтому придётся запустить вручную

Если всё ОК(можно проверить нажав на Workdrive Directory в меню View - должны попасть в новое место), то перекидываем и удаляем папку DayZ Projects из ваших документов. Пусть всё будет в чистоте ;)

Не забудьте изменить пути для запуска ваших батников через Script Editor!

Если возникнет проблема, что батники не смогут запускать, то возможно, что дело в том, где они находятся.
Под них, по примеру других ребят, я создал папку Batchfiles и положил их все туда
+ пришлось отредактировать код в dayztools.c в распакованных scripts (scripts\editor\plugins\dayztools.c), а именно строчку, которая в методе RunDayZBat() запускает метод RunCmd() на
C++:
Workbench.RunCmd("cmd /c \"cd /d " + path + " & call " + bat + "\"", wait);
Может и вам это поможет ;)

GitHub со списком изменений
Ребята организовали репозиторий в GitHub'e, чтобы от версии к версии можно было удобно понять, что же изменилось.
Пользуйтесь ;)

Благодарности:
  1. Крамцову за видео и идею по отделению дискового пространства под моды
  2. @-=PA=-Михаил за то, что напомнил про существование Гитхаба)
 
Последнее редактирование:

PR9INICHEK

Переводчик DZR
Ур
7
 
Щепотки оптимизации #2
Можно ещё почистить рабочий диск, чтобы всё было по феншую.
Для этого можно создать папки:
  • Папка для распакованного мода, над которым вы сейчас работаете
    • В нашем случае - FirstMod
    • К сожалению, мне не удалось разобраться, как заставить Workbench видеть мод во вложенных папках, а не только в корневой
  • Batchfiles
    • Для батников
  • Source
    • Для распакованных файлов игры, в нашем случае для папки scripts
      • UPD: 22/01/2022 Со временем понял, что в этой папке Source всегда лишь одна папка, при этом везде приходится пути по умолчанию редактировать. В общем отказался от её использования, чего и вам советую ;) Теперь scripts лежат в корне диска
  • Modding
    • My Mods
      • В ней будут хранится распакованные ваши готовые моды
    • Other Mods
      • В ней будут хранится распакованные чужие моды
  • PackedMods
    • Для запакованных модов
  • Missions
    • Для различных миссий, в которых вы будете тестировать
    • Тут же можно сразу сделать структуру
      • SP - для сингл миссий, тестов только клиентской части
      • MP - для мультиплеерных, клиент-серверных
Пример реализации:
1641154042875.png


Не забудьте изменить пути, где требуются изменения ;) :
  1. В батниках
  2. В файле, настройке Workbench, dayz.gproj ("C:\Program Files (x86)\Steam\steamapps\common\DayZ Tools\Bin\Workbench\dayz.gproj")
    1. В ScriptModulePathClass надо указать путь до скриптов
      1. В моём примере - Source/scripts/<Название модуля>
 

Вложения

  • 1640900270960.png
    1640900270960.png
    12,2 KB · Просмотры: 21
Последнее редактирование:

PR9INICHEK

Переводчик DZR
Ур
7
 
Щепотки автоматизации и оптимизации #3

Удобная визуализация исходных скриптов в Script Editor'e
InclementDab создал батник, который преобразовывает структуру скриптов, чтобы они более упорядоченно выглядели и не путали нас со своими

До изменений:
1641154702132.png


После:
1641154823542.png


Вся суть скрипта в том, что в подпапках scripts
  • 1_Core
  • 2_GameLib
  • 3_Game
  • 4_World
  • 5_Mission
  • editor\Workbench
  • editor\plugins
создаются подпапки DayZ и все папки с файлами перемещаются туда

Сам скрипт этого изменения:
FixScripts.bat:
@echo off

setlocal enableextensions enabledelayedexpansion

set PREFIX=DayZ
set ROOT_DIR=P:\scripts

set list=1_Core 2_GameLib 3_Game 4_World 5_Mission editor\Workbench editor\plugins
for %%a in (%list%) do (
    set directory=!ROOT_DIR!\%%a
    mkdir !directory!\%PREFIX%
    for /f "tokens=*" %%D in ('dir /b "!directory!"') do (
        set found=%%~D
        if "!found!"=="%PREFIX%" (
            echo Skipping: !directory!\!found!
        ) else (
            echo Processing: !directory!\!found!
            move !directory!\!found! !directory!\%PREFIX% > NUL
        )
    )
)

endlocal
Если у вас папка scripts лежит не по такому пути, что прописан в ROOT_DIR, то поменяйте на свой и только потом запускайте ;)


Тот же фокус мы можем производить и с нашими модами.
Расскажу на примере нашего первого мода, только чуть-чуть изменю названия папок, согласно официальной вики:
  • Папку WorldScripts переименовываю просто в Scripts
  • Переношу config.cpp в эту папку
  • Внутри этой папки создаю новую 4_World
  • Вношу изменение в config.cpp
    • files[] = {"FirstMod/Scripts/4_World"};
  • В папке 4_World создаю папку с название нашего мода FirstMod
  • Переношу в неё файл MyScript.c и меняю ему название на PlayerBase.c(Чтобы по названию файла быстро определять, какой класс мы модифицируем)
  • Запаковываю мод
    • 1641156472187.png
  • Радуюсь результату
    • 1641156501793.png
 
Последнее редактирование:

PR9INICHEK

Переводчик DZR
Ур
7
 
Тестирование клиент-серверных скриптов
  1. Создаём папку ClientServerMod
  2. Линкуем её, чтобы работал filepatching
  3. В ней, по сложившейся традиции, создаём папку Scripts
  4. Внутри неё папку 4_World и файл config.cpp
    1. В файл вставляем код ниже и сохраняем
    2. C++:
      class CfgPatches
      {
          class ClientServerMod_Scripts
          {
            requiredAddons[]= {};
          };
      };
      
      class CfgMods
      {
          class ClientServerMod
          {
              type = "mod";
      
              class defs
              {
                  class worldScriptModule
                  {
                      value = "";
                      files[] = {"ClientServerMod/Scripts/4_World"};
                  };
              };
          };
      };
  5. Внутри 4_World создаём папку ClientServerMod
  6. Далее создаём папки Entities (внутри ClientServerMod) -> ManBase (внутри Entities)
    1. Это делаем для того, чтобы сохранять структуру как в самой игре, так как будем модифицировать уже созданный класс
  7. В ManBase создаём файл PlayerBase.c
    1. Вставляем в него код
    2. C++:
      enum MyTestRPC
      {
          FIRST = 0
      }
      
      modded class PlayerBase
      {
          override void OnJumpStart()
           {
            super.OnJumpStart();
      
              // Передаём на сервер текстовую переменную
            Param1< string > v_Param = new Param1< string >("MyServer");
              GetGame().RPCSingleParam( this, MyTestRPC.FIRST, v_Param, true, this.GetIdentity() );
          }
      
        override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
          {
              super.OnRPC(sender, rpc_type, ctx);
          
              switch (rpc_type)
              {
              
                  case MyTestRPC.FIRST:
                      Param1<string> p = new Param1<string>("");
                      
                      // Проверяем, а можем ли мы считать данные
                      if (!ctx.Read(p))
                          return;
                  
                      if ( GetGame().IsDedicatedServer() )
                      {
                          string textFromClient = p.param1;           
                          Print( string.Format("Тип: %1. Данные: %2.", rpc_type, textFromClient) );               
                      }
                  
                  break;
              }
          }
      }
  8. Запаковываем мод, предварительно создав под него папки и структуру в них
Отлично, мод для передачи информации с клиента на сервер готов, теперь надо его проверить ;)
  1. Создаём батники для запуска сервера и подключения к нему клиента
    1. Для сервера:
      1. StartServer.bat:
        start /d "C:\Program Files (x86)\Steam\steamapps\common\DayZ" DayZDiag_x64.exe -mod=E:\PackedMods\@ClientServerMod -filePatching -server -config=E:\Missions\MP\serverDZ.cfg -profiles=E:\Missions\MP\ServerLogs
      2. Тут нужно заметить, что мы указываем серверу, откуда брать конфиг для его настройки (-config=E:\Missions\MP\serverDZ.cfg)
        1. Рекомендуется для этого через Steam скачать актуальную версию сервера игры (DayZ Server) и скопировать файл оттуда
        2. И не забыть добавить информацию для корректного запуска
          1. C++:
            BattlEye = 0;            // turn off BE since diag exe does not run with it
            verifySignatures = 0;    // if testing mods which aren't properly signed yet
            allowFilePatching = 1;  // allow clients with unpacked data to join
      3. И куда складывать логи (profiles=E:\Missions\MP\ServerLogs)
      4. Лайфхак:
        1. По умолчанию сервер, запущенный таким образом, будет искать миссию для запуска в папке с игрой, в подпапке mpmissions
        2. Чтобы от этого уйти и не засорять папку с игрой достаточно в конфиге сервера(serverDZ.cfg) в разделе, касающегося миссии, прописать до неё путь, например template = "E:\Missions\MP\dayzOffline.chernarusplus";
    2. Для клиента:
      1. StartClient.bat:
        start /d "C:\Program Files (x86)\Steam\steamapps\common\DayZ" DayZDiag_x64.exe -mod=E:\PackedMods\@ClientServerMod -window -filePatching -connect=127.0.0.1 -port=2302
  2. Стартуем сервер и даём ему немного прогрузиться, чтобы клиента не отбивало с ошибками подключения
    1. Когда проинициализировался Hive и об этом есть запись в консоли сервера, то уже спокойно можно подключаться
  3. Запускаем клиент, ждём прогрузки
  4. Нажимаем кнопку прыжка и смотрим в логах сервера запись о том, что пришла информация от клиента и что она из себя представляет
    1. В логах клиента при этом никакой информации не будет
Вот таким образом передаются данные с клиента.

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

Создание серверного мода
  1. Создаём папки ClientMod и ServerMod
  2. Линкуем с каталогом игры только папку ClientMod
  3. В них создаём по структуре выше все необходимые файлы и папки
  4. В PlayerBase.c у ClientMod убираем вызов метода OnRPC()
  5. В PlayerBase.c у ServerMod убираем вызов метода OnJumpStart()
  6. Всё запаковываем и создаём новый батник для запуска сервера с серверным модом(новый параметр для запуска -servermod):
    1. StartServerWithServerMod.bat:
      start /d "C:\Program Files (x86)\Steam\steamapps\common\DayZ" DayZDiag_x64.exe -servermod=E:\PackedMods\@ServerMod -filePatching -server -config=E:\Missions\MP\serverDZ.cfg -profiles=E:\Missions\MP\ServerLogs
  7. Стартуем сервер, ждём прогрузки миссии
  8. Стартуем клиент
  9. Нажимаем кнопку прыжка и смотрим в логах сервера запись о том, что пришла информация от клиента и что она из себя представляет
    1. В логах клиента при этом никакой информации не будет
 
Последнее редактирование:

PR9INICHEK

Переводчик DZR
Ур
7
 
Бронь 6

Создать шаблон мода

Рассказать о распаковке через Mikero, что удобно при распаковке scripts, так как у папок и файлов более читабельные имена (Заглавная буква у каждого слова)

Рассказать, про запаковку мода, поднятие сервера и клиента через один батник и команду в Script Editor'e


Где-то тут надо будет рассказать про файл mod.cpp

Рассказать про создание папок шаблонов распакованного и запакованного модов для ускорения производства
Рассказать про рекомпиляцию скриптов на клиенте и на сервере


 
Последнее редактирование:
Спасибо огромное за работу!!! :drinks:
Сделаю тут бронь 7 :) Расскажу, как использовать pboProject от Mikero. Это более надёжный и удобный способ запаковки модов, вместо Addon Builder. В народе Addon Builder называют Addon Destoryer :) Я правда ловил с ним очень нехорошие баги и перешёл на pboProject.

(beans)Кстати, небольшой варнинг\лайфхак. Никогда ни за что и ни при каких условиях не открывайте в Workbench файлы stringtable.csv. Содержимое с кириллицей будет уничтожено.
 
Сверху