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

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

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

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

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

Порча химзащиты в радиационной зоне

Приветствую. Первое. Как сделать чтобы одежда при спавне игрока была почти уничтожена?  И ещё как сделать чтобы при нахождении в радиации Химза постепенно руинилась от радиации? Если кто поможет буду благодарен. Можно сотрудничество за деньгу.

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


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

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

  • 0

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

1. Открываем на сервере файл: DayZServer\mpmissions\dayzOffline.enoch\init.c

В самом верху файла добавляем строку: 

#include "$CurrentDir:\\mpmissions\\dayzOffline.enoch\\DamagedZone.c"

2. В папке миссии создаём фаил DamagedZone.c с содержимым:

class Zone {
	int id;
	int type;
	vector pos;
	float radius;
}

enum ZoneType {
	SAFE,
	GAS,
	RAD,
	BIO
}

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

ref ControllerZones ctrl_zones = new ControllerZones;

class ControllerZones {
	void ControllerZones() {
		
		int id = 0;
		vector pos;
		float radius;
		int type = 0;

		id = 1; //Swarog
		pos = "5000 0 2100"; 
		radius = 500.0;
		AddZone(id, pos, radius);
		
		id = 2; //Lembork
		pos = "9000 0 6600"; 
		radius = 300.0;
		AddZone(id, pos, radius);
		
		id = 3; //Borek
		pos = "9800 0 8500"; 
		radius = 300.0;
		AddZone(id, pos, radius);
		
		id = 4; //Nadbor
		pos = "5600 0 3800"; 
		radius = 150.0;
		AddZone(id, pos, radius);
		
		id = 5; //Nidek
		pos = "6420 0 8170"; 
		radius = 100.0;
		AddZone(id, pos, radius);
		
		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckZones, 5000, true);
	}
	
	void ~ControllerZones() {
	}
	
	void AddZone(int id, vector pos, float radius, int type = ZoneType.BIO) {
		ref Zone zone = new ref Zone;
		
		zone.id = id;
		zone.pos = pos;
		zone.radius = radius;
		zone.type = type;

		ga_zones.Insert(zone);
	}
	
	bool InZone(PlayerBase player, ref Zone zone) {
		vector player_position = player.GetPosition();
		player_position[1] = 0;

		if( (vector.Distance(player_position, zone.pos)) < zone.radius ) {
			
			EntityAI attachment;
			ItemBase item;
			string className;
			float biosafe = 0;
			
			//Противогазы
			attachment = player.FindAttachmentBySlotName("Mask");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("GasMask") ) {
					biosafe = biosafe + 7.0;
				}
			}
			
			attachment = player.FindAttachmentBySlotName("Mask");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("GasMask") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
			
			attachment = player.FindAttachmentBySlotName("Mask");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("GP5GasMask") ) {
					biosafe = biosafe + 7.0;
				}
			}
			
			attachment = player.FindAttachmentBySlotName("Mask");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("GP5GasMask") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
						
			//Головной убор
			attachment = player.FindAttachmentBySlotName("Headgear");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCHoodGray") ) {
					biosafe = biosafe + 1.0;
				}	
			}
			
			attachment = player.FindAttachmentBySlotName("Headgear");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCHoodGray") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
						
			//Куртки
			attachment = player.FindAttachmentBySlotName("Body");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCJacketGray") ) {
					biosafe = biosafe + 1.0;
				}	
			}
			
			attachment = player.FindAttachmentBySlotName("Body");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCJacketGray") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
						
			//Штаны
			attachment = player.FindAttachmentBySlotName("Legs");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCPantsGray") ) {
					biosafe = biosafe + 1.0;
				}	
			}
			
			attachment = player.FindAttachmentBySlotName("Legs");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCPantsGray") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
			
			//Обувь
			attachment = player.FindAttachmentBySlotName("Feet"); 
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCBootsGray") ) {
					biosafe = biosafe + 1.0;
				}	
			}
			
			attachment = player.FindAttachmentBySlotName("Feet");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCBootsGray") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
			
			//Перчатки
			attachment = player.FindAttachmentBySlotName("Gloves");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCGlovesGray") ) {
					biosafe = biosafe + 1.0;
				}
			}
			
			attachment = player.FindAttachmentBySlotName("Gloves");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCGlovesGray") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
									
			if ( biosafe > 11.0 )
				return true;
			
			float damage_player;
			float damage_zone = 12.0;
			damage_player = player.GetHealth("GlobalHealth", "Health");
			player.SetHealth("GlobalHealth", "Health", damage_player - (damage_zone - ((damage_zone / 12) * biosafe)));
			
			player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_COUGH);
			
			Param1<string> m_MessageParam = new Param1<string>("ОПАСНАЯ ЗОНА!!! Вам нужны химзащита и противогаз!");
			GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); 
			
			return true;
		}
		
		return false;
	}
	
	void CheckZones() {
		ref array<Man> players = new array<Man>;
		GetGame().GetPlayers( players );
		
		for ( int i = 0; i < players.Count(); i++ )
		{
			PlayerBase player;
			Class.CastTo(player, players.Get(i));
			
			for ( int j = 0; j < ga_zones.Count(); j++ ) {
				if(InZone(player, ga_zones.Get(j))) {
					break;
				}
			}
		}
	}
}

Зоны прописываем: 

 

id = 1; //Swarog… по порядку сколько зон нужно id = 2; id = 3; id = 4; и т.д.

pos = "5000 0 2100"; //Координаты зоны смотрим на карте https://dayz.ginfo.gg/livoniaSat/

radius = 500.0; //Радиус зоны (радиус... учили в школе помните...)

AddZone(id, pos, radius);

 

Данные взяты из раздела 

 + немножко модернизирован, чтобы наносился урон химзащите при нахождении в зоне и увеличено количество очков противогазам при подсчёте нанесения урона...

Все благодарности за этот скрипт непосредственно автору скрипта, не мне!

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

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


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





  • 2
3 часа назад, Eduard сказал:

MedicalAttention

 

значит касаемо радиации.

scripts\4_World\classes\playermodifiers\modifiers\biohazzard.c

при активации зоны (входе игрока)

override protected void OnActivate(PlayerBase player)
	{
		if (player.GetNotifiersManager()) player.GetNotifiersManager().ActivateByType(MedicalAttentionNotifiers.NTF_POISONED);
	}

при деактивации зоны (выходе игрока)

override protected void OnDeactivate(PlayerBase player)
	{
		if (player.GetNotifiersManager()) player.GetNotifiersManager().DeactivateByType(MedicalAttentionNotifiers.NTF_POISONED);
	}

во время нахождения в зоне игрока

override protected void OnTick(PlayerBase player, float deltaT)
	{
		int count = player.GetSingleAgentCount(MedicalAttentionAgents.UNKNOWN_TOXINE);
		int countMax = PluginTransmissionAgents.GetAgentMaxCount(MedicalAttentionAgents.UNKNOWN_TOXINE);

		float protection = (float)player.m_SuitProtectionLevel / 100;
		if (protection > 1)
		{
			protection = 1;
		}

		float accumulationRate = 0;

		if (protection == 1)
		{
			accumulationRate = 0.278; //PluginTransmissionAgents.GetDieOffSpeed(MedicalAttentionAgents.UNKNOWN_TOXINE);
		}
		else // protection < 1
		{
			float accumulationTime = Math.Lerp(MAGlobals.Get().g_ToxinAccumulationTimeMin, MAGlobals.Get().g_ToxinAccumulationTimeMax, protection) * 60;
			accumulationRate = (float)countMax / accumulationTime + 0.278;
		}

		float amount = accumulationRate * deltaT;

		if (count + amount > countMax)
		{
			amount = countMax - count;
		}
		player.InsertAgent(MedicalAttentionAgents.UNKNOWN_TOXINE, amount);

		// Obsolete
		float damage = MAGlobals.Get().g_BiohazardDamage * (1 - protection);
		player.AddHealth("GlobalHealth", "Health" , damage * deltaT * -1);
	}

что дописывать:

EntityAI attachment = player.FindAttachmentBySlotName("Mask");
if ( attachment && attachment.IsItemBase() ) {
	ItemBase item		=	Class.Cast(attachment);
	string className	=	item.GetType();
	if ( className.Contains("GP5GasMask") ) {
		itemEnt.SetHealth("","",itemEnt.GetHealth() - 0.2);
	}
}

ну и по аналогии с нужными слотами в инвентаре и id вещей блоки делаем (я просто понятия не имею из чего там сет состоит и куда крепится). В примере если в слоте масок найден гп5 то здоровье предмета на 0.2 уменьшится.

id слотов можешь найти в скрипте например тут

Что модифицировать - думаю функцию OnTick

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


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

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

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

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


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

@123new с SetHealth() и GetHealth() понятно, а как скриптом узнать максимально возможное значение здоровья у класса, то что прописано в DamageSystem?

И также было интересно узнать как узнать максимальный возможный Quantity для тех классов у которых есть varMaxQuantity в конфиге?

Заранее спасибо за подсказку!

getMaxHealth? ну так, в теории

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


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

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

MedicalAttention

 

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


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

насчет при спавне игрока - если скриптов никаких не стоит, то стандартная система спавна игрока - в init.c миссии сервера функция StartingEquipSetup(PlayerBase player, bool clothesChosen) выдает стартовый лут. В функции SetRandomHealth(EntityAI itemEnt) которая из выше названной вызывается для одного из предметов есть явный пример того как задавать здоровье вещички. Попробуйте поиграться с коммандами, обучитесь сами, опыт хороший.

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

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


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

Чёт однако не пошло при добавлении блока

EntityAI attachment = player.FindAttachmentBySlotName("Mask"); if ( attachment && attachment.IsItemBase() ) { ItemBase item = Class.Cast(attachment); string className = item.GetType(); if ( className.Contains("GP5GasMask") ) { itemEnt.SetHealth("","",itemEnt.GetHealth() - 0.2); } }

OxygenDamageInMA/scripts/4_World/classes\playermodifiers\modifiers\biohazzard.c(10): Can't find variable 'itemEnt'

 

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


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

scripts\4_World\classes\playermodifiers\modifiers\biohazzard.c

сюда прописывать только модом?

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


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

@123new с SetHealth() и GetHealth() понятно, а как скриптом узнать максимально возможное значение здоровья у класса, то что прописано в DamageSystem?

И также было интересно узнать как узнать максимальный возможный Quantity для тех классов у которых есть varMaxQuantity в конфиге?

Заранее спасибо за подсказку!

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

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


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

Оказалось не только в теории)))

GetMaxHealth("","Health") и GetQuantityMax() соответственно)

Спасибо!

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


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

Оказалось не только в теории)))

GetMaxHealth("","Health") и GetQuantityMax() соответственно)

Спасибо!

было бы неплохо эту информацию еще в теме

публиковать. Всетаки не одни мы тут, а так в одной теме все что надо будет всем)

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


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

было бы неплохо эту информацию еще в теме

публиковать. Всетаки не одни мы тут, а так в одной теме все что надо будет всем)

Я надеюсь автор указанного топика дополнит, раз уж взялся за полезный труд))

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


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

Я надеюсь автор указанного топика дополнит, раз уж взялся за полезный труд))

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

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

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


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

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

Я прошу не обижать, правда. Я просто не уверен в правильности терминов и оформления поста. Я только учусь. В любом случае добавил, если не правильно, то исправите сами.

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


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

Еще бы проверку есть ли у противогаза фильтр. 

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
07.04.2020 в 23:00, SparD сказал:
Скрытый текст

 

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

1. Открываем на сервере файл: DayZServer\mpmissions\dayzOffline.enoch\init.c

В самом верху файла добавляем строку: 

#include "$CurrentDir:\\mpmissions\\dayzOffline.enoch\\DamagedZone.c"



#include "$CurrentDir:\\mpmissions\\dayzOffline.enoch\\DamagedZone.c"


2. В папке миссии создаём фаил DamagedZone.c с содержимым:

class Zone { int id; int type; vector pos; float radius; } enum ZoneType { SAFE, GAS, RAD, BIO } ref array<ref Zone> ga_zones = new array<ref Zone>; ref ControllerZones ctrl_zones = new ControllerZones; class ControllerZones { void ControllerZones() { int id = 0; vector pos; float radius; int type = 0; id = 1; //Swarog pos = "5000 0 2100"; radius = 500.0; AddZone(id, pos, radius); id = 2; //Lembork pos = "9000 0 6600"; radius = 300.0; AddZone(id, pos, radius); id = 3; //Borek pos = "9800 0 8500"; radius = 300.0; AddZone(id, pos, radius); id = 4; //Nadbor pos = "5600 0 3800"; radius = 150.0; AddZone(id, pos, radius); id = 5; //Nidek pos = "6420 0 8170"; radius = 100.0; AddZone(id, pos, radius); GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckZones, 5000, true); } void ~ControllerZones() { } void AddZone(int id, vector pos, float radius, int type = ZoneType.BIO) { ref Zone zone = new ref Zone; zone.id = id; zone.pos = pos; zone.radius = radius; zone.type = type; ga_zones.Insert(zone); } bool InZone(PlayerBase player, ref Zone zone) { vector player_position = player.GetPosition(); player_position[1] = 0; if( (vector.Distance(player_position, zone.pos)) < zone.radius ) { EntityAI attachment; ItemBase item; string className; float biosafe = 0; //Противогазы attachment = player.FindAttachmentBySlotName("Mask"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("GasMask") ) { biosafe = biosafe + 7.0; } } attachment = player.FindAttachmentBySlotName("Mask"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("GasMask") ) { item.SetHealth("","",item.GetHealth() - 0.2); } } attachment = player.FindAttachmentBySlotName("Mask"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("GP5GasMask") ) { biosafe = biosafe + 7.0; } } attachment = player.FindAttachmentBySlotName("Mask"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("GP5GasMask") ) { item.SetHealth("","",item.GetHealth() - 0.2); } } //Головной убор attachment = player.FindAttachmentBySlotName("Headgear"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("NBCHoodGray") ) { biosafe = biosafe + 1.0; } } attachment = player.FindAttachmentBySlotName("Headgear"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("NBCHoodGray") ) { item.SetHealth("","",item.GetHealth() - 0.2); } } //Куртки attachment = player.FindAttachmentBySlotName("Body"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("NBCJacketGray") ) { biosafe = biosafe + 1.0; } } attachment = player.FindAttachmentBySlotName("Body"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("NBCJacketGray") ) { item.SetHealth("","",item.GetHealth() - 0.2); } } //Штаны attachment = player.FindAttachmentBySlotName("Legs"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("NBCPantsGray") ) { biosafe = biosafe + 1.0; } } attachment = player.FindAttachmentBySlotName("Legs"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("NBCPantsGray") ) { item.SetHealth("","",item.GetHealth() - 0.2); } } //Обувь attachment = player.FindAttachmentBySlotName("Feet"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("NBCBootsGray") ) { biosafe = biosafe + 1.0; } } attachment = player.FindAttachmentBySlotName("Feet"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("NBCBootsGray") ) { item.SetHealth("","",item.GetHealth() - 0.2); } } //Перчатки attachment = player.FindAttachmentBySlotName("Gloves"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("NBCGlovesGray") ) { biosafe = biosafe + 1.0; } } attachment = player.FindAttachmentBySlotName("Gloves"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("NBCGlovesGray") ) { item.SetHealth("","",item.GetHealth() - 0.2); } } if ( biosafe > 11.0 ) return true; float damage_player; float damage_zone = 12.0; damage_player = player.GetHealth("GlobalHealth", "Health"); player.SetHealth("GlobalHealth", "Health", damage_player - (damage_zone - ((damage_zone / 12) * biosafe))); player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_COUGH); Param1<string> m_MessageParam = new Param1<string>("ОПАСНАЯ ЗОНА!!! Вам нужны химзащита и противогаз!"); GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); return true; } return false; } void CheckZones() { ref array<Man> players = new array<Man>; GetGame().GetPlayers( players ); for ( int i = 0; i < players.Count(); i++ ) { PlayerBase player; Class.CastTo(player, players.Get(i)); for ( int j = 0; j < ga_zones.Count(); j++ ) { if(InZone(player, ga_zones.Get(j))) { break; } } } } }


class Zone {
	int id;
	int type;
	vector pos;
	float radius;
}

enum ZoneType {
	SAFE,
	GAS,
	RAD,
	BIO
}

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

ref ControllerZones ctrl_zones = new ControllerZones;

class ControllerZones {
	void ControllerZones() {
		
		int id = 0;
		vector pos;
		float radius;
		int type = 0;

		id = 1; //Swarog
		pos = "5000 0 2100"; 
		radius = 500.0;
		AddZone(id, pos, radius);
		
		id = 2; //Lembork
		pos = "9000 0 6600"; 
		radius = 300.0;
		AddZone(id, pos, radius);
		
		id = 3; //Borek
		pos = "9800 0 8500"; 
		radius = 300.0;
		AddZone(id, pos, radius);
		
		id = 4; //Nadbor
		pos = "5600 0 3800"; 
		radius = 150.0;
		AddZone(id, pos, radius);
		
		id = 5; //Nidek
		pos = "6420 0 8170"; 
		radius = 100.0;
		AddZone(id, pos, radius);
		
		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckZones, 5000, true);
	}
	
	void ~ControllerZones() {
	}
	
	void AddZone(int id, vector pos, float radius, int type = ZoneType.BIO) {
		ref Zone zone = new ref Zone;
		
		zone.id = id;
		zone.pos = pos;
		zone.radius = radius;
		zone.type = type;

		ga_zones.Insert(zone);
	}
	
	bool InZone(PlayerBase player, ref Zone zone) {
		vector player_position = player.GetPosition();
		player_position[1] = 0;

		if( (vector.Distance(player_position, zone.pos)) < zone.radius ) {
			
			EntityAI attachment;
			ItemBase item;
			string className;
			float biosafe = 0;
			
			//Противогазы
			attachment = player.FindAttachmentBySlotName("Mask");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("GasMask") ) {
					biosafe = biosafe + 7.0;
				}
			}
			
			attachment = player.FindAttachmentBySlotName("Mask");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("GasMask") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
			
			attachment = player.FindAttachmentBySlotName("Mask");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("GP5GasMask") ) {
					biosafe = biosafe + 7.0;
				}
			}
			
			attachment = player.FindAttachmentBySlotName("Mask");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("GP5GasMask") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
						
			//Головной убор
			attachment = player.FindAttachmentBySlotName("Headgear");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCHoodGray") ) {
					biosafe = biosafe + 1.0;
				}	
			}
			
			attachment = player.FindAttachmentBySlotName("Headgear");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCHoodGray") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
						
			//Куртки
			attachment = player.FindAttachmentBySlotName("Body");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCJacketGray") ) {
					biosafe = biosafe + 1.0;
				}	
			}
			
			attachment = player.FindAttachmentBySlotName("Body");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCJacketGray") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
						
			//Штаны
			attachment = player.FindAttachmentBySlotName("Legs");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCPantsGray") ) {
					biosafe = biosafe + 1.0;
				}	
			}
			
			attachment = player.FindAttachmentBySlotName("Legs");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCPantsGray") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
			
			//Обувь
			attachment = player.FindAttachmentBySlotName("Feet"); 
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCBootsGray") ) {
					biosafe = biosafe + 1.0;
				}	
			}
			
			attachment = player.FindAttachmentBySlotName("Feet");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCBootsGray") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
			
			//Перчатки
			attachment = player.FindAttachmentBySlotName("Gloves");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCGlovesGray") ) {
					biosafe = biosafe + 1.0;
				}
			}
			
			attachment = player.FindAttachmentBySlotName("Gloves");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCGlovesGray") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
									
			if ( biosafe > 11.0 )
				return true;
			
			float damage_player;
			float damage_zone = 12.0;
			damage_player = player.GetHealth("GlobalHealth", "Health");
			player.SetHealth("GlobalHealth", "Health", damage_player - (damage_zone - ((damage_zone / 12) * biosafe)));
			
			player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_COUGH);
			
			Param1<string> m_MessageParam = new Param1<string>("ОПАСНАЯ ЗОНА!!! Вам нужны химзащита и противогаз!");
			GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); 
			
			return true;
		}
		
		return false;
	}
	
	void CheckZones() {
		ref array<Man> players = new array<Man>;
		GetGame().GetPlayers( players );
		
		for ( int i = 0; i < players.Count(); i++ )
		{
			PlayerBase player;
			Class.CastTo(player, players.Get(i));
			
			for ( int j = 0; j < ga_zones.Count(); j++ ) {
				if(InZone(player, ga_zones.Get(j))) {
					break;
				}
			}
		}
	}
}

Зоны прописываем: 

 

id = 1; //Swarog… по порядку сколько зон нужно id = 2; id = 3; id = 4; и т.д.

pos = "5000 0 2100"; //Координаты зоны смотрим на карте https://dayz.ginfo.gg/livoniaSat/

radius = 500.0; //Радиус зоны (радиус... учили в школе помните...)

AddZone(id, pos, radius);

 

Данные взяты из раздела 

 + немножко модернизирован, чтобы наносился урон химзащите при нахождении в зоне и увеличено количество очков противогазам при подсчёте нанесения урона...

Все благодарности за этот скрипт непосредственно автору скрипта, не мне!

 

 

 

Обнаружил баг )))

Хожу в химзе и противогазе, противогаз уже уничтожен но код его видит что одет и считает что защищен

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

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


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

а вот решение 

 

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


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

Только его желательно немного допилить, так как Health у всех предметов разное, а значит и уровень защиты надо вычислять с учетом максимального возможного значения используя GetMaxHealth("","Health")

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


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

Да вроде нормально по процентам выставляется, а урон вещам подбирается тестами :)

просто я бегал в уничтоженном противогазе и сервер думал что я защищен

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


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

Я просто не знаю, что у вас за зоны... У меня для этого МА, поэтому я оверрайдил его biohazard и прямо туда вкатил все проверки на степень защищенности и урон по химзе. Поэтому химза у меня потихоньку убивается при нахождении в его зоне и одновренно с этим растет количество получаемого заражения. В теории можно дотерпеть пока химза полностью не заруинится, но пациент не доживет до этого момента)))

Я уже передал скрипт Люсьену, он скорее всего включит его в одно из следующих обновлений мода.

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

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


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

Я просто не знаю, что у вас за зоны... У меня для этого МА, поэтому я оверрайдил его biohazard и прямо туда вкатил все проверки на степень защищенности и урон по химзе. Поэтому химза у меня потихоньку убивается при нахождении в его зоне и одновренно с этим растет количество получаемого заражения. В теории можно дотерпеть пока химза полностью не заруинится, но пациент не доживет до этого момента)))

Я уже передал скрипт Люсьену, он скорее всего включит его в одно из следующих обновлений мода.

 

Это отлично! как раз его мод смотрел сегодня и увидел что зоны ввел, еще бы радиацию отдельной болячкой для разнообраия :)

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


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

 

Это отлично! как раз его мод смотрел сегодня и увидел что зоны ввел, еще бы радиацию отдельной болячкой для разнообраия 🙂

У него эти зоны уже очень давно, год наверное... Это не радиация, это биологическое заражение, но тем не менее очень и очень неприятное))) Если хапнуть не много, только 1/4 от максимума то выжить можно (болячка проходит сама собой со временем, лекарства нет), но при большем заражении легко отдать концы, если нет большого запаса крови и физраствора, а также желательно друга рядом, который откачает если что)

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


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

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

по мне чем больше болячек тем интереснее, да и подскажи ему что бы можно было сделать тестер для определение болячек поживучей чтоб раза на 3-4 хватало

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
09.04.2020 в 15:27, Ewgen сказал:

 

Обнаружил баг )))

Хожу в химзе и противогазе, противогаз уже уничтожен но код его видит что одет и считает что защищен

Маленько поправил... теперь если вещь уничтожена наноситься урон... (по гайду VIRrusR опубликовал тему в Помощь)

class Zone {
	int id;
	int type;
	vector pos;
	float radius;
}

enum ZoneType {
	SAFE,
	GAS,
	RAD,
	BIO
}

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

ref ControllerZones ctrl_zones = new ControllerZones;

class ControllerZones {
	void ControllerZones() {
		
		int id = 0;
		vector pos;
		float radius;
		int type = 0;

		id = 1; //Swarog
		pos = "5000 0 2100"; 
		radius = 500.0;
		AddZone(id, pos, radius);
		
		id = 2; //Lembork
		pos = "9000 0 6600"; 
		radius = 300.0;
		AddZone(id, pos, radius);
		
		id = 3; //Borek
		pos = "9800 0 8500"; 
		radius = 300.0;
		AddZone(id, pos, radius);
		
		id = 4; //Nadbor
		pos = "5600 0 3800"; 
		radius = 150.0;
		AddZone(id, pos, radius);
		
		id = 5; //Nidek
		pos = "6420 0 8170"; 
		radius = 100.0;
		AddZone(id, pos, radius);
		
		id = 5; //Разлом
		pos = "7400 0 2600"; 
		radius = 300.0;
		AddZone(id, pos, radius);
		
		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckZones, 5000, true);
	}
	
	void ~ControllerZones() {
	}
	
	void AddZone(int id, vector pos, float radius, int type = ZoneType.BIO) {
		ref Zone zone = new ref Zone;
		
		zone.id = id;
		zone.pos = pos;
		zone.radius = radius;
		zone.type = type;

		ga_zones.Insert(zone);
	}
	
	bool InZone(PlayerBase player, ref Zone zone) {
		vector player_position = player.GetPosition();
		player_position[1] = 0;

		if( (vector.Distance(player_position, zone.pos)) < zone.radius ) {
			
			EntityAI attachment;
			ItemBase item;
			string className;
			float biosafe = 0;
			
			//Противогазы
			attachment = player.FindAttachmentBySlotName("Mask");
			if ( attachment && attachment.IsItemBase() ) 
			{
				item		=	ItemBase.Cast(attachment);
				if (( item.GetType().Contains("GP5GasMask") || ( item.GetType().Contains("GasMask")) && ((item.GetHealth()) > 0) ) 
  				{
					biosafe = biosafe + 7.0; 
				}
			}
			
			attachment = player.FindAttachmentBySlotName("Mask");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("GP5GasMask") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
			
			attachment = player.FindAttachmentBySlotName("Mask");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("GasMask") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
					
			//Головной убор
			attachment = player.FindAttachmentBySlotName("Headgear");
			if ( attachment && attachment.IsItemBase() ) 
			{
				item		=	ItemBase.Cast(attachment);
				if (( item.GetType().Contains("NBCHoodGray") ) && ((item.GetHealth()) > 0) ) 
  				{
					biosafe = biosafe + 1.0; 
				}
			}
			
			attachment = player.FindAttachmentBySlotName("Headgear");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCHoodGray") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
						
			//Куртки
			attachment = player.FindAttachmentBySlotName("Body");
			if ( attachment && attachment.IsItemBase() ) 
			{
				item		=	ItemBase.Cast(attachment);
				if (( item.GetType().Contains("NBCJacketGray") ) && ((item.GetHealth()) > 0) ) 
  				{
					biosafe = biosafe + 1.0; 
				}
			}
			
			attachment = player.FindAttachmentBySlotName("Body");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCJacketGray") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
						
			//Штаны
			attachment = player.FindAttachmentBySlotName("Legs");
			if ( attachment && attachment.IsItemBase() ) 
			{
				item		=	ItemBase.Cast(attachment);
				if (( item.GetType().Contains("NBCPantsGray") ) && ((item.GetHealth()) > 0) ) 
  				{
					biosafe = biosafe + 1.0; 
				}
			}
			
			attachment = player.FindAttachmentBySlotName("Legs");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCPantsGray") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
			
			//Обувь
			attachment = player.FindAttachmentBySlotName("Feet");
			if ( attachment && attachment.IsItemBase() ) 
			{
				item		=	ItemBase.Cast(attachment);
				if (( item.GetType().Contains("NBCBootsGray") ) && ((item.GetHealth()) > 0) ) 
  				{
					biosafe = biosafe + 1.0; 
				}
			}
			
			attachment = player.FindAttachmentBySlotName("Feet");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCBootsGray") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}
			
			//Перчатки
			attachment = player.FindAttachmentBySlotName("Gloves");
			if ( attachment && attachment.IsItemBase() ) 
			{
				item		=	ItemBase.Cast(attachment);
				if (( item.GetType().Contains("NBCGlovesGray") ) && ((item.GetHealth()) > 0) ) 
  				{
					biosafe = biosafe + 1.0; 
				}
			}	

			attachment = player.FindAttachmentBySlotName("Gloves");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("NBCGlovesGray") ) {
					item.SetHealth("","",item.GetHealth() - 0.2);
				}
			}			
									
			if ( biosafe > 11.0 )
				return true;
			
			float damage_player;
			float damage_zone = 12.0;
			damage_player = player.GetHealth("GlobalHealth", "Health");
			player.SetHealth("GlobalHealth", "Health", damage_player - (damage_zone - ((damage_zone / 12) * biosafe)));
			
			player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_COUGH);
			
			Param1<string> m_MessageParam = new Param1<string>("ОПАСНАЯ ЗОНА!!! Вам нужны химзащита и противогаз!");
			GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); 
			
			return true;
		}
		
		return false;
	}
	
	void CheckZones() {
		ref array<Man> players = new array<Man>;
		GetGame().GetPlayers( players );
		
		for ( int i = 0; i < players.Count(); i++ )
		{
			PlayerBase player;
			Class.CastTo(player, players.Get(i));
			
			for ( int j = 0; j < ga_zones.Count(); j++ ) {
				if(InZone(player, ga_zones.Get(j))) {
					break;
				}
			}
		}
	}
}

 

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

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


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

@SparD добрый день, подскажите пожалуйста, как совместить скрипт с медикал аттеншн? При одновременном подключении конфликт. Заранее спасибо

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

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