Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
  • 0
VIRrusR

Как проверить целостность костюма?

:relaxed: Такой вот вопрос: как организовать проверку костюма персонажа (ОЗК) на предмет повреждения? Чтоб если костюм повреждён, нехорошие геймеры в заражённые зоны не пролезли, а, соответственно, отравились, и, как им и положено, умерли страшной и мучительной смертью.:geek:

Share this post


Link to post
Share on other sites

Recommended Posts

  • 0

VIRrusR Для начала давайте его найдем
Ну в смысле компоненты
У меня есть набросок проверяющий наличие предмета по класснейму

Среди одетого на игрока

В самой одежде

Переделать как 2 байта переслать

 

напиши конкретно что именно ты хочешь получить



 

Share this post


Link to post
Share on other sites



  • 0

BorizzK , предметы из сета ОЗК все NBC, там не попутаешь: NBC_jacket, NBC_gloves, NBC_hood, NBC_boots, NBC_pant, ну и GP5_Mask конечно.

Нужно получить проверку по каждому из этих предметов на повреждение, так, что если любой из них имеет состояние ниже 30%, то считалось бы, что предмета нет (false или как там по-вашему, по-праграммерски). И как-то прицепить это "false" к скрипту "триггеры баллонов с газом", чтобы мерзкие геймеры издыхали таки в заражённых зонах, получив повреждения костюма.:smile:

Edited by VIRrusR (see edit history)

Share this post


Link to post
Share on other sites
  • 0

получить здоровье объекта:

item.GetHealth("", "");

а вот вам функция простецкая

bool check_set_item(array<ItemBase> itemList,float coef_check)
{	
	foreach(ItemBase selected_item: itemList)
	{
		if (selected_item)
		{
			if ((selected_item.GetHealth("", "")) <= coef_check)
			{
				return true;
			}
		} else
		{
			return true;
		}
	}
	return false;
}

пример использования функции

if (check_set_item(itemList,0.40))
{
	Print("Сет с повреждениями");
} else
{
	Print("Сет без повреждений, 100% защита");
}

где 0.40 - 40% целостности предмета (хз какой это статус), а itemList - массив типа array<ItemBase> с содержанием всех вещей, которые проверяем (т.е. это должны быть не класснеймы вещей, а именно сами вещи с нашего персонажа, что зашел в зону)

Код, разумеется, не проверял.

 

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

Edited by 123new (see edit history)

Share this post


Link to post
Share on other sites
  • 0
Только что, 123new сказал:

получить здоровье объекта:


item.GetHealth("", "");

а вот вам функция простецкая


bool check_set_item(array<ItemBase> itemList,float coef_check)
{	
	foreach(ItemBase selected_item: itemList)
	{
		if (selected_item)
		{
			if ((selected_item.GetHealth("", "")) <= coef_check)
			{
				return true;
			}
		} else
		{
			return true;
		}
	}
	return false;
}

пример использования функции


if (check_set_item(itemList,0.40))
{
	Print("Сет с повреждениями");
} else
{
	Print("Сет без повреждений, 100% защита");
}

где 0.40 - 40% целостности предмета (хз какой это статус), а itemList - массив типа array<ItemBase> с содержанием всех вещей, которые проверяем (т.е. это должны быть не класснеймы вещей, а именно сами вещи с нашего персонажа, что зашел в зону)

Код, разумеется, не проверял.

 

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

"А вообще, если уж делать такую систему для зараженной зоны, то лучше проверять все вещи, и в зависимости от их повреждения выстраивать свои коэфициенты защит, от которых сумма наносимого урона и будет исходить."

Знамо дело, что лучше! Кабы я умел это делать, я бы BorizzK не напрягал и тему эту не создавал...

 

P.S. Случайно процитировал весь пост с кодом - как удалить?

Edited by VIRrusR (see edit history)

Share this post


Link to post
Share on other sites
  • 0
Только что, 123new сказал:

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

Знамо дело, что лучше! Если бы я умел это делать, то тему бы не создавал и BorizzK остался бы без моста на Алькатрас.:wink:

Edited by VIRrusR (see edit history)

Share this post


Link to post
Share on other sites
  • 0
3 минуты назад, VIRrusR сказал:

Знамо дело, что лучше! Если бы я умел это делать, то тему бы не создавал и BorizzK остался бы без моста на Алькатрас.:wink:

а в чем проблема научиться?

Share this post


Link to post
Share on other sites
  • 0

123new время. Я не сижу целыми днями за компом - я целыми днями за станком! Даже в данный момент.

 

Share this post


Link to post
Share on other sites
  • 0

VIRrusR ты не полверишь, аналогично. И пишу я вовсе не из дома щас.

Share this post


Link to post
Share on other sites
  • 0
Цитата

где 0.40 - 40% целостности предмета (хз какой это статус), а itemList - массив типа array<ItemBase> с содержанием всех вещей, которые проверяем (т.е. это должны быть не класснеймы вещей, а именно сами вещи с нашего персонажа, что зашел в зону)

Код, разумеется, не проверял.

Как там в процентах,не знаю...

Любая вещь из одежды как я понимаю имеет 100 хитпойнтов,ну и дальше деление.....

(пример)

class GlobalHealth
			{
				class Health
				{
					hitpoints=100;
					healthLevels[]=
					{
						
						{
							1,
							
							{
								"DZ\characters\tops\Data\sweater.rvmat",
								"DZ\characters\tops\Data\sweater_g.rvmat"
							}
						},
						
						{
							0.69999999,
							{}
						},
						
						{
							0.5,
							
							{
								"DZ\characters\tops\Data\sweater_damage.rvmat",
								"DZ\characters\tops\Data\sweater_g_damage.rvmat"
							}
						},
						
						{
							0.30000001,
							{}
						},
						
						{
							0,
							
							{
								"DZ\characters\tops\Data\sweater_destruct.rvmat",
								"DZ\characters\tops\Data\sweater_g_destruct.rvmat"
							}
						}
					};
				};
			};

 

Итем лист...а проверяет одну вещь из массива,так которая есть или весь массив?....

 

Почему спрашиваю,в "Триггеры с газом" от Ультимы есть....

// Массив намордников

private TStringArray gas_masks = {"GasMask", "GP5GasMask"};

По аналогии,к примеру ещё подключить....

// Массив курток

private TStringArray gas_Body = {"GorkaEJacket_Autumn", "GorkaEJacket_Flat", "GorkaEJacket_PautRev", "GorkaEJacket_Summer", "NBCJacketGray"};

 

 

и ещё вопрос,а можно сразу в массиве задать значение для предмета,типа

{"GorkaEJacket_Autumn"= 0.25, "GorkaEJacket_Flat"=0.25, "GorkaEJacket_PautRev"=0.25, "GorkaEJacket_Summer"=0.25, "NBCJacketGray"=0.5};

 

 

 

Share this post


Link to post
Share on other sites
  • 0

Воу, воу, воу!.. Понакидали тут!:laugh: 

Где мой BorizzK ?.. Ребятушки, мне просто реализацию киньте, пожалуйста, а? Я ж в этих крокозябах ваших валенок совсем! Ну так это: "Вот эту шнягу впиндюриваем вот сюды, и будет те щастье".:joy: А потом, можете дальше в программерском мастерстве состязаться... 

Share this post


Link to post
Share on other sites
  • 0

VIRrusR Иногда думать об том чего не умеешь полезно.

 

Кстати,есть уже вбитые значения

const float ENVIRO_ABSORBENCY_HEALTHFACTOR_PRISTINE  = 1.0;
const float ENVIRO_ABSORBENCY_HEALTHFACTOR_WORN         = 0.75;
const float ENVIRO_ABSORBENCY_HEALTHFACTOR_DAMAGED     = 0.5;
const float ENVIRO_ABSORBENCY_HEALTHFACTOR_B_DAMAGED = 0.25;
const float ENVIRO_ABSORBENCY_HEALTHFACTOR_RUINED       = 0.0;

 

Может это использовать по типу

	protected float GetCurrentItemWetAbsorbency(ItemBase pItem)
	{
		float healthFactor;
		float absorbency = pItem.GetAbsorbency();			//! item absorbency from config
		float itemHealthLabel = pItem.GetHealthLevel();		//! item health (state)

		//! health factor selection
		switch (itemHealthLabel)
		{
		case STATE_PRISTINE:
			healthFactor = ENVIRO_ABSORBENCY_HEALTHFACTOR_PRISTINE;
		break;
		case STATE_WORN:
			healthFactor = ENVIRO_ABSORBENCY_HEALTHFACTOR_WORN;
		break;
		case STATE_DAMAGED:
			healthFactor = ENVIRO_ABSORBENCY_HEALTHFACTOR_DAMAGED;
		break;
		case STATE_BADLY_DAMAGED:
			healthFactor = ENVIRO_ABSORBENCY_HEALTHFACTOR_B_DAMAGED;
		break;
		case STATE_RUINED:
			healthFactor = ENVIRO_ABSORBENCY_HEALTHFACTOR_RUINED;
		break;
		}

		//! takes into account health of item
		absorbency = absorbency + (1 - healthFactor);

		return Math.Min(1, absorbency);
	}

(и тут к меня кончился отрецательный IQ.....)

Share this post


Link to post
Share on other sites
  • 0

paranoyk Это ниочем в данном случае

доеду до дома выложу вариант

Share this post


Link to post
Share on other sites
  • 0

BorizzK Да просто глянул как происходит у бегемотов расчёт намокаемости и этот "инвиро" во всех используеться...

(когда не знаю куда тыкать-ткну куда нибудь...а вдруг получиться:)))

Share this post


Link to post
Share on other sites
  • 0

paranoyk Это константы числовые
А нам надо получит item'ы ' это другой тип

 

Вот пример проверки есть на челе тот или иной item или есть в 1м уровне одежды - в коуртке, рюкзаке
если в рюкзаке коробка а в ней лут - его не проверяем

 

	static bool checkInInvenroty(PlayerBase player, string itemClass)
	{
		EntityAI attachment, subattachment; //attachments variables
		int AttCount, SubAttCount; //attachments count variables
		ItemBase subItem; //Item variable
		string className; //Item class name variable
		private bool itemFound = false; // Result / default is false
		
		AttCount = player.GetInventory().AttachmentCount(); //Player Attachments (items on player, like clothes, backpack etc.) count for cycle
		for ( int i	= 0; i < AttCount; i++ ) //Check Attachments cycle
		{
			//1st level attachments
			attachment = player.GetInventory().GetAttachmentFromIndex(i); // Get player attachment
			if ( attachment.IsItemBase() || attachment.IsClothing() || attachment.IsContainer() )
			{
				//1st level attachment
				subItem = ItemBase.Cast(attachment);
				className =	subItem.GetType();
				if ( className == itemClass )
				{
					itemFound = true;
					break;
				}
				
				//2nd level attachments
				SubAttCount = attachment.GetInventory().AttachmentCount(); //How many subattachments in player attachment - count for cycle
				for ( int j	= 0; j < SubAttCount; j++ )
				{
					//2st level attachment
					subattachment = attachment.GetInventory().GetAttachmentFromIndex(j); // Get subattachment in attachment
					subItem = ItemBase.Cast(subattachment); //Cast subattachment to item
					className =	subItem.GetType(); //Get class name of subattachment
					if ( className == itemClass ) //Check class of item (subattachment)
					{
						itemFound = true; //Item found!
						break; //break 2nd cycle
					}
				}
				//
			}
			//
			if (itemFound) break; //break 1st cycle
		}
		return itemFound; //return result
	}

Используется так

 

						string itemString = "GP5GasMask";
						bool itemFound = checkInInvenroty(selectedPlayer, itemString)
						if (itemFound)
						{
							adm_msg = "Item: Item: " + itemString + " found";
						}
						else
						{
							adm_msg = "Item: " + itemString + " not found";
						}

 

Теперь все это надо скрестить/немного переработать что бы
1 Проверять есть ли весь комплект
2 Состояние отдельных частей комплекта

 

Каков предполагается алгоритм?

 

На свое усмотрение завтра сделаю

проверяем только то что одето

 

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

paranoyk 

Кстати, глянул

Воспользоваться константами состояния через switch (itemHealthLabel)
вполне себе идея

 

Пока чуть переделал вышеуказанную функцию на новый лад

	static ItemBase checkItemAndState(PlayerBase player, string itemClass, bool subAttCheck, out float itemHealthLevel)
	{
		EntityAI attachment, subattachment; //attachments variables
		int AttCount, SubAttCount; //attachments count variables
		ItemBase subItem; //Item variable
		string className; //Item class name variable
		private bool itemFound = false;
		
		AttCount = player.GetInventory().AttachmentCount(); //Player Attachments (items on player, like clothes, backpack etc.) count for cycle
		for ( int i	= 0; i < AttCount; i++ ) //Check Attachments cycle
		{
			//1st level attachments
			attachment = player.GetInventory().GetAttachmentFromIndex(i); // Get player attachment
			if ( attachment.IsItemBase() || attachment.IsClothing() || attachment.IsContainer() )
			{
				//1st level attachment
				subItem = ItemBase.Cast(attachment);
				className =	subItem.GetType();
				if ( className == itemClass )
				{
					itemFound = true; //Item found!
					break; //break 2nd cycle
				}
				if (subAttCheck)
				{
					//2nd level attachments
					SubAttCount = attachment.GetInventory().AttachmentCount(); //How many subattachments in player attachment - count for cycle
					for ( int j	= 0; j < SubAttCount; j++ )
					{
						//2st level attachment
						subattachment = attachment.GetInventory().GetAttachmentFromIndex(j); // Get subattachment in attachment
						subItem = ItemBase.Cast(subattachment); //Cast subattachment to item
						className =	subItem.GetType(); //Get class name of subattachment
						if ( className == itemClass ) //Check class of item (subattachment)
						{
							itemFound = true; //Item found!
							break; //break 2nd cycle
						}
					}
				}
	
			}
			if (itemFound) break; //break 1st cycle
		}
		if (itemFound)
		{
			itemHealthLevel = subItem.GetHealthLevel();	
			return subItem; //return founded item
		}
		else
		{
			itemHealthLevel = 0;
			return NULL;
		}
	}

 

 

использование

 

1й параметр перс игрока, 2й строка содержащая класснйем вещички, 3й если true будут проверяться и вложенные вещички - в куртке, рюкзаке, тк проверяем ток что одето потому false, в 4м параметре переменная куда будет записано состояние если вещичка найдена либо 0.

В стандартный вывод функция вернет тип ItemBase - саму вещичку.

 

						string itemString = "GP5GasMask";
						float itemHealthLevel;
						ItemBase itemFound = checkInInvenroty(selectedPlayer, itemString, false, itemHealthLevel)
						if (itemFound)
						{
							Print("Item: Item: " + itemString + " found, item health level: " + itemHealthLevel);
						}
						else
						{
							adm_msg = "Item: " + itemString + " not found";
						}

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

BorizzK можно проще, получаем вещи персонажа в зоне прописанной со слотов на персонаже, типа ноги, лицо, куртка, и т.п. Сверяем их с 'эталонным вариантом'. Если соответствует списку - выполняем для всех этих вещей проверку дамажности, по результату которого высчитываем коэфициент нанесения урона. И уже этот коэфициент используем в нанесении урона по вещам на игроке или игроку.
Вроде не сложно объяснил, но, вроде, именнно такое ребята и хотят.

 

Вот накидал примерный код:

array<string> slots_inv = {"Mask","Headgear","Body","Legs","Feet","Gloves"};
array<string> defend_items_idd = {"NBC_jacket", "NBC_gloves", "NBC_hood", "NBC_boots", "NBC_pant", 'GP5_Mask"};

ref array<ItemBase> ItemsInPlayerForCheck = new array<ItemBase>;
bool Check_Defend_player_fullset(PlayerBase player, array<string> items_check_in_set, array<string> slots_ids)
{
	ItemsInPlayerForCheck.Clear();
	EntityAI attachment;
	ItemBase item;
	string className;
	
	foreach(string selected_slot_inv: slots_ids)
	{
		attachment = player.FindAttachmentBySlotName(selected_slot_inv);
		if ( attachment && attachment.IsItemBase() ) {
			item		=	Class.Cast(attachment);
			className	=	item.GetType();
			if (!Check_Type_in_Massive(className,items_check_in_set))
			{
				return false;
			} else
			{
				ItemsInPlayerForCheck.Insert(item);
			}
		}
	}
	return true;
}
bool Check_Type_in_Massive(string type_id, array<string> massive_id)
{
	private int element_index = massive_id.Find(type_id);
	if ( element_index < 0 )
	{
		return false;
	} else
	{
		return true;
	}
}
bool check_set_item(array<ItemBase> itemList,float coef_check)
{	
	foreach(ItemBase selected_item: itemList)
	{
		if (selected_item)
		{
			if ((selected_item.GetHealth("", "")) <= coef_check)
			{
				return true;
			}
		} else
		{
			return true;
		}
	}
	return false;
}
float Check_damage_coef()
{
	float return_value = 0.0;
	if (check_set_item(ItemsInPlayerForCheck,0.80))
	{
		if (check_set_item(ItemsInPlayerForCheck,0.60))
		{
			if (check_set_item(ItemsInPlayerForCheck,0.40))
			{
				if (check_set_item(ItemsInPlayerForCheck,0.20))
				{
					return_value = 1.00;
				} else
				{
					return_value = 0.70;
				}
			} else
			{
				return_value = 0.40;
			}
		} else
		{
			return_value = 0.30;
		}
	} else
	{
		return_value = 0.0;
	}
	return return_value;
}

void Check_player(PlayerBase player)
{
	float damage_coef = 0;
	
	if (Check_Defend_player_fullset(player, defend_items_idd, slots_inv))
	{
		damage_coef = Check_damage_coef();
	}
}

остается лишь после

if (Check_Defend_player_fullset(player, defend_items_idd, slots_inv))
	{
		damage_coef = Check_damage_coef();
	}

добавить работу нанесения дамага игроку с учетом полученного коэфициента

Edited by 123new (see edit history)

Share this post


Link to post
Share on other sites
  • 0

123new , я конечно полный валенок в скриптах, но Ваш вариант, как мне показалось, ближе к нужному. 

Поправьте, если неверно понимаю, работает это так:

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

Если сеты совпадают, то по значению true продолжается проверка уже на повреждение предметов. В соответствии с процентом повреждения определяется кооэффицент наносимого урона, по функции Check_damage_coef, верно?

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

Не понял: если у игрока сет не совпвадает с эталонным, то-??? Я не силён в синтаксисе скриптов, но рискну предположить, что просто переход на следующую строку, в которой непосредственно пропишем "работу по нанесению урона"?

Верно понимаю?

Edited by VIRrusR (see edit history)

Share this post


Link to post
Share on other sites
  • 0

Попробовал самостоятельно совместить код, предложенный 123new со скриптом от elanc, заменив исходную проверку на наличие полного сета ОЗК.

В результате получаю краш сервера с таким вот логом:

CS19500, 04.04 2019 20:09:20
Can't compile mission init script'!

$CurrentDir:mpmissions\dayzOffline.chernarusplus\init.c(1): CParser: quoted string not closed on line 107, module $CurrentDir://mpmissions//dayzOffline.chernarusplus//main.c

Я так понимаю, что где-то в моём main.c


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 ) {
			
			array<string> slots_inv = {"Mask","Headgear","Body","Legs","Feet","Gloves"};
            array<string> defend_items_idd = {"NBC_jacket", "NBC_gloves", "NBC_hood", "NBC_boots", "NBC_pant", 'GP5_Mask"};

            ref array<ItemBase> ItemsInPlayerForCheck = new array<ItemBase>;
            bool Check_Defend_player_fullset(PlayerBase player, array<string> items_check_in_set, array<string> slots_ids)
            {
	        ItemsInPlayerForCheck.Clear();
	        EntityAI attachment;
			ItemBase item;
			string className;
	
			foreach(string selected_slot_inv: slots_ids)
				{
				attachment = player.FindAttachmentBySlotName(selected_slot_inv);
					if ( attachment && attachment.IsItemBase() ) {
					item		=	Class.Cast(attachment);
					className	=	item.GetType();
						if (!Check_Type_in_Massive(className,items_check_in_set))
						{
						return false;
						} else
						{
						ItemsInPlayerForCheck.Insert(item);
						}
					}
				}
				return true;
			}
			bool Check_Type_in_Massive(string type_id, array<string> massive_id)
			{
			private int element_index = massive_id.Find(type_id);
				if ( element_index < 0 )
				{
				return false;
				} else
				{
				return true;
				}
			}
			bool check_set_item(array<ItemBase> itemList,float coef_check)
			{	
			foreach(ItemBase selected_item: itemList)
				{
				if (selected_item)
					{
					if ((selected_item.GetHealth("", "")) <= coef_check)
						{
						return true;
						}
					} else
					{
					return true;
					}
				}
				return false;
			}
			float Check_damage_coef()
			{
			float return_value = 0.0;
				if (check_set_item(ItemsInPlayerForCheck,0.80))
				{
					if (check_set_item(ItemsInPlayerForCheck,0.60))
					{
						if (check_set_item(ItemsInPlayerForCheck,0.40))
						{
							if (check_set_item(ItemsInPlayerForCheck,0.20))
							{
							return_value = 1.00;
							} else
							{
							return_value = 0.70;
							}
						} else
						{
						return_value = 0.40;
						}
					} else
					{
					return_value = 0.30;
					}
				} else
				{
				return_value = 0.0;
				}
				return return_value;
			}

			void Check_player(PlayerBase player)
			{
				float damage_coef = 0;
	
				if (Check_Defend_player_fullset(player, defend_items_idd, slots_inv))
				{
				damage_coef = Check_damage_coef();
				}
			}
			if ( damage_coef > 0.7 )
				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) * damage_coef)));
			
			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;
				}
			}
		}
	}
}

какой-то бред несусветый получился? 

Кто шарит в скриптописании, помогите, пожалуйста, довести до ума эту чёртову проверку ОЗК.

Edited by VIRrusR (see edit history)

Share this post


Link to post
Share on other sites
  • 0

VIRrusR в том что я выложил - прописывается сет, который проверяется на наличие, пяток-другой нужных подфункций, и внизу последняя особо важная функция (Check_player), которая вызывается с указанием игрока типа PlayerBase, т.е. игрока, которого мы проверяем в зоне. В моих функциях выполняется проверка всех надетых вещей в слоты персонажа по их качеству, и в зависимости от качества (см функцию Check_damage_coef) возвращается коэфициент для наносимого игроку дамага. Своеобразный множитель, на который величину дамага надо умножить. А в функциии Check_player уже сам запуск акой проверки как пример. Все что надо - дописать функцию Check_damage_coef или как возвращающую коэфициент в какую-то свою функцию, или действия, необходимые вам.
Я, конечно, могу сделать за вас все как всегда, но давайте уже учиться, а не тупыми копи-пастами заниматься, даже опуская правила форуме, которые запрещают такими просьбами заниматься, это было бы не лишним и для вас самих, понимающих то что вы делаете и для чего, да как написать хотя бы банальную проверку свою.

Share this post


Link to post
Share on other sites
  • 0
В 02.04.2019 в 16:41, 123new сказал:

item.GetHealth("", "");

И?.. Я понимаю, что это функция, возвращающая состояние предмета. Хоть я и не программист, но я понимаю также, что у всякой функции могут быть или не быть аргументы (то самое, что в скобках). Аргументом может быть константа, переменная и другая функция, верно? Я тут переодически возвращаюсь к этой теме - уж больно хочется проверку эту наладить... Так вот, предложенные здесь варианты, включая проверку через сравнение с эталонным сетом с использованием массивов - это всё... Не нужно это всё! Логика простая: ОЗК либо есть, либо нет. Он либо защищает, либо дырявый. Все эти выкрутасы с процентом дамага - в топку! Отсюда: проверка на наличие у elanc есть и она работает. Работает хорошо и надёжно. Главный принцип наладки? "Машина работает? Не лезь! Не мешай ей работать." Таким образом, проверку на наличие оставляем исходную. Требуется: вписать в исходную проверку наличия ещё и проверку состояния. У elanc очень простой скрипт, настолько простой, что даже я, не зная вообще ни фига в скриптах, просто спокойно его прочитал, как текст. Собственно вопрос: будет ли корректно такое использование означенной функции?

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;
			float Damage_Coef = 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;
				}
			item.GetHealth("GP5GasMask",Damage_Coef); 
			if (check_set_item("GP5GasMask",0.40)) 
			{ 
			biosafe = biosafe - 1.0; 
			}                                                        

Правильно ли я формулирую запрос на получение состояния противогаза и последующее применение результата запроса в переменной Damage_Coef ?

Я не понимаю логику работы функции check_set_item() - нужно ли вообще перед её применением использовать item.GetHealth (), ведь проверяемый "итем" в ней итак уже прописан?

Сама эта check_set_item() проверяет именно указаный "итем" или "итем из заданного массива"? Может тут другую функцию надо - какой-нить check_item() или check_selected_item() ? Или вообще, взять переменную Damage_Coef и организовать сравнение с пороговым значением через if ?

Edited by VIRrusR (see edit history)

Share this post


Link to post
Share on other sites
  • 0
В 09.04.2019 в 13:01, VIRrusR сказал:

И?.. Я понимаю, что это функция, возвращающая состояние предмета. Хоть я и не программист, но я понимаю также, что у всякой функции могут быть или не быть аргументы (то самое, что в скобках). Аргументом может быть константа, переменная и другая функция, верно? Я тут переодически возвращаюсь к этой теме - уж больно хочется проверку эту наладить... Так вот, предложенные здесь варианты, включая проверку через сравнение с эталонным сетом с использованием массивов - это всё... Не нужно это всё! Логика простая: ОЗК либо есть, либо нет. Он либо защищает, либо дырявый. Все эти выкрутасы с процентом дамага - в топку! Отсюда: проверка на наличие у elanc есть и она работает. Работает хорошо и надёжно. Главный принцип наладки? "Машина работает? Не лезь! Не мешай ей работать." Таким образом, проверку на наличие оставляем исходную. Требуется: вписать в исходную проверку наличия ещё и проверку состояния. У elanc очень простой скрипт, настолько простой, что даже я, не зная вообще ни фига в скриптах, просто спокойно его прочитал, как текст. Собственно вопрос: будет ли корректно такое использование означенной функции?

 

А это, мой дорогой, называется провильно и точно поставленный вопрос и ТЗ (тех.задание). Как в теме условие поставили, такие варианты вам и предложили. Учитесь сначала полностью и точно объяснять что вы хотите от людей и в каком виде, чтобы вместо бетонного забора вам кусок крыши не вкопали.
Функция, спрашиваемая вами, коллега, получает значения здоровья вещи. Проще говоря, его целостности,0 где, например, 100% целостность типа Pristine - значение 100, целостность worn - значение 80, целостность damaged - значение 60, ну и т.п. Т.е. функция, позволяющая узнать то, в каком состоянии игровая вещь находится.
Касаемо вопроса "Хоть я и не программист, но я понимаю также, что у всякой функции могут быть или не быть аргументы (то самое, что в скобках). Аргументом может быть константа, переменная и другая функция, верно?" Верно. А чтобы нам понять какие аргументы у нашей функции должны быть - нам поможет ряд действий:
1. Распакуем в папке dta файл scripts.pbo
2. Поиском по файлам в распакованной папке scripts найдем нашу 'GetHealth', где есть масса примеров ее применения и ее основа, как задание синтаксиса функции (не буду вдаваться в подробности).

В 09.04.2019 в 13:01, VIRrusR сказал:

 


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;
			float Damage_Coef = 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;
				}
			item.GetHealth("GP5GasMask",Damage_Coef); 
			if (check_set_item("GP5GasMask",0.40)) 
			{ 
			biosafe = biosafe - 1.0; 
			}                                                        

Правильно ли я формулирую запрос на получение состояния противогаза и последующее применение результата запроса в переменной Damage_Coef ?

Я не понимаю логику работы функции check_set_item() - нужно ли вообще перед её применением использовать item.GetHealth (), ведь проверяемый "итем" в ней итак уже прописан?

Сама эта check_set_item() проверяет именно указаный "итем" или "итем из заданного массива"? Может тут другую функцию надо - какой-нить check_item() или check_selected_item() ? Или вообще, взять переменную Damage_Coef и организовать сравнение с пороговым значением через if ?

правильно. Перед check_set_item() не надо никаких item.GetHealth (), все уже давно вписано в функцию check_set_item(). Она проверяет наличие вещи в сете, при наличии сверяет целостность с той, что у вас обозначено (0.40) , и если целостность ниже или предмета нет, то срабатывает ваше biosafe = biosafe - 1.0;
Иными словами, хотим на 100% проверять, то в строке

if (check_set_item("GP5GasMask",0.40))

вместо 0.40 ставим 1.0 (1.0 - 100%, ну для тех, кто математику в школе проходил)

Share this post


Link to post
Share on other sites
  • 0
8 минут назад, 123new сказал:

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

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

Ну и ещё момент, нет ничего плохого в том, что набросали разных вариантов, не учитывающих скрипт заражённых зон от elanc - оно не нужно МНЕ В ДАННЫЙ МОМЕНТ, но момент на то и момент, верно? И форум не только я читаю. Так что, считаю, вопрос был сформулирован правильно - варианты проверки целостности костюма, надетого на игрока.

Кроме того, кто-то мне часто пенял, что я "выпрашиваю готовые решения":wink: Если бы я назвал тему "Как добавить проверку целостности ОЗК в скрипт от elanc?"... Кое-кто (не будем тыкать пальцем в этого нехорошего человека :joy:) уже давно обещал меня забанить на веки вечные и низвергнуть в Гиенну огненную.:cool:

8 минут назад, 123new сказал:

бы нам понять какие аргументы у нашей функции должны быть - нам поможет ряд действий:
1. Распакуем в папке dta файл scripts.pbo
2. Поиском по файлам в распакованной папке scripts найдем нашу 'GetHealth', где есть масса примеров ее применения и ее основа, как задание синтаксиса функции (не буду вдаваться в подробности).

Да, спасибо за подсказку! Правда мне уже это объяснил один хороший человек в другой теме, но, всё равно - благодарю!..:relaxed:

8 минут назад, 123new сказал:

Перед check_set_item() не надо никаких item.GetHealth (), все уже давно вписано в функцию check_set_item(). Она проверяет наличие вещи в сете

Это я понял самостоятельно, пытаясь сформулировать решение, применительно к скрипту от elanc. Но это проверка элемента массива, который должен быть предварительно выбран, а мне нужна была простая проверка единичного предмета, поэтому GetHealth().

 

Собственно, вопрос перекочевал в тему по EnScript и, кажется, нужное мне решение я таки нашёл, благодаря помощи BorizzK. Но там скорее изучение на примере, ибо совсем примитивный метод последовательных проверок. А в этой теме вполне можно предложить что-то более общее и "продвинутое" на тему проверки состояния предметов, одетых на игрока.

Edited by VIRrusR (see edit history)

Share this post


Link to post
Share on other sites
  • 0
6 часов назад, VIRrusR сказал:

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

Ну и ещё момент, нет ничего плохого в том, что набросали разных вариантов, не учитывающих скрипт заражённых зон от elanc - оно не нужно МНЕ В ДАННЫЙ МОМЕНТ, но момент на то и момент, верно? И форум не только я читаю. Так что, считаю, вопрос был сформулирован правильно - варианты проверки целостности костюма, надетого на игрока.

 

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

 

6 часов назад, VIRrusR сказал:

Кроме того, кто-то мне часто пенял, что я "выпрашиваю готовые решения":wink: Если бы я назвал тему "Как добавить проверку целостности ОЗК в скрипт от elanc?"... Кое-кто (не будем тыкать пальцем в этого нехорошего человека :joy:) уже давно обещал меня забанить на веки вечные и низвергнуть в Гиенну огненную.:cool:

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

7 часов назад, VIRrusR сказал:

Да, спасибо за подсказку! Правда мне уже это объяснил один хороший человек в другой теме, но, всё равно - благодарю!..:relaxed:

Это я понял самостоятельно, пытаясь сформулировать решение, применительно к скрипту от elanc. Но это проверка элемента массива, который должен быть предварительно выбран, а мне нужна была простая проверка единичного предмета, поэтому GetHealth().

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

 

7 часов назад, VIRrusR сказал:

Собственно, вопрос перекочевал в тему по EnScript и, кажется, нужное мне решение я таки нашёл, благодаря помощи BorizzK. Но там скорее изучение на примере, ибо совсем примитивный метод последовательных проверок. А в этой теме вполне можно предложить что-то более общее и "продвинутое" на тему проверки состояния предметов, одетых на игрока.


так вопрос то решен?

Share this post


Link to post
Share on other sites
  • 0

123new 

В 12.04.2019 в 17:19, 123new сказал:

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

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

 

В 12.04.2019 в 17:19, 123new сказал:

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

Вам нравится цитировать собственные "удачные" высказывания?:surprised: (Мне, кстати, да, даже очень!)

Я где-то высказал какие-то претензии по поводу того, что Вы или кто-либо ещё предложили не то решение?! Или плохое решение? Я лишь высказался, что конкретно Ваш вариант лично мне, в данный момент, применительно к моей задаче не совсем подходит, ибо мне не нужна сложная система градации урона по степени повреждения костюма. Это вас как-то оскорбило?! В таком случае, примите мои искренние извинения! 

 

В 12.04.2019 в 17:19, 123new сказал:

полноценной реализации за вас в готовом виде делать врядли кто-то станет.

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

 

В 12.04.2019 в 17:19, 123new сказал:

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

Ну это уж!..:joy: "Мою пасочку сломал, песочком в глазки насыпал... Сам дурак!.. Собирай свои игрушки и не писай в мой горшок!.."

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

В 12.04.2019 в 17:19, 123new сказал:

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

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

 

В 12.04.2019 в 17:19, 123new сказал:

так вопрос то решен?

Это как посмотреть: с точки зрения создания работающего варианта заражённых зон с проверкой на наличие и целостность комплекта ОЗК - да. Код создан:

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 = "1150 0 7235";
		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);
		
		id = 12; // Aero NN
		pos = "4035 0 11700";
		radius = 250.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;
			float biosafe = 0;
			
			attachment = player.FindAttachmentBySlotName("Mask");
			if ( attachment && attachment.IsItemBase() ) 
			{
				item		=	ItemBase.Cast(attachment);
				if ( item.GetType().Contains("GP5GasMask") && ((item.GetHealth()) > 40) ) 
  				{
					biosafe = biosafe + 1.0; 
				}
			}

			attachment = player.FindAttachmentBySlotName("Headgear");
			if ( attachment && attachment.IsItemBase() ) 
			{
				item		=	ItemBase.Cast(attachment);
				if ( item.GetType().Contains("NBCHoodGray") && ((item.GetHealth()) > 40) ) 
  				{
					biosafe = biosafe + 1.0; 
				}	
			}

			attachment = player.FindAttachmentBySlotName("Body");
			if ( attachment && attachment.IsItemBase() ) 
			{
				item		=	ItemBase.Cast(attachment);
				if ( item.GetType().Contains("NBCJacketGray") && ((item.GetHealth()) > 40) ) 
  				{
					biosafe = biosafe + 1.0; 
				}	
			}

			attachment = player.FindAttachmentBySlotName("Legs");
			if ( attachment && attachment.IsItemBase() ) 
			{
				item		=	ItemBase.Cast(attachment);
				if ( item.GetType().Contains("NBCPantsGray") && ((item.GetHealth()) > 40) ) 
  				{
					biosafe = biosafe + 1.0; 
				}	
			}

			attachment = player.FindAttachmentBySlotName("Feet");
			if ( attachment && attachment.IsItemBase() ) 
			{
				item		=	ItemBase.Cast(attachment);
				if ( item.GetType().Contains("NBCBootsGray") && ((item.GetHealth()) > 40) ) 
  				{
					biosafe = biosafe + 1.0; 
				}
			}

			attachment = player.FindAttachmentBySlotName("Gloves");
			if ( attachment && attachment.IsItemBase() ) 
			{
				item		=	ItemBase.Cast(attachment);
				if ( item.GetType().Contains("NBCGlovesGray") && ((item.GetHealth()) > 40) ) 
  				{
					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);
			player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_VOMIT);
			
			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;
				}
			}
		}
	}
}

Вставляете приведённый выше код в созданный Вами .c -файл, например main.c

В init.c прописываете самой первой строкой подключение данного файла содержащего скрипт:

#include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\main.c"

Логика работы: Если игрок входит в одну из заражённых зон, то осуществляется проверка на наличие полного комплекта ОЗК и противогаза, а также, проверяется каждый элемент защитного костюма на наличие повреждений (статус "Повреждено"). В случае отсутствия или повреждения любого из элементов защитного костюма, игрок получает урон по здоровью. При вхождении в зону заражения без полного защитного костюма, либо в костюме, имеющем повреждение хотя бы одного элемента, выводится сообщение о необходимости надеть костюм ОЗК и противогаз. Нанесение урона игроку сопровождается следующими симптомами:

-- кашель

-- рвота

 

Весь процесс моих стараний от исходного варианта до существующего на данный момент времени, Вы сможете найти в указанной ранее теме. 

 

P.S. Вариант считаю не окончательным,в виду примитивности реализации. Тем не менее, вариант вполне работоспособный и в данный момент, используется мной на моём сервере.

P.P.S. Благодарю BorrizK - за пошаговые объяснения логики работы, принципов построения и синтаксиса скриптов. Огромное Человеческое спасибо! 123new - за помощь в обнаружении ошибки, препятствовавшей нормальной работе скрипта, а кроме того, за освоение метода логирования и понимание его необходимости - искреннее спасибо! elanc - за исходный срипт "заражённых зон", явившийся основой для данного решения и послуживший мне учебником - большое спасибо!

Edited by VIRrusR (see edit history)

Share this post


Link to post
Share on other sites
  • 0

VIRrusR А варианта с модовскими предметами как у BORIZZ.K нет? Просто я сам то совсем не шарю, и как бы сам не пытался что либо править, ничего не выходит. Разумеется нужно чтобы были не только модовские но и обычные предметы. 

Edited by Bounty (see edit history)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Serdce
      Данный скрипт, меняет процесс ремонта вашей техники, делая её более логичней, как было в А2.
      Для замены колеса, на нужно собственно само колесо, и тд. и тп. 
      Подробный список чего и для чего вы найдёте в файлах.
       
      Итак, преступим!
      Я не автор, я всего лишь перевожу.
      Первоисточник - https://github.com/aussie-battler/Exilemod-Super-Advanced-Repair-System-SARS
      По ссылке выше скачиваем архив, распаковываем в удобное место.
      Распаковываем ваше миссию "Exile.ваша карта"
      Из архива копируем папку "Custom" в папку вашей миссии "Exile.ваша карта"
      Открываем ваш description.ext  в нем мы ищем showHUD[] = 
      и полностью меняем на это - 
      Далее открываем ваш - initPLayerLocal.sqf
      В этом файле, сразу после строки - if (!hasInterface || isServer) exitWith {};
      Мы добавляем 
      //Bones Super Advanced Repair System (SARS)
      Bones_fnc_salvageAndRepairMenu = compileFinal preprocessFileLineNumbers "Custom\advancedRepair\Bones_fnc_salvageAndRepairMenu.sqf"; 
      Далее открываем ваш - config.cpp
      В нем мы ищем - class Car
      Внутри этого класса мы ищем
       
      И меняем на 
      Так же далее чуть ниже - class Air
      В нем мы также меняем это
      На это 
       
      Далее для если у вас есть Infistar!
      Распаковываем ваш инфистар и открываем его конфиг.
      В нём ищем     KCM = "true"; /* Just close ALL CommandingMenus */
      И меняем значение на false
      Чуть ниже в строке allowedCommandingMenus
      Мы добавляем  "#USER:ASL_Show_Repair_Options_Menu_Array"
      Ну вот и всё готово, всё сохранили и запаковали как было!
       
    • By fedotovyasha
      Хочу немного изменить сообщения перед отправкой клиенту
    • By fedotovyasha
      Пишу свой лаунчер на c#. Скачал клиент в котором был loader.exe. С ним работает норм, но я хочу без него запускать игру. Как это сделать? (Пиратка)
    • By Miduznya
      Собственно как, как отключить battleye на сервере античит

      параметр BattlEye=0; не работает я так понял 
    • By DrTauren
      На нашем сайте предусмотрена возможность рекламирования вашего игрового сервера/сайта/програмного обеспечения при помощи баннеров и ссылок.
       
      Баннеры под первым сообщением темы ↓
       
      Баннер на главной странице (над чатом) ↓
       
      Ссылки над первым сообщением темы ↓
       
      Ссылка на главной странице (над чатом) ↓
       
       

      Заявку вы можете заполнить в этой же теме, либо написать мне в ЛС.
      Любые сообщения не по теме запрещены.
  • Our picks

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.