VIRrusR

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

Вопрос

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

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


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

26 ответов на этот вопрос

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

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

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

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

 

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



 

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


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


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

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

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

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


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

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

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> с содержанием всех вещей, которые проверяем (т.е. это должны быть не класснеймы вещей, а именно сами вещи с нашего персонажа, что зашел в зону)

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

 

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
Только что, 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. Случайно процитировал весь пост с кодом - как удалить?

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

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


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

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

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

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

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


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

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

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

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


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

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

 

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


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

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

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


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

где 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};

 

 

 

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


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

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

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

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


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

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.....)

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


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

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

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

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


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

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 Состояние отдельных частей комплекта

 

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

 

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

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

 

 

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

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


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

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";
						}

 

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

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


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

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

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

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

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


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

Войти

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


Войти сейчас

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

    • Автор: fedotovyasha
      Пишу свой лаунчер на c#. Скачал клиент в котором был loader.exe. С ним работает норм, но я хочу без него запускать игру. Как это сделать? (Пиратка)
    • Автор: Miduznya
      Собственно как, как отключить battleye на сервере античит

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

      Заявку вы можете заполнить в этой же теме, либо написать мне в ЛС.
      Любые сообщения не по теме запрещены.
    • Автор: Miduznya
      Всем привет, чет не нашел не где как можно в ручную обновить через .bat или .cmd файл
      если есть у кого такой поделитесь плиз. Прошу сильно не пинать если есть такая тема дайте ссылку
    • Автор: Miduznya
      Как сделать стартовый лут на сервере???