123new

Создаем свой серверный мод. [DayZ 1.4 to Discontined]

34 сообщения в этой теме

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

 

Нам понадобятся:

1. Сервер игры актуальной версии, не ниже патча 1.04. Как установить можно узнать тут:

До версии 1.04 параметра servermod у сервера игры не существовало!!!

2. Программа 'PBO manager' с состава инструментария армы из сети: https://www.armaholic.com/page.php?id=16369

Зеркало: https://yadi.sk/d/_gmzoNSDpNJTt

Еще зеркало:

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.


4. Notepad++ https://notepad-plus-plus.org/download

P.S. Вместо 'PBO manager' можно использовать DayZ Tools, но как им пользоваться разбираемся сами ;)

 

И так, приступим:

1. Предположим, что у нас имеется свой некий набор скриптов, который необходимо добавить серверу, но не на уровне миссии сервера, а на более ранних уровнях его загрузки. Например, добавить свой killfeed, модифицировать или изменить какой-либо из родных скриптов сервера игры, либо вовсе модификации, подключенной у вас.
Для примера в этой теме и данного гайда я взял вот этот набор скриптов, собранный непосредственно для данной темы за 5 минут, и не изменяющий в сервере ровным счетом ничего. Он может послужить базой для создания своих модов, функций, переменных или классов. Данный гайд будем описывать, исходя из этого архива.
Архив:

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

2. Создаем папку с нашим модом. Для примера, это будет папка '@My_Server_Mod'. В созданной нами папке создаем папку 'Addons', а в ней папку 'My_Server_Mod'.
3. Помещаем содержимое распакованного архива в папку 'My_Server_Mod'. Должно получиться так:

Безымянный.png

4. В папке 'My_Server_Mod' создаем файлик 'config.cpp' и заполняем его следующими данными (советую использовать Notepad++ для этого):

class CfgPatches	// требуется обязательно
{
	class My_Server_Mod	// требуется обязательно, совпадает с именем мода
	{
		units[]={}; 				// may be not worked
		weapons[]={}; 				// may be not worked
		requiredVersion=0.1; 		// may be not worked
		requiredAddons[]={};
		/*
			requiredAddons[]=
			{
				"DZ_Data",		// Перечисляем требуемые и используемые модом аддоны (pbo-файлы игры и модов по их внутренним скриптовым именам)
			};
		*/
	};
};
class CfgMods // // требуется обязательно, совпадает с именем мода
{
	// https://community.bistudio.com/wiki/DayZ:Modding_Structure#Mod_presentation
	class My_Server_Mod
	{
	    dir = "My_Server_Mod";							// Имя папки мода, совпадает с именем мода
	    picture = ""; 									// Картинка в описании мода
	    action = "";  									// Ссылка, например вот так: action = "https://dayz.com/";	
	    hideName = 1;									// Не уверен, что этот параметр работает
	    hidePicture = 1;								// Не уверен, что этот параметр работает
	    name = "My_Server_Mod";  						// Имя мода (а также его внутреннее скриптовое имя)
		logoSmall = "Mods/TestMod/modlogosmall.tga";	// значок рядом с именем мода, если описание не развернуто
		logo = "Mods/TestMod/modlogo.tga";				// логотип под меню игры
		logoOver = "Mods/TestMod/modlogohover.tga";		// при наведении курсора мыши на логотип
		tooltip = "tooltip";							// подсказка при наведении курсора мыши
		overview = "My Server Mod"; 					// Описание
	    credits = "123new";								// credits
	    author = "123new";								// author
	    authorID = "0";  								// author steam ID 
	    version = "1.0";  								// version
	    extra = 0;										// Не уверен, что этот параметр работает
		
	    type = "mod"; 									// требуется обязательно, остается неизменным
		// inputs = "mods\testmod\inputs\my_new_inputs.xml"; 	     // необязательно, при использовании пользовательских inputs
		dependencies[]={"Core","GameLib","Game","World","Mission"};  							// необязательно, если необходимо установить зависимость класса

	    class defs
	    {			
			class engineScriptModule
			{
				value=""; // если значение пустое, используется функция ввода по умолчанию
				files[]={"My_Server_Mod/scripts/1_Core"}; // вы можете добавить любое количество файлов или каталогов, и они будут скомпилированы вместе с оригинальными скриптами игрового модуля
			};
			class gameLibScriptModule
			{
				value="";
				files[]={"My_Server_Mod/scripts/2_GameLib"};
			};
			class gameScriptModule
			{
				//value="CreateGameMod"; // когда значение заполнено, имя функции ввода модуля скрипта по умолчанию перезаписывается им
				value = "";
				files[]={"My_Server_Mod/scripts/3_Game"};
			};
			class worldScriptModule
			{
				value="";
				files[]={"My_Server_Mod/scripts/4_World"};
			};
			class missionScriptModule
			{
				value="";
				files[]={"My_Server_Mod/scripts/5_Mission"};
			};
        };
		// Если какой-то из разделов скриптинга вам не нужен и вы не сибираетесь его паковать, сотрите необходимый блок с ним выше и в массиве dependencies 
    };
};

Пояснения в файле оставил. Файл готовый:

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Как видите, в 'deffs' названия классов и путей соответствуют родным из 'scripts.pbo', но с допиской имени мода. Имя мода в данном случае и есть идентификатор для обращения к своему моду извне. А в 'dependencies' перечисляются используемые классы оригинальных скриптов без дописки номера секции. Количество используемых 'dependencies' и блоков 'deffs' должно быть идентично.

Пояснения есть также и в официальной документации от разработчика: https://community.bistudio.com/wiki/DayZ:Modding_Structure#Mod_presentation

5. Запаковываем нашу папку 'My_Server_Mod' в pbo-файл 'My_Server_Mod.pbo' через 'PBO manager', как на скриншоте ниже:

Безымянный.pngБезымянный.png

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

6. Добавляем в параметры запуска сервера параметр:

"[email protected]_Server_Mod;" -FilePatching

7. Радуемся, наш серверный мод готов. Пример готового серверного мода:

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

P.S. Создавать bikey файл для мода и bisign подписи для него не требуется, иначе это может привести к неработоспособности серверной модификации (возможно, недоработка сервера игры разработчиком)

 

Отмечу сразу, что данный способ подходит для модификации и переписывания оригинальных классов скриптов сервера от разработчиков и модификации чужих модов с помощью моддинга, применяется исключительно на стороне сервера игры и клиент игры не затрагивает. Распространять такой мод игрокам НЕ НУЖНО!
Изменение оригинальных скриптов, для которых не предусмотрена операция 'modded class' в движке игры, а также классов и функций, которые защищены языком и движком игры от такого рода действий через серверные моды не получится. Если вы столкнулись с этим, вам проще распаковать scripts.pbo и поместить папку scripts в корень сервера игры, добавить в параметры запуска сервера параметр -FilePatching и изменять напрямую в папке необходимые вам файлы. (правда из-за ошибки разработчиков на патче 1.04 данный метод не работает корректно)

 

P.P.S. Процедура создания своего собственного клиент-серверного мода на основе скриптов работает таким же образом. В случае создания такого мода, файл 'config.cpp' может быть для стандартного мода более разнообразным, а также после требуется обязательная подпись такого мода в bisign и создание bikey файлов. Более подробно это освещать требуется отдельно!

Изменено пользователем 123new (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Забронировать это рекламное место


123new Спасибо тебе большое за подробный гайд. Только вот с папкой scripts у меня не получилось не чего. Хотел изменить стамину, я как понял сейчас это не работает? или я что-то упустил...?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

SergeyMaltsev1992 все работает

теперь  в constants.c

 

class GameConstants
{

 

и вперед

 

modded class GameConstants
{

 

    const int     STAMINA_DRAIN_STANDING_SPRINT_PER_SEC = 4; //in units (how much sprint depletes stamina)
    const int     STAMINA_DRAIN_CROUCHED_SPRINT_PER_SEC = 1; //in units (how much sprint in crouch depletes stamina)
    const int     STAMINA_DRAIN_PRONE_SPRINT_PER_SEC = 3; //in units (how much sprint in prone depletes stamina)
    const int    STAMINA_DRAIN_SWIM_FAST_PER_SEC = 5; //in units (how much fast swimming depletes stamina)
    const int    STAMINA_DRAIN_LADDER_FAST_PER_SEC = 8; //in units (how much fast ladder climb depletes stamina)

}

 

меняем на что надо и это отмодидся

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
11 час назад, SergeyMaltsev1992 сказал:

123new Спасибо тебе большое за подробный гайд. Только вот с папкой scripts у меня не получилось не чего. Хотел изменить стамину, я как понял сейчас это не работает? или я что-то упустил...?

не работает само изменение scripts сервера в буквальном виде при включенной проверке сигнатур. По крайней мере до вчерашнего фикса стабилки точно не работало, т.к. при заходе на сервак мы ловим ошибку вида client contains pbo is not in server data (чет такое, на память пишу). Если проверку сигнатур вырубить то пустит, но и дырой это тоже будет являться))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

BorizzK Да проверял,результат-если сервак почти забит и
стамина увеличена на 25% (расход,приход и прочее),имееем;
Для игрока-стамина движеться рывками при полном израсходовании микролаг, для наблюдателя-игрок ТПэшит.

 

(отя я не пробовал ещё,работают ли "изменения для разработчиков",там вроде есть "чит стамина")

Изменено пользователем paranoyk (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

paranoyk Увеличь число игроков обрабатываемых сервером 20 до 35 например simulatedPlayersBatch = 32;    при фул онлайне, микролаги пропали

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

griha41 ахаха) А ты самый умный)))))))

 

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

Нет такой возможности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@griha41его (мод) все равно нужно будет подключать и положить в серверную часть, если в конфиге подключено verifySignatures = 2 (3);
Можно конечно отключить verifySignatures поставить на 0, но функционал мода не будет работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, griha41 сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Чтож, Арма 3 в этом плане мощнее. Можно было на с**ть и всёравно моде хоть отдельный город выстроить.

 

 

Спасибо всем за ответы и разъяснения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Почему сервер не стартует ? делал все как автор описал

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: NoNameUltima
      Автор: NoNameUltima
      v. 0.1.7
      Стоимость: 2500
       
      Мод предоставляется в двух частях:
      Клиентский мод(для игроков). Ключи и подписи, присутствуют(При необходимости изменения содержимого - ключ и подписи можно переделать). Серверный мод(только для сервера). *Моды связанны между собой.
       
      Что присутствует:
       
      Дебаг монитор *Есть настройка в конфигурации - отображать, или нет монитор при заходе на сервер.
      **Кнопка вкл\выкл настраивается в конфигурации
      За убийство зомби, повышается счетчик убийств зомби. За убийство зомби, начисляются наличные(кол-во настраивается в конфигурации). При смерти игрока, наличные остаются в трупе.(Забрать можно). За убийство игрока, повышается счетчик убийств людей. Метки на карте с указанием торговых зон. Стартовое приветствие игроков. ПНВ работающий от батарейки. Панель игрока Зараженные зоны. Стартовый инвентарь для игроков(по UID'ам, и общий). Стартовые позиции для игроков(по UID'ам, и случайные для тех кого нет в списке). Статичные постройки на карте(загрузка из класса). Создание коробок с содержимым. Команды чата:  
      Доп. статичные функции:  
      skype: hf-trade
       
      P.S. Обновления платные(для тех кто приобретал мод ранее: 25% от общей стоимости, до актуальной версии).
      P.S.P.S. Весь функционал является БЕТА-ВЕРСИЕЙ!
    • Автор: 123new
      Нам понадобится:
      1. Сервер DayZ Standalone (см. тему вот эту)
      2. Notepad++: бесплатно на оф. сайте
      3. Немного времени и настойчивости (обычно бывает в комплекте и так)
       
      И так, начинаем:
      1. Открываем блокнотом mpmissions\dayzOffline.chernarusplus\init.c
      P.S. Имя папки dayzOffline.chernarusplus у вас может отличаться, будьте внимательны
      2. В начале файла добавляем:
      static int time_repeat_info_players = 10; //in seconds static string file_name_info_players = "$profile:PlayersLogFile.txt"; static void WriteFile(string file_name, string text) { private FileHandle fhandle; if ( !FileExist(file_name) ) { fhandle = OpenFile(file_name, FileMode.WRITE); } else { fhandle = OpenFile(file_name, FileMode.APPEND); } if ( fhandle == 0 ) { Print("[#Запись_в_файл]: Не удалось открыть файл для записи: " + file_name); Print("[#Запись_в_файл]: [Запись]: " + text); return; } FPrintln(fhandle, text); CloseFile(fhandle); } static void WritePlayersInfo() { array<Man> players = new array<Man>; Man player; Man player_test; GetGame().GetPlayers( players ); if (players.Count() > 0) { if ( FileExist(file_name_info_players) ) { DeleteFile(file_name_info_players); } for ( int i = 0; i < players.Count(); ++i ) { player_test = players.Get(i); if( player_test ) { PlayerIdentity p_identity = player_test.GetIdentity(); private string coord_pl = player_test.GetPosition().ToString(); private string Name_P = p_identity.GetName(); private string UID_P = p_identity.GetPlainId(); WriteFile(file_name_info_players, "User name: " + Name_P + " UID: " + UID_P + " Coords: " + coord_pl); } } } else { if ( FileExist(file_name_info_players) ) { DeleteFile(file_name_info_players); } } } Где 'PlayersLogFile.txt' меняем на нужное вам имя файла, а в 'time_repeat_info_players' настраиваем время повтора проверки списка игроков для перезаписи файла
      3. Находим в файле блок 'void main()' и в его конце перед закрывающей '}', поумолчанию это строка
      weather.SetWindFunctionParams(0.1, 0.3, 50); добавляем ниже строку:
      GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(WritePlayersInfo, (time_repeat_info_players * 1000), true); 4. Готово, если не допустили ошибок, при наличии хотя бы 1 игрока на сервере ваш файл с данными по игрокам будет присутствовать и заполняться информацией, а в случае их отсутствия удаляться.
    • Автор: BorizzK
      Обсуждаем тут
       
      Список того, на что наткнулся в процессе переноса своих серверных файлов на экспу с целью подготовиться заранее
       
      1. Апкастинг - больше не требуется
      static void MoveTo(PlayerBase Player, vector finishPos) { EntityAI PlayerEntity = EntityAI.Cast(Player); Движок сервера теперь ругается
      No need to use 'Cast' for up-casting
       
      Теперь он сам апкастит
      Молодцы, чо
       
      2. Переделана система управления питанием персонажа
      было
      player.GetStatStomachVolume().Set(0); теперь введен новый класс PlayerStomach (файл PlayerStomach.c)
      и в классе OlayerBase обьявлена ссылка на него
      ref PlayerStomach m_PlayerStomach; ну и как бы наполняем его ВООБЩЕ на стороне сервера теперь так

      в классе PlayerBase
      m_PlayerStomach.m_StomachVolume = значение; за его пределами применительно к игроку
      player.m_PlayerStomach.m_StomachVolume = значение; более подробно с PlayerStomach не разбирался пока
       
      Навскидку - формируется массив классов еды и эта еда инсертится по принципу как агент-заболевание персонажу
      Бегло глянул - много тонкостей - нужно разбираться
       
    • Автор: NoNameUltima
      Еще одна тема, по которой возникают вопросы - как залить свой мод в steam
      Видео пару минут, надеюсь все понятно
       
    • Автор: 123new
      Собственно, в шапке темы написано все. Давайте в этой теме обсуждать вопрос создания 'нормальной' (привычной для всех, в том числе и для редактирования) базы данных персонажей сервера. Возможно, даже с возможностью мультисерверной работы (что крайне лишним не было бы).