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

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

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

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

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

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

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

VIRrusR 

 

Воот - если конструктора в классе нет - ничего не произойдет

А нам надо при его инициализации еще и работу полезную в нем выполнить

Для этого и нужен конструктор

Который запустит функцию ZonesInit(); из этого же класса

 

Zone{}

Ну почему - мы можем в класс Zone{} добавить функцию и вызывать ее, но прежде нам надо будет класс проинициализировать

А так - да - класс "пассивный"  - просто хранилище

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

 

 

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


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

BorizzK ,договорились наконец-то!:joy:

Давай теперь про  экземпляры. 

Счаз выдеру кусок кода и попробую описать...

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


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

А тебе про что?!:wink: 

Чертовски неудобно с листингами работать без форматирования! Пока какую-нить скобочку отследишь - полысеешь, блин!..

	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 ZonesInit() - определяем пользовательскую функцию.

Далее следует определение базовых значений для всех переменных описывающих зоны (ДО вычислений).

Сразу вопрос: почему в теле функции? Давай с этого момента. Функция вызывается единожды - при запуске сервера и создании зон, так? Тогда почему не задать базовые значения этих переменных до её вызова? Или тут просто без разницы?

 

Далее

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

Переопределили значения переменных, описывающих параметры зон, с базовых, на соответствующие конкретной зоне.

 

AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);  

 

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

Счаз, попробую понять... Нужно выше по листингу, где задавали идентификатор массива <ref>...

Ага! Вот оно:

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

Это мы уже проходили... Это у нас указатель создаётся. Только теперь не на класс, а на... массив? Нет!.. А на что? На что этот ga_zones нам кажет?.. Щаз поищем... 

 

Так! Погодь, хитрован!:geek: Указатель нам указывает на какое-то Zone. 

Я чуть было не купился и не спутал это с указателем Zones, который на класс ZonesClass кажет (ты специально такие имена придумывал, чтоб они почти одинаковые были? Это чтоб я мозги себе вывихнул?!)... Но вот фигушки тебе, редиска!:wink: Это другое! Это от AddZone ,так?.. Да так, так... Не лезь там с ответами своими! Погодь. Чапай думу думает...

Значит AddZone() - это не имя массива! Это функция? Не, скорее метод, судя по синтаксису... "Добавить Zone". А куда добавить то? Я такой переменной не вижу!.. Значит это не переменная. Новое что-то... Тоже "указатель" какой-нить?.. 

Объясняй, давай! Что такое AddZone()? Куда оно это Zone добавляет?..

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

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


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

VIRrusR Во первых - жми упомянуть пеерд тем как отвечать - а то я не вижу отписался ты в теме или нет

 

переменные нам нужны в функции а не классе

 

ref array<ref Zone> ga_zones = new array<ref Zone>; - это мы создали массив на основе класса Zone где ссылки(указатели) на экземпляры класса Zone будут лежать - оно используется как раз в функции AddZone для занесения в нее указателей на созданные экземпляры

 

[ Ну и позже используется в функции CheckZones() (запуск который происходит по таймеру с повтором в конце ZonesInit через CallLater).  В CheckZones()  в цикле для каждого игрока еще цикл где извлекается каждый экземпляр и передается в функцию проверки InZone вместе с указателем на игрока] - это обсудим потом

 

AddZone(name, id, pos, radius, complect, zonetype, zone_Message, player_Damage_Coef, player_Health_Threshold_Symptoms, player_Symptom,  item_Damage_Coef, item_Health_Threshold);  

 

тут мы вызываем функцию AddZone передевая ей параметры!

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

 

 

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

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


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

BorizzK ,извини... Я тут на ходу пытался понять и правил. Перечитай мой пост выше, пожалуйста!:smile:

А я пока попробую понять, чего ты там написал, пока я мозгом скрежетал...

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

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


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

VIRrusR Вот а теперь ты перечитай что я чуть выше поправил

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


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

BorizzK ,так, с определением базовых параметров переменных - это я понял. Оно нужно только в самой функции при её запуске...

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

ref array<ref Zone> ga_zones = new array<ref Zone>; - это мы создали массив на основе класса

Что значит "массив на основе класса"? Какого класса, Zone{} ? А причём он тут?! Не понял. 

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

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

Погодь! То есть тут не данные в массиве, а указатели на экземпляры? То есть указатели на эти самые AddZone()? А какой там указатель? Zone?

То есть AddZone() - это "добавить указатель Zone"? А Zone указывает непосредственно на массив (то, что в скобках в функции AddZone() ),так? 

Это чего AddZone() создаёт указатель на саму себя?! Ну, то есть на собственный аргумент, который является массивом, так?..

Так а где сам массив то, в котором все эти Zone, Zone, Zone (указатели) собраны? ga_zones что ли?..

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


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

VIRrusR 

ref array<ref Zone> ga_zones = new array<ref Zone>; - это мы создали массив на основе класса

Что значит "массив на основе класса"? Какого класса, Zone{} ? А причём он тут?! Не понял. 

 

это значит что этот массив будет содержать в себе данные в виде указателей на ЭКЗЕМПЛЯРЫ этого класса - те класса Zone

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

 

да это не данные - ЭТО УКАЗАТЕЛИ НА ЭКЗЕМПЛЯРЫ - а сами данные лежат в переменных экземпляра!!!

 

AddZone() - вызов функции AddZone - скобках передаваемые туда параметры соответствующх типов

 

с чего ты взял что  AddZone() создаёт указатель на саму себя ??? Откуда такой многозначительный вывод?

 

да - все это в функции AddZone() собирается в массив

 

при каждом вызове AddZone() создается новый экземпляр Zone и указатель на него помещается в следующий элемент массива

 

смотри код AddZone()

 

тащи его сюда - разберем

 

 

 

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

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


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

BorizzK ,так, я домой. Буду думать. Вечером напишу, как понял. 

У меня не столько от содержания, сколько от терминологии крыша едет, блин! 

"Указатели","экземпляры", "массив на основе класса","массив указателей на экземпляры класса"...  Это ты сам таких матюков напридумывал аль научил кто?!:joy:

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

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


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

VIRrusR научил кто - ну как бы я не проф-программер на подобных языках - сам в целом изучаю

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

с обьекто-ориентированными сталкнулся сравнительно недавно

но тк опыт есть - разбираюсь сам потихоньку ну и почитываю

есть еще масса нюансов которые предстоит понять

вот в этой теме и бум разбираться

 

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


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

Указатели","экземпляры

 

В Дайзе используется ООП. - Объектно ориентированное программирование.(В той же арме, к примеру - процедурное).

 

Для упрощения понимания указателя -

Представь, что ты создал юнита. Далее тебе надо над ним проводить какие либо махинации, => надо же к нему как то обращаться? - Ты помещаешь его в переменную. Но в скриптах нашего юнита, есть разные обработчики - процедуры, функции и т.д. и т.п. - например, при определенных условиях, наш юнит может умереть. А ты обращаясь к переменной будешь пытаться что либо проделать с ним, и в итоге будешь получать ошибку(в лучшем случае просто ошибку)...

 

Наглядный пример про птичку уже приводили -

Выгляни в окно, найди глазами птичку, вытяни руку и пальцем укажи на птичку. А теперь отверни голову от окна. - На что указывает твой палец? - На птичку? Точно? - Где гарантия, что она еще не улетела?

 

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

 

Поэтому хранить данные об объектах в переменных, и не принято.

 

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

 

Хранить можно идентификаторы(какие либо, - например UID'ы), используя которые, можно перебрать существующие объекты, и найти необходимый.

 

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

 

Просто класс

class A

{

}

 

Создаем экземпляр класса

new A();

 

new - выделит память под экземпляр класса А, зарезервирует её, и поместит туда объект нашего класса А.

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


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

BorizzK ,не удалось вчера позаниматься - счаз опять на работе буду, урывками...:angry:

NoNameUltima ,спасибо за подсказки! Очень тяжело "въехать" именно в абстракции! А всё "объектно-ориентированное" именно на них и держится... Само понятие "объект" - здесь просто умозрительная сентенция!:veryangry:

Нас в школе Basic`у учили - команды, переменные, последовательное выполнение (построчный интерпритатор), точные переходы на строку... Ну да Вы понимаете. Всё чётко и однозначно. Да, гибкости там нет, как явления, зато простота понимания и однозначная последовательность исполнения.

А здесь: там чего-то "объявили", но оно ничего не содержит. Там чего-то "создали" - но его нельзя "взять", тут "определили",но надо придумать, как "вызвать"... Объявили в одном файле, определили в третьем, вызвали в пятом, обработали вообще непонятно чем и где...:dry:

Ну и терминология с синтаксисом - это вообще вынос мозга!.. 

Ничо... Потихоньку, по-маленьку!..:smile: Никто не родился программистом!

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

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


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

VIRrusR никто не родился...

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

Он на ассемблере с детства разговаривает

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

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


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

BorizzK ,так... 

Выходит, что AddZone() - это функция, создающая массив данных. Благодаря пояснениямNoNameUltima ,понимаю так, что под этот массив резервируется кусок памяти и на него создаётся указатель ("ссылка") Zone. Этот кусок памяти, содержащий в себе массив переменных, описывающих параметры зоны - как раз и называется "экземпляр". Верно? А указатель Zone - ни что иное, как ссылка на этот самый экземпляр (кусок памяти),нечто вроде go to в Basic ?..

 

Ранее, в ref array<ref Zone> ga_zones = new array<ref Zone>; мы определили массив. AddZone(), создав экземпляр класса Zone, передаёт указатель ("ссылку") на него в массив ga_zones. Верно? Чего там этот указатель фактически содержит - не суть важно, (адрес памяти, номер строки, переменную), важно, что это уникальная "цифирь", однозначно указывающая на конкретный экземпляр... Таким образом, массив ga_zones состоит из таких вот указателей на экземпляры.

Я всё верно понял?

 

P.S. Никак не могу избавится от Basic - сильно мешает! "Что содержит экземпляр" - вопрос,в нашем случае праздный, но вот мне, чтобы представить как это работает, нужно интерпритировать - "номер строки, переменную, адрес памяти", т.е. понять, что это "оператор перехода".

 

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

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


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

VIRrusR не совсем верно

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

И потом пишет указатель на созданный экземпляр в очередной элемент массива ga_zone (через нативную функцю insert

 

 

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


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

BorizzK ,ну да! Я именно так и понял. :laugh: Ну, сформулировал корявенько, да...

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

экземпляр класса Zone

Я правильно понимаю, что это означает "экземпляр ПРИНАДЛЕЖАЩИЙ классу Zone", а не "копия класса Zone со всеми потрохами"?:joy: 

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

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


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

VIRrusR Фактически - экземпляр - копия - (для удобства ОБЪКЕТ) - расположенный в выделенной для него области памяти - а zone указатель на него

 

Смотрим функцию AddZone

 

первая же строка

ref Zone zone 							= new ref Zone;

перевод на русский

 

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

 

Так вот - этот экземпляр обьект и он обладает методами и свойствами

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

 

и вот далее мы меняем это свойства

 

zone.name         = name;

 

те переменной name в экземпляре класса Zone на который в данный момент указывает zone  мы присваиваем значение из переменной типа string - name которая является входным параметром функции AddZone

 

Вот мы сделали zone.name         = name;

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

 

 

 

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


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

BorizzK , вот! Вот что значит нормальный листинг перед глазами, а не эти {123new,да-да! Я таки нашёл способ вписать сюда матюк :wink:,но, памятуя о своём обещании и ССП...} "тэги"!!!:laugh:

Создаётся именно экземпляр класса, со всей его требухой, чёрт меня побери совсем! Данные, служащие аргументом функции AddZone() - это же как раз содержимое класса Zone{} ! 

Я из-за этих уродских тэгов никак не мог код взглядом охватить!!!:veryangry: Это ж очевидно! Условно говоря, AddZone() создаёт КЛАССЫ Zone{}#1, Zone{}#2 и т.д. и указатели на каждый из них! Верно?

 

Вопрос: если БЫ класс Zone{} содержал в себе не только переменные, но и функции, то и экземпляры бы их содержали?

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

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

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


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

VIRrusR

Данные, служащие аргументом функции AddZone() - это же как раз содержимое класса Zone{}

Пока нет

 

вот после того как в нутри AddZone( аргументы )

zone.name = name;

вот после этого да

по сути - да - наша функция AddZone плодит экземпляры класса и указатели

и потом пишет их в глобальный массив ga_zone который обьявлен ВНЕ классов - он как бы глобальный и доступен из любого класса

 

если БЫ класс Zone{} содержал в себе не только переменные, но и функции, то и экземпляры бы их содержали?

да. разумеется

и обратиться к этой функции можно было бы через указатель

zone.функция();

 

Вопрос 2 - Да

 

 

 

 

 

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


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

BorizzK , очередное спасибище, дорогой мой Человечище!!!:biggrin:

Вроде бы простые вещи, но я бы ни в жисть не допёр!.. 

И все эти "учёбники" с их заумной терминологией!.. Только ещё больше запутывают.

 

Давай "подобьём бабки"?:geek:

 

Итак, мы создали класс Zone{} - это просто хранилище переменных, описывающих свойства наших объектов - зон заражения.

 

Далее, поскольку мы понимаем, что зон, описываемых одними и теми же переменными, но содержащими различные значения будет множество, то принимаем решение о необходимости использования массива, элементы которого будут содержать данные (те самые переменные класса Zone{}).

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

 

Теперь нам нужно где-то определить значения переменных, которые описывают наши зоны. Ну и произвести с этими переменными какую-то работу. Где? В классе, конечно! Создаём класс ZonesClass{}. Но если класс Zone{} это просто хранилище, где мы объявили свойства объекта и для обращения к этим свойствам (переменным) нам достаточно просто указать на класс, в котором они объявлены, при помощи указателя Zones, то вот класс ZonesClass{} предполагает какие-то действия внутри себя. Значит нам нужно этот класс инициализировать! Делаем это при помощи "конструктора классов".

 

Далее, в классе ZonesClass{} работаем работу: "включаем" наш класс функцией Init(), определяем базовые значения переменных, описывающих наши зоны,

переопределяем переменные, описывающие свойства зон применительно уже к каждой конкретной зоне, с помощью функции AddZone() группируем эти данные в одномерные массивы, с созданием экземпляров класса и указателей на эти экземпляры - Zone. Указатели же с помощью функции Insert вставляем в ранее объявленный массив указателей на экземпляры класса Zone (ga_zones), в качестве элементов одномерного массива...

 

:biggrin: Фух! Аж взопрел всё это печатать!..

Я всё правильно понимаю? Ничего не упустил?

Если нет замечаний, до давай уже двигаться дальше? А дальше у нас, я так понимаю, логика проверок на нахождение игрока в одной из зон заражения?

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

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


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

BorizzK ,погоди... Что вот это за конструкция? 

GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckZones, zone_Check_Timer, true);

Нечто аналогичное, довольно часто встречается. Я так понимаю, что функции нативные. Что тут делается?

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


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

VIRrusR 

GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckZones, zone_Check_Timer, true);

 

Получаем из класса игры (class CGame). указатель на класс очереди Вызовов (номер очереди) - GetCallQueue нативная функция из этого класса

CALL_CATEGORY_GAMEPLAY - это глобальная константа определенная вне классов в tools.c

Значение у нее 2

 

Те в данном случае если мы делаем так

GetGame().GetCallQueue(2).CallLater(CheckZones, zone_Check_Timer, true);

то это будет то же самое

 

Вобщем GetGame().GetCallQueue(2). возвращает указатель на обьект очереди вызовов и передает его функции CallLater (функциия она относится к тому же классу)

 

CallLater получает указатель на очередь и помещает в нее вызов нашей функции CheckZones, раз в zone_Check_Timer миллисекунд, true - указывает что надо повторять вызов

 

Те теперь CheckZones из нашего класса ZonesClass будет выполняться в контексте сервера каждые zone_Check_Timer миллисекунд

 

во многих файлах в scripts есть такие строки

 

/**
 \brief CallQueue Class provide "lazy" calls - when we don't want to execute function immediately but later during frame update (used mainly in UI)
 \n usage:
 @code
 GetGame().GetCallQueue(CALL_CATEGORY_GUI).Call(this, "Refresh"); // calls "Refresh" function on "this" with no arguments
 GetGame().GetCallQueue(CALL_CATEGORY_GUI).Call(this, "Show", new Param1<bool>(true)); // calls "Show" function on "this" with one bool argument
 GetGame().GetCallQueue(CALL_CATEGORY_GUI).Call(this, "SetPos", new Param2<float, float>(0.2, 0.5)); // calls "SetPos" function on "this" with two float arguments
 @endcode
 */

Это описание некоторых нативных функций

 

ну и есть всякого рода такие писания

 

	/**
	\brief Converts string to integer
		\return \p int - Converted \p string.
		@code
			string str = "56";
			int i = str.ToInt();
			Print(i);

			>> i = 56
		@endcode
	*/

полезно там порыться и посмотреть

 

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

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


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

Те теперь CheckZones из нашего класса ZonesClass будет выполняться в контексте сервера каждые zone_Check_Timer миллисекунд

Так, то, что это таймер - это я понял...

Что за "очередь" - не понял. Почему именно CALL_CATEGORY_GAMEPLAY? Я так понимаю, что "очередей" там не одна...

Твоё мнение о функции СallLater() на этом форуме, думаю, знают уже все, даже те, кто вообще ничего о ней не знают!:joy: Это "бяка"!..

Тем не менее, давай-ка про эту "бяку" поподробнее? Что делает эта функция и какие у неё аргументы?

 

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

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

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

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

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

Поддержка