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