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

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

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

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

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

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

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

123new ,Вы бы хоть бегло разбор скрипта прочитали (то :wink:).

 

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


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



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

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


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

123new , того, который здесь обсуждается - заражённые зоны от elanc. Если Вы его "знаю",то

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

может вы тестите без наличия в слоте Headgear вещи NBCHoodGray

пожалуй, писать бы не стали, особенно после 

1 час назад, VIRrusR сказал:

Не работает проверка на целостность! Комплектность проверяет...

 

Вкраце - моя идея проста, как валенок: вставить в тело проверки на наличие проверку на целостность. Изначально, если проверка на наличие завершилась по true, то берём состояние обнаруженного в слоте предмета, возвращаем его в переменную. Затем сравниваем переменную, содержащую уровень "здоровья" предмета  с пороговым значением в цикле if. Если уровень повреждений превышает заданный - декрементируем переменную biosafe, выполняющую роль счётчика уровня защиты.

 

В дальнейшем обсуждении всё сократилось до задания единого условия проверки для наличия AND целостности (уж что такое AND, OR и XOR, не стоит, право!..) Логика скрипта изначально такова, что искомый предмет в слоте есть, иначе симптомы заражения. И что Вы тут логировать хотите? Предмет одет - персонаж здоров, предмет снят - персонажу "вава". Предмет не повреждён - персонажу хорошо, предмет повреждён - ... А ему, гниде, всё равно хорошо!:veryangry:

 

BorizzK , видимо в офлайне чего-то не того-то, как ты и говорил. Мне онлайн не на чем тестировать. Проверка настолько простая, согласись, что ошибиться просто не в чем здесь... 

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

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


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

123new , того, который здесь обсуждается - заражённые зоны от elanc. Если Вы его "знаю",то

пожалуй, писать бы не стали, особенно после 

 

вы меня, видимо, крайне плохо знаете, иначе такие бы вещи не писали ;)

А логирование вам для того чтобы видеть, проверялся ли ваш предмет и какого его номинальное фактическое значение на вас, а не по логическим просчетам. А то может ему 42% качества, а вы от 40 и более в проверке ставите допуск в зону в данном предмете.

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

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


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

123new ,ну наконец по существу разговор пошёл, а то всё "Собирай свои игрушки и не писай в мой горшок!":wink:

Поясняйте! Как и почему может быть 42% , если предмет в статусе badly damage, который присваивается от 40% до 20% состояния "здоровья" предмета?

 

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


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

VIRrusR например, соспавнилась шмотка в таком состоянии, или после чьего-то выстрела, либо удара стала такой. Вариантов масса. Потому как поумолчанию у вещи 100%, и если ее на 37% продамажили чем-то, логично, что у нее останется 100-37=63%. Так и тут.
А для вещей статусы в игре разбиты по диапазонам их здоровья. Например, в границах от 60% до 80% это Worn, от 60% до 40% это Damaged, и т.п., и все 23%, 45%, 57%, 50% - это будет один и тот же статус. Просто пойми принцип этот, границы, указанные выше, взяты от балды для примера, и их соответствие реальным статусам вещей под вопросом.

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


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

123new , по Вашему совету, добавил в скрипт логирование:

SCRIPT       : Type: GP5GasMask Health: 100
SCRIPT       : Type: NBCHoodGray Health: 100
SCRIPT       : Type: NBCJacketGray Health: 100
SCRIPT       : Type: NBCPantsGray Health: 15
SCRIPT       : Type: NBCBootsGray Health: 100
SCRIPT       : Type: NBCGlovesGray Health: 100

Результат проверки сета ОЗК...

Ребяты, я бы высказался, но Свод Священных Правил данного форума запрещает использование Великого и Могучего во всей его красе...:veryangry:

Итак, что мы имеем:

Проверки на наличие заданного предмета в слоте работают.

Логика переходов от проверки к проверке (выходы из циклов if) соблюдается, ибо снятие с игрока любого предмета ОЗК проверяется исправно.

Состояние предмета в слоте - много ниже заданного порогового значения.

 

Чего мы не имеем:

Не работает условие && ("И").

 

Всё, что мы сделали - добавили в условие проверки по if один аргумент по логике AND. То есть, чтобы цикл завершился по true ("истинно"), должны быть выполнены ОБА и ТОЛЬКО ОБА (:veryangry::veryangry::veryangry::veryangry: - даже в Великом и Могучем таких словов и выражениев не предусмотрено!) условия. У нас же, каким-то волшебным образом, при явном не соблюдении одного из условий, цикл if возвращает значение true и инкрементирует счётчик biosafe.

Что отсюда следует? item.GetHealth() > 0.40 - возвращает "true", а почему?..

А потому, что эта сволочь несусветная (! много, МНОГО, МНОГО-МНОГО самых сокровенных и задушевных выражений из самых сокровенных  и потаённых уголков моей "папки "Избранное" из "директории "Великий и Могучий" !:veryangry::veryangry::veryangry:) выдаёт значение В АБСОЛЮТНЫХ величинах,а не в процентах от health, мразота негодная!

 

123new , я тебе уже говорил, какой ты редиска? Мог же прямо об этом сказать? Я, чай, не совсем уж даун? Мстительный и злопамятный?:geek:

123new , большое спасибо за помощь!

 

P.S. Проверка работает.

 

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

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


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

VIRrusR Вот - переделал немного

давайте разбирать

 

работает и дамаг игрока и дамаг предмета

пока оставил только проверку противогаза

 

вобщем работает на удивление нормально даж после многочасовых нагрузок на сервер 30-40 человек

 

class Zone { //Этот Класс используется для хранения параметров зон - для каждой зоны создается свой экземпляр класса
	string			name;
	int 			id;
	vector 			pos;
	float 			radius;
	TStringArray	complect;
	int 			type;
	string 			message;
	float 			player_Damage_Coef;
	float 			player_Health_Threshold_Symptoms;
	int				player_Symptom;
	float 			item_Damage_Coef;
	float 			item_Health_Threshold;
}

ref array<ref Zone> ga_zones = new array<ref Zone>; //Массив класса Zone. В него помещаются ссылки на экземпляры класса откуда в последствии читаются параметры

enum ZoneType { //Это для удобства
	SAFE = 1, 	//1
	GAS,  		//2
	RAD,  		//3
	BIO   		//4
}

ref ZonesClass Zones = new ZonesClass;

class ZonesClass
{
	private bool my_Zones_Debug 	= 	true;
	private int zone_Check_Timer	=	12000;
	
	void ZonesClass()
	{
		Print("::: SERVER: [ZonesClass]: Init.");
		ZonesInit();
	}
	
	void ~ZonesClass()
	{
		Print("::: SERVER: [ZonesClass]: UnInit.");
	}
	
	void ZonesInit()
	{
		Print("::: SERVER: [ZonesClass.c DEBUG]: ZonesInit(): BEGIN.");
		
		//Default params
		string 			name;
		int 			id 									= 	0;
		vector 			pos									=	vector.Zero;
		float 			radius								=	0.0;
		int 			type 	 							= 	0;
		TStringArray	complect 							=	{};
		int				zonetype 							= 	ZoneType.BIO;
		string			zone_Message						= 	"Вы в зараженной зоне, Вам нужны химзащита и противогаз!";
		float			player_Damage_Coef					=	0;
		float			player_Health_Threshold_Symptoms	=	50.0;
		int				player_Symptom						=	SymptomIDs.SYMPTOM_COUGH; // Class SymptomIDs - variable SYMPTOM_COUGH (кашель) // = 1
		float			item_Damage_Coef					=	0.2;					
		float			item_Health_Threshold				=	40.0;
		
		name			= "Pavlovo";
		id 				= 1;
		pos 			= "2125 0 3400";
		radius 			= 200.0;
		/*
		Params:
		1  - zone name
		2  - zone id
		3  - zone center position
		4  - zone radius
		5  - items complect for check //for future
		6  - zone type //for future (see enum ZoneType)
		7  - zone message for player
		8  - damage coefficient for player
		9  - player start symptoms threshold
		10 - symptom for player in current zone
		11 - damage coefficient for items //for future
		12 - item health threshold for start damage player		
		*/
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Zeleno";
		id 		= 2;
		pos 	= "2530 0 5112";
		radius 	= 150.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Dichina";
		id 		= 3;
		pos 	= "4524 0 8290";
		radius 	= 50.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Myshkino";
		id 		= 4;
		pos 	= "332 0 9368";
		radius 	= 100.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Aero SW";
		id 		= 5;
		pos 	= "4586 0 9533";
		radius 	= 220.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Aero SE";
		id 		= 6;
		pos 	= "5177 0 9960";
		radius 	= 350.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Aero W";
		id 		= 7;
		pos 	= "4228 0 10400";
		radius 	= 350.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Aero E";
		id 		= 8;
		pos 	= "4785 0 10530";
		radius 	= 250.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Aero N";
		id 		= 9;
		pos 	= "4290 0 10956";
		radius	= 250.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Tisy";
		id 		= 10;
		pos 	= "1600 0 14030";
		radius 	= 600.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Troitskoe";
		id 		= 11;
		pos 	= "7893 0 14689";
		radius 	= 300.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);

		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckZones, zone_Check_Timer, true);
		
		Print("::: SERVER: [ZonesClass.c DEBUG]: ZonesInit(): END.");
	}
	
	void AddZone(string name, int id, vector pos, float radius, TStringArray complect, int type, string zone_Message, float player_Damage_Coef, float player_Health_Threshold_Symptoms, int player_Symptom, float item_Damage_Coef, float item_Health_Threshold)
	{
		ref Zone zone 							= new ref Zone; //создается новый экземпляр класса Zone - ссылка на экземпляр - переменная zone
		
		zone.name 								= name;
		zone.id 								= id;
		pos[1]									= GetGame().SurfaceY(pos[0], pos[2]); // Поверхность
		zone.pos 								= pos;
		zone.radius 							= radius;
		zone.complect 							= complect;
		zone.type 								= type;
		zone.message							= zone_Message;
		zone.player_Damage_Coef 				= player_Damage_Coef;
		zone.player_Health_Threshold_Symptoms 	= player_Health_Threshold_Symptoms;
		zone.player_Symptom						= player_Symptom;
		zone.item_Damage_Coef 					= item_Damage_Coef;
		zone.item_Health_Threshold 				= item_Health_Threshold;

		ga_zones.Insert(zone); //Массив класса Zone

		Print("::: SERVER: [ZonesClass.c DEBUG]: AddZone: name: " + name + ", id: " + id + ", pos: " + pos + ", radius: " + radius + ", type: " + type + ", player_Damage_Coef: " + player_Damage_Coef + ", player_Health_Threshold_Symptoms: " + player_Health_Threshold_Symptoms + ", player_Symptom: " + player_Symptom + ", item_Damage_Coef: " + item_Damage_Coef + ", item_Health_Threshold: " + item_Health_Threshold);
	}
	
	void SendZoneMessage(PlayerBase player, string zonemessage)
	{
			Param1<string> m_MessageParam = new Param1<string>(zonemessage);
			GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity());
	}
	
	bool InZone(PlayerBase player, ref Zone zone)
	{
		vector player_position = player.GetPosition();
		if( (vector.Distance(player_position, zone.pos)) < zone.radius )
		{
			switch(zone.type)
			{
				case 1: //SAFE
				{
					SafeZone(player, zone);
				break;
				}
				case 2: //GAS
				{
					GasZone(player, zone);
				break;
				}
				case 3: //RAD
				{
					RadZone(player, zone);
				break;
				}
				case 4: //BIO
				{
					BioZone(player, zone);
				break;
				}
			}
			return true;
		}
		else
		{
			return false;
		}
	}	

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

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

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

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

Прошу не судить строго

 

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

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


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

Вот - переделал немного

Проще говоря, написал вообще другую реализацию...:angry: У меня ещё по варианту elanc куча непоняток...

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

работает и дамаг игрока и дамаг предмета

При нахождении в зоне дамажится защита?:sad: Имхо, так себе решение...

 

Пытаюсь прочитать и понять...

Пока вижу только целую кучу переменных - зачем?! Принцип определения зон тот же, что у elanc, только куда менее наглядный: там просто копипастом добавляй зоны, меняй координаты и радиусы - всё. 

...Три типа воздействий? Химия, биологическое, радиация? Допустим... Подразумевается три набора защитных средств, по типам воздействия?

 

Так и не понял, в чём смысл создания класса class Zone? Только ради определения свойств зон (радиус, тип, наносимый урон и т.п.)? Что мешает прямо определять эти параметры? Зачем вообще массив? Нет, ну если бы скрипт вызывал параметры из внешнего файла (какой-нибудь .txt-шки, где они просто перечисляются в заданном порядке), тогда понятно - пользователь просто вписывает в .txt-файл координаты, радиусы, типы, степени урона и т.п., не вдаваясь в логику работы скрипта, но зачем городить огород в теле кода?!

 

...Проверка на вхождение в зону, таже, что у elanc, плюс определение типа зоны (хим, био, рад)...

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

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


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

VIRrusR это эланковский вариант с доработками

Сейф и тп на будущее

В одном таймере обрабатывать все варианты зон

Дамаг защиты можно отключить

 

Ну и зоны сделаю загружаемые из файла

 

Про массив на основе класса

А по другому разнородные данные как обработать?

Кроме того это удобно и красиво

 

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

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


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

BorizzK , я понял по комментам, что закладки на будущее.:relaxed:

Давай так, ты опиши что в конечном итоге хочешь получить:

-- Три типа зон заражения - химическое, биологическое, радиационное, верно?

-- Параметры зон, задаваемые массивом (простым перечислением) во внешнем (пользовательском) файле?

-- Единая проверка на тип зоны, комплектность (в зависимости от типа зоны) и целостность защиты?

-- Дифференцированное нанесение урона игроку и средствам защиты, в зависимости от заданных пользователем параметров, с возможностью отключения тех или иных параметров урона?

Верно?

Не понял что такое SafeZone ? Пресловутая сэйвзона, в которой от игрока вдруг начинают пули отскакивать, как хлебные мякиши?! (*долго и мучительно блюёт*)

 

Если позволишь, сразу про "минусы":

--Три типа заражения. Допустим. Как собираешься довести до игрока, где какое? Газо-, Био-анализаторов в игре нет. Равно как и счётчика гейгера. Клиентский мод?! А как же наши принципы?!:wink:

-- Урон по средствам защиты. С какого перепугу вообще?! Нет, ну радиационные зоны - я ещё могу допустить, хотя дезактивация (кстати, как дезактивировать ОЗК собираемся после облучения?:wink:). Хим- и Биологическое загрязнение каким образом ухудшают состояние средств изначально созданных для работы в таких средах?! У тебя там взвесь соляной кислоты в адской концентрации предполагается?

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

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


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

VIRrusR я это все делаю исключительно для тренировки и развития

Ну и просто интересно

 

Ну и про заражения

В зависимости от типа монжно разные симптомы игроку навешивать

По разному дамажить

Итп

 

 

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


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

BorizzK ,ясно. Делаем чисто ради возможности?:smile:

Нет, ну смысл есть! Пользователь сможет сам определить, что из возможного ему нужно и в каком виде. Допустим, подгонка под "лор" сервера - кто знает, может у них там война прошла, с использованием ОМП?! :biggrin: Единственно - как донести до игрока, куда чего надевать?.. Лично я, ограничился бы просто разной степенью заражения и, соответственно, различной достаточностью средств защиты, от марлевой повязки, до полного комплекта ОЗК. Хотя, опять же, как объяснить игроку, почему здесь он одел повязку и перестал чихать, а здесь в противогазе захлёбывается собственной блевотой?..

 

Я на работе, блин, детально вникать не получается... 

Попробую кусками? Кусок кода - комментарии, как я это понимаю?..:smile:

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


Ссылка на сообщение
Поделиться на других сайтах
class Zone {								//Создаём пользовательский класс, определяющий базовые параметры зон.
	string			name;					//Название зоны 
	int 			id;					//??? Номер зоны?
	vector 			pos;					//Координты центра зоны
	float 			radius;					//Радиус зоны в метрах
	TStringArray	complect;					//Сет защитных средств для данной зоны, задаваемый в массиве
	int 			type;					//Тип зоны заражения (Хим/Био/Радиационная)
	string 			message;				//Сообщение, выводимое игроку при входе в данную зону
	float 			player_Damage_Coef;			//Коэффициент урона (в ед. времени), наносииого игроку в данной зоне
	float 			player_Health_Threshold_Symptoms;	//Симптомы поражения (кашель, рвота и т.п.) для данной зоны
	int				player_Symptom;			//Применённые к игроку симптомы поражения, по результатам проверки
	float 			item_Damage_Coef;			//Коэффициент урона (в ед.времени), защитным средствам (всем предметам в равной 														степени?)в данной зоне
	float 			item_Health_Threshold;			//Урон защитным средствам по результатам проверки				
}

ref array<ref Zone> ga_zones = new array<ref Zone>;			//Задаём массив, в котором будут перечислены параметры каждой зоны (название,тип, центр,радиус..)

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

Что такое id ?

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

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


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

VIRrusR id Тупо порядковый номер зоны - на всякий случай

Для красоты кода что бы при вызове задавать параметр не цифрой а красиво введен enum ZoneType

это типа глобальные константы

 

enum ZoneType { //Это для удобства
	SAFE = 1, 	//1
	GAS,  		//2
	RAD,  		//3
	BIO   		//4
}

Теперь можно вместо 1, 2 3 или 4

Указывать ZoneTupe.BIO - это равносильно указаню 4

Двиг при компиляции опустит лишнее и реально вместо всех этих био и тп поставит 4

Но для красоты кода - самое то

 

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

как-то некрасиво

хочу переделать

 

Давай кстати разберем последовательно что и как тут работает

 

 

 

 

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


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

BorizzK , понял, спасибо! Как раз хотел спрсить про enum - исчерпывающее объяснение.:relaxed:

Погоди немного! Мне ж ещё и работать нужно...:crying: Счаз, сделаю железку - пойду дальше по твоему коду...:laugh:

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


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

VIRrusR 

Про кусок кода выше - класс Zone

Все правильно понимаешь

По сути этот класс хранилище переменных

 

вот под тем классом

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

обьявили глобально массив соответствующего класса Zone

Те массив может содержать в себе элементы этого класса (ну как я это понимаю)

 

далее

сколько зон ты обьявишь (см функцию AddZone)

столько экземпляров и будет

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

 

	void AddZone(string name, int id, vector pos, float radius, TStringArray complect, int type, string zone_Message, float player_Damage_Coef, float player_Health_Threshold_Symptoms, int player_Symptom, float item_Damage_Coef, float item_Health_Threshold)
	{
		ref Zone zone 							= new ref Zone; //создается новый экземпляр класса Zone - ссылка на экземпляр - переменная zone

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

		zone.name 								= name;
		zone.id 								= id;
		pos[1]									= GetGame().SurfaceY(pos[0], pos[2]); // Поверхность
		zone.pos 								= pos;
		zone.radius 							= radius;
		zone.complect 							= complect;
		zone.type 								= type;
		zone.message							= zone_Message;
		zone.player_Damage_Coef 				= player_Damage_Coef;
		zone.player_Health_Threshold_Symptoms 	= player_Health_Threshold_Symptoms;
		zone.player_Symptom						= player_Symptom;
		zone.item_Damage_Coef 					= item_Damage_Coef;
		zone.item_Health_Threshold 				= item_Health_Threshold;

и потом ссылку на этот экземпляр - фигакс и в массив:

 

ga_zones.Insert(zone);

 

а теперь

 

а где хошь можно из ga_zones вытащить ссылку на экземпляр класса из массива и потом читать из него переменные (кстати там и код можно разместить и тд итп)

 

ref Zone zone; //Обьявили в своей функции - внутри (или на входе в параметрах) пепеременную указатель zone на типа класса Zone
zone = ga_zones.Get(1); //прочитали элемент

int a = zone.id; //прочитали из экземпляра класса значение переменной id в переменную a

 

 

 

 

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

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


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

BorizzK ,забегаешь вперёд!

Я пытаюсь отследить логику твоего кода, причём на ходу, постоянно отвлекаясь... Не спеши. 

ref ZonesClass Zones = new ZonesClass;					//??? Объявляем подкласс, наследующий от класса Zones? (Опечатка? От Zone?)

class ZonesClass							//Создаём пользовательский класс ZonesClass, (наследующий от класса Zone?)
{
	private bool my_Zones_Debug 	= 	true;			//Объявляем переменную my_Zones_Debug для использования только внутри ZonesClass 														(почему?) и присваиваем ей значение "истинно"
	private int zone_Check_Timer	=	12000;			//Таймер, задающий интервал проверки нахождения игрока в зоне (?) (почему private?)
	
	void ZonesClass()						//??? Что вызывает void? Это не функция,а обращение, как я понимаю? Что оно делает?
	{
		Print("::: SERVER: [ZonesClass]: Init.");		//Это логирование? Я так понимаю, что проверка на инициализацию класса ZonesClass?
		ZonesInit();						//??? Что это? Включение класса Zones? Как, зачем, почему?
	}
	
	void ~ZonesClass()						//??? Вызов ZonesClass? Опять - как, зачем, почему? Зачем тильда?
	{
		Print("::: SERVER: [ZonesClass]: UnInit.");		//??? Логирование чего?
	}
	
	void ZonesInit()                                    		//??? 
	{
		Print("::: SERVER: [ZonesClass.c DEBUG]: ZonesInit(): BEGIN.");
		
		//Default params
		string 			name;
		int 			id 									= 	0;
		vector 			pos									=	vector.Zero;
		float 			radius								=	0.0;
		int 			type 	 							= 	0;
		TStringArray	complect 							=	{};
		int				zonetype 							= 	ZoneType.BIO;
		string			zone_Message						= 	"Вы в зараженной зоне, Вам нужны химзащита и противогаз!";
		float			player_Damage_Coef					=	0;
		float			player_Health_Threshold_Symptoms	=	50.0;
		int				player_Symptom						=	SymptomIDs.SYMPTOM_COUGH; // Class SymptomIDs - variable SYMPTOM_COUGH (кашель) // = 1
		float			item_Damage_Coef					=	0.2;					
		float			item_Health_Threshold				=	40.0;
		
		name			= "Pavlovo";
		id 				= 1;
		pos 			= "2125 0 3400";
		radius 			= 200.0;

Одни вопросы! Что происходит в этом куске кода? Что конкретно делает void? Почему переменные только внутри класса?.. И что, блин, за тильда?!

Ну то что в конце этого куска мы определяем базовые параметры зоны "Павлово" - это понятно.

 

P.S. Долбанный тэг вставки размазывает листинг на километр!

P.P.S. Почитал по void() в С# - ничего не понял! "Вызов функции, когда не требуется сохранить её результат". Это что за бред?! То есть мы обратились к функции, она чего-то там сделала (посчитала), а мы на результат её работы просто... забили?! Или как? Она чего-то вернула, то, что она вернула нам нужно только один раз, мы его тут же использовали и благополучно забыли? Можешь прояснить на доступном примере?

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

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


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

void - это обьявление функции не возвращающей параметры

void MyFunction()
{
 код
}

int, float, bool итп это обьявление переменной или функции возвращающей параметры заданного типа

 

int MyFunction()
{
 int a = 10;
 return a;
}
int b = MyFunction();

в итоге b будет равна 10.

Но мы отвлеклись

 

Сейчас прокомментирую листинг что ты дал выше

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


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

Я СЦУКО НЕНАВИЖУ ИНТЕРФЙС ЭТОГО ФОРУМА!!!!!!!!

Я 10 минут комментировал листинг И 1 раз щелкнул мимо листинга и ОКНО ПРОПАЛО!!!!!!!!!!

 

Придется писать заново в текстовый файл и потом копипастить!

 

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

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


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

BorizzK , да-да... Такая ж фигня! 

Да забей ты на эти тэги - пиши просто текстом, а потом вставляй тэг, вырезай текст и копипасти. Я так делаю, после того, как почти час набирал, правил, выравнивал комменты, а эта пакость всё снесла в один клик...:veryangry:

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

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


Ссылка на сообщение
Поделиться на других сайтах
class Zone { //Этот Класс используется для хранения параметров зон - для каждой зоны создается свой экземпляр класса (см функцию AddZone)
	string			name;
	int 			id;
	vector 			pos;
	float 			radius;
	TStringArray	complect;
	int 			type;
	string 			message;
	float 			player_Damage_Coef;
	float 			player_Health_Threshold_Symptoms;
	int				player_Symptom;
	float 			item_Damage_Coef;
	float 			item_Health_Threshold;
}

ref array<ref Zone> ga_zones = new array<ref Zone>; //Массив класса Zone. В него помещаются ссылки на экземпляры класса откуда в последствии читаются параметры

enum ZoneType { //Это для удобства
	SAFE = 1, 	//1
	GAS,  		//2
	RAD,  		//3
	BIO   		//4
}

ref ZonesClass Zones = new ZonesClass; //Инициализация класса с созданием указателя на него - Zones

class ZonesClass						//Обьявляем свой класс
{
	private bool my_Zones_Debug 	= 	true; //Private на всякий случай
	private bool my_BioZone_Debug	=	false;
	private int zone_Check_Timer	=	12000;
	
	void ZonesClass()				//Конструктор класса - одноименная классу функция - выполняется всякий раз при инициализации класса //Очень удобно - не нужно откуда-то вызывать например фунуцию ZonesInit (см ниже)
	{
		Print("::: SERVER: [ZonesClass]: Init."); //Просто вывод в лог (script.log в папке профиля сервера)
		ZonesInit(); //Будет вызвана при инициализации класса
	}
	
	void ~ZonesClass()				//А это деструктор - авполняется при корретном завершении работы (в нашем случае сервера)
	{
		Print("::: SERVER: [ZonesClass]: UnInit."); //Просто вывод в лог (script.log в папке профиля сервера)
	}
	
	void ZonesInit()				//Будет вызвана в конструкторе класса
	{
		Print("::: SERVER: [ZonesClass.c DEBUG]: ZonesInit(): BEGIN.");
		
		//Default params - обьявление переменных (с дефлотными параметрами)
		string 			name;
		int 			id 									= 	0;
		vector 			pos									=	vector.Zero;
		float 			radius								=	0.0;
		int 			type 	 							= 	0;
		TStringArray	complect 							=	{};
		int				zonetype 							= 	ZoneType.BIO;
		string			zone_Message						= 	"Вы в опасной зоне!";
		float			player_Damage_Coef					=	0;
		float			player_Health_Threshold_Symptoms	=	50.0;
		int				player_Symptom						=	SymptomIDs.SYMPTOM_COUGH; // Class SymptomIDs - variable SYMPTOM_COUGH (кашель) // = 1
		float			item_Damage_Coef					=	0.2;					
		float			item_Health_Threshold				=	40.0;
		
		//Тут мы уже указываем значения для конкретной зоны
		name			= "Pavlovo";
		id 				= 1;
		pos 			= "2125 0 3400";
		radius 			= 200.0;
		/*
		Params:
		1  - zone name
		2  - zone id
		3  - zone center position
		4  - zone radius
		5  - items complect for check //for future
		6  - zone type //for future (see enum ZoneType)
		7  - zone message for player
		8  - damage coefficient for player
		9  - player start symptoms threshold
		10 - symptom for player in current zone
		11 - damage coefficient for items //for future
		12 - item health threshold for start damage player		
		*/
		//Вызов функции AddZone с передачей ей параметров
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Zeleno";
		id 		= 2;
		pos 	= "2530 0 5112";
		radius 	= 150.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Dichina";
		id 		= 3;
		pos 	= "4524 0 8290";
		radius 	= 50.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Myshkino";
		id 		= 4;
		pos 	= "332 0 9368";
		radius 	= 100.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Aero SW";
		id 		= 5;
		pos 	= "4586 0 9533";
		radius 	= 220.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Aero SE";
		id 		= 6;
		pos 	= "5177 0 9960";
		radius 	= 350.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Aero W";
		id 		= 7;
		pos 	= "4228 0 10400";
		radius 	= 350.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Aero E";
		id 		= 8;
		pos 	= "4785 0 10530";
		radius 	= 250.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Aero N";
		id 		= 9;
		pos 	= "4290 0 10956";
		radius	= 250.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Tisy";
		id 		= 10;
		pos 	= "1600 0 14030";
		radius 	= 600.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);
		
		name	= "Troitskoe";
		id 		= 11;
		pos 	= "7893 0 14689";
		radius 	= 300.0;
		AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);

		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckZones, zone_Check_Timer, true);
		
		Print("::: SERVER: [ZonesClass.c DEBUG]: ZonesInit(): END.");
	}
	
	void AddZone(string name, int id, vector pos, float radius, TStringArray complect, int type, string zone_Message, float player_Damage_Coef, float player_Health_Threshold_Symptoms, int player_Symptom, float item_Damage_Coef, float item_Health_Threshold)
	{
		ref Zone zone 							= new ref Zone; //создается новый экземпляр класса Zone - ссылка на экземпляр - переменная zone
		
		zone.name 								= name;
		zone.id 								= id;
		pos[1]									= GetGame().SurfaceY(pos[0], pos[2]); // Поверхность
		zone.pos 								= pos;
		zone.radius 							= radius;
		zone.complect 							= complect;
		zone.type 								= type;
		zone.message							= zone_Message;
		zone.player_Damage_Coef 				= player_Damage_Coef;
		zone.player_Health_Threshold_Symptoms 	= player_Health_Threshold_Symptoms;
		zone.player_Symptom						= player_Symptom;
		zone.item_Damage_Coef 					= item_Damage_Coef;
		zone.item_Health_Threshold 				= item_Health_Threshold;

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

		Print("::: SERVER: [ZonesClass.c DEBUG]: AddZone: name: " + name + ", id: " + id + ", pos: " + pos + ", radius: " + radius + ", type: " + type + ", player_Damage_Coef: " + player_Damage_Coef + ", player_Health_Threshold_Symptoms: " + player_Health_Threshold_Symptoms + ", player_Symptom: " + player_Symptom + ", item_Damage_Coef: " + item_Damage_Coef + ", item_Health_Threshold: " + item_Health_Threshold);
	}

 

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


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

Меня сейчас еще один вопрос волнует

Как без вмешательства в класс PlayerBase и вообще в root scripts (и не трогая профиль сервера) привязать к каждому игроку вошедшему в зону переменную

вошел он в зону она стала true вышел она стала false

 

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

 

чет как-то весь мозг сломал в поисках простого-красивого решения...

 

 

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


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

void ZonesClass() в чём преимущество перед Init() ?

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

То есть, чтобы заменить void потребуется целая конструкция типа

ZonessClass  Zones;
ZonesInit()

,да? То есть, так или иначе, переменная, указывающая на класс? Почему не само имя класса?! Зачем эта "погремуха" - Zones?

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

Кстати, а зачем его "включать"? Мы ж его объявили и определили его параметры... Или это для компмилятора? Логику поясни - мы его объявляем, описываем, а затем даём команду компилятору языка перевести всё, чего мы там насочиняли в исполняемый код, так? То есть Init() - это не функция языка, а команда интерпретатору обработать командный код, на который указывает "погремуха"-указатель?

И зачем нужен деструктор? Мы "собрали" и обработали класс. Зачем его разбирать?

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


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

VIRrusR 

 

void ZonesClass() в чём преимущество перед Init() ?

Эээ... Не понял... Init() тут при чем?

Init() по примеру в классе миссии из init.c?

Init тот сам не выполяется - ЕГО ВЫЗЫВАЕТ ДВИЖОК СЕРВЕРА !!! - как и горы других функций из классов scripts

 

Чтот какой-то ты поток сознания выдал

 

void - это определитель функции НЕ ВОЗВРАЩАЮЩЕЙ РЕЗУЛЬТАТ, а просто выполняющей какую-либо работу

 

ZonessClass Zones;

ZonesInit()

Это что?

 

переменная, указывающая на класс - ЭТО НЕ ПЕРЕМЕННАЯ - ЭТО УКАЗАТЕЛЬ!

 

Яж тебе ВЫШЕ все с каментами  в коде разложил

 

Включить класс

 

Без включения им можно пользоваться через имякласса.имяфункции только если он был автоматически инициализирован

А такое возможно только если оно в scripts

А вот в миссии такое не проканает (хотя мож чо изменилось - не проверял)

Потому нужно обьявлять

ref ZonesClass Zones = new ZonesClass;

 

 

 

 

 

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

    • Автор: RedWoodGamer
      Ищу мододела который напишет мод на поиск предметов в ванильной фурнитуре с возможностью конфигурации лутабельных объектов и лута внутри них, а так-же КД на лутаемый объект (Простыми словами чтобы нельзя было лутать один и тот же объект двум игрокам одновременно, если один залутал, включается определённый таймер и второй игрок может залутать его через прошедшее время, либо же завязать это время на рестарт сервера.)
      Бюджет есть, оценивайте свою работу и предлагайте цену, кто не хочет в комментариях вот Discord : RedWood#6323
    • Автор: CubeIn
      Приветствую друзья, возникла неприятная ошибка.
      Подписал все ключи через DS Utils, вставил ключ в северную часть, но все равно при заходе на сервер пишет данную ошибку.
      Client contains PBO which is not part of server data
       
    • Автор: CubeIn
      Есть ли у кого ни будь шаблон или инструкция как создать свой шеврон?
      Нашел видео от Фидова, но ссылка на шаблон не действительна

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

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

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

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