Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
BorizzK

DAYZ enScript (вопросы, ответы)

Рекомендованные сообщения

Посмотрел функцию InZone(), пока жду ответа на предыдущий пост...

Общую логику, вроде бы понял.

Функция объявлена как булиева - то есть вернёт логический результат "ДА / НЕТ"?

Далее, переопределяем в переменной vector player_position значение на текущую позицию проверяемого игрока с помощью функции .GetPosition(). Я так понимаю, что она возвращает актуальные координаты объекта?

if( (vector.Distance(player_position, zone.pos)) < zone.radius )

Тут, насколько я понимаю, сравнение актуальных координат игрока с координатами центра зоны по радиусу? Я так понимаю, что соответвующая ордината игрока, сравнивается с соответствующей ординатой центра зоны, и если разница хотя бы по одной из ординат менее значения, заданного в переменной zone.radius, то переход по true, если нет - по false. Так?

Далее опять новые для меня функции, но, вроде понятно - switch, это "включить".

Не могу сформулировать... В общем, определяется в какой именно (по типу) зоне, находится игрок. Ну или не находится...

Нужны разъяснения по функциям - чего и как они делают?..

 

Далее, как я понимаю, внутри всё той же InZone() идёт определение переменных описывающих урон, для каждого типа зон.

Ну и далее, опять же в теле InZone(), проверка экипировки на наличие и целостность, с последующим нанесением урона, по результатам проверки.

 

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

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


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

VIRrusR 

4 минуты назад, VIRrusR сказал:

если разница хотя бы по одной из ординат менее значения,

Геометрия 4 класс.

Гугл: Формула расстояния между двумя точками.

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


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

NoNameUltima , ну и какая разница, по какой там конкретно формуле производится попарное сравнение соответсвтующих ординат двух точек в пространстве?! Главное, что оно производится и так или иначе, на выходе мы получаем путь между точками. 

...А! Пардон! Пока печатал, сам понял, что разность ординат (смещение по осям)и путь - не одно и тоже! Спасибо!

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

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


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

VIRrusR Начинаю комментировать твое понимание

ref array<Man> players = new array<Man>;

Да - обьявлено внутри функции - значит локальный

Доступ только внутри функции

 

PlayerBase player = PlayerBase.Cast(players);

массив players - класс MAN - для манипуляций с игроком нам надо его отдаункастить в класс PlayerBase

в итоге у нас в переменной player класса PlayerBase указатель на игрока с которым можно делать все что нужно

players - это очередной элемент массива players - в скобках это номер элемента в  переменной i

i инкрементируется в цикле (сам же выше все расписал)

 

if (player.GetIdentity())

проверям - связан ли player - обьект игрока - с реальным игроком (клиентом)

а то вдруг клиент отвалился и смысла манипулировать его персом нет - он пропадет в ближайшие секунды

 

ну и если все ок

 

в цикле прогоняемся по всем "зонам" из массива ga_zones и смотрим в какой из них игрок

 

 

Ну и , соответственно, выходы из циклов:

--если игрок не в зоне, то конец проверки, переход на проверку следующего игрока.

--если игрок в зоне, то к нему будут применены действия по фунции InZone(), конец проверки и переход на проверку следующего игрока.

Всё верно понимаю?

 

Да - верно понимаешь

 

 

 

 

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


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

VIRrusR 

 

в цикле том мы в InZone передали игрока и очередную зону из массива

ga_zones[j]

 

InZone(player, ga_zones[j])

 

bool InZone(PlayerBase player, ref Zone zone)

 

в переменной zone будет указатель на очередной экземпляр Zone

 

player_position

в эту переменную мы загнали положение игрока

vector player_position = player.GetPosition();

 

ну и проверяем

 

if( (vector.Distance(player_position, zone.pos)) < zone.radius )

 

vector.Distance(player_position, zone.pos) вернет нам расстояние в метрах между

координатами player_position и координатой zone.pos

ну и если оно меньше zone.radius

то игрок в зоне и функция

1 Обработает игрока - нанесет ущерб - навесит симптомы и тп - что захотим

и вернет true

 

 

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


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

в цикле том мы в InZone передали игрока и очередную зону из массива

ga_zones[j]

А! Вот оно как... Я упустил, что не только игрока, но и зону! То есть в InZone() уже ничего не присваивается, а наоборот, проверяется присвоенное. То есть, в нашем примере, если выход из цикла проверки на нахождение в зоне прошёл по j=2, то это означает, что в InZone() мы передали "Игрок Вася в зоне GasZone".

А что тогда в этом куске:

if( (vector.Distance(player_position, zone.pos)) < zone.radius )
		{
			switch(zone.type)
			{
				case 1: //SAFE
				{
					SafeZone(player, zone);
				break;
				}
				case 2: //GAS
				{
					GasZone(player, zone);
				break;
				}
				case 3: //RAD
				{
					RadZone(player, zone);
				break;
				}
				case 4: //BIO
				{
					BioZone(player, zone);
				break;
				}
			}
			return true;
		}
		else
		{
			return false;
		}
	}	

???

 

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

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


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

VIRrusR 

if( (vector.Distance(player_position, zone.pos)) < zone.radius ) //расстояние между васиным положением и центром зоны < радиуса зоны = значит вася в зоне
		{
			switch(zone.type) //взяли из оны ее тип (когда зоны генерили мыж записали ее тип zone.type) ну а дальше выбор через switch/case
			{
				case 1: //SAFE //если  zone.type = 1
				{
					SafeZone(player, zone);
				break;
				}
				case 2: //GAS //если  zone.type = 2
				{
					GasZone(player, zone);
				break;
				}
				case 3: //RAD //если  zone.type = 3
				{
					RadZone(player, zone);
				break;
				}
				case 4: //BIO //если  zone.type = 4
				{
					BioZone(player, zone); //вызываем соответствующую функцию //такие зоны как BIO (или 4 тип) у нас обрабатывает функция BioZone - ну и передали в нее игрока и зону
				break;
				}
			}
			//ну и в конце - раз уж игрок в зоне вернули true //и функция InZone прервет итерацию проверки зон для этого игрока
			return true;
		}
		else
		{
			return false; //игрок ни в этой зоне не замечен - вернули false и InZone продолжит цикл перейдя к следующему элементу ga_zone
		}
	}	

внутри каменты

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

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


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

Воот

В итоге я пришел к тому, что и в классе Zone ( тот класс в котором хранятся параметры для каждой зоны) нам потребуется конструктор

ибо мы вводим 2 массива

1 Типа map Содержит игроков которые вошли в зону (при выходе они из него удаляются)

2 Типа TString будет содержать комплект экипировки для проверки (в будущем)

 

поскольку обьявив эти мсассивы в классе нам надо их еще и проинициализирвоать делать мы это будем как раз в конструкторе

 

по TStringArray у меня появились сомнения - как-то вот в лоб не получается объявить массив для каждого экземпляра

всегда получается один и тот же и данные для всех зон одинаковые - что не есть гуд

 

сообщения (3 разных) при входе/нахождении в зоне и выходе из нее (для каждой зоны свое - какое присвоишь) тут мы уже сделали

 

а еще нам надо сообщения при приблежении к зоне (а не при удалении от нее) - но это мы сделае потом

пока сделано тупо - вектор направления движения не проверяется - только расстояние от края зоны

 

собсно весь код прилагаю (ущерб отключен)

 

//VERSION: 20.04.2019.1947

enum ZoneType  //Это для удобства - перечисление //Zones types 
{
	SAFE = 1, 	//1
	GAS,  		//2
	RAD,  		//3
	BIO   		//4
}

class Zone //Этот Класс используется для хранения параметров зон - для каждой зоны создается свой экземпляр класса //Zone container. Instance for each zone - see AddZone functions ( ref Zone zone	= new ref Zone; )
{
	string						name; //имя зоны
	int 						id; //номер зоны
	vector 						pos; //центр зоны
	float 						radius; //радиус зоны
	float 						warndistance; //расстояние приближения к зоне
	int 						type; //тип зоны (см ZoneType)
	string 						warnmessage; //сообщение при приблежении к зоне (по warndistance)
	string 						entermessage; //сообщение при входе в зону
	string 						message; //сообщение при нахождении в зоне
	bool						repeatmsg; //Повторение сообщений в зоне //in pogress
	int							repeatstep; //Шаг повтрения сообщений в зоне //in pogress // если repeatmsg = true и repeatstep = 0 - поторения не будет, repeatstep = 1 - повторение каждую итерацию и тп
	string 						exitmessage; //сообщение выходе из зоны
	float 						player_Damage_Coef; //коэффициент повреждения для игрока
	float 						player_Health_Threshold_Symptoms; //порог здоровья после которого применяются симптомы
	int							player_Symptom; //симпотом для данной зоны
	ref TStringArray			complect; //комплект вещей для проверки //in pogress //массив требует инициализации - создании его экземпляра (complect = new TStringArray;) для каждого экземпляра - иначе он бощий
	float 						item_Damage_Coef; //коэффициент повреждения для вещей игрока
	float 						item_Health_Threshold; //порог здоровья для вещи (еще не придумал для чего)
	ref map<PlayerBase, int> 	playersInZone; //массив - игроки находящиеся в данной зоне //1 - player, 2 - player id  //массив требует инициализации - создании его экземпляра (playersInZone	=	new map<PlayerBase, int>;) для каждого экземпляра - иначе он бощий
	
	void Zone() //Это конструктор. При создании нового экземляра "зоны" он будет выполняться. И в нем будет инициализироваться создание 2х массивов для этого экземпляра
	{
		Print("::: SERVER: [Zone]: Init.");
		// Массив типа map: он поддерживает методы Insert, Romove и Contains. Обычный массив методы Remove и Contsins не поддерживает.
		// Игроки вошедшие в зону будут помещаться в этот массив в конкретном экземпляре "зоны".
		// playersInZone.Instert(player, player.GetIdentity().GetPlayerId());
		// и удаляться из него при выходе из зоны
		// playersInZone.Remove(player);
		// Это нужно для проверки (что бы, например, не отправлять повторно сообщение о входе в зону)
		// playersInZone.Contains(player); - вернет true если игрок в массиве (те в зоне) или false если его там нет (не в зоне)
		playersInZone	=	new map<PlayerBase, int>; //Создание экземпляра в конкретном экземпляре класса
		Print("::: SERVER: [Zone]: playersInZone array init: " + playersInZone.ToString());
		// Массив типа TString: он поддерживает методы Insert, Romove и Contains. Обычный массив методы Remove и Contsins не поддерживает.
		complect		=	new TStringArray; //Создание экземпляра в конкретном экземпляре класса
		Print("::: SERVER: [Zone]: complect array init: " + complect);
	}
	
	void ~Zone()
	{
		
	}
}
ref array<ref Zone> ga_zones = new array<ref Zone>; //Массив класса Zone. В него помещаются ссылки на экземпляры класса откуда в последствии читаются параметры //zones array

ref ZonesClass Zones = new ZonesClass;
class ZonesClass
{
	//Default params:
	bool 		my_Zones_Debug 			= 	true;
	bool		my_SafeZone_Debug		=	true;
	bool		my_GasZone_Debug		=	true;
	bool		my_RadZone_Debug		=	true;
	bool		my_BioZone_Debug		=	true;
	bool 		my_Zone_Debug			=	true;
	int 		zone_Check_Timer		=	12000;

	void ZonesClass()
	{
		Print("::: SERVER: [ZonesClass]: Init.");
		ZonesInit();
	}
	
	void ~ZonesClass()
	{
		Print("::: SERVER: [ZonesClass]: UnInit.");
	}
	
	void ZonesInit()
	{
		Print("::: SERVER: [ZonesClass.c DEBUG]: ZonesInit(): BEGIN.");
		
		//Default params:
		string 			zone_Name;
		int 			zone_Id 							= 	0;
		vector 			zone_Pos							=	vector.Zero;
		float 			zone_Radius							=	0.0;
		int 			zone_Type 	 						= 	ZoneType.BIO; //4
		string			zone_WarnMessage					= 	"Вы приближаетесь к опасной зоне!";
		float			zone_WarnDistance					=	50.0;
		string			zone_enterMessage					= 	"Вы вошли в опасную зону!";
		string			zone_Message						= 	"Вы в опасной зоне!";
		bool			zone_RepeatMsg						=	true;
		int				zone_RepeatStep						=	1;
		string			zone_exitMessage					= 	"Вы покинули опасную зону!";
		float			player_Damage_Coef					=	0;
		float			player_Health_Threshold_Symptoms	=	50.0;
		int				player_Symptom						=	SymptomIDs.SYMPTOM_COUGH; // Class SymptomIDs - variable SYMPTOM_COUGH (кашель) // = 1
		TStringArray	itemsComplect 						=	{"GasMask"};
		float			item_Damage_Coef					=	0.2;					
		float			item_Health_Threshold				=	40.0;
		
		zone_Name		= "Pavlovo";
		zone_Id 		= 1;
		zone_Pos 		= "2125 0 3400";
		zone_Radius		= 200.0;
		/*
		Params:
		1  	- zone name
		2  	- zone id
		3  	- zone center position
		4  	- zone radius
		5  	- wrning distance
		6  	- zone type number (see enum ZoneType)
		7  	- warning message during the approach to the zone
		8  	- message on enter to zone
		9 	- zone message for player
		10	- zone message repeat true/false
		11	- zone message repeat steps
		12 	- leaving zone message
		13 	- damage coefficient for player
		14 	- player start symptoms threshold
		15 	- symptom for player in current zone
		16 	- items complect for check //for future
		17 	- damage coefficient for items //for future
		18 	- item health threshold for start damage player	
		*/
		AddZone(zone_Name, zone_Id, zone_Pos, zone_Radius, zone_WarnDistance, zone_Type, zone_WarnMessage, zone_enterMessage, zone_Message, zone_RepeatMsg, zone_RepeatStep, zone_exitMessage, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom, itemsComplect, item_Damage_Coef, item_Health_Threshold);
		
		zone_Name	= "Zeleno";
		zone_Id 	= 2;
		zone_Pos 	= "2530 0 5112";
		zone_Radius	= 150.0;
		AddZone(zone_Name, zone_Id, zone_Pos, zone_Radius, zone_WarnDistance, zone_Type, zone_WarnMessage, zone_enterMessage, zone_Message, zone_RepeatMsg, zone_RepeatStep, zone_exitMessage, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom, itemsComplect, item_Damage_Coef, item_Health_Threshold);
		
		zone_Name	= "Dichina";
		zone_Id 	= 3;
		zone_Pos 	= "4524 0 8290";
		zone_Radius	= 50.0;
		AddZone(zone_Name, zone_Id, zone_Pos, zone_Radius, zone_WarnDistance, zone_Type, zone_WarnMessage, zone_enterMessage, zone_Message, zone_RepeatMsg, zone_RepeatStep, zone_exitMessage, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom, itemsComplect, item_Damage_Coef, item_Health_Threshold);
		
		zone_Name	= "Myshkino";
		zone_Id 	= 4;
		zone_Pos 	= "332 0 9368";
		zone_Radius	= 100.0;
		AddZone(zone_Name, zone_Id, zone_Pos, zone_Radius, zone_WarnDistance, zone_Type, zone_WarnMessage, zone_enterMessage, zone_Message, zone_RepeatMsg, zone_RepeatStep, zone_exitMessage, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom, itemsComplect, item_Damage_Coef, item_Health_Threshold);
		
		zone_Name	= "Aero SW";
		zone_Id 	= 5;
		zone_Pos 	= "4586 0 9533";
		zone_Radius	= 220.0;
		AddZone(zone_Name, zone_Id, zone_Pos, zone_Radius, zone_WarnDistance, zone_Type, zone_WarnMessage, zone_enterMessage, zone_Message, zone_RepeatMsg, zone_RepeatStep, zone_exitMessage, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom, itemsComplect, item_Damage_Coef, item_Health_Threshold);
		
		zone_Name	= "Aero SE";
		zone_Id 	= 6;
		zone_Pos 	= "5177 0 9960";
		zone_Radius	= 350.0;
		AddZone(zone_Name, zone_Id, zone_Pos, zone_Radius, zone_WarnDistance, zone_Type, zone_WarnMessage, zone_enterMessage, zone_Message, zone_RepeatMsg, zone_RepeatStep, zone_exitMessage, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom, itemsComplect, item_Damage_Coef, item_Health_Threshold);
		
		zone_Name	= "Aero W";
		zone_Id 	= 7;
		zone_Pos 	= "4228 0 10400";
		zone_Radius	= 350.0;
		AddZone(zone_Name, zone_Id, zone_Pos, zone_Radius, zone_WarnDistance, zone_Type, zone_WarnMessage, zone_enterMessage, zone_Message, zone_RepeatMsg, zone_RepeatStep, zone_exitMessage, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom, itemsComplect, item_Damage_Coef, item_Health_Threshold);
		
		zone_Name	= "Aero E";
		zone_Id 	= 8;
		zone_Pos 	= "4785 0 10530";
		zone_Radius	= 250.0;
		AddZone(zone_Name, zone_Id, zone_Pos, zone_Radius, zone_WarnDistance, zone_Type, zone_WarnMessage, zone_enterMessage, zone_Message, zone_RepeatMsg, zone_RepeatStep, zone_exitMessage, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom, itemsComplect, item_Damage_Coef, item_Health_Threshold);
		
		zone_Name	= "Aero N";
		zone_Id 	= 9;
		zone_Pos 	= "4290 0 10956";
		zone_Radius	= 250.0;
		AddZone(zone_Name, zone_Id, zone_Pos, zone_Radius, zone_WarnDistance, zone_Type, zone_WarnMessage, zone_enterMessage, zone_Message, zone_RepeatMsg, zone_RepeatStep, zone_exitMessage, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom, itemsComplect, item_Damage_Coef, item_Health_Threshold);
		
		zone_Name	= "Tisy";
		zone_Id 	= 10;
		zone_Pos 	= "1600 0 14030";
		zone_Radius	= 600.0;
		AddZone(zone_Name, zone_Id, zone_Pos, zone_Radius, zone_WarnDistance, zone_Type, zone_WarnMessage, zone_enterMessage, zone_Message, zone_RepeatMsg, zone_RepeatStep, zone_exitMessage, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom, itemsComplect, item_Damage_Coef, item_Health_Threshold);
		
		zone_Name	= "Troitskoe";
		zone_Id 	= 11;
		zone_Pos 	= "7893 0 14689";
		zone_Radius	= 300.0;
		AddZone(zone_Name, zone_Id, zone_Pos, zone_Radius, zone_WarnDistance, zone_Type, zone_WarnMessage, zone_enterMessage, zone_Message, zone_RepeatMsg, zone_RepeatStep, zone_exitMessage, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom, itemsComplect, item_Damage_Coef, item_Health_Threshold);

		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckZones, zone_Check_Timer, true);
		
		Print("::: SERVER: [ZonesClass.c DEBUG]: ZonesInit(): END.");
	}
	
	void AddZone(string zone_Name, int zone_Id, vector zone_Pos, float zone_Radius, float zone_WarnDistance, int zone_Type, string zone_WarnMessage, string zone_enterMessage, string zone_Message, bool zone_RepeatMsg, int zone_RepeatStep, string zone_exitMessage, float player_Damage_Coef, float player_Health_Threshold_Symptoms, int player_Symptom, TStringArray itemsComplect, float item_Damage_Coef, float item_Health_Threshold)
	{
		ref Zone zone 							= new ref Zone; //создается новый экземпляр класса Zone - указатель на экземпляр - переменная zone
		
		zone.name 								= zone_Name; //имя зоны
		zone.id 								= zone_Id; //номер зоны
		zone_Pos[1]								= GetGame().SurfaceY(zone_Pos[0], zone_Pos[2]); // Поверхность
		zone.pos 								= zone_Pos; //центр зоны
		zone.radius 							= zone_Radius; //радиус зоны
		zone.warndistance						= zone_Radius + zone_WarnDistance; //расстояние приближения к зоне
		zone.type 								= zone_Type; //тип зоны (см ZoneType)
		zone.warnmessage						= zone_WarnMessage; //сообщение при приблежении к зоне
		zone.entermessage						= zone_enterMessage; //сообщение при входе в зону
		zone.message							= zone_Message; //сообщение при нахождении в зоне
		zone.repeatmsg							= zone_RepeatMsg;
		zone.repeatstep							= zone_RepeatStep;
		zone.exitmessage						= zone_exitMessage; //сообщение выходе из зоны
		zone.player_Damage_Coef 				= player_Damage_Coef; //коэффициент повреждения для игрока
		zone.player_Health_Threshold_Symptoms 	= player_Health_Threshold_Symptoms; //порог здоровья после которого применяются симптомы
		zone.player_Symptom						= player_Symptom; //симпотом для данной зоны
		zone.complect 							= itemsComplect; //комплект вещей для проверки
		zone.item_Damage_Coef 					= item_Damage_Coef; //коэффициент повреждения для вещей игрока
		zone.item_Health_Threshold 				= item_Health_Threshold; //порог здоровья для вещи (еще не придумал для чего)

		ga_zones.Insert(zone); //Массив класса Zone //каждый элемент массива содержит указатель на экземпляр класса зоны

		Print("::: SERVER: [ZonesClass.c DEBUG]: AddZone: zone.name: " + zone.name + ", zone.id: " + zone.id + ", zone.pos: " + zone.pos + ", zone.radius: " + zone.radius + ", type: " + zone.type + ", player_Damage_Coef: " + zone.player_Damage_Coef + ", player_Health_Threshold_Symptoms: " + zone.player_Health_Threshold_Symptoms + ", player_Symptom: " + zone.player_Symptom + ", item_Damage_Coef: " + zone.item_Damage_Coef + ", item_Health_Threshold: " + zone.item_Health_Threshold);
	}
	
	void SendZoneMessage(PlayerBase player, string zonemessage)
	{
			Param1<string> m_MessageParam = new Param1<string>(zonemessage);
			GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity());
	}
	
	bool InZone(PlayerBase player, ref Zone zone)
	{
		if ( vector.Distance(player.GetPosition(), zone.pos) > zone.radius && vector.Distance(player.GetPosition(), zone.pos) < zone.warndistance )
		{
			if (!zone.playersInZone.Contains(player)) 
			{
				SendZoneMessage(player, zone.warnmessage);
			}
		}
		if ( vector.Distance(player.GetPosition(), zone.pos) <= zone.radius )
		{
			switch(zone.type)
			{
				case 1: //SAFE
				{
					SafeZone(player, zone);
				break;
				}
				case 2: //GAS
				{
					GasZone(player, zone);
				break;
				}
				case 3: //RAD
				{
					RadZone(player, zone);
				break;
				}
				case 4: //BIO
				{
					BioZone(player, zone);
				break;
				}
			}
			if (!zone.playersInZone.Contains(player)) //1:
			{
				if (my_Zones_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: InZone: Player: " + player.GetIdentity().GetName() + ", 1.1: zone.playersInZone.Contains(player) = " + zone.playersInZone.Contains(player));
				zone.playersInZone.Insert(player, player.GetIdentity().GetPlayerId());
				if (my_Zones_Debug)
				{
					Print("::: SERVER: [ZonesClass.c DEBUG]: InZone: Player: " + player.GetIdentity().GetName() + ", 1.2: zone.playersInZone.Contains(player) = " + zone.playersInZone.Contains(player));
					Print("::: SERVER: [ZonesClass.c DEBUG]: InZone: Player: " + player.GetIdentity().GetName() + ", 1.3: entering zone.name: " + zone.name);
					SendZoneMessage(player, "1.0: InZone enter Zone: " + zone.name + " : " + zone.entermessage);
				}
				else
				{
					SendZoneMessage(player, zone.entermessage);
				}
			}
			else
			{
				if (zone.repeatmsg)
				{
					SendZoneMessage(player, zone.message);
				}
			}
		return true;
		}
		else
		{
			if (zone.playersInZone.Contains(player)) //2:
			{
				if (my_Zones_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: InZone: Player: " + player.GetIdentity().GetName() + ", 2.1: zone.playersInZone.Contains(player) = " + zone.playersInZone.Contains(player));
				zone.playersInZone.Remove(player);
				if (my_Zones_Debug)
				{
					Print("::: SERVER: [ZonesClass.c DEBUG]: InZone: Player: " + player.GetIdentity().GetName() + ", 2.2: zone.playersInZone.Contains(player) = " + zone.playersInZone.Contains(player));
					Print("::: SERVER: [ZonesClass.c DEBUG]: InZone: Player: " + player.GetIdentity().GetName() + ", 2.3: leaving zone.name: " + zone.name);
					SendZoneMessage(player, "2.0: InZone exit Zone: " + zone.name + " : " + zone.exitmessage);
				}
				else
				{
					SendZoneMessage(player, zone.exitmessage);
				}
			}
			return false;
		}
	}	

	void SafeZone(PlayerBase player, ref Zone zone)
	{
	}

	void GasZone(PlayerBase player, ref Zone zone)
	{
	}
	
	void RadZone(PlayerBase player, ref Zone zone)
	{
	}

	void BioZone(PlayerBase player, ref Zone zone)
	{
		EntityAI attachment;
		ItemBase item;
		float 	player_Damage_Coef 					= zone.player_Damage_Coef;					//Стартовое значение урона для игрока
		float 	player_Health_Threshold_Symptoms	= zone.player_Health_Threshold_Symptoms;	//Порог здоровья игрока после которых у него проявляются симптомы
		int 	player_Symptom						= zone.player_Symptom;						//Симптом у игрока для данной зоны	
		float 	player_Health;																	//Сюда вернём "здоровье" игрока
		float 	item_Damage_Coef 					= zone.item_Damage_Coef;					//Стартовое значение урона для вещи
		float 	item_Health_Threshold 				= zone.item_Health_Threshold;				//Пороговое значение "здоровья" предмета // в последствии прикрутим
		float 	Item_Health;																	//Сюда вернём "здоровье" проверяемого предмета
			
		if (my_BioZone_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: BioZone: Player: " + player.GetIdentity().GetName() + ", zone.name: " + zone.name);
			
		attachment = player.FindAttachmentBySlotName("Mask");
		if ( attachment && attachment.IsItemBase() ) 
		{
			item = ItemBase.Cast(attachment);
			if ( item.GetType().Contains("GasMask") )
			{
				if (my_BioZone_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: BioZone: Player: " + player.GetIdentity().GetName() + ", found mask: " + item.ToString());
				Item_Health = item.GetHealth();			    		//Возвращаем значение "здоровья" предмета в переменную Item_Health
				Item_Health = Item_Health - item_Damage_Coef;		//Декримент состояния предмета
				//item.SetHealth(Item_Health);						//Устанавливаем новое состояние предмета
				if (Item_Health <= item_Health_Threshold)			//Если значение "здоровья" предмета ниже равно порогу, заданному в переменной item_Health_Threshold...
				{													//...,то
					player_Damage_Coef = player_Damage_Coef + 0.5;	//Маска изношена - урон +0.5
				}                                                                      
			}
			else
			{
				if (my_BioZone_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: BioZone: Player: " + player.GetIdentity().GetName() + ", mask not found.");
				player_Damage_Coef = player_Damage_Coef + 1;		//Маски нет - урон +1
			}
		}
		else
		{
			if (my_BioZone_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: BioZone: Player: " + player.GetIdentity().GetName() + ", SlotName Mask not found.");
			player_Damage_Coef = player_Damage_Coef + 1; //Маски нет - урон +1
		}

		if ( player_Damage_Coef > 0  )
		{
			player_Health = player.GetHealth("GlobalHealth", "Health");
			player_Health = player_Health - player_Damage_Coef;
			//player.SetHealth("GlobalHealth", "Health", player_Health);
			if (my_BioZone_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: BioZone: Player: " + player.GetIdentity().GetName() + ", decrease player_Health by player_Damage_Coef: " + player_Damage_Coef + ", new health: " + player_Health);
			if (player_Health <= player_Health_Threshold_Symptoms) 
			{
				player.GetSymptomManager().QueueUpPrimarySymptom(player_Symptom);
				if (my_BioZone_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: BioZone: Player: " + player.GetIdentity().GetName() + ", add symptom: " + player_Symptom);
			}
		}
	}
	
	void CheckZones()
	{
		ref array<Man> players = new array<Man>;
		GetGame().GetPlayers( players );
		for ( int i = 0; i < players.Count(); i++ )
		{
			PlayerBase player = PlayerBase.Cast(players[i]);
			if (player.GetIdentity())
			{
				for ( int j = 0; j < ga_zones.Count(); j++ )
				{
					if (InZone(player, ga_zones[j])) break;
				}
			}
		}
	}
}

 

 

 

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

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


Ссылка на сообщение
Поделиться на других сайтах
В 19.04.2019 в 16:53, BorizzK сказал:

выбор через switch/case

Как конкретно работают эти функции? Что включает switch и что делает case?

 

Ну, кажись, с тем, что есть разобрались?:relaxed: Далее идёт собственно проверка на наличие и целостность противогаза, взятые из предыдущего опыта - тут понятно всё. Ну и нанесение урона по игроку - тоже, вроде бы вопросов нет.

Я так вижу, что ты пока сделал только один тип зоны - Bio.

Насколько я понимаю, вопрос в том, какие воздействия будут в каждом типе зон?

Проверка защиты, ты сам сказал, взята временно - будет заменена на нечто вроде предложенного 123new в теме "Как проверить целостность костюма?", так?

То есть сравнением с сетом, определённым в массиве?

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

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


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

VIRrusR 

Switch case тут не отличается от стандарта

Почитай в сети и спроецируй на наш код

 

У меня единственный затык

 

Если массив map куда записываются игроки для каждого экземпляра класса Zone (будем для простоты называть это зоной) для каждой зоны создается свой (отдельный экщемпляр), то с массивом типа TString, string, это не прокатывает... Создается один экземпляр и он идентичен для всех экземпляров зон...

 

Чую надо делать отдельный класс с 2мя строковыми переменными

И делать на основе его 2 массива

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

 

Вобщем надо подумать

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

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


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

Если я правильно понял, то это оператор "выбора по соответствию" - в нашей функции InZone() мы получили номер зоны, в которой находится игрок, в цикле switch/case как раз включается нужный нам экземпляр класса Zone{} для проверяемого игрока. У нас есть указатель на игрока и номер зоны, в цикле просто последовательно сравниваются эти номера зон и при совпадении, через указатель zone для текущего проверяемого игрока вызывается соответствующий экземпляр класса Zone{}. Всё верно?

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


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

VIRrusR Не, немного не так

В CheckZone во внешнем цикле мы последовательно получаем игроков в перемнную player, затем во внутреннем цикле последовательно получаем из массива указатель на зону и вызываем InZone передавая в нее игрока и зону, там проверяем в зоне игрок или нет, если да, выбираем по switch/case соответствующий этой зоне обработчик, совершаем доп действие за пределами switch и возврашаем true,  и по  true внутренний цикл  в CheckZone прерывается и идет переход к следующему игроку

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


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

BorizzK , то есть

switch(zone.type)

"Включить по типу зоны для игрока player" - у нас, допустим, type = 4 (BIO)

Далее идёт последовательный перебор вариантов по case: 1 не равно type, 2 не равно type, 3 не равно type, О! 4 = type! (1,2,3,4 - порядковый номер элемента массива ga_zones, т.е. указателя на экземпляр класса Zone{})

И команда 

case 4: //BIO
				{
					BioZone(player, zone);
				break;
				}

вызывает для игрока, указатель на которого player, обработчик на который указывает zone (в нашем случае BIO):

void BioZone(PlayerBase player, ref Zone zone)

В этой функции как раз проверяется зашита и если она недостаточна - наносится урон.

На этом все проверки для текущего игрока заканчиваются и проверяется следующий игрок. Через 12 секунд весь цикл повторяется, начиная с первого присутствующего на сервере игрока. Так?

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


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

VIRrusR Ну почти

мы когда делали AddZone закатали туда номер типа зоны (оно у нас в перечислителе enum задается)

 

вот вызов

AddZone(zone_Name, zone_Id, zone_Pos, zone_Radius, zone_WarnDistance, zone_Type, zone_WarnMessage, zone_enterMessage, zone_Message, zone_RepeatMsg, zone_RepeatStep, zone_exitMessage, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom, itemsComplect, item_Damage_Coef, item_Health_Threshold);

предварительно мы присвоили значение zone_Type = ZoneType.BIO

 

А внутри AddZone мы

zone.type = type;

 

Ну и  в switch/case мы делаем так

 

switch (zone.type)
{
    case 1: // если zone.type = 1 выполнится этот кусок
    {
      
	break; прерываем switch / далее выполнится код сразу после него
    }
    case 2: // если zone.type = 2 выполнится этот кусок
    {
      
	break; прерываем switch / далее выполнится код сразу после него
    }

    case 3: // если zone.type = 3 выполнится этот кусок
    {
      
	break; прерываем switch / далее выполнится код сразу после него
    }
    case 4: // если zone.type = 4 выполнится этот кусок
    {
      
	break; прерываем switch / далее выполнится код сразу после него
    }
}
//тут всегда выполнится код после выполнения кусков выше

а можно так

 

switch (zone.type)
{
    case ZoneType.SAFE: // если zone.type = 1 выполнится этот кусок
    {
      
	break; прерываем switch / далее выполнится код сразу после него
    }
    case ZoneType.GAS: // если zone.type = 2 выполнится этот кусок
    {
      
	break; прерываем switch / далее выполнится код сразу после него
    }

    case ZoneType.RAD: // если zone.type = 3 выполнится этот кусок
    {
      
	break; прерываем switch / далее выполнится код сразу после него
    }
    case ZoneType.BIO: // если zone.type = 4 выполнится этот кусок
    {
      
	break; прерываем switch / далее выполнится код сразу после него
    }
}
//тут всегда выполнится код после выполнения кусков выше

 

void BioZone(PlayerBase player, ref Zone zone)

В этой функции как раз проверяется зашита и если она недостаточна - наносится урон.

На этом все проверки для текущего игрока заканчиваются и проверяется следующий игрок. Через 12 секунд весь цикл повторяется, начиная с первого присутствующего на сервере игрока. Так?

 

Да - все верно

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

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


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

Да. Я именно так и понимаю, спасибо! Просто чтобы это сформулировать нужно целый трактат напечатать!:joy:

Просто нужно было точно понять, логику этого "выбора по соответствию".

 

P.S. Чем далее мы разбираемся, тем отчётливее я понимаю, что до "написать" мне ещё как до Луны раком, извиняюсь за образность выражения!.. Мне ещё до "прочитать" (если в это слово вкладывать не просто буквы сложить, а понять информацию в эти буквы заключённую) - пыхтеть и пыхтеть...:sad:

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


Ссылка на сообщение
Поделиться на других сайтах
В 21.04.2019 в 01:07, BorizzK сказал:

по TStringArray у меня появились сомнения - как-то вот в лоб не получается объявить массив для каждого экземпляра

всегда получается один и тот же и данные для всех зон одинаковые - что не есть гуд

 

Погодь. А почему не получается?! Что нам мешает объявить локальные массивы в каждом экземпляре? Я не очень понимаю, в чём у тебя затык? Как объявить массив или что в него прописывать?

И зачем массив типа <map>? У нас же проверки и нанесение урона идут последовательно - игрок за игроком, так? На кой нам их в массив собирать то?! Или ты хочешь какие-то действия в отношении ВСЕХ игроков, находящихся в зонах ОДНОВРЕМЕННО предпринять?..Какие и зачем?

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

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


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

VIRrusR Посмотри в мой крайний вариант всего скрипта

Там при входе в зону в массив ее экземпляра инсертится player и при выходе оттуда ремувится

Зачем

А затем что

Игрок вошел в зону (игрок в зоне)

Проверяем массив - игрока там нет?

Ему отправилось сообщение о входе в зону - Вы вошли в зону

Он заносится в массив

Следующая итерация

Проверяем массив - игрока там нет? есть!

Сообщение о входе в зону не отправляем - просто вызываем обработку

а далее - если включено сообщение о нахождении в самой зоне - то посылаем - Вы в зоне

 

Игрок вышел из зоны (не в зоне)

проверяем - игрок в массиве? да - значит был в зоне

Отправляем сообщение - Вы покинули зону

Убриаем его из массива

Вледующая итерация

Игрок в зоне? нет

Есть в массиве? нет

Ничего не делаем

 

Вот map для каждого экземпляра свой - потому оч удобно

Кроме тогго - map в данном случае удобен тем, что для него применимы методы Contains и Remove

Те проверка на наличие массив.Contains(player); и массив.Romeve(player)

и массив map можно использвать с наполнением как захочешь

 

Вроде такой вид массива тут ни раз обсуждался

Массив динамический

Каждый элемент состоит из - индекс - значение

Например

простой случай использования одного массива

обявили в классе

ref map<string, int> m_playersSetUIDs = new map<string, int>;

ну и заносим в него

m_playersSetUIDs.Insert("76562295156237171", 1);
m_playersSetUIDs.Insert("76562244156237101", 7);
m_playersSetUIDs.Insert("76562295156297112", 11);

если надо проверяем

int a = m_playersSetUIDs.Count();

// Результат a = 3

если надо удаляем (при удалении следующие после удаляемого элемента элементы смещаются к предыдущему перед удаляемым ) тут мы удалили 1й (нумерация же идет с 0) - значит эелемент который был намбером 2 стал намбером 1 те сместился - ну ты понял

m_playersSetUIDs.Remove("76562244156237101");

int a = m_playersSetUIDs.Count();

//результат a = 2

Получить значение по индексу - удобно для раздачи сетов по уидам например (как вариант) или спавну или еще чего

int b = m_playersSetUIDs.Get("76562244156237101");
//рузультат b = 7

Проверить наличия уида в массиве

if (m_playersSetUIDs.Contains("76562244156237101"))
{
  //uid в массиве
}
else
{
 //uid не в массиве
}

получить индекс 0го элемента

 

string uid = m_playersSetUIDs.GetKey(0);

//результат uid = "76562295156237171";

получить значение индекса 0го элемента

 

int b = m_playersSetUIDs.GetElement(0);

//результат b = 1

у этого массива еще один плюс

 

обявив его в классе и инициализируя его в конструкторе (при создании экземпляра класса как мы помним конструктор выполняется автоматом)

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

 

MyClass.m_playersSetUIDs.Insert("блаблабла",222);

 

class MyClass
{
 ref map<string, int> m_playersSetUIDs;
   
   void MyClass()
   {
    m_playersSetUIDs = new map<string, int>;
   }
}

 

Понятно что массив этот может иметь различные характеристики

 

ref map<string, int> m_playersSetUIDs = new map<string, int>;
ref map<vector, int> m_playersSetUIDs = new map<vector, int>;
ref map<string, vector> m_playersSetUIDs = new map<string, vector>;

все не проверял пока

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

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


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

BorizzK , опять делаем ради сделать?:joy:

С практической точки зрения оно нужно, как собаке пятая нога. "Вы подходите", "Вы входите"," Вы в метре от выхода","Потерпите ещё три шажочка", "Ура! Вы вышли!". Зашёл, проблевался, прочихался, получил дамаг, получил сообщение "Напяливай химзу, идиотина!!!" и всё. Нефик баловать мерзких геймеров.:geek:

Я изначально считаю, что несколько видов зон - логический перегруз, особенно на фоне невозможности их чётко обозначить визуально. Ты итак чернобыльскую аномальную зону из Сталкера делаешь, так теперь ещё у каждой аномалии указатель вешать собрался: "Здесь бяка-боляка через три метра! Если у тя нету шапочки из фольги, то ты туда не ходи!"...

 

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

 

...Давай лучше так: прикрутим игроку "постэффекты"? Скажем, был в зоне - получи болячку! Бегай ищи "лечилку" - тот же тетрациклин. Пока не найдёшь, будет у тебя "микроба" светиться и попукивать будешь через каждые 10 секунд с подхихикиванием. Вот это будет то, что надо. А городить ради сообщений, как-то неинтересно даже... Ну, впрочем, я понимаю, что можно потом вместо сообщений чего угодно прикрутить.

 

P.S. Это ты про это Ультиму спрашивал? Как метку на игрока повесить, если он залез куда не надо?

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


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

VIRrusR Это можно и не использовать - сделаю флаг - true - работает фича для данной зоны - false - не работает

Я пока реализовал то что есть

и сообщение о приближении к зоне

Фишка в том что

Если это радиоктивная зона пока нет у тебя в руках прибора - скажем условного дозиметра - сообщений нет

Для хим зоны можно и без газаанализатора - возможна вонь (зомби напердели - рота! газы!)

итп

Вобщем - полезно что бы это было и было только на стороне сервера

Ну а сообщение о сейфзоне имхо всегда полезно

 

Хочу еще динамические изменения локаций зон сделать с сообщениями всем и без оных

И динамические события - бочка с неба упала желтая и фонит или газирует

 

Постэффекты

Чел должен знать почему - имхо - ему поплохело

 

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


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

BorizzK , либо я так и не понял твою задумку, либо...:blink:

Ты для чего игроков, находящихся в зоне хочешь в массив то собрать?! Ну вот собрал ты их в кучу - "Вася, Петя, Маша, Коля в зоне биологического заражения". Что тебе даёт эта информация? 

Массив динамический и ты отслеживаешь, что его состояние изменилось на "Вася, Маша, Коля, Сидор в зоне биологического заражения". Очевидно, что Петя либо сдёрнул куда, либо издох. Оба варианта для нас равноценны - прекратить в отношении Пети проверки и нанесение урона. Это у нас итак уже определено. Зачем тебе отслеживать это? Если только ты собираешься убедиться в том, что Петя именно сдёрнул из зоны, а не отключился от сервера и не сдох, и собираешься в связи со счастливым спасением Пети, добавить ему какую-то дополнительную радость, в виде "чёрной метки" о том, что он, подлец, таки в зоне побывал! Так? Как потом эту метку использовать - дело десятое! Главное, что сервер знает, что Петя туда лазил. Смысл в этом? 

Тогда вопрос: а релог? Петя наш может разок и походит с "чёрной меткой", может и два... А потом смекнёт, что к нему чего-то прилипло, да и релогнется! И войдёт уже как новенький Петя, который вообще не при делах и не лазил никуда?..

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


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

VIRrusR Отслеживаю

1 что бы сообщения более 1 раза не отсылать

что-то мне не нравится идея что игроку постоянно сообщения сыплятся что он в зоне

один раз сообщили и ладушки

а как проверить что оно отослалось?

верно

либо игроку переменную придумать - типпа player.msgesended = true; - но это надо playerbase корячить

а тут массив - вошел в зону - сообщение - записали игрока - вышел сообщение стерли игрока

ну дохлых там проверять смысла нет - ибо оперирование идет только живыми - ибо если подох - то и в массиве игроков откуда они берутся для итераций его не будет - ну понятно что массив может в итоге содержать кучу элементов NULL - подохшие же - но оно и память не жрет

а проверки на NULL и живость - если перс есть (все еще лежит хотя клиент отключился) и тп - это я встрою - оно не жрет ничего

там вообще все это мало потребляет внутри

 

про релог - вышел - вошел - player ВСЕГДА БУДЕТ ИМЕТЬ НОВЫЙ ID на сервере - ВСЕГДА!!!

 

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


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

1 что бы сообщения более 1 раза не отсылать

И только?! "Ну Вы, блин, даёте!" (с)

Только что, BorizzK сказал:

про релог - вышел - вошел - player ВСЕГДА БУДЕТ ИМЕТЬ НОВЫЙ ID на сервере - ВСЕГДА!!!

А тебе про что?! То есть примотать нашему Пете какую-то "вавку" за то, что он когда-то вчера туда лазил, без занесения чего-то в БД игрока низя, что делает всю эту затею бессмысленной.

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


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

VIRrusR не делает

сообщение о входе в зону нужно?

сообщение о выходе нужно? нужно

не нужно

поставь false и проверки не будет и массив юзаться не будет

а как по другому?

ну и сделать примотку игроку - по уид в профиде сервера что он что-то там посещал - ну почему бы и нет ))) сделаем

для соответствующих зон (надо придумать)

 

Но и как бы - мы сейчас кроме всего прочего язык как бы изучаем - потому и пишем многое ради того что бы написать

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


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

BorizzK , я понял. 

Ну давай думать, как нам победить повторение сообщений. 

А вот "меточку" Пете прилепить - это хорошо, это правильно! Жаль только, что слетит она после перезахода..

Так, пошёл читать последнюю версию твоего скрипта... 

 

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


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

VIRrusR Почему слетит - он вышел в зоне - ок

Вошел - снова сообщение и снова в базу

Можно UID запихивать кстати вместо самого перса

тогда массив будет

ref map<string, int>  playersInZone;

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

    • Автор: Troy1
      Всем привет. Суть в чём, пишу мод на событие и когда происходит событие, параллельно должна меняться скорость ветра, не могу понять как заставить скрипт управлять силой ветра. Понижать силу ветра получилось сделать, а вот повышать не как. Только после перезагрузки сервера сила ветра задаётся в нужном значение.
      Как сделать, что бы по вызову функции менялась сила ветра в большую или в меньшую сторону?
      protected void SetWind(float wind, float time) { if (!g_Game) return; Weather m_Weather = g_Game.GetWeather(); if (!m_Weather) return; m_Weather.SetWindMaximumSpeed(wind); m_Weather.SetWind(Vector(1/Math.Sqrt(3), 1/Math.Sqrt(3), 1/Math.Sqrt(3)) * wind); m_Weather.SetWindSpeed(wind); m_Weather.SetWindFunctionParams(1.0, 1.0, -1); } Это скрипт на понижение силы ветра.
      Работает понижение силы ветра в том случае, если до этого сила ветра была выше.
      Пример:
      Изначально на сервере сила ветра = 20 m/s А нужно понизить до 10 m/s
      Только в этом случае сработает скрипт который я приложил выше.
      Помогите пожалуйста решить этот вопрос.
      За ранние благодарю.
    • Автор: Troy1
      Всем привет. Помогите пожалуйста со скриптом.
      Суть. Я пытаюсь сделать синхранизацию сервера с клиентом передавая c конфига время разделки животного.
      В родных скриптах есть class UATimeSpent с константами и там есть константа SKIN.
      Мне нужно её перезаписать на своё значение и мне выдаёт ошибку: Trying to modify write protected variable 'SKIN' в переводе на Русский Попытка изменить защищенную от записи переменную «SKIN».
      Функция скрипта: Когда игрок запускает клиент, идёт запрос на серверную часть и получает в ответ время разделки.
      Задача: Нужно перезаписать константу SKIN на новое значение и всё.
      Сам скрипт.
      class timeToComplete extends UATimeSpent { protected ref UATimeSpent m_UATimeSpent; void timeToComplete() { GetDayZGame().Event_OnRPC.Insert(OnRPC); CheckUATimeSpent(); } void ~timeToComplete() { GetDayZGame().Event_OnRPC.Remove(OnRPC); } void CheckUATimeSpent() { GetGame().RPCSingleParam(NULL, SOC_TIME_RPCs.SOC_GT, NULL, true); } void OnRPC(PlayerIdentity sender, Object target, int rpc_type, ParamsReadContext ctx) { if (rpc_type == SOC_TIME_RPCs.SOC_RT) { Param1<float> soc_srt; if (ctx.Read(soc_srt)) { if (soc_srt.param1!= 0) { m_UATimeSpent.SKIN = soc_srt.param1; Print("Пришёл ответ от сервера в m_UATimeSpent.SKIN - " + m_UATimeSpent.SKIN) } } } } };  
    • Автор: RedWoodGamer
      Ищу мододела который напишет мод на поиск предметов в ванильной фурнитуре с возможностью конфигурации лутабельных объектов и лута внутри них, а так-же КД на лутаемый объект (Простыми словами чтобы нельзя было лутать один и тот же объект двум игрокам одновременно, если один залутал, включается определённый таймер и второй игрок может залутать его через прошедшее время, либо же завязать это время на рестарт сервера.)
      Бюджет есть, оценивайте свою работу и предлагайте цену, кто не хочет в комментариях вот Discord : RedWood#6323
    • Автор: CubeIn
      Приветствую друзья, возникла неприятная ошибка.
      Подписал все ключи через DS Utils, вставил ключ в северную часть, но все равно при заходе на сервер пишет данную ошибку.
      Client contains PBO which is not part of server data
       
    • Автор: CubeIn
      Есть ли у кого ни будь шаблон или инструкция как создать свой шеврон?
      Нашел видео от Фидова, но ссылка на шаблон не действительна

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

×
×
  • Создать...

Важная информация

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

Поддержка