???
Математика на уровне МГУ

Показано с 1 по 25 из 789

Тема: Вопросы.

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    3GIAP.ru Аватар для -atas-
    Регистрация
    26.12.2001
    Адрес
    Москва
    Возраст
    54
    Сообщений
    2,992
    Записей в дневнике
    1

    Re: Вопросы.

    По отзывам бомберов скрипт, который используется на Repka, а также был растиражирован на Синдикат и другие серверы повреждает многоместные самолеты не только при покидании игроком, как было задумано, но и при переходе игрока на место штурмана или стрелка. Как бы это можно было поправить для совместимости с многоместными машинами?

    (Еще говорят у 110х нет ботов-стрелков в онлайне, но это видимо к скрипту не относится).

    Выделено синим.
    Код:
    // v.1_17_05. script by FG28_Kodiak, ZaltysZ, Oreva, Small_Bee
    
    using System;
    using maddox.game;
    using maddox.game.world;
    using System.Collections.Generic;
    
    public class Mission : AMission
    {
    
        int LastMissionLoaded = 0;
    
        double initTime;
    
        // loading sub-missions
        public override void OnTickGame()
        {
            if (Time.tickCounter() % 45000 == 9000) // 45000=25 min repeat. 9000=5 min delay. 
            {
                // randomly selects 1 of several submissions excluding the recent one
    
                Random RandomIncident = new Random();
                int CurrentMissionSelected;
    
                do
                    {
                    CurrentMissionSelected = RandomIncident.Next(1, 4);
                    }
                while (LastMissionLoaded == CurrentMissionSelected);
    
                LastMissionLoaded = CurrentMissionSelected;
    
                switch (CurrentMissionSelected)
    
                {
                case 1:
                    GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air01.mis");
                    //GamePlay.gpHUDLogCenter("Intel: Enemy activity is expected at E3!");
                        //600
                    initTime = 0.0;
                    Timeout(initTime += 600, () =>
                    {
                        GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E3!");
                    });
                        //600+600
                    Timeout(initTime += 600, () =>
                    {
                        GamePlay.gpHUDLogCenter("Attention! Help is needed at E3/D4!");
                    });
                    break;
                case 2:
                    GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_sea01.mis");
                    //GamePlay.gpHUDLogCenter("Intel: Cover your shipping at C4!");
                        //500
                    initTime = 0.0;
                    Timeout(initTime += 450, () =>
                    {
                        GamePlay.gpHUDLogCenter("Attention! Cover your shipping at C4!");
                    });
                        //500+300
                    Timeout(initTime += 300, () =>
                    {
                        GamePlay.gpHUDLogCenter("Attention! Ships are under attack at C4!");
                    });
                    break;
                case 3:
                    GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air02.mis");
                    //GamePlay.gpHUDLogCenter("Intel: Enemy activity is expected at E2!");
                        //600
                    initTime = 0.0;
                    Timeout(initTime += 600, () =>
                    {
                        GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E2!");
                    });
                        //600+300
                    Timeout(initTime += 300, () =>
                    {
                        GamePlay.gpHUDLogCenter("Attention! All fighters please proceed to E2/D3!");
                    });
                    break;
            }
        }
    
        ///////////////////////
    
        //loads small submissions w/o messages
        
         if (Time.tickCounter() % 216000 == 108000) // 216000=120 min repeat. 108000=60 min delay. 
         {
             GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small01.mis");
         }
    
         if (Time.tickCounter() % 216000 == 215999) // 216000=120 min repeat. 215999=120 min delay. 
         {
             GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small02.mis");
         }
    }
     ////////////////////////////////////////////////////////////////////////////////////////////////////
    
    // destroys aircraft abandoned by a player.
        private bool isAiControlledPlane (AiAircraft aircraft) 
        {
    		if (aircraft == null) 
            { 
    			return false;
    		}
    
    		Player [] players = GamePlay.gpRemotePlayers ();
    		foreach (Player p in players) 
            {    
    			if (p != null && (p.Place () is AiAircraft) && (p.Place () as AiAircraft) == aircraft)
                { 
    				return false;
    			}
    		}
    
    		return true;
    	}
    
    	private void destroyPlane (AiAircraft aircraft) {
    		if (aircraft != null) { 
    			aircraft.Destroy ();
    		}
    	}
    
    	private void explodeFuelTank (AiAircraft aircraft) 
        {
    		if (aircraft != null) 
            { 
    			aircraft.hitNamed (part.NamedDamageTypes.FuelTank0Exploded);
    		}
    	}
    
    	private void destroyAiControlledPlane (AiAircraft aircraft) {
    		if (isAiControlledPlane (aircraft)) {
    			destroyPlane (aircraft);
    		}
    	}
    
    	private void damageAiControlledPlane (AiActor actor) {
    		if (actor == null || !(actor is AiAircraft)) { 
    			return;
    		}
    
    		AiAircraft aircraft = (actor as AiAircraft);
    
    		if (!isAiControlledPlane (aircraft)) {
    			return;
    		}
    
    		if (aircraft == null) { 
    			return;
    		}
    
    		aircraft.hitNamed (part.NamedDamageTypes.ControlsElevatorDisabled);
    		aircraft.hitNamed (part.NamedDamageTypes.ControlsAileronsDisabled);
    		aircraft.hitNamed (part.NamedDamageTypes.ControlsRudderDisabled);
    		aircraft.hitNamed (part.NamedDamageTypes.FuelPumpFailure);
    
            int iNumOfEngines = (aircraft.Group() as AiAirGroup).aircraftEnginesNum();
            for (int i = 0; i < iNumOfEngines; i++)
            {
                aircraft.hitNamed((part.NamedDamageTypes)Enum.Parse(typeof(part.NamedDamageTypes), "Eng" + i.ToString() + "TotalFailure"));
            }
    
            /***Timeout (240, () =>
                    {explodeFuelTank (aircraft);}
                );
             * ***/
    
            Timeout (300, () =>
    				{destroyPlane (aircraft);}
    			);
    	}
    
        //////////////////////////////////////////
    
    	public override void OnPlaceLeave (Player player, AiActor actor, int placeIndex) 
        {
    		base.OnPlaceLeave (player, actor, placeIndex);
    		Timeout (1, () =>
    				{damageAiControlledPlane (actor);}
    			);
    	}
    
    	public override void OnAircraftCrashLanded (int missionNumber, string shortName, AiAircraft aircraft) 
        {
    		base.OnAircraftCrashLanded (missionNumber, shortName, aircraft);
    		Timeout (300, () =>
                { destroyPlane(aircraft); }
    			);
    	}
        public override void OnAircraftLanded (int missionNumber, string shortName, AiAircraft aircraft) 
        {
            base.OnAircraftLanded(missionNumber, shortName, aircraft);
            Timeout(300, () =>
                { destroyPlane(aircraft); }
                );
        }
        
        
    //////////////////////////////////////////////////////////////////////////////////////////////////
    
        //Listen to events of every mission
        public override void Init(maddox.game.ABattle battle, int missionNumber)
        {
            base.Init(battle, missionNumber);
            MissionNumberListener = -1; //Listen to events of every mission
        }
    
     //////////////////////////////////////////////////////////////////////////////////////////////////
    
        //Ground objects (except AA Guns) will die after 55 min when counted from their birth
    
        public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
        {
            base.OnActorCreated(missionNumber, shortName, actor);
            //Ground objects (except AA Guns) will die after 55 min when counted from their birth
            if (actor is AiGroundActor)
                if ((actor as AiGroundActor).Type() != maddox.game.world.AiGroundActorType.AAGun)
                    Timeout(3300, () =>
                    {
                        if (actor != null)
                        { (actor as AiGroundActor).Destroy(); }
                    }
                            );
        }
    
        /****
        //Ground objects will die after 55 min when counted from their birth
        
        public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
        {
            base.OnActorCreated(missionNumber, shortName, actor);
    
            //Ground objects will die after 55 min when counted from their birth
            if (actor is AiGroundActor)
                Timeout(3300, () =>
                {
                    if (actor != null)
                    { (actor as AiGroundActor).Destroy(); }
                }
                        );
        }
        ****/
    }
    ...зелёные горят.
    ----------------------

    i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.

  2. #2
    Старший Офицер Форума
    Регистрация
    15.02.2002
    Адрес
    Moscow
    Возраст
    46
    Сообщений
    6,905
    Images
    51

    Re: Вопросы.

    Цитата Сообщение от Geniok Посмотреть сообщение
    это и надо. подгрузка не во время миссии, а перед ее началом.
    Спасибо за консультацию.
    да не за что

    Цитата Сообщение от Geniok Посмотреть сообщение
    Еще один вопрос возник, возможно ли скрытие кода скрипта от пользователя? В связи с опасностью его изменения и использования в плохих целях.
    мне кажется наоборот - с открытым кодом есть возможность проверки - что делает скрипт, с закрытым больше возможностей сделать что-то нехорошее.

    Цитата Сообщение от -atas- Посмотреть сообщение
    По отзывам бомберов скрипт, который используется на Repka, а также был растиражирован на Синдикат и другие серверы повреждает многоместные самолеты не только при покидании игроком, как было задумано, но и при переходе игрока на место штурмана или стрелка. Как бы это можно было поправить для совместимости с многоместными машинами?
    так вот же - http://www.sukhoi.ru/forum/showthrea...=1#post1608824 скрипт с проверкой в многоместных самолётах. Оттуда проверку можно взять.
    Don't happy, be worry

  3. #3
    Любопытный
    Регистрация
    03.10.2005
    Адрес
    Киров
    Возраст
    41
    Сообщений
    1,386

    Re: Вопросы.

    Цитата Сообщение от naryv Посмотреть сообщение
    мне кажется наоборот - с открытым кодом есть возможность проверки - что делает скрипт, с закрытым больше возможностей сделать что-то нехорошее.
    С открытым кодом ЛЮБОЙ может туда дописать все что угодно, а потом выдать за оригинальную кампанию(то есть заняться распространением уже своего скрипта под видом оригинального). То есть теоретически любой может получить доступ к чужому ПК.

    И еще такой вопрос, МГ имеет возможность помогать тем кто делает Офф-лайн кампании? Помощь нужна такого плана, чтобы сама кампания хранилась на сервере Стима. А то сейчас во-первых при обновлении кэша все нестандартные кампании удаляются. Во-вторых пользователям приходится руками править ini-файлы. Что как бы не есть Юзер-френдли.

    И спасибо за консультации.

    С Уважением!
    AMD Phenom(tm) II X4 955 3.21ГГц, Gigabyte GA-MA770-US3, 4Гб DDR2-800, ATI Radeon HD 5850 1Гб DDR5 256-бит, Microsoft Windows 7 Home SP1 x64, 1920х1080 24"

  4. #4
    Старший Офицер Форума
    Регистрация
    15.02.2002
    Адрес
    Moscow
    Возраст
    46
    Сообщений
    6,905
    Images
    51

    Re: Вопросы.

    Цитата Сообщение от Geniok Посмотреть сообщение
    С открытым кодом ЛЮБОЙ может туда дописать все что угодно, а потом выдать за оригинальную кампанию(то есть заняться распространением уже своего скрипта под видом оригинального). То есть теоретически любой может получить доступ к чужому ПК.
    Такой открытый код можно проверить, а с закрытым - нельзя, т.е. опять же любой возьмёт Вашу кампанию, напишет вместо Вашего скрипта свой - и увидеть это нельзя будет никак.

    Цитата Сообщение от Geniok Посмотреть сообщение
    И еще такой вопрос, МГ имеет возможность помогать тем кто делает Офф-лайн кампании? Помощь нужна такого плана, чтобы сама кампания хранилась на сервере Стима. А то сейчас во-первых при обновлении кэша все нестандартные кампании удаляются. Во-вторых пользователям приходится руками править ini-файлы. Что как бы не есть Юзер-френдли.
    На стиме, к сожалению, хранить кампании не получится, почему - попробуйте у Лютьера уточнить. А можно детали про удаление нестандартных кампаний? По идее кампания хранящаяся в своей папке не должна удаляться, если удаляется может быть баг какой-то, постараемся исправить.

    Цитата Сообщение от Geniok Посмотреть сообщение
    И спасибо за консультации.
    всегда пожалуйста

    2 -atas- вот скрипт для движения ЛФ со списком маркеров для любой карты - при инициализации из основной миссии берутся начальные маркеры, к ним делаются триггеры смены фронта и дальше маркеры переключаются. Я комментарии написал, думаю понятно должно быть как и что там делается.

    Код:
    using System;
    using System.Collections;
    using maddox.game;
    using maddox.game.world;
    using maddox.GP;
    using System.Collections.Generic;
    
    
    public class Mission : AMission
    {
        internal class MissionMarker
        {
            internal double x;
            internal double y;
            internal int army;
            internal MissionMarker(double x, double y, int army) { this.x = x; this.y = y; this.army = army; }
        }
            
        private List <MissionMarker> MissionMarkers = new List<MissionMarker> ();
    
        string BPMaxPlanesAllowed = "3";                       // количество макс. возможно создаваемых самолётов на спаунточке                     
        string BPSpawnParked = "1";                            // рожать ли самолёты на спауне запаркованными 1 - да, 0 - нет 
        int MissionsCount = 1;                                 // счётчик миссий - для вычисления полных имён стат. объектов, например артиллерии 
        int NextMissionNum = 2;                                // флажок номера следующей миссии - для рефреша спаун точек, после смены линии фронта
        int ScoreRed = 0;                                      // "счёт"
        int ScoreBlue = 0;
        
        
        private string[] RedPlanesSet = new string[]           // описание наборов самолётов на спаунточках разных стран
        {   "Aircraft.SpitfireMkIIa",
            "Aircraft.SpitfireMkI",
            "Aircraft.BlenheimMkIV",
            "Aircraft.SpitfireMkIa",
            "Aircraft.DH82A",
            "Aircraft.HurricaneMkI_dH5-20",
            "Aircraft.HurricaneMkI"
        };
    
        private string[] BluePlanesSet = new string[] 
        {     "Aircraft.Bf-110C-7",
              "Aircraft.Bf-110C-4",
              "Aircraft.Bf-109E-3B",
              "Aircraft.Ju-88A-1",
              "Aircraft.G50",
              "Aircraft.He-111P-2",
              "Aircraft.He-111H-2",
              "Aircraft.Bf-109E-3",
              "Aircraft.BR-20M",
              "Aircraft.Ju-87B-2"
        };
    
        public ISectionFile triggersFile ;                     // объявление файла для генерации миссии с триггерами смены линии фронта
    
    
        public override void Init(ABattle battle, int missionNumber)
        {
            base.Init(battle, missionNumber);
            ISectionFile missFile = GamePlay.gpLoadSectionFile("missions\\Multi\\Dogfight\\xxxxx.mis");   // загружаем в missFile основную миссию, для того, чтобы найти в ней маркеры фронта
            triggersFile = GamePlay.gpCreateSectionFile();                                                 //заодно создаём  файл для генерации миссии с триггерами
            string section, key, value;
            string sectionTr, keyTr, valueTr;
            section = "FrontMarker";                                                                       
            sectionTr = "Trigger";
            int n = missFile.lines(section);                            // определяем, сколько маркеров фронта в миссии 
            for (int i = 0 ; i < n; i++)
            {                                                           // в этом цикле пробегаем по всем маркерам
                key = "FrontMarker"+i.ToString();            
                if (missFile.exist(section,key))                        // проверяем, что маркер есть 
                {
                    value = missFile.get(section, key);    
                    string[] strs = value.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries); // и парсим строку с маркером, берём его координаты и страну
                    if (strs.Length == 3) 
                    {
                        double x; double.TryParse( strs[0], out x);
                        double y; double.TryParse( strs[1], out y);
                        int army; int.TryParse( strs[2], out army);
                        MissionMarker mMarker = new MissionMarker(x,y,army);
                        MissionMarkers.Add(mMarker);                                             // добавляем в список маркеров MissionMarkers проверенный маркер
    
                        keyTr = "changeArmy" + i.ToString()+"_1";                                // попутно на маркере делаем два триггера - для каждой стороны  
                        valueTr = " TPassThrough 3 1 " + strs[0] + " " + strs[1] + " 500";       // "TPassThrough 3" - триггер сработает при заезде в него наземки, "1" красной, strs[0] + " " + strs[1] координаты, "500"- радиус триггера
                        triggersFile.add(sectionTr, keyTr, valueTr);                             // сохраняем триггер в файле триггерной миссии
                        keyTr = "changeArmy" + i.ToString() + "_2";                              // то же самое для синей стороны
                        valueTr = " TPassThrough 3 2 " + strs[0] + " " + strs[1] + " 500";       
                        triggersFile.add(sectionTr, keyTr, valueTr);                             // сохраняем триггер в файле триггерной миссии
                    }
                }   
            }       
    
        }
    
        public override void OnBattleStarted()
        {
            base.OnBattleStarted();
            MissionNumberListener = -1;                                 // ставим MissionNumberListener = -1 , чтобы основная миссия "слышала" все триггеры и события в битве
            GamePlay.gpPostMissionLoad(triggersFile);                   // подгружаем миссию с триггерами созданую раньше, в Init
            RefreshBirthPlaces();                                       // и запускаем рефреш спаунов - чтобы они рассчитались   
        }
    
    
        private void RefreshBirthPlaces()
        {
            foreach (AiBirthPlace bp in GamePlay.gpBirthPlaces())      // сначала - очистим существующие спауны
            {
                if (bp != null)
                    bp.destroy();
            }
    
    
            ISectionFile f = GamePlay.gpCreateSectionFile();          // создаём файл миссии в котором переопределим спауны в соответствии с линиями фронта
            string sect;
            string key;
            string value;
    
            
            for (int i = 0; i < GamePlay.gpAirports().Length; i++)   // сделаем спауны на всех аэродромах карты
            {
                Point3d airpPos = GamePlay.gpAirports()[i].Pos();    // координаты аэродрома
                int armyAtPos = GamePlay.gpFrontArmy(airpPos.x, airpPos.y);   // текущая армия в точке с аэродромом
                sect = "BirthPlace";
                key = "BirthPlace_" + i.ToString();                           // дальше заполняем инфо для спаунов
                string Country = ".";
                if (armyAtPos == 1) Country = "gb";
                if (armyAtPos == 2) Country = "de";
                value = " " + armyAtPos.ToString() + " " + ((int)airpPos.x).ToString() + " " + ((int)airpPos.y).ToString() + " 0 " + BPMaxPlanesAllowed + " " + BPSpawnParked + " 0 " + Country + " . .";
                f.add(sect, key, value);
    
                sect = "BirthPlace" + i.ToString();                          // и для каждого заполняем списком разрешённых самолётов
                string[] PlaneSet = new string[0];
                if (armyAtPos == 1)
                    PlaneSet = RedPlanesSet;
                if (armyAtPos == 2)
                    PlaneSet = BluePlanesSet;
                if (PlaneSet.Length > 0)
                    for (int j = 0; j < PlaneSet.Length; j++)
                    {
                        key = PlaneSet[j];
                        value = "";
                        f.add(sect, key, value);
                    }
            }
            GamePlay.gpPostMissionLoad(f);                      // загружаем новые спауны
        }
    
        private void DestroyEnemyAtCaptured(int markerNum, int army)
        {                                                        // если надо уничтожить всех врагов на захваченном маркере - уничтожаем в этой процедуре
            Point3d AirportPos;
            AirportPos.x = MissionMarkers[markerNum].x;
            AirportPos.y = MissionMarkers[markerNum].y;
            AirportPos.z = 1;
    
           
            
            foreach (AiGroundGroup gg in GamePlay.gpGroundGroups(army))
            {            
                if (gg != null) 
                    if (gg.Pos().distance(ref AirportPos) < 2000)   // 2000 это расстояние от маркера на котором уничтожим врагов
                    {
                        string triggerName = gg.Name().Substring(0,gg.Name().IndexOf(":"))+":"+markerNum.ToString()+"_" + army .ToString()+ "_attack";
                        AiTrigger trigger = GamePlay.gpGetTrigger(triggerName);
                        if (trigger != null) trigger.Enable = false;
                        foreach (AiActor ggActor in gg.GetItems())
                        { if ((ggActor as AiGroundActor) != null) 
                              (ggActor as AiGroundActor).Destroy(); 
                        }
                    }
            }       
    
            for (int i = 0; i < MissionsCount; i++)
            {
                AiGroundActor curActor;
                for (int j = 0; j < 10; j++)
                {
                    string nameActor = i.ToString() + ":Static" + j.ToString();
                    curActor = GamePlay.gpActorByName(nameActor) as AiGroundActor;
                    if (curActor != null)
                    {
                        if ( (curActor.Army() == army) && 
                             (curActor.Pos().distance(ref AirportPos) < 2000) &&
                             ((curActor.Type() == AiGroundActorType.AAGun)||(curActor.Type() == AiGroundActorType.Artillery) )
                                )  
                            {   
                                curActor.Destroy();
                            }
                    }                 
                                                   
                }
            }        
        }
    
        internal ISectionFile CreateNewFrontLineMission(int markerNum, int newArmy)  // создаём новый файл миссии с фронтмаркерами
        {                                                               
            DestroyEnemyAtCaptured(markerNum, MissionMarkers[markerNum].army);   // если надо - уничтожаем врагов
            MissionMarkers[markerNum].army = newArmy;                            // в списке маркеров задаём новую армию на захваченном маркере
               
            ISectionFile f = GamePlay.gpCreateSectionFile();
            string sect;
            string key;
            string value;       
            
            for (int i = 0; i < MissionMarkers.Capacity; i++)          // и для всего списка маркеров пробегаем и записываем в файл их координаты и армии
            {            
                sect = "FrontMarker";
                key = "FrontMarker" + i.ToString();
                value = MissionMarkers[i].x.ToString(System.Globalization.CultureInfo.InvariantCulture.NumberFormat) + " " + MissionMarkers[i].y.ToString(System.Globalization.CultureInfo.InvariantCulture.NumberFormat) + " " + MissionMarkers[i].army.ToString();
                f.add(sect, key, value);                     
            }        
            return f;
        }
    
    
        public override void OnMissionLoaded(int missionNumber)
        {
            base.OnMissionLoaded(missionNumber);
            MissionsCount++;                             // счётчик миссий обновляем
            if (missionNumber == NextMissionNum)         // проверяем флажок номера следующей миссии - для рефреша спаун точек, после смены линии фронта
             RefreshBirthPlaces();                       // и обновляем спауны если надо        
        }
    
    
        public override void OnTrigger(int missionNumber, string shortName, bool active)              // обрабатываем триггеры сработавшие
        {
            base.OnTrigger(missionNumber, shortName, active);
    
            int n = MissionMarkers.Capacity;                                                        //пробегаем по списку маркеров, чтобы выяснить - не сработал ли наш триггер на смену линии фронта
            for (int i = 0; i < n; i++)
            {
                for (int j = 1; j < 3; j++)
                {
                    string str = "changeArmy" + i.ToString() + "_" + (j).ToString();
                    if (str.Equals(shortName))                                                  // если сработал  - тогда обрабатываем его - счёт обновляем, пишем что фрмия сменилась 
                    {
                        if (MissionMarkers[i].army != j)
                        {
                            string armyOwner;
                            if (j == 1)
                            {
                                armyOwner = " Red army";
                                ScoreRed += 10;
                            }
                            else
                            {
                                armyOwner = " Blue army";
                                ScoreBlue += 10;
                            }
    
                            GamePlay.gpHUDLogCenter("Front turn to " + armyOwner + " at sector " + GamePlay.gpSectorName(MissionMarkers[i].x, MissionMarkers[i].y).ToString() + "; Red " + ScoreRed.ToString() + ":" + ScoreBlue.ToString() + " Blue");
                            NextMissionNum = GamePlay.gpNextMissionNumber();                     // ставим флажок номера следующей миссии - чтобы после загрузки новых линий фронта пересчитались спауны
                            GamePlay.gpPostMissionLoad(CreateNewFrontLineMission(i, j));         // грузим миссию с обновлёнными маркерами ЛФ
                            // ну и можно как в предыдущей версии загрузить подмиссию на изменённый маркер, у меня это были подмиссии с защищающимися артами вида "x_y_defend.mis", где x - номер маркера, y - защищающаяся страна :
                            GamePlay.gpPostMissionLoad("missions\\Multi\\Dogfight\\CTF_submissions\\" + i.ToString() + "_" + (j).ToString() + "_defend.mis");       
                        }
                        break;
                    }
    
                    // ну и заодно проверяем не уничтожили  ли атакующих из подмиссий в каждой такой подмисси был триггер вида "x_y_attack" срабатывавший на уничтожение атакующей группы
                    str = i.ToString() + "_" + (j).ToString() + "_attack";
                    string addStr = " ground group eliminated at sector " + GamePlay.gpSectorName(MissionMarkers[i].x, MissionMarkers[i].y).ToString();
                    if (str.Equals(shortName))                  // соответственно если сработал такой триггер, обрабатываем его , счёт меняем, пишем что группу уничтожили и запускаем ещё одну атакующую миссию
                    {
                        if (j == 2)
                        {
                            ScoreRed++;
                            addStr = "Blue" + addStr;
                        }
                        else
                        {
                            ScoreBlue++;
                            addStr = "Red" + addStr;
                        }
                        GamePlay.gpHUDLogCenter(addStr + ",and the score is Red " + ScoreRed.ToString() + ":" + ScoreBlue.ToString() + " Blue");
                        GamePlay.gpPostMissionLoad("missions\\Multi\\Dogfight\\CTF_submissions\\" + str + ".mis");
                        break;
                    }
                    // если логика битвы другая , тогда этот блок  с проверкой убираем
                }
            }        
    
        }
    
    }
    Don't happy, be worry

  5. #5
    3GIAP.ru Аватар для -atas-
    Регистрация
    26.12.2001
    Адрес
    Москва
    Возраст
    54
    Сообщений
    2,992
    Записей в дневнике
    1

    Re: Вопросы.

    Цитата Сообщение от naryv Посмотреть сообщение
    2 -atas- вот скрипт для движения ЛФ со списком маркеров для любой карты - при инициализации из основной миссии берутся начальные маркеры, к ним делаются триггеры смены фронта и дальше маркеры переключаются. Я комментарии написал, думаю понятно должно быть как и что там делается.
    Спасибо! Будем разбираться.

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

    А баг с захваченными аэродромами примерно когда будет поправлен?

    upd. Прочитал. Скрипт сам генерирует триггеры. Т.е. достаточно группам наземки поставить вейпойнты в точках маркеров, чтобы триггеры срабатывали и маркеры перекрашивались. Спасибо еще раз!

    А с кораблями будет работать?

    --- Добавлено ---

    Полный редактор не показывает номер маркера, желательно, чтобы показывал, чтобы правильно наименовать подмиссии. Из текста миссии трудно понять где какой маркер находится. У них нумерация по какому принципу идет, с севера на юг или по мере добавления?

    Код:
    [FrontMarker]
      FrontMarker0 193800.67 284451.58 1
      FrontMarker1 246980.85 226963.31 1
      FrontMarker2 251325.46 210380.54 1
      FrontMarker3 275586.66 198279.23 1
      FrontMarker4 271565.74 226153.49 2
      FrontMarker5 291232.39 290262.39 2
      FrontMarker6 280999.42 205308.98 2
      FrontMarker7 254422.00 205240.09 1
      FrontMarker8 285952.32 187798.51 1
      FrontMarker9 297108.99 187924.80 2
      FrontMarker10 277191.75 204364.41 2
      FrontMarker11 284403.88 203340.48 1
      FrontMarker12 284582.39 207814.80 2
      FrontMarker13 298579.39 203750.47 2
      FrontMarker14 274014.50 214794.12 2


    --- Добавлено ---

    Код:
        private void DestroyEnemyAtCaptured(int markerNum, int army)
        {                                                        // если надо уничтожить всех врагов на захваченном маркере - уничтожаем в этой процедуре
            Point3d AirportPos;
            AirportPos.x = MissionMarkers[markerNum].x;
            AirportPos.y = MissionMarkers[markerNum].y;
            AirportPos.z = 1;
    Думаю, будет полезнее уничтожать врагов на перекрашенном аэродроме. Это будет более юзер-френдли для тех, кто захочет там отспауниться. Например, если кто-то только что присоединился к серверу.

    У маркеров врагов можно не уничтожать - пусть отвоевывают его обратно, если смогут.
    Крайний раз редактировалось -atas-; 26.05.2011 в 14:35.
    ...зелёные горят.
    ----------------------

    i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.

  6. #6
    Любопытный
    Регистрация
    03.10.2005
    Адрес
    Киров
    Возраст
    41
    Сообщений
    1,386

    Re: Вопросы.

    Цитата Сообщение от naryv Посмотреть сообщение
    Такой открытый код можно проверить, а с закрытым - нельзя, т.е. опять же любой возьмёт Вашу кампанию, напишет вместо Вашего скрипта свой - и увидеть это нельзя будет никак.
    Только вот кто этой проверкой будет заниматься?!

    Цитата Сообщение от naryv Посмотреть сообщение
    На стиме, к сожалению, хранить кампании не получится, почему - попробуйте у Лютьера уточнить. А можно детали про удаление нестандартных кампаний? По идее кампания хранящаяся в своей папке не должна удаляться, если удаляется может быть баг какой-то, постараемся исправить.
    При установке патча, если пользователь сделал проверку кэша, то все "левые" файлы, которые есть в папке с игрой, удаляются.
    Так как кампании находятся в папке, куда установлена игра, то файл campaings.ini заменяется на стандартный, где прописаны только стандартные кампании. Все папки, которые не идут вместе с игрой тоже удаляются. Так что возможны такие ситуации: поставил патч-ставь кампанию снова, прописывай в файлах все снова, начинай проходить все снова. Это очень неудобно и у пользователей были с этим проблемы.
    Мне кажется любая кампания по своему принципу должна быть "plug and play", а не как сейчас, все делается с помощью костылей, даже приходится 2 установочных файла распространять, для 86-х и 64-х систем.

    С Уважением, Евгений.
    AMD Phenom(tm) II X4 955 3.21ГГц, Gigabyte GA-MA770-US3, 4Гб DDR2-800, ATI Radeon HD 5850 1Гб DDR5 256-бит, Microsoft Windows 7 Home SP1 x64, 1920х1080 24"

  7. #7
    Старший Офицер Форума
    Регистрация
    15.02.2002
    Адрес
    Moscow
    Возраст
    46
    Сообщений
    6,905
    Images
    51

    Re: Вопросы.

    Цитата Сообщение от -atas- Посмотреть сообщение
    А баг с захваченными аэродромами примерно когда будет поправлен?
    Имеете ввиду не обновление спаун точек? Если да, то в следующем патче скорее всего. В принципе можно сейчас скриптом менять армию игроку на 0 и возвращать стоявшую раньше и в самолёт его засовывать снова, но это корявое решение.

    Цитата Сообщение от -atas- Посмотреть сообщение
    upd. Прочитал. Скрипт сам генерирует триггеры. Т.е. достаточно группам наземки поставить вейпойнты в точках маркеров, чтобы триггеры срабатывали и маркеры перекрашивались. Спасибо еще раз!
    да, всё правильно.

    Цитата Сообщение от -atas- Посмотреть сообщение
    А с кораблями будет работать?
    да , только для кораблей надо "TPassThrough 4" а не "TPassThrough 3" ставить. Ну или "TPassThrough 2" для армии вообще.

    Цитата Сообщение от -atas- Посмотреть сообщение
    Полный редактор не показывает номер маркера, желательно, чтобы показывал, чтобы правильно наименовать подмиссии. Из текста миссии трудно понять где какой маркер находится. У них нумерация по какому принципу идет, с севера на юг или по мере добавления?
    по мере добавления, емнип. Отображение номеров сделаем.

    Цитата Сообщение от -atas- Посмотреть сообщение
    Думаю, будет полезнее уничтожать врагов на перекрашенном аэродроме. Это будет более юзер-френдли для тех, кто захочет там отспауниться. Например, если кто-то только что присоединился к серверу.

    У маркеров врагов можно не уничтожать - пусть отвоевывают его обратно, если смогут.
    тогда надо этот дестрой в RefreshBirthPlaces запихнуть, чтобы когда по аэродромам бежал цикл на них дестроил всё.

    Цитата Сообщение от Geniok Посмотреть сообщение
    Только вот кто этой проверкой будет заниматься?!
    сам пользователь, тут других вариантов нет, насколько я понимаю.

    Цитата Сообщение от Geniok Посмотреть сообщение
    При установке патча, если пользователь сделал проверку кэша, то все "левые" файлы, которые есть в папке с игрой, удаляются.
    Так как кампании находятся в папке, куда установлена игра, то файл campaings.ini заменяется на стандартный, где прописаны только стандартные кампании. Все папки, которые не идут вместе с игрой тоже удаляются. Так что возможны такие ситуации: поставил патч-ставь кампанию снова, прописывай в файлах все снова, начинай проходить все снова. Это очень неудобно и у пользователей были с этим проблемы.
    Мне кажется любая кампания по своему принципу должна быть "plug and play", а не как сейчас, все делается с помощью костылей, даже приходится 2 установочных файла распространять, для 86-х и 64-х систем.
    Спасибо за описание. Я правильно понимаю, что сами добавленные файлы кампаний стим не трогал, вернув только инишник стандартный? Если так, то решение есть, попозже оформим его и озвучу, ок?
    Don't happy, be worry

  8. #8
    Любопытный
    Регистрация
    03.10.2005
    Адрес
    Киров
    Возраст
    41
    Сообщений
    1,386

    Re: Вопросы.

    Цитата Сообщение от naryv Посмотреть сообщение
    Спасибо за описание. Я правильно понимаю, что сами добавленные файлы кампаний стим не трогал, вернув только инишник стандартный? Если так, то решение есть, попозже оформим его и озвучу, ок?
    Были отзывы и о том, что сами папки с кампаниями удалялись. Я смогу проверить в выходные, отпишусь что конкретно меняет Стим.

    --- Добавлено ---

    Цитата Сообщение от naryv Посмотреть сообщение
    сам пользователь, тут других вариантов нет, насколько я понимаю.
    То есть по сути дела никто.
    Единственный вариант выходит хранить миссии на сервере и запускать выделенный сервер. Получается офф-лайн постепенно умирает и переходит в он-лайн. Жаль.
    AMD Phenom(tm) II X4 955 3.21ГГц, Gigabyte GA-MA770-US3, 4Гб DDR2-800, ATI Radeon HD 5850 1Гб DDR5 256-бит, Microsoft Windows 7 Home SP1 x64, 1920х1080 24"

  9. #9
    3GIAP.ru Аватар для -atas-
    Регистрация
    26.12.2001
    Адрес
    Москва
    Возраст
    54
    Сообщений
    2,992
    Записей в дневнике
    1

    Re: Вопросы.

    Цитата Сообщение от naryv Посмотреть сообщение
    2 -atas- вот скрипт для движения ЛФ со списком маркеров для любой карты - при инициализации из основной миссии берутся начальные маркеры, к ним делаются триггеры смены фронта и дальше маркеры переключаются. Я комментарии написал, думаю понятно должно быть как и что там делается.
    Атакующие миссии можно в самом начале загрузить 1 раз вот таким образом? (Возможно пару оборонительных тоже для начала придется загрузить.)

    Код:
       public override void OnBattleStarted()
        {
            base.OnBattleStarted();
            MissionNumberListener = -1;                                 // ставим MissionNumberListener = -1 , чтобы основная миссия "слышала" все триггеры и события в битве
            GamePlay.gpPostMissionLoad(triggersFile);                   // подгружаем миссию с триггерами созданую раньше, в Init
            // загружаем атакующие миссии. Как их грузить 1 раз, а не каждый цикл?
            GamePlay.gpPostMissionLoad("missions\\Multi\\Dogfight\\BoF2\\sub\\0_2_attack.mis");
            GamePlay.gpPostMissionLoad("missions\\Multi\\Dogfight\\BoF2\\sub\\2_1_attack.mis");
    
            RefreshBirthPlaces();                                       // и запускаем рефреш спаунов - чтобы они рассчитались   
        }
    Не будут они случайно снова грузиться при изменении флажка номера миссии?

    --- Добавлено ---

    Цитата Сообщение от Small_Bee Посмотреть сообщение
    Вот это работает:
    Спасибо, будем внедрять.
    ...зелёные горят.
    ----------------------

    i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.

  10. #10
    Старший Офицер Форума
    Регистрация
    15.02.2002
    Адрес
    Moscow
    Возраст
    46
    Сообщений
    6,905
    Images
    51

    Re: Вопросы.

    Цитата Сообщение от -atas- Посмотреть сообщение
    Если можно по серверу:
    - в списке забаненных 0 после имени что означает? "name 3GIAP_Atas 0"
    - ban PATTERN [<pattern>] это для использования ? и * вместо символов или чего-то другого?
    - после перезагрузки сервера необходимо загрузить сохраненный заранее файл ban LOAD banned.txt или сервер сам внутри сохраняет список тоже?
    тут не знаю, скорее всего всё должно быть как в Ил-2

    Цитата Сообщение от -atas- Посмотреть сообщение
    Тогда получается, что уничтожаем через 55 минут после рождения так?
    OnActorCreated относится к акторам, а gg.Type к группам. Актор он же каждый по отдельности создается OnActorCreated, тогда зачем их всех перебирать foreach ? Перебор foreach пойдет только по созданной группе или по всем, что есть на карте уже? Если так, тогда они все и уничтожатся через 55 минут, а этого не нужно.
    у меня foreach был чтобы уничтожить все кораблики, в какой-то момент, я просто не понял, что Вы на onActorCreated его вешали в таком случае никаких foreach-ей не надо, конечно, ну да Small_Bee уже написал всё.

    Цитата Сообщение от -atas- Посмотреть сообщение
    Атакующие миссии можно в самом начале загрузить 1 раз вот таким образом? (Возможно пару оборонительных тоже для начала придется загрузить.)
    да, конечно, можно.

    Цитата Сообщение от -atas- Посмотреть сообщение
    Не будут они случайно снова грузиться при изменении флажка номера миссии?
    нет, OnBattleStarted один раз срабатывает на старт битвы, загрузка миссий на него не влияет.
    Don't happy, be worry

  11. #11
    3GIAP.ru Аватар для -atas-
    Регистрация
    26.12.2001
    Адрес
    Москва
    Возраст
    54
    Сообщений
    2,992
    Записей в дневнике
    1

    Re: Вопросы.

    Цитата Сообщение от naryv Посмотреть сообщение

    2 -atas- вот скрипт для движения ЛФ со списком маркеров для любой карты - при инициализации из основной миссии берутся начальные маркеры, к ним делаются триггеры смены фронта и дальше маркеры переключаются.
    Нарисовали подмиссии для карты с Repka #1, но возникла проблеммка: Филды не перекрашиваются, ЛФ не двигается.
    По достижению красными танками красного филда в D3 срабатывает тригер, пишется сообщение о захвате. Далее красные танки дестроились на своем же филде, пришлось эту часть скрипта выключить.
    После этого красные танки проезжают маркер на синем филде в D3. Триггер не срабатывает, маркер не перекрашивается. Затем эти танки доезжают до синего филда в D4, триггер не срабатывает.

    Сообщение о захвате красными поля в D3 возникает периодически (хотя оно всегда было красным). Счет за захват начисляется, причем растет счет у обеих сторон и разница постоянна и составляет 10 очков (у красных на 1 захват больше.) Синее поле в D3 тоже есть, и его красные танки проезжают, но оно не перекрашивается.

    Синие танки, атакующие Е3 и затем F3 не вызывают срабатывание триггера.

    Миссию можно прогонять в оффлане с ускорением времени. Тестировалось именно так. Миссия во вложении.
    BoF2.zip

    Подмиссии присутствуют не для каждого маркера (соответствено, не для каждого триггера). Надеюсь, это не вызовет проблем при попытке скрипта их подгрузить.

    Скрипт приходится прикладывать также файлом, т.к. превышает допустимую длину сообщения. Переименован в txt.

    BoF_1_main1_8.txt

    (Часть кода отключена, но будет включаться позже. Если сразу увидите нестыковки, буду благодарен за совет.)
    ...зелёные горят.
    ----------------------

    i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.

  12. #12
    Старший Офицер Форума
    Регистрация
    15.02.2002
    Адрес
    Moscow
    Возраст
    46
    Сообщений
    6,905
    Images
    51

    Re: Вопросы.

    Цитата Сообщение от -atas- Посмотреть сообщение
    Нарисовали подмиссии для карты с Repka #1, но возникла проблеммка: Филды не перекрашиваются, ЛФ не двигается.
    По достижению красными танками красного филда в D3 срабатывает тригер, пишется сообщение о захвате. Далее красные танки дестроились на своем же филде, пришлось эту часть скрипта выключить.
    После этого красные танки проезжают маркер на синем филде в D3. Триггер не срабатывает, маркер не перекрашивается. Затем эти танки доезжают до синего филда в D4, триггер не срабатывает.

    Сообщение о захвате красными поля в D3 возникает периодически (хотя оно всегда было красным). Счет за захват начисляется, причем растет счет у обеих сторон и разница постоянна и составляет 10 очков (у красных на 1 захват больше.) Синее поле в D3 тоже есть, и его красные танки проезжают, но оно не перекрашивается.

    Синие танки, атакующие Е3 и затем F3 не вызывают срабатывание триггера.

    Миссию можно прогонять в оффлане с ускорением времени. Тестировалось именно так. Миссия во вложении.
    BoF2.zip

    Подмиссии присутствуют не для каждого маркера (соответствено, не для каждого триггера). Надеюсь, это не вызовет проблем при попытке скрипта их подгрузить.

    Скрипт приходится прикладывать также файлом, т.к. превышает допустимую длину сообщения. Переименован в txt.

    BoF_1_main1_8.txt

    (Часть кода отключена, но будет включаться позже. Если сразу увидите нестыковки, буду благодарен за совет.)
    Сейчас глянул быстро, завтра подробнее посмотрю. Вы отключили уничтожение танков на маркере, поэтому получается такая ситуация - синие приезжают к маркеру, он срабатывает перекрашивая маркер, но поскольку там же находятся красные - тут же срабатывает обратный триггер и перекрашивает маркер опять в красный, происходит это достаточно быстро - счёт начисляется и тем и другим но смена ЛФ происходит незамеченной. Т.е. надо сделать так, чтобы одновременно две группы разных цветов у одного маркера не оказывались, либо, при перекраске маркера проигравшая группа уничтожалась. По поводу вопроса "что за триггер активируется?" - там не активируется а наоборот деактивируется триггер, который был у меня в каждой атакующей подмиссии - когда группа танков уничтожалась защитниками - рождалась новая группа танков, но при смене маркера, новая группа танков нам не нужна - вот я этот триггер и выключал.

    PS спаунточки в начальной миссии не нужны - они всё равно при старте битвы удалятся.
    Don't happy, be worry

  13. #13
    3GIAP.ru Аватар для -atas-
    Регистрация
    26.12.2001
    Адрес
    Москва
    Возраст
    54
    Сообщений
    2,992
    Записей в дневнике
    1

    Re: Вопросы.

    Цитата Сообщение от naryv Посмотреть сообщение
    Вы отключили уничтожение танков на маркере, поэтому получается такая ситуация - синие приезжают к маркеру, он срабатывает перекрашивая маркер, но поскольку там же находятся красные - тут же срабатывает обратный триггер и перекрашивает маркер опять в красный, происходит это достаточно быстро - счёт начисляется и тем и другим но смена ЛФ происходит незамеченной.
    Там синие и красные атакуют разные направления, на одном филде не встречаются. Но на будущее, конечно надо бы такие ситуации исключить, т.к. могут встретиться. В принципе нормально, если маркер меняет цвет несколько раз подряд, т.к. резервы могут подтягиваться в зону действия тригера по очереди. Если так, пусть воюют до конца честно, а дестроить врагов нужно только в радиусе спауна, чтобы не обижали игроков при спауне на захваченном филде. На маркере пусть все идет естественным путем, как в жизни. Может быть его нейтральным делать на время боя или таймаут ввести перед перекрашиванием, или красить в цвет стороны, которой в радиусе присутствует больше (проверять раз в 5 минут, например).

    Отключение уничтожения танков - это следствие. Т.к. красные приезжают на свой же красный филд в D3, почему-то пишется сообщение о захвате своего же изначально филда, и эти же красные танки уничтожаются скриптом как будто бы они синие, как я описал выше. Т.е. как будто срабатывает противоположный тригер. А синих там и близко не было, они другой фланг совсем атакуют в Е3. Только после этого уничтожение танков было отключено.

    PS. я как-то писал о баге, что при сохранении миссии триггер на проезд синей наземки сбрасывается на проезд красной наземки (спорадически наблюдается, как и британские взрыватели к немецким бомбам). Возможно, это он вылезает: приезжает красная группа, а срабатывает синий триггер, который уничтожает красные танки, но перед этим они успевают перекрасить филд снова в красный, т.к. триггера там 2. Видимо нужен таймаут на перекрашивание маркера и филдов: если за пару минут враги не приехали, перекрасить, если приехали, отсчитывать заново и проверять чья взяла каждые 2-5 минут.
    Крайний раз редактировалось -atas-; 31.05.2011 в 20:09.
    ...зелёные горят.
    ----------------------

    i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.

  14. #14
    Старший Офицер Форума
    Регистрация
    15.02.2002
    Адрес
    Moscow
    Возраст
    46
    Сообщений
    6,905
    Images
    51

    Re: Вопросы.

    Цитата Сообщение от -atas- Посмотреть сообщение
    Там синие и красные атакуют разные направления, на одном филде не встречаются. Но на будущее, конечно надо бы такие ситуации исключить, т.к. могут встретиться. В принципе нормально, если маркер меняет цвет несколько раз подряд, т.к. резервы могут подтягиваться в зону действия тригера по очереди. Если так, пусть воюют до конца честно, а дестроить врагов нужно только в радиусе спауна, чтобы не обижали игроков при спауне на захваченном филде. На маркере пусть все идет естественным путем, как в жизни. Может быть его нейтральным делать на время боя или таймаут ввести перед перекрашиванием, или красить в цвет стороны, которой в радиусе присутствует больше (проверять раз в 5 минут, например).

    Отключение уничтожения танков - это следствие. Т.к. красные приезжают на свой же красный филд в D3, почему-то пишется сообщение о захвате своего же изначально филда, и эти же красные танки уничтожаются скриптом как будто бы они синие, как я описал выше. Т.е. как будто срабатывает противоположный тригер. А синих там и близко не было, они другой фланг совсем атакуют в Е3. Только после этого уничтожение танков было отключено.

    PS. я как-то писал о баге, что при сохранении миссии триггер на проезд синей наземки сбрасывается на проезд красной наземки (спорадически наблюдается, как и британские взрыватели к немецким бомбам). Возможно, это он вылезает: приезжает красная группа, а срабатывает синий триггер, который уничтожает красные танки, но перед этим они успевают перекрасить филд снова в красный, т.к. триггера там 2. Видимо нужен таймаут на перекрашивание маркера и филдов: если за пару минут враги не приехали, перекрасить, если приехали, отсчитывать заново и проверять чья взяла каждые 2-5 минут.
    Ух, вроде разобрался в чём дело миссия, конечно, головусворачивающая по количеству всего что там есть . Значит основная проблема с некорректно срабатывающими триггерами - это армии заданные в миссии, вот эти строчки в файле основной миссии:
    Army 1 gb
    Army 2 de

    вариантов решения проблемы сейчас 2 - либо эти строчки удалить совсем(наверное более предпочтительный), либо дополнить ещё одной вот так:
    Army 0 nn
    Army 1 gb
    Army 2 de

    в след. патче уже можно будет оставлять 2 армии, как и было изначально в миссии.

    Соответственно уничтожение танков на маркере в скрипте можно включить назад, свои танки не должны больше убиваться. Ещё нашёл свой косяк в скрипте - везде MissionMarkers.Capacity лучше заменить на MissionMarkers.Count, а то эксепшны будут сыпаться.
    Теперь по самой миссии - вот этот кусок
    Код:
    [NPC]
      10_Chief Armor.SdKfz_222 de /posx 271412.66/posy 205413.17 /npc_count 4/target Spawn3 - Attack D3 /num_units 4
      16_Chief Armor.Guy_Mk_IA gb /posx 277976.34/posy 195607.69 /script baseAntiAir.cpp/npc_count 4/target BirthPlace_0 - Attack D3 /num_units 4
      7_Chief Armor.Beaverette_III gb /posx 273296.41/posy 200605.77 /script baseAntiAir.cpp/npc_count 4/num_units 4
      17_Chief Armor.SdKfz_222 gb /posx 287501.72/posy 202349.14 /script baseAntiAir.cpp/npc_count 4/target BirthPlace_5 - Attack D3 /num_units 4
      0_Chief Armor.Guy_Mk_IA gb /posx 272533.38/posy 200932.58 /script baseAntiAir.cpp/npc_count 8/num_units 8
      1_Chief Armor.SdKfz_222 gb /posx 276254.53/posy 191791.23 /script baseAntiAir.cpp/npc_count 4/target BirthPlace_01 - Attack D3 /num_units 4
    почти весь неправильный - скрипт baseAntiAir.cpp для прожекторов, не для техники, техника рождаться не будет, и очень возможны глюки различные , с таргетами для наземки тоже неправильно, в случае техники таргет будет работать на сплайновой дороге если скрипт car.cpp назначен NPC группе.
    Ну и в целом всё сразу сделано много и сложно, очень сложно отладить так - лучше кусочками делать - поставили пушки, пустили пару групп танчиков - если корректно отработали - дальше уже добавляем усложняем и т.д. а то сразу куча объектов все по своему работают и сложно понять кто что и почему делает . А так, без строчек с армиями прогнал - вроде всё перекрашивается как надо.
    Don't happy, be worry

  15. #15
    3GIAP.ru Аватар для -atas-
    Регистрация
    26.12.2001
    Адрес
    Москва
    Возраст
    54
    Сообщений
    2,992
    Записей в дневнике
    1

    Re: Вопросы.

    Цитата Сообщение от naryv Посмотреть сообщение
    А так, без строчек с армиями прогнал - вроде всё перекрашивается как надо.
    Еще раз спасибо, с мелкими вопросами типа пересчет счета и изменение логики атак пытаюсь сам разобраться.

    У меня просьба на будущее. В версии скрипта для островной карты "кресты и круги" была часть, генерирующая вейпойнты для бомбардировщиков.

    Хотелось бы посмотреть пример генерации вейпойнтов для танков, например:

    - группа танков захватила маркер
    - на маркере генерится оборона из противотанковой артиллерии и немного ПВО для прикрытия арты
    - если потери группы танков больше 50% на захваченном маркере генерится новая подмиссия с танками (подкрепление)
    - старые и новые танки выдвигаются на сгенеренные вейпойнты
    - вейпойнты генерятся, например, по алгоритму:
    - если между танками и одним из своих маркеров есть маркер противника, если он не за водной преградой, захватываем его (чтобы в тылу не оставлять незахваченные территории).
    - если в радиусе расстояния до этого маркера есть вражеская наземка - атакуем сначала наземку,
    Если потери больше 50%, начинаем новый цикл.
    Если нет:
    - берем координаты 2х ближайших ключевых объектов из числа аэродромов и городов на территории противника
    - создаем конечный вейпойнт в точке с координатами посередине между этими пунктами (чтобы в города и на аэродромы не въезжать), если там суша и не остров
    - если в радиусе расстояния до этого вейпойнта есть вражеская наземка - атакуем сначала наземку,
    - проверяем, есть ли в радиусе маркер противника, захватываетм его
    Если потери больше 50%, начинаем новый цикл.
    Если нет:
    - едем к конечному вейпойнту, захватываем его, ставим на нем маркер линии фронта своего цвета

    Количесто возрождений одной и той же группы ограничиваем 3 в рамках одного цикла, затем атакуем в другом месте карты либо атаковать начинает противник. Пока нет менеджмента ресурсов и сапплая это можно сделать рандом выбором, а в дальнейшем привязать к уровню сапплая района: атакует тот, у кого сапплай выше, например.

    Может возникнуть проблемка с непроходимостью некоторых участков карты для танков, пока ИИ не выведен на достаточный уровень. Мосты бывают непроходимы для танков. Говорят, реки можно пересекать без мостов по сплайн-дорогам. Против застревания в населенных пунктах можно запретить танкам приближаться к домикам (ставить объездные вейпойнты), и предусмотреть, что если группа не находится на конечном вейпойнте или в бою и при этом не двигается 5 минут, ставить промежуточный вейпойнт где-то сзади и сбоку (чтобы объехать препятствие). В крайнем случае дестроить совсем застрявшую группу и создавать новую с новым маршрутом.

    Тем временем постараемся запутить на Repka миссию с подмиссиями нарисованными вручную, что сильно ограничивает регион действий.
    Крайний раз редактировалось -atas-; 06.06.2011 в 13:51.
    ...зелёные горят.
    ----------------------

    i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.

  16. #16
    3GIAP.ru Аватар для -atas-
    Регистрация
    26.12.2001
    Адрес
    Москва
    Возраст
    54
    Сообщений
    2,992
    Записей в дневнике
    1

    Re: Вопросы.

    Цитата Сообщение от naryv Посмотреть сообщение

    так вот же - http://www.sukhoi.ru/forum/showthrea...=1#post1608824 скрипт с проверкой в многоместных самолётах. Оттуда проверку можно взять.
    Тот скрипт не работал на выделенном сервере, а тольк на невыделенном, поэтому от него отказались.

    В том скрипте проверка:
    Код:
            public void _DespawnEmptyPlane(AiActor actor)
            {
                if (actor == null)
                { return; }
    
                Player[] Players = GamePlay.gpRemotePlayers();
    
                bool PlaneIsEmpty = true;
    
                foreach (Player i in Players)
                {
                    if ((i.Place() as AiAircraft) == (actor as AiAircraft))
                    {
                        PlaneIsEmpty = false;
                        break;
                    }
                }
    В нашем текущем скрипте проверка:
    Код:
       private bool isAiControlledPlane (AiAircraft aircraft) 
        {
    		if (aircraft == null) 
            { 
    			return false;
    		}
    
    		Player [] players = GamePlay.gpRemotePlayers ();
    		foreach (Player p in players) 
            {    
    			if (p != null && (p.Place () is AiAircraft) && (p.Place () as AiAircraft) == aircraft)
                { 
    				return false;
    			}
    		}
    
    		return true;
    	}
    Не могу увидеть разницы.
    p.Place () is AiAircraft должно подтвердить, что ирок все еще в самолете, если даже он сел на место штурмана?
    Или не выполняется условие p.Place () as AiAircraft) == aircraft?

    Как правильно?

    Полный код http://www.sukhoi.ru/forum/showthrea...=1#post1627122

    --- Добавлено ---

    Цитата Сообщение от Small_Bee Посмотреть сообщение
    Вот так попробуй
    Спасибо. А в чем разница, искать их как группы или как акторов? Должно быть все равно, так как:

    Сообщение от naryv Посмотреть сообщение
    да, корабль - это AiGroundActor и AiGroundGroup ,с типом Ship
    Просто интересно разобраться, почему нужно их искать через foreach и почему (с чего всё началось) этот скрипт всё кроме кораблей уничтожает, если корабли тоже AiGroundActor?

    Код:
        //Ground objects (except AA Guns) will die after 55 min when counted from their birth
    
        public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
        {
            base.OnActorCreated(missionNumber, shortName, actor);
            //Ground objects (except AA Guns) will die after 55 min when counted from their birth
            if (actor is AiGroundActor)
                if ((actor as AiGroundActor).Type() != maddox.game.world.AiGroundActorType.AAGun)
                    Timeout(3300, () =>
                    {
                        if (actor != null)
                        { (actor as AiGroundActor).Destroy(); }
                    }
                            );
        }
    ...зелёные горят.
    ----------------------

    i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.

  17. #17

    Re: Вопросы.

    Цитата Сообщение от -atas- Посмотреть сообщение
    Спасибо. А в чем разница, искать их как группы или как акторов? Должно быть все равно, так как...
    Неверно. Деталь в методе Type(). Для AiGroundActor он возвращает AiGroundActorType, для AiGroundGroup - AiGroundGroupType.
    В первом случае проверки другие, и их целая пачка:
    ShipMisc,
    ShipTransport,
    ShipSmallWarship,
    ShipDestroyer,
    ShipCruiser,
    ShipBattleship,
    ShipCarrier,
    ShipSubmarine

    Акторов у нас 39 типов, а групп всего 6.

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •