Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
  • 0
TatariN_174

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

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

Share this post


Link to post
Share on other sites

Recommended Posts

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

 

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

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

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

Edited by SparD (see edit history)

Share this post


Link to post
Share on other sites









  • 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

Share this post


Link to post
Share on other sites
  • 1

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

Edited by 123new (see edit history)

Share this post


Link to post
Share on other sites
  • 1
34 минуты назад, StanislavSay сказал:

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

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

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

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

Share this post


Link to post
Share on other sites
  • 0
2 минуты назад, 123new сказал:

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

MedicalAttention

 

Share this post


Link to post
Share on other sites
  • 0

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

Edited by 123new (see edit history)

Share this post


Link to post
Share on other sites
  • 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'

 

Share this post


Link to post
Share on other sites
  • 0

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

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

Share this post


Link to post
Share on other sites
  • 0

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

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

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

Edited by StanislavSay (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

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

Спасибо!

Share this post


Link to post
Share on other sites
  • 0
21 минуту назад, StanislavSay сказал:

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

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

Спасибо!

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

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

Share this post


Link to post
Share on other sites
  • 0
2 часа назад, 123new сказал:

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

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

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

Share this post


Link to post
Share on other sites
  • 0
4 часа назад, StanislavSay сказал:

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

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

Edited by 123new (see edit history)

Share this post


Link to post
Share on other sites
  • 0
40 минут назад, 123new сказал:

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

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

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 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);

 

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

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

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

 

 

 

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

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

Edited by Ewgen (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 0

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

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

Share this post


Link to post
Share on other sites
  • 0

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

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

Edited by StanislavSay (see edit history)

Share this post


Link to post
Share on other sites
  • 0
Только что, StanislavSay сказал:

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

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

 

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

Share this post


Link to post
Share on other sites
  • 0
2 минуты назад, Ewgen сказал:

 

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

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

Share this post


Link to post
Share on other sites
  • 0

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

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

Share this post


Link to post
Share on other sites
  • 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;
				}
			}
		}
	}
}

 

Edited by SparD (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.