Прошу помочь со скриптом для миссии http://www.sukhoi.ru/forum/showthrea...=1#post1607576
Проблема:
При отсутствии адекватного количеству ботов игроков на сервере, количество ботов увеличивается при загрузке скриптом новых суб-миссий, что со временем делает миссию неинтересной для игроков из-за большого количества ботов. Заранее сокращать количество ботов в миссии не хотелось бы, т.к. не известно будет на сервере 5 игроков или 50.
Некоторые идеи решения задачи:
Планировалось ли как-то решать эту проблему штатными средствами игры?
...зелёные горят.
----------------------
i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.
naryv,
Можно ли заставить экипаж прыгать с парашютом из самолета? Если нет, может быть, мы можем получить AiPerson.BailOut () в следующем патче?
Ну, можно, например, в зависимости от количества игроков на сервере загружать миссии с разным количеством ботов
Надо ставить ботам конечную точку маршрута - аэродром и посадка, тогда после выполнения задачи, они будут возвращаться на аэродром и пропадать. Если конечная точка в воздухе - они так и будут вокруг неё летать.
Да,всё так , 1 - латинская буква "I", 5 -латинская "V". Должно работать - выше строчка - это как раз имя группы, из игры.
Если повредить самолёт, они попрыгают из него. В ближайших патчах вряд-ли, потом- может быть, только зачем?
Don't happy, be worry
Люди не любят, когда боты продолжают летать в самолетах, которые были оставлены игроками. Однако, они также не любят, когда самолет исчезает в воздухе (.OnPlaceLeave() + AiAircraft.Destroy()). Было бы лучше, если бы удалось заставить экипаж покинуть самолет, когда последний игрок покидает его.
Есть ли какой-то тип повреждения, которые бы немедленно заставил экипажа выйти из самолета, но не было заметно внешне (т.е. без фейерверка из ниоткуда)?
+ 1 Это было бы элегантным решением. Часто покидают при повреждении двигателя. Топливо обрезать?
Вот можно перебратьhttp://forum.1cpublishing.eu/showthread.php?t=22184Код:part.NamedDamageTypes.AirbrakeDriveFailure part.NamedDamageTypes.AirbrakeHosePerforated part.NamedDamageTypes.AirbrakePistonFailure part.NamedDamageTypes.ChunkLargeDamage part.NamedDamageTypes.ChunkSmallDamage part.NamedDamageTypes.CockpitDamageFlag00 ... part.NamedDamageTypes.CockpitDamageFlag14 part.NamedDamageTypes.ControlsAileronsDisabled part.NamedDamageTypes.ControlsElevatorDisabled part.NamedDamageTypes.ControlsGenericKickdown part.NamedDamageTypes.ControlsRudderDisabled part.NamedDamageTypes.ElecBatteryFailure part.NamedDamageTypes.ElecGeneratorFailure part.NamedDamageTypes.ElecIlluminationFailure part.NamedDamageTypes.ElecMasterCompassFailure part.NamedDamageTypes.ElecPrimaryFailure part.NamedDamageTypes.ElecPriNavigationFailure part.NamedDamageTypes.ElecSecNavigationFailure part.NamedDamageTypes.ElecSecondaryFailure part.NamedDamageTypes.ElecTransceiverFailure part.NamedDamageTypes.ElecWeaponryFailure // Engine Damages Engine0 - Engine7 part.NamedDamageTypes.Eng0CarbControlsFailure part.NamedDamageTypes.Eng0CarbFailure part.NamedDamageTypes.Eng0CompressorFailure part.NamedDamageTypes.Eng0CompressorGovernorFailure part.NamedDamageTypes.Eng0CompressorSeizure part.NamedDamageTypes.Eng0CylinderHeadExtinguished part.NamedDamageTypes.Eng0CylinderHeadFire part.NamedDamageTypes.Eng0ExhaustHeadFailure part.NamedDamageTypes.Eng0FuelLinePerforated part.NamedDamageTypes.Eng0FuelPumpFailure part.NamedDamageTypes.Eng0FuelSecondariesFire part.NamedDamageTypes.Eng0GovernorFailure part.NamedDamageTypes.Eng0GovernorSeizure part.NamedDamageTypes.Eng0IntakeBurnt part.NamedDamageTypes.Eng0IntercoolerBurnt part.NamedDamageTypes.Eng0Magneto0Failure part.NamedDamageTypes.Eng0Magneto1Failure part.NamedDamageTypes.Eng0OilGasketLeak part.NamedDamageTypes.Eng0OilLineBroken part.NamedDamageTypes.Eng0OilPumpFailure part.NamedDamageTypes.Eng0OilRadiatorPerforated part.NamedDamageTypes.Eng0OilSecondariesExtinguished part.NamedDamageTypes.Eng0OilSecondariesFire part.NamedDamageTypes.Eng0OilTankPerforated part.NamedDamageTypes.Eng0Plug00Failure - part.NamedDamageTypes.Eng0Plug17Failure part.NamedDamageTypes.Eng0PropBlade1Broken - part.NamedDamageTypes.Eng0PropBlade4Broken part.NamedDamageTypes.Eng0PropControlBroken part.NamedDamageTypes.Eng0ThrottleControlBroken part.NamedDamageTypes.Eng0TotalFailure part.NamedDamageTypes.Eng0TotalSeizure part.NamedDamageTypes.Eng0TretiaryControlBroken part.NamedDamageTypes.Eng0WaterJacketBroken part.NamedDamageTypes.Eng0WaterLineBroken part.NamedDamageTypes.Eng0WaterPumpFailure part.NamedDamageTypes.Eng0WaterRadiatorPerforated part.NamedDamageTypes.Eng0WaterTankPerforated part.NamedDamageTypes.EngineLargeDamage part.NamedDamageTypes.EngineSmallDamage part.NamedDamageTypes.FuelPumpFailure // Tanks 0 - 7 part.NamedDamageTypes.FuelTank0Exploded part.NamedDamageTypes.FuelTank0Fire part.NamedDamageTypes.FuelTank0HosePerforated part.NamedDamageTypes.FuelTank0LargeLeak part.NamedDamageTypes.FuelTank0PumpFailure part.NamedDamageTypes.FuelTank0SmallLeak part.NamedDamageTypes.FuelTank0TinyLeak part.NamedDamageTypes.HydraulicsEmergencyFailure part.NamedDamageTypes.HydraulicsPistonOpened part.NamedDamageTypes.HydraulicsPrimaryHosePerforated part.NamedDamageTypes.HydraulicsPumpFailure part.NamedDamageTypes.HydraulicsTankPerforated part.NamedDamageTypes.LandingFlapsDriveFailure part.NamedDamageTypes.LandingFlapsHosePerforated part.NamedDamageTypes.LandingFlapsKinematicFailure1 part.NamedDamageTypes.LandingFlapsKinematicFailure2 part.NamedDamageTypes.LandingFlapsPistonFailure1 part.NamedDamageTypes.LandingFlapsPistonFailure2 part.NamedDamageTypes.LifeKeeperPartLargeDamage part.NamedDamageTypes.LifeKeeperPartSmallDamage // Weapondamages 00 - 11 part.NamedDamageTypes.Machinegun00BeltBroken part.NamedDamageTypes.Machinegun00Charged part.NamedDamageTypes.Machinegun00Failure part.NamedDamageTypes.Machinegun00Jammed part.NamedDamageTypes.Machinegun00LineDamaged part.NamedDamageTypes.PartLargeDamage part.NamedDamageTypes.PartSmallDamage part.NamedDamageTypes.PneumaticsCompressorFailure part.NamedDamageTypes.PneumaticsPrimaryContainerPerforated part.NamedDamageTypes.PneumaticsPrimaryHosePerforated part.NamedDamageTypes.PneumaticsSecondaryContainerPerforated part.NamedDamageTypes.PneumaticsSecondaryHosePerforated part.NamedDamageTypes.UndercarriageDownLockFailureC part.NamedDamageTypes.UndercarriageDownLockFailureL part.NamedDamageTypes.UndercarriageDownLockFailureR part.NamedDamageTypes.UndercarriageDriveDamaged part.NamedDamageTypes.UndercarriageHosePerforated part.NamedDamageTypes.UndercarriageKinematicFailureC part.NamedDamageTypes.UndercarriageKinematicFailureL part.NamedDamageTypes.UndercarriageKinematicFailureR part.NamedDamageTypes.UndercarriageShockFailureC part.NamedDamageTypes.UndercarriageShockFailureL part.NamedDamageTypes.UndercarriageShockFailureR part.NamedDamageTypes.UndercarriageUpLockFailureC part.NamedDamageTypes.UndercarriageUpLockFailureL part.NamedDamageTypes.UndercarriageUpLockFailureR part.NamedDamageTypes.WeaponLargeDamage part.NamedDamageTypes.WeaponSmallDamage part.NamedDamageTypes.WheelBrakesFailureL part.NamedDamageTypes.WheelBrakesFailureR part.NamedDamageTypes.WheelBrakesHosePerforated part.NamedDamageTypes.WheelBrakesTotalFailure part.NamedDamageTypes.MaxValue part.NamedDamageTypes.Nil
...зелёные горят.
----------------------
i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.
Ломай ему все управление - элероны высоту и направление.. Тыц Тем более внешне никак не заметно.
Если он оттриммирован, то дальше полетит или прыгнет? Тушка долго может лететь, наверное. Может рули дать на ввод в штопор на минуту перед тем как их вырубить? или нет таких команд?
--- Добавлено ---
А как убирать с земли самолеты, которые сели на вынужденную, разбились не долетев до посадки? Их много скапливается за 3-4 часа на сервере: зенитки-то работают, даже если игроков нет.
...зелёные горят.
----------------------
i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.
naryv,
А может подскажешь как добраться до maddox.game.GameServerDef?
В смысле подключить унаследованный класс. Желательно - к дедикейту.
Уважаемый naryv, есть очень большая просьба. Нельзя ли сделать так, чтобы игра игнорировала знаки "=" в файлах ini ?
То есть сейчас имеем файл campaings.ini:
"[Main]
campaign_pk
campaign_gb
campaign_de
[campaign_gb]
folder campaign_gb
title Cliffs Of Dover
image Poster.bmp
[campaign_de]
folder campaign_de
title Adler Angriff
image Poster.bmp
[campaign_pk]
folder campaign_pk
title День Орла
image Poster.bmp
"
А надо чтобы можно было написать так:
"[Main]
campaign_pk=
campaign_gb
campaign_de
[campaign_gb]
folder campaign_gb
title Cliffs Of Dover
image Poster.bmp
[campaign_de]
folder campaign_de
title Adler Angriff
image Poster.bmp
[campaign_pk=]
folder = campaign_pk
title = День Орла
image = Poster.bmp
"
Прошу уточнить:
1я миссия загрузится через 10 минут с начала хост-миссии и будет повторяться с момента своей 1й загрузки каждые 60 мин.Код:public class Mission : AMission { public override void OnTickGame() { if (Time.tickCounter() % 108000 == 18000) // 60-10 { GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/128BoF/128BoFsmGroundv1_0.mis"); GamePlay.gpHUDLogCenter("Protect friendly shipping in the channel near France!"); } if (Time.tickCounter() % 81000 == 63000) // 45-35 { GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/128BoF/128BoFsmBombersv1_0.mis"); GamePlay.gpHUDLogCenter("Intel: Enemy bombers are heading to blue airfields!"); } if(Time.tickCounter() % 81000 == 81000) // 45-45 { GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/128BoF/128BoFsmBombersv1_0a.mis"); GamePlay.gpHUDLogCenter("Intel: Enemy bombers are heading to red airfields in France!"); } } }
2я миссия загрузится через 35 минут с начала хост-миссии (и будет повторяться с момента своей 1й загрузки каждые 45 мин.
3я миссия загрузится через 45 минут с начала хост-миссии и будет повторяться с момента своей 1й загрузки каждые 45 мин.
Всё так или временные циклы по-другому отсчитываются?
upd. Если увеличить радиус airport.cpp до 10000, будет ли это убирать обломки с земли/самолеты на вынужденной во всем радиусе действия? Чем грозит такое увеличение радиуса? Каков верхний предел? 50000, 100000 будет работать?
Крайний раз редактировалось -atas-; 27.04.2011 в 15:33.
...зелёные горят.
----------------------
i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.
Ну, наверное оптимальный вариант управление блокировать, как Small_Bee написал.
можно так :
через 5 секунд после крашлэндинга уничтожится.Код:public override void OnAircraftCrashLanded(int missionNumber, string shortName, AiAircraft aircraft) { base.OnAircraftCrashLanded(missionNumber, shortName, aircraft); Timeout(5, () => { aircraft.Destroy(); }); }
Пока не могу, не знаю, постараюсь после патча выложить dll с доступом к GameSingleDef , и позже узнать как к серверу подключиться.
если честно не понял, зачем так надо.
первые два правильно, 3-й нет, "%" это остаток от деления, х % 81000 == 81000 никогда не будет, если ничего не путаю, надо так : f(Time.tickCounter() % 81000 == 80999)
airport.cpp не убирает самолёты и обломки, он должен машинки к севшим самолётам подвозить, но не уверен что работает, это очень старый скрипт, как реликт скорее всего остался.
Don't happy, be worry
Для оффлайн кампаний. Создаем свою кампанию. Устанавливается через инсталятор. ВСЕ инсталяторы, что я пробовал при редактировании ini-файлов сами ставят знак "=".
То есть если я в инсталяторе пишу Title ля-ля-ля, то при установке получаю Title = ля-ля-ля. А игра знаки "=" не понимает, приходится править потом ini-файл вручную.
Пр удалении кампании та же ситуация. Деинсталятор не находит в ini-файле ключей, соответственно ничего не удаляет. Опять приходится все чистить ручками. Если бы игра игнорировала знак "=", то любую кампанию можно было бы легко как установить, так и удалить.
С Уважением!
Несколько вопросов:
1) Каким образом можно "перекрасить" филд, т.е. отдать его от синих красным, например, по срабатыванию триггера?
Если делать это загрузкой новой подмиссии, в ней должны присутствовать все старые точки спауна или только одна точка спуна, которая меняется с синего на красный? Исчезнет ли старая синяя точка спауна с аэродрома, если туда погрузится красная?
2) Старая линия фронта тоже исчезнет, если загрузить новую линию фронта в подмиссии?
3) Как видоизменить код, чтобы надписи в момент подгрузки под-миссий были разные для синей и для красной стороны?
4) Для задания целей в миссии очень хочется предоставить игрокам шорт-кей, показывающий текущие цели, т.е.:Код:// loads my sub-missions public override void OnTickGame() { if (Time.tickCounter() % 72000 == 18000) // 40-10 { GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/128BoF/128BoFsmGroundv1_0.mis"); GamePlay.gpHUDLogCenter("Protect friendly shipping in the channel near France!"); } if (Time.tickCounter() % 72000 == 71999) // 40-40 { GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/128BoF/128BoFsmBombersv1_0.mis"); GamePlay.gpHUDLogCenter("Intel: Enemy bombers are heading to blue airfields!"); } if (Time.tickCounter() % 72000 == 45000) // 40-25 { GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/128BoF/128BoFsmBombersv1_0a.mis"); GamePlay.gpHUDLogCenter("Intel: Enemy bombers are heading to red airfields in France!"); }
- в чат игры каждые 10 минут пишем: "Press Shift-S to see current mission objectives! Нажмите Shift-S, чтобы посмотреть текущие цели миссии!" (Shift-S не занят по умолчанию по-моему?)
- при нажатии клиентом Shift-S выводим на экран последнюю надпись из предыдущего пункта (3), причем разную для разных сторон
Какой код добавить в скрипт, чтобы это происходило?
Текущая миссия и скрипт здесь http://www.sukhoi.ru/forum/showthrea...t=68112&page=2
Хочется уже дать игрокам осмысленные задачи, чтобы они могли влиять на результаты миссий на сервере.
...зелёные горят.
----------------------
i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.
Господа, а можно ли сделать так чтоб не выдавать самолет игроку, пока он не приземлился или его не сбили (разбился), ну и плюс удаление ероплана без игрока (в случае выхода с сервера, удачной или вынужденной посадки) и только после этого новый ероплан
Понятно. Пока про "=" не готов ответить, пока наверное стоит просто предложить игрокам вставлять секцию в инишник, без инсталятора.
Не успею, после релиза скорее.
не готов точно ответить, можно попробовать подгружать миссию с одной точкой линии фронта на интересующем аэродроме.
смотреть армию игрока и выдавать ему соответствующее сообщение
перехватывать кнопки, не получится, можно вот так, например :
при занятии самолёта игроком - ему напишется задание в зависимости от стороны и типа самолёта - бомбер/нет - это первая функция, и после взлёта - по той же логике - вторая. Можно с таймаутом сообщение показывать.Код:public override void OnPlaceEnter(Player player, AiActor actor, int placeIndex) { base.OnPlaceEnter(player, actor, placeIndex); AiAircraft aircraft = actor as AiAircraft; if (aircraft != null) switch (aircraft.Army()) { case 1: if (aircraft.Type() == AircraftType.Bomber) { GamePlay.gpHUDLogCenter(new Player[] {player},"Red Bomber, Bomb it all, hitler caput"); } else { GamePlay.gpHUDLogCenter(new Player[] { player }, "Red Fighter, fight them all"); } break; case 2: if (aircraft.Type() == AircraftType.Bomber) { GamePlay.gpHUDLogCenter(new Player[] { player }, "Das bomber!"); } else { GamePlay.gpHUDLogCenter(new Player[] { player }, "Das jager!"); } break; } } public override void OnAircraftTookOff(int missionNumber, string shortName, AiAircraft aircraft) { base.OnAircraftTookOff(missionNumber, shortName, aircraft); if (GamePlay.gpPlayer().Place() != aircraft) return; switch (aircraft.Army()) { case 1: if (aircraft.Type() == AircraftType.Bomber) { GamePlay.gpHUDLogCenter(new Player[] { GamePlay.gpPlayer() }, "Red Bomber, Bomb it all, hitler caput"); } else { GamePlay.gpHUDLogCenter(new Player[] { GamePlay.gpPlayer() }, "Red Fighter, fight them all"); } break; case 2: if (aircraft.Type() == AircraftType.Bomber) { GamePlay.gpHUDLogCenter(new Player[] { GamePlay.gpPlayer() }, "Das bomber!"); } else { GamePlay.gpHUDLogCenter(new Player[] { GamePlay.gpPlayer() }, "Das jager!"); } break; } }
Don't happy, be worry
Тут в том проблема, что даже если так сделать, обратно вернуть никак не получится... Старый флажок то никуда не денется.
Вот и еще одно пожелание нарисовалось
Было бы чудесно, если бы флажки тоже попали в отслеживаемую статику, а еще лучше, что бы их можно было прикрепить к какой-ни-будь технике/кораблику.
Спасибо за ответы.
В Арма2 при заходе на сервер с миссией Warfare (битва за ресурсы) клиент сразу получает кнопку вызова меню (с клавиатуры), которого в самой игре нет, т.е. она назначена в миссии. Кнопка вызывает командное меню, по которому идет навигация кнопками 1-10 (как у нас переговоры). Это меню строительства объектов, управления ресурсами, голосования за командира, выбора целей, то есть всего необходимого в режиме "битва за ресурсы". Всё это есть в миссии, моды ставить не нужно. Как планируется реализовать режим "битва за ресурсы", анонсированный Олегом, если миссия не может перехватывать нажатия клавиатуры?
...зелёные горят.
----------------------
i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.
Коммюнити очень маленькое + моды не все будут ставить = разделение онлайна. Такая библиотека должна входить в стим-версию имхо.
Как онлайн-миссию тестить прямо из редактора? Много времени занимает бегание по меню, чтобы сервер стартонуть (((
Крайняя бета вылетает при попытке разместить объект "аэродром". Пришлось откатиться на Стим.
Покрытие аэродрома как-то выбирается? Один раз аэродром отрендерился с аэродромной травкой, другой раз просто поле с пшеницей ) Бетонку как выбрать?
Как можно объекты сгруппировать и группу сохранить в файл? Объект аэродром в файл не сохраняется кстати.
--- Добавлено ---
Подскажите, пожалуйста, при размещении объекта "аэродром" поверх зашитого в карту аэродрома, при спауне на стоянках в онлайне будут использованы аэродромные пункты аэродрома карты или вновь созданного?
Возможен ли "старт на стоянке", если не создавать аэродромные пункты, а просто поставить аэродром?
...зелёные горят.
----------------------
i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.
Нужен прямой доступ ко всем объектам, с возможностью в любое время узнать его состояние или уничтожить.
В идеале - просто добавить объект и подключиться к событиям произвольных объектов.
Через подгрузку миссии вариант не нравится тем, что подгружается и скрипт, и из старой миссии объекты новой недоступны, и из новой объекты старой.
Нужен глобальный класс битвы, с доступом к любым объектам и с доступом из него в любой скрипт загруженной миссии и с обратным доступом.
И не только к объектам, но и к игрокам (онлайн).
Возможно, это решится когда удастся задействовать GameServerDef.
В любом случае, скрипты, не поддающиеся отладке - это не тот инструмент, которым можно сделать серьёзный проект (можно, но геморройно)
Имхо, вся основная логика все равно уйдет в собственную реализацию ABattle, а в скриптах заложены будут базовые действия, необходимые для самой миссии, не более. Насчет недоступности объектов - присвой IsMissionListener значение меньше нуля - будет слушать все миссии. Событие вызовется и передаст короткое имя и номер миссии, инициировавшей событие. Правильно получать полные имена акторов для поиска через GamePlay можно, посмотрев на стат. класс ActorName.
При невозможности запуска под отладкой вот таких вот дополнений, в схожей задаче делал свою консольку, которая эмулировала "жизнь" на сервере, и спокойно отлаживался.
Каким скриптом можно уничтожить всех акторов в миссии перед ее перезагрузкой (и ручной и плановой)?
Какие варианты запуска такого скрипта существуют? Можно ли запускать из командной строки сервера, из консоли игры, или только основным скриптом миссии по времени?
Вопрос неоднократно задавался на форуме 1С владельцами серверов, также связан вот с этим багом http://www.sukhoi.ru/forum/showthrea...=1#post1610136
Невозможно отлаживать онлайн-миссии в полном редакторе если в них находятся акторы из предыдущей миссии, а выделенные сервера просто виснут при перезагрузке.
...зелёные горят.
----------------------
i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.