Сообщение от
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.
Непонятки эти, происходящие в событиях мисси, меня сильно напрягают. Что при удалении объекта, нужно делать задержку, что при его создании считывать атрибуты опять же нужно с задержкой. Все это как-то сумбурно...