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

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

Тема: Вопросы.

Древовидный режим

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

    Re: Вопросы.

    На сервере Repka №1 возникла проблема: бомбардировщики после посадки на аэродроме очень долго не исчезают (или часто виден экипаж без самолета), размер миссии постоянно растет, и время ее загрузки вырастает до неприемлемых 2-3 минут. Также через 3-4 часа работы возникают микрофризы, лаги, фпс падает (см. http://www.sukhoi.ru/forum/showthrea...=1#post1619325 )

    Скрипт прекрасно уничтожает ботов в покинутых самолетах, но не уничтожает успешно севших на аэродромах. Также есть сомнения, что работает с самолетами на вынужденной (наблюдал вращающийся на брюхе Ю-88). Внизу часть кода выделена красным.

    Код:
     // v.1_17_00. bot-destroying script based on one by oreva
    
    using System;
    using maddox.game;
    using maddox.game.world;
    using System.Collections.Generic;
    
    public class Mission : AMission
    {
     
    // loading sub-missions
    public override void OnTickGame()
    {
        if (Time.tickCounter() % 216000 == 108000) // 216000=120 min repeat. 108000=60 min delay. 
        {
            GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small01.mis");
        }
    
        if (Time.tickCounter() % 216000 == 215999) // 216000=120 min repeat. 215999=120 min delay. 
        {
            GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small02.mis");
        }
    
        /////////////////////////////////////////////////////////////////////////////////////
    
         if (Time.tickCounter() % 135000 == 9000) // 135000=75 min repeat. 9000=5 min delay. 
      {
          GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air01.mis");
          // GamePlay.gpHUDLogCenter("mis1 loaded!");
    
          double initTime = 0.0;
          Timeout(initTime += 600, () =>
          {
              GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E3!");
          });
          Timeout(initTime += 300, () =>
          {
              GamePlay.gpHUDLogCenter("Attention! Help is needed at D4!");
          });
    
       }
    
         if (Time.tickCounter() % 135000 == 54000) //  ; 135000=75 min repeat, 54000 - 30 min delay. 
        {
          GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_ground01.mis");
          // GamePlay.gpHUDLogCenter("mis2 loaded"); 
    
          double initTime = 0.0;
          Timeout(initTime += 600, () =>
           {
               GamePlay.gpHUDLogCenter("Attention! Cover your shipping at C4!");
           });
                
          Timeout(initTime += 300, () =>
             {
               GamePlay.gpHUDLogCenter("Attention! All airgroups please proceed to C4!");
             });
        }
    
         if (Time.tickCounter() % 135000 == 99000) // 135000 == 99000 = 75 min repeat, 55 min delay 
           {
               GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air02.mis");
               // GamePlay.gpHUDLogCenter("mis3 loaded!");
    
               double initTime = 0.0;
               Timeout(initTime += 600, () =>
               {
                   GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E2!");
               });
               Timeout(initTime += 300, () =>
               {
                   GamePlay.gpHUDLogCenter("Attention! Friendly aircrafts are under attack at D2!");
               });
           }
    }
    
    // destroys aircraft abandoned by a player. script by oreva
        private bool isAiControlledPlane (AiAircraft aircraft) 
        {
            if (aircraft == null) 
            { 
                return false;
            }
    
            Player [] players = GamePlay.gpRemotePlayers ();
            foreach (Player p in players) 
            {    
                if (p != null && (p.Place () is AiAircraft) && (p.Place () as AiAircraft) == aircraft)
                { 
                    return false;
                }
            }
    
            return true;
        }
    
        private void destroyPlane (AiAircraft aircraft) {
            if (aircraft != null) { 
                aircraft.Destroy ();
            }
        }
    
        private void explodeFuelTank (AiAircraft aircraft) 
        {
            if (aircraft != null) 
            { 
                aircraft.hitNamed (part.NamedDamageTypes.FuelTank0Exploded);
            }
        }
    
        private void destroyAiControlledPlane (AiAircraft aircraft) {
            if (isAiControlledPlane (aircraft)) {
                destroyPlane (aircraft);
            }
        }
    
        private void damageAiControlledPlane (AiActor actor) {
            if (actor == null || !(actor is AiAircraft)) { 
                return;
            }
    
            AiAircraft aircraft = (actor as AiAircraft);
    
            if (!isAiControlledPlane (aircraft)) {
                return;
            }
    
            if (aircraft == null) { 
                return;
            }
    
            aircraft.hitNamed (part.NamedDamageTypes.ControlsElevatorDisabled);
            aircraft.hitNamed (part.NamedDamageTypes.ControlsAileronsDisabled);
            aircraft.hitNamed (part.NamedDamageTypes.ControlsRudderDisabled);
            aircraft.hitNamed (part.NamedDamageTypes.FuelPumpFailure);
            aircraft.hitNamed (part.NamedDamageTypes.Eng0TotalFailure);
            aircraft.hitNamed (part.NamedDamageTypes.Eng1TotalFailure);
    
            /***Timeout (240, () =>
                    {explodeFuelTank (aircraft);}
                );
             * ***/
    
            Timeout (300, () =>
                    {destroyPlane (aircraft);}
                );
        }
    
    //////////////////////////////////////////////////////////////////////////////////////////////////
    
        public override void OnPlaceLeave (Player player, AiActor actor, int placeIndex) 
        {
            base.OnPlaceLeave (player, actor, placeIndex);
            Timeout (1, () =>
                    {damageAiControlledPlane (actor);}
                );
        }
    
        public override void OnAircraftCrashLanded (int missionNumber, string shortName, AiAircraft aircraft) 
        {
            base.OnAircraftCrashLanded (missionNumber, shortName, aircraft);
            Timeout (300, () =>
                { destroyPlane(aircraft); }
                );
        }
        public override void OnAircraftLanded (int missionNumber, string shortName, AiAircraft aircraft) 
        {
            base.OnAircraftLanded(missionNumber, shortName, aircraft);
            Timeout(300, () =>
                { destroyPlane(aircraft); }
                );
        }
    
    }
    Как изменить скрипт, чтобы он уничтожал и приземлившиеся самолеты через 5 минут?

    Аналогичная проблема существует так же с танкерами, танками, дымами.
    Можно было бы для танкеров, танков и дымов использовать аналогичный скрипт(см. ниже), но исполняемый только минут через 50 после подгрузки подмиссии? Как он будет выглядеть? Можно его включить в основной скрипт или придется плодить скрипты для каждой подмиссии (чего не хотелось бы)?

    Код:
    foreach (int army in GamePlay.gpArmies())
                {
                    foreach (AiAirGroup group in GamePlay.gpAirGroups(army))
                    {
                        if (ActorName.MissionNumber(group.Name()).Equals(MissionNumber))
                        {
                            AiActor[] members = group.GetItems();
                            for (int i = members.Length - 1; i > -1; i--)
                            {
                                (members[i] as AiAircraft).Destroy();
                            }
                        }
                    }
                    foreach (AiGroundGroup group in GamePlay.gpGroundGroups(army))
                    {
                        if (ActorName.MissionNumber(group.Name()).Equals(MissionNumber))
                        {
                            AiActor[] members = group.GetItems();
                            for (int i = members.Length - 1; i > -1; i--)
                            {
                                (members[i] as AiGroundActor).Destroy();
                            }
                        }
                    }
                }
    Спасибо за помощь.
    Крайний раз редактировалось -atas-; 14.05.2011 в 11:59.
    ...зелёные горят.
    ----------------------

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

Ваши права

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