-
Полный редактор и скрипты.
Думаю такая тема назрела. Покопал немножко скрипты, основываясь на существующих кампаниях, плюс прошелся студией по некоторым сборкам.
Что мы имеем на этот момент.
Скрипт представляет собой обычный (ну или почти) cs файл со всеми полагающимися атрибутами. Скажем скрипт от одной из миссий, исключая реализацию выглядел так:
Код:
//$reference Campaign.dll
//-$debug
using System;
using maddox.game;
using maddox.game.world;
public class Mission : maddox.game.campaign.Mission {
// здесь реализация....
}
Т.е., нам надо создать новый класс (Mission), наследуемый от класса maddox.game.campaign.Mission.
Далее, методом переопределения существующих виртуальных методов класса-предка, собственно и пишем всю подноготную для миссии.
Собственно класс maddox.game.campaign.Mission я как то не нашел (уже нашел), но зато обнаружил абстрактный класс AMission (maddox.game.campaign.Mission наследуется от него прямо). Далее выкладываю список всех виртуальных методов этого класса (первая строчка - защищенный конструктор, его ИМХО трогать пока не надо.), а также публичные поля класса. С которыми разобрался, напишу дополнительно, ну и постараюсь походу информацию дополнять, включая информацию по используемым классам (таких как AiActor к примеру и т.д.).
Код:
protected AMission()
public virtual void Init(maddox.game.ABattle battle, int missionNumber)
public virtual void Inited()
public virtual bool IsMissionListener(int missionNumber)
public virtual void OnActorCreated(int missionNumber, string shortName, maddox.game.world.AiActor actor)
public virtual void OnActorDamaged(int missionNumber, string shortName, maddox.game.world.AiActor actor, maddox.game.world.AiDamageInitiator initiator, part.NamedDamageTypes damageType)
public virtual void OnActorDead(int missionNumber, string shortName, maddox.game.world.AiActor actor, System.Collections.Generic.List<DamagerScore> damages)
public virtual void OnActorDestroyed(int missionNumber, string shortName, maddox.game.world.AiActor actor)
public virtual void OnActorTaskCompleted(int missionNumber, string shortName, maddox.game.world.AiActor actor)
public virtual void OnAiAirNewEnemy(maddox.game.world.AiAirEnemyElement element, int army)
public virtual void OnAircraftCrashLanded(int missionNumber, string shortName, maddox.game.world.AiAircraft aircraft)
public virtual void OnAircraftCutLimb(int missionNumber, string shortName, maddox.game.world.AiAircraft aircraft, maddox.game.world.AiDamageInitiator initiator, part.LimbNames limbName)
public virtual void OnAircraftDamaged(int missionNumber, string shortName, maddox.game.world.AiAircraft aircraft, maddox.game.world.AiDamageInitiator initiator, part.NamedDamageTypes damageType)
public virtual void OnAircraftKilled(int missionNumber, string shortName, maddox.game.world.AiAircraft aircraft)
public virtual void OnAircraftLanded(int missionNumber, string shortName, maddox.game.world.AiAircraft aircraft)
public virtual void OnAircraftLimbDamaged(int missionNumber, string shortName, maddox.game.world.AiAircraft aircraft, maddox.game.world.AiLimbDamage limbDamage)
public virtual void OnAircraftTookOff(int missionNumber, string shortName, maddox.game.world.AiAircraft aircraft)
public virtual void OnAutopilotOff(maddox.game.world.AiActor actor, int placeIndex)
public virtual void OnAutopilotOn(maddox.game.world.AiActor actor, int placeIndex)
public virtual void OnBattleInit()
public virtual void OnBattleStarted()
public virtual void OnBattleStoped()
public virtual void OnCarter(maddox.game.world.AiActor actor, int placeIndex)
public virtual void OnMissionLoaded(int missionNumber)
public virtual void OnPersonHealth(maddox.game.world.AiPerson person, maddox.game.world.AiDamageInitiator initiator, float deltaHealth)
public virtual void OnPersonMoved(maddox.game.world.AiPerson person, maddox.game.world.AiActor fromCart, int fromPlaceIndex)
public virtual void OnPersonParachuteFailed(maddox.game.world.AiPerson person)
public virtual void OnPersonParachuteLanded(maddox.game.world.AiPerson person)
public virtual void OnPlaceEnter(maddox.game.Player player, maddox.game.world.AiActor actor, int placeIndex)
public virtual void OnPlaceLeave(maddox.game.Player player, maddox.game.world.AiActor actor, int placeIndex)
public virtual void OnPlayerArmy(maddox.game.Player player, int army)
public virtual void OnPlayerConnected(maddox.game.Player player)
public virtual void OnPlayerDisconnected(maddox.game.Player player, string diagnostic)
public virtual void OnSingleBattleSuccess(bool success)
public virtual void OnTickGame()
public virtual void OnTickReal()
public virtual void OnTrigger(int missionNumber, string shortName, bool active)
public virtual void Timeout(double sec, maddox.game.DoTimeout doTimeout)
public maddox.game.ABattle Battle { get; }
public maddox.game.IGamePlay GamePlay { get; }
public int MissionNumber { get; }
public int MissionNumberListener { set; get; }
public maddox.game.world.ITime Time { get; }
Как видно, названия многих методов говорят сами за себя.
Далее маленький пример. Скажем реакция на триггер:
Переопределяем метод OnTrigger
public override void OnTrigger(int missionNumber, string shortName, bool active)
{
// здесь реализация...
}
Собственно реализация..
if ("trigger".Equals(shortName) && active)
{
GamePlay.gpHUDLogCenter("Сработал триггер trigger");
}
Человеческий перевод. Если имя триггера равно trigger и он активен (т.е. условия триггера выполнены) пишем надпись по центру экрана "Сработал триггер trigger".
В итоге у нас получится что-то вроде этого:
Код:
//$reference Campaign.dll
//-$debug
using System;
using maddox.game;
using maddox.game.world;
public class Mission : maddox.game.campaign.Mission {
public override void OnTrigger(int missionNumber, string shortName, bool active)
{
if ("trigger".Equals(shortName) && active)
{
GamePlay.gpHUDLogCenter("Сработал триггер trigger");
}
}
}
Конечно, для того что бы что-то писать, надо хотя бы немного знать C#. В целом это весьма несложно. Также информацию можно почерпнуть, просмотрев скрипты к миссиям кампаний (....Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\bob\mission\campaign)
Кстати GamePlay.gpHUDLogCenter() не будет работать, если в миссии нет игроков-людей... Брехня, таки работает.
Примеры скриптов.
Ниже буду размещать примеры скриптов. Может кто-то еще чего подскажет.
________________________
Запуск действия
(Сейчас с игре похоже присутствует только один тип действия - рождение группы).
1. Подготовка.
Создаем группу самолетов как обычно, но в свойствах группы ставим флажок "Старт скриптом". Группа не появится до тех пор, пока мы ее сами не запустим.
2. Идем в "Скрипты" на вкладку "Действия". Создаем новое действие, называем его, например "TestAction" (без кавычек), жмакаем "Выбрать группу" и указываем созданную нами в первом шаге группу.
3. Допустим, мы хотим, что-бы группа родилась, когда кого то отправят к праотцам. Это может быть что угодно, как самолет так и прочее... Переходим на вкладку скрипты и пишем следующее:
Код:
using System;
using maddox.game;
using maddox.game.world;
class Mission : maddox.game.AMission
{
public override void OnActorDead(int missionNumber, string shortName, AiActor actor, System.Collections.Generic.List<DamagerScore> damages)
{
base.OnActorDead(missionNumber, shortName, actor, damages);
AiAction action = GamePlay.gpGetAction("TestAction");
if (action != null)
{
action.Do();
}
}
}
Обратите внимание. Наследоваться надо не от maddox.game.campaign.Mission, а от maddox.game.AMission. Это актуально для сингловых миссий и (возможно) мультиплеерных. Для миссий в кампании надо наследоваться от maddox.game.campaign.Mission. Этот класс предоставляет еще одно свойство Campaign, который позволяет управлять кампанией.
Человеческим языком:
public override void OnActorDead(...)
Переопределили метод, который вызывается при чьей либо смерти.
base.OnActorDead(missionNumber, shortName, actor, damages);
В принципе можно не вызывать, но для порядка пусть будет.
AiAction action = GamePlay.gpGetAction("TestAction");
if (action != null)
{
action.Do();
}
В первой строчке получили объект действия по его имени. Как мы помним, это было "TestAction"
Вторая строчка - проверяем, действительно ли ц нас есть такое действие (от опечаток никто не застрахован), и, если оно есть (т.е. не равно null), вызываем метод действия Do(). Что значит "Сделать". Вуаля. Наша группа появляется и топает по маршруту.
-
Re: Полный редактор и скрипты.
Клёво! А сделай, пожалуйста, пример миссии со скриптом, если это не сложно. Например, игрок вылетает сначала против одного бота, а если его сбивает, то против него уже вылетают два бота. Я как поняла там же где и триггеры есть закладка с действиями, где можно нарисовать действие с рождением новой группы, а скриптом увязать триггер с действием.
-
Re: Полный редактор и скрипты.
Как только разберуть, как в рантайме создавать правильно группы, так и сделаю. Пока только скажу, что это делать можно. Вообще, походу можно войну уже сейчас рисовать.. На базе только одной миссии. :) а пока потихоньку буду добавлять примеру кода, с чем разобрался.
Можем узнать, кто кому какие повреждения нанес, кто где приземлился и как, на своей территории или нет, если нет, то дистанция до линии фронта, в воду плюхнулся, в огород или на дорогу... Что выбрал куда сел... В общем там столько всего, что об этом можно было только мечтать. :)
-
Вложений: 2
Re: Полный редактор и скрипты.
Сделал небольшую миссию как пример скрипта, типа "Выживание".
Всего три раунда и четыре противника - 3 G.50 и один мессер-асс. Бой проходит над водой, высота 3000 м. Думаю будет не сложно.
Распаковать в ...\Documents\1C SoftClub\il-2 sturmovik cliffs of dover\missions\Single
Если все нормально, в отдельных заданиях появится миссия "Выживание".
Вложение 131587
-
Re: Полный редактор и скрипты.
Угу.
Теперь понятно где находится "главный вход" :)
Я-то его искал в ClientAddin-ах.
А вопрос на засыпку можно?
В случае более-менее сложного скрипта, какие инструменты отладки можно использовать?
-
Re: Полный редактор и скрипты.
Цитата:
Сообщение от
Mirnyi
Угу.
Теперь понятно где находится "главный вход" :)
Я-то его искал в ClientAddin-ах.
А вопрос на засыпку можно?
В случае более-менее сложного скрипта, какие инструменты отладки можно использовать?
К сожалению, похоже, что кроме собственной головы - никаких. Если кто найдет обратное, буду очень признателен.
Почти наверняка влияет вот эта строчка - //-$debug, но я с ней пока не экспериментировал.
Я делаю так - запускаю студию, новый проект любой C#. Прилинковал к проекту:
...\Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\core\part.dll
...\Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\core\maddox.dll
...\Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\core\gameWorld.dll
...\Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\core\gamePlay.dll
...\Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\bob\Campaign.dll
Подозреваю, что не все эти сборки необходимы, но особо туда не лез, пусть будут. Последняя же нужна только для миссий из кампании.
Создал класс, в using прописал необходимый минимум
using System;
using maddox.game;
using maddox.game.world;
И пишу себе спокойно, после код просто копирую в игру. Единственное убираю неймспейс моего проекта. Не самая удобная штука, но писать вполне можно.
-
Вложений: 1
Re: Полный редактор и скрипты.
А теперь устроим небольшую диверсию :)
Пример миссии в аттаче, комментарии в коде ниже.
Код:
using System;
using maddox.game;
using maddox.game.world;
public class Mission : maddox.game.AMission
{
// переопределяем метод, который вызывается, когда какой-то из самолетов взлетит...
public override void OnAircraftTookOff(int missionNumber, string shortName, AiAircraft aircraft)
{
base.OnAircraftTookOff(missionNumber, shortName, aircraft); // вызвали базовый метод (мало ли...)
if (GamePlay.gpPlayer() != null) // проверили, есть ли у нас игрок.
{
if (GamePlay.gpPlayer().Place() != null) // проверили, что игрок сидит где-то, а не болтается на тряпке.
{
if (aircraft.Name().Equals(GamePlay.gpPlayer().Place().Name())) // если взлетевший самолет - игрока, то...
{
aircraft.hitNamed(part.NamedDamageTypes.ControlsElevatorDisabled); // ...вырубаем рули высоты...
aircraft.hitNamed(part.NamedDamageTypes.ControlsAileronsDisabled); // ... элероны ...
aircraft.hitNamed(part.NamedDamageTypes.ControlsRudderDisabled); // ... руль направления.
// Приятного полета!
}
}
}
}
}
-
Вложений: 1
Re: Полный редактор и скрипты.
Небольшой скриншот, что-бы можно было начинать пускать слюну. Разбираемся дальше в общем... :)
-
Re: Полный редактор и скрипты.
Цитата:
Сообщение от
Small_Bee
Небольшой скриншот, что-бы можно было начинать пускать слюну. Разбираемся дальше в общем... :)
Вот за то, как это удалось, скажу огромаднейшее СПАСИБО.... :)
Колись.... пожалуйста:ups:
-
Re: Полный редактор и скрипты.
М.б. Маленький Пчёл даже решится на написание небольшого, но содержательно гайда по результатам своих исследований? Если гайд будет в расчёте на не отягощённых академическими знаниями в области программирования, то я буду просто счастлив (моё вот знакомство с кодингом ограничилось, в своё время, бейсиком, да последующим ковырянием скриптов игровых серверов...).
Особенно, конечно, интересны методы реализации ветвления сюжетной линии,
сбор, обработка, отображение статистики,
сборка следующей миссии по итогам предыдущей (как-то подвижка линии фронта и потеря/занятие филдов или условия по типу: в эскадре было 20 крафтов, в вылет ушло 10, вернулось 7 = в следующей миссии всего 17 крафтов)
ветвление сюжетной линии по итогам предыдущей миссии.
Губозакатывательную машинку не предлагать =)
-
Re: Полный редактор и скрипты.
Тоже как поклонник бейсика хочу спросить насколько сложно сделать образец миссии для онлайна, чтобы по ее шаблону можно было бы делать другие онлайн миссии не углубляясь в программирование дальше копи-паст?
Например: 2 "прифронтовых" аэродрома противников, 2 тыловых аэродрома противников. Рождаются зенитные и другие бронеавтомобили, пара танков, ползут на фронтовой аэродром противника. Как только их убили, рождаются новые в другом квадрате. Регулярно рождаются бомберы, летят уничтожать танчики противника.
Для начала для онлайна будет достаточно, потом можно будет добавить склады, конвои и проч.
Насколько сложно такие скрипты написать?
-
Re: Полный редактор и скрипты.
Спасибо за исследования, очень все неплохо выглядит :)
Владею написанием скриптов для Армы, здесь вроде бы все пострашнее выглядит, точнее непонятно как и куда прописывать. Ну и список команд бы наподобие бисовской вики, очень помогло бы.
-
Re: Полный редактор и скрипты.
Пчел, а на сколько реально сделать такую вещь?
Прив посадке и выключении двигателя происходила бы перезарядка самолета. Например в течение 1-2 минуты с условием подъехать к машинке - техникам людям и т.п.- как раз время отдохнуть после вылета и успеть к новому, и заправка, и возможно мелкий ремонт но уже более длительный по времени. И например в заисимости от рембазы - разбомблена ли или нет. Эта фича была бы очень исторична, т.к. в реале истребители англии успевали сесть перезарядится и продолжить сбивать. В игре же приходится выходить при этом миссию надо запускать заново
-
Re: Полный редактор и скрипты.
Пока что я делаю выборку по интерфейсам, по доступным методам и полям, которые можно использовать непосредственно в скриптах. Вроде как гайд будет.
На счет перезарядки не уверен - так глубоко пока не копал.
Машинки и прочие танки заставить туда сюда кататься по команде можно, но судя по всему, старт наземки скриптом пока не работает (либо баг, либо что-то не так делаю). Я пытался устроить высадку десанта - подходит корабль, срабатывает триггер, рядом с кораблем появляются десантные лодки, гребут к берегу, по достижении берега на нем появляется наземка и топает вглубь континента. Однако не смотря на то, что триггеры срабатывали и выполнялись действия на рождение групп, сама группа так и не появлялась. Причем с самолетами тот же номер проходит прекрасно.
Ну и пытаюсь подключить АddIn.. Есть такая мысль, что если описать в нем класс миссии (по типу Campaign.dll), в котором бы вся инфа (или выборочно в зависимости от настроек) сливалась в лог или сразу в базу, дописать свои методы, то в скрипте можно было бы наследоваться от этого класса и не беспокоится от "учете".
Рембазы и прочее - так как класс миссии у нас вполне себе полноценный, можно написать логику какой угодно сложности. Разбомблена или нет и сколько там чего хранится и что с этим делать.
Так как формат миссия текстовый, думаю формировать их кодом будет не сильно сложнее, чем в Иле. Но, полагаю, особой необходимости в этом не будет. Все вполне можно разворачивать на одной карте без перезагрузки миссии.
-
Re: Полный редактор и скрипты.
Всёже, поясни чайнику ЧЯНТД (по поводу аддинов)
Смотри.
Создаю проект в студии, добавляю ссылку на System.Addin и на AddInView из папки боба.
Пишу вот такую простую фигню:
Код:
using System;
using System.AddIn;
namespace myaddin
{
[AddIn("MyaddinToBOB", Version = "1.0.0.0")]
public class MyAddinToBOB : maddox.Client.AddInView
{
public override void AnswerFile(string serverFileName, System.IO.Stream fileStream)
{
}
public override bool ConsoleInput(string line)
{
return true;
}
public override void Initialize(GameObject gameObj, bool isServer)
{
Console.WriteLine(gameObj.ToString() + isServer.ToString());
gameObj.ConsoleOutput("ghbdtn");
}
public override void MsgFromServer(byte[] msg)
{
}
public override void PageEnter(string page, string prevPage, string arg)
{
}
public override void PageEnterPop(string page, string prevPage, string arg)
{
}
public override void PageEnterPush(string page, string upPage, string arg)
{
}
public override void PageLeave(string page, string newPage, string arg)
{
}
public override void PageLeavePop(string page, string upPage, string arg)
{
}
public override void PageLeavePush(string page, string newPage, string arg)
{
}
public override void Terminate()
{
}
public override void UIMainOnHide()
{
}
public override void UIMainOnShow()
{
}
}
}
Дальше компиллю это в длл-ку и размещаю её в папаке ClientAddins/addins/myaddin
Пробовал и в директории с игрой, и в документах - результат 0
Сразу скажу - запускаю сервер.
До патча, отладка этого проекта (при прописывании запускаемой программы) вылетала с руганью БОБа "не хочу работать под отладчиком", после патча, вроде отладка начинается, но длл-ка эта явно не грузится в боб.
Может, я где-то крепко туплю?
-
Re: Полный редактор и скрипты.
Если к этому у референса на вью стоит Copy local = false, значит все вроде правильно. Имхо, проверить AddIn на правильность можно, нарисовав собственный хост. Это недолго.
А так, если хост не создает/обновляет файлы кэша (смотри *.store рядом со сборками конвеера), значит это фича пока отключена. У меня такие файлы были - удалил ради эксперимента, больше не появлялись.
Элемент меню делается элементарно. Во первых, из аддона через вызов соответствующих методов GameObject, а во вторых... Смотрим ...Steam\SteamApps\common\il-2 sturmovik cliffs of dover\AddIns, делаем выводы. :)
-
Re: Полный редактор и скрипты.
AddIn.store в \ClientAddIns\AddIns
и PipelineSegments.store в \ClientAddIns
присутствуют
:dontknow::dontknow:
Присутствовали :)
После удаления - ёк. :)
-
Re: Полный редактор и скрипты.
Цитата:
Сообщение от
Small_Bee
Пока что я делаю выборку по интерфейсам, по доступным методам и полям, которые можно использовать непосредственно в скриптах. Вроде как гайд будет.
На счет перезарядки не уверен - так глубоко пока не копал.
Машинки и прочие танки заставить туда сюда кататься по команде можно, но судя по всему, старт наземки скриптом пока не работает (либо баг, либо что-то не так делаю). Я пытался устроить высадку десанта - подходит корабль, срабатывает триггер, рядом с кораблем появляются десантные лодки, гребут к берегу, по достижении берега на нем появляется наземка и топает вглубь континента. Однако не смотря на то, что триггеры срабатывали и выполнялись действия на рождение групп, сама группа так и не появлялась. Причем с самолетами тот же номер проходит прекрасно.
Ну и пытаюсь подключить АddIn.. Есть такая мысль, что если описать в нем класс миссии (по типу Campaign.dll), в котором бы вся инфа (или выборочно в зависимости от настроек) сливалась в лог или сразу в базу, дописать свои методы, то в скрипте можно было бы наследоваться от этого класса и не беспокоится от "учете".
Рембазы и прочее - так как класс миссии у нас вполне себе полноценный, можно написать логику какой угодно сложности. Разбомблена или нет и сколько там чего хранится и что с этим делать.
Так как формат миссия текстовый, думаю формировать их кодом будет не сильно сложнее, чем в Иле. Но, полагаю, особой необходимости в этом не будет. Все вполне можно разворачивать на одной карте без перезагрузки миссии.
Перезарядку можно реализовать например таким способом - просто добавляется полный БК - автоматически или в меню переговоров (к примеру) или по нажатии кнопки (я так делал скрипты в арме2)
-
Re: Полный редактор и скрипты.
Цитата:
Сообщение от
Small_Bee
Машинки и прочие танки заставить туда сюда кататься по команде можно, но судя по всему, старт наземки скриптом пока не работает (либо баг, либо что-то не так делаю). Я пытался устроить высадку десанта - подходит корабль, срабатывает триггер, рядом с кораблем появляются десантные лодки, гребут к берегу, по достижении берега на нем появляется наземка и топает вглубь континента. Однако не смотря на то, что триггеры срабатывали и выполнялись действия на рождение групп, сама группа так и не появлялась. Причем с самолетами тот же номер проходит прекрасно.
Скажи, будь добр чем вызывал рождение наземки? Авиагруппы вижу, наземные - нет 8-/
-
Re: Полный редактор и скрипты.
Small_Bee,
а есть ли уже понимание, каким скриптом вызывать рождение самолета в онлайне каждые 15 или 30 минут, например? Хочу в онлайн миссию добавить.
По поводу рождения наземки, в игре есть скрипты для аэродромного транспорта (тракторов,тележек и проч.) и колонн, которые по дорогам катаются (в обучающих миссиях например). Вы эти скрипты не вскрывали? Ни в одном из них случайно не заложена функция их возрождения после уничтожения?
Кто играл в оффлайн компании, нет ли там миссий в которых что-то появляется с периодически с интервалом во времени? Хочу вскрыть и посмотреть такую.
-
Re: Полный редактор и скрипты.
-
Вложений: 1
Re: Полный редактор и скрипты.
Цитата:
Сообщение от
-atas-
Small_Bee,
а есть ли уже понимание, каким скриптом вызывать рождение самолета в онлайне каждые 15 или 30 минут, например? Хочу в онлайн миссию добавить.
По поводу рождения наземки, в игре есть скрипты для аэродромного транспорта (тракторов,тележек и проч.) и колонн, которые по дорогам катаются (в обучающих миссиях например). Вы эти скрипты не вскрывали? Ни в одном из них случайно не заложена функция их возрождения после уничтожения?
Кто играл в оффлайн компании, нет ли там миссий в которых что-то появляется с периодически с интервалом во времени? Хочу вскрыть и посмотреть такую.
Пример миссии с циклическим возрождением наземки. Колонна на колонну. Как только одна колонна гибнет, через 10 сек. рождается новая. Уничтоженные юниты убирается с глаз долой через полторы минуты после убиения. Запускать host01.mis. Класть в Dogfight. Можно в принципе и в другую папку, но тогда надо будет изменить пути к файлам миссий в скриптах. Аналогично делается и для самолетов. Вложение 132637
PS Скрипты, те, которые cpp, походу отвечают за индивидуальное поведение объекта..
-
Re: Полный редактор и скрипты.
-
Re: Полный редактор и скрипты.
Вот такое вопрос, может кто пытался. А можно ли из плагина запустить миссию? А еще лучше - а можно ли из плагина запустить миссию как хост и/или присоединиться к указанному адресу в качестве хоста. О как.
-
Re: Полный редактор и скрипты.
Цитата:
Сообщение от
tahorg
Вот такое вопрос, может кто пытался. А можно ли из плагина запустить миссию? А еще лучше - а можно ли из плагина запустить миссию как хост и/или присоединиться к указанному адресу в качестве хоста. О как.
Встречный вопрос.. А вы уже прикрутили плагин? Если прикрутили, делитесь. :)
-
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 для работы с библиотеками игры
Либо там же в скриптах есть списки методов и др., впрочем все это взято из архива Атаса.