На сервере Repka №1 возникла проблема: бомбардировщики после посадки на аэродроме очень долго не исчезают (или часто виден экипаж без самолета), размер миссии постоянно растет, и время ее загрузки вырастает до неприемлемых 2-3 минут. Также через 3-4 часа работы возникают микрофризы, лаги, фпс падает (см. http://www.sukhoi.ru/forum/showthrea...=1#post1619325 )
Скрипт прекрасно уничтожает ботов в покинутых самолетах, но не уничтожает успешно севших на аэродромах. Также есть сомнения, что работает с самолетами на вынужденной (наблюдал вращающийся на брюхе Ю-88). Внизу часть кода выделена красным.
Как изменить скрипт, чтобы он уничтожал и приземлившиеся самолеты через 5 минут?Код:// 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); } ); } }
Аналогичная проблема существует так же с танкерами, танками, дымами.
Можно было бы для танкеров, танков и дымов использовать аналогичный скрипт(см. ниже), но исполняемый только минут через 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(); } } } }




Ответить с цитированием