Перейти к содержимому

DustBlue IPB Skin by CodeGame Networks

Создание фракций в ArmA. Часть 1. Серверная.

arma dayz fraction fractions фракции фракция клан кланы гильдии гильдия

  • Закрытая тема Тема закрыта
В теме одно сообщение

#1 NoNameUltima

NoNameUltima

    Администратор

  • Администраторы
  • 191 сообщений
  • ГородСанкт-Петербург

Отправлено 28 марта 2016 - 19:21

****************************************************************************************************************************************************************************************************
Небольшое вступление:
0.
В данном гайде, реализуем скриптами, создание фракций в Dayz Epoch, на стороне сервера.
1.
Добавление пунктов меню для игрока в миссию:
Вступить во фракцию XXX
Вступить во фракцию YYY
Выйти из фракции
Сменить фракцию
и т.п.
Будет позже.
2.
Для хранения фракций можно использовать SQL БД, как стандартные поля, используя стандартную HiveExt.dll(это может создать путаницу при подключении скриптов которые так же используют стандартные поля в БД), так и создать собственное поле в существующей таблице игроков, используя кастомную HiveExt.dll.
Я буду использовать ini.dll, - проще в реализации.
Ссылку на ini.dll я дам позже, как и API(если тема будет интересной).
*У кого есть моя сборка, или скрипт нового года, могут использовать dll из сборки, как и БД.
3.
Сразу скажу, что тут использован в скриптах не совсем правильный подход.
Если тема будет интересна, то возможно альтернативную часть, в которой покажу, как правильно реализовать систему фракций, без использования цикла while, и без setVariable\getVariable
****************************************************************************************************************************************************************************************************

Создание папок и файлов:

В папке:
...\@DayZ_Epoch_Server\addons\dayz_server\missions\ВАША_МИССИЯ\
Создадим папку:
Ultima_Custom_Scripts
В папке:
   ...\@DayZ_Epoch_Server\addons\dayz_server\missions\ВАША_МИССИЯ\Ultima_Custom_Scripts\
Создадим файлы:
*Для глобальных переменных, которые мы будем использовать в наших скриптах
Ultima_Server_Variables.sqf
Создадим папку для наших скриптов:
Ultima_Server_Fractions
В папке Ultima_Server_Fractions создадим файлы:
   *Для инициализации - подключения скриптов фракций
Ultima_Server_Fractions_Init.sqf
   *Для загрузки данных из БД, при старте сервера
Ultima_Server_Fractions_Load_BD.sqf
   *Для установки фракции игроку зашедшему на сервер
Ultima_Server_Fractions_Setup.sqf
   *Для обновления фракции игрокам - вышел из фракции, или сменил фракцию, или вступил во фракцию
Ultima_Server_Fractions_Update.sqf

Разбираем файлы:
Файл Ultima_Server_Variables.sqf:
Добавим в него следующий код:
// Путь к нашим скриптам
Ultima_Server_String_Scripts_Path = "\z\addons\dayz_server\missions\DayZ_Epoch_11.Chernarus\Ultima_Custom_Scripts\";
// Путь к папке с ini файлами (БД)
Ultima_Server_String_INI_DLL_Name_Path = "C:\Steam\SteamApps\common\arma 2 operation arrowhead\ini\Chernarus\#1Ultima\";
// Имя файла DLL который мы будем использовать
Ultima_Server_String_INI_DLL_Name_Name = "ultima_ini";

Файл Ultima_Server_Fractions_Init.sqf:
Добавим в него следующий код:
// Создадим серверный массив который будет содержать данные о принадлежности игроков к фракциям. Записи типа - ["UID", "Название фракции"]
Ultima_Server_Array_Fractions = [];
// Загрузим данные из БД в ранее созданный серверный массив - Ultima_Server_Array_Fractions
[] call compile preprocessFileLineNumbers (Ultima_Server_String_Scripts_Path + "Ultima_Server_Fractions\Ultima_Server_Fractions_Load_BD.sqf");
// Скомпилируем процедуру, которая будет срабатывать при входе игрока на сервер, для установки фракции данному игроку
Ultima_Server_Procedure_Fractions_Setup = compile preprocessFileLineNumbers (Ultima_Server_String_Scripts_Path + "Ultima_Server_Fractions\Ultima_Server_Fractions_Setup.sqf");
// Запустим скрипт, который будет обновлять данные в БД, и массиве Ultima_Server_Array_Fractions, если игрок вышел из фракции, сменил фракцию, или вступил во фракцию
[] execVM (Ultima_Server_String_Scripts_Path + "\Ultima_Server_Fractions\Ultima_Server_Fractions_Update.sqf");

Файл Ultima_Server_Fractions_Load_BD.sqf:
Добавим в него следующий код:
Private ["_uid_count", "_i", "_tmp"];
//	Инициализируем DLL, и подключаемся к файлу BD.ini
Ultima_Server_String_INI_DLL_Name callExtension format["0|%1BD.ini|1", Ultima_Server_String_INI_DLL_Name_Path];
//	Получаем кол-во записей в ini файле, в секции fractions
_uid_count	=	parseNumber(Ultima_Server_String_INI_DLL_Name callExtension "2|fractions");
//	Цикл от 0 до кол-ва записей, в секции fractions
for "_i" from 0 to _uid_count do
	{
		//	Получаем ключ ini - UID
		_tmp	=	Ultima_Server_String_INI_DLL_Name callExtension format["4|fractions|%1", _i];
		//	Получаем по ключу, массив "['UID', 'Фракция']"
		_tmp	=	Ultima_Server_String_INI_DLL_Name callExtension format["10|fractions|%1", _tmp];
		//	Переделываем строку в массив ["UID", "Фракция"]
		_tmp	=	call compile _tmp;
		//	Добавляем массив в массив Ultima_Server_Array_Fractions
		Ultima_Server_Array_Fractions set [count Ultima_Server_Array_Fractions, _tmp];
	};

Файл Ultima_Server_Fractions_Setup.sqf:
Добавим в него следующий код:
Private ["_uid", "_player", "_find_player", "_uid_and_fraction"];
//	Будем передавать в данный скрипт ссылку на зашедшего игрока
_player			=	(_this select 0);
//	Получаем UID игрока
_uid			=	getPlayerUID _player;
//	Вспомогательная переменная, для определения нового игрока(если игрока не было в БД)
_find_player	=	false;
//	В цикле ищем игрока в серверном массиве фраций - Ultima_Server_Array_Fractions
{
	//	Если нашли игрока - выходим из цикла выполнив код ниже
	if ( _uid == (_x select 0) ) exitWith
		{
			//	Устанавливаем вспомогательной переменной значение true - игрок найден
			_find_player	=	true;
			//	Повесим на игрока переменную содержащую его фракцию
			_player setVariable ["Ultima_Fraction", (_x select 1), true];
		};
} forEach Ultima_Server_Array_Fractions;
//	Если не нашли игрока - игрок новый и его еще нет в БД фракций
if !(_find_player) then
	{
		//	Повесим на игрока переменную фракций, содержащую NO - игрок не состоит во фракции
		_player setVariable ["Ultima_Fraction", "NO", true];
		//	Подготовим массив с его данными для добавления в БД - ["UID", "Фракция"]
		_uid_and_fraction	=	[_uid, "NO"];
		//	Запишем в INI файл (в БД), данные об этом игроке
		Ultima_Server_String_INI_DLL_Name callExtension format["9|fractions|%1|%2", _uid, _uid_and_fraction];
		//	т.к. ранее его не было в серверном массиве фракций(не было в БД) - добавим его туда
		Ultima_Server_Array_Fractions set [(count Ultima_Server_Array_Fractions), _uid_and_fraction];
	};

Файл Ultima_Server_Fractions_Update.sqf
Добавим в него следующий код:
Private ["_i", "_uid", "_fraction", "_array_fraction", "_new_fraction"];
//	Каждые 10 секунд будем на сервере крутить цикл, для обновления данных о фракции игроков.
while {true} do
	{
		//	Цикл по игрокам на сервере
		{
			//	Если это игрок, а не бот, или НПЦ
			if (isPlayer) then
				{
					//	Получаем UID игрока
					_uid		=	getPlayerUID _x;
					//	Получаем фракцию игрока
					_fraction	=	_x getVariable ["Ultima_Fraction", "NO"];
					//	Цикл по серверному массиву фракций
					for "_i" from 0 to ((count Ultima_Server_Array_Fractions) - 1) do
						{
							//	Если нашли игрока в серверном массиве фракций по его UID'у - выходим из цикла, выполнив код ниже
							if ( ((Ultima_Server_Array_Fractions select _i) select 0) == _uid ) exitWith
								{
									//	Получаем фракцию игрока которая была записана в массиве фракций
									_array_fraction	=	((Ultima_Server_Array_Fractions select _i) select 1);
									//	Если записанная в массиве фракция не совпадает с текущей фракцией игрока(игрок сменил фракцию, или вступил во фракцию, или вышел из фракции)
									( _array_fraction != _fraction ) then
										{
											//	Создадим массив для обновления записи в БД, и серверном массиве фракций
											_new_fraction	=	[_uid, _fraction];
											//	Обновим данные в БД, о текущей фракции игрока
											Ultima_Server_String_INI_DLL_Name callExtension format["9|fractions|%1|%2", _uid, _new_fraction];
											//	Обновим данные в серверном массиве фракций
											Ultima_Server_Array_Fractions set [_i, _new_fraction];
										};
								};
						};
				};
		} forEach playableUnits;
		//	Пауза 10 секунд
		uiSleep 10;
	};

Подключение данных скриптов на сервере:

В папке:
...\@DayZ_Epoch_Server\addons\dayz_server\init\
Откроем файл:
server_functions.sqf
В верх данного файла добавим:
// Инициализация глобальных переменных для наших скриптов
[] call compile preprocessFileLineNumbers "\z\addons\dayz_server\missions\ВАША_МИССИЯ\Ultima_Custom_Scripts\Ultima_Variables.sqf";
// Подключение скриптов фракций:
[] call compile preprocessFileLineNumbers (Ultima_Server_String_Scripts_Path + "\Ultima_Server_Fractions\Ultima_Server_Fractions_Init.sqf");
В папке:
   ...\@DayZ_Epoch_Server\addons\dayz_server\compile\
Откроем файл:
server_playerSetup.sqf
После строки:
_playerObj setVariable ["lastTime", time];
Добавим:
// Установка переменной фракции для зашедшего игрока
[_playerObj] call Ultima_Server_Procedure_Fractions_Setup;

© rnrportal.ru

#2 NoNameUltima

NoNameUltima

    Администратор

  • Администраторы
  • 191 сообщений
  • ГородСанкт-Петербург

Отправлено 28 марта 2016 - 19:24

Если у Вас возникают вопросы по данной статье, создайте тему, в разделе "Вопросы по серверам" по данной ссылке:
http://rnrportal.ru/...сы-по-серверам/
И укажите ссылку на данную тему.





Темы с аналогичным тегами arma, dayz, fraction, fractions, фракции, фракция, клан, кланы, гильдии, гильдия

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных