class Zone { int id; int type; vector pos; float radius; } enum ZoneType { SAFE, PSI, RAD, BIO } ref array ga_zones = new array; ref ControllerZones ctrl_zones = new ControllerZones; class ControllerZones { void ControllerZones() { int id = 0;// vector pos; float radius; int type = 0; // only RAD param ↓↓↓ id = id + 1; // Територия янтаратя 200 метров RAD pos = "2405 0 6541"; radius = 200.0; AddZone(id, pos, radius, ZoneType.RAD); // only PSI param ↓↓↓ id = id + 1; // Територия янтаратя 200 метров PSI pos = "2405 0 6541"; radius = 200.0; AddZone(id, pos, radius, ZoneType.PSI); GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckZones, 5000, true); } void ~ControllerZones() { } void AddZone(int id, vector pos, float radius, int type) { 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; EntityAI attachment; ItemBase item; string className; float biosafe = 0; float psisafe = 0; float damage_player; float damage_zone = 0; float damage_zonePSI = 8.0; float rpu = 1.0; if( (vector.Distance(player_position, zone.pos)) < zone.radius && zone.type == ZoneType.RAD) { attachment = player.FindAttachmentBySlotName("Mask"); // Перечеь защиты от радиации if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("dzrp_GasMask_GP1") ) { biosafe = biosafe + 1.0; } } attachment = player.FindAttachmentBySlotName("Body"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("Top_Admin") ) { biosafe = biosafe + 1.0; } } if (((ga_zones.Get(j).radius - (vector.Distance(player_position, ga_zones.Get(j).pos)) ) * rpu) > 1 ) { radiationcnt = ((ga_zones.Get(j).radius - (vector.Distance(player_position, ga_zones.Get(j).pos)) ) * rpu) + Math.RandomInt(1,10000)*0.00001; if ( DayZRP_Static.IsItemInInventory( player, "DayZRP_Doz" ) ){ Param1 m_MessageParamRD = new Param1( "Дозиметр : " + radiationcnt + "м3в" ); GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParamRD, true, player.GetIdentity()); } } if (biosafe<1) { damage_zone=((ga_zones.Get(j).radius - (vector.Distance(player_position, ga_zones.Get(j).pos)) ) * rpu)/50; damage_player = player.GetHealth("GlobalHealth", "Health"); player.SetHealth("GlobalHealth", "Health", damage_player - (damage_zone - (damage_zone * biosafe))); if (biosafe==0) { player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_COUGH); //Кашель Param1 m_MessageParam = new Param1("Воздействие Радиации! Одень противогаз!"); GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); } } } else if((vector.Distance(player_position, zone.pos)) < zone.radius && zone.type == ZoneType.PSI) { attachment = player.FindAttachmentBySlotName("Mask");// Перечеь защиты от PSI if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("dzrp_GasMask_GP7") ) { psisafe = psisafe + 1.0; } } attachment = player.FindAttachmentBySlotName("Body"); if ( attachment && attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( className.Contains("Top_Admin") ) { psisafe = psisafe + 1.0; } } damage_player = player.GetHealth("GlobalHealth", "Health"); player.SetHealth("GlobalHealth", "Health", damage_player - (damage_zonePSI - (damage_zonePSI * psisafe))); if (psisafe>=1) { return true; } if (psisafe==0) { if (psisafe<0.5) { player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_VOMIT); // рвота // SNEEZE - чихать } Param1 m_MessageParamPSI = new Param1("Воздействие PSI! Нужно бежать!"); GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParamPSI, true, player.GetIdentity()); } return true; } return false; } void CheckZones() { ref array players = new array; 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; } } } } }