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

Страница 3 из 7 ПерваяПервая 1234567 КрайняяКрайняя
Показано с 51 по 75 из 168

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

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

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

    Цитата Сообщение от Small_Bee Посмотреть сообщение
    ...тип получаем через InternalTypeName()
    Ага. Спасибо! Реализовать это свойство удалось в такой части кода:
    Код:
    Zena = (actor as AiCart).InternalTypeName().ToString();
    
    if (actor.Army() == 1 && Zena == "bob:Artillery.Krupp_L2H43_Protze_Flak38")
       {
        Red_Zenitka_Killed++;
        Sss("Количество подбитых красных зениток стало равно: " + Red_Zenitka_Killed.ToString());
        }
    Странно только то, что условие правильно работает лишь тогда, когда я этот (actor as AiCart).InternalTypeName().ToString() предварительно загоняю в переменную Zena. Ну, да это ладно. Пашет и слава Богу!

    Другой вопрос. Имеем такую миссию.
    [Stationary]
    Static81 Aeroanchored.Balloon_winch_GER1 de 29244.30 15856.53 0.00 /hstart 20/hend 200
    Static82 Artillery.Krupp_L2H43_Protze_Flak38 de 29246.27 15871.57 0.00 /timeout 0/radius_hide 0
    ...


    При достижении в "Битве" некого условия, нужно все эти объекты из миссии уничтожить и загрузить заново (из той же миссии). Объекты при этом могут быть в трех состояниях. Целая зенитка, подбитая (дымящаяся зенитка) и уже удаленная зенитка. То есть пустое место. Аэростаты пока в двух состояниях. Целые и подбитые (удалять подбитые еще не научился).

    Как удалить с карты все эти объекты разом? И зенитки и аэростаты.
    Находил кое-какие примеры, но чет мне это показалось очень сложным.
    Тем более, что у меня там не группы. А просто отдельные объекты, стоящие на охране ВПП.
    Нет в русском языке слова дешеГО. Есть слово дешеВО.

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

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

    В примерах naryv загружает и удаляет зенитки в определенном радиусе от маркера.

    Видимо проще загружать отдельную подмиссию только с этими объектами и удалять соответственно только объекты этой подмиссии. Примеры скриптов actor destroy есть в архиве (папка _actors destroy ).
    ...зелёные горят.
    ----------------------

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

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

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

    Да нет же! Там все не то. Там по событию OnActorCreated на каждого вновь созданного актора заводится свой личный таймер. Этот свой личный уникальный таймер помнит каждого своего актора по его имени (ну, или еще как-то там). Когда подходит срок кончины актора, то таймер, постоянно зная и не забывая своего родного актора, убивает его.

    Вот код из тех примеров:
    Код:
    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(); }
            }
                );
    }

    У меня в миссии вообще нет таймеров. Мне это не нужно и не интересно. Созданные мною объекты - "Артиллерия", существуют бесконечно долго. Скажем, в ходе битвы половина будет уничтожена, другая половина останется. Сработает некое условие. По моей задумке и сценарию, этим условием будет являться убиение шести вражеских зениток на любых ВПП противника. Как только это будет сделано, условие срабатывает и подмиссия, ответственная за загрузку зениток на ВПП, загружает в виде бонуса, для выигрывавшей стороны, новые зенитки на всех дружественных ВПП. Но прежде, чем загрузить новые зенитки, нужно убить все оставшиеся старые зенитки (которые еще не были подбиты или которые еще только догорают). Ну, чтобы не было каши. Чтобы одна зенитка не становилась на другую зенитку.

    От Small_Bee есть замечательный пример чистки всего того, что есть в миссиях циклами "foreach".
    Пример...
    Сканируем все существующие армии в битве:
    foreach (int army in GamePlay.gpArmies())
    В тело этого основного цикла вкладываем цикл по перебору всех существующий групп в этих армиях:
    foreach (AiAirGroup group in airGroups)
    И уже в тело этого цикла вкладываем последний цикл по перебору всех акторов в группе:
    foreach (AiActor actor in group.GetItems())

    И все бы хорошо. Но у меня в миссии нет групп!!! У меня есть отдельно стоящие объекты типа "Артиллерия". Которые группами не являются. Вот я и не пойму, как мне циклом, или не циклом, перебрать все эти объекты и удалить их.

    Цитата Сообщение от -atas- Посмотреть сообщение
    ...Видимо проще загружать отдельную подмиссию только с этими объектами...
    Разумеется так и делаю. Одна подмиссия грузит все Синие зенитки на всех ВПП Синих, другая грузит Красные...

    Цитата Сообщение от -atas- Посмотреть сообщение
    ...и удалять соответственно только объекты этой подмиссии.
    Как это сделать???!!!
    Крайний раз редактировалось SlavikSG; 25.11.2011 в 10:59.
    Нет в русском языке слова дешеГО. Есть слово дешеВО.

  4. #54

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

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

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

    В "Морском льве" этим рулит спец. класс. И у него есть методы (грубо) SetMisFileName(), Load() и Unload() (Перед вызовом Load к примеру он сам вызывает Unload и прибирается). Т.е. достаточно рулить только экземпляром класса, вся механика скрыта в нем, очень удобно. Там еще куча всего вроде отложенной загрузки, нотификации о том, что все акторы померли и т.д. Т.е. можно дополнять дальше соотв. своих требованиям.

    В твоем случае можно сделать что-то вроде класса Батарея, экземпляры которого сами будут следить за состоянием своих орудий и предоставлять информацию о них вовне, Батареи объединить скажем в Дивизион, который смотрит за состоянием батарей. Так мы уходим от необходимости следить за каждой мордой отдельно, а разговаривать уже непосредственно как бы с "командирами" верхнего уровня. И микроменеджмент батарей и дивизионов переложить на них и младших, и не беспокоится об этом.
    Крайний раз редактировалось Small_Bee; 25.11.2011 в 13:55.

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

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

    Цитата Сообщение от SlavikSG Посмотреть сообщение
    Да нет же! Там все не то. Там по событию OnActorCreated на каждого вновь созданного актора заводится свой личный таймер.
    Я же не говорил, что это нужно OnActorCreated делать. Можно и onTrigger. (В миссиях naryv зенитки по триггеру захвата маркера удаляются)

    А перебирать можно не только группы, но и акторов (поискать в примерах foreach actor in ... или типа того) емнип.
    ...зелёные горят.
    ----------------------

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

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

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

    Цитата Сообщение от Small_Bee Посмотреть сообщение
    ...Т.е. по OnActorCreated и если группа null, запоминаешь их полные имена где-то в списке. Перед загрузкой миссии смотришь след. номер миссии, е если параметре к OnActorCreated будет этот номер - значит твой клиент. Соотв., если хочешь их удалить, пробегаешься по списку, и которые еще живы, убираешь.

    Эх! Мне бы все тоже самое, только с небольшим примером. Номер миссии - это я понял. А какое имя запоминать? "Actor.Name()"? И потом, когда я запомню это самое строковое имя и номер миссии, как узнать, какой это будет потом "actor"? Ведь функция Destroy(), как я понял, работает только зная сам объект "actor", а не его строковое имя в миссии. Если я не прав, то очень бы хотел знать, как зная только строковое имя актора и номер мисси, можно применить функцию Destroy(). Ни в одном примере я не смог найти ничего, кроме такого написания:
    (actor as AiGroundActor).Destroy();
    Очень бы хотелось написать вот так: "Static4".Destroy(); Но это, естественно, работать не будет.

    Какой список имен создавать? Некий двумерный массив или может быть справочник "Dictionary". Или еще что-то, более удобное?

    Цитата Сообщение от Small_Bee Посмотреть сообщение
    ...В твоем случае можно сделать что-то вроде класса Батарея...
    Ой, нет! Спасибо!
    Это точно не мой случай. В ООП я не секу совершенно. Не тот уровень подготовки. А с этим C# (с его невероятно сложным и малопонятным синтаксисом) вообще столкнулся впервые.

    Цитата Сообщение от -atas- Посмотреть сообщение
    ...А перебирать можно не только группы, но и акторов (поискать в примерах foreach actor in ... или типа того)...
    Неа! Бесполезно. Не смог найти. Похоже, что этого и нет вовсе.
    Крайний раз редактировалось SlavikSG; 25.11.2011 в 14:50.
    Нет в русском языке слова дешеГО. Есть слово дешеВО.

  7. #57
    3GIAP.ru Аватар для -atas-
    Регистрация
    26.12.2001
    Адрес
    Москва
    Возраст
    53
    Сообщений
    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.

  8. #58

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

    Цитата Сообщение от SlavikSG Посмотреть сообщение
    Эх! Мне бы все тоже самое, только с небольшим примером. Номер миссии - это я понял. А какое имя запоминать? "Actor.Name()"? И потом, когда я запомню это самое строковое имя и номер миссии, как узнать, какой это будет потом "actor"? Ведь функция Destroy(), как я понял, работает только зная сам объект "actor", а не его строковое имя в миссии. Если я не прав, то очень бы хотел знать, как зная только строковое имя актора и номер мисси, можно применить функцию Destroy(). Ни в одном примере я не смог найти ничего, кроме такого написания:
    (actor as AiGroundActor).Destroy();
    Очень бы хотелось написать вот так: "Static4".Destroy(); Но это, естественно, работать не будет.

    Какой список имен создавать? Некий двумерный массив или может быть справочник "Dictionary". Или еще что-то, более удобное?


    Ой, нет! Спасибо!
    Это точно не мой случай. В ООП я не секу совершенно. Не тот уровень подготовки. А с этим C# (с его невероятно сложным и малопонятным синтаксисом) вообще столкнулся впервые.


    Неа! Бесполезно. Не смог найти. Похоже, что этого и нет вовсе.
    Если не ошибаюсь, есть метод GamePlay.gp(Get?)ActorByName(...), вроде так. Который позволяет получить актора по его полному имени, или вернет null, если актор не найден, соответственно после можно применить Destroy(). Напоминаю, полное имя актора выглядит как "номер миссии":"короткое имя". Для жонглирования именами используется стат. класс ActorName. Например, почти каждый метод возвращает номер миссии и короткое имя, можно с помощью ActorName получить из них правильно полное имя. AiActor.Name() возвращает полное имя.

    Список какой будет удобнее, конечно.
    Знаний ООП хватит и базовых, литературы масса. Синтаксис C# весьма несложный, тем более почти один в один с плюсов или PHP.

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

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

    Т.е. другими словами missionnumber из OnTrigger - это некая внутренняя вещь БзБ или я могу эти номера сам назначать перед загрузкой каждой подмиссии?
    Нет, назначать не можешь, но есть метод NextMissionNumber(), правда где именно (миссия, Battle или gamePlay) не помню. Опять же, отсылка к лёве, там это есть.

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

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

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

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


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

  10. #60

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

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

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

  11. #61
    3GIAP.ru Аватар для -atas-
    Регистрация
    26.12.2001
    Адрес
    Москва
    Возраст
    53
    Сообщений
    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.

  12. #62

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

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

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

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

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

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

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

  14. #64

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

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


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

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

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

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

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

  16. #66
    Курсант Аватар для SlavikSG
    Регистрация
    26.03.2004
    Адрес
    Новомосковск Тульская обл.
    Возраст
    59
    Сообщений
    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());
           });
       }
    }
    Почему такое происходит??? Получается, что нужно всегда делать задержку?
    Нет в русском языке слова дешеГО. Есть слово дешеВО.

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

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

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

  18. #68
    Старший Офицер Форума
    Регистрация
    15.02.2002
    Адрес
    Moscow
    Возраст
    45
    Сообщений
    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

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

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

    Не-не-не!!! Сори!
    Я этой функцией вывода вспомогательного сообщения, только ввел вас в заблуждение.
    Все! Забыли про Sss("Удалили красную зену: " + actorName); Дело вовсе не в этом. Ошибка есть так или иначе. Вот код без этой функции и ошибка все равно возникает:
    Код:
    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();
       }
    }
    Проверил только что еще раз. Ошибка есть. И нет ошибки, если проделать все тоже самое, но с секундной задержкой.
    Но подчеркиваю: И в том и в этом случае, зенитка все равно нормально удаляется.

    Ошибка возникает такая:
    Код:
    =================================================
    System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
       в C73nDcVHkfNlG1HRmmb.RW57KCVWohHyXJ5krUt.ydxsYS7apyu(d19kQTbEvXhjHykyf8d , dICXoRXk7y7vkkUvR4v , Int16 , Boolean )
       в 12oB5s7LiQTBW7EtP2V.n61Vjl7SllEshhqKbYQ.kHlBq45JnvX(oXNPnT8Hh3UKJa6ZZy , SUsxEiF3QjXTYkAujT1 , B75N63VkDk3IVOC1G3Q , GPYJGEs07NMqUYFIJRN , Double& )
       в C73nDcVHkfNlG1HRmmb.RW57KCVWohHyXJ5krUt.msgShot(SUsxEiF3QjXTYkAujT1 )
       в H9k668FBsuD6ndx8Z0w.SUsxEiF3QjXTYkAujT1.P0colRfLS3u(SUsxEiF3QjXTYkAujT1 )
       в H9k668FBsuD6ndx8Z0w.SUsxEiF3QjXTYkAujT1.X7cYOeKBYyql3jthiEO0(Object )
       в H9k668FBsuD6ndx8Z0w.SUsxEiF3QjXTYkAujT1.Tm6oln8qMcy(d19kQTbEvXhjHykyf8d , Tujx1nWZkdCL5iBIZk , String , Point3d& , Vector3d& , Double , Double , b5X4V3c4exFtE9L5FjX , Double , bV5YXhceO4t4hjKDLyi )
       в iTQ2F3BmBVt9SCk6mLU.ZwK9QMBBEsmk1BR0vEh.cujSBu15Yef(Tujx1nWZkdCL5iBIZk , String )
       в ni37tVPHruIq9NlxXSS.U44P7gPWjvHAMLK3Rv5.pkis5BedngrRoylBJHRX(Object , Object , Object )
       в ni37tVPHruIq9NlxXSS.U44P7gPWjvHAMLK3Rv5.QkEsNixkSaq(Object )
       в PDEYCdwa2J4QMrF1lcD.d4vV2vwCQi0a584sPXx.JBeVQdP174(Object )
    =================================================
    Еще один вопрос Зенитка принадлежит к "AiGroundActor". А к чему принадлежит аэростат-лебедка этого типа: "Aeroanchored.Balloon_winch_GER1"? (это название из файла-миссии)
    Я это к тому спрашиваю, что тоже, как и зенитку, хотел бы его удалять по факту попадания в него. Как это сделать? Ведь такой код для аэростата тут уже явно не сработает:
    if (actor is AiGroundActor)
    {
    (actor as AiGroundActor).Destroy();
    }
    Нет в русском языке слова дешеГО. Есть слово дешеВО.

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

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

    Вот так всегда. Пропали все гуру на самом интересном месте.
    Алеее!! Люююди! Есть, кто живой?
    Нет в русском языке слова дешеГО. Есть слово дешеВО.

  21. #71

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

    Цитата Сообщение от SlavikSG Посмотреть сообщение
    Вот так всегда. Пропали все гуру на самом интересном месте.
    Алеее!! Люююди! Есть, кто живой?
    По поводу ошибки не совсем ясно, почему. Да и смысл удаления трупика сразу же от меня ускользает. Т.е. я в нее выстрелил, а она испарилась.

    По поводу баллона говорилось - их ты никак в скрипте не увидишь и ничего с ними не сделаешь. Выше, а так-же в темах Вопросы, Морской лев, Обсуждение миссий и т.д. этот момент подчеркивался неоднократно.

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

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

    Цитата Сообщение от Small_Bee Посмотреть сообщение
    По поводу ошибки не совсем ясно, почему. Да и смысл удаления трупика сразу же от меня ускользает. Т.е. я в нее выстрелил, а она испарилась...
    Да, конечно. Зенитка должна погореть, подымиться. Это без сомнений.
    Я поясню. Смысл не такой. Смысл в том, что начинаем удалять трупики, как только будет уничтожена шестая зенитка. Сразу все очищаем и ставим новые.

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

    Цитата Сообщение от Small_Bee Посмотреть сообщение
    ...По поводу баллона говорилось - их ты никак в скрипте не увидишь и ничего с ними не сделаешь. Выше, а так-же в темах Вопросы, Морской лев, Обсуждение миссий и т.д. этот момент подчеркивался неоднократно.
    Спасибо за пояснение. Я не заметил этого момента. Но тогда вопрос хотелось бы поставить несколько иначе. Какой объект, типа "Аэростат", можно было бы отслеживать в миссии? Уж больно хочется их заюзать. Возможно как-то обойти это ограничение? Без них как-то скучновато будет в мисси. А получается, что один раз поставил, их взорвали, и ничего с этим уже не поделаешь. Получается, что загрузить я их могу, а удалить нет.
    Нет в русском языке слова дешеГО. Есть слово дешеВО.

  23. #73

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

    Цитата Сообщение от SlavikSG Посмотреть сообщение
    Спасибо за пояснение. Я не заметил этого момента. Но тогда вопрос хотелось бы поставить несколько иначе. Какой объект, типа "Аэростат", можно было бы отслеживать в миссии? Уж больно хочется их заюзать. Возможно как-то обойти это ограничение? Без них как-то скучновато будет в мисси. А получается, что один раз поставил, их взорвали, и ничего с этим уже не поделаешь. Получается, что загрузить я их могу, а удалить нет.
    Скриптом - никак. Это печально, но факт. Сначала даже пушки нельзя было отслеживать, должны вроде добавить аналогичный функционал и к другим статикам, но когда именно, неизвестно.
    Обходной путь может быть в установке триггера на уничтожение наземки в районе. Но там надо учитывать несколько моментов. Казалось бы, поставь мотоцикл статический, сверху триггер и требование 100% уничтожения. Мотоцикл убили, триггер сработал. Ан нет. Есть баг, при котором при оценке кол-ва объектов триггер считает сам мотоцикл и те две физиономии, что в нем сидят, но при уничтожении - только мотоцикл, т.е. проценты будут - 33.3333- и триггер никогда не сработает. Это должно быть в след. патче поправлено. И второй момент - триггер, при оценке статиков что в его радиус попадают, используют не координаты, а т.н. сферу первичной коллизии (если не ошибаюсь) которой этот статик окружен. Таким образом, если поставить вышку высотой скажем метров 30, то любой триггер, который зайдет радиусом в радиус 30 метров от вышки (грубо), будет считать ее своей. Третий момент - триггеры не учитывают объекты с нейтральной армией. Т.е. домики ты таким образом тоже не отследишь (те которые в разделе Здания - у них нельзя выставить армию).

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

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

    Текс, хорошо. Это я все понял. Пусть тригер. Меня это устроит. Но! Я не пойму, как применить Destroy() к такому объекту, как "Aэростат". Как написать код уничтожению аэростата? Ведь такой код не пашет, применительно к нему:
    Код:
    if (actor is AiGroundActor)
       {
        (actor as AiGroundActor).Destroy();
       }
    Нет в русском языке слова дешеГО. Есть слово дешеВО.

  25. #75

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

    Цитата Сообщение от SlavikSG Посмотреть сообщение
    Текс, хорошо. Это я все понял. Пусть тригер. Меня это устроит. Но! Я не пойму, как применить Destroy() к такому объекту, как "Aэростат". Как написать код уничтожению аэростата? Ведь такой код не пашет, применительно к нему:
    Код:
    if (actor is AiGroundActor)
       {
        (actor as AiGroundActor).Destroy();
       }
    Конечно не работает, уничтожения аэростата не вызывает никаких методов в миссии, конечно нельзя применить Destroy() когда нету даже ссылки на объект. )))

Страница 3 из 7 ПерваяПервая 1234567 КрайняяКрайняя

Ваши права

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