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

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

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

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

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

Триггеры с газом[1.0][By NoNameUltima]

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

09.07.2019 в 21:30, BorizzK сказал:

grehoff партикли тут не при чем совершенно - партикли ток на клиенте

тут все просто

спавним на стороне сервера дымовые шашки ниже уровня земли - метров 5
ну и включаем

 

EntityAI Effect = EntityAI.Cast(GetGame().CreateObject( "класснеймдымовойшашки", "1000 2 1000" )); //Создаем обьект шашки SmokeGrenadeBase smokegrenade = NULL; //инициализируем переменную класса SmokeGrenadeBase (дымовой шашки) smokegrenade = SmokeGrenadeBase.Cast(Effect); //апкастим созданный обьект в класс дамовой шашки if (smokegrenade) smokegrenade.Unpin(); //если все успешно прошло включаем гранату smokegrenade.SetSynchDirty(); //вызываем принудительную синхру этой шашки с клиентами / хотя и без этого работает усе - пошел дым - и игроки это у видят на и что бы дым не заканчивался в процессе проверок зон я проверяю гранату на предмет состояния и если она потухла - делаю переспавн if (smokegrenade) if (smokegrenade.GetSmokeGrenadeState() == ESmokeGrenadeState.NO_SMOKE) { //граната не дымит вызываем респавн smokegrenadeю.SetHealth(0); smokegrenade.Delete(); //Удаляем - но она не всегда удаляется, однако она пропадет сама со временем } //граната исчезла вызываем респавн }


EntityAI Effect = EntityAI.Cast(GetGame().CreateObject( "класснеймдымовойшашки", "1000 2 1000" )); //Создаем обьект шашки
SmokeGrenadeBase smokegrenade = NULL; //инициализируем переменную класса SmokeGrenadeBase (дымовой шашки)
smokegrenade = SmokeGrenadeBase.Cast(Effect); //апкастим созданный обьект в класс дамовой шашки
if (smokegrenade) smokegrenade.Unpin(); //если все успешно прошло включаем гранату
smokegrenade.SetSynchDirty(); //вызываем принудительную синхру этой шашки с клиентами / хотя и без этого работает

усе - пошел дым - и игроки это у видят

на и что бы дым не заканчивался в процессе проверок зон я проверяю гранату на предмет состояния и если она потухла - делаю переспавн
if (smokegrenade)
    if (smokegrenade.GetSmokeGrenadeState() == ESmokeGrenadeState.NO_SMOKE)
	{
  	 //граната не дымит вызываем респавн
	 smokegrenadeю.SetHealth(0);
	 smokegrenade.Delete(); //Удаляем - но она не всегда удаляется, однако она пропадет сама со временем
	}
  //граната исчезла вызываем респавн
}

Немного изменил про проверку и респавн

Куда это нужно вставить?

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


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



10.02.2019 в 12:46, elanc сказал:

class Zone { int id; int type; vector pos; float radius; } enum ZoneType { SAFE, GAS, RAD, BIO } ref array<ref Zone> ga_zones = new array<ref Zone>; ref ControllerZones ctrl_zones = new ControllerZones; class ControllerZones { void ControllerZones() { int id = 0; vector pos; float radius; int type = 0; id = 1; // Pavlovo pos = "2125 0 3400"; radius = 200.0; AddZone(id, pos, radius); id = 2; // Zeleno pos = "2530 0 5112"; radius = 150.0; AddZone(id, pos, radius); id = 3; // Dichina pos = "4524 0 8290"; radius = 50.0; AddZone(id, pos, radius); id = 4; // Mushkino pos = "332 0 9368"; radius = 100.0; AddZone(id, pos, radius); id = 5; // Aero SW pos = "4586 0 9533"; radius = 220.0; AddZone(id, pos, radius); id = 6; // Aero SE pos = "5177 0 9960"; radius = 350.0; AddZone(id, pos, radius); id = 7; // Aero W pos = "4228 0 10400"; radius = 350.0; AddZone(id, pos, radius); id = 8; // Aero E pos = "4785 0 10530"; radius = 250.0; AddZone(id, pos, radius); id = 9; // Aero N pos = "4290 0 10956"; radius = 250.0; AddZone(id, pos, radius); id = 10; // Tisy pos = "1600 0 14030"; radius = 600.0; AddZone(id, pos, radius); id = 11; // Troitskoe pos = "7893 0 14689"; radius = 300.0; AddZone(id, pos, radius); GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckZones, 5000, true); } void ~ControllerZones() { } void AddZone(int id, vector pos, float radius, int type = ZoneType.BIO) { ref Zone zone = new ref Zone; zone.id = id; zone.pos = pos; zone.radius = radius; zone.type = type; ga_zones.Insert(zone); } bool InZone(PlayerBase player, ref Zone zone) { vector player_position = player.GetPosition(); player_position[1] = 0; if( (vector.Distance(player_position, zone.pos)) < zone.radius ) { EntityAI attachment; ItemBase item; string className; float biosafe = 0; attachment = player.FindAttachmentBySlotName("Mask"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("GP5GasMask") ) { //return true; // TEMP FIX biosafe = biosafe + 1.0; } } attachment = player.FindAttachmentBySlotName("Headgear"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("NBCHoodGray") ) { biosafe = biosafe + 1.0; } } attachment = player.FindAttachmentBySlotName("Body"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("NBCJacketGray") ) { biosafe = biosafe + 1.0; } } attachment = player.FindAttachmentBySlotName("Legs"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("NBCPantsGray") ) { biosafe = biosafe + 1.0; } } attachment = player.FindAttachmentBySlotName("Feet"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("NBCBootsGray") ) { biosafe = biosafe + 1.0; } } attachment = player.FindAttachmentBySlotName("Gloves"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("NBCGlovesGray") ) { biosafe = biosafe + 1.0; } } if ( biosafe > 5.0 ) return true; float damage_player; float damage_zone = 6.0; damage_player = player.GetHealth("GlobalHealth", "Health"); player.SetHealth("GlobalHealth", "Health", damage_player - (damage_zone - ((damage_zone / 6) * biosafe))); player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_COUGH); Param1<string> m_MessageParam = new Param1<string>("Вам нужны химзащита и противогаз!"); GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); return true; } return false; } void CheckZones() { ref array<Man> players = new array<Man>; GetGame().GetPlayers( players ); for ( int i = 0; i < players.Count(); i++ ) { PlayerBase player; Class.CastTo(player, players.Get(i)); for ( int j = 0; j < ga_zones.Count(); j++ ) { if(InZone(player, ga_zones.Get(j))) { break; } } } } }


class Zone {
	int id;
	int type;
	vector pos;
	float radius;
}

enum ZoneType {
	SAFE,
	GAS,
	RAD,
	BIO
}

ref array<ref Zone> ga_zones = new array<ref Zone>;

ref ControllerZones ctrl_zones = new ControllerZones;

class ControllerZones {
	void ControllerZones() {
		
		int id = 0;
		vector pos;
		float radius;
		int type = 0;

		id = 1; // Pavlovo
		pos = "2125 0 3400"; 
		radius = 200.0;
		AddZone(id, pos, radius);
		
		id = 2; // Zeleno
		pos = "2530 0 5112";
		radius = 150.0;
		AddZone(id, pos, radius);
		
		id = 3; // Dichina
		pos = "4524 0 8290";
		radius = 50.0;
		AddZone(id, pos, radius);
		
		id = 4; // Mushkino
		pos = "332 0 9368";
		radius = 100.0;
		AddZone(id, pos, radius);
		
		id = 5; // Aero SW
		pos = "4586 0 9533";
		radius = 220.0;
		AddZone(id, pos, radius);
		
		id = 6; // Aero SE
		pos = "5177 0 9960";
		radius = 350.0;
		AddZone(id, pos, radius);
		
		id = 7; // Aero W
		pos = "4228 0 10400";
		radius = 350.0;
		AddZone(id, pos, radius);
		
		id = 8; // Aero E
		pos = "4785 0 10530";
		radius = 250.0;
		AddZone(id, pos, radius);
		
		id = 9; // Aero N
		pos = "4290 0 10956";
		radius = 250.0;
		AddZone(id, pos, radius);
		
		id = 10; // Tisy
		pos = "1600 0 14030";
		radius = 600.0;
		AddZone(id, pos, radius);
		
		id = 11; // Troitskoe
		pos = "7893 0 14689";
		radius = 300.0;
		AddZone(id, pos, radius);
		
		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckZones, 5000, true);
	}
	
	void ~ControllerZones() {
	}
	
	void AddZone(int id, vector pos, float radius, int type = ZoneType.BIO) {
		ref Zone zone = new ref Zone;
		
		zone.id = id;
		zone.pos = pos;
		zone.radius = radius;
		zone.type = type;

		ga_zones.Insert(zone);
	}
	
	bool InZone(PlayerBase player, ref Zone zone) {
		vector player_position = player.GetPosition();
		player_position[1] = 0;

		if( (vector.Distance(player_position, zone.pos)) < zone.radius ) {
			
			EntityAI attachment;
			ItemBase item;
			string className;
			float biosafe = 0;
			
			attachment = player.FindAttachmentBySlotName("Mask");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("GP5GasMask") ) {
					//return true; // TEMP FIX
					biosafe = biosafe + 1.0;
				}
			}

			attachment = player.FindAttachmentBySlotName("Headgear");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCHoodGray") ) {
					biosafe = biosafe + 1.0;
				}	
			}

			attachment = player.FindAttachmentBySlotName("Body");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCJacketGray") ) {
					biosafe = biosafe + 1.0;
				}	
			}

			attachment = player.FindAttachmentBySlotName("Legs");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCPantsGray") ) {
					biosafe = biosafe + 1.0;
				}	
			}

			attachment = player.FindAttachmentBySlotName("Feet");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCBootsGray") ) {
					biosafe = biosafe + 1.0;
				}	
			}

			attachment = player.FindAttachmentBySlotName("Gloves");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCGlovesGray") ) {
					biosafe = biosafe + 1.0;
				}
			}
			
			if ( biosafe > 5.0 )
				return true;
			
			float damage_player;
			float damage_zone = 6.0;
			damage_player = player.GetHealth("GlobalHealth", "Health");
			player.SetHealth("GlobalHealth", "Health", damage_player - (damage_zone - ((damage_zone / 6) * biosafe)));
			
			player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_COUGH);
			
			Param1<string> m_MessageParam = new Param1<string>("Вам нужны химзащита и противогаз!");
			GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); 
			
			return true;
		}
		
		return false;
	}
	
	void CheckZones() {
		ref array<Man> players = new array<Man>;
		GetGame().GetPlayers( players );
		
		for ( int i = 0; i < players.Count(); i++ )
		{
			PlayerBase player;
			Class.CastTo(player, players.Get(i));
			
			for ( int j = 0; j < ga_zones.Count(); j++ ) {
				if(InZone(player, ga_zones.Get(j))) {
					break;
				}
			}
		}
	}
}

Короче, как пример… Планов было много, но так и не дошли руки… Для нахождения в зонах нужна полная «химза» и противогаз, иначе игрок получает повреждения. Повреждения зависят от кол-ва одетых элементов защиты. Из эффектов: у игрока начинается кашель. Ковыряйте на здоровье.

Для работы скрипта достаточно подключить его через #include в init.c

А не подскажите как сделать Safe зону?

 

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


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

blood loss can be solved?

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


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

grehoff партикли тут не при чем совершенно - партикли ток на клиенте

тут все просто

спавним на стороне сервера дымовые шашки ниже уровня земли - метров 5
ну и включаем

 

EntityAI Effect = EntityAI.Cast(GetGame().CreateObject( "класснеймдымовойшашки", "1000 2 1000" )); //Создаем обьект шашки SmokeGrenadeBase smokegrenade = NULL; //инициализируем переменную класса SmokeGrenadeBase (дымовой шашки) smokegrenade = SmokeGrenadeBase.Cast(Effect); //апкастим созданный обьект в класс дамовой шашки if (smokegrenade) smokegrenade.Unpin(); //если все успешно прошло включаем гранату smokegrenade.SetSynchDirty(); //вызываем принудительную синхру этой шашки с клиентами / хотя и без этого работает усе - пошел дым - и игроки это у видят на и что бы дым не заканчивался в процессе проверок зон я проверяю гранату на предмет состояния и если она потухла - делаю переспавн if (smokegrenade) if (smokegrenade.GetSmokeGrenadeState() == ESmokeGrenadeState.NO_SMOKE) { //граната не дымит вызываем респавн smokegrenadeю.SetHealth(0); smokegrenade.Delete(); //Удаляем - но она не всегда удаляется, однако она пропадет сама со временем } //граната исчезла вызываем респавн }


EntityAI Effect = EntityAI.Cast(GetGame().CreateObject( "класснеймдымовойшашки", "1000 2 1000" )); //Создаем обьект шашки
SmokeGrenadeBase smokegrenade = NULL; //инициализируем переменную класса SmokeGrenadeBase (дымовой шашки)
smokegrenade = SmokeGrenadeBase.Cast(Effect); //апкастим созданный обьект в класс дамовой шашки
if (smokegrenade) smokegrenade.Unpin(); //если все успешно прошло включаем гранату
smokegrenade.SetSynchDirty(); //вызываем принудительную синхру этой шашки с клиентами / хотя и без этого работает

усе - пошел дым - и игроки это у видят

на и что бы дым не заканчивался в процессе проверок зон я проверяю гранату на предмет состояния и если она потухла - делаю переспавн
if (smokegrenade)
    if (smokegrenade.GetSmokeGrenadeState() == ESmokeGrenadeState.NO_SMOKE)
	{
  	 //граната не дымит вызываем респавн
	 smokegrenadeю.SetHealth(0);
	 smokegrenade.Delete(); //Удаляем - но она не всегда удаляется, однако она пропадет сама со временем
	}
  //граната исчезла вызываем респавн
}

Немного изменил про проверку и респавн

Можно пример как это было сделано?

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


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

Хм, я так понимаю скрипты тут опубликованные максимум обрабатывают одну зону, без накладывания?

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


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

Хм, я так понимаю скрипты тут опубликованные максимум обрабатывают одну зону, без накладывания?

А как ты догадался?

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


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

Тут на форуме в паблике лучше есть

 

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


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

Тут на форуме в паблике лучше есть

 

Не видел если честно...

 

16 часов назад, BorizzK сказал:

А как ты догадался?

....извините, для вас это очевидно,для меня-нет. Проверил на практике методом научного тыка.

 

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


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

Как подсказали старшие партайгеноссе
Вместо
 

			attachment = player.FindAttachmentBySlotName("Mask");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("GP5GasMask") ) {
					//return true; // TEMP FIX
					biosafe = biosafe + 1.0;
				}
			}

Лучше использовать
 

			attachment = player.FindAttachmentBySlotName("Mask");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className == "GP5GasMask" ) {
					//return true; // TEMP FIX
					biosafe = biosafe + 1.0;
				}
			}

Теперь исключена возможность двойного учёта аттачмента

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


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

Имею два вопроса за этот скрипт....Каким образом можно прикрутить болезнь к поражающим факторам?

Далее, есть так
Param1<string> m_MessageParam_rad = new Param1<string>("Вы находитесь под воздействием радиации!");
 GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam_rad, true, player.GetIdentity());

и
player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_COUGH);
Как включить временную задержку?

И.....может кто подскажет таки как спавнят рабочие дымовые шашки.
 

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


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

@paranoyk всё ещё не понимаю, зачем спаунить именно дымовые шашки, когда можно сделать лучше, а самое главное, логичнее.

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


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

@paranoyk всё ещё не понимаю, зачем спаунить именно дымовые шашки, когда можно сделать лучше, а самое главное, логичнее.

лучше имеешь ввиду что? не вкурил после кофе)

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


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

лучше имеешь ввиду что? не вкурил после кофе)

Создаётся любая p3d, там хоть с 1 поликом без всего, главное p3d. Спаунится всё так же по граундам и всё. И воняет уже не сама граната, а эта p3d(думаю сделать привязку к объекту для всех просто). Ну а партикли можно какие угожно мутить через воркбенч.
Аналог "жарки" из сталкера мы собрали за минуту приколов, к примеру. На ванильных ресурсах. Дым и прочее тоже просто красить.

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


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

Создаётся любая p3d, там хоть с 1 поликом без всего, главное p3d. Спаунится всё так же по граундам и всё. И воняет уже не сама граната, а эта p3d(думаю сделать привязку к объекту для всех просто). Ну а партикли можно какие угожно мутить через воркбенч.
Аналог "жарки" из сталкера мы собрали за минуту приколов, к примеру. На ванильных ресурсах. Дым и прочее тоже просто красить.

а, я понял, это клиент-серверным модом получается. Вариант, но товарищ, насколько знаю, хочет именно серверным модом это)

2 часа назад, paranoyk сказал:

Имею два вопроса за этот скрипт....Каким образом можно прикрутить болезнь к поражающим факторам?

Далее, есть так
Param1<string> m_MessageParam_rad = new Param1<string>("Вы находитесь под воздействием радиации!");
 GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam_rad, true, player.GetIdentity());

и
player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_COUGH);
Как включить временную задержку?

И.....может кто подскажет таки как спавнят рабочие дымовые шашки.
 

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

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


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

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

....а по русски,медленно и два раза,как в армии:)?

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


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

....а по русски,медленно и два раза,как в армии:)?

встал по стойке смирно, включил Notepad++ и пошел искать класс SmokeBase 😃

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


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

а, я понял, это клиент-серверным модом получается. Вариант, но товарищ, насколько знаю, хочет именно серверным модом это)

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

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


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

встал по стойке смирно, включил Notepad++ и пошел искать класс SmokeBase 😃

...."пошёл"...Бегом солдат!😁
Бориззик тут писал скрипт,но..я не понял куды его подсунуть и прочее.

И вот насчёт установки "времени"...не подскажите? А то вывод сообщения каждый пять секунд как скрипт работает...

И у меня ещё вопросы....(да,да,понял,отползаю уворачиваясь от кирпичей)


 

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


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

...."пошёл"...Бегом солдат!😁
Бориззик тут писал скрипт,но..я не понял куды его подсунуть и прочее.

И вот насчёт установки "времени"...не подскажите? А то вывод сообщения каждый пять секунд как скрипт работает...

И у меня ещё вопросы....(да,да,понял,отползаю уворачиваясь от кирпичей)


 

ну собственно как просили сами 😁
а насчет времени это надо думать, мозга включать, да дописывать код ручками. Например, писать метку в память сервера, мол этот игрок уже в статусе 'в зоне такой то', и если метка есть - повторно не слать. Ну и от обратного соответственно если надо.

Вечером выложу скриптик на торговую за скромные 'на пиво' с такой реализацией готовой, если вдруг уж сильно надо. Собственно, писал тебе в личке о нем раньше. Ну, или так даже..... Надо подумать....

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

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


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

Дык я за пиво завсегда!
счас вот сижу пока "дистанционное обучение" идёт голову заоодно ломаю.
 

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


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

подскажите, почему при таком раскладе
 

Name            = "Balota2"; //газ 2 level
        Id                 = 12;
        Center             = "3551 0 8277";
        Radius            = 750.0;
        Type            = 4;
        WarnMsg            = "Чувствую запах химических испарений... Мне нужна полная защита...";
        EnterMsg        = "";
        Msg                = "";
        ExitMsg            = "";
        player_Symptom     = SymptomIDs.SYMPTOM_VOMIT; // SymptomIDs.SYMPTOM_COUGH;
        itemsComplect     = {"AirborneMask","alp_GasMaskCamo","JKRNBCPantsGray","JKRNBCJacketGray","NBCJacketGray","NBCHoodGray","NBCGlovesGray","NBCPantsGray","NBCBootsGray","MassNBCglovesBlue","MassNBCJacketYellow","MassNBCpantsYellow","MassNBCbootsYellow","MassNBChoodYellow","BP2_NBCGlovesBlue","BP2_NBCHoodOrange","BP2_NBCP_Orange","BP2_NBCJ_Orange","BP2_NBCBootsOrang","alp_NBCJacketCamo","alp_NBCPantsCamo","alp_NBCHoodCamo","alp_NBCBootsCamo","alp_NBCGlovesCamo"};
        playerSlots        = {"Mask","Headgear","Gloves","Body","Legs","Feet"};
        AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);

перс все равно блюёт и получает урон. Весь комплект  на нем одет: "AirborneMask","NBCJacketGray","NBCHoodGray","NBCGlovesGray","NBCPantsGray","NBCBootsGray"

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


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

подскажите, почему при таком раскладе
 

Name            = "Balota2"; //газ 2 level         Id                 = 12;         Center             = "3551 0 8277";         Radius            = 750.0;         Type            = 4;         WarnMsg            = "Чувствую запах химических испарений... Мне нужна полная защита...";         EnterMsg        = "";         Msg                = "";         ExitMsg            = "";         player_Symptom     = SymptomIDs.SYMPTOM_VOMIT; // SymptomIDs.SYMPTOM_COUGH;         itemsComplect     = {"AirborneMask","alp_GasMaskCamo","JKRNBCPantsGray","JKRNBCJacketGray","NBCJacketGray","NBCHoodGray","NBCGlovesGray","NBCPantsGray","NBCBootsGray","MassNBCglovesBlue","MassNBCJacketYellow","MassNBCpantsYellow","MassNBCbootsYellow","MassNBChoodYellow","BP2_NBCGlovesBlue","BP2_NBCHoodOrange","BP2_NBCP_Orange","BP2_NBCJ_Orange","BP2_NBCBootsOrang","alp_NBCJacketCamo","alp_NBCPantsCamo","alp_NBCHoodCamo","alp_NBCBootsCamo","alp_NBCGlovesCamo"};         playerSlots        = {"Mask","Headgear","Gloves","Body","Legs","Feet"};         AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);


Name            = "Balota2"; //газ 2 level
        Id                 = 12;
        Center             = "3551 0 8277";
        Radius            = 750.0;
        Type            = 4;
        WarnMsg            = "Чувствую запах химических испарений... Мне нужна полная защита...";
        EnterMsg        = "";
        Msg                = "";
        ExitMsg            = "";
        player_Symptom     = SymptomIDs.SYMPTOM_VOMIT; // SymptomIDs.SYMPTOM_COUGH;
        itemsComplect     = {"AirborneMask","alp_GasMaskCamo","JKRNBCPantsGray","JKRNBCJacketGray","NBCJacketGray","NBCHoodGray","NBCGlovesGray","NBCPantsGray","NBCBootsGray","MassNBCglovesBlue","MassNBCJacketYellow","MassNBCpantsYellow","MassNBCbootsYellow","MassNBChoodYellow","BP2_NBCGlovesBlue","BP2_NBCHoodOrange","BP2_NBCP_Orange","BP2_NBCJ_Orange","BP2_NBCBootsOrang","alp_NBCJacketCamo","alp_NBCPantsCamo","alp_NBCHoodCamo","alp_NBCBootsCamo","alp_NBCGlovesCamo"};
        playerSlots        = {"Mask","Headgear","Gloves","Body","Legs","Feet"};
        AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);

перс все равно блюёт и получает урон. Весь комплект  на нем одет: "AirborneMask","NBCJacketGray","NBCHoodGray","NBCGlovesGray","NBCPantsGray","NBCBootsGray"

стесняюсь спросить, а это вообще из какого скрипта то? Не нахожу скриптов с именно таким конфигом. Да и количество параметров в AddZone настораживает, помнится когда делал более 9 движок ругался при компиляции на запуске

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

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


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

из какого скрипта то?

так из этой темы взят, вот все работает, кроме "химических" испарений.  В смысле если требовать только противогаз
 

player_Symptom     = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
        itemsComplect     = {"AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS"};
        playerSlots        = {"Mask"};

то, работает корректно.

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


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

так из этой темы взят, вот все работает, кроме "химических" испарений.  В смысле если требовать только противогаз
 

player_Symptom     = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;         itemsComplect     = {"AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS"};         playerSlots        = {"Mask"};


player_Symptom     = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
        itemsComplect     = {"AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS"};
        playerSlots        = {"Mask"};

то, работает корректно.

тогда или ссылку на пост, код с которого юзается, или сам код всего файла, так как то что в шапке явно отличается от вашего)

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


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

сам код всего файла

Скрытый текст

//AUTHOR: elanc s-platoon.ru
//EDITOR: BORIZZ.K s-platoon.ru
//VERSION: 29.04.2019.1355

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

class Zone //Этот Класс используется для хранения параметров зон - для каждой зоны создается свой экземпляр класса //Zone container. Instance for each zone - see AddZone functions ( ref Zone zone	= new ref Zone; )
{
	//Переменные класса: 22 параметра и 1 массив игроков в зоне
	//Зона
	string						name; //имя зоны 
	int 						id; //номер зоны
	vector 						center; //центр зоны
	float 						radius; //радиус зоны
	int 						type; //тип зоны (см ZoneTypeRad)
	//Приближение к зоне
	float 						warndistance; //расстояние приближения к зоне - если 0 сообщения не выводятся - warnenabled = false;
	bool 						warnenabled; //
	string 						warnmessage; //сообщение при нахождении рядом с зоной (по warndistance)
	//Вход в зону
	bool						entermsgenabled; //вкл/выкл сообщение при входе в зону
	string 						entermessage; //сообщение при входе в зону
	//Нахождение в зоне
	bool						messageenabled; //вкл/выкл сообщенияе при нахождении в зоне
	string 						message; //сообщение при нахождении в зоне
	int							repeatmsgstep; //Шаг повтрения сообщений в зоне //in pogress // если repeatmsg = true и repeatstep = 0 - поторения не будет, repeatstep = 1 - повторение каждую итерацию и тп - 0 - повторения отключены - repeatmsg = false;
	bool						repeatmsg;
	//Выход из зоны
	bool 						exitmessageenabled; //вкл/выкл сообщение о выходе из зоны
	string 						exitmessage; //сообщение о выходе из зоны
	//Дамаг игроку и симптомы
	float 						player_Dmg_Coef; //коэффициент повреждения для игрока
	float 						player_Health_Threshold_Symptom; //порог здоровья после которого применяются симптомы
	int							player_Symptom; //симпотом для данной зоны
	//Комплект экипировки для проверки
	ref TStringArray			complect; //комплект вещей для проверки //in pogress //массив требует инициализации - создании его экземпляра (complect = new TStringArray	;) для каждого экземпляра - иначе он бощий
	ref TStringArray			checkslots; //слоты для проверки

	//Дамаг экипировке
	float 						item_Dmg_Coef; //коэффициент повреждения для вещей игрока
	float 						item_Health_Threshold; //порог здоровья для вещи после которого начинается наноситься урон персу игрока
	//Игроки в зоне
	ref map<PlayerBase, int> 	playersInZone; //массив - игроки находящиеся в данной зоне //1 - player, 2 - player id  //массив требует инициализации - создании его экземпляра (playersInZone	=	new map<PlayerBase, int>;) для каждого экземпляра

	int							repeatMessagesCurrentStep;
	bool						messageSkip;

	void Zone() //Это конструктор. При создании нового экземляра "зоны" он будет выполняться. И в нем будет инициализироваться создание 2х массивов для этого экземпляра
	{
		Print("::: SERVER: [ZonesClass.c DEBUG]: 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: [ZonesClass.c DEBUG]: Zone: new playersInZone array init: " + playersInZone.ToString());
		// Массив типа TString: он поддерживает методы Insert, Romove и Contains. Обычный массив методы Remove и Contsins не поддерживает.
		complect		=	new TStringArray; //Создание экземпляра в конкретном экземпляре класса //Комплект
		checkslots		=	new TStringArray; //Создание экземпляра в конкретном экземпляре класса //Слоты для проверки
		repeatMessagesCurrentStep = 0;
		messageSkip = false;
		Print("::: SERVER: [ZonesClass.c DEBUG]: Zone: new 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_Zones_Debug_Msg		=	false;
	bool				my_SafeZone_Debug		=	true;
	bool				my_PvpZone_Debug		=	true;
	bool				my_GasZone_Debug		=	true;
	bool				my_ChemZone_Debug		=	true;
	bool				my_BioZone_Debug		=	true;
	bool				my_RadZone_Debug		=	true;
	bool				my_DamageZone_Debug		=	true;
	bool 				my_Zone_Debug			=	true;
	int 				zone_Check_Timer		=	12; //Seconds
	bool				zone_Damage_Debug_Msg	=	false;

	void ZonesClass()
	{
		Print("::: SERVER: [ZonesClass]: Init.");
		ZonesInit();
		Print("::: SERVER: [ZonesClass]: Init end.");
	}
	
	void ~ZonesClass()
	{
		Print("::: SERVER: [ZonesClass]: UnInit.");
	}
	
	void ZonesInit()
	{
		Print("::: SERVER: [ZonesClass.c DEBUG]: ZonesInit(): BEGIN.");
		
		//Default params:

		//Зона
		string 			Name;																	//1
		int 			Id 									= 	0;								//2
		vector 			Center								=	vector.Zero;					//3
		float 			Radius								=	0.0;							//4
		int 			Type 	 							= 	ZoneTypeRad.DAMAGE; // = 7			//5
		//Приближение к зоне
		float			WarnDist							=	52;								//6
		string			WarnMsg								= 	"Кажется я рядом с опасной зоной... Мне нужна защита...";	//7 //"Вы рядом с опасной зоной!"
		//Вход в зону
		string			EnterMsg							= 	"Хм... Кажется я вошел в опасную зону...";		//8 //"Вы вошли в опасную зону!"
		//Нахождение в зоне
		string			Msg									= 	"Я в опасной зоне...";			//9 //"Вы в опасной зоне!"
		int				RepeatMsgStep						=	3;								//10
		//Выход из зоны
		string			ExitMsg								= 	"Я покинул опасную зону...";	//11 "Вы покинули опасную зону!"
		//Дамаг игроку и симптомы
		float			player_Dmg_Coef						=	0.432;							//12 //Per second // 0.332 - Radio // 0.221 - Others //0.160 - test
						player_Dmg_Coef						=	player_Dmg_Coef * zone_Check_Timer;
		float			player_Health_Threshold_Symptom		=	100.0;							//13
		int				player_Symptom						=	SymptomIDs.SYMPTOM_COUGH; 		//14 // Class SymptomIDs - variable SYMPTOM_COUGH (кашель) // = 1
		//Комплект экипировки для проверки и слоты для проверки в данной зоне
		TStringArray	itemsComplect						=	{};								//15
		TStringArray	playerSlots							=	{};								//16
		//Дамаг экипировке
		float			item_Dmg_Coef						=	0.015;							//17 //Per Second // 0.050 - Radio // 0.031 - Others
						item_Dmg_Coef						=	item_Dmg_Coef * zone_Check_Timer;
		float			item_Health_Threshold				=	50.0;							//18

		/*
			"GP5GasMask","GasMask","PKM_MASK","Massblackgp5","NBCJacketGray","NBCHoodGray","NBCGlovesGray","NBCPantsGray","NBCBootsGray","MassNBCglovesBlue","MassNBCJacketYellow","MassNBCpantsYellow","MassNBCbootsYellow","MassNBChoodYellow"
		*/
		
		/*
		Params:
		1  	- zone name
		2  	- zone id
		3  	- zone center position
		4  	- zone radius
		5  	- zone type number (see enum ZoneTypeRad)
		6  	- warning distance, if 0 - warning disabled
		7  	- warning message during the approach to the zone
		8 	- message on enter to zone, if null - disabled
		9 	- zone message for player, if null - disabled
		10	- zone message repeat steps, if 0 - repeat message disabled
		11 	- exit zone message, if null - disabled
		12 	- damage coefficient for player
		13 	- player start symptoms threshold
		14	- symptom for player in current zone / add to player if health < damage coefficient for player
		15 	- items complect for check //for future
		16	- slots for check in zone
		17	- damage coefficient for items //for future
		18 	- item health threshold for start damage player	
		*/
		//В последствии мы не будем создавать зоны построчно, а будем читать их из файла (.json) и создавать в цикле.
		
		Name			= "AES STATION"; //газ 1 level 
		Id 				= 1;
		Center 			= "4793 0 7078";
		Radius			= 455.0;
		WarnMsg			= "";
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"GP5GasMask","GasMask","Massblackgp5","BP2_Gas_mask","mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		playerSlots		= {"Mask"};
	  	AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);
		
		Name			= "Voenka"; //газ 1 level 
		Id 				= 2;
		Center 			= "6681 0 6898";
		Radius			= 305.0;
		WarnMsg			= "";
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"GP5GasMask","GasMask","Massblackgp5","BP2_Gas_mask","mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		playerSlots		= {"Mask"};
	  	AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);
		
		Name			= "AirPort Milo"; //газ 2 level
		Id 				= 3;
		Center 			= "5512 0 3463";
		Radius			= 795.0;
		WarnMsg			= "";
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		playerSlots		= {"Mask"};
		AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);
		
		Name			= "Paris"; //газ 3 level
		Id 				= 4;
		Center 			= "2896 0 3979";
		Radius			= 605.0;
		WarnMsg			= "";
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		playerSlots		= {"Mask"};
		AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);
		
		Name			= "Balota"; //газ 2 level
		Id 				= 5;
		Center 			= "3676 0 8832";
		Radius			= 505.0;
		WarnMsg			= "";
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_COUGH;
		itemsComplect 	= {"mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		playerSlots		= {"Mask"};
		AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);
		
		Name			= "Oceanville"; //газ 1 level
		Id 				= 6;
		Center 			= "10072 0 4125";
		Radius			= 2155.0;
		WarnMsg			= "ВНИМАНИЕ: ВЫ ПРИБЛИЖАЕТЕСЬ К ОПАСНОЙ ЗОНЕ";
		EnterMsg		= "ВНИМАНИЕ: ВЫ ВОШЛИ В ОПАСНУЮ ЗОНУ";
		Msg				= "ВНИМАНИЕ: ВЫ НАХОДИТЕСЬ В ОПАСНОЙ ЗОНЕ. ЗДЕСЬ ВАС МОГУТ УБИТЬ";
		ExitMsg			= "ВНИМАНИЕ: ВЫ ПОКИНУЛИ ОПАСНУЮ ЗОНУ";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"GP5GasMask","GasMask","Massblackgp5","BP2_Gas_mask","mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		playerSlots		= {"Mask"};
		AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);
		
				
		Name			= "Mountain"; //газ 3 level
		Id 				= 7;
		Center 			= "7168 0 11683";
		Radius			= 605.0;
		WarnMsg			= "";
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		playerSlots		= {"Mask"};
		AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);
		
		Name			= "AREA42"; //газ 3 level
		Id 				= 8;
		Center 			= "12300 0 9917";
		Radius			= 1705.0;
		WarnMsg			= ""; //Чувствую запах химических испарений... Мне нужна полная защита...
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		playerSlots		= {"Mask"};
		AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);
						
		Name			= "Prison"; //газ 1 level
		Id 				= 9;
		Center 			= "5442 0 856";
		Radius			= 295.0;
		WarnMsg			= "";
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"GP5GasMask","GasMask","Massblackgp5","BP2_Gas_mask","mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		playerSlots		= {"Mask"};
	  	AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);
		
		Name			= "Forest"; //газ 1 level
		Id 				= 10;
		Center 			= "5464 0 5305";
		Radius			= 1005.0;
		WarnMsg			= "";
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"GP5GasMask","GasMask","Massblackgp5","BP2_Gas_mask","mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		playerSlots		= {"Mask"};
	  	AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);
		
		Name			= "NEFT"; //газ 2 level 
		Id 				= 11;
		Center 			= "1681 0 12717";
		Radius			= 155.0;
		WarnMsg			= "";
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
	  	AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);

		/* Name			= "Zeleno"; //химия 
		Id 				= 3;
		Center 			= "2530 0 5112";
		Radius			= 150.0;
		WarnMsg			= "Чувствую запах химических испарений... Мне нужна полная защита...";
		EnterMsg		= "Я кажется я вошел отравленную зону...";
		Msg				= "Я в отравленной зоне...";
		ExitMsg			= "Я покинул отравленню зону...";
		player_Symptom 	= SymptomIDs.SYMPTOM_VOMIT; // SymptomIDs.SYMPTOM_COUGH;
		itemsComplect 	= {"AirborneMask","alp_GasMaskCamo","JKRNBCPantsGray","JKRNBCJacketGray","NBCJacketGray","NBCHoodGray","NBCGlovesGray","NBCPantsGray","NBCBootsGray","MassNBCglovesBlue","MassNBCJacketYellow","MassNBCpantsYellow","MassNBCbootsYellow","MassNBChoodYellow","BP2_NBCGlovesBlue","BP2_NBCHoodOrange","BP2_NBCP_Orange","BP2_NBCJ_Orange","BP2_NBCBootsOrang","alp_NBCJacketCamo","alp_NBCPantsCamo","alp_NBCHoodCamo","alp_NBCBootsCamo","alp_NBCGlovesCamo"};
		playerSlots		= {"Mask","Headgear","Gloves","Body","Legs","Feet"};
		AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);
		
		Name			= "Myshkino"; //химия 
		Id 				= 4;
		Center 			= "332 0 9368";
		Radius			= 100.0;
		WarnMsg			= "Чувствую запах химических испарений... Мне нужна полная защита...";
		EnterMsg		= "Я кажется я вошел отравленную зону...";
		Msg				= "Я в отравленной зоне...";
		ExitMsg			= "Я покинул отравленню зону...";
		player_Symptom 	= SymptomIDs.SYMPTOM_VOMIT; // SymptomIDs.SYMPTOM_COUGH;
		itemsComplect 	= {"GP5GasMask","GasMask","PKM_MASK","Massblackgp5","NBCJacketGray","NBCHoodGray","NBCGlovesGray","NBCPantsGray","NBCBootsGray","MassNBCglovesBlue","MassNBCJacketYellow","MassNBCpantsYellow","MassNBCbootsYellow","MassNBChoodYellow"};
		playerSlots		= 	{"Mask","Headgear","Gloves","Body","Legs","Feet"};
		AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);
		
		Name			= "Troitskoe"; //газ
		Id 				= 5;
		Center 			= "7893 0 14689";
		Radius			= 300.0;
		WarnMsg			= "Чувствую запах ядовитого газа... Мне нужен противогаз...";
		EnterMsg		= "Я кажется я вошел загазованную зону...";
		Msg				= "Я в загазованной зоне...";
		ExitMsg			= "Я покинул загазованную зону...";
		player_Symptom	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"GP5GasMask","GasMask","PKM_MASK","Massblackgp5"};
		playerSlots		= {"Mask"};
		AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);

		Name							= "Tisy"; //Радиация
		Id 								= 6;
		Center 							= "1600 0 14030";
		Radius							= 600.0;
		WarnMsg							= "Кажется я рядом с радиоактивной зоной... Мне нужна полная защита...";
		EnterMsg						= "Я кажется я вошел в радиоактивную зону...";
		Msg								= "Я в радиоактивной  зоне...";
		ExitMsg							= "Я покинул радиоактивную зону...";
		player_Dmg_Coef 				= 0.175; //Per second
		player_Dmg_Coef					= player_Dmg_Coef * zone_Check_Timer;
		player_Health_Threshold_Symptom	= 50.0;
		player_Symptom 					= SymptomIDs.SYMPTOM_VOMIT; // SymptomIDs.SYMPTOM_COUGH; //Primary symptom
		itemsComplect 					= {"GP5GasMask","GasMask","PKM_MASK","Massblackgp5","NBCJacketGray","NBCHoodGray","NBCGlovesGray","NBCPantsGray","NBCBootsGray","MassNBCglovesBlue","MassNBCJacketYellow","MassNBCpantsYellow","MassNBCbootsYellow","MassNBChoodYellow"};
		playerSlots						= {"Mask","Headgear","Gloves","Body","Legs","Feet"};
		item_Dmg_Coef	 				= 0.031; //Per second //0.054
		item_Dmg_Coef					= item_Dmg_Coef * zone_Check_Timer;
		item_Health_Threshold			= 40.0;
		AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold); */

		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckZones, zone_Check_Timer * 1000, true);
		
		Print("::: SERVER: [ZonesClass.c DEBUG]: ZonesInit(): END.");
	}

	void AddZone(string Name, int Id, vector Center, float Radius, int Type, float WarnDist, string WarnMsg, string EnterMsg, string Msg, int RepeatMsgStep, string ExitMsg, float player_Dmg_Coef, float player_Health_Threshold_Symptom, int player_Symptom, TStringArray itemsComplect, TStringArray playerSlots, float item_Dmg_Coef, float item_Health_Threshold)
	{
		ref Zone zone 							= new ref Zone; //создается новый экземпляр класса Zone - указатель на экземпляр - переменная zone
		
		zone.name 								= Name; //имя зоны 1
		zone.id 								= Id; //номер зоны 2 
		Center[1]								= GetGame().SurfaceY(Center[0], Center[2]); // Поверхность
		zone.center								= Center; //центр зоны 3
		zone.radius 							= Radius; //радиус зоны 4
		zone.type 								= Type; //тип зоны (см ZoneTypeRad) 5
		if (WarnDist > 0)						{zone.warndistance	= Radius + WarnDist; zone.warnenabled = true;} else {zone.warndistance = 0; zone.warnenabled = false; } //расстояние приближения к зоне  + //вкл/выкл сообщения о приблежении к зоне 6
		zone.warnmessage						= WarnMsg; //сообщение при приблежении к зоне 7
		zone.entermessage						= EnterMsg; //вкл/выкл сообщение при входе в зону 8
		if (!EnterMsg)							{zone.entermsgenabled = false;} else {zone.entermsgenabled = true;} //вкл/выкл сообщение при входе в зону
		zone.message							= Msg; //сообщение при нахождении в зоне 9
		if (!Msg)								{zone.messageenabled = false;} else {zone.messageenabled = true;} //вкл/выкл сообщение при нахождении в зоне
		zone.repeatmsgstep						= RepeatMsgStep; //повторяющиеся в зоне сообщения - шаг, сколько итераций пропускать перед выводом сообщения 10
		if (RepeatMsgStep > 0) 					{zone.repeatmsg = true;} else {zone.repeatmsg = false;} //вкл/выкл повторяющиеся в зоне сообщения
		zone.exitmessage						= ExitMsg; //сообщение выходе из зоны 11
		if (!ExitMsg)							{zone.exitmessageenabled = false;} else {zone.exitmessageenabled = true;}; //вкл/выкл сообщение выходе из зоны
		zone.player_Dmg_Coef 					= player_Dmg_Coef; //коэффициент повреждения для игрока 12
		zone.player_Health_Threshold_Symptom 	= player_Health_Threshold_Symptom; //порог здоровья после которого применяются симптомы 13
		zone.player_Symptom						= player_Symptom; //симпотом для данной зоны 14
		zone.complect 							= itemsComplect; //комплект вещей для проверки 15
		zone.checkslots							= playerSlots;	//Слоты для проверки 16
		zone.item_Dmg_Coef 						= item_Dmg_Coef; //коэффициент повреждения для вещей игрока 17
		zone.item_Health_Threshold 				= item_Health_Threshold; //порог здоровья для вещи после которого начинается нанесение урона персу игрока 18

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

		Print("::: SERVER: [ZonesClass.c DEBUG]: AddZone: zone.name: " + zone.name + ", zone.id: " + zone.id + ", zone.center: " + zone.center + ", zone.radius: " + zone.radius + ", type: " + zone.type + ", player_Dmg_Coef: " + zone.player_Dmg_Coef + ", player_Health_Threshold_Symptom: " + zone.player_Health_Threshold_Symptom + ", player_Symptom: " + zone.player_Symptom + ", item_Dmg_Coef: " + zone.item_Dmg_Coef + ", item_Health_Threshold: " + zone.item_Health_Threshold);
		Print("::: SERVER: [ZonesClass.c DEBUG]: AddZone: Complet items count: " + zone.complect.Count() + ", slots for check count: " + zone.checkslots.Count());
		Print("::: SERVER: [ZonesClass.c DEBUG]: AddZone: zone.warnenabled: " + zone.warnenabled.ToString() + ", zone.entermsgenabled = " + zone.entermsgenabled.ToString() + ", zone.messageenabled = " + zone.messageenabled.ToString() + ", zone.repeatmsg = " + zone.repeatmsg.ToString() + ", zone.exitmessageenabled = " + zone.exitmessageenabled.ToString());
	}
	
	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 (zone.repeatmsgstep > 1)
		{
			if (zone.repeatMessagesCurrentStep >= zone.repeatmsgstep)
			{
				zone.repeatMessagesCurrentStep = 0;
			}
			if (zone.repeatMessagesCurrentStep == 0)
			{
				zone.messageSkip = false;	
			}
			else
			{
				zone.messageSkip = true;
			}
			zone.repeatMessagesCurrentStep++;
		}

		if (zone.playersInZone.Count() > 2048) zone.playersInZone.Clear();
		
		if (!player.IsAlive() || !player.GetIdentity() ) //Player dead or disconnect/lost control
		{
			if (zone.playersInZone.Contains(player)) zone.playersInZone.Remove(player);
			return false;
		} 
		
		if ( zone.warnenabled && (vector.Distance(player.GetPosition(), zone.center) > zone.radius) && (vector.Distance(player.GetPosition(), zone.center) < zone.warndistance) )
		{
			if (!zone.messageSkip && !zone.playersInZone.Contains(player)) 
			{
				SendZoneMessage(player, zone.warnmessage);
			}
		}
		if ( vector.Distance(player.GetPosition(), zone.center) <= zone.radius )
		{
			//0:
			if (my_Zones_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: InZone: Player: " + player.GetIdentity().GetName() + "0.0: InZone zone.repeatMessagesCurrentStep = " + zone.repeatMessagesCurrentStep + " : zone.messageSkip: " + zone.messageSkip);
			if (!zone.playersInZone.Contains(player)) //1:
			{
				if (my_Zones_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: InZone: Player: " + player.GetIdentity().GetName() + ", 1.0: 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.1: zone.playersInZone.Contains(player) = " + zone.playersInZone.Contains(player));
					Print("::: SERVER: [ZonesClass.c DEBUG]: InZone: Player: " + player.GetIdentity().GetName() + ", 1.2: entering zone.name: " + zone.name);
					if (my_Zones_Debug_Msg) SendZoneMessage(player, "1.0: InZone enter Zone: " + zone.name + " : " + zone.entermessage);
				}
				if (zone.entermsgenabled) SendZoneMessage(player, zone.entermessage);
			}
			else
			{
					if (zone.messageenabled && !zone.messageSkip) SendZoneMessage(player, zone.message);
			}
			switch(zone.type)
			{
				case 1: //SAFE
				{
					SafeZone(player, zone);
				break;
				}
				case 2: //PVP
				{
					PvpZone(player, zone);
				break;
				}

				case 3: // GAS
				case 4: // CHEM
				case 5: // BIO
				case 6: // RAD
				case 7: //DAMAGE UNIVERSAL
				{
					DamageZone(player, zone);
				break;
				}
			}
		return true;
		}
		else
		{
			if (zone.playersInZone.Contains(player)) //2:
			{
				if (my_Zones_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: InZone: Player: " + player.GetIdentity().GetName() + ", 2.0: 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.1: leaving zone.name: " + zone.name);
					Print("::: SERVER: [ZonesClass.c DEBUG]: InZone: Player: " + player.GetIdentity().GetName() + ", 2.2: zone.playersInZone.Contains(player) = " + zone.playersInZone.Contains(player));
					if (my_Zones_Debug_Msg) SendZoneMessage(player, "2.0: InZone exit Zone: " + zone.name + " : " + zone.exitmessage);
				}
				if (zone.exitmessageenabled) SendZoneMessage(player, zone.exitmessage);
			}
			return false;
		}
	}	

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

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

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

	void ChemZone(PlayerBase player, ref Zone zone)
	{
	}
	
	void BioZone(PlayerBase player, ref Zone zone)
	{
	}

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

	void DamageZone(PlayerBase player, ref Zone zone)
	{
		EntityAI attachment;
		ItemBase item;
		
		float 			player_Dmg_Coeficient				= 0;									//Стартовое значение урона для игрока
		float 			player_Health;																//Сюда вернём "здоровье" игрока
		float 			Item_Health;																//Сюда вернём "здоровье" проверяемого предмета
		
		array<ItemBase> player_Items						= new array<ItemBase>;					//Тут будут <класснейм,вещичка> игрка
		int				player_Complect_Count				= 0;									//Количество вещичек комплекта соответствующих комплекту зоны
		bool			damageToPlayer 						= false;								//По умолчанию ущерб отключен
		bool			findComplect						= false;								//Комплект же еще не прочитан
		bool			findPlayerItem						= false;								//Вещички же еще не найдены
		bool			CurDamagMsg							= false;
		
		
		if (my_DamageZone_Debug) 
		{
			Print("::: SERVER: [ZonesClass.c DEBUG]: DamageZone: Player: " + player.GetIdentity().GetName() + ", zone.name: " + zone.name + ", zone.type = " + zone.type + ", zone.complect.Count() = " + zone.complect.Count());
		}
		
		//=======================================================================================================================================================================================================================
		if (zone.complect.Count() > 0) //Комплект содержит что-то?
		{ //..Да! Проверяем. Ибо если комплект не указан, то и проверять смысла нет, защититься в этой зоне нечем или дамаг для нее 0 и она только сообщуги выводит
			findComplect = true; //Комплект определен
			for (int i = 0; i < zone.checkslots.Count(); i++) //Проходимся по слотам игрока для этой зоны
			{
				attachment = player.FindAttachmentBySlotName(zone.checkslots[i]); //получаем содержимое очередного слота
				if (attachment && attachment.IsItemBase()) //Аттачка не НУЛЛ и относится к классу вещичек
				{   //Да!
					player_Items.Insert(ItemBase.Cast(attachment)); //Собираем все в массивчик что бы потом не крутить лишних циклов по игроку
				}
				else
				{
					player_Items.Insert(NULL); //В слоте пусто? запихивам туда же
				}
			}
			if (player_Items.Count() > 0) //Вещички есть?
			{//..Да! Проверяем вещички
				for (i = 0; i < player_Items.Count(); i++) //проходимся по комплекту игрока
				{
					findPlayerItem = false; //Флаг по умолчанию - Вещичка пока не найдена
					if (player_Items[i] && zone.complect.Find(player_Items[i].GetType()) >= 0) //Вещичка найдена (вещичка не NULL и ее класснейм есть в комплекте) ? (player_Items[i] - выше могли и NULL запихать - тогда значицо слот тот пустой и значицо комплет неполный)
					{ //..Да!
						findPlayerItem = true; //Флаг - Вещичка найдена
						player_Complect_Count++; //Временный подсчет
						if (my_DamageZone_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: DamageZone: Found complect item in: " + zone.checkslots[i] + ": " + player_Items[i].GetType());
						
						if ( zone.item_Dmg_Coef > 0 )
						{
							Item_Health = player_Items[i].GetHealth(); //Возвращаем значение "здоровья" вещички в переменную Item_Health
							Item_Health = Item_Health - zone.item_Dmg_Coef; //Декримент состояния вещички
							player_Items[i].SetHealth(Item_Health); //Устанавливаем новое состояние вещички
							player.SetSynchDirty(); //синхр / без этого игрок не всегда видит как его предмет дамажится
						}
						if (Item_Health <= zone.item_Health_Threshold) //Если значение "здоровья" вещички ниже равно порогу, заданному в переменной item_Health_Threshold...
						{//...то
							damageToPlayer = true; //ущербу быть!
							if (zone.messageenabled && !zone.messageSkip && !CurDamagMsg)
							{
								SendZoneMessage(player, "Защита изношена!");
								CurDamagMsg = true; //повторять вывод сообщения будем только 1 раз, а не для каждой вещички
							}
							if (my_DamageZone_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: DamageZone: Item_Health less then item_Health_Threshold: " + Item_Health + ", player damage enabled.");
						}
					} //Нет, ищем дальше / комплект для зоны может быть меньше чем вещичек игрока - например может быть один противогаз
					else
					{ // Вещичка не найдена!
						if (my_DamageZone_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: DamageZone: Not found complect item in: " + zone.checkslots[i]);
					}	
					
					if (!findPlayerItem) //Вещичку не нашли - комплект не полный
					{
						findComplect = false;
						damageToPlayer = true;  //ущербу быть!
						break; //Зачем проверять остальное // хотя может и есть смысл - ради дамага других вещичек - тогда прерывать не будем
					}//переходим к следующему классу из комплекта // надо еще поискать и отдамажить остальные
				}
				if (!findComplect) //оставил это на всяк случай
				{
					damageToPlayer = true; //ущербу быть!
					if (zone.messageenabled && !zone.messageSkip) SendZoneMessage(player, "Вы без противогаза!");
				}
			}
			else
			{//.. Вещичек Нет!
				findComplect = false;
				damageToPlayer = true; //Ущербу быть!
				if (zone.messageenabled && !zone.messageSkip) SendZoneMessage(player, "Вы без противогаза!");
				if (my_DamageZone_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: DamageZone: Not found any items.");
			}
		}		
		else
		{ //..Комплект не указан, наносить ущерб? нет - зона в которой не нужна зашита
			damageToPlayer = false; //Ущербу не быть
		}
		//=======================================================================================================================================================================================================================
				
		if (my_DamageZone_Debug)
		{
			Print("::: SERVER: [ZonesClass.c DEBUG]: DamageZone: findComplect = " + findComplect.ToString());
			Print("::: SERVER: [ZonesClass.c DEBUG]: DamageZone: damageToPlayer = " + damageToPlayer.ToString());
		}
		
		//Усчерб ))
		if ( damageToPlayer )
		{
			if (zone.player_Dmg_Coef > 0)
			{
				player_Dmg_Coeficient = zone.player_Dmg_Coef;
				player_Health = player.GetHealth("GlobalHealth", "Health"); //получаем текущее здоровьишко
				player_Health = player_Health - player_Dmg_Coeficient; //понижаем здоровьишко
				player.SetHealth("GlobalHealth", "Health", player_Health); //Тут он может и помереть
			}
			if (player && player.IsAlive())//Если живой!!! мертвому нет смысла что-то уже делать //Вдруг он сдох только что (было такое на тесте)
			{
				if (my_DamageZone_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: DamageZone: Decrease player_Health by player_Dmg_Coef: " + player_Dmg_Coeficient + ", new health: " + player_Health);
				if (zone_Damage_Debug_Msg) SendZoneMessage(player, "Вам нанесен ущерб: " + player_Dmg_Coeficient + "!");
				if (player_Health < zone.player_Health_Threshold_Symptom + 6 && zone.messageenabled && !zone.messageSkip) SendZoneMessage(player, "Срочно оденьте противогаз!");
				if (player_Health < zone.player_Health_Threshold_Symptom) 
				{
					player.GetSymptomManager().QueueUpPrimarySymptom(zone.player_Symptom); //Тут надо поразбираться - корректно ли при каждой итерации добавлять симптом или достаточно 1 раза...
					//тут можно еще инсертить AGENT (заболевание) ... надо подумать над этой темой
					if (my_DamageZone_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: DamageZone: Add symptom: " + zone.player_Symptom);
				}
			}
		}
		else
		{
			if (findComplect && zone_Damage_Debug_Msg) SendZoneMessage(player, "Вам не нанесен ущерб. Вы защищены.");
			if (zone.messageenabled && !zone.messageSkip && findComplect) SendZoneMessage(player, "Хорошо что есть защита!");
		}
	}
	
	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)
			{
				for ( int j = 0; j < ga_zones.Count(); j++ )
				{
					if (InZone(player, ga_zones[j])) break;
				}
			}
		}
	}
}

//-------- Old zones:
		/*
		Name	= "Aero SW";
		Id 	= 5;
		Center 	= "4586 0 9533";
		Radius	= 220.0;
		player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"GP5GasMask","GasMask"};
		AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);
		
		Name	= "Aero SE";
		Id 	= 6;
		Center 	= "5177 0 9960";
		Radius	= 350.0;
		player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"GP5GasMask","GasMask"};
		AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);
		
		Name	= "Aero W";
		Id 	= 7;
		Center 	= "4228 0 10400";
		Radius	= 350.0;
		player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"GasMask"};
		AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);
		
		Name	= "Aero E";
		Id 	= 8;
		Center 	= "4785 0 10530";
		Radius	= 250.0;
		player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"GP5GasMask","GasMask"};
		AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);
		
		Name	= "Aero N";
		Id 	= 9;
		Center 	= "4290 0 10956";
		Radius	= 250.0;
		player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"GasMask"};
		AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);
		*/
//--------

 

 

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

    • Автор: 123new
      Автор скрипта: http://s-platoon.ru/profile/48-nonameultima/
      Все благодарности за этот скрипт непосредственно автору скрипта, не мне!
       
      В данной теме, расскажу как сделать зараженные газом области на карте.
      Автор: NoNameUltima
      1. Открываем на сервере файл: missionServer.c
      2. После строки:
      GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(this.UpdatePlayersStats, 30000, true); Добавляем:
      GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(this.GAS_ZONE_TRIGGER, 10000, true); *10000 - Время в мс(10 секунд). С такой частотой будет наноситься урон в данной области.
      После строки:
      GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).Remove(this.UpdatePlayersStats); Добавляем:
      GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).Remove(this.GAS_ZONE_TRIGGER); Ищем строку:
      void UpdatePlayersStats() Вставляем ВЫШЕ нее, следующий код:
      void GAS_ZONE_TRIGGER() { /* GAS_ZONE_TRIGGER Автор: NoNameUltima skype: hf-trade */ // Зараженные зоны TVectorArray gas_points = {"13249 0 3962", "6389 0 2683", "6612 0 2561"}; // Массив намордников TStringArray gas_masks = {"GasMask", "GP5GasMask"}; // Радиус зон int radius = 350; // Наносимый урон float damage_value = 10; ref array<Man> players = new array<Man>; GetGame().GetPlayers( players ); PlayerBase player; vector position_player; int x; bool isGasMask; int attCount; int attIdx; EntityAI attachment; ItemBase item; string className; float damage_player; for (int i = 0; i < players.Count(); i++) { Class.CastTo(player, players.Get(i)); position_player = player.GetPosition(); for (x = 0; x < gas_points.Count(); x++) { if ( (vector.Distance(position_player, gas_points.Get(x))) < radius ) { isGasMask = false; attCount = player.GetInventory().AttachmentCount(); for (attIdx = 0; attIdx < attCount; attIdx++) { attachment = player.GetInventory().GetAttachmentFromIndex(attIdx); if ( attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( gas_masks.Find(className) >= 0 ) { //Print ("Намордник найден!"); isGasMask = true; break; } } } if (isGasMask == false) { //Print ("Намордник не найден!"); damage_player = player.GetHealth("GlobalHealth", "Health"); player.SetHealth("GlobalHealth", "Health", damage_player - damage_value); } } } } } P.S.
      1. Так же можно изменить формат массива, и сделать зоны с разным радиусом
      2. Можно при желании добавить вывод оповещения, в зараженных зонах.
      *Скрипт предоставлен мной, в обрезанном виде намерено - остальное на Ваш вкус и цвет
      Изменено 4 октября пользователем NoNameUltima
       
      Добавлено от 123new:
      Файл missionServer.c располагается в {папка сервера}\scripts\5_Mission\MissionServer\missionServer.c
      Если у вас нет папки scripts в папке с сервером игры, откройте папку dta, распакуйте папку scripts из pbo-файла scripts.pbo и переместите в папку с сервером.
      Чтобы папка считывалась сервером, необходимо добавить параметр запуска сервера '-FilePatching'.
      P.S. Гайд не проверялся на актуальной версии серверной части игры со steam!
    • Автор: NotMeyson404
      Создал триггер в редакторе, что бы при заходе в область триггера играла музыка (Проверил в редакторе все работате на ура), сохранил как положено, закинул все файлы на сервер arma 3 epoch, и не работает ничего, пол дня провозился....подскажите как быть?
       
      class Item130
      {
      dataType="Trigger";
      position[]={7850.2622,17.753777,11198.521};
      angle=4.7678905;
      class Attributes
      {
      onActivation="1 fadeMusic 1; playMusic ""sidr11"";";
      onDeactivation="1 fadeMusic 0;";
      sizeA=3;
      sizeB=7;
      sizeC=4;
      repeatable=1;
      activationBy="ANY";
      isRectangle=1;
      isServerOnly=1;
      };
      id=40;
      type="EmptyDetectorArea10x10";
      atlOffset=-0.052999496;
      };
      class Item131
      {
      dataType="Trigger";
      position[]={7853.6118,17.391575,11197.52};
      angle=4.6931028;
      class Attributes
      {
      onActivation="playSound ""sidr22"";";
      onDeactivation="playSound ""sidr33"";";
      sizeA=2;
      sizeB=2;
      sizeC=4;
      repeatable=1;
      activationBy="ANY";
      isRectangle=1;
      isServerOnly=1;
      };
      id=41;
      type="EmptyDetectorArea10x10";
      atlOffset=0.1210022;
      };
    • Автор: exploadead
      Привет всем! Арма 1.58 Эпоч 0380 Пытаюсь перенести триггеры с 1.56 армы на 1.58....   Вот например такая конструкция по удалению ботов из зоны успешно работала на 1.56:   class Sensors { items=1; class Item0 { position[]={13325,0,14515}; a=200; b=200; activationBy="GUER"; repeating=1; interruptable=1; age="UNKNOWN"; expActiv="{deleteVehicle _x} forEach thisList;"; class Effects { }; }; };    
      Но в 1.58 появился новый общий для всего класс class Entities. Уже пробовал вот так:      
      class Entities { items=1; class Item1 { dataType="Trigger"; position[]={13325,0,14515}; class Attributes { name="delbot"; onActivation="{deleteVehicle _x} forEach thisList;"; sizeA=200; sizeB=200; repeatable=1; interruptable=1; activationBy="GUER"; }; id=210; type="EmptyDetector"; }; };    
      Но не сработало((... пробовал то же самое прямо в редакторе сделать... на 1.56 получалось... на 1.58 не пашет((
    • Автор: Mac2706
      Создал Триггер на определённых координатах, который должен вызывать скрипт, но когда захожу в триггер ничего не происходит.Триггер динамический :
       
       
      Я подозреваю, что это происходит, потому что скрипт исполняется только на стороне клиента и не передаёт данные на сервер Danger.Sqf
  • Наш выбор

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

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

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