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

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

Тема: Полный редактор и скрипты.

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

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

    Re: Полный редактор и скрипты.

    Цитата Сообщение от Small_Bee Посмотреть сообщение
    Перед загрузкой миссии смотришь след. номер миссии
    А как его узнать и запомнить? Например, у меня в Степях может одновременно крутиться 3 одинаковых подмиссии с соответственно одинаковыми именами триггера. Мне нужно проверять триггер какой из подмиссии сработал, чтобы считать счет для каждой подмиссии (чтобы не путаться). OnTrigger я могу перебрать все активные миссии и проверить, if (missionnumber == x) но вот где получить х? Самому вручную считать при загрузке каждой подмиссии x = ++ ? Но возможно missionnumber, который присутствует в OnTrigger в каком-то своем внутреннем формате считается?

    Т.е. другими словами missionnumber из OnTrigger - это некая внутренняя вещь БзБ или я могу эти номера сам назначать перед загрузкой каждой подмиссии?

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

    Цитата Сообщение от SlavikSG Посмотреть сообщение
    Неа! Бесполезно. Не смог найти. Похоже, что этого и нет вовсе.
    В cross_roundel миссии naryv:

    Код:
            foreach (AiGroundGroup gg in GamePlay.gpGroundGroups(army))
            {            
                if (gg != null) 
                    if (gg.Pos().distance(ref AirportPos) < 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(); 
                        }
                    }
            }
    В других его миссиях тоже есть при похожих обстоятельствах но в других видах (отдельно для артиллерии и танков емнип).

    edit
    Там еще 2я часть интересная, как раз про артиллерию с перебором статиков.
    Код:
        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)
                    {
                        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();
                            }
                    }                 
                                                   
                }
            }        
        }
    Крайний раз редактировалось -atas-; 25.11.2011 в 15:01.
    ...зелёные горят.
    ----------------------

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

  2. #2
    Курсант Аватар для SlavikSG
    Регистрация
    26.03.2004
    Адрес
    Новомосковск Тульская обл.
    Возраст
    61
    Сообщений
    441

    Re: Полный редактор и скрипты.

    Да нет же! Это опять же поиск в группе:

    foreach (AiGroundGroup gg in GamePlay.gpGroundGroups(army))
    ...
    foreach (AiActor ggActor in gg.GetItems())


    У меня нет групп.
    Нет в русском языке слова дешеГО. Есть слово дешеВО.

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

    Re: Полный редактор и скрипты.

    Цитата Сообщение от SlavikSG Посмотреть сообщение
    Да нет же! Это опять же поиск в группе:

    foreach (AiGroundGroup gg in GamePlay.gpGroundGroups(army))
    ...
    foreach (AiActor ggActor in gg.GetItems())


    У меня нет групп.
    Если я правильно понимаю, то каждая зенитка - это группа, состоящая из одного актора, т.е. группы есть у всех, у кого есть акторы. Иначе откуда у naryv могут взяться группы зениток???
    ...зелёные горят.
    ----------------------

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

  4. #4

    Re: Полный редактор и скрипты.

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

  5. #5
    Курсант Аватар для SlavikSG
    Регистрация
    26.03.2004
    Адрес
    Новомосковск Тульская обл.
    Возраст
    61
    Сообщений
    441

    Re: Полный редактор и скрипты.

    Цитата Сообщение от Small_Bee Посмотреть сообщение
    ... Вот кстати и получение актора по имени
    curActor = GamePlay.gpActorByName(nameActor) as AiGroundActor;
    Ага. Я уже нашел в примерах. Это наконец-то сработало. Большое спасибо!
    Bbb = GamePlay.gpActorByName(ActorName.Full(2, "Static4")); //Где "двойка" это номер миссии
    Теперь начну ковыряться дальше...

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

    P.S.
    Не знаю, вопрос в тему или нет. А правда, что у зениток, находящихся в группе, заканчиваются патроны?
    Нет в русском языке слова дешеГО. Есть слово дешеВО.

  6. #6

    Re: Полный редактор и скрипты.

    Цитата Сообщение от SlavikSG Посмотреть сообщение
    Ага. Я уже нашел в примерах. Это наконец-то сработало. Большое спасибо!
    Bbb = GamePlay.gpActorByName(ActorName.Full(2, "Static4")); //Где "двойка" это номер миссии
    Теперь начну ковыряться дальше...


    Я понял, о чем ты. Но у меня не так.

    P.S.
    Не знаю, вопрос в тему или нет. А правда, что у зениток, находящихся в группе, заканчиваются патроны?
    Да. Интерфейсов для перезарядки пока нет, т.е. надо удалить старую и поставить новую.

  7. #7
    Курсант Аватар для SlavikSG
    Регистрация
    26.03.2004
    Адрес
    Новомосковск Тульская обл.
    Возраст
    61
    Сообщений
    441

    Re: Полный редактор и скрипты.

    Цитата Сообщение от Small_Bee Посмотреть сообщение
    Да. Интерфейсов для перезарядки пока нет, т.е. надо удалить старую и поставить новую.
    Ага. Видимо я поэтому и уперся рогом именно в тип наземки "Артиллерия", а не "Броня".
    Нет в русском языке слова дешеГО. Есть слово дешеВО.

  8. #8
    Курсант Аватар для SlavikSG
    Регистрация
    26.03.2004
    Адрес
    Новомосковск Тульская обл.
    Возраст
    61
    Сообщений
    441

    Re: Полный редактор и скрипты.

    В ходе работы над скриптом, возник вопрос такого плана. Имеем событие убиения зенитки. После чего стразу удаляем ее трупик. Пишем такой код:
    Код:
    public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
    {
    base.OnActorDead(missionNumber, shortName, actor, damages);
    if (actor is AiGroundActor)
       {
        (actor as AiGroundActor).Destroy();
        Sss("Удалили красную зену: " + actor.Name());
       }
    }
    и получаем стопроцентную ошибку.

    Но если пишем все в точности так же, но делаем задержку в одну секунду, то никакой ошибки не возникает.
    Код:
    public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
    {
    base.OnActorDead(missionNumber, shortName, actor, damages);
    if (actor is AiGroundActor)
       {
        Timeout(1, () =>
           {
           (actor as AiGroundActor).Destroy();
           Sss("Удалили красную зену: " + actor.Name());
           });
       }
    }
    Почему такое происходит??? Получается, что нужно всегда делать задержку?
    Нет в русском языке слова дешеГО. Есть слово дешеВО.

  9. #9
    Курсант Аватар для SlavikSG
    Регистрация
    26.03.2004
    Адрес
    Новомосковск Тульская обл.
    Возраст
    61
    Сообщений
    441

    Re: Полный редактор и скрипты.

    Цитата Сообщение от SlavikSG Посмотреть сообщение
    и получаем стопроцентную ошибку.
    Небольшое дополнение...
    В логе сервера пишется ошибка, но зенитка все равно исправно удаляется.
    (это я выяснил уже потом)
    Нет в русском языке слова дешеГО. Есть слово дешеВО.

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

    Re: Полный редактор и скрипты.

    Цитата Сообщение от SlavikSG Посмотреть сообщение
    В ходе работы над скриптом, возник вопрос такого плана. Имеем событие убиения зенитки. После чего стразу удаляем ее трупик. Пишем такой код:
    Код:
    public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
    {
    base.OnActorDead(missionNumber, shortName, actor, damages);
    if (actor is AiGroundActor)
       {
        (actor as AiGroundActor).Destroy();
        Sss("Удалили красную зену: " + actor.Name());
       }
    }
    и получаем стопроцентную ошибку.

    Но если пишем все в точности так же, но делаем задержку в одну секунду, то никакой ошибки не возникает.
    Код:
    public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
    {
    base.OnActorDead(missionNumber, shortName, actor, damages);
    if (actor is AiGroundActor)
       {
        Timeout(1, () =>
           {
           (actor as AiGroundActor).Destroy();
           Sss("Удалили красную зену: " + actor.Name());
           });
       }
    }
    Почему такое происходит???
    Вы уничтожаете объект (actor as AiGroundActor).Destroy(); а затем - пытаетесь получить его имя - actor.Name(). Если актор уже успел задестроиться, то Вы пытаетесь получить .Name() от null-a, что даст ошибку естественно. С таймаутом дестрой может позже произойти поэтому ошибки не будет.
    Можно сделать что-то типа этого -
    Код:
    public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
    {
    base.OnActorDead(missionNumber, shortName, actor, damages);
    if (actor is AiGroundActor)
       {
        string actorName = actor.Name();
        (actor as AiGroundActor).Destroy();
         if  (actor == null)
             Sss("Удалили красную зену: " + actorName);
       }
    }
    Don't happy, be worry

  11. #11

    Re: Полный редактор и скрипты.

    Цитата Сообщение от -atas- Посмотреть сообщение
    edit
    Там еще 2я часть интересная, как раз про артиллерию с перебором статиков.
    Тут некая эмуляция перебора, исходя из предположения, что имена статиков руками не менялись. Т.е. мы последовательно перебираем диапазон возможных имен, если кто с таким именем попадается, то работаем с ним. Т.е. нам придется сделать M*N итераций, где M - количество миссий, N - макс. кол-во статиков в миссии. Даже не кол-во, а макс. номер статика. Например, если у нас будет два статика - Static0 и Static99, N будет не 2, а 100.

    2 SlavikSG
    Вот кстати и получение актора по имени
    curActor = GamePlay.gpActorByName(nameActor) as AiGroundActor;

Ваши права

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