-
Re: Полный редактор и скрипты.
Фигушки, не цепляет ... хотя я пока не сказать что особо пытался - к стыду своему я мало с WPF работал, видимо прийдется, так что много не пробовал, инетрес на будущее. Но вообще, как я понимаю все в GameObject.MsgToServer(byte[] msg);, никаких иных методов воздействия на игру из плагина я не вижу, вот только осталось вытрясти засамизнаетекого форматы этих команд/сообщений.
-
Re: Полный редактор и скрипты.
Цитата:
Сообщение от
tahorg
Фигушки, не цепляет ... хотя я пока не сказать что особо пытался - к стыду своему я мало с WPF работал, видимо прийдется, так что много не пробовал, инетрес на будущее. Но вообще, как я понимаю все в GameObject.MsgToServer(byte[] msg);, никаких иных методов воздействия на игру из плагина я не вижу, вот только осталось вытрясти засамизнаетекого форматы этих команд/сообщений.
Вот и я о том же... Имхо, пока эта фича либо отключена совсем, либо игра как-то фильтрует аддоны.. Так что ждем-с...
-
Re: Полный редактор и скрипты.
С новым патчем появилась возможность отслеживать статики артиллерию. Как слушать миссии мы знаем. Уже лучше...
-
Re: Полный редактор и скрипты.
Цитата:
Сообщение от
tahorg
Фигушки, не цепляет ... хотя я пока не сказать что особо пытался - к стыду своему я мало с WPF работал, видимо прийдется, так что много не пробовал, инетрес на будущее. Но вообще, как я понимаю все в GameObject.MsgToServer(byte[] msg);, никаких иных методов воздействия на игру из плагина я не вижу, вот только осталось вытрясти засамизнаетекого форматы этих команд/сообщений.
Мне удалось подцепить.
С кучей оговорок
1. пространство имён нужно задать maddox
2. Класс назвать ClientAddIn
3. длл-ку положить в папку DefaultAddIn
Вобщем, всё это чтобы вместо ClientAddIn.dll из поставки игры подсунуть свою. Из других мест не подхватывает, с другим именем тоже.
Но это не самое главное.
Самое главное то, что цепляется она только в момент создания сервера из игры - на выделенном сервере не работает.
Остаётся проверить можно ли в неё запихнуть что-то, что будет отслеживать события миссии и сервера, хотя без работы её на выделенном сервере смысла особого не вижу.
-
Re: Полный редактор и скрипты.
Цитата:
Сообщение от
Mirnyi
Мне удалось подцепить.
С кучей оговорок
1. пространство имён нужно задать maddox
2. Класс назвать ClientAddIn
3. длл-ку положить в папку DefaultAddIn
Вобщем, всё это чтобы вместо ClientAddIn.dll из поставки игры подсунуть свою. Из других мест не подхватывает, с другим именем тоже.
Но это не самое главное.
Самое главное то, что цепляется она только в момент создания сервера из игры - на выделенном сервере не работает.
Остаётся проверить можно ли в неё запихнуть что-то, что будет отслеживать события миссии и сервера, хотя без работы её на выделенном сервере смысла особого не вижу.
Круто! По крайней мере можно начинать эксперименты. Сто пудово, игра просто фильтрует аддоны сейчас.
-
Re: Полный редактор и скрипты.
Да ничего крутого.
Для меня это оказалось ещё одним тупиком. Мне нужно добраться до управления выделенным сервером и до информации от него.
Клиентские аддины не грузятся в режиме выделенного сервера.
Попытался зацепиться через launcher.exe.config - та же ботва - при запуске игры вроде подгружается длл-ка (но отладчик говорит что "машинных символов в файле нет"), при запуске сервера - нет. Остаётся ещё один путь - разобраться с тем как подключаются дополнительные части (parts), но тут вообще не пойму как подступиться - видимо, список частей зарыт где-то прямо в коде (как и путь, и "фамилия" ClientAddIn).
Вобщем, чем дальше ковыряю, тем больше впечатление, что либо я - совсем дурак, либо по части расширяемости там всё ещё сырее, чем по остальному.
Реально управлять сервером с миссиями, похоже, пока можно только через скрипты, а это только половина дела - вторую половину (старт сервера и запуск битвы) - пока только через консоль.
А с учётом того, что скрипты ещё и отладке не поддаются - вообще ж..па.
И тишина от разрабов, похоже, не из-за "режима секретности", а именно из-за того, что толком ещё не определились как это всё реализовывать - куча точек "входа"(скрипты, аддоны, аддины, part-ы, консоль...) и все ущербные.
-
Re: Полный редактор и скрипты.
Вроде работает на сервере Repka
Код:
using System;
using maddox.game;
using maddox.game.world;
using System.Collections.Generic;
public class Mission : AMission
{
// 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!");
}
}
// destroys aircraft abandoned by a player
public void _DespawnEmptyPlane(AiActor actor)
{
if (actor == null)
{ return; }
Player[] Players = GamePlay.gpRemotePlayers();
bool PlaneIsEmpty = true;
foreach (Player i in Players)
{
if ((i.Place() as AiAircraft) == (actor as AiAircraft))
{
PlaneIsEmpty = false;
break;
}
}
if ((PlaneIsEmpty) && (actor as AiAircraft).IsAirborne())
{
(actor as AiAircraft).hitNamed(part.NamedDamageTypes.ControlsElevatorDisabled);
(actor as AiAircraft).hitNamed(part.NamedDamageTypes.ControlsAileronsDisabled);
(actor as AiAircraft).hitNamed(part.NamedDamageTypes.ControlsRudderDisabled);
(actor as AiAircraft).hitNamed(part.NamedDamageTypes.Eng0TotalFailure);
//for 2mots
(actor as AiAircraft).hitNamed(part.NamedDamageTypes.Eng1TotalFailure);
//then wait 10min
Timeout(600.0, () =>
{
(actor as AiAircraft).Destroy();
});
}
else if (PlaneIsEmpty)
{
(actor as AiAircraft).Destroy();
}
}
public override void OnPlaceLeave(Player player, AiActor actor, int placeIndex)
{
base.OnPlaceLeave(player, actor, placeIndex);
_DespawnEmptyPlane(actor);
}
// destroys crushlanded aircraft in 10 minutes
public override void OnAircraftCrashLanded(int missionNumber, string shortName, AiAircraft aircraft)
{
base.OnAircraftCrashLanded(missionNumber, shortName, aircraft);
Timeout(600, () =>
{
aircraft.Destroy();
});
}
}
-
Re: Полный редактор и скрипты.
Выкладывали на 1С исправленную версию, которая включает в скрипт сервер, т.к. изначально сервер не входит GamePlay.gpRemotePlayers() http://forum.1cpublishing.eu/showpos...1&postcount=83 см. 2ю половина сообщения (!)
Не было времени тестировать. Это поможет решить проблему того, что скрипты работают на невыделенном сервере, но не работают на выделенном?
Код:
using System;
using maddox.game;
using maddox.game.world;
using System.Collections.Generic;
public class Mission : AMission
{
public void _DespawnEmptyPlane(AiActor actor)
{
if (actor == null)
return;
Player[] Players = GamePlay.gpRemotePlayers();
bool PlaneIsEmpty = true;
foreach (Player i in Players) {
if (((i.Place() as AiAircraft) == (actor as AiAircraft)) || ((GamePlay.gpPlayer().Place() as AiAircraft) == (actor as AiAircraft))) {
PlaneIsEmpty = false;
break;
}
}
if (PlaneIsEmpty) {
(actor as AiAircraft).Destroy();
}
}
public override void OnPlaceLeave(Player player, AiActor actor, int placeIndex) {
base.OnPlaceLeave(player, actor, placeIndex);
Timeout(1, () => {
_DespawnEmptyPlane(actor);
});
}
}
-
Re: Полный редактор и скрипты.
Задача - вывести на экран 2 сообщения, через 10 минут после загрузки подмиссии BoF2_ground01.mis + еще через 5 минут (15 после подгрузки). Вот такое будет работать или как-то изменить?
Код:
public class Mission : AMission
{
// loads my sub-missions
public override void OnTickGame()
{
if (Time.tickCounter() % 108000 == 6000) // 60-10
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF2/BoF2_ground01.mis");
// GamePlay.gpHUDLogCenter("Attention! Enemy activity spotted at x!");
Timeout(600, () =>
{
GamePlay.gpHUDLogCenter("1.Attention! Enemy activity spotted at x!");
});
Timeout(300, () =>
{
GamePlay.gpHUDLogCenter("2.Urgent help needed at x!");
});
}
-
Re: Полный редактор и скрипты.
Цитата:
Сообщение от
-atas-
Задача - вывести на экран 2 сообщения, через 10 минут после загрузки подмиссии BoF2_ground01.mis + еще через 5 минут (15 после подгрузки). Вот такое будет работать или как-то изменить?
Код:
public class Mission : AMission
{
// loads my sub-missions
public override void OnTickGame()
{
if (Time.tickCounter() % 108000 == 6000) // 60-10
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF2/BoF2_ground01.mis");
// GamePlay.gpHUDLogCenter("Attention! Enemy activity spotted at x!");
Timeout(600, () =>
{
GamePlay.gpHUDLogCenter("1.Attention! Enemy activity spotted at x!");
});
Timeout(300, () =>
{
GamePlay.gpHUDLogCenter("2.Urgent help needed at x!");
});
}
вот так :
Код:
public class Mission : AMission
{
// loads my sub-missions
public override void OnTickGame()
{
if (Time.tickCounter() % 108000 == 6000) // 60-10
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF2/BoF2_ground01.mis");
double initTime = 0.0;
Timeout(initTime +=600, () =>
{
GamePlay.gpHUDLogCenter("1.Attention! Enemy activity spotted at x!");
});
Timeout(initTime +=300, () =>
{
GamePlay.gpHUDLogCenter("2.Urgent help needed at x!");
});
}
-
Re: Полный редактор и скрипты.
Скажите, пожалуйста, есть ли возможность подключения в скриптах других сборок из gac, например System.Web.Services?
Допустим я хочу сохранять логи на удаленную машину или "получать из космоса" команды на выполнение взамен на события?
-
Re: Полный редактор и скрипты.
Цитата:
Сообщение от
2GvShAD_Jah
Скажите, пожалуйста, есть ли возможность подключения в скриптах других сборок из gac, например System.Web.Services?
Допустим я хочу сохранять логи на удаленную машину или "получать из космоса" команды на выполнение взамен на события?
По-моему все можно подключать.. WebClient по крайней мере работает.
-
Re: Полный редактор и скрипты.
-
Re: Полный редактор и скрипты.
Судя по всему объект "Локальная погода" не работает? Что-то я не увидел его результатов.
-
Вложений: 2
Re: Полный редактор и скрипты.
Большая уборка.
Пара примеров организации подмиссий с точки зрения борьбы с захламлением битвы.
1. Dogfight_01. Хост загружает подмиссию только один раз. Все остальные задачи подмиссия выполняет сама. В данном случае подмиссия загружает сама себя каждые n-секунд, предварительно удалив "старые" объекты. ключевой момент - метод ClearOwnActors(int _MissionNumber). Именно он занимается удалением объектов перед загрузкой нового экземпляра миссии.
2. Dogfight_02. Тот же самый сценарий, но подмиссии не имеют скриптов вообще. Удалением трупиков и старых объектов занимается исключительно хост. Ключевой момент - метод DestroyMissionActors(int _MissionNumber = -1). Это доработанный ClearOwnActors, вызвав его без параметров, мы уничтожим вообще все объекты в миссии.
PS. В миссиях есть танки, артиллерия, самолеты и корабли. Всё удаляется как полагается.
-
Re: Полный редактор и скрипты.
Цитата:
Сообщение от
andersbravers
А самих игроков тоже удалит? Вот пробовал вчера по образу Dogfight_01, наземка удалялась, спасибо. Dogfight_02 буду посмотреть :)
--- Добавлено ---
Смотрю Dogdfight_02. Интересно, до этого думал, что MissionNumberListener = -1 это только для "прослушки" триггеров в подмиссиях...
--- Добавлено ---
Вот пробовал вчера к подмиссиям .cs приписывать, чтобы там указать подчистку объектов и делать перезагруз самой себя, ты как-то высказывал такую идею, что чистится лучше если и рождение, и чистка в одной подмиссии. К сожалению все постер, не могу привести, но в-общем не получилось с перезагрузкой миссии, хотя по одному разу загружались. Отталкивался в целом от Dogfight_01, только в подмиссиях делал еще перезагруз по тикам. Но оставил старый принцип, похожий как в Dogfight_02: т.е. миссия загружает по тикам подмиссии, а уже в .cs к ним указать подчистку объектов. Ну, в принципе, можно как у тебя сделать подчистку в .cs к основной миссии, а тогда .cs подмиссий вообще можно удалить за ненадобностью.
Тики в подмиссиях имхо хреновая идея. попробуй в 01 убрать проверку в OnMissionLoaded на номер миссии, и посмотри что получится. Я сдуру включил ускорение, боб здох за 5 сек. :) От, имхо, то же самое будет.
Грузить из хоста, а чистить из подмиссии - немного не понял. А как подмиссия узнает, что чистится пора?
-
Re: Полный редактор и скрипты.
Цитата:
Сообщение от
andersbravers
Да я тогда неправильно твою идею понял, думал, что возрождение и чистка должно быть в одной подмиссии. Ну и ничего из этого соответственно не вышло, кроме загрузки миссии по одному разу. А чистка вроде срабатывала, хотя долго не имел возможности погонять. А тики у тебя самого же вроде стоят? Вот кусок host_01 из Dogfight_02:
Код:
public override void OnTickGame()
{
base.OnTickGame();
if (Time.tickCounter() % 3000 == 0)
{
LoadMission("missions/Multi/Dogfight/blue01.mis");
Timeout(45, () => { LoadMission("missions/Multi/Dogfight/red01.mis"); });
У меня такие же, первая ч-з 10 сек, вторая через кажется 30 сек., третья ч-з 1 мин и т.д.
--- Добавлено ---
Кстати, а // destroy all own air units
AiAirGroup[] airGroups = GamePlay.gpAirGroups(army);
if (airGroups != null) // required check!
{
не убивает случайно игроков?
Мы похоже на разных языках разговариваем :). Немного определимся в терминах и определениях.
Хост - это миссия стартовая. Именно та, которая загружается самой первой - ее загружает сервер. Все остальные - это подмиссии. Даже если мы загрузим нашу стартовую миссию еще раз в процессе битвы, это тоже, уже будет подмиссия. Т.е. хост всегда имеет номер - 0.
В первом примере подмиссия все делает сама, во втором все делает хост, подмиссия вообще без мозгов. А какой метод лучше использовать или как их сочетать - решать уже мисмейкеру. Т.е. можно и так и так. Идея фикс именно в "контроле рождаемости", а не в том, кто этим занимается. :)
Каждый актор имеет два имени. Одно - короткое (уникальное в пределах своей миссии), второе - полное (уникальное в пределах битвы). Длинное имя состоит из номера миссии, загрузившей актора, а короткого имени. Метод Name() актора возвращает полное имя. Выделив из полного имени номер, мы сможем узнать, к какой миссии он принадлежит. ClearOwnActors() именно этим и занимается, т.е. никакие левые акторы затронуты не будут, в том числе и самолеты игроков. Аналог этого метода из догфайт_02 может, действительно, при вызове без параметров убить вообще все живое. Рестарт :)
Загрузка миссии. То что мы написали в файле и скрипте, с точки зрения битвы миссией не является, как не являются автомобилем его чертежи. Скрипт - это начинка автомобиля, файл миссии - внешний обвес. Т.е. это по сути чертеж, схема будущей миссии. Загружая миссию, мы по сути собираем автомобиль по чертежам. Т.е. проделав это несколько раз, мы получим несколько одинаковых автомобилей а не один обновленный.
А теперь что хотел этим сказать. Если в описании по нашему автомобилю сказано, что он самостоятельно, каждые 10 минут должен собрать такой же - представляем картину. Мы собрали первый автомобиль и забыли за него. Через 10 минут их будет уже двое. Через 20 минут - четверо. Через 30 - 8 штук. И так далее до бесконечности. Вот то же самое будет, если миссии дать возможность грузить саму себя по тикам.
В приведенном тобой куске кода хост был загружен только один раз, и больше я его не трогаю. Поэтому смело юзаю тики и прочее.
-
Re: Полный редактор и скрипты.
Цитата:
Сообщение от
andersbravers
Да, и можно ли чистить севшие боты-бомберы? А то их скапливается просто бешенное количество.
Убирает после вынужденной и после посадки через 5 минут. Для твоей миссии таймаут можно уменьшить, если они садятся там, где их не видно.
Код:
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); }
);
}
-
Re: Полный редактор и скрипты.
Цитата:
Сообщение от
andersbravers
Это вот это:
private void DestroyMissionActors(int _MissionNumber = -1)
Т.е. если убрать -1 , то произойдет перезагруз миссии?
Не надо ничего убирать. Просто вставить в нужном месте вот такую строку:
Код:
DestroyMissionActors();
У мну такое чувство, что примеры вообще не смотрелись. Как только вы загрузите новую миссию с бобрами, все старые бобры, живые или мертвые, в воздухе или в ангаре, исчезнут.
Кстати со статиками, за исключением рабочей артиллерии, мы вообще ничего сделать не можем. К огромному сожалению
-
Re: Полный редактор и скрипты.
Цитата:
Сообщение от
andersbravers
Точно, Dogfight_01 загрузился только брифинг (карта), зайти так и не удалось. Dogfight_02 еще не успел посмотреть, только скрипты. :)
Если нет кнопки летать (это если в сингле или в редакторе запускаешь без назначенного игроку самолета) - нажми ескейп - там в меню будет "Летать". Вуаля.
-
Re: Полный редактор и скрипты.
В моем пробном тестовом сценарии миссии, одна зенитка гасит другую зенитку (спавнятся они умышленно рядышком).
Имеем вот такую часть кода:
Код:
//---------------------------------------------------------------------------------
public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
{
base.OnActorDead(missionNumber, shortName, actor, damages);
if (actor is AiGroundActor)
{
Timeout(10, () =>
{(
actor as AiGroundActor).Destroy();
Sss("Наземка была удалена с карты " + shortName);
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/Skript1.mis");
});
}
}
//---------------------------------------------------------------------------------
Как именно в этой части кода можно определить какая именно зенитка была подбита? Красная или Синяя? Или как это сделать другим кодом? Я делал это создавая тригер на нужную зенитку. Получалось. Но мне это показалось слишком громоздким.
-
Re: Полный редактор и скрипты.
Можно попробовать if (actor.Army() == 1) - значит красные
== 2 - значит синие
Но я такое использовал только с player, но не с actor. В примерах naryv можно ".Army" поискать.
Вот здесь все примеры в одном архиве http://forum.1cpublishing.eu/showthread.php?t=26523
-
Re: Полный редактор и скрипты.
Цитата:
Сообщение от
-atas-
Можно попробовать if (actor.Army() == 1) - значит красные
== 2 - значит синие
Большое спасибо! Это реально работает и реально сильно помогло. Но сразу возникает следующий вопрос...
Имеем:"Actor"
actor.Name()
actor.Army()
и так далее...
Как продолжить этот список? Где народ берет эту инфу? Ну, чтобы в будущем не мучить народ вопросами, а искать самому.
Кусок миссии:
[Stationary]
Static1 Artillery.Krupp_L2H43_Protze_Flak38 gb 17433.78 10644.86 -75.00 /timeout 0/radius_hide 0
Смысл в том, что я могу узнать к какой армии принадлежит наземка, какое ее имя в миссии. Но мне нужно знать нее ее имя "Static1": А ее тип. Ну, или тоже имя, только другое. Это имя: "Krupp_L2H43_Protze_Flak38". Или это имя "Artillery.Krupp_L2H43_Protze_Flak38"
-
Re: Полный редактор и скрипты.
Цитата:
Сообщение от
SlavikSG
Большое спасибо! Это реально работает и реально сильно помогло. Но сразу возникает следующий вопрос...
Имеем:"Actor"
actor.Name()
actor.Army()
и так далее...
Как продолжить этот список? Где народ берет эту инфу? Ну, чтобы в будущем не мучить народ вопросами, а искать самому.
Кусок миссии:
[Stationary]
Static1 Artillery.Krupp_L2H43_Protze_Flak38 gb 17433.78 10644.86 -75.00 /timeout 0/radius_hide 0
Смысл в том, что я могу узнать к какой армии принадлежит наземка, какое ее имя в миссии. Но мне нужно знать нее ее имя "Static1": А ее тип. Ну, или тоже имя, только другое. Это имя: "Krupp_L2H43_Protze_Flak38". Или это имя "Artillery.Krupp_L2H43_Protze_Flak38"
Из статиков в скрипте на сегодня можно "увидеть" только артиллерию и кораблики. Надеюсь, это дело расширят рано или поздно.
Описание интерфейсов смотрим из Visual Studio (Подключаем сборки из parts), или юзаем рефлектор.
Имя актора можно получить через Name(), тип получаем через InternalTypeName(). Опять же, посёрфив по сборкам, можем найти еще много интересного.
-
Re: Полный редактор и скрипты.
Цитата:
Сообщение от
SlavikSG
Большое спасибо! Это реально работает и реально сильно помогло. Но сразу возникает следующий вопрос...
Как продолжить этот список? Где народ берет эту инфу? Ну, чтобы в будущем не мучить народ вопросами, а искать самому.
Либо так (у меня с VS сплошные проблемы, утановился только 2008-й и работает только С++) подключив библиотеки боба, в которых есть все команды и методы:
Настройка среды разработки Visual Studio для работы с библиотеками игры
Либо там же в скриптах есть списки методов и др., впрочем все это взято из архива Атаса.