Вот так в игре записывается -"BoB_LW_JG53_I" - "I" латинская
Вид для печати
Прошу помочь со скриптом для миссии http://www.sukhoi.ru/forum/showthrea...=1#post1607576
Проблема:
При отсутствии адекватного количеству ботов игроков на сервере, количество ботов увеличивается при загрузке скриптом новых суб-миссий, что со временем делает миссию неинтересной для игроков из-за большого количества ботов. Заранее сокращать количество ботов в миссии не хотелось бы, т.к. не известно будет на сервере 5 игроков или 50.
Некоторые идеи решения задачи:
Планировалось ли как-то решать эту проблему штатными средствами игры?
naryv,
Можно ли заставить экипаж прыгать с парашютом из самолета? Если нет, может быть, мы можем получить AiPerson.BailOut () в следующем патче?
Ну, можно, например, в зависимости от количества игроков на сервере загружать миссии с разным количеством ботов
Надо ставить ботам конечную точку маршрута - аэродром и посадка, тогда после выполнения задачи, они будут возвращаться на аэродром и пропадать. Если конечная точка в воздухе - они так и будут вокруг неё летать.
Да,всё так , 1 - латинская буква "I", 5 -латинская "V". Должно работать - выше строчка - это как раз имя группы, из игры.
Если повредить самолёт, они попрыгают из него. В ближайших патчах вряд-ли, потом- может быть, только зачем?
Люди не любят, когда боты продолжают летать в самолетах, которые были оставлены игроками. Однако, они также не любят, когда самолет исчезает в воздухе (.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
Ломай ему все управление - элероны высоту и направление.. Тыц Тем более внешне никак не заметно.
Если он оттриммирован, то дальше полетит или прыгнет? Тушка долго может лететь, наверное. Может рули дать на ввод в штопор на минуту перед тем как их вырубить? или нет таких команд?
--- Добавлено ---
А как убирать с земли самолеты, которые сели на вынужденную, разбились не долетев до посадки? Их много скапливается за 3-4 часа на сервере: зенитки-то работают, даже если игроков нет.
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 будет работать?
Ну, наверное оптимальный вариант управление блокировать, как 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 не убирает самолёты и обломки, он должен машинки к севшим самолётам подвозить, но не уверен что работает, это очень старый скрипт, как реликт скорее всего остался.
Для оффлайн кампаний. Создаем свою кампанию. Устанавливается через инсталятор. ВСЕ инсталяторы, что я пробовал при редактировании 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
Хочется уже дать игрокам осмысленные задачи, чтобы они могли влиять на результаты миссий на сервере.
Господа, а можно ли сделать так чтоб не выдавать самолет игроку, пока он не приземлился или его не сбили (разбился), ну и плюс удаление ероплана без игрока (в случае выхода с сервера, удачной или вынужденной посадки) и только после этого новый ероплан
Понятно. Пока про "=" не готов ответить, пока наверное стоит просто предложить игрокам вставлять секцию в инишник, без инсталятора.
Не успею, после релиза скорее.
не готов точно ответить, можно попробовать подгружать миссию с одной точкой линии фронта на интересующем аэродроме.
смотреть армию игрока и выдавать ему соответствующее сообщение
перехватывать кнопки, не получится, можно вот так, например :
при занятии самолёта игроком - ему напишется задание в зависимости от стороны и типа самолёта - бомбер/нет - это первая функция, и после взлёта - по той же логике - вторая. Можно с таймаутом сообщение показывать.Код: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;
}
}
Тут в том проблема, что даже если так сделать, обратно вернуть никак не получится... Старый флажок то никуда не денется.
Вот и еще одно пожелание нарисовалось :)
Было бы чудесно, если бы флажки тоже попали в отслеживаемую статику, а еще лучше, что бы их можно было прикрепить к какой-ни-будь технике/кораблику. :)
Спасибо за ответы.
В Арма2 при заходе на сервер с миссией Warfare (битва за ресурсы) клиент сразу получает кнопку вызова меню (с клавиатуры), которого в самой игре нет, т.е. она назначена в миссии. Кнопка вызывает командное меню, по которому идет навигация кнопками 1-10 (как у нас переговоры). Это меню строительства объектов, управления ресурсами, голосования за командира, выбора целей, то есть всего необходимого в режиме "битва за ресурсы". Всё это есть в миссии, моды ставить не нужно. Как планируется реализовать режим "битва за ресурсы", анонсированный Олегом, если миссия не может перехватывать нажатия клавиатуры?
Коммюнити очень маленькое + моды не все будут ставить = разделение онлайна. Такая библиотека должна входить в стим-версию имхо.
Как онлайн-миссию тестить прямо из редактора? Много времени занимает бегание по меню, чтобы сервер стартонуть (((
Крайняя бета вылетает при попытке разместить объект "аэродром". Пришлось откатиться на Стим.
Покрытие аэродрома как-то выбирается? Один раз аэродром отрендерился с аэродромной травкой, другой раз просто поле с пшеницей ) Бетонку как выбрать?
Как можно объекты сгруппировать и группу сохранить в файл? Объект аэродром в файл не сохраняется кстати.
--- Добавлено ---
Подскажите, пожалуйста, при размещении объекта "аэродром" поверх зашитого в карту аэродрома, при спауне на стоянках в онлайне будут использованы аэродромные пункты аэродрома карты или вновь созданного?
Возможен ли "старт на стоянке", если не создавать аэродромные пункты, а просто поставить аэродром?
Нужен прямой доступ ко всем объектам, с возможностью в любое время узнать его состояние или уничтожить.
В идеале - просто добавить объект и подключиться к событиям произвольных объектов.
Через подгрузку миссии вариант не нравится тем, что подгружается и скрипт, и из старой миссии объекты новой недоступны, и из новой объекты старой.
Нужен глобальный класс битвы, с доступом к любым объектам и с доступом из него в любой скрипт загруженной миссии и с обратным доступом.
И не только к объектам, но и к игрокам (онлайн).
Возможно, это решится когда удастся задействовать GameServerDef.
В любом случае, скрипты, не поддающиеся отладке - это не тот инструмент, которым можно сделать серьёзный проект (можно, но геморройно)
Имхо, вся основная логика все равно уйдет в собственную реализацию ABattle, а в скриптах заложены будут базовые действия, необходимые для самой миссии, не более. Насчет недоступности объектов - присвой IsMissionListener значение меньше нуля - будет слушать все миссии. Событие вызовется и передаст короткое имя и номер миссии, инициировавшей событие. Правильно получать полные имена акторов для поиска через GamePlay можно, посмотрев на стат. класс ActorName.
При невозможности запуска под отладкой вот таких вот дополнений, в схожей задаче делал свою консольку, которая эмулировала "жизнь" на сервере, и спокойно отлаживался.
Каким скриптом можно уничтожить всех акторов в миссии перед ее перезагрузкой (и ручной и плановой)?
Какие варианты запуска такого скрипта существуют? Можно ли запускать из командной строки сервера, из консоли игры, или только основным скриптом миссии по времени?
Вопрос неоднократно задавался на форуме 1С владельцами серверов, также связан вот с этим багом http://www.sukhoi.ru/forum/showthrea...=1#post1610136
Невозможно отлаживать онлайн-миссии в полном редакторе если в них находятся акторы из предыдущей миссии, а выделенные сервера просто виснут при перезагрузке.
Не тестировал, но можно попробовать так
Миссия удаляет только "своих" акторов. Если надо грохнуть всех, убираем строки, выделенные синим.Код: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();
}
}
}
}
При подгрузке линии фронта в миссии - старая должна удаляться, полностью замещаясь новой.
да, спасибо, нашли исправили, в патче должно быть
Не знаю, после выходных постараюсь узнать, у меня бетонка родилась :)
Выделить группу объектов с <Alt>, потом правой кнопкой мыши -> сохранить в файл.
Не знаю, надо смотреть, у меня сейчас игры нет.
Спасибо за ответы. Спаун происходит на ближайшем к точке спауна аэродроме (совмещал точку спауна с центром аэродрома).
Если нет аэродромных пунктов, старт на стоянке происходит по внутреннему кругу аэродрома, если не создана полоса и по внешнему кругу, если полоса создана.
--- Добавлено ---
Остается вопрос как поменять синий респаун с синими самолетами на красный респаун с красными самолетами при передвижке линии фронта. Надеюсь, респауны тоже заменяются. Пока не проверял, т.к осваиваю триггеры.
А как их потом можно разгруппировать? Держа ALT и последовательно кликая их не удалось, как и как-либо по-другому (
Аэродром в файл не сохраняется как и группа с ним.
Какое расширение должно быть у файла?
Как к миссии можно подключить скрипт, чтобы при этом продолжали работать триггеры, заданные в полном редакторе?
Каким образом при этом можно :
- "перекрасить" точки спауна, например, с синего на красный?
- заменить синие зенитки на аэродроме на красные, если не все были уничтожены в миссии?
- заменить список доступных крафтов на спауне с синих на красные?
Информация нужна для 1го этапа работ над следующей миссией http://www.sukhoi.ru/forum/showthrea...=1#post1613505
naryv,
когда же мы увидим подключенную длл?
Вот, сделал пример по передвижению линии фронта, перекраске спаунов и т.д.
Вложение 133765
. Карта кресты и круги. При пролёте над аэродромом - он перекрашивается в цвет пролетевшего самолёта, линия фронта двигается, точки спауна на аэродромах становятся нового цвета. При пролёте противника над истребительными аэродромами - срабатывает триггер рождающий самолёт цвета начального аэродрома(над кругом пролетает синий - рождается спит, над крестом красный родит мессера, это чтобы одна сторона не проиграла совсем - всегда есть возможность вернуть захваченные дромы). На выделенном сервере проверял - работает как и на не выделенном. Проблема с неработающими скриптами на выделенном сервере может быть, если папка cache c атрибутом readonly - скрипт не может скомпилиться, сообщение об этом появляется в консоли сервера.
Спасибо большое, буду разбираться понемногу, если осилю )
А только средствами полного редактора с скриптом подгрузки миссий нельзя филд перекрасить? Не владеющим С# гораздо проще нарисовать новую диспозицию в новой миссии и подгрузить ее. Проверил, линия фронта при подгрузке миссии двигается, а старый спаун остается неизменным. Нельзя ли зашить в движек, чтобы в случае если подгружаемый из суб-миссии спаун другого цвета находился в неком радиусе от старого спауна, старый спаун бы дестроился, а новый создавался? (спауны кстати в файл тоже почему-то не сохраняются)
И зенитки оставшиеся мешают - вступают в перестрелку с родившимися новыми зенитками другой стороны. Придется спаунить танки, чтобы закатать зенитки в землю, а вот со спауном что делать, непонятно, он не перекрашивается. Ставить 2 разноцветных спауна рядом тоже не очень хорошо, т.к. пилоты будут в них путаться,. Может быть, можно включить в редактор такой объект как "ластик", при подгрузке которого все юниты предыдущих суб-миссий в его радиусе будут дестроиться?
Новый спаун на новом месте при подгрузке карты тоже не появляется. А это было бы полезно.
Возможно, есть какие-либо варианты через редактор? Если спаун оставить нейтральным и список доступных самолетов на спауне отредактировать в суб-миссии, он при подгрузке миссии изменится?
постараюсь ответить, если вопросы возникнут:)
можно, конечно, если миссию умеем подгружать - в принципе скрипт здесь так и делает.
нет, это будет очень не универсально - потом понадобится не дестроить, или не создавать новый, будет сложнее зашитый алгоритм менять.
до зениток не успел сегодня добраться, их можно вместе со старым спауном чистить, а на их место рожать новые.
это несколько сложнее чем кажется на первый взгляд - подмиссия может создать очень много объектов, они будут взаимодействовать с теми, которых убирать не надо и тд...
если у нового такое-же имя как у старого - правильно, что не подгружается, два объекта с одним уникальным именем нельзя создавать.
можно сделать как в примере выше - я старые спауны удаляю, а на их место ставлю новые.
А что происходит с именами групп? Проигрываю одну и ту же миссию, получаю имя группы (например, убитого самолета) в одних случаях получается имя как прописано в миссии, в других на том же самом самолете имя группы становится NoName. Игрок всегда определяется правильно.
Cтартануть группу по action.Do() тоже получается как-то загадочно. В одной и той же миссии, не трогая ни саму миссию, ни скрипта, то стартует, то не стартует. Гарантированно лечится заходом в полный редактор, переназначением имени группы и переназначением стартуемой группы в действиях.
Подскажите как это лечить?
Миссии для оффлайна.
Пока не осилил, т.е. понимать процентов на 60 понимаю, но написать такое для другого спауна и другого триггера не смогу. Так что остается пока только редактор и его триггеры. Триггеры пока откладываем в сторону пока они не работают вместе со скриптом подгрузки миссии в миссию. Без него никак (
Удалось в редакторе поставить новый спаун на старый, но старый не удаляется, т.е. другая сторона в этой точке карты тоже может выбрать свои самолеты. Как средствами редактора удалить старый спаун? Он же уже подгружен в миссию, нужен инструмент, чтобы его дестроить. Его перенос в тыл вроде бы не помогает, он остается на месте.
Если не в движек, то в триггеры полного редактора можно добавить перекраску поля со сменой крафтов по триггеру.Цитата:
нет, это будет очень не универсально - потом понадобится не дестроить, или не создавать новый, будет сложнее зашитый алгоритм менять.
Да, в этом вопрос: как чистить старый спаун и как чистить зенитки средствами полного редактора и подгрузки карт.
-------------------
Еще вопросы:
Сейчас делается миссия, состоящая из 3-4 карт с баталиями за аэродромы и их переходом от стороны к стороне. Каким образом в полном редакторе можно установить объект точно в одни и те же координаты на нескольких картах/миссиях? Тесты показали, что если, например зенитки стоят на одном месте на всех картах, то при загрузке подмиссий они не дублируются а замещаются (или возрождаются). Если на новой карте объект чуть сдвинут (случайно, например), то старый не исчезает. Когда зениток несколько десятков, опознать одну в тексте файла миссии не представляется возможным.
В будущем (через пару месяцев) подмиссий может быть несколько десятков и сотен. Нужен инструмент (скрипт) для пакетной обработки файлов миссий: добавления объекта или стирания объекта из миссии сразу для всех подмиссий миссии. Как для одной точки, так и в определенном радиусе.
Бывает проблематично довести танки до цели из-за отсутствия мостов. Можно включить в редактор саперов и пантонные переправы?
Танки по умолчанию идут слишком плотной колонной и врезаются в подбитый передний танк. Почему им нельзя задать боевой порядок как для самолетов? Желательно увеличить интервалы по умолчанию, чтобы успевали объехать препятствие. Либо проблема в том, что в бою танки трогаются только вперед и не могут объехать, ттогда как на марше 1 раз объезжали вставшего лидера, причем грамотно и с обеих сторон, т.е. этот модуль кода есть в игре.
Когда можно ожидать исправления триггеров полного редактора? То, что происходит внутри подгруженной суб-миссии было бы удобно регулировать хотя бы теми триггерами, что есть.
Имхо, группа, которая стартует скриптом (с помощью действия скажем), по сути относится уже к другой миссии. Попробуй во-первых, назначит переменной MissionNumberListener значение -1, примерно вот так:
NONAME выпадает, если актор относится к другой миссии, а указанным выше кодом мы заставляем текущую миссию будет слушать все события, происходящие в подмиссиях.Код:public override void OnBattleStarted()
{
base.OnBattleStarted();
MissionNumberListener = -1;
}
Во вторых, имя группы состоит из собственно имени группы и префикса "принадлежности к миссии" (номер миссии с двоеточием). Получить правильно полное имя группы (например для использования в GamePlay.gpActorByName()) можно примерно вот так:
В любом событии, относящемся к акторам, в первых двух параметрах передаются собственно номер миссии, где произошло событие, и короткое имя актора (как указано в файле миссии). Из двух этих параметров мы и получаем полное имя актора.Код:public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber, shortName, actor);
string fullName = ActorName.Full(missionNumber, shortName);
}
Чем отличаются "тревога" и "ожидание" в свойствах группы самолетов?
Машинки с car.cpp по чужой территории не ездят, просто стоят на месте?
Есть ли сплайновая дорога без столбов на которой работает car.cpp ? Машины врезаются в столбы, останавливаются, думают, снова врезаются...
Пролет цели по критерию GroundArmy может вызвать вылет группы самолетов своей стороны или только вражеской?
Можно ли какой-то командой во время миссии пересадить игрока в другой самолет?
Как не работают? В примере выше ведь и скрипт и триггеры вместе работают.
в редакторе никак, скриптом вот так:
можно ещё добавить проверку расстояния, чтобы не все спауны чистились, а на некотором расстоянии от нужной нам точки.Код:foreach (AiBirthPlace bp in GamePlay.gpBirthPlaces())
{
if (bp != null)
bp.destroy();
}
в редакторе точно поставить, емнип, никак, в тексте файла миссии скопировать можно. насчёт опознания - они веди поименованы все, смотрим в редакторе "объекты миссии", находим нужную в файле миссии и копируем координаты.
это вряд-ли - редактор ничего не знает о подмиссиях. самый простой вариант - делаем миссию с нужным объектом(им одним), и в текстовом редакторе вставляем его во все подмиссии.
сапёров пока нет, подумаем. В бою, вообще должны препятствия объезжать, возможно не успели.
не знаю, во вторник посмотрю.
ездят вроде, им цвет территории не важен, но уточню.
есть невидимая дорога(в англ. варианте Generic road, в русской не помню как переведено)- она вообще никак не отображается, машинка просто по заданному ей маршруту едет. Разные рулёжки и взлётки тоже без столбов.
по идее любой, армия влияет на условие срабатывания триггера.
во вторник посмотрю, а зачем так, против его воли, если не секрет:)? Про имена групп Small_Bee всё правильно написал, должно работать.
Спасибо за ответы, разбираюсь.
1) Как написать в консол? Я вижу System.Console.WriteLine () в некоторых миссиях кампании, но это не работает. Может быть мне нужно запустить игру в режиме отладки? Как это сделать?
2) OnAircraftLanded (), OnAircraftCrashLanded (), OnAircraftLanded (), IsAirborne () не работают для самолета игрока в мультиплеере. Должно так быть?
Находим группу, в цикле перебираем самолеты группы и сажаем игрока в первый же самолет, где есть кабина пилота.Код:AiActor actor = GamePlay.gpActorByName(ActorName.Full(MissionNumber, "BoB_LW_LG2_I.01"));
if (actor is AiAirGroup && GamePlay.gpPlayer() != null)
{
Player player = GamePlay.gpPlayer();
foreach (AiAircraft airc in (actor as AiAirGroup).GetItems())
{
bool isFound = false;
for (int i = 0; i < airc.Places(); i++)
{
if (airc.ExistCabin(i))
{
if (airc.CrewFunctionPlace(i).Equals(CrewFunction.Pilot))
{
player.PlaceEnter(airc, i);
isFound = true;
break;
}
}
}
if (isFound) break;
}
}
В полном редакторе в меню есть раздел триггеров и скриптов. Так вот, если там задать триггеры и действия для них, они будут работать до тех пор, пока к миссии не добавлен скрипт в текстовом файле. Эта проблема с примерами некорректной работы миссий была уже изложена здесь: http://www.sukhoi.ru/forum/showthrea...=1#post1612758
Естественно, юзеру вроде меня удобнее использовать встроенные в редактор триггеры, чем просить кого-то написать скрипт, содержащий триггеры, который я даже не смогу отладить. Однако, использовать триггеры редактора пока не удается из-за:
1) больше 3-4х триггеров в миссии не работает (описано в багрепортах)
2) триггеры не работают вместе со скриптом подгрузки миссий и уничтожения ботов (описано в багрепортах).
По этим причинам работа с триггерами редактора отложена о лучших времен.
На сервере 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();
}
}
}
}
1) А можно ли задать для игрока условие "автопересадки" в другой самолёт, после выполнения задания, без выхода в меню?
Т.е чтобы скажем выполнили задачи истребителя - оказались в бомбордировщике.
2) А можно ли задать для юнитов скриптовые маршруты зацикленные до бесконечности? Например чтобы поезд нарезал круги по рельсам и п.р до конца миссии.