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

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

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

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

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

Триггеры с газом[1.0][By NoNameUltima]

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

2 минуты назад, FreddyCruger сказал:
  Показать содержимое

//AUTHOR: elanc s-platoon.ru //EDITOR: BORIZZ.K s-platoon.ru //VERSION: 29.04.2019.1355 enum ZoneTypeRad //Это для удобства - перечисление //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; //тип зоны (см ZoneTypeRad) //Приближение к зоне 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 = ZoneTypeRad.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.432; //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 = 100.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.015; //17 //Per Second // 0.050 - Radio // 0.031 - Others item_Dmg_Coef = item_Dmg_Coef * zone_Check_Timer; float item_Health_Threshold = 50.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 ZoneTypeRad) 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 = "AES STATION"; //газ 1 level Id = 1; Center = "4793 0 7078"; Radius = 455.0; WarnMsg = ""; EnterMsg = ""; Msg = ""; ExitMsg = ""; player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT; itemsComplect = {"GP5GasMask","GasMask","Massblackgp5","BP2_Gas_mask","mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"}; 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 = "Voenka"; //газ 1 level Id = 2; Center = "6681 0 6898"; Radius = 305.0; WarnMsg = ""; EnterMsg = ""; Msg = ""; ExitMsg = ""; player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT; itemsComplect = {"GP5GasMask","GasMask","Massblackgp5","BP2_Gas_mask","mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"}; 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 = "AirPort Milo"; //газ 2 level Id = 3; Center = "5512 0 3463"; Radius = 795.0; WarnMsg = ""; EnterMsg = ""; Msg = ""; ExitMsg = ""; player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT; itemsComplect = {"mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"}; 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 = "Paris"; //газ 3 level Id = 4; Center = "2896 0 3979"; Radius = 605.0; WarnMsg = ""; EnterMsg = ""; Msg = ""; ExitMsg = ""; player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT; itemsComplect = {"AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"}; 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 = "Balota"; //газ 2 level Id = 5; Center = "3676 0 8832"; Radius = 505.0; WarnMsg = ""; EnterMsg = ""; Msg = ""; ExitMsg = ""; player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_COUGH; itemsComplect = {"mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"}; 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 = "Oceanville"; //газ 1 level Id = 6; Center = "10072 0 4125"; Radius = 2155.0; WarnMsg = "ВНИМАНИЕ: ВЫ ПРИБЛИЖАЕТЕСЬ К ОПАСНОЙ ЗОНЕ"; EnterMsg = "ВНИМАНИЕ: ВЫ ВОШЛИ В ОПАСНУЮ ЗОНУ"; Msg = "ВНИМАНИЕ: ВЫ НАХОДИТЕСЬ В ОПАСНОЙ ЗОНЕ. ЗДЕСЬ ВАС МОГУТ УБИТЬ"; ExitMsg = "ВНИМАНИЕ: ВЫ ПОКИНУЛИ ОПАСНУЮ ЗОНУ"; player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT; itemsComplect = {"GP5GasMask","GasMask","Massblackgp5","BP2_Gas_mask","mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"}; 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 = "Mountain"; //газ 3 level Id = 7; Center = "7168 0 11683"; Radius = 605.0; WarnMsg = ""; EnterMsg = ""; Msg = ""; ExitMsg = ""; player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT; itemsComplect = {"AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"}; 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 = "AREA42"; //газ 3 level Id = 8; Center = "12300 0 9917"; Radius = 1705.0; WarnMsg = ""; //Чувствую запах химических испарений... Мне нужна полная защита... EnterMsg = ""; Msg = ""; ExitMsg = ""; player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT; itemsComplect = {"AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"}; 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 = "Prison"; //газ 1 level Id = 9; Center = "5442 0 856"; Radius = 295.0; WarnMsg = ""; EnterMsg = ""; Msg = ""; ExitMsg = ""; player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT; itemsComplect = {"GP5GasMask","GasMask","Massblackgp5","BP2_Gas_mask","mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"}; 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 = "Forest"; //газ 1 level Id = 10; Center = "5464 0 5305"; Radius = 1005.0; WarnMsg = ""; EnterMsg = ""; Msg = ""; ExitMsg = ""; player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT; itemsComplect = {"GP5GasMask","GasMask","Massblackgp5","BP2_Gas_mask","mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"}; 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 = "NEFT"; //газ 2 level Id = 11; Center = "1681 0 12717"; Radius = 155.0; WarnMsg = ""; EnterMsg = ""; Msg = ""; ExitMsg = ""; player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT; itemsComplect = {"mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"}; 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 = {"AirborneMask","alp_GasMaskCamo","JKRNBCPantsGray","JKRNBCJacketGray","NBCJacketGray","NBCHoodGray","NBCGlovesGray","NBCPantsGray","NBCBootsGray","MassNBCglovesBlue","MassNBCJacketYellow","MassNBCpantsYellow","MassNBCbootsYellow","MassNBChoodYellow","BP2_NBCGlovesBlue","BP2_NBCHoodOrange","BP2_NBCP_Orange","BP2_NBCJ_Orange","BP2_NBCBootsOrang","alp_NBCJacketCamo","alp_NBCPantsCamo","alp_NBCHoodCamo","alp_NBCBootsCamo","alp_NBCGlovesCamo"}; 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; //тип зоны (см ZoneTypeRad) 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); //получаем содержимое очередного слота 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 && zone.complect.Find(player_Items.GetType()) >= 0) //Вещичка найдена (вещичка не NULL и ее класснейм есть в комплекте) ? (player_Items - выше могли и NULL запихать - тогда значицо слот тот пустой и значицо комплет неполный) { //..Да! findPlayerItem = true; //Флаг - Вещичка найдена player_Complect_Count++; //Временный подсчет if (my_DamageZone_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: DamageZone: Found complect item in: " + zone.checkslots + ": " + player_Items.GetType()); if ( zone.item_Dmg_Coef > 0 ) { Item_Health = player_Items.GetHealth(); //Возвращаем значение "здоровья" вещички в переменную Item_Health Item_Health = Item_Health - zone.item_Dmg_Coef; //Декримент состояния вещички player_Items.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); } 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); 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); */ //--------



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

enum ZoneTypeRad  //Это для удобства - перечисление //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; //тип зоны (см ZoneTypeRad)
	//Приближение к зоне
	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 	 							= 	ZoneTypeRad.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.432;							//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		=	100.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.015;							//17 //Per Second // 0.050 - Radio // 0.031 - Others
						item_Dmg_Coef						=	item_Dmg_Coef * zone_Check_Timer;
		float			item_Health_Threshold				=	50.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 ZoneTypeRad)
		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			= "AES STATION"; //газ 1 level 
		Id 				= 1;
		Center 			= "4793 0 7078";
		Radius			= 455.0;
		WarnMsg			= "";
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"GP5GasMask","GasMask","Massblackgp5","BP2_Gas_mask","mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		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			= "Voenka"; //газ 1 level 
		Id 				= 2;
		Center 			= "6681 0 6898";
		Radius			= 305.0;
		WarnMsg			= "";
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"GP5GasMask","GasMask","Massblackgp5","BP2_Gas_mask","mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		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			= "AirPort Milo"; //газ 2 level
		Id 				= 3;
		Center 			= "5512 0 3463";
		Radius			= 795.0;
		WarnMsg			= "";
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		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			= "Paris"; //газ 3 level
		Id 				= 4;
		Center 			= "2896 0 3979";
		Radius			= 605.0;
		WarnMsg			= "";
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		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			= "Balota"; //газ 2 level
		Id 				= 5;
		Center 			= "3676 0 8832";
		Radius			= 505.0;
		WarnMsg			= "";
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_COUGH;
		itemsComplect 	= {"mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		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			= "Oceanville"; //газ 1 level
		Id 				= 6;
		Center 			= "10072 0 4125";
		Radius			= 2155.0;
		WarnMsg			= "ВНИМАНИЕ: ВЫ ПРИБЛИЖАЕТЕСЬ К ОПАСНОЙ ЗОНЕ";
		EnterMsg		= "ВНИМАНИЕ: ВЫ ВОШЛИ В ОПАСНУЮ ЗОНУ";
		Msg				= "ВНИМАНИЕ: ВЫ НАХОДИТЕСЬ В ОПАСНОЙ ЗОНЕ. ЗДЕСЬ ВАС МОГУТ УБИТЬ";
		ExitMsg			= "ВНИМАНИЕ: ВЫ ПОКИНУЛИ ОПАСНУЮ ЗОНУ";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"GP5GasMask","GasMask","Massblackgp5","BP2_Gas_mask","mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		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			= "Mountain"; //газ 3 level
		Id 				= 7;
		Center 			= "7168 0 11683";
		Radius			= 605.0;
		WarnMsg			= "";
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		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			= "AREA42"; //газ 3 level
		Id 				= 8;
		Center 			= "12300 0 9917";
		Radius			= 1705.0;
		WarnMsg			= ""; //Чувствую запах химических испарений... Мне нужна полная защита...
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		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			= "Prison"; //газ 1 level
		Id 				= 9;
		Center 			= "5442 0 856";
		Radius			= 295.0;
		WarnMsg			= "";
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"GP5GasMask","GasMask","Massblackgp5","BP2_Gas_mask","mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		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			= "Forest"; //газ 1 level
		Id 				= 10;
		Center 			= "5464 0 5305";
		Radius			= 1005.0;
		WarnMsg			= "";
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"GP5GasMask","GasMask","Massblackgp5","BP2_Gas_mask","mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
		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			= "NEFT"; //газ 2 level 
		Id 				= 11;
		Center 			= "1681 0 12717";
		Radius			= 155.0;
		WarnMsg			= "";
		EnterMsg		= "";
		Msg				= "";
		ExitMsg			= "";
		player_Symptom 	= SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT;
		itemsComplect 	= {"mag3_gasmask_mung","alp_GasMaskCamo","MVS_M50Respirator_OD","MVS_M50Respirator_Tan","MVS_M50Respirator_Black","MVS_PMK2Respirator_Black","MVS_PMK2Respirator_Tan","MVS_PMK2Respirator_OD","AirborneMask","MVS_S10Respirator_OD","MVS_S10Respirator_Tan","MVS_S10Respirator_Black","MVS_S10Respirator_FS","Admin_Helm"};
	  	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 	= {"AirborneMask","alp_GasMaskCamo","JKRNBCPantsGray","JKRNBCJacketGray","NBCJacketGray","NBCHoodGray","NBCGlovesGray","NBCPantsGray","NBCBootsGray","MassNBCglovesBlue","MassNBCJacketYellow","MassNBCpantsYellow","MassNBCbootsYellow","MassNBChoodYellow","BP2_NBCGlovesBlue","BP2_NBCHoodOrange","BP2_NBCP_Orange","BP2_NBCJ_Orange","BP2_NBCBootsOrang","alp_NBCJacketCamo","alp_NBCPantsCamo","alp_NBCHoodCamo","alp_NBCBootsCamo","alp_NBCGlovesCamo"};
		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; //тип зоны (см ZoneTypeRad) 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);
		*/
//--------

 

 

Работает на ура,

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

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


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



3 часа назад, danisimus сказал:

Работает на ура, скрипт взят отсюда

ну такой же как у меня. А у меня фул химзе и газике блюёт все равно. Ан нет, не такой, извинтиляюсь

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

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


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

ну такой же как у меня. А у меня фул химзе и газике блюёт все равно. Ан нет, не такой, извинтиляюсь

тут вопрос в том что менял сам и что на сервере происходит в таком случае. По коду скрипта вижу лишь определение вещи и ее качество на соответствие проверяется, мол если ниже порогового значения - наносить урон. Еще варик есть что какой-то слот неверно указан, больше ничего не вижу. Ну разве что сам какие-то правки добавлял или косяки ползут где-то в крашлогах с этим скриптом

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


Ссылка на сообщение
Поделиться на других сайтах
03.07.2021 в 22:28, 123new сказал:

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

из кода вообще не менял ничего,  только координаты\комплекты\урон

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


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

из кода вообще не менял ничего,  только координаты\комплекты\урон

ну в таком случае быть не может того о чем описываешь впринципе

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


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

не может того о чем описываешь впринципе

а оно есть, хз почему 😃

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


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

не может

хотя в самом начале заменил в файле скрипта словосочетание ZoneType на ZoneTypeRad - ибо конфликтовал скрипт с другим модом

но это просто обозначение название типа зоны

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

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


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

в таком случае быть не может того о чем описываешь впринципе

в общем выяснил, что если убрать из строки 
playerSlots        = {"Mask","Headgear","Body","Legs","Feet","Gloves"};

 

слот Headgear - то все работает отлично. Персонаж не блюет в оставшемся комплекте. В чем дело, хз

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


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

в общем выяснил, что если убрать из строки 
playerSlots        = {"Mask","Headgear","Body","Legs","Feet","Gloves"};

 

слот Headgear - то все работает отлично. Персонаж не блюет в оставшемся комплекте. В чем дело, хз

могу тут сказать тока одно, без полностью скрипта в твоем варианте и логов тут точно не разберешься. И то что конфликт у тебя идет 'ZoneType на ZoneTypeRad'  не нормально))

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


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

И то что конфликт у тебя идет 'ZoneType на ZoneTypeRad'  не нормально))

в чужом моде объявлена функция ZoneType, пришлось в этом скрипте просто изменить название на ZoneTypeRad не более

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


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

в чужом моде объявлена функция ZoneType, пришлось в этом скрипте просто изменить название на ZoneTypeRad не более

можно в своем скрипте автозаменой ZoneType переименовать в любое, ну, например, ZoneTypeMyServer . Тупо другое название и конфликта не будет 😉

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

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


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

Тупо другое название и конфликта не будет

блин, так я и сделал так, было ZoneType стало ZoneTypeRad 😃

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


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

возможно уже обсуждалось, но, что будет при наложении одной зоны на другую?

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


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

Будут отрабатывать обе.

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


Ссылка на сообщение
Поделиться на других сайтах
22.07.2021 в 13:25, paranoyk сказал:

Будут отрабатывать обе.

в смысле двойной урон будет наноситься, или если в одной зоне можно только с таким газиком, а в другой только с другим. То какой надо одеть при наложении таких зон?

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


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

в смысле двойной урон будет наноситься, или если в одной зоне можно только с таким газиком, а в другой только с другим. То какой надо одеть при наложении таких зон?

обе зоны отрабатывают в 1 точке, соответственно если с 1 зоне ты имеешь защиту, то в другой нет, и тебя 2-я будет хреначить. Аналогично и наоборот. А без защиты обе будут душить

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

    • Автор: 123new
      Автор скрипта: http://s-platoon.ru/profile/48-nonameultima/
      Все благодарности за этот скрипт непосредственно автору скрипта, не мне!
       
      В данной теме, расскажу как сделать зараженные газом области на карте.
      Автор: NoNameUltima
      1. Открываем на сервере файл: missionServer.c
      2. После строки:
      GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(this.UpdatePlayersStats, 30000, true); Добавляем:
      GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(this.GAS_ZONE_TRIGGER, 10000, true); *10000 - Время в мс(10 секунд). С такой частотой будет наноситься урон в данной области.
      После строки:
      GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).Remove(this.UpdatePlayersStats); Добавляем:
      GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).Remove(this.GAS_ZONE_TRIGGER); Ищем строку:
      void UpdatePlayersStats() Вставляем ВЫШЕ нее, следующий код:
      void GAS_ZONE_TRIGGER() { /* GAS_ZONE_TRIGGER Автор: NoNameUltima skype: hf-trade */ // Зараженные зоны TVectorArray gas_points = {"13249 0 3962", "6389 0 2683", "6612 0 2561"}; // Массив намордников TStringArray gas_masks = {"GasMask", "GP5GasMask"}; // Радиус зон int radius = 350; // Наносимый урон float damage_value = 10; ref array<Man> players = new array<Man>; GetGame().GetPlayers( players ); PlayerBase player; vector position_player; int x; bool isGasMask; int attCount; int attIdx; EntityAI attachment; ItemBase item; string className; float damage_player; for (int i = 0; i < players.Count(); i++) { Class.CastTo(player, players.Get(i)); position_player = player.GetPosition(); for (x = 0; x < gas_points.Count(); x++) { if ( (vector.Distance(position_player, gas_points.Get(x))) < radius ) { isGasMask = false; attCount = player.GetInventory().AttachmentCount(); for (attIdx = 0; attIdx < attCount; attIdx++) { attachment = player.GetInventory().GetAttachmentFromIndex(attIdx); if ( attachment.IsItemBase() ) { item = Class.Cast(attachment); className = item.GetType(); if ( gas_masks.Find(className) >= 0 ) { //Print ("Намордник найден!"); isGasMask = true; break; } } } if (isGasMask == false) { //Print ("Намордник не найден!"); damage_player = player.GetHealth("GlobalHealth", "Health"); player.SetHealth("GlobalHealth", "Health", damage_player - damage_value); } } } } } P.S.
      1. Так же можно изменить формат массива, и сделать зоны с разным радиусом
      2. Можно при желании добавить вывод оповещения, в зараженных зонах.
      *Скрипт предоставлен мной, в обрезанном виде намерено - остальное на Ваш вкус и цвет
      Изменено 4 октября пользователем NoNameUltima
       
      Добавлено от 123new:
      Файл missionServer.c располагается в {папка сервера}\scripts\5_Mission\MissionServer\missionServer.c
      Если у вас нет папки scripts в папке с сервером игры, откройте папку dta, распакуйте папку scripts из pbo-файла scripts.pbo и переместите в папку с сервером.
      Чтобы папка считывалась сервером, необходимо добавить параметр запуска сервера '-FilePatching'.
      P.S. Гайд не проверялся на актуальной версии серверной части игры со steam!
    • Автор: NotMeyson404
      Создал триггер в редакторе, что бы при заходе в область триггера играла музыка (Проверил в редакторе все работате на ура), сохранил как положено, закинул все файлы на сервер arma 3 epoch, и не работает ничего, пол дня провозился....подскажите как быть?
       
      class Item130
      {
      dataType="Trigger";
      position[]={7850.2622,17.753777,11198.521};
      angle=4.7678905;
      class Attributes
      {
      onActivation="1 fadeMusic 1; playMusic ""sidr11"";";
      onDeactivation="1 fadeMusic 0;";
      sizeA=3;
      sizeB=7;
      sizeC=4;
      repeatable=1;
      activationBy="ANY";
      isRectangle=1;
      isServerOnly=1;
      };
      id=40;
      type="EmptyDetectorArea10x10";
      atlOffset=-0.052999496;
      };
      class Item131
      {
      dataType="Trigger";
      position[]={7853.6118,17.391575,11197.52};
      angle=4.6931028;
      class Attributes
      {
      onActivation="playSound ""sidr22"";";
      onDeactivation="playSound ""sidr33"";";
      sizeA=2;
      sizeB=2;
      sizeC=4;
      repeatable=1;
      activationBy="ANY";
      isRectangle=1;
      isServerOnly=1;
      };
      id=41;
      type="EmptyDetectorArea10x10";
      atlOffset=0.1210022;
      };
    • Автор: exploadead
      Привет всем! Арма 1.58 Эпоч 0380 Пытаюсь перенести триггеры с 1.56 армы на 1.58....   Вот например такая конструкция по удалению ботов из зоны успешно работала на 1.56:   class Sensors { items=1; class Item0 { position[]={13325,0,14515}; a=200; b=200; activationBy="GUER"; repeating=1; interruptable=1; age="UNKNOWN"; expActiv="{deleteVehicle _x} forEach thisList;"; class Effects { }; }; };    
      Но в 1.58 появился новый общий для всего класс class Entities. Уже пробовал вот так:      
      class Entities { items=1; class Item1 { dataType="Trigger"; position[]={13325,0,14515}; class Attributes { name="delbot"; onActivation="{deleteVehicle _x} forEach thisList;"; sizeA=200; sizeB=200; repeatable=1; interruptable=1; activationBy="GUER"; }; id=210; type="EmptyDetector"; }; };    
      Но не сработало((... пробовал то же самое прямо в редакторе сделать... на 1.56 получалось... на 1.58 не пашет((
    • Автор: Mac2706
      Создал Триггер на определённых координатах, который должен вызывать скрипт, но когда захожу в триггер ничего не происходит.Триггер динамический :
       
       
      Я подозреваю, что это происходит, потому что скрипт исполняется только на стороне клиента и не передаёт данные на сервер Danger.Sqf
  • Наш выбор

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

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

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