Показать сообщение отдельно
Старый 20-07-2012, 13:22   #15
naryv
Corporal
 
Аватар для naryv
 
Регистрация: Aug 2004
Сообщений: 113
Цитата:
Сообщение от podvoxx Посмотреть сообщение
А можно ему передать по выбору приоритета целей?
Вчера направил харрикейны атаковать цель(без указания конкретной), они первым делом начали штурмовать окопы(синие статики), хотя рядом стояли более важные цели ПТ пушки. Нужно поставить приоритет статиков окопов и зданий на последнее место, все равно пулеметами они ничего не сделают.
что-то мы попробовали - с указанием района атаки и без бомб 110 ничего не атакуют, в точке атаки стоят нейтральные статик-окопы. В общем надо миссию смотреть, не получилось у нас повторить .

Цитата:
Сообщение от podvoxx Посмотреть сообщение
В идеале(хотя бы в сиквеле) нужна возможность задать АИ тип цели, который стоит атаковать или список, где можно настроить этот приоритет. Это нужно для более точного управленя ботами, особенно в онлайне. Сейчас вызывая его на поле боя сложно предположить чем он там будет заниматься(и часто нужно, чтобы совсем другим). К примеру "Атаковать бронетехнику", "Атаковать артиллерию", "Атаковать зенитную артиллерию". Может быть можно добавить новый вэйпоинт или еще как-то сделать.
В меню радиокоманд вроде все это есть. Кстати нет такой возможности уточнять задачу отдавая команды АИ через радиокоманды из скрипта? Так даже можно будет надстройку с доработанным АИ теоретически сделать в зависимости от условий в миссии направляя его действия.
Я прошу прощения, вчера наглым образом наврал про невозможность перезадать цель ботам, потом вспомнил, что так делал уже сам . Вот пример - та-же миссия с кастомной колонной, добавил в неё 110 которые изначально должны атаковать матадоры. При рождении кастомной колонны 110 перенаправляются атаковать её. Миссия:
Код:
[PARTS]
  core.100
  bob.100
[MAIN]
  MAP Land$Online_Cross_v_Roundel
  BattleArea 0 0 32768 32768 10000
  TIME 12
  WeatherIndex 0
  CloudsHeight 1000
  BreezeActivity 10
  ThermalActivity 10
[GlobalWind_0]
  Power 3.000 0.000 0.000
  BottomBound 0.00
  TopBound 1500.00
  GustPower 5
  GustAngle 45
[splines]
[AirGroups]
  BoB_LW_LG2_I.01
[BoB_LW_LG2_I.01]
  Flight0  1 2 3
  Class Aircraft.Bf-110C-4
  Formation FINGERFOUR
  CallSign 28
  Fuel 100
  Weapons 1
  Skill 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3
[BoB_LW_LG2_I.01_Way]
  NORMFLY 8762.83 17759.64 500.00 300.00
  NORMFLY 8784.100 15337.75 500.00 300.00
  NORMFLY 9615.85 9869.40 500.00 300.00
  NORMFLY 14784.61 10298.51 500.00 300.00
  GATTACK_TARG 19928.28 9694.75 500.00 300.00 3_Chief 1
  NORMFLY 22660.83 16112.82 500.00 300.00
  NORMFLY 20220.47 20406.43 500.00 300.00
  NORMFLY 15622.15 21240.93 500.00 300.00
  NORMFLY 11311.86 20457.09 500.00 300.00
[CustomChiefs]
[Chiefs]
  3_Chief Vehicle.AEC_Matador gb /num_units 4
[3_Chief_Road]
  19551.57 9209.35 38.40  0 10 4.17
  19680.00 9184.00 38.40
  S 15 0 0.80 20.00 P 19775.27 9202.64
  S 15 0 0.78 20.00 P 19809.96 9193.38
  S 14 0 0.74 20.00 P 19897.04 9211.04
  S 14 0 0.68 20.00 P 20025.98 9176.63
  S 14 0 0.64 20.00 P 20119.74 9151.60
  S 13 0 0.60 20.00 P 20228.83 9163.97
  S 13 0 0.58 20.00 P 20279.36 9150.44
  20419.84 9290.50 38.40
[Stationary]
[Buildings]
[BuildingsLinks]
[Trigger]
  trigger TPassThrough 3 1 19999 9180 250
Скрипт:
Код:
using maddox.game;
using maddox.game.world;

public class Mission : AMission
    {

    public override void OnBattleStarted()
    {
        base.OnBattleStarted();
        MissionNumberListener = -1;                
    }
    

        public override void OnActorTaskCompleted(int missionNumber, string shortName, AiActor actor)
        {
            base.OnActorTaskCompleted(missionNumber, shortName, actor);
            GamePlay.gpHUDLogCenter(shortName + " PRIEHALI!!!!!!!");
        }

        public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
        {
            base.OnActorCreated(missionNumber, shortName, actor);
            if ((missionNumber>0)&&(actor is AiGroundGroup))   
            {
                AiAirGroup ag = GamePlay.gpAirGroups(2)[0];          
                if (ag != null)
                {                    
                    AiWayPoint[] way = ag.GetWay();             // получили маршрут группы
                    for (int i = ag.GetCurrentWayPoint() ; i < way.Length; i++) //просматриваем его начиная со след. точки - те которые уже пролетели нам не нужны
                    {
                        if ((way[i] as AiAirWayPoint).Action == AiAirWayPointType.GATTACK_TARG)     // находим точку атаки
                        {                            
                            (way[i] as AiAirWayPoint).Target = actor;                               // задаём новую цель - свежесозданого актора
                            (way[i] as AiAirWayPoint).GAttackPasses = AiAirWayPointGAttackPasses._3;   // по умолчанию AiAirWayPointGAttackPasses.AUTO но можно задать кол-во заходов и тип атаки
                            (way[i] as AiAirWayPoint).P.x = actor.Pos().x;                          // задаём новые координаты точки маршрута, следует учесть, что когда самолёты к этой точке подлетят - они будут "искать" свою цель в радиусе 6 км, т.е. если колонна уедет за это время - надо будет корректировать координаты
                            (way[i] as AiAirWayPoint).P.y = actor.Pos().y;
                        }
                        
                    }                                        
                    ag.SetWay(way);  // задаём изменённый маршрут
                }
            }
        }

        public void CreateCustomColumn()
        {            
            ISectionFile mmf = GamePlay.gpCreateSectionFile();
            string section = "";
            string key = "";
            string value = "";
            section = "CustomChiefs";               
            key = "Vehicle.MyCustomChief";   // название колонны
            value = "$core/icons/tank.mma";  // иконка
            mmf.add(section, key, value);

            section = "Vehicle.MyCustomChief";  // секция с описанием колонны, называется как объявленный выше чиф
            key = "Car.MG_TA";                  // перечисляем юниты входящие в колонну
            value = "";
            mmf.add(section, key, value);
            key = "Car.AEC_Matador";            
            mmf.add(section, key, value);
            key = "Car.Beaverette_III";            
            mmf.add(section, key, value);
            key = "Car.Beaverette_III";            
            mmf.add(section, key, value);
            key = "Car.Austin_K2_Ambulance";            
            mmf.add(section, key, value);
            key = "Car.Scammell_Pioneer_TRMU30";            
            mmf.add(section, key, value);
            key = "TrailerUnit.Scammell_Pioneer_TRCU30"; 
            value = "1";                        // признак того, что это - буксируемый юнит
            mmf.add(section, key, value);
            key = "Car.Austin_7";
            value = "";     
            mmf.add(section, key, value);       

            section = "Chiefs";                 // секция с описанием параметров юнитов в чифе
            key = "0_Chief Vehicle.MyCustomChief";
            value = "gb /colors00_tent olive/colors00 darkgreen/skin1 materialsSummer2/skin3 materialsSummer2/skin4 materialsSummer_RAF/tow06_00 1_Static";
            /* gb - страна, /colors00_tent olive/colors00 darkgreen - цвет тента и кузова первого юнита, skin1 materialsSummer2/skin3 materialsSummer2/skin4 materialsSummer_RAF - 
             скины 1,3 и 4 юнитов, /tow06_00 1_Static - на шестом юните(прицеп) стоит груз; можно обойтись только gb - тогда все скины, цвета будет дефолтные, грузов не будет */
            mmf.add(section, key, value);

            section = "Stationary";                 // груз для прицепа
            key = "1_Static";
            value = "Stationary.Matilda_2A gb 0.00 0.00 0.00";     
            mmf.add(section, key, value);        

            section = "0_Chief_Road";   // секция с описанием дороги
            key = "16844.94 15543.52 38.40";  
            value = "0 2 0.28";
            mmf.add(section, key, value);

            key = "16842.57 15269.21 38.40";
            value = "0 2 0.14";
            mmf.add(section, key, value);

            key = "16806.17 14875.18 38.40";
            value = "0 2 0.14";
            mmf.add(section, key, value);


            key = "16769.69 14747.50 38.40";
            value = "0 4 0.14";
            mmf.add(section, key, value);

            key = "S";
            value = "8 0 0.80 40.00 P 16773.99 14748.81";
            mmf.add(section, key, value);            

            key = "S";
            value = "8 0 0.35 20.00 P 16881.36 14144.95";
            mmf.add(section, key, value);            

            key = "16885.20 14119.75 38.40";
            value = "0 6 0.14";
            mmf.add(section, key, value);

            key = "18786.22 14453.98 38.40";
            value = "0 2 0.14";
            mmf.add(section, key, value);

            key = "18824.68 14635.02 38.40";
            value = "";
            mmf.add(section, key, value);
            
            GamePlay.gpPostMissionLoad(mmf);
        }

        public override void OnTrigger(int missionNumber, string shortName, bool active)
        {            
            base.OnTrigger(missionNumber, shortName, active);
            if (active)
                CreateCustomColumn();
        }
        
    }
в нём добавил на ивент OnActorCreated перенацеливание группы на вновь созданного актора. Но естественно перенацеливать можно куда угодно. Для расширенных св-в точки маршрута её надо задавать как AiAirWayPoint.

Цитата:
Сообщение от podvoxx Посмотреть сообщение
С OnActorTaskCompleted разобрался, вчера впервые группа красных танков прорвала оборону синих к западу от г. Амьен и "уничтожила" около 200 фрицев на окраине города В небе кружили хурики со 109-ми, 9-ка велингтонов нанесла бомбовый удар по войскам города - смотрится все здорово, полетать правда некогда.
это хорошо
Цитата:
Сообщение от podvoxx Посмотреть сообщение
Жаль что дымы плохо работают, очень хочется устроить пожар
плохо - в смысле квадратиками? Это вроде починили.

Цитата:
Сообщение от podvoxx Посмотреть сообщение
1. И вопрос по брифингам. Если одмиссия имеет брифинг, он добавляется к брифингу хост-миссии?
емнип да.

Цитата:
Сообщение от podvoxx Посмотреть сообщение
2. Можно ли как-то из скрипта определить есть у юнита возможность нести груз и цеплять трейлер?
Нет, так нельзя.
__________________
Модератор - деревянная палка с прокладкой из сукна, служащая для приглушения звука у пианино. (Большой Энциклопедический Словарь)
naryv вне форума   Ответить с цитированием