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

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

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

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

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

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

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

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

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

    Цитата Сообщение от Small_Bee Посмотреть сообщение
    Конечно не работает, уничтожения аэростата не вызывает никаких методов в миссии, конечно нельзя применить Destroy() когда нету даже ссылки на объект. )))
    Я не был бы так настойчив, если бы не был уверен в обратном. Проверял это дело раньше. Проверил и еще раз. Событие на убиение аэростата происходит! Гружу одной миссией шесть синих зениток в ряд. Другой миссией гружу напротив два красных аэростата. И пишу такой код:
    Код:
    public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
    {
     base.OnActorDead(missionNumber, shortName, actor, damages);
    
     Sss("Был подбит аэростат армии :" + actor.Army().ToString());
     Sss("Хеш подбитого аэростата :" + actor.GetHashCode().ToString());
     Sss("Имя подбитого аэростата :" + actor.Name());    
    }
    И в логе сервера пишется это:
    Server: Был подбит аэростат армии :1
    Server: Хеш подбитого аэростата :60779388
    Server: Имя подбитого аэростата :NONAME
    Server: Был подбит аэростат армии :1
    Server: Хеш подбитого аэростата :2922015
    Server: Имя подбитого аэростата :NONAME


    Определяется и "Хеш" и "Армия". А вот остальное ничего не пашет. В том числе и имя, заданное в файле-миссии, не определяется. А вот само событие срабатывает четко и неизменно.

    Ладно, наверное с этим пока точно ничего не поделаешь. Буду спавнить аэростаты просто в начале миссии. Где-нибудь не рядом с зенитками, а подальше. Так, чтобы глаз радовали, и если подобьют, чтобы трупики их (не убирающиеся) не сильно мешались.

    Имею еще один каверзный вопрос:
    Есть событие появления в миссии объектов. Название ему OnActorCreated. Естественно, срабатывает оно на все подряд. При этом срабатывании я начинаю заполнять, ранее созданные два словаря: _Zenitki_Red_ и _Zenitki_Blue_. Заполняю я их только нужными мне объектами. А именно зенитками. Все остальное игнорируется. Пишу такой код:

    Код:
    public override void OnActorCreated(int missionNumber, string shortName, AiActor actor) 
    {
       base.OnActorCreated(missionNumber, shortName, actor); 
    
       Timeout(1, () =>
          {
           //Определяем имя загружаемого объекта
           Zena = (actor as AiCart).InternalTypeName().ToString();
    
           //Если миссия не является стартово-загрузочной и этот объект принадлежит
           // армии красных и имя ему "bob:Artillery.Krupp_L2H43_Protze_Flak38", то...
           if (missionNumber != 0 && actor.Army() == 1 && Zena == "bob:Artillery.Krupp_L2H43_Protze_Flak38")
              {
               _Zenitki_Red_.Add(shortName, missionNumber); //добавляем в справочник красных очередную новую запись
              }
    
           //Если миссия не является стартово-загрузочной и этот объект принадлежит
           // армии синих и имя ему "bob:Artillery.Krupp_L2H43_Protze_Flak38", то...
           if (missionNumber != 0 && actor.Army() == 2 && Zena == "bob:Artillery.Krupp_L2H43_Protze_Flak38")
              {
               _Zenitki_Blue_.Add(shortName, missionNumber); //добавляем в справочник синих очередную новую запись
              }
          });
    }
    Опять же, как и несколько постов ранее, получается, что нужно нужно ОБЯЗАТЕЛЬНО вводить задержку Timeout. Если ее не вводить, то все отлично пашет и так, но в логе сервера неизменно возникает ошибка, как только я пытаюсь выполнить эту часть кода: Zena = (actor as AiCart).InternalTypeName().ToString();. Повторюсь... Это все замечательно пашет и без задержки Timeout.

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

  3. #3

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

    Цитата Сообщение от SlavikSG Посмотреть сообщение
    Server: Имя подбитого аэростата :NONAME
    Да, немного ошибся, но сути не меняет. Выделенное - Ключевой момент. К какому классу относятся эти нонеймы или какие интерфейсы реализовывают я так и не понял. Т.е. имя конечно есть, но оно то ли обфускатором обработано, то ли еще как, чего с ними делать, не представляю. Как только не крутил. Поэтому такие нонеймы пропускаю. Собственно почему и сказал, что метод не вызывается - тушение нонеймов это у меня в первую очередь. )

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

    Цитата Сообщение от SlavikSG Посмотреть сообщение
    Опять же, как и несколько постов ранее, получается, что нужно нужно ОБЯЗАТЕЛЬНО вводить задержку Timeout. Если ее не вводить, то все отлично пашет и так, но в логе сервера неизменно возникает ошибка, как только я пытаюсь выполнить эту часть кода: Zena = (actor as AiCart).InternalTypeName().ToString();. Повторюсь... Это все замечательно пашет и без задержки Timeout.

    Непонятки эти, происходящие в событиях мисси, меня сильно напрягают. Что при удалении объекта, нужно делать задержку, что при его создании считывать атрибуты опять же нужно с задержкой. Все это как-то сумбурно...
    Мы на самом деле не знаем, что конкретно делает дестрой. И получаем мы интерфейс, а истинный класс, который за ним скрыт и что как он делает мы не знаем, и согласно принципам ООП и не должны. )
    Вполне возможно, что на момент вызова метода какие-то поля еще не инициализированы.

    ЫЫЫ слушай у меня тут эврика сияет, а DamagerScore там заполнен? И можно ли Pos() получить? И глянь плиз где именно Army() определен, я сам сейчас не посмотрю, а очень хочется )
    Крайний раз редактировалось Small_Bee; 02.12.2011 в 14:43.

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

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

    Цитата Сообщение от Small_Bee Посмотреть сообщение
    ...ЫЫЫ слушай у меня тут эврика сияет, а DamagerScore там заполнен? И можно ли Pos() получить? И глянь плиз где именно Army() определен, я сам сейчас не посмотрю, а очень хочется )
    С этим параметром я еще не работал, а так, вообще-то, там что-то заполняется.

    Чисто наобум глянул. Увидел это:
    damages.Count равен: 1
    ddamages[0].initiator.Actor.Name() равен: 2:Static2
    damages[0].initiator.Person.Name() равен: NONAME
    ...ну, там много чего еще есть. Только больше, мне кажется, там инфы не "кого" убили, а "кто" убил. В любом случае, надеюсь на твою гениальность. А вдруг, что-то можно родить? В смысле убить трупик...

    Цитата Сообщение от naryv Посмотреть сообщение
    ...соответственно, игра пытается довернуть ствол в "мёртвое состояние " а объект скриптом уже задестроен - вот NullReferenceException и выскакивает.
    Ясно. Я догадывался... Это было видно еще по тому, как "хеш" объекта меняется. Ну, мне главное, чтобы я был уверен, что скрипт пишу правильно и чтобы ошибка в логе сервера не приводила к утечке памяти или к крушению сервака. А в остальном, на это можно и забить.

    P.S.
    Давай уже выходи из отпуска скорее. Летом догуляешь. Кто ж в такое время отдыхает? Погода - жесть!!! Ггг!
    Нет в русском языке слова дешеГО. Есть слово дешеВО.

  5. #5

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

    Цитата Сообщение от SlavikSG Посмотреть сообщение
    С этим параметром я еще не работал, а так, вообще-то, там что-то заполняется.

    Чисто наобум глянул. Увидел это:
    damages.Count равен: 1
    ddamages[0].initiator.Actor.Name() равен: 2:Static2
    damages[0].initiator.Person.Name() равен: NONAME
    ...ну, там много чего еще есть. Только больше, мне кажется, там инфы не "кого" убили, а "кто" убил. В любом случае, надеюсь на твою гениальность. А вдруг, что-то можно родить? В смысле убить трупик...
    Это понятно, что там тот, кто убил. Значит уже хорошо, бобрам статики считать можно... Осталось каким то образом разрулить, кого убили. Если можно получить позицию через Pos(), то в принципе, зная наперед, что мы туда поставили, можно определится, кого убили. Примерно так.

Ваши права

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