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

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

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

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

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

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

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

MagicByte MagicByte MagicByte

BorizzK , всего! У нас Армагеддон или где?!:joy:

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


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

123new функцию отключения чего?

процитированного) не всем такая обработка по душе будет)

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


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

123new все будет грузиться из файла

в 19 параметров для кажной зоны

 

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

 

допишу класс работы с классическими .cfg и все будет так

 

[zone:1]

name=Tisy

type=1

center=4524,0,8290 // или 4524,8290 и так и так будет работать

radius=600

и тд

 

след секция

[zone:2]

 

итд итп

 

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


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

BorizzK 

json-формат заюзай, проще и нагляднее. там можно массивом задавать параметры даже

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


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

VIRrusR Ща вот в контору приехал

текучку разберу

Дежурным админам за чтонить ввалю

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

Затем затестирую

И выложу

Затем придет Ультима

Назовет все это кривотой и все обосрет, тк там лишний цЫкл, а тут зачем-то даункаст

И опять исчезнет в свой прораммистский адок )))

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


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

123new Мне больще linux-like конфиги нравятся

имхо это проще и менее затратно

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


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

BorizzK :joy:,Ультима - очень полезный раздражитель! Не даёт твоим мозгам усохнуть:wink: Как строчку кода напишешь, так у самого глаз подёргивается - "Ультима идёть!!! Счаз в пыль мою писанину разругает и еще, редиска такая, расскажет как надо было!.."

Он тебя по самому больному месту сисадминов - по самолюбию!..:joy:

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


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

VIRrusR Ну он часто прав, да и программист он опытный

Другое дело если критикуешь - предлагай, и не просто, а с примерам и тп

Но мне думается, не хочет он делиться профессиональными "секретами", оттого и сумбур в его попытка что-либо обьяснить

Но мы сами с усами )))

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


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

BorizzK ,не, то он специально! Пришёл, сказал, что ты всё неправильно делаешь и свалил. А сам сидит, смотрит, как ты голову ломаешь - где косяк?!

Ну, во-первых - забавно же, правда?

А во-вторых, вдруг ты чего и вправду придумаешь?

Весело и с пользой, ну типа вот как я тут туплю, под твоим чутким руководством!:joy::upsidedown:

 

P.S. Ты код то давай уже, что ли? А то щаз 123new придёть и нам всыпет за нарушение ССП.:wacko:

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


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

VIRrusR Ну так вот

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

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

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

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

	int							repeatMessagesCurrentStep;
	bool						messageSkip;

	void Zone() //Это конструктор. При создании нового экземляра "зоны" он будет выполняться. И в нем будет инициализироваться создание 2х массивов для этого экземпляра
	{
		Print("::: SERVER: [ZonesClass.c DEBUG]: Zone: Init.");
		// Массив типа map: он поддерживает методы Insert, Romove и Contains. Обычный массив методы Remove и Contsins не поддерживает.
		// Игроки вошедшие в зону будут помещаться в этот массив в конкретном экземпляре "зоны".
		// playersInZone.Instert(player, player.GetIdentity().GetPlayerId());
		// и удаляться из него при выходе из зоны
		// playersInZone.Remove(player);
		// Это нужно для проверки (что бы, например, не отправлять повторно сообщение о входе в зону)
		// playersInZone.Contains(player); - вернет true если игрок в массиве (те в зоне) или false если его там нет (не в зоне)
		playersInZone	=	new map<PlayerBase, int>; //Создание экземпляра в конкретном экземпляре класса
		Print("::: SERVER: [ZonesClass.c DEBUG]: Zone: new playersInZone array init: " + playersInZone.ToString());
		// Массив типа TString: он поддерживает методы Insert, Romove и Contains. Обычный массив методы Remove и Contsins не поддерживает.
		complect		=	new TStringArray; //Создание экземпляра в конкретном экземпляре класса //Комплект
		checkslots		=	new TStringArray; //Создание экземпляра в конкретном экземпляре класса //Слоты для проверки
		repeatMessagesCurrentStep = 0;
		messageSkip = false;
		Print("::: SERVER: [ZonesClass.c DEBUG]: Zone: new complect array init: " + complect);
	}
	
	void ~Zone()
	{
		
	}
}
ref array<ref Zone> ga_zones = new array<ref Zone>; //Массив класса Zone. В него помещаются ссылки на экземпляры класса откуда в последствии читаются параметры //zones array

ref ZonesClass Zones = new ZonesClass;
class ZonesClass
{
	//Default params:
	bool 				my_Zones_Debug 			= 	true;
	bool				my_Zones_Debug_Msg		=	false;
	bool				my_SafeZone_Debug		=	true;
	bool				my_PvpZone_Debug		=	true;
	bool				my_GasZone_Debug		=	true;
	bool				my_ChemZone_Debug		=	true;
	bool				my_BioZone_Debug		=	true;
	bool				my_RadZone_Debug		=	true;
	bool				my_DamageZone_Debug		=	true;
	bool 				my_Zone_Debug			=	true;
	int 				zone_Check_Timer		=	12; //Seconds
	bool				zone_Damage_Debug_Msg	=	false;

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

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

		/*
			"GP5GasMask","GasMask","PKM_MASK","Massblackgp5","NBCJacketGray","NBCHoodGray","NBCGlovesGray","NBCPantsGray","NBCBootsGray","MassNBCglovesBlue","MassNBCJacketYellow","MassNBCpantsYellow","MassNBCbootsYellow","MassNBChoodYellow"
		*/
		
		/*
		Params:
		1  	- zone name
		2  	- zone id
		3  	- zone center position
		4  	- zone radius
		5  	- zone type number (see enum ZoneType)
		6  	- warning distance, if 0 - warning disabled
		7  	- warning message during the approach to the zone
		8 	- message on enter to zone, if null - disabled
		9 	- zone message for player, if null - disabled
		10	- zone message repeat steps, if 0 - repeat message disabled
		11 	- exit zone message, if null - disabled
		12 	- damage coefficient for player
		13 	- player start symptoms threshold
		14	- symptom for player in current zone / add to player if health < damage coefficient for player
		15 	- items complect for check //for future
		16	- slots for check in zone
		17	- damage coefficient for items //for future
		18 	- item health threshold for start damage player	
		*/
		//В последствии мы не будем создавать зоны построчно, а будем читать их из файла (.json) и создавать в цикле.
		
		Name			= "Pavlovo"; //газ
		Id 				= 1;
		Center 			= "2125 0 3400";
		Radius			= 200.0;
		WarnMsg			= "Чувствую запах ядовитого газа... Мне нужен противогаз...";
		EnterMsg		= "Я кажется я вошел загазованную зону...";
		Msg				= "Я в загазованной зоне...";
		ExitMsg			= "Я покинул загазованную зону...";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"GP5GasMask","GasMask","PKM_MASK","Massblackgp5"};
		playerSlots		= {"Mask"};
	  	AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);
		
		Name			= "Dichina";
		Id 				= 2;
		Center 			= "4524 0 8290";
		Radius			= 60.0;
		WarnMsg			= "Чувствую странный запах... Мне нужен противогаз...";
		EnterMsg		= "Я кажется я вошел загазованную зону...";
		Msg				= "Я в загазованной зоне...";
		ExitMsg			= "Я покинул загазованную зону...";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"GP5GasMask","GasMask","PKM_MASK","Massblackgp5"};
		playerSlots		= {"Mask"};
		AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold);

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

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

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

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

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

		Print("::: SERVER: [ZonesClass.c DEBUG]: AddZone: zone.name: " + zone.name + ", zone.id: " + zone.id + ", zone.center: " + zone.center + ", zone.radius: " + zone.radius + ", type: " + zone.type + ", player_Dmg_Coef: " + zone.player_Dmg_Coef + ", player_Health_Threshold_Symptom: " + zone.player_Health_Threshold_Symptom + ", player_Symptom: " + zone.player_Symptom + ", item_Dmg_Coef: " + zone.item_Dmg_Coef + ", item_Health_Threshold: " + zone.item_Health_Threshold);
		Print("::: SERVER: [ZonesClass.c DEBUG]: AddZone: Complet items count: " + zone.complect.Count() + ", slots for check count: " + zone.checkslots.Count());
		Print("::: SERVER: [ZonesClass.c DEBUG]: AddZone: zone.warnenabled: " + zone.warnenabled.ToString() + ", zone.entermsgenabled = " + zone.entermsgenabled.ToString() + ", zone.messageenabled = " + zone.messageenabled.ToString() + ", zone.repeatmsg = " + zone.repeatmsg.ToString() + ", zone.exitmessageenabled = " + zone.exitmessageenabled.ToString());
	}
	
	void SendZoneMessage(PlayerBase player, string zonemessage)
	{
			Param1<string> m_MessageParam = new Param1<string>(zonemessage);
			GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity());
	}
	
	bool InZone(PlayerBase player, ref Zone zone)
	{
		if (zone.repeatmsgstep > 1)
		{
			if (zone.repeatMessagesCurrentStep >= zone.repeatmsgstep)
			{
				zone.repeatMessagesCurrentStep = 0;
			}
			if (zone.repeatMessagesCurrentStep == 0)
			{
				zone.messageSkip = false;	
			}
			else
			{
				zone.messageSkip = true;
			}
			zone.repeatMessagesCurrentStep++;
		}

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

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

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

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

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

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

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

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

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

Доработал - переработал

конечно же потребуется оптимизация

вобщем промежуточный вариант для изучения/обучения/обдумывания

 

2 часа гоняю на серве с онлайном 40 рыл

отрицательного влияния на производительность сервера не замечено - работает норм

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


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

BorizzK , так, просмотрел бегло... Вижу добавил два строковых массива - в один прописываем комплект защиты, во второй, если я правильно понял, возвращаем содержимое слотов инвентаря (что на игроке)?

Так, там какие-то модовые вещи, как я понимаю?.. Ладно, не суть.

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

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

А! Понял, кажись: прогоняем элемент массива checkslots вдоль всех элементов массива complect ? Если совпадение есть - проверяем состояние, дамажим, сравниваем шмотку из следующего слота.

Так, а если шмотки нет?..Ага! Ты ограничиваешься первым несоответствием - комплект не полон, защиты нет!

 

Верно понял? 

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

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


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

VIRrusR 

Для каждого экземпляра зоны, создаются два строковых массива - эталон cо списком комплекта

И! массив с именами СЛОТОВ

ибо если газовая зона - нафига нам проверять слоты кроме Mask ?

 

прогоняем элемент массива checkslots вдоль всех элементов массива complect

немного не так

 

там вообще просто

 

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

поместили в массив локальный и проходимся по нему

далее просто через Find ищем ее в массиве комплекта и не нужен цикл по комплекту

цикл за нас двигло исполнит

 

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

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


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

BorizzK , ага, вот это

if (player_Items[i] && zone.complect.Find(player_Items[i].GetType()) >= 0)

Я так понимаю, что .Find() - как раз и прогоняет полученный предмет по элементам массива complect ?

Не знал, что корректно сравнивать строковую NULL и 0... Нет, я понимаю, что это разное представление одного и того же, но всё же, то "слово", а то цифра.

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


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

VIRrusR Сравнивать NULL некорректно да

Но у нас-то что?

 

if (player_Items && zone.complect.Find(player_Items.GetType()) >= 0)

 

Условие проверяется слева на право

 

Если player_Items - НЕ NULL и в zone.complect найден класснейм из player_Items 

Find возвращает не булево true/false, а 0 и более - положение вхождения или -1 если вхождения нет

 

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

 

гадский движок сайта не дает вставлять i в квадратных скобках в текст

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

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


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

BorizzK ,а! Понял, кажется... 

У нас проверка "Если вещь есть (не NULL) и проверка на совпадение вернула положительное число...", так?

Только не совсем понял про .Find() - она нам возвращает... количество совпадений? То есть, её можно использовать, например, если нужно определить, сколько именно таких то предметов в массиве? 

А когда она  (-1) вернёт? Не понял, что значит "нет вхождения".

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

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


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

VIRrusR 

Find ищет ВХОЖДЕНИЕ и возвращает позицию первого символа вхождения - это для строки

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

подсчет - вот я не задавался вопросом
-1 она вернет если не найдет такого текста в строке или элементе массива

 

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

но суть я думаю ясна

 

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


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

BorizzK , погоди, если не найдёт, то (-1).

А 0 тогда она когда возвращает? Или она с 0 счёт начинает просто? Ну то есть элементы массива 0,1,2,3...?

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


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

VIRrusR -1 если не найдет ничего, либо номер элемента из массива, в котором ищется, если он найдет

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


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

123new ,да, это я понял, спасибо!:smile:

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

Find возвращает не булево true/false, а 0 и более

Я просто про 0 уточнить хочу - это значение, с которого начинается отсчёт элементов или это что-то иное?

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


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

VIRrusR для массива номер индекса в котором содержится данное слово

 

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


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

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

Ладно. Ну а что там ещё? Нового в твоём добавлении я особо не вижу так-то. Логика работы скрипта вполне понятна, тем более, что ты дал построчный комментарий, что совершенно облегчает понимание, спасибо! Так-то ты практически всё и реализовал, получается? Что там осталось? Навесить на игрока симптомы с сохранением и лечением, ну да и всё, пожалуй?.. Ах да! Ещё же планировалось все параметры задавать из некоего внешнего пользовательского файла.

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


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

VIRrusR загрузку из файла допишу на днях

Буду юзать классический .cfg

С симптомами понятно

Они кстати сами проходят

А вот надо агентов инсертить

Вот их как раз лечить надо

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


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

VIRrusR загрузку из файла допишу на днях

Буду юзать классический .cfg

С симптомами понятно

Они кстати сами проходят

А вот надо агентов инсертить

Вот их как раз лечить надо

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

    • Автор: 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, в противном случае мы будем считать, что вы согласны с этим.

Поддержка