PDA

Просмотр полной версии : Полный редактор и скрипты.



Small_Bee
08.04.2011, 20:14
Думаю такая тема назрела. Покопал немножко скрипты, основываясь на существующих кампаниях, плюс прошелся студией по некоторым сборкам.

Что мы имеем на этот момент.

Скрипт представляет собой обычный (ну или почти) 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(). Что значит "Сделать". Вуаля. Наша группа появляется и топает по маршруту.

Vetochka
08.04.2011, 20:37
Клёво! А сделай, пожалуйста, пример миссии со скриптом, если это не сложно. Например, игрок вылетает сначала против одного бота, а если его сбивает, то против него уже вылетают два бота. Я как поняла там же где и триггеры есть закладка с действиями, где можно нарисовать действие с рождением новой группы, а скриптом увязать триггер с действием.

Small_Bee
09.04.2011, 00:04
Как только разберуть, как в рантайме создавать правильно группы, так и сделаю. Пока только скажу, что это делать можно. Вообще, походу можно войну уже сейчас рисовать.. На базе только одной миссии. :) а пока потихоньку буду добавлять примеру кода, с чем разобрался.

Можем узнать, кто кому какие повреждения нанес, кто где приземлился и как, на своей территории или нет, если нет, то дистанция до линии фронта, в воду плюхнулся, в огород или на дорогу... Что выбрал куда сел... В общем там столько всего, что об этом можно было только мечтать. :)

Small_Bee
10.04.2011, 02:28
Сделал небольшую миссию как пример скрипта, типа "Выживание".
Всего три раунда и четыре противника - 3 G.50 и один мессер-асс. Бой проходит над водой, высота 3000 м. Думаю будет не сложно.
Распаковать в ...\Documents\1C SoftClub\il-2 sturmovik cliffs of dover\missions\Single
Если все нормально, в отдельных заданиях появится миссия "Выживание".

131587

Mirnyi
10.04.2011, 12:49
Угу.
Теперь понятно где находится "главный вход" :)
Я-то его искал в ClientAddin-ах.
А вопрос на засыпку можно?
В случае более-менее сложного скрипта, какие инструменты отладки можно использовать?

Small_Bee
10.04.2011, 13:00
Угу.
Теперь понятно где находится "главный вход" :)
Я-то его искал в 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;

И пишу себе спокойно, после код просто копирую в игру. Единственное убираю неймспейс моего проекта. Не самая удобная штука, но писать вполне можно.

Small_Bee
10.04.2011, 13:56
А теперь устроим небольшую диверсию :)
Пример миссии в аттаче, комментарии в коде ниже.


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); // ... руль направления.
// Приятного полета!
}
}
}
}
}

Small_Bee
10.04.2011, 15:40
Небольшой скриншот, что-бы можно было начинать пускать слюну. Разбираемся дальше в общем... :)

Mirnyi
11.04.2011, 07:00
Небольшой скриншот, что-бы можно было начинать пускать слюну. Разбираемся дальше в общем... :)
Вот за то, как это удалось, скажу огромаднейшее СПАСИБО.... :)
Колись.... пожалуйста:ups:

Ilya Kaiten
11.04.2011, 07:37
М.б. Маленький Пчёл даже решится на написание небольшого, но содержательно гайда по результатам своих исследований? Если гайд будет в расчёте на не отягощённых академическими знаниями в области программирования, то я буду просто счастлив (моё вот знакомство с кодингом ограничилось, в своё время, бейсиком, да последующим ковырянием скриптов игровых серверов...).

Особенно, конечно, интересны методы реализации ветвления сюжетной линии,
сбор, обработка, отображение статистики,
сборка следующей миссии по итогам предыдущей (как-то подвижка линии фронта и потеря/занятие филдов или условия по типу: в эскадре было 20 крафтов, в вылет ушло 10, вернулось 7 = в следующей миссии всего 17 крафтов)
ветвление сюжетной линии по итогам предыдущей миссии.

Губозакатывательную машинку не предлагать =)

-atas-
11.04.2011, 10:07
Тоже как поклонник бейсика хочу спросить насколько сложно сделать образец миссии для онлайна, чтобы по ее шаблону можно было бы делать другие онлайн миссии не углубляясь в программирование дальше копи-паст?

Например: 2 "прифронтовых" аэродрома противников, 2 тыловых аэродрома противников. Рождаются зенитные и другие бронеавтомобили, пара танков, ползут на фронтовой аэродром противника. Как только их убили, рождаются новые в другом квадрате. Регулярно рождаются бомберы, летят уничтожать танчики противника.

Для начала для онлайна будет достаточно, потом можно будет добавить склады, конвои и проч.

Насколько сложно такие скрипты написать?

podvoxx
11.04.2011, 10:33
Спасибо за исследования, очень все неплохо выглядит :)
Владею написанием скриптов для Армы, здесь вроде бы все пострашнее выглядит, точнее непонятно как и куда прописывать. Ну и список команд бы наподобие бисовской вики, очень помогло бы.

Geier
11.04.2011, 11:34
Пчел, а на сколько реально сделать такую вещь?
Прив посадке и выключении двигателя происходила бы перезарядка самолета. Например в течение 1-2 минуты с условием подъехать к машинке - техникам людям и т.п.- как раз время отдохнуть после вылета и успеть к новому, и заправка, и возможно мелкий ремонт но уже более длительный по времени. И например в заисимости от рембазы - разбомблена ли или нет. Эта фича была бы очень исторична, т.к. в реале истребители англии успевали сесть перезарядится и продолжить сбивать. В игре же приходится выходить при этом миссию надо запускать заново

Small_Bee
11.04.2011, 14:53
Пока что я делаю выборку по интерфейсам, по доступным методам и полям, которые можно использовать непосредственно в скриптах. Вроде как гайд будет.

На счет перезарядки не уверен - так глубоко пока не копал.

Машинки и прочие танки заставить туда сюда кататься по команде можно, но судя по всему, старт наземки скриптом пока не работает (либо баг, либо что-то не так делаю). Я пытался устроить высадку десанта - подходит корабль, срабатывает триггер, рядом с кораблем появляются десантные лодки, гребут к берегу, по достижении берега на нем появляется наземка и топает вглубь континента. Однако не смотря на то, что триггеры срабатывали и выполнялись действия на рождение групп, сама группа так и не появлялась. Причем с самолетами тот же номер проходит прекрасно.

Ну и пытаюсь подключить АddIn.. Есть такая мысль, что если описать в нем класс миссии (по типу Campaign.dll), в котором бы вся инфа (или выборочно в зависимости от настроек) сливалась в лог или сразу в базу, дописать свои методы, то в скрипте можно было бы наследоваться от этого класса и не беспокоится от "учете".

Рембазы и прочее - так как класс миссии у нас вполне себе полноценный, можно написать логику какой угодно сложности. Разбомблена или нет и сколько там чего хранится и что с этим делать.

Так как формат миссия текстовый, думаю формировать их кодом будет не сильно сложнее, чем в Иле. Но, полагаю, особой необходимости в этом не будет. Все вполне можно разворачивать на одной карте без перезагрузки миссии.

Mirnyi
11.04.2011, 18:54
Всёже, поясни чайнику ЧЯНТД (по поводу аддинов)
Смотри.
Создаю проект в студии, добавляю ссылку на 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
Сразу скажу - запускаю сервер.
До патча, отладка этого проекта (при прописывании запускаемой программы) вылетала с руганью БОБа "не хочу работать под отладчиком", после патча, вроде отладка начинается, но длл-ка эта явно не грузится в боб.
Может, я где-то крепко туплю?

Small_Bee
11.04.2011, 19:15
Если к этому у референса на вью стоит Copy local = false, значит все вроде правильно. Имхо, проверить AddIn на правильность можно, нарисовав собственный хост. Это недолго.
А так, если хост не создает/обновляет файлы кэша (смотри *.store рядом со сборками конвеера), значит это фича пока отключена. У меня такие файлы были - удалил ради эксперимента, больше не появлялись.

Элемент меню делается элементарно. Во первых, из аддона через вызов соответствующих методов GameObject, а во вторых... Смотрим ...Steam\SteamApps\common\il-2 sturmovik cliffs of dover\AddIns, делаем выводы. :)

Mirnyi
11.04.2011, 19:29
AddIn.store в \ClientAddIns\AddIns
и PipelineSegments.store в \ClientAddIns
присутствуют

:dontknow::dontknow:

Присутствовали :)
После удаления - ёк. :)

Geier
11.04.2011, 20:41
Пока что я делаю выборку по интерфейсам, по доступным методам и полям, которые можно использовать непосредственно в скриптах. Вроде как гайд будет.

На счет перезарядки не уверен - так глубоко пока не копал.

Машинки и прочие танки заставить туда сюда кататься по команде можно, но судя по всему, старт наземки скриптом пока не работает (либо баг, либо что-то не так делаю). Я пытался устроить высадку десанта - подходит корабль, срабатывает триггер, рядом с кораблем появляются десантные лодки, гребут к берегу, по достижении берега на нем появляется наземка и топает вглубь континента. Однако не смотря на то, что триггеры срабатывали и выполнялись действия на рождение групп, сама группа так и не появлялась. Причем с самолетами тот же номер проходит прекрасно.

Ну и пытаюсь подключить АddIn.. Есть такая мысль, что если описать в нем класс миссии (по типу Campaign.dll), в котором бы вся инфа (или выборочно в зависимости от настроек) сливалась в лог или сразу в базу, дописать свои методы, то в скрипте можно было бы наследоваться от этого класса и не беспокоится от "учете".

Рембазы и прочее - так как класс миссии у нас вполне себе полноценный, можно написать логику какой угодно сложности. Разбомблена или нет и сколько там чего хранится и что с этим делать.

Так как формат миссия текстовый, думаю формировать их кодом будет не сильно сложнее, чем в Иле. Но, полагаю, особой необходимости в этом не будет. Все вполне можно разворачивать на одной карте без перезагрузки миссии.

Перезарядку можно реализовать например таким способом - просто добавляется полный БК - автоматически или в меню переговоров (к примеру) или по нажатии кнопки (я так делал скрипты в арме2)

tahorg
13.04.2011, 21:22
Машинки и прочие танки заставить туда сюда кататься по команде можно, но судя по всему, старт наземки скриптом пока не работает (либо баг, либо что-то не так делаю). Я пытался устроить высадку десанта - подходит корабль, срабатывает триггер, рядом с кораблем появляются десантные лодки, гребут к берегу, по достижении берега на нем появляется наземка и топает вглубь континента. Однако не смотря на то, что триггеры срабатывали и выполнялись действия на рождение групп, сама группа так и не появлялась. Причем с самолетами тот же номер проходит прекрасно.


Скажи, будь добр чем вызывал рождение наземки? Авиагруппы вижу, наземные - нет 8-/

-atas-
15.04.2011, 12:56
Small_Bee,

а есть ли уже понимание, каким скриптом вызывать рождение самолета в онлайне каждые 15 или 30 минут, например? Хочу в онлайн миссию добавить.

По поводу рождения наземки, в игре есть скрипты для аэродромного транспорта (тракторов,тележек и проч.) и колонн, которые по дорогам катаются (в обучающих миссиях например). Вы эти скрипты не вскрывали? Ни в одном из них случайно не заложена функция их возрождения после уничтожения?

Кто играл в оффлайн компании, нет ли там миссий в которых что-то появляется с периодически с интервалом во времени? Хочу вскрыть и посмотреть такую.

-atas-
16.04.2011, 12:58
Скриптик http://www.sukhoi.ru/forum/showthread.php?t=67964&p=1598188&viewfull=1#post1598188

Small_Bee
20.04.2011, 01:29
Small_Bee,

а есть ли уже понимание, каким скриптом вызывать рождение самолета в онлайне каждые 15 или 30 минут, например? Хочу в онлайн миссию добавить.

По поводу рождения наземки, в игре есть скрипты для аэродромного транспорта (тракторов,тележек и проч.) и колонн, которые по дорогам катаются (в обучающих миссиях например). Вы эти скрипты не вскрывали? Ни в одном из них случайно не заложена функция их возрождения после уничтожения?

Кто играл в оффлайн компании, нет ли там миссий в которых что-то появляется с периодически с интервалом во времени? Хочу вскрыть и посмотреть такую.

Пример миссии с циклическим возрождением наземки. Колонна на колонну. Как только одна колонна гибнет, через 10 сек. рождается новая. Уничтоженные юниты убирается с глаз долой через полторы минуты после убиения. Запускать host01.mis. Класть в Dogfight. Можно в принципе и в другую папку, но тогда надо будет изменить пути к файлам миссий в скриптах. Аналогично делается и для самолетов. 132637

PS Скрипты, те, которые cpp, походу отвечают за индивидуальное поведение объекта..

-atas-
20.04.2011, 01:37
Спасибо!!

tahorg
20.04.2011, 19:00
Вот такое вопрос, может кто пытался. А можно ли из плагина запустить миссию? А еще лучше - а можно ли из плагина запустить миссию как хост и/или присоединиться к указанному адресу в качестве хоста. О как.

Small_Bee
20.04.2011, 21:28
Вот такое вопрос, может кто пытался. А можно ли из плагина запустить миссию? А еще лучше - а можно ли из плагина запустить миссию как хост и/или присоединиться к указанному адресу в качестве хоста. О как.

Встречный вопрос.. А вы уже прикрутили плагин? Если прикрутили, делитесь. :)

tahorg
22.04.2011, 14:01
Фигушки, не цепляет ... хотя я пока не сказать что особо пытался - к стыду своему я мало с WPF работал, видимо прийдется, так что много не пробовал, инетрес на будущее. Но вообще, как я понимаю все в GameObject.MsgToServer(byte[] msg);, никаких иных методов воздействия на игру из плагина я не вижу, вот только осталось вытрясти засамизнаетекого форматы этих команд/сообщений.

Small_Bee
22.04.2011, 14:09
Фигушки, не цепляет ... хотя я пока не сказать что особо пытался - к стыду своему я мало с WPF работал, видимо прийдется, так что много не пробовал, инетрес на будущее. Но вообще, как я понимаю все в GameObject.MsgToServer(byte[] msg);, никаких иных методов воздействия на игру из плагина я не вижу, вот только осталось вытрясти засамизнаетекого форматы этих команд/сообщений.

Вот и я о том же... Имхо, пока эта фича либо отключена совсем, либо игра как-то фильтрует аддоны.. Так что ждем-с...

Small_Bee
23.04.2011, 00:59
С новым патчем появилась возможность отслеживать статики артиллерию. Как слушать миссии мы знаем. Уже лучше...

Mirnyi
23.04.2011, 08:25
Фигушки, не цепляет ... хотя я пока не сказать что особо пытался - к стыду своему я мало с WPF работал, видимо прийдется, так что много не пробовал, инетрес на будущее. Но вообще, как я понимаю все в GameObject.MsgToServer(byte[] msg);, никаких иных методов воздействия на игру из плагина я не вижу, вот только осталось вытрясти засамизнаетекого форматы этих команд/сообщений.
Мне удалось подцепить.
С кучей оговорок
1. пространство имён нужно задать maddox
2. Класс назвать ClientAddIn
3. длл-ку положить в папку DefaultAddIn
Вобщем, всё это чтобы вместо ClientAddIn.dll из поставки игры подсунуть свою. Из других мест не подхватывает, с другим именем тоже.
Но это не самое главное.
Самое главное то, что цепляется она только в момент создания сервера из игры - на выделенном сервере не работает.
Остаётся проверить можно ли в неё запихнуть что-то, что будет отслеживать события миссии и сервера, хотя без работы её на выделенном сервере смысла особого не вижу.

Small_Bee
23.04.2011, 11:49
Мне удалось подцепить.
С кучей оговорок
1. пространство имён нужно задать maddox
2. Класс назвать ClientAddIn
3. длл-ку положить в папку DefaultAddIn
Вобщем, всё это чтобы вместо ClientAddIn.dll из поставки игры подсунуть свою. Из других мест не подхватывает, с другим именем тоже.
Но это не самое главное.
Самое главное то, что цепляется она только в момент создания сервера из игры - на выделенном сервере не работает.
Остаётся проверить можно ли в неё запихнуть что-то, что будет отслеживать события миссии и сервера, хотя без работы её на выделенном сервере смысла особого не вижу.

Круто! По крайней мере можно начинать эксперименты. Сто пудово, игра просто фильтрует аддоны сейчас.

Mirnyi
23.04.2011, 19:21
Да ничего крутого.
Для меня это оказалось ещё одним тупиком. Мне нужно добраться до управления выделенным сервером и до информации от него.
Клиентские аддины не грузятся в режиме выделенного сервера.
Попытался зацепиться через launcher.exe.config - та же ботва - при запуске игры вроде подгружается длл-ка (но отладчик говорит что "машинных символов в файле нет"), при запуске сервера - нет. Остаётся ещё один путь - разобраться с тем как подключаются дополнительные части (parts), но тут вообще не пойму как подступиться - видимо, список частей зарыт где-то прямо в коде (как и путь, и "фамилия" ClientAddIn).
Вобщем, чем дальше ковыряю, тем больше впечатление, что либо я - совсем дурак, либо по части расширяемости там всё ещё сырее, чем по остальному.
Реально управлять сервером с миссиями, похоже, пока можно только через скрипты, а это только половина дела - вторую половину (старт сервера и запуск битвы) - пока только через консоль.
А с учётом того, что скрипты ещё и отладке не поддаются - вообще ж..па.
И тишина от разрабов, похоже, не из-за "режима секретности", а именно из-за того, что толком ещё не определились как это всё реализовывать - куча точек "входа"(скрипты, аддоны, аддины, part-ы, консоль...) и все ущербные.

-atas-
28.04.2011, 01:42
Вроде работает на сервере 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();
});
}
}

-atas-
03.05.2011, 12:09
Выкладывали на 1С исправленную версию, которая включает в скрипт сервер, т.к. изначально сервер не входит GamePlay.gpRemotePlayers() http://forum.1cpublishing.eu/showpost.php?p=276921&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);
});
}
}

-atas-
05.05.2011, 19:42
Задача - вывести на экран 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!");
});
}

naryv
05.05.2011, 20:34
Задача - вывести на экран 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!");
});
}

2GvShAD_Jah
09.05.2011, 13:17
Скажите, пожалуйста, есть ли возможность подключения в скриптах других сборок из gac, например System.Web.Services?

Допустим я хочу сохранять логи на удаленную машину или "получать из космоса" команды на выполнение взамен на события?

Small_Bee
09.05.2011, 14:02
Скажите, пожалуйста, есть ли возможность подключения в скриптах других сборок из gac, например System.Web.Services?
Допустим я хочу сохранять логи на удаленную машину или "получать из космоса" команды на выполнение взамен на события?

По-моему все можно подключать.. WebClient по крайней мере работает.

2GvShAD_Jah
09.05.2011, 14:13
Ок, буду пробовать.

Rasim
24.06.2011, 00:00
Судя по всему объект "Локальная погода" не работает? Что-то я не увидел его результатов.

Small_Bee
05.09.2011, 16:40
Большая уборка.

Пара примеров организации подмиссий с точки зрения борьбы с захламлением битвы.

1. Dogfight_01. Хост загружает подмиссию только один раз. Все остальные задачи подмиссия выполняет сама. В данном случае подмиссия загружает сама себя каждые n-секунд, предварительно удалив "старые" объекты. ключевой момент - метод ClearOwnActors(int _MissionNumber). Именно он занимается удалением объектов перед загрузкой нового экземпляра миссии.
2. Dogfight_02. Тот же самый сценарий, но подмиссии не имеют скриптов вообще. Удалением трупиков и старых объектов занимается исключительно хост. Ключевой момент - метод DestroyMissionActors(int _MissionNumber = -1). Это доработанный ClearOwnActors, вызвав его без параметров, мы уничтожим вообще все объекты в миссии.

PS. В миссиях есть танки, артиллерия, самолеты и корабли. Всё удаляется как полагается.

Small_Bee
05.09.2011, 17:28
А самих игроков тоже удалит? Вот пробовал вчера по образу Dogfight_01, наземка удалялась, спасибо. Dogfight_02 буду посмотреть :)

--- Добавлено ---

Смотрю Dogdfight_02. Интересно, до этого думал, что MissionNumberListener = -1 это только для "прослушки" триггеров в подмиссиях...

--- Добавлено ---

Вот пробовал вчера к подмиссиям .cs приписывать, чтобы там указать подчистку объектов и делать перезагруз самой себя, ты как-то высказывал такую идею, что чистится лучше если и рождение, и чистка в одной подмиссии. К сожалению все постер, не могу привести, но в-общем не получилось с перезагрузкой миссии, хотя по одному разу загружались. Отталкивался в целом от Dogfight_01, только в подмиссиях делал еще перезагруз по тикам. Но оставил старый принцип, похожий как в Dogfight_02: т.е. миссия загружает по тикам подмиссии, а уже в .cs к ним указать подчистку объектов. Ну, в принципе, можно как у тебя сделать подчистку в .cs к основной миссии, а тогда .cs подмиссий вообще можно удалить за ненадобностью.

Тики в подмиссиях имхо хреновая идея. попробуй в 01 убрать проверку в OnMissionLoaded на номер миссии, и посмотри что получится. Я сдуру включил ускорение, боб здох за 5 сек. :) От, имхо, то же самое будет.

Грузить из хоста, а чистить из подмиссии - немного не понял. А как подмиссия узнает, что чистится пора?

Small_Bee
06.09.2011, 12:04
Да я тогда неправильно твою идею понял, думал, что возрождение и чистка должно быть в одной подмиссии. Ну и ничего из этого соответственно не вышло, кроме загрузки миссии по одному разу. А чистка вроде срабатывала, хотя долго не имел возможности погонять. А тики у тебя самого же вроде стоят? Вот кусок 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 штук. И так далее до бесконечности. Вот то же самое будет, если миссии дать возможность грузить саму себя по тикам.

В приведенном тобой куске кода хост был загружен только один раз, и больше я его не трогаю. Поэтому смело юзаю тики и прочее.

-atas-
06.09.2011, 15:59
Да, и можно ли чистить севшие боты-бомберы? А то их скапливается просто бешенное количество.

Убирает после вынужденной и после посадки через 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); }
);
}

Small_Bee
06.09.2011, 16:05
Это вот это:
private void DestroyMissionActors(int _MissionNumber = -1)
Т.е. если убрать -1 , то произойдет перезагруз миссии?

Не надо ничего убирать. Просто вставить в нужном месте вот такую строку:


DestroyMissionActors();

У мну такое чувство, что примеры вообще не смотрелись. Как только вы загрузите новую миссию с бобрами, все старые бобры, живые или мертвые, в воздухе или в ангаре, исчезнут.

Кстати со статиками, за исключением рабочей артиллерии, мы вообще ничего сделать не можем. К огромному сожалению

Small_Bee
07.09.2011, 00:06
Точно, Dogfight_01 загрузился только брифинг (карта), зайти так и не удалось. Dogfight_02 еще не успел посмотреть, только скрипты. :)


Если нет кнопки летать (это если в сингле или в редакторе запускаешь без назначенного игроку самолета) - нажми ескейп - там в меню будет "Летать". Вуаля.

SlavikSG
21.11.2011, 15:34
В моем пробном тестовом сценарии миссии, одна зенитка гасит другую зенитку (спавнятся они умышленно рядышком).

Имеем вот такую часть кода:

//---------------------------------------------------------------------------------
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");
});
}

}
//---------------------------------------------------------------------------------
Как именно в этой части кода можно определить какая именно зенитка была подбита? Красная или Синяя? Или как это сделать другим кодом? Я делал это создавая тригер на нужную зенитку. Получалось. Но мне это показалось слишком громоздким.

-atas-
21.11.2011, 19:23
Можно попробовать if (actor.Army() == 1) - значит красные
== 2 - значит синие

Но я такое использовал только с player, но не с actor. В примерах naryv можно ".Army" поискать.
Вот здесь все примеры в одном архиве http://forum.1cpublishing.eu/showthread.php?t=26523

SlavikSG
23.11.2011, 15:41
Можно попробовать 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"

Small_Bee
23.11.2011, 16:01
Большое спасибо! Это реально работает и реально сильно помогло. Но сразу возникает следующий вопрос...

Имеем:"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(). Опять же, посёрфив по сборкам, можем найти еще много интересного.

podvoxx
23.11.2011, 16:04
Большое спасибо! Это реально работает и реально сильно помогло. Но сразу возникает следующий вопрос...
Как продолжить этот список? Где народ берет эту инфу? Ну, чтобы в будущем не мучить народ вопросами, а искать самому.


Либо так (у меня с VS сплошные проблемы, утановился только 2008-й и работает только С++) подключив библиотеки боба, в которых есть все команды и методы:
Настройка среды разработки Visual Studio для работы с библиотеками игры (http://wiki.sukhoi.ru/index.php?title=%D0%98%D0%BB-2_%D0%A8%D1%82%D1%83%D1%80%D0%BC%D0%BE%D0%B2%D0%B8%D0%BA:_%D0%91%D0%B8%D1%82%D0%B2%D0%B0_%D0%B7%D0%B0_%D0%91%D1%80%D0%B8%D1%82%D0%B0%D0%BD%D0%B8%D1%8E._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B._%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F)
Либо там же в скриптах есть списки методов и др., впрочем все это взято из архива Атаса.

SlavikSG
24.11.2011, 13:35
...тип получаем через InternalTypeName()
Ага. Спасибо! Реализовать это свойство удалось в такой части кода:

Zena = (actor as AiCart).InternalTypeName().ToString();

if (actor.Army() == 1 && Zena == "bob:Artillery.Krupp_L2H43_Protze_Flak38")
{
Red_Zenitka_Killed++;
Sss("Количество подбитых красных зениток стало равно: " + Red_Zenitka_Killed.ToString());
}
Странно только то, что условие правильно работает лишь тогда, когда я этот (actor as AiCart).InternalTypeName().ToString() предварительно загоняю в переменную Zena. Ну, да это ладно. Пашет и слава Богу!

Другой вопрос. Имеем такую миссию.
[Stationary]
Static81 Aeroanchored.Balloon_winch_GER1 de 29244.30 15856.53 0.00 /hstart 20/hend 200
Static82 Artillery.Krupp_L2H43_Protze_Flak38 de 29246.27 15871.57 0.00 /timeout 0/radius_hide 0
...

При достижении в "Битве" некого условия, нужно все эти объекты из миссии уничтожить и загрузить заново (из той же миссии). Объекты при этом могут быть в трех состояниях. Целая зенитка, подбитая (дымящаяся зенитка) и уже удаленная зенитка. То есть пустое место. Аэростаты пока в двух состояниях. Целые и подбитые (удалять подбитые еще не научился).

Как удалить с карты все эти объекты разом? И зенитки и аэростаты.
Находил кое-какие примеры, но чет мне это показалось очень сложным. :(
Тем более, что у меня там не группы. А просто отдельные объекты, стоящие на охране ВПП.

-atas-
24.11.2011, 20:17
В примерах naryv загружает и удаляет зенитки в определенном радиусе от маркера.

Видимо проще загружать отдельную подмиссию только с этими объектами и удалять соответственно только объекты этой подмиссии. Примеры скриптов actor destroy есть в архиве (папка _actors destroy ).

SlavikSG
25.11.2011, 10:42
Да нет же! Там все не то. Там по событию OnActorCreated на каждого вновь созданного актора заводится свой личный таймер. Этот свой личный уникальный таймер помнит каждого своего актора по его имени (ну, или еще как-то там). Когда подходит срок кончины актора, то таймер, постоянно зная и не забывая своего родного актора, убивает его.

Вот код из тех примеров:

public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber, shortName, actor);

//Ground objects will die after 55 min when counted from their birth
if (actor is AiGroundActor)
Timeout(3300, () =>
{
if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);
}


У меня в миссии вообще нет таймеров. Мне это не нужно и не интересно. Созданные мною объекты - "Артиллерия", существуют бесконечно долго. Скажем, в ходе битвы половина будет уничтожена, другая половина останется. Сработает некое условие. По моей задумке и сценарию, этим условием будет являться убиение шести вражеских зениток на любых ВПП противника. Как только это будет сделано, условие срабатывает и подмиссия, ответственная за загрузку зениток на ВПП, загружает в виде бонуса, для выигрывавшей стороны, новые зенитки на всех дружественных ВПП. Но прежде, чем загрузить новые зенитки, нужно убить все оставшиеся старые зенитки (которые еще не были подбиты или которые еще только догорают). Ну, чтобы не было каши. Чтобы одна зенитка не становилась на другую зенитку.

От Small_Bee есть замечательный пример чистки всего того, что есть в миссиях циклами "foreach".
Пример...
Сканируем все существующие армии в битве:
foreach (int army in GamePlay.gpArmies())
В тело этого основного цикла вкладываем цикл по перебору всех существующий групп в этих армиях:
foreach (AiAirGroup group in airGroups)
И уже в тело этого цикла вкладываем последний цикл по перебору всех акторов в группе:
foreach (AiActor actor in group.GetItems())

И все бы хорошо. Но у меня в миссии нет групп!!! У меня есть отдельно стоящие объекты типа "Артиллерия". Которые группами не являются. Вот я и не пойму, как мне циклом, или не циклом, перебрать все эти объекты и удалить их.


...Видимо проще загружать отдельную подмиссию только с этими объектами...
Разумеется так и делаю. Одна подмиссия грузит все Синие зенитки на всех ВПП Синих, другая грузит Красные...


...и удалять соответственно только объекты этой подмиссии.
Как это сделать???!!! :)

Small_Bee
25.11.2011, 13:28
Акторов без групп надо только запоминать. Или если ты точно помнишь их имена и номера миссий, в которых они загружены. Никаким перебором ты их не найдешь.

Т.е. по OnActorCreated и если группа null, запоминаешь их полные имена где-то в списке. Перед загрузкой миссии смотришь след. номер миссии, е если параметре к OnActorCreated будет этот номер - значит твой клиент. Соотв., если хочешь их удалить, пробегаешься по списку, и которые еще живы, убираешь.

В "Морском льве" этим рулит спец. класс. И у него есть методы (грубо) SetMisFileName(), Load() и Unload() (Перед вызовом Load к примеру он сам вызывает Unload и прибирается). Т.е. достаточно рулить только экземпляром класса, вся механика скрыта в нем, очень удобно. Там еще куча всего вроде отложенной загрузки, нотификации о том, что все акторы померли и т.д. Т.е. можно дополнять дальше соотв. своих требованиям.

В твоем случае можно сделать что-то вроде класса Батарея, экземпляры которого сами будут следить за состоянием своих орудий и предоставлять информацию о них вовне, Батареи объединить скажем в Дивизион, который смотрит за состоянием батарей. Так мы уходим от необходимости следить за каждой мордой отдельно, а разговаривать уже непосредственно как бы с "командирами" верхнего уровня. И микроменеджмент батарей и дивизионов переложить на них и младших, и не беспокоится об этом.

-atas-
25.11.2011, 13:55
Да нет же! Там все не то. Там по событию OnActorCreated на каждого вновь созданного актора заводится свой личный таймер.
Я же не говорил, что это нужно OnActorCreated делать. Можно и onTrigger. (В миссиях naryv зенитки по триггеру захвата маркера удаляются)

А перебирать можно не только группы, но и акторов (поискать в примерах foreach actor in ... или типа того) емнип.

SlavikSG
25.11.2011, 14:43
...Т.е. по OnActorCreated и если группа null, запоминаешь их полные имена где-то в списке. Перед загрузкой миссии смотришь след. номер миссии, е если параметре к OnActorCreated будет этот номер - значит твой клиент. Соотв., если хочешь их удалить, пробегаешься по списку, и которые еще живы, убираешь.


Эх! Мне бы все тоже самое, только с небольшим примером. Номер миссии - это я понял. А какое имя запоминать? "Actor.Name()"? И потом, когда я запомню это самое строковое имя и номер миссии, как узнать, какой это будет потом "actor"? Ведь функция Destroy(), как я понял, работает только зная сам объект "actor", а не его строковое имя в миссии. Если я не прав, то очень бы хотел знать, как зная только строковое имя актора и номер мисси, можно применить функцию Destroy(). Ни в одном примере я не смог найти ничего, кроме такого написания:
(actor as AiGroundActor).Destroy();
Очень бы хотелось написать вот так: "Static4".Destroy(); Но это, естественно, работать не будет.

Какой список имен создавать? Некий двумерный массив или может быть справочник "Dictionary". Или еще что-то, более удобное?


...В твоем случае можно сделать что-то вроде класса Батарея...
Ой, нет! Спасибо! :)
Это точно не мой случай. В ООП я не секу совершенно. Не тот уровень подготовки. А с этим C# (с его невероятно сложным и малопонятным синтаксисом) вообще столкнулся впервые.


...А перебирать можно не только группы, но и акторов (поискать в примерах foreach actor in ... или типа того)...
Неа! Бесполезно. Не смог найти. Похоже, что этого и нет вовсе. :(

-atas-
25.11.2011, 14:52
Перед загрузкой миссии смотришь след. номер миссии

А как его узнать и запомнить? Например, у меня в Степях может одновременно крутиться 3 одинаковых подмиссии с соответственно одинаковыми именами триггера. Мне нужно проверять триггер какой из подмиссии сработал, чтобы считать счет для каждой подмиссии (чтобы не путаться). OnTrigger я могу перебрать все активные миссии и проверить, if (missionnumber == x) но вот где получить х? Самому вручную считать при загрузке каждой подмиссии x = ++ ? Но возможно missionnumber, который присутствует в OnTrigger в каком-то своем внутреннем формате считается?

Т.е. другими словами missionnumber из OnTrigger - это некая внутренняя вещь БзБ или я могу эти номера сам назначать перед загрузкой каждой подмиссии?

--- Добавлено ---



Неа! Бесполезно. Не смог найти. Похоже, что этого и нет вовсе. :(

В cross_roundel миссии naryv:


foreach (AiGroundGroup gg in GamePlay.gpGroundGroups(army))
{
if (gg != null)
if (gg.Pos().distance(ref AirportPos) < 2000)
{
string triggerName = gg.Name().Substring(0,gg.Name().IndexOf(":"))+":"+markerNum.ToString()+"_" + army .ToString()+ "_attack";
AiTrigger trigger = GamePlay.gpGetTrigger(triggerName);
if (trigger != null) trigger.Enable = false;
foreach (AiActor ggActor in gg.GetItems())
{ if ((ggActor as AiGroundActor) != null)
(ggActor as AiGroundActor).Destroy();
}
}
}

В других его миссиях тоже есть при похожих обстоятельствах но в других видах (отдельно для артиллерии и танков емнип).

edit
Там еще 2я часть интересная, как раз про артиллерию с перебором статиков.

private void DestroyEnemyAtCaptured(int markerNum, int army)
{
Point3d AirportPos;
AirportPos.x = MissionMarkers[markerNum].x;
AirportPos.y = MissionMarkers[markerNum].y;
AirportPos.z = 1;

foreach (AiGroundGroup gg in GamePlay.gpGroundGroups(army))
{
if (gg != null)
if (gg.Pos().distance(ref AirportPos) < 2000)
{
string triggerName = gg.Name().Substring(0,gg.Name().IndexOf(":"))+":"+markerNum.ToString()+"_" + army .ToString()+ "_attack";
AiTrigger trigger = GamePlay.gpGetTrigger(triggerName);
if (trigger != null) trigger.Enable = false;
foreach (AiActor ggActor in gg.GetItems())
{ if ((ggActor as AiGroundActor) != null)
(ggActor as AiGroundActor).Destroy();
}
}
}

for (int i = 0; i < MissionsCount; i++)
{
AiGroundActor curActor;
for (int j = 0; j < 10; j++)
{
string nameActor = i.ToString() + ":Static" + j.ToString();
curActor = GamePlay.gpActorByName(nameActor) as AiGroundActor;
if (curActor != null)
{
if ( (curActor.Army() == army) &&
(curActor.Pos().distance(ref AirportPos) < 2000) &&
((curActor.Type() == AiGroundActorType.AAGun)||(curActor.Type() == AiGroundActorType.Artillery) )
)
{
curActor.Destroy();
}
}

}
}
}

Small_Bee
25.11.2011, 15:07
Эх! Мне бы все тоже самое, только с небольшим примером. Номер миссии - это я понял. А какое имя запоминать? "Actor.Name()"? И потом, когда я запомню это самое строковое имя и номер миссии, как узнать, какой это будет потом "actor"? Ведь функция Destroy(), как я понял, работает только зная сам объект "actor", а не его строковое имя в миссии. Если я не прав, то очень бы хотел знать, как зная только строковое имя актора и номер мисси, можно применить функцию Destroy(). Ни в одном примере я не смог найти ничего, кроме такого написания:
(actor as AiGroundActor).Destroy();
Очень бы хотелось написать вот так: "Static4".Destroy(); Но это, естественно, работать не будет.

Какой список имен создавать? Некий двумерный массив или может быть справочник "Dictionary". Или еще что-то, более удобное?


Ой, нет! Спасибо! :)
Это точно не мой случай. В ООП я не секу совершенно. Не тот уровень подготовки. А с этим C# (с его невероятно сложным и малопонятным синтаксисом) вообще столкнулся впервые.


Неа! Бесполезно. Не смог найти. Похоже, что этого и нет вовсе. :(

Если не ошибаюсь, есть метод GamePlay.gp(Get?)ActorByName(...), вроде так. Который позволяет получить актора по его полному имени, или вернет null, если актор не найден, соответственно после можно применить Destroy(). Напоминаю, полное имя актора выглядит как "номер миссии":"короткое имя". Для жонглирования именами используется стат. класс ActorName. Например, почти каждый метод возвращает номер миссии и короткое имя, можно с помощью ActorName получить из них правильно полное имя. AiActor.Name() возвращает полное имя.

Список какой будет удобнее, конечно.
Знаний ООП хватит и базовых, литературы масса. Синтаксис C# весьма несложный, тем более почти один в один с плюсов или PHP.

--- Добавлено ---


А как его узнать и запомнить? Например, у меня в Степях может одновременно крутиться 3 одинаковых подмиссии с соответственно одинаковыми именами триггера. Мне нужно проверять триггер какой из подмиссии сработал, чтобы считать счет для каждой подмиссии (чтобы не путаться). OnTrigger я могу перебрать все активные миссии и проверить, if (missionnumber == x) но вот где получить х? Самому вручную считать при загрузке каждой подмиссии x = ++ ? Но возможно missionnumber, который присутствует в OnTrigger в каком-то своем внутреннем формате считается?

Т.е. другими словами missionnumber из OnTrigger - это некая внутренняя вещь БзБ или я могу эти номера сам назначать перед загрузкой каждой подмиссии?

Нет, назначать не можешь, но есть метод NextMissionNumber(), правда где именно (миссия, Battle или gamePlay) не помню. Опять же, отсылка к лёве, там это есть.

SlavikSG
25.11.2011, 15:12
Да нет же! Это опять же поиск в группе:

foreach (AiGroundGroup gg in GamePlay.gpGroundGroups(army))
...
foreach (AiActor ggActor in gg.GetItems())

У меня нет групп.

Small_Bee
25.11.2011, 15:12
edit
Там еще 2я часть интересная, как раз про артиллерию с перебором статиков.

Тут некая эмуляция перебора, исходя из предположения, что имена статиков руками не менялись. Т.е. мы последовательно перебираем диапазон возможных имен, если кто с таким именем попадается, то работаем с ним. Т.е. нам придется сделать M*N итераций, где M - количество миссий, N - макс. кол-во статиков в миссии. Даже не кол-во, а макс. номер статика. Например, если у нас будет два статика - Static0 и Static99, N будет не 2, а 100.

2 SlavikSG
Вот кстати и получение актора по имени
curActor = GamePlay.gpActorByName(nameActor) as AiGroundActor;

-atas-
25.11.2011, 15:41
Да нет же! Это опять же поиск в группе:

foreach (AiGroundGroup gg in GamePlay.gpGroundGroups(army))
...
foreach (AiActor ggActor in gg.GetItems())

У меня нет групп.

Если я правильно понимаю, то каждая зенитка - это группа, состоящая из одного актора, т.е. группы есть у всех, у кого есть акторы. Иначе откуда у naryv могут взяться группы зениток???

Small_Bee
25.11.2011, 15:48
Если я правильно понимаю, то каждая зенитка - это группа, состоящая из одного актора, т.е. группы есть у всех, у кого есть акторы. Иначе откуда у naryv могут взяться группы зениток???

Нет, зенитка\артиллерия - это актор без группы. У Ильи соотв. также нет групп зениток, он перебирает поименно всех возможных статиков, если статик окажется зениткой или пушкой, прибивает.

SlavikSG
25.11.2011, 15:57
... Вот кстати и получение актора по имени
curActor = GamePlay.gpActorByName(nameActor) as AiGroundActor;
Ага. Я уже нашел в примерах. Это наконец-то сработало. Большое спасибо! :)
Bbb = GamePlay.gpActorByName(ActorName.Full(2, "Static4")); //Где "двойка" это номер миссии
Теперь начну ковыряться дальше...


Если я правильно понимаю, то каждая зенитка - это группа, состоящая из одного актора...
Я понял, о чем ты. Но у меня не так.

P.S.
Не знаю, вопрос в тему или нет. А правда, что у зениток, находящихся в группе, заканчиваются патроны? :)

Small_Bee
25.11.2011, 16:01
Ага. Я уже нашел в примерах. Это наконец-то сработало. Большое спасибо! :)
Bbb = GamePlay.gpActorByName(ActorName.Full(2, "Static4")); //Где "двойка" это номер миссии
Теперь начну ковыряться дальше...


Я понял, о чем ты. Но у меня не так.

P.S.
Не знаю, вопрос в тему или нет. А правда, что у зениток, находящихся в группе, заканчиваются патроны? :)

Да. Интерфейсов для перезарядки пока нет, т.е. надо удалить старую и поставить новую.

SlavikSG
25.11.2011, 16:12
Да. Интерфейсов для перезарядки пока нет, т.е. надо удалить старую и поставить новую.
Ага. Видимо я поэтому и уперся рогом именно в тип наземки "Артиллерия", а не "Броня". :)

SlavikSG
28.11.2011, 14:13
В ходе работы над скриптом, возник вопрос такого плана. Имеем событие убиения зенитки. После чего стразу удаляем ее трупик. Пишем такой код:

public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
{
base.OnActorDead(missionNumber, shortName, actor, damages);
if (actor is AiGroundActor)
{
(actor as AiGroundActor).Destroy();
Sss("Удалили красную зену: " + actor.Name());
}
}
и получаем стопроцентную ошибку. :(

Но если пишем все в точности так же, но делаем задержку в одну секунду, то никакой ошибки не возникает.

public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
{
base.OnActorDead(missionNumber, shortName, actor, damages);
if (actor is AiGroundActor)
{
Timeout(1, () =>
{
(actor as AiGroundActor).Destroy();
Sss("Удалили красную зену: " + actor.Name());
});
}
}

Почему такое происходит??? Получается, что нужно всегда делать задержку?

SlavikSG
28.11.2011, 22:50
и получаем стопроцентную ошибку. :(

Небольшое дополнение...
В логе сервера пишется ошибка, но зенитка все равно исправно удаляется.
(это я выяснил уже потом)

naryv
28.11.2011, 23:37
В ходе работы над скриптом, возник вопрос такого плана. Имеем событие убиения зенитки. После чего стразу удаляем ее трупик. Пишем такой код:

public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
{
base.OnActorDead(missionNumber, shortName, actor, damages);
if (actor is AiGroundActor)
{
(actor as AiGroundActor).Destroy();
Sss("Удалили красную зену: " + actor.Name());
}
}
и получаем стопроцентную ошибку. :(

Но если пишем все в точности так же, но делаем задержку в одну секунду, то никакой ошибки не возникает.

public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
{
base.OnActorDead(missionNumber, shortName, actor, damages);
if (actor is AiGroundActor)
{
Timeout(1, () =>
{
(actor as AiGroundActor).Destroy();
Sss("Удалили красную зену: " + actor.Name());
});
}
}

Почему такое происходит???
Вы уничтожаете объект (actor as AiGroundActor).Destroy(); а затем - пытаетесь получить его имя - actor.Name(). Если актор уже успел задестроиться, то Вы пытаетесь получить .Name() от null-a, что даст ошибку естественно. С таймаутом дестрой может позже произойти поэтому ошибки не будет.
Можно сделать что-то типа этого -

public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
{
base.OnActorDead(missionNumber, shortName, actor, damages);
if (actor is AiGroundActor)
{
string actorName = actor.Name();
(actor as AiGroundActor).Destroy();
if (actor == null)
Sss("Удалили красную зену: " + actorName);
}
}

SlavikSG
29.11.2011, 11:29
Не-не-не!!! Сори!
Я этой функцией вывода вспомогательного сообщения, только ввел вас в заблуждение.
Все! Забыли про Sss("Удалили красную зену: " + actorName); Дело вовсе не в этом. Ошибка есть так или иначе. Вот код без этой функции и ошибка все равно возникает:

public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
{
base.OnActorDead(missionNumber, shortName, actor, damages);
if (actor is AiGroundActor)
{
(actor as AiGroundActor).Destroy();
}
}

Проверил только что еще раз. Ошибка есть. И нет ошибки, если проделать все тоже самое, но с секундной задержкой.
Но подчеркиваю: И в том и в этом случае, зенитка все равно нормально удаляется.

Ошибка возникает такая:

=================================================
System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
в C73nDcVHkfNlG1HRmmb.RW57KCVWohHyXJ5krUt.ydxsYS7apyu(d19kQTbEvXhjHykyf8d , dICXoRXk7y7vkkUvR4v , Int16 , Boolean )
в 12oB5s7LiQTBW7EtP2V.n61Vjl7SllEshhqKbYQ.kHlBq45JnvX(oXNPnT8Hh3UKJa6ZZy , SUsxEiF3QjXTYkAujT1 , B75N63VkDk3IVOC1G3Q , GPYJGEs07NMqUYFIJRN , Double& )
в C73nDcVHkfNlG1HRmmb.RW57KCVWohHyXJ5krUt.msgShot(SUsxEiF3QjXTYkAujT1 )
в H9k668FBsuD6ndx8Z0w.SUsxEiF3QjXTYkAujT1.P0colRfLS3u(SUsxEiF3QjXTYkAujT1 )
в H9k668FBsuD6ndx8Z0w.SUsxEiF3QjXTYkAujT1.X7cYOeKBYyql3jthiEO0(Object )
в H9k668FBsuD6ndx8Z0w.SUsxEiF3QjXTYkAujT1.Tm6oln8qMcy(d19kQTbEvXhjHykyf8d , Tujx1nWZkdCL5iBIZk , String , Point3d& , Vector3d& , Double , Double , b5X4V3c4exFtE9L5FjX , Double , bV5YXhceO4t4hjKDLyi )
в iTQ2F3BmBVt9SCk6mLU.ZwK9QMBBEsmk1BR0vEh.cujSBu15Yef(Tujx1nWZkdCL5iBIZk , String )
в ni37tVPHruIq9NlxXSS.U44P7gPWjvHAMLK3Rv5.pkis5BedngrRoylBJHRX(Object , Object , Object )
в ni37tVPHruIq9NlxXSS.U44P7gPWjvHAMLK3Rv5.QkEsNixkSaq(Object )
в PDEYCdwa2J4QMrF1lcD.d4vV2vwCQi0a584sPXx.JBeVQdP174(Object )
=================================================

Еще один вопрос Зенитка принадлежит к "AiGroundActor". А к чему принадлежит аэростат-лебедка этого типа: "Aeroanchored.Balloon_winch_GER1"? (это название из файла-миссии)
Я это к тому спрашиваю, что тоже, как и зенитку, хотел бы его удалять по факту попадания в него. Как это сделать? Ведь такой код для аэростата тут уже явно не сработает:
if (actor is AiGroundActor)
{
(actor as AiGroundActor).Destroy();
}

SlavikSG
30.11.2011, 16:55
Вот так всегда. Пропали все гуру на самом интересном месте. :(
Алеее!! Люююди! Есть, кто живой?

Small_Bee
30.11.2011, 17:06
Вот так всегда. Пропали все гуру на самом интересном месте. :(
Алеее!! Люююди! Есть, кто живой?

По поводу ошибки не совсем ясно, почему. Да и смысл удаления трупика сразу же от меня ускользает. Т.е. я в нее выстрелил, а она испарилась.

По поводу баллона говорилось - их ты никак в скрипте не увидишь и ничего с ними не сделаешь. Выше, а так-же в темах Вопросы, Морской лев, Обсуждение миссий и т.д. этот момент подчеркивался неоднократно.

SlavikSG
30.11.2011, 18:17
По поводу ошибки не совсем ясно, почему. Да и смысл удаления трупика сразу же от меня ускользает. Т.е. я в нее выстрелил, а она испарилась...
Да, конечно. Зенитка должна погореть, подымиться. Это без сомнений. :)
Я поясню. Смысл не такой. Смысл в том, что начинаем удалять трупики, как только будет уничтожена шестая зенитка. Сразу все очищаем и ставим новые.

А так, вообще, вопрос отпал. Пока читал твой пост, меня осенило. Поставил секундную задержку в другую часть кода и у меня все получилось. Хотя да, ты прав. Смысл ошибки действительно непонятен и она по прежнему имеет место быть.


...По поводу баллона говорилось - их ты никак в скрипте не увидишь и ничего с ними не сделаешь. Выше, а так-же в темах Вопросы, Морской лев, Обсуждение миссий и т.д. этот момент подчеркивался неоднократно.
Спасибо за пояснение. Я не заметил этого момента. Но тогда вопрос хотелось бы поставить несколько иначе. Какой объект, типа "Аэростат", можно было бы отслеживать в миссии? Уж больно хочется их заюзать. Возможно как-то обойти это ограничение? Без них как-то скучновато будет в мисси. А получается, что один раз поставил, их взорвали, и ничего с этим уже не поделаешь. Получается, что загрузить я их могу, а удалить нет. :(

Small_Bee
30.11.2011, 18:31
Спасибо за пояснение. Я не заметил этого момента. Но тогда вопрос хотелось бы поставить несколько иначе. Какой объект, типа "Аэростат", можно было бы отслеживать в миссии? Уж больно хочется их заюзать. Возможно как-то обойти это ограничение? Без них как-то скучновато будет в мисси. А получается, что один раз поставил, их взорвали, и ничего с этим уже не поделаешь. Получается, что загрузить я их могу, а удалить нет. :(

Скриптом - никак. Это печально, но факт. Сначала даже пушки нельзя было отслеживать, должны вроде добавить аналогичный функционал и к другим статикам, но когда именно, неизвестно.
Обходной путь может быть в установке триггера на уничтожение наземки в районе. Но там надо учитывать несколько моментов. Казалось бы, поставь мотоцикл статический, сверху триггер и требование 100% уничтожения. Мотоцикл убили, триггер сработал. Ан нет. Есть баг, при котором при оценке кол-ва объектов триггер считает сам мотоцикл и те две физиономии, что в нем сидят, но при уничтожении - только мотоцикл, т.е. проценты будут - 33.3333- и триггер никогда не сработает. Это должно быть в след. патче поправлено. И второй момент - триггер, при оценке статиков что в его радиус попадают, используют не координаты, а т.н. сферу первичной коллизии (если не ошибаюсь) которой этот статик окружен. Таким образом, если поставить вышку высотой скажем метров 30, то любой триггер, который зайдет радиусом в радиус 30 метров от вышки (грубо), будет считать ее своей. Третий момент - триггеры не учитывают объекты с нейтральной армией. Т.е. домики ты таким образом тоже не отследишь (те которые в разделе Здания - у них нельзя выставить армию).

SlavikSG
30.11.2011, 18:59
Текс, хорошо. Это я все понял. Пусть тригер. Меня это устроит. Но! Я не пойму, как применить Destroy() к такому объекту, как "Aэростат". Как написать код уничтожению аэростата? Ведь такой код не пашет, применительно к нему:

if (actor is AiGroundActor)
{
(actor as AiGroundActor).Destroy();
}

Small_Bee
30.11.2011, 19:12
Текс, хорошо. Это я все понял. Пусть тригер. Меня это устроит. Но! Я не пойму, как применить Destroy() к такому объекту, как "Aэростат". Как написать код уничтожению аэростата? Ведь такой код не пашет, применительно к нему:

if (actor is AiGroundActor)
{
(actor as AiGroundActor).Destroy();
}

Конечно не работает, уничтожения аэростата не вызывает никаких методов в миссии, конечно нельзя применить Destroy() когда нету даже ссылки на объект. )))

SlavikSG
02.12.2011, 14:23
Конечно не работает, уничтожения аэростата не вызывает никаких методов в миссии, конечно нельзя применить Destroy() когда нету даже ссылки на объект. )))
Я не был бы так настойчив, если бы не был уверен в обратном. Проверял это дело раньше. Проверил и еще раз. Событие на убиение аэростата происходит! Гружу одной миссией шесть синих зениток в ряд. Другой миссией гружу напротив два красных аэростата. И пишу такой код:

public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
{
base.OnActorDead(missionNumber, shortName, actor, damages);

Sss("Был подбит аэростат армии :" + actor.Army().ToString());
Sss("Хеш подбитого аэростата :" + actor.GetHashCode().ToString());
Sss("Имя подбитого аэростата :" + actor.Name());
}
И в логе сервера пишется это:
Server: Был подбит аэростат армии :1
Server: Хеш подбитого аэростата :60779388
Server: Имя подбитого аэростата :NONAME
Server: Был подбит аэростат армии :1
Server: Хеш подбитого аэростата :2922015
Server: Имя подбитого аэростата :NONAME

Определяется и "Хеш" и "Армия". А вот остальное ничего не пашет. В том числе и имя, заданное в файле-миссии, не определяется. А вот само событие срабатывает четко и неизменно.

Ладно, наверное с этим пока точно ничего не поделаешь. Буду спавнить аэростаты просто в начале миссии. Где-нибудь не рядом с зенитками, а подальше. Так, чтобы глаз радовали, и если подобьют, чтобы трупики их (не убирающиеся) не сильно мешались.

Имею еще один каверзный вопрос:
Есть событие появления в миссии объектов. Название ему OnActorCreated. Естественно, срабатывает оно на все подряд. При этом срабатывании я начинаю заполнять, ранее созданные два словаря: _Zenitki_Red_ и _Zenitki_Blue_. Заполняю я их только нужными мне объектами. А именно зенитками. Все остальное игнорируется. Пишу такой код:


public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber, shortName, actor);

Timeout(1, () =>
{
//Определяем имя загружаемого объекта
Zena = (actor as AiCart).InternalTypeName().ToString();

//Если миссия не является стартово-загрузочной и этот объект принадлежит
// армии красных и имя ему "bob:Artillery.Krupp_L2H43_Protze_Flak38", то...
if (missionNumber != 0 && actor.Army() == 1 && Zena == "bob:Artillery.Krupp_L2H43_Protze_Flak38")
{
_Zenitki_Red_.Add(shortName, missionNumber); //добавляем в справочник красных очередную новую запись
}

//Если миссия не является стартово-загрузочной и этот объект принадлежит
// армии синих и имя ему "bob:Artillery.Krupp_L2H43_Protze_Flak38", то...
if (missionNumber != 0 && actor.Army() == 2 && Zena == "bob:Artillery.Krupp_L2H43_Protze_Flak38")
{
_Zenitki_Blue_.Add(shortName, missionNumber); //добавляем в справочник синих очередную новую запись
}
});
}
Опять же, как и несколько постов ранее, получается, что нужно нужно ОБЯЗАТЕЛЬНО вводить задержку Timeout. Если ее не вводить, то все отлично пашет и так, но в логе сервера неизменно возникает ошибка, как только я пытаюсь выполнить эту часть кода: Zena = (actor as AiCart).InternalTypeName().ToString();. Повторюсь... Это все замечательно пашет и без задержки Timeout.

Непонятки эти, происходящие в событиях мисси, меня сильно напрягают. Что при удалении объекта, нужно делать задержку, что при его создании считывать атрибуты опять же нужно с задержкой. Все это как-то сумбурно... :(

Small_Bee
02.12.2011, 14:34
Server: Имя подбитого аэростата :NONAME


Да, немного ошибся, но сути не меняет. Выделенное - Ключевой момент. К какому классу относятся эти нонеймы или какие интерфейсы реализовывают я так и не понял. Т.е. имя конечно есть, но оно то ли обфускатором обработано, то ли еще как, чего с ними делать, не представляю. Как только не крутил. Поэтому такие нонеймы пропускаю. Собственно почему и сказал, что метод не вызывается - тушение нонеймов это у меня в первую очередь. )

--- Добавлено ---



Опять же, как и несколько постов ранее, получается, что нужно нужно ОБЯЗАТЕЛЬНО вводить задержку Timeout. Если ее не вводить, то все отлично пашет и так, но в логе сервера неизменно возникает ошибка, как только я пытаюсь выполнить эту часть кода: Zena = (actor as AiCart).InternalTypeName().ToString();. Повторюсь... Это все замечательно пашет и без задержки Timeout.

Непонятки эти, происходящие в событиях мисси, меня сильно напрягают. Что при удалении объекта, нужно делать задержку, что при его создании считывать атрибуты опять же нужно с задержкой. Все это как-то сумбурно... :(

Мы на самом деле не знаем, что конкретно делает дестрой. И получаем мы интерфейс, а истинный класс, который за ним скрыт и что как он делает мы не знаем, и согласно принципам ООП и не должны. )
Вполне возможно, что на момент вызова метода какие-то поля еще не инициализированы.

ЫЫЫ слушай у меня тут эврика сияет, а DamagerScore там заполнен? И можно ли Pos() получить? И глянь плиз где именно Army() определен, я сам сейчас не посмотрю, а очень хочется )

naryv
02.12.2011, 16:10
Не-не-не!!! Сори!
Я этой функцией вывода вспомогательного сообщения, только ввел вас в заблуждение.
Все! Забыли про Sss("Удалили красную зену: " + actorName); Дело вовсе не в этом. Ошибка есть так или иначе. Вот код без этой функции и ошибка все равно возникает:

public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
{
base.OnActorDead(missionNumber, shortName, actor, damages);
if (actor is AiGroundActor)
{
(actor as AiGroundActor).Destroy();
}
}

Проверил только что еще раз. Ошибка есть. И нет ошибки, если проделать все тоже самое, но с секундной задержкой.
Но подчеркиваю: И в том и в этом случае, зенитка все равно нормально удаляется.

Сорри, я сейчас в отпуске, поэтому только набегами и проверить что да как не могу. По дестрою умершего объекта до меня только сейчас дошло - во время actorDie на объект цепляются всякие дымы, огни и пр. эффекты, которые какое-то время инициализируются и через какое-то время должны прекратиться, если такой умерший объект задестроить - вылезет NullReferenceException при попытке системой обработать эти эффекты. Плюс, убитые пушки, например, при убийстве принимают "дохлый вид" не заменой на модельку дохлой, а приведением живой к дохлому виду - темнеет, опускает ствол и т.д., соответственно, игра пытается довернуть ствол в "мёртвое состояние " а объект скриптом уже задестроен - вот NullReferenceExceptionи выскакивает.

SlavikSG
02.12.2011, 16:35
...ЫЫЫ слушай у меня тут эврика сияет, а DamagerScore там заполнен? И можно ли Pos() получить? И глянь плиз где именно Army() определен, я сам сейчас не посмотрю, а очень хочется )
С этим параметром я еще не работал, а так, вообще-то, там что-то заполняется.

Чисто наобум глянул. Увидел это:
damages.Count равен: 1
ddamages[0].initiator.Actor.Name() равен: 2:Static2
damages[0].initiator.Person.Name() равен: NONAME
...ну, там много чего еще есть. Только больше, мне кажется, там инфы не "кого" убили, а "кто" убил. В любом случае, надеюсь на твою гениальность. А вдруг, что-то можно родить? В смысле убить трупик... :)


...соответственно, игра пытается довернуть ствол в "мёртвое состояние " а объект скриптом уже задестроен - вот NullReferenceException и выскакивает.
Ясно. Я догадывался... Это было видно еще по тому, как "хеш" объекта меняется. Ну, мне главное, чтобы я был уверен, что скрипт пишу правильно и чтобы ошибка в логе сервера не приводила к утечке памяти или к крушению сервака. А в остальном, на это можно и забить. :)

P.S.
Давай уже выходи из отпуска скорее. Летом догуляешь. Кто ж в такое время отдыхает? Погода - жесть!!! Ггг! :)

Small_Bee
02.12.2011, 16:50
С этим параметром я еще не работал, а так, вообще-то, там что-то заполняется.

Чисто наобум глянул. Увидел это:
damages.Count равен: 1
ddamages[0].initiator.Actor.Name() равен: 2:Static2
damages[0].initiator.Person.Name() равен: NONAME
...ну, там много чего еще есть. Только больше, мне кажется, там инфы не "кого" убили, а "кто" убил. В любом случае, надеюсь на твою гениальность. А вдруг, что-то можно родить? В смысле убить трупик... :)


Это понятно, что там тот, кто убил. Значит уже хорошо, бобрам статики считать можно... Осталось каким то образом разрулить, кого убили. Если можно получить позицию через Pos(), то в принципе, зная наперед, что мы туда поставили, можно определится, кого убили. Примерно так.

SlavikSG
02.12.2011, 17:21
Ага. Ясно.
Но я так понимаю, это для статистики полезно будет, но никак не для определения истинного "actor"-а убиенного объекта, с последующим его удалением из миссии. Верно?

Кстати, а есть уже у кого-то рабочий начальный вариант скрипа статистики? Я бы с удовольствием глянул краем глаза на это дело. :)

Small_Bee
02.12.2011, 17:33
Ага. Ясно.
Но я так понимаю, это для статистики полезно будет, но никак не для определения истинного "actor"-а убиенного объекта, с последующим его удалением из миссии. Верно?

Кстати, а есть уже у кого-то рабочий начальный вариант скрипа статистики? Я бы с удовольствием глянул краем глаза на это дело. :)

Примитивные варианты где-то есть, скрипят вроде. На форуме покопаться. Более продвинутый в работе, сам плюс бд готовы процентов на 95, вебморда процентов на 5% )

SlavikSG
02.12.2011, 17:49
...Более продвинутый в работе, сам плюс бд готовы процентов на 95.
БД на MySQL или что-то иное?

Да, нужно поискать примеры. Без понятия, как C# общается с базами данных. Немного ваял это дело на PHP, а вот в этом деле - полный ноль. Видимо придется плотнее изучать C#. Но начать хотелось бы все же с готовых примеров.

Small_Bee
02.12.2011, 18:00
БД на MySQL или что-то иное?

Да, нужно поискать примеры. Без понятия, как C# общается с базами данных. Немного ваял это дело на PHP, а вот в этом деле - полный ноль. Видимо придется плотнее изучать C#. Но начать хотелось бы все же с готовых примеров.

Вообще для MySQL есть провайдер .NET, можно у них на оффсайте забрать. А если нет, так ничто не мешает сделать что то вроде REST службы на PHP и юзать на здоровье. MySQL выбрана как самая доступная и простая база, но в принципе никто не мешает заменить на другую базу или вообще записи в файл, возможность переключения заложена.

SlavikSG
05.12.2011, 12:18
Вообще для MySQL есть провайдер .NET, можно у них на оффсайте забрать. А если нет, так ничто не мешает сделать что то вроде REST службы на PHP и юзать на здоровье...
Эх! Не знаю я пока ни того, ни другого. :(
Ну, да ладно. Займусь этим чуть позже.

Вопрос:
Имеется статический объект - "Минный тральщик". Его подбивают. Он тонет и пропадает из битвы бесследно. Нужно ли убирать его трупик, (который теоретически должен лежать на дне моря), перед загрузкой нового Минного тральщика?

naryv
05.12.2011, 13:44
Ясно. Я догадывался... Это было видно еще по тому, как "хеш" объекта меняется. Ну, мне главное, чтобы я был уверен, что скрипт пишу правильно и чтобы ошибка в логе сервера не приводила к утечке памяти или к крушению сервака. А в остальном, на это можно и забить. :) в принципе к крашам или утечке памяти такие ситуации не должны приводить, но вообще, лучше избегать таких ситуаций.


P.S.
Давай уже выходи из отпуска скорее. Летом догуляешь. Кто ж в такое время отдыхает? Погода - жесть!!! Ггг! :) ну у меня " по семейным обстоятельствам" отпуск :).



Вопрос:
Имеется статический объект - "Минный тральщик". Его подбивают. Он тонет и пропадает из битвы бесследно. Нужно ли убирать его трупик, (который теоретически должен лежать на дне моря), перед загрузкой нового Минного тральщика? Можно и убрать, он не бесследно пропадает, он "тонет" :)

SlavikSG
05.12.2011, 15:47
...но вообще, лучше избегать таких ситуаций.
Ага. Уже ввел задержку на 1 секунду. Ошибка пропала.


... Можно и убрать, он не бесследно пропадает, он "тонет" :)
Убираю. Надеюсь правильно. И на дне не будет скапливаться груда ржавеющих трупиков. :)

Такой вопрос:
Правильно ли я мыслю, что для того, чтобы сделать респавн на каждый одиночный статический объект в битве (зенитка, корабль) нужно создавать свою отдельную миссию на этот объект? Иными словами; объект подбили, затем, по таймеру мы убираем его трупик, и так же по таймеру, или еще по какому-то другому условию, загружаем миссию с этим объектом снова. Верно я понимаю этот процесс? Или быть может есть какой-то другой, более простой способ подзагрузки, тех или иных, одиночных объектов? А то получается, что сколько в битве присутствует одиночных статических объектов, столько и должно быть вспомогательных миссий, для загрузки этих объектов. В старом Ил-2 с этим было все просто. Задал время респавна объектов и забыл про это.

Вопрос по статистике:

Примитивные варианты где-то есть, скрипят вроде. На форуме покопаться...
Поискал по форуму примеры скриптов статистики. Ничего не смог найти. Пусто. В том числе пусто и в архиве примеров. Искал по таким словам, как:
SqlClient
SqlConnection
Может не так искал? Единственное, что нашел - это ссылку на рабочую статистику сервера Репки2: http://r2.repka.su/ и в общем-то и все. А очень бы хотелось глянуть несколько примеров того, как это все делается.

Small_Bee
05.12.2011, 17:06
Вопрос по статистике:

Поискал по форуму примеры скриптов статистики. Ничего не смог найти. Пусто. В том числе пусто и в архиве примеров. Искал по таким словам, как:
SqlClient
SqlConnection
Может не так искал? Единственное, что нашел - это ссылку на рабочую статистику сервера Репки2: http://r2.repka.su/ и в общем-то и все. А очень бы хотелось глянуть несколько примеров того, как это все делается.

Вопрос подключения к базам данных это уже вопрос для специализированных форумов, и к данной теме отношение не имеет. Юзаем поисковики: mysql c# example (http://www.google.com.ua/#sclient=psy-ab&hl=ru&source=hp&q=mysql%20c%23%20example&pbx=1&oq=MySQL%20C%23&aq=2&aqi=g4&aql=&gs_sm=sc&gs_upl=1877l8680l0l12275l14l10l3l1l1l0l369l1864l1.6.2.1l13l0&bav=on.2,or.r_gc.r_pw.,cf.osb&fp=1b0e3831357887d4&biw=1920&bih=991&pf=p&pdl=300)

-atas-
05.12.2011, 17:36
В том числе пусто и в архиве примеров.

Миссия DGW2 islands w.stat by stillborn
На Репке стат из нее.

SlavikSG
06.12.2011, 09:45
Вопрос подключения к базам данных это уже вопрос для специализированных форумов, и к данной теме отношение не имеет. Юзаем поисковики: mysql c# example (http://www.google.com.ua/#sclient=psy-ab&hl=ru&source=hp&q=mysql%20c%23%20example&pbx=1&oq=MySQL%20C%23&aq=2&aqi=g4&aql=&gs_sm=sc&gs_upl=1877l8680l0l12275l14l10l3l1l1l0l369l1864l1.6.2.1l13l0&bav=on.2,or.r_gc.r_pw.,cf.osb&fp=1b0e3831357887d4&biw=1920&bih=991&pf=p&pdl=300)
Нет, меня интересуют как раз игровые скрипты. Как и в какой момент времени, заносить данные в базу. И где их, собственно, брать. А как подключиться к базе, я уже нашел. Даже нашел подключение, к базе Microsoft Access. Как к обычной, так и к защищенной.

Нужно описание:
"OnActorDamaged"
подробное описание параметра "List<DamagerScore>" в "OnActorDead"
"OnAircraftCrashLanded"
"OnAircraftDamaged"
"OnAircraftKilled"
ну, и так далее. В общем, все то, что можно было бы заносить в статистику, как данные по тому или иному пилоту.


Миссия DGW2 islands w.stat by stillborn
На Репке стат из нее.
Ага. Спасибо! Полез смотреть...

SlavikSG
06.12.2011, 12:08
Вопрос...

В скрипте пишу так:

using System;
using maddox.game;
using maddox.game.world;
using System.Collections.Generic;

Все пашет.

Но когда пишут так:

using System;
using System.Data;
using maddox.game;
using maddox.game.world;
using System.Collections.Generic;

То в консоли сервера выдает ошибку на эту "using System.Data;".
Ошибка такая:

=================================================
System.Exception: c:\Documents and Settings\СЛАВИК\Мои документы\1C SoftClub\il-2 sturmovik cliffs of dover\missions\Multi\Dogfight\Skript.cs(3,14): error CS0234: Имя типа или пространства имен 'Data' отсутствует в пространстве имен 'System' (пропущена ссылка на сборку?)

в 2fK76H4rrxvt3dZC4k8.s2sCuh4qoKKt665i9Aa.ZfiUJaJndHR(String , Boolean , Boolean )
в 2fK76H4rrxvt3dZC4k8.s2sCuh4qoKKt665i9Aa.DOFjDteibXpNRMImCyI6(Object , Boolean , Boolean )
в 2fK76H4rrxvt3dZC4k8.s2sCuh4qoKKt665i9Aa.WEmUJe0WYUR(String )
в 2fK76H4rrxvt3dZC4k8.s2sCuh4qoKKt665i9Aa.SSlUJE8On9c(String , Int32 )
=================================================

Причем в самой среде "Microsoft Visual C# 2010" все пашет на ура.


Эта using System.Data; так же как и using System.Data.OleDb; нужны в скрипте для соединения с базой данных.. Повторюсь, что в среде "Microsoft Visual C# 2010" все пашет на ура. Соединение с базой и получение данных посредством SQL запросов работает отлично. А сервак эту Data не видит в упор.
Писал уже и с большой буквы и с маленькой. :(

Хееееелп!!!

Small_Bee
06.12.2011, 16:16
Все верно, и не сможешь, т.к. такие сборки игра не подключает, соответственно ты их использовать не можешь. Поэтому всю логику пишешь в отдельной сборке а к миссии ее подключаешь.

Вот выдрал из своей работы кусок для примера.

BridgeMission.cs - непосредственно скрипт миссии, который подключает сборку, с помощью рефлексии создает экземпляр класса из сборки и извлекает необходимые методы класса.
RepkaBridge.cs - Размещается в отдельное сборке, собственно упомянутый выше класс. Как видно, убираем необходимость переопределения методов миссии, мы переводим всю кухню на событийную модель, плюс можем теперь подключать в своей сборке любые фичи.

В моем случае одним из подписчиков на эти события и есть стата.

Думаю этот пример пригодится всем кто занимается скриптами.

SlavikSG
06.12.2011, 17:16
...который подключает сборку, с помощью рефлексии создает экземпляр класса из сборки и извлекает необходимые методы класса.
Ужас!!!
Для не посвященного - это тоже самое, что слова матом. Абракадабра. Ничего не понял! :( Ну, разве что так... Создаем класс. Создаем экземпляр класса. Юзаем методы этого класса. Но это все просто общие слова, которые ничего мне не поясняют.

А нет примерчика с двумя файлами? Где один скрипт, подключает другой. Ну, или, как там иначе делается?.. Мне бы глянуть разок, до меня бы дошло, (возможно).

Задача у меня такая:
Имеем некое событие в миссии. Пусть это будет то же самое широко распространенное "OnActorDead". По этому событию получаем кучу данных. Кого убили, кто убил, и так далее. Записываем эти данные в базу данных. Не в текстовый файл, как в примере упомянутым -atas- "DGW2 islands w.stat by stillborn" (который я сегодня посмотрел), а именно в полноценную базу данных. В моем случае, хотелось бы заюзать базу Microsoft Access. Для меня это был бы самый удобный вариант.


...Поэтому всю логику пишешь в отдельной сборке а к миссии ее подключаешь...
Как это сделать практически???

Предоставленный тобою пример sample.zip‎ я уже где-то видел раньше. Он ничего поясняет. Срабатывает триггер, загружается подмиссия. И все, собственно... А на твои примерочные файлы BridgeMission.cs и RepkaBridge.cs никаких ссылок нет.

Снова кричу: - Хээээлп!!!

Small_Bee
06.12.2011, 17:33
Как это сделать практически???

Предоставленный тобою пример sample.zip‎ я уже где-то видел раньше. Он ничего поясняет. Срабатывает триггер, загружается подмиссия. И все, собственно... А на твои примерочные файлы BridgeMission.cs и RepkaBridge.cs никаких ссылок нет.

Снова кричу: - Хээээлп!!!

Пример ты не мог видеть где-то раньше. Там нет никаких подмиссий и триггеров.
Этот пример поясняет, как практически подключить свою сборку к скрипту миссии и транслировать события миссии в свою сборку, а что ты будешь делать в этой сборке - твое дело, хоть к базам подключаться, хоть на бирже играть. Там нет никакой конкретной реализации, ТАМ УЖЕ ВСЕ ГОТОВО для того, что бы эту реализацию создать. А ее никто кроме тебя самого делать не будет.
Прежде чем требовать пояснений, очень не помешает хоть немного подтянуть матчасть. То, что Вы ничего не поняли из примера, это не его проблема. Тем более это файлы из рабочего проекта, которые реально работают.

SlavikSG
07.12.2011, 10:38
Погоди... Ты не понял. Выложенный тобою zip-архив sample.zip‎ с примером я видел тут:
http://wiki.sukhoi.ru/index.php?title=%D0%98%D0%BB-2_%D0%A8%D1%82%D1%83%D1%80%D0%BC%D0%BE%D0%B2%D0%B8%D0%BA:_%D0%91%D0%B8%D1%82%D0%B2%D0%B0_%D0%B7%D0%B0_%D0%91%D1%80%D0%B8%D1%82%D0%B0%D0%BD%D0%B8%D1%8E._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B_%D0%B4%D0%BB%D1%8F_%D1%87%D0%B0%D0%B9%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2_-_%D0%97%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0_%D0%BF%D0%BE%D0%B4%D0%BC%D0%B8%D1%81%D1%81%D0%B8%D0%B9
Обычные тригеры, которые срабатывают и что-то там делают. С комментариями на немецком языке. В принципе, там все понятно, но для меня, в данном случае, бесполезно.

Я говорю, про твои примеры "BridgeMission.cs" и "RepkaBridge.cs". Где их можно посмотреть? Ты ведь ссылку на них не сделал. Только имена файлов и все.


...Прежде чем требовать пояснений, очень не помешает хоть немного подтянуть матчасть...
Упаси Бог! Никто ничего не требует!
Я ПРОШУ помощи. А матчасть... Ковыряюсь, конечно, потихоньку... Не без этого. Ну, может плохо ковыряюсь. Прости, если что не так. И спасибо, что помогаешь мне, балбесу... :)

Теорию я понял. Миссия игры транслирует в мою "Сборку" какие-то события, а эта "Сборка" их обрабатывает. Вот мне бы крохотный пример того, как это реализовать практически. Скажем, в миссии что-то бабахнуло, "Сборка" это услышала и отреагировала тем, что я там в ней напишу-нагорожу. Как заставить миссию сказать моей "Сборке" что-то? И как эта "Сборка" может слушать миссию игры? Были вроде реализации на вроде того, что некая программа в реальном времени читает (парсит) лог-файл игры и тем самым реагирует на события игровой миссии. Но это же жесть!!! Нельзя так делать.

--- Добавлено ---

Блин, сори!!!!!!!!!!!!!!!!!

Тупо запутался в архивах. Перепутал ранее скачанный "Samples.zip" с твоим выложенным "sample.zip". Вот ведь как! Тупо невнимательность...
Все, пока вопросов нет. Полез смотреть. Спасибо! :)

Small_Bee
07.12.2011, 17:24
Сорри и меня, я просто немного в осадок выпал, я за Фому, а мне за Ерему. )

SlavikSG
07.12.2011, 17:50
Сорри и меня, я просто немного в осадок выпал, я за Фому, а мне за Ерему. )

Ага. :)

Начал смотреть код. Что-то уж больно туго он мне дается.

А можно было бы, если есть время, прокомментировать построчно эту, как я понимаю, ключевую часть кода из файла BridgeMission.cs:

private void Init(string path)
{
try
{
Assembly a = Assembly.LoadFile(path);
GamePlay.gpLogServer(null, "Assembly: {0}", new object[] { a.FullName });
Type bridgeType = a.GetType("RepkaMissionsLib.core.RepkaBridge");
GamePlay.gpLogServer(null, "Bridge: {0}", new object[] { bridgeType.Name });
if (bridgeType != null)
{
bridge = Activator.CreateInstance(bridgeType, new object[] { this });
if (bridge != null)
{
method[EventType.ActorCreated] = bridgeType.GetMethod("OnBridgeActorCreated");
method[EventType.ActorDamaged] = bridgeType.GetMethod("OnBridgeActorDamaged");
method[EventType.ActorDead] = bridgeType.GetMethod("OnBridgeActorDead");
...

В первом посту этой темы, под словами "Человеческим языком:" , у тебя уж больно здорово это получалось. Плиииз!.. :)

И что-то я не уверен, где происходит обращение к "Сборке" по факту произошедшего события в миссии. Случайно не в этом методе?

private void InvokeEvent(EventType ev, params object[] args)
{
...
}

SlavikSG
09.12.2011, 10:51
Тишина в теме. Гробовая. :(

...ковырялся я, ковырялся, но мне по прежнему не ясно, как же все таки подключается библиотека. Как к ней происходит обращение из миссии и передаются параметры. Если забыть про объектно ориентированное программирование, то я думал, что будет, примерно, так:
1. Имеется один файл с расширением "cs". Это есть скрипт и код миссии. В ней происходит событие по факту убиения какого-то объекта (например).
2. Имеется второй файл с расширением "cs" в нем написаны процедуры и функции для работы с базой данных статистики.
3. В первом файле подключаем второй файл и мы как бы юзам процедуры второго файла. (так я не Дельфи когда-то делал)

Вот так мне казалось. Я совсем неправ?

Пока Small_Bee куда-то благополучно пропал (наверное дописывает статистику), представляю вашему вниманию готовый к использованию простейший скрипт и миссию, которая крутится сейчас на моем сервере.

Небольшое описание:
Имеются зенитки для защиты ВПП красных и синих. Естественно, в ходе битвы их уничтожают нерадивые злые вирпилы, дабы они не мешались. Уничтожаются они навсегда. Чтобы восстановить эти невинно убиенные зенитки на всех своих филдах, нужно подбить шесть вражеских зениток. И наоборот. Вот такое нехитрое условие для играбельности в Битве. Так же на карте, для разнообразия, стоят танкеры и минные тральщики. Танкер автоматически респавнится через каждые пол часа (после его благополучного затопления), тральщик через час.

Отличительной особенностью скрипта является то, что нет триггеров. А имена всех зениток записываются заранее во время их появления на карте, чтобы потом их можно перебирать по именам и в цикле удалять для последующего респавна. Код скрипта насыщен моими личными комментариями. Начинающим, возможно, будет полезно, а гуру прошу отнестись к ним снисходительно. Ведь я полный чайник в этом деле! И писал их лично для себя и для того, чтобы потом, через какое-то время, понять, что я там вообще нагородил.

Взять это хозяйство можно тут:
http://www.box.com/s/h734mjr2f0fnodbhvzey

podvoxx
09.12.2011, 16:07
Пока Small_Bee куда-то благополучно пропал (наверное дописывает статистику), представляю вашему вниманию готовый к использованию простейший скрипт и миссию, которая крутится сейчас на моем сервере.е на карте, для разнообразия, стоят танкеры и минные тральщики. Танкер автоматически респавнится через каждые пол часа (после его благополучного затопления), тральщик через час.



Спасибо, если завтра на митинге не пришибут, на выходных постараюсь посмотреть.

Octocat
09.12.2011, 23:14
Славик, файл с расширением cs - это просто исходник, чтоб выполнить код из него он должен быть откомпилирован компилятором языка C#, а результат помещен в исполняемый файл (exe) или файл динамической библиотеки (dll), которые в контексте платформы .NET называются сборками. Твой файлик со скриптом миссии при ее загрузке тоже будет откомпилирован в сборку, и помещен в папку временных файлов системы. SmallBee это подробно расписал в начале темы Как реализовывать ("включать") скрипты? (http://www.sukhoi.ru/forum/showthread.php?t=72899).

В куске кода из твоего примера:

- Загружается сборка.
- В ней ищется класс с полным именем "RepkaMissionsLib.core.RepkaBridge".
- Динамически создается экземпляр этого типа.
- Получаются описатели методов "OnBridgeActorCreated" "OnBridgeActorCreated".
- Описатели помещаются в массив, для последующего вызова.

podvoxx
14.12.2011, 10:08
[Tutorial] Simple Scripting Lessons - Trigger Part 1 (Basics)
http://forum.1cpublishing.eu/showthread.php?t=28454
Тутор от Кодиака на английском

podvoxx
19.12.2011, 13:03
представляю вашему вниманию готовый к использованию простейший скрипт и миссию, которая крутится сейчас на моем сервере.

Взять это хозяйство можно тут:
http://www.box.com/s/h734mjr2f0fnodbhvzey

Только сегодня удалось посмотреть, спасибо! Сейчас делаю миссию по захвату населенного пункта и как раз с наземкой работать придется.

Есть вопросы по зениткам. В городке их будет много, зенитный обстрел выглядит феерично, однако боеприпасов хватает примерно на 10-15 минут, потом ПВО беззащитна практически. Притом, что меткость не очень. Можно ли повысить точность стрельбы(меня устраивает, но уж очень много батарей приходится ставить-независимо от того, как было в реале в игре это прибавляет нагрузку на ПК)? Одна из задач игрокам будет уничтожение зенитной артиллерии.
Как реализовать примерно такой алгоритм:
При выполнении условия (зенитка жива, зенитка находится в миссии более 15 минут) заменить ее на "новую".

Есть возможность респауна наземки по определенным координатам, так как всю подмиссию не получится перегрузить?

По зениткам конечно проще разработчикам править - добавить возможность получить кол-во оставшихся боеприпасов и задать их количество в редакторе

По сообщениям рекомендую для отправки в чат и на экран такой код от Kodiak (можно задать армию, параметры, работает и в оффлайн, и в онлайн):


//******************Send Screen Message Method*******************
private void sendScreenMessageTo(int army, string msg, object[] parms)
{
List<Player> Players = new List<Player>();
//Singleplayer or Dedi Server
if (GamePlay.gpPlayer() != null)
{
if (GamePlay.gpPlayer().Army() == army || army == -1)
Players.Add(GamePlay.gpPlayer());
} // Multiplayer
if (GamePlay.gpRemotePlayers() != null || GamePlay.gpRemotePlayers().Length > 0)
{
foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.Army() == army || army == -1)
Players.Add(p);
}
}
if (Players != null && Players.Count > 0)
GamePlay.gpHUDLogCenter(Players.ToArray(), msg, parms);
}

//******************Send Chat Message Method*******************
private void sendChatMessageTo(int army, string msg, object[] parms)
{
List<Player> Players = new List<Player>();
//Singleplayer or Dedi Server
if (GamePlay.gpPlayer() != null)
{
if (GamePlay.gpPlayer().Army() == army || army == -1)
Players.Add(GamePlay.gpPlayer());
} // Multiplayer
if (GamePlay.gpRemotePlayers() != null || GamePlay.gpRemotePlayers().Length > 0)
{
foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.Army() == army || army == -1)
Players.Add(p);
}
}
if (Players != null && Players.Count > 0)
GamePlay.gpLogServer(Players.ToArray(), msg, parms);
}

Вот примеры использования:


serverMessage("Проверка HUD-сообщений:");
sendScreenMessageTo(1, "{0} Сообщение для красных № = {1}.", new object[] { 1, 100 });
sendScreenMessageTo(2, "{0} Сообщение для синих № = {1}.", new object[] { 2, 200 });
//sendScreenMessageTo(-1, "Сообщение для всех.", new object[] { });

serverMessage("Проверка сообщений сервера:");
sendChatMessageTo(1, "{0} Сообщение для красных № = {1}.", new object[] { 1, 1000 });
sendChatMessageTo(2, "{0} Сообщение для синих № = {1}.", new object[] { 2, 2000 });
sendChatMessageTo(-1, "Сообщение для всех.", new object[] { });

Octocat
19.12.2011, 15:50
Можно еще вот так:


using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using maddox.game;
using maddox.game.world;


public class Mission : AMission
{
/// <summary>
/// Returns a list of all users
/// </summary>
private List<Player> GetPlayers()
{
var result = new List<Player>();
if (GamePlay.gpRemotePlayers() != null)
{
result.AddRange(GamePlay.gpRemotePlayers());
}
if (GamePlay.gpPlayer() != null)
{
result.Add(GamePlay.gpPlayer());
}
return result;
}

/// <summary>
/// Returns a list of all users of specified army
/// </summary>
private List<Player> GetPlayers(int army)
{
return (army < 0) ? GetPlayers() : GetPlayers().FindAll(player => player.Army().Equals(army));
}

/// <summary>
/// Sends a message to the screens of all users of specified army
/// </summary>
private void BroadcastScreenMessage(int army, string format, params object[] args)
{
GamePlay.gpHUDLogCenter(GetPlayers(army).ToArray(), format, args);
}

/// <summary>
/// Sends a message to the logs of all users of specified army
/// </summary>
private void BroadcastLogMessage(int army, string format, params object[] args)
{
GamePlay.gpLogServer(GetPlayers(army).ToArray(), format, args);
}

public override void OnBattleStarted()
{
base.OnBattleStarted();

BroadcastScreenMessage(1, "Your army color: {0}, your side: {1}", "Red", "Allies");
BroadcastScreenMessage(2, "Your army color: {0}, your side: {1}", "Blue", "Axis");

BroadcastLogMessage(1, "Big group of german {0} heading to {1}.", "Bombers", "London");
BroadcastLogMessage(2, "Group of our {0} need to cover in their raid to {1}, rendezvous point at sector {2}.", "Heinkels", "London", "G9");
}
}

SlavikSG
20.12.2011, 10:01
- Загружается сборка.
- В ней ищется класс с полным именем "RepkaMissionsLib.core.RepkaBridge".
- Динамически создается экземпляр этого типа.
- Получаются описатели методов "OnBridgeActorCreated" "OnBridgeActorCreated".
- Описатели помещаются в массив, для последующего вызова.
Тут видишь ли, какое дело... Это очень все легко и просто для того, кто варится в этом C# и занимается им профессионально. Для меня же это темный лес. Был бы тут ДО КОНЦА ПОЛНЫЙ ПРИМЕР с созданием экземпляра класса и с вызовом некого метода этого класса по событию убиения чего либо в Битве, и пусть бы этот метод произвел бы звук из динамика компьютера на вроде команды "Beep". И очень желательно с комментариями на каждую строку кода. Тогда я может быть врубился бы в синтаксис всей этой мешанины "закорючек". То есть разобрался бы в последовательности написания скрипта миссии и скрипта класса, работающего с базой (или производящего звук "Beep"). И так же понял бы, как скрипт миссии должен подцеплять другую сборку. В примере Small_Bee нет ни одного комментария, (буквально за каждой командой скрипта нужно лезть в справку). Человеку, который впервые залез в этот C#, все это очень сложно. В принципе, я во все врубался пока дело не коснулось того, что игровой скрипт не поддерживает таких важных вещей, как:

using System.Data;
using System.Data.OleDb;
Поддерживал бы, я бы уже давно начала делать статистику.

Но в любому случае спасибо на попытку пояснить мне, чайнику, всю эту сложную кухню! :)


...однако боеприпасов хватает примерно на 10-15 минут...
Почему 15 минут? Откуда такая цифра? Зенитки хватает не больше, чем на пару минут, если она интенсивно стреляет. А потом все! Туши фонарь и выноси мебель... Все же, я воспользовался бы обычной статической зениткой с бесконечным боезапасом.


...Как реализовать примерно такой алгоритм:
При выполнении условия (зенитка жива, зенитка находится в миссии более 15 минут) заменить ее на "новую"...
Можно по таймеру. Но тут следует учесть, что перед этим нужно удалять старую зенитку, иначе получится слоеный пирог из зениток. А значит, нужно где-то обязательно сохранять имя этой удаляемой зенитки...


...Есть возможность респауна наземки по определенным координатам, так как всю подмиссию не получится перегрузить?
Лично я не знаю другого способа респавна объектов в Битве кроме, как подзагрузкой их через вспомогательную подмиссию. Для меня пока получается несколько странная ситуация... Выходит, что в идеале, на каждый объект в битве, нужно создавать свою личную подмисссию. Сколько объектов на карте, столько и подмиссий.

podvoxx
20.12.2011, 11:49
Почему 15 минут? Откуда такая цифра? Зенитки хватает не больше, чем на пару минут, если она интенсивно стреляет. А потом все! Туши фонарь и выноси мебель... Все же, я воспользовался бы обычной статической зениткой с бесконечным боезапасом.
Это субъективная оценка интенсивности зенитного огня, т.е. после 10 минут он уже затухающий. Так как информации никакой нет нужно проводить опыты на сколько выстрелов и времени хватает боезапаса, а на это уходит время, которое можно потратить на более важные вещи. А что это за статическая зенитка? :)


Можно по таймеру. Но тут следует учесть, что перед этим нужно удалять старую зенитку, иначе получится слоеный пирог из зениток. А значит, нужно где-то обязательно сохранять имя этой удаляемой зенитки...
Лично я не знаю другого способа респавна объектов в Битве кроме, как подзагрузкой их через вспомогательную подмиссию. Для меня пока получается несколько странная ситуация... Выходит, что в идеале, на каждый объект в битве, нужно создавать свою личную подмисссию. Сколько объектов на карте, столько и подмиссий.
Плохо это, конечно. Если бы можно было создавать наземку скриптом без подмиссии можно было бы хоть в шахматы играть танчиками. А так пока только создавать скриптом новый файл с миссией, куда заносить нужные зенитки с координатами и загружать потом эту подмиссию...

Octocat
20.12.2011, 12:02
Славик, скрипт поддеживает все, что поддерживает платформа .NET. Чтобы использовать классы из пространства имен System.Data надо подключить библиотеку в которой они определены, макросом //$reference, в начале скрипта:

//$reference "System.Data.dll"

using System.Data;
using System.Data.OleDb;

podvoxx
20.12.2011, 12:58
Тут видишь ли, какое дело... Это очень все легко и просто для того, кто варится в этом C# и занимается им профессионально. Для меня же это темный лес. Был бы тут ДО КОНЦА ПОЛНЫЙ ПРИМЕР с созданием экземпляра класса и с вызовом некого метода этого класса по событию убиения чего либо в Битве, и пусть бы этот метод произвел бы звук из динамика компьютера на вроде команды "Beep". И очень желательно с комментариями на каждую строку кода. Тогда я может быть врубился бы в синтаксис всей этой мешанины "закорючек". То есть разобрался бы в последовательности написания скрипта миссии и скрипта класса, работающего с базой (или производящего звук "Beep"). И так же понял бы, как скрипт миссии должен подцеплять другую сборку. В примере Small_Bee нет ни одного комментария, (буквально за каждой командой скрипта нужно лезть в справку). Человеку, который впервые залез в этот C#, все это очень сложно. В принципе, я во все врубался пока дело не коснулось того, что игровой скрипт не поддерживает таких важных вещей, как:


Я бы тоже взглянул на полный пример, но бобом вообще мало людей занимается, а скриптами и т.п. единицы. От разработчиков SDK неизвестно когда будет, как и неизвестно что в нем будет.
Вот тут http://www.desastersoft.com/en/1/0/0/0/0/0/downloads.html немцы дополнения делают в виде аддонов, в том числе кампанию. Может там что есть.

Octocat
20.12.2011, 13:03
Подвох, там скрипты миссий практически пустые. Идут вызовы в их собственную библиотеку. Все интересное, если оно есть, находится в ней. К стати, кампания там статическая, просто с трекингом достижений пилота, наградами и прочими украшениями.

SlavikSG
20.12.2011, 13:12
...нужно проводить опыты на сколько выстрелов и времени хватает боезапаса, а на это уходит время, которое можно потратить на более важные вещи.
Да нет... Проверить элементарно! Ставишь самолетик в миссии (с галочкой для игрока), ставишь зенитку рядом и запускаешь это все прям из Полного редактора. Зенитка начинает стрелять по самолетику. Уйдет на это, если мне не изменяет память, не более двух минут. А вот количество залпов, я не считал. Без надобности было. В любом случае такие зенитки лучше не применять. Смотри, какие зенитки применил я (в моем скрипте). То есть взял я их из статической артиллерии, а не из "бронетехники".
Кстати, и размер умышленно выбрал побольше, чтобы игрокам было легче попадать. :)


...Чтобы использовать классы из пространства имен System.Data надо подключить библиотеку в которой они определены, макросом //$reference, в начале скрипта...
Упс! А можно с этого места поподробнее?
Что значит подключить DDL-ку макросом? Сама DLL, на сколько я понимаю, сидит тут:
C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client\System.Data.dll
Но как ее подключить?

Если писать в начале скрипта буквально это:
$reference ...
то, естественно, выскакивает ошибка.

В самом Microsoft Visual Studio я просто пишу это:

using System.Data;
using System.Data.OleDb;
и все работает на ура. А вот когда уже пытаюсь запускать сервак с таким скриптом, то выскакивает ошибка. Не видит скрипт эту "Data". :(

-atas-
20.12.2011, 13:56
Это субъективная оценка интенсивности зенитного огня, т.е. после 10 минут он уже затухающий. Так как информации никакой нет нужно проводить опыты на сколько выстрелов и времени хватает боезапаса, а на это уходит время, которое можно потратить на более важные вещи. А что это за статическая зенитка? :)


Плохо это, конечно. Если бы можно было создавать наземку скриптом без подмиссии можно было бы хоть в шахматы играть танчиками. А так пока только создавать скриптом новый файл с миссией, куда заносить нужные зенитки с координатами и загружать потом эту подмиссию...

Naryv в свем примере emergency cars создает скриптом скорые помощи и т.п. В примере с танками создает скриптом подмиссии с танками емнип.

Если грузить каждую зенитку отдельной подмиссией, будет утечка памяти, как Small_Bee предполагает.

podvoxx
20.12.2011, 14:08
Naryv в свем примере emergency cars создает скриптом скорые помощи и т.п. В примере с танками создает скриптом подмиссии с танками емнип.

Если грузить каждую зенитку отдельной подмиссией, будет утечка памяти, как Small_Bee предполагает.
Точно, про эти скрипты я и забыл... спасибо



GamePlay.gpLandType(x, y)

GamePlay.gpFindPath(EmgCarStart, 10f, EmgCarFinish, 10f, PathType.GROUND, CurTechCars[carNum].TechCar.Army())

GamePlay.gpAirports().Length

GamePlay.gpFrontExist()

GamePlay.gpFrontArmy(CurPlanesQueue[aircraftNumber].baseAirport.Pos().x, CurPlanesQueue[aircraftNumber].baseAirport.Pos().y)

GamePlay.gpLoadSectionFile("missions\\Multi\\Dogfight\\MF_any2.mis")

GamePlay.gpCreateSectionFile()

GamePlay.gpSectorName(gg.Pos().x, gg.Pos().y).ToString()

GamePlay.gpGroundGroups(enemyArmy)

GamePlay.gpGetTrigger(triggerName)

GamePlay.gpNextMissionNumber()

GamePlay.gpPostMissionLoad(CreateEmrgCarMission(CurPlanesQueue[aircraftNumber].baseAirport.Pos(), (CurPlanesQueue[aircraftNumber].baseAirport.FieldR() / 4), ArmyPos, CurPlanesQueue[aircraftNumber].aircraft.Army(), CurPlanesQueue[aircraftNumber].aircraft.Type(),CurPlanesQueue[aircraftNumber].health, CurPlanesQueue[aircraftNumber].aircraft.Pos()))

Посмотрел, в танках создается файл миссии и затем загружается. В миссии с вызовом машинок также вроде - GamePlay.gpPostMissionLoad(CreateEmrgCarMission()). Лишние сложности с этими подмиссиями получаются. Т.е. если нам нужно создать объект, мы сначала создаем миссию скриптом и ее подгружаем. Проще разработчикам добавить новый метод, который бы делал тоже самое по заданным параметрам, чем постоянно такое сложное решение писать.

Octocat
20.12.2011, 16:00
Если писать в начале скрипта буквально это:
$reference ...
то, естественно, выскакивает ошибка.


А два слэша то куда дел? Они же там не для красоты стоят.

SlavikSG
20.12.2011, 16:06
А два слэша то куда дел? Они же там не для красоты стоят.
Два слеша - это просто комментарий в скрипте. Ты ничего не путаешь?

Octocat
20.12.2011, 17:53
Как же это печально: быть серьезным, взрослым, и не верить в чудеса. :cry: Сорри за оффтоп :D

На самом деле, файлик со скриптом это не совсем файл C#. Все, кто пытался использовать C# как скриптовый язык, рано или поздно сталкиваются с проблемой, когда в скрипте становится нужна библиотека не входящая в обычный набор. Самое простое решение: обрабатывать файл перед компиляцией препроцессором, который извлечет все макросы и интерпретирует их, например как ссылки на библиотеки в случае макроса //$reference, или указание работать в отладочном режиме, макрос //-$debug. А затем есть два пути: либо все свои макросы и пометки из файла удалять, либо сразу оформлять их как комментарии. Иначе, компилятор просто не поймет юмора, и вместо сборки мы получим ошибку unexpected character.

podvoxx
11.01.2012, 11:41
Вопрос простой.
В редакторе при настройке брифингов есть несколько их типов. Эти понятны:
[Info] - брифинг при выборе миссии в "Отдельных заданиях" или при создании сервера
[Army Red] - брифинг красных
[Army Blue] - брифинг синих
[Army None] - брифинг игроков без армии

Есть еще два, кто-нибудь может подсказать для чего они?
[Mission]
[Regular]

-atas-
11.01.2012, 23:04
Есть еще два, кто-нибудь может подсказать для чего они?
[Mission]
[Regular]

naryv где-то раньше описывал точно, поищи по его сообщениям.

[Regular] - брифинг конкретной группы, в коопах, например, емнип.
[Mission] - не помню, возможно до выбора армии показывается.
Я сам создавал все брифинги с тестовым текстом и проверял в миссии.

Charger
13.01.2012, 01:30
Тут заинтересовался радиосредствами, спросил нашу надёжу и опору, naryv'а как сделать радиопривод работоспособным. Выяснилось следующее, цитата из переписки:

Вобщем, чтобы наземные радиосредства работали, им надо давать электричество . Делается так - ставим объект ИИ-Зенитный, в его св-вах - скрипт PowerOn, радиус - такой, чтобы попали генератор(ы) и радиостанция(и). Собственно генератор - в статических-> окружение выбираем в его св-вах ставим цель и наводим её на ИИ объект. Теперь этот ИИ объект "передаёт" энергию потребителям.
Для слепой посадки ставим объект антена LBA из статических-аэродром в торце полосы и ориентируем по этой полосе. Приёмник точно есть в Хе-111, если мы из луча выбиваемся - стрелки показывают куда, грубо говоря курсо-глиссадная система, можно ещё поставить маркеры ближний и дальний(они почемуто в русской версии метками названы).
Ещё можно радиомаяки ставить - то-же самое с электричеством, сам маяк - статические - радиомаяк, у него можно частоту выставить, и тогда самолёт с радиополукомпасом выставивший эту частоту будет ловить сигнал и соответственно направляться к этому маяку, на Br-20 можно попробовать , только надо кнопки назначить на смену нав. частоты, у меня мышкой ошибки писало, спрошу у программеров что за хрень. Вообще планировалось, чтобы эти маяки ещё и музычку могли играть и её бы слышно было, но это Рудольф не сделал к сожалению.
Вот пример миссии - она мусорная правда, но понять наверное можно - на круглом острове маяки стоят с частотами 301-303 и 310, на аэродроме система слепой посадки стоит, можно Бр на Хе поменять посмотреть

Вариант простой миссии, с примерами работы радио и подачи питания:

миссия:
[PARTS]
core.100
bob.100
[MAIN]
MAP Land$Online_Cross_v_Roundel
BattleArea 0 0 32768 32768 10000
TIME 10
WeatherIndex 0
CloudsHeight 1000
BreezeActivity 10
ThermalActivity 10
player BoB_LW_LG2_I.000
[GlobalWind_0]
Power 3.000 0.000 0.000
BottomBound 0.00
TopBound 1500.00
GustPower 5
GustAngle 45
[splines]
[AirGroups]
BoB_LW_LG2_I.01
[BoB_LW_LG2_I.01]
Flight0 1
Class Aircraft.BR-20M
Formation FINGERFOUR
CallSign 26
Fuel 100
Weapons 1
Skill 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3
[BoB_LW_LG2_I.01_Way]
NORMFLY 16049.12 14650.34 3500.00 300.00
NORMFLY 12316.71 17632.80 500.00 300.00
[CustomChiefs]
[Stationary]
Static9 Stationary.Airfield.OuterMarker nn 12833.81 17204.95 0.00 /radioFreq 380
Static19 Stationary.Airfield.Radio_NDB_Beacon nn 12145.44 17336.83 0.00 /radioFreq 303
Static3 Stationary.Environment.JP3_Generator_15_KW_UK1 gb 12562.19 17467.56 0.00 /target AIChief_0
Static10 Stationary.Airfield.InnerMarker nn 12228.69 17516.94 0.00 /radioFreq 380
Static7 Stationary.RadioBeacon.GenericLongRangeMast gb 12291.04 17659.86 0.00 /radioFreq 302
Static5 Stationary.Airfield.SBA_hat_antena nn 12347.77 17608.13 -45.00 /radioFreq 300
Static18 Stationary.Airfield.InnerMarker nn 12442.97 17859.78 0.00 /radioFreq 380
Static21 Stationary.Environment.JP3_Generator_15_KW_UK1 gb 15168.32 21703.62 0.00 /target AIChief_2
Static20 Stationary.RadioBeacon.GenericLongRangeMast gb 15199.37 21724.73 0.00 /radioFreq 310
Static4 Stationary.RadioBeacon.GenericLongRangeMast gb 10573.69 23114.16 0.00 /radioFreq 301
Static6 Stationary.Environment.JP3_Generator_15_KW_UK1 gb 10691.42 23142.45 0.00 /target AIChief_1
Static8 Stationary.Environment.JP3_Generator_15_KW_UK1 gb 10624.26 23280.12 0.00 /target AIChief_1
[Buildings]
[BuildingsLinks]
[AIChiefs]
AIChief_0 0 12556 17437/script powerOn.cpp/r 500
AIChief_1 0 10707 23212/script powerOn.cpp/r 500
AIChief_2 0 15152 21731/script powerOn.cpp/r 200


У меня заработало. :)

podvoxx
13.01.2012, 01:31
О, спасибо. Как раз вышки поставил на филдах, правда чтобы отличить их от недействующих. Теперь дать ток, назначить частоту и они еще и пользу будут приносить ))

Charger
13.01.2012, 01:33
О, спасибо. Как раз вышки поставил на филдах, правда чтобы отличить их от недействующих. Теперь дать ток, назначить частоту и они еще и пользу будут приносить ))

Я в "деревне" попробовал с радиомашинками поиграться, и с радиооборудованием вообще, интересное намечается. Как получу дельное что-то скажу :)

podvoxx
13.01.2012, 01:45
Я в "деревне" попробовал с радиомашинками поиграться, и с радиооборудованием вообще, интересное намечается. Как получу дельное что-то скажу :)

Вот тут (http://www.sukhoi.ru/forum/showthread.php?t=73858)я по связи начал работать, правда царь ненастоящий, но есть :) Как кстати такой пункт связи правильно называется?
Если я до деревни снова доберусь она очень преобразится, поднаторел я тут в последнее время))

Charger
13.01.2012, 11:59
Вот тут (http://www.sukhoi.ru/forum/showthread.php?t=73858)я по связи начал работать, правда царь ненастоящий, но есть :) Как кстати такой пункт связи правильно называется?
Если я до деревни снова доберусь она очень преобразится, поднаторел я тут в последнее время))

Я сегодня попробую тест маленький сделать, на радио. А называлось радарный пост. Обычно обеспечивался двумя радиомашинами, либо стационарными сборными конструкциями, парой генераторов, ПВО МЗА и СЗА, с ПУАЗО и дальномерным постом. Штабной домик. Дома что-то было по организации поста радионаблюдения.

podvoxx
13.01.2012, 12:03
Я сегодня попробую тест маленький сделать, на радио. А называлось радарный пост. Обычно обеспечивался двумя радиомашинами, либо стационарными сборными конструкциями, парой генераторов, ПВО МЗА и СЗА, с ПУАЗО и дальномерным постом. Штабной домик. Дома что-то было по организации поста радионаблюдения.

Там другое назначение, радары я воткнул для красоты, так как не нашел радиоантенны обычные. Это связисты, которым наземные войска сообщают какую-то информацию , а они передают ее авиации.

Charger
13.01.2012, 13:24
Там другое назначение, радары я воткнул для красоты, так как не нашел радиоантенны обычные. Это связисты, которым наземные войска сообщают какую-то информацию , а они передают ее авиации.

Там есть машинки развёрнутые, с антеннами и прочими прибабахами. Сегодня покопаю чуток, скажу точно как называются и в каком разделе искать.

podvoxx
13.01.2012, 13:29
Там есть машинки развёрнутые, с антеннами и прочими прибабахами. Сегодня покопаю чуток, скажу точно как называются и в каком разделе искать.

Про этих знаю, я только Блиц нашел, у красных вроде нет такого

Charger
13.01.2012, 13:44
Про этих знаю, я только Блиц нашел, у красных вроде нет такого

Посмотрю, вроде попадалось, когда по объектам лазил.

--- Добавлено ---


Там другое назначение, радары я воткнул для красоты, так как не нашел радиоантенны обычные. Это связисты, которым наземные войска сообщают какую-то информацию , а они передают ее авиации.

А чем заставил передавать? В смысле как или каким скриптом?

podvoxx
13.01.2012, 13:50
А чем заставил передавать? В смысле как или каким скриптом?
Скриптом. Когда наземный юнит умирает - сервер отправляет сообщение с задержкой и вероятностью 30%, довольно просто делается. Можно написать отдельный скрипт для подмиссии и получиться добавить на любую карту и в любой режим игры просто подгрузив эту подмиссию. При уничтожении машинок - замолкает.

Charger
13.01.2012, 13:51
Я нахал. :ups: Поделись плиз, или скажи, где пример посмотреть.

podvoxx
13.01.2012, 14:00
Я нахал. :ups: Поделись плиз, или скажи, где пример посмотреть.

Там делов "на 5 копеек" :) Его пока нет, все в одном файле и там много лишнего. Если получится я сделаю отдельную подмиссию со скриптом чтобы был готовый пример, но пока не знаю когда это будет.

Small_Bee
13.01.2012, 14:15
Молодцы елки, сижу и руки потираю )))

Charger
13.01.2012, 14:22
Там делов "на 5 копеек" :) Его пока нет, все в одном файле и там много лишнего. Если получится я сделаю отдельную подмиссию со скриптом чтобы был готовый пример, но пока не знаю когда это будет.

Спасибо, добрый человек :beer:



Молодцы елки, сижу и руки потираю )))

Нам тебя не догнать ;)

Small_Bee
13.01.2012, 14:29
Нам тебя не догнать ;)

Кто кого догоняет? В одной упряжке все, надо понимать )). Даст Бог, в субботу вечером будем прикручивать тестовую стату на p4, а там видно будет.

Charger
13.01.2012, 14:51
Кто кого догоняет? В одной упряжке все, надо понимать )). Даст Бог, в субботу вечером будем прикручивать тестовую стату на p4, а там видно будет.

В смысле бежим, конечно вместе :) Складываем результат и делаем себе игру на все времена :) Но я тут читаю :) И по Ил-2ФХ помню ;) Уважаю. :beer:

SlavikSG
13.01.2012, 16:07
...Даст Бог, в субботу вечером будем прикручивать тестовую стату на p4, а там видно будет.
А я обиделся на эту игру. И не имею больше ни малейшего желания разбираться с этими скриптами дальше. Разработчики ее сделали так, что практически только один человек на всю Россию в состоянии что-то написать и что-то действительно серьезное в ней улучшить.

Это же надо было такое сваять, что только единицы могут и имеют желание разбираться с этим "художеством". Это как же должно было так удивительно совпасть, чтобы замечательный программист C# оказался еще при этом и фанатом этой игры! А если бы не было Small_Bee, чтобы мы все делали?! Полезли бы с нуля изучать новый для себя язык программирования только для того, чтобы освоить игровое скриптописание?! Да в топку это все!!! Инструментарий игры должен быть сделан так, чтобы любой, мало-мальски подкованный человек, смог бы что-то делать в Полном редакторе. И не осваивать при этом с нуля целые языки программирования только ради одной игрушки. Вспоминается старый добрый FlashPoint и та огромная масса интереснейших миссий и кампаний, написанных к нему. А все почему? Потому, что там достаточно было пары вечеров, чтобы понять и освоить, как создаются миссии.

А если взять те самые офлайн кампании, написанные самими разработчиками, и так любезно прилагающиеся к самой игре, то от этой скукоты вообще плакать хочется. И это при таком ОГРОМНОМ потенциале самой игры. Разработчиков понять можно. После того, как был написан такой невероятно сложный, новый игровой продукт, остальное было просто тупо и лень делать. А ведь могли сделать! Да так, что пальчики оближешь. Да так, что игру покупали бы не только фанаты Ил-2, но обычные смертные игроманы. И не ставили бы ее на полку после первого запуска. Увлеклись бы так, что за уши не оттащишь, пополнив своими несметными мясными полчищами все онлайн сервера. Могли бы сделать интереснейшие, динамические развивающиеся, кампании. Но не стали. Забили и плюнули.

Small_Bee нужно памятник при жизни ставить, а вот на разработчиков я в серьезной обиде.

Можете начинать кидать в меня камни... :(

(простите, накипело)

podvoxx
13.01.2012, 16:27
А я обиделся на эту игру. И не имею больше ни малейшего желания разбираться с этими скриптами дальше. Разработчики ее сделали так, что практически только один человек на всю Россию в состоянии что-то написать и что-то действительно серьезное в ней улучшить.

Не согласен, но камни кидать не буду)). Я чем больше разбираюсь тем больше вижу возможностей, причем каких-то суперзнаний не нужно, чтобы миссии писать. Почитал в ветке РОФа про управление сервером которое только недавно появилось - нам всем крупно повезло, что нам дали c#, а не маленький набор команд с кучей ограничений. Сейчас пока это не очень очевидно, но со временем это принесет свою пользу.
По Арме. Там на данный момент несколько типов скриптов, причем один из них по синтаксису c++. И там тоже много проблем у новичков, и там тоже есть какие-то готовые скрипты которыми пользуются, но в отличие от БОБа там
- больше юзеров, значит больше вероятность что найдутся способные ребята
- большой набор команд для скриптов и разработчики постоянно добавляют новые (на null там проверять не надо)
- сверхудобная Вики с полной информацией по модам, скриптам и т.п.
- SDK и царство модов
- цивилизованный багтрекер

Выкинуть все это и мы получим БОБ :) Как говорится чем богаты.

Charger
13.01.2012, 16:36
SlavikSG!
Камней кидать не буду, но скажу, терпение и труд всё перетрут, и тебя изотрут :)
Не переживай, сделаем под себя всё. Подожди немного, научимся. Я к первому Илу ПР мучил и сам маялся около года, пока наконец разобрался что куда и к чему...


podvoxx, согласен. Мясом, мы ещё обрастём. Не стоит даже думать, что у НАС не получится!

Small_Bee
13.01.2012, 16:45
Дык мало-мальски и можно сделать в полном редакторе без всяких скриптов. Дорогу осилит идущий.
Живу я кстати не в России. Скриптами занимаюсь далеко не один, и собственно с С# я работаю всего-то чуть больше года, но влюбился в него по-уши ))
Все будет, Москва не сразу строилась.

SlavikSG
13.01.2012, 16:51
...Все будет, Москва не сразу строилась.
Ладно. Ждем, в общем... Твоей статистики и коммандера. :)

Charger
13.01.2012, 16:52
Del. Рано.

Small_Bee
13.01.2012, 16:55
---

Charger
13.01.2012, 19:30
Внимание! Вся информация здесь на основе собственных опытов и подсказок. Что-то верно, что-то нет. Используйте информацию с осторожностью. Если поможет, буду рад, если не помогло, извините.
Про радары даже не спросил :(
Скрипт ПВО подозреваю называется baseAntiAir.cpp и как мне кажется должен работать аналогично скрипту рowerOn.cpp То есть имеющиеся средства ПВО должны попадать в его радиус звукопеленгатор( работает, выбрать исполнительный скрипт возможно, за самолётом следит, надо тестировать) и целью должен быть скрипт. Попытка установить радар и запитать его не удалась, так же невозможно выбрать радарную цель(в смысле навести радар на скрипты питания и оповещения ПВО). Радио для британцев не обнаружил... Либо надо ставить блитц, либо спрашивать чего можно поставить вместо.
Знающие больше моего, поправьте, я могу добросовестно заблуждаться.


[PARTS]
core.100
bob.100
[MAIN]
MAP Land$Online_Cross_v_Roundel
BattleArea 0 0 32768 32768 10000
TIME 15
WeatherIndex 0
CloudsHeight 1400
BreezeActivity 2
ThermalActivity 2
player BoB_RAF_F_3Sqn_Early.000
[GlobalWind_0]
Power 3.000 0.000 0.000
BottomBound 0.00
TopBound 0.00
GustPower 3
GustAngle 9
[GlobalWind_1]
Power 0.000 0.000 0.000
BottomBound 1450.00
TopBound 1450.00
GustPower 5
GustAngle 45
[splines]
[AirGroups]
BoB_LW_KuFlGr_706.01
BoB_LW_KuFlGr_706.02
BoB_RAF_F_3Sqn_Early.01
[BoB_LW_KuFlGr_706.01]
Flight0 1
Class Aircraft.He-115B-2
Formation VIC3
CallSign 33
Fuel 100
Weapons 1
Skill 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3
[BoB_LW_KuFlGr_706.01_Way]
NORMFLY 7781.48 26126.48 6000.00 290.00
NORMFLY 19478.48 17229.82 6000.00 290.00
NORMFLY 19478.48 17229.82 6000.00 290.00
NORMFLY 19478.48 17229.82 500.00 290.00
NORMFLY 19881.47 11430.88 500.00 290.00
[BoB_LW_KuFlGr_706.02]
Flight1 11
Class Aircraft.Do-215B-1
Formation VIC3
CallSign 33
Fuel 100
Weapons 1
Skill 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3
[BoB_LW_KuFlGr_706.02_Way]
NORMFLY 6121.10 22235.74 3000.00 290.00
NORMFLY 17626.33 20525.80 3000.00 290.00
NORMFLY 19906.25 11356.54 3000.00 290.00
[BoB_RAF_F_3Sqn_Early.01]
Flight0 1
Class Aircraft.SpitfireMkIIa
Formation VIC3
CallSign 7
Fuel 100
Weapons 1
Skill 0.63 0.42 0.84 1 0.32 0.79 1 0.84
[BoB_RAF_F_3Sqn_Early.01_Way]
NORMFLY 16339.25 24095.61 3000.00 290.00
NORMFLY 10108.18 20380.05 3000.00 290.00
NORMFLY 17100.82 18626.12 3000.00 290.00
NORMFLY 18785.52 22018.59 3000.00 290.00
LANDING 12692.92 17449.14 3000.00 290.00
[CustomChiefs]
[Stationary]
Static10 Searchlight.90_cm_SearchLight_UK1 gb 13057.67 21032.38 -60.00 /target AIChief_0
Static4 Artillery.Bofors gb 11346.09 21201.90 -60.00 /timeout 0/radius_hide 0
Static11 Stationary.Environment.JP3_Generator_15_KW_UK1 gb 12719.40 21213.81 -60.00 /target AIChief_1
Static18 Stationary.Opel_Blitz_radio gb 12895.48 21219.38 -60.00
Static17 Aeroanchored.Balloon_winch_UK1 gb 12074.60 21284.46 -60.00 /hstart 15
Static13 Stationary.Environment.Fire_pump_UK2 gb 12172.94 21296.49 -60.00
Static15 Stationary.RadioBeacon.GenericLongRangeMast gb 12397.57 21280.30 -60.00 /radioFreq 315
Static16 Aeroanchored.Balloon_winch_UK1 gb 12555.60 21254.59 -60.00 /target AIChief_0
Static14 Stationary.Environment.HeightFinder_UK1 gb 11980.69 21321.28 -60.00
Static12 Stationary.Environment.PKDP_UK1 gb 12141.29 21312.84 -60.00
Static9 Searchlight.90_cm_SearchLight_UK1 gb 12267.01 21332.06 -60.00 /target AIChief_0
Static20 Artillery.SoundLocator_MkIIIV_UK1 gb 12287.14 21398.42 -60.00 /timeout 0/radius_hide 0/target AIChief_0
Static5 Artillery.Bofors gb 11948.55 21444.64 -60.00 /timeout 0/radius_hide 0
Static0 Artillery.3_inch_20_CWT_QF_Mk_I_StandAlone gb 11391.42 21511.90 -60.00 /timeout 0/radius_hide 0
Static6 Artillery.Bofors gb 12391.62 21558.70 -60.00 /timeout 0/radius_hide 0
Static8 Searchlight.90_cm_SearchLight_UK1 gb 12622.39 21547.65 -60.00 /target AIChief_0
Static1 Artillery.3_inch_20_CWT_QF_Mk_I_StandAlone gb 11698.50 21577.71 -60.00 /timeout 0/radius_hide 0
Static7 Artillery.Bofors gb 12711.87 21633.27 -60.00 /timeout 0/radius_hide 0
Static2 Artillery.3_inch_20_CWT_QF_Mk_I_StandAlone gb 12090.39 21706.39 -60.00 /timeout 0/radius_hide 0
Static3 Artillery.3_inch_20_CWT_QF_Mk_I_StandAlone gb 12502.76 21817.52 -60.00 /timeout 0/radius_hide 0
Static19 Stationary.Airfield.SBA_hat_antena gb 12900.51 21796.21 -60.00 /target AIChief_0/radioFreq 320
[Buildings]
[BuildingsLinks]
[StaticCamera]
StaticCamera_0 12351 21377 100
StaticCamera_1 12679 21531 100
[AIChiefs]
AIChief_0 0 12095 21374/script baseAntiAir.cpp/r 800
AIChief_1 0 12642 21278/script powerOn.cpp/r 600

podvoxx
16.01.2012, 13:01
В редакторе нет объектов "бомба", т.е. который можно взорвать в любом месте карты? В Арме доступны все взрывающиеся боеприпасы, можно легко устроить артподготовку, минирование и т.п., в БОБе это тоже бы очень пригодилось, т.к. артиллерии нельзя задать район для обстрела, да и не всегда нужна артиллерия. И гаубицы красной нет вроде :(

Small_Bee
16.01.2012, 13:04
В редакторе нет объектов "бомба", т.е. который можно взорвать в любом месте карты? В Арме доступны все взрывающиеся боеприпасы, можно легко устроить артподготовку, минирование и т.п., в БОБе это тоже бы очень пригодилось, т.к. артиллерии нельзя задать район для обстрела, да и не всегда нужна артиллерия. И гаубицы красной нет вроде :(

Есть объект "Бомба", походу если на него наехать машинкой, будет бабах. Больше ничего не слышал такого.

Charger
16.01.2012, 13:11
Идея возникла. Минировать морскими минами :) Опустил ниже уровня почвы, наехали на "рога" получили результат. Но это только мысль, дома проверить надо.

Charger
16.01.2012, 19:46
Облом... Не получится. пробовал не идёт :)

--- Добавлено ---

Объект называется "Взрыв бомбы" если на него наехать танком, то танк едет дальше, а на месте возникает неслабая воронка. Да, прогнал на молоцикле, машинке не приносит проблем. Надо думать :) При этом срабатывает на контакт. При заглублении повреждений не наносит вообще.

Charger
17.01.2012, 16:15
Кстати, начал потихоньку делать шаблоны для ПВО. Если кто-то занимается этим параллельно, имейте ввиду что английский ПУАЗО называется "Предсказатель".

Scavenger
17.01.2012, 16:26
Кстати, начал потихоньку делать шаблоны для ПВО. Если кто-то занимается этим параллельно, имейте ввиду что английский ПУАЗО называется "Предсказатель".

если по моим наработкам изменят интерфейс в сл патче, Блэк Сикс писал о том, что работа начата, то пуазо будет пуазом :-)

Vetochka
17.01.2012, 23:58
Есть объект "Бомба", походу если на него наехать машинкой, будет бабах. Больше ничего не слышал такого.
А "бомба" точно работает? В предыдущих патчах не работала.

Charger
18.01.2012, 00:01
А "бомба" точно работает? В предыдущих патчах не работала.


Объект называется "Взрыв бомбы" если на него наехать танком, то танк едет дальше, а на месте возникает неслабая воронка. Да, прогнал на молоцикле, машинке не приносит проблем. Надо думать :) При этом срабатывает на контакт. При заглублении повреждений не наносит вообще. а так?

Charger
20.01.2012, 16:12
Вопрос возник. Никто не копал ИИ актор аэродром? С зенитным более-менее понятно, как электричество подать тоже, спасибо naryv'у разобрались. А вот за что отвечает, или что делает ИИ-актор аэродром? Что к нему присоседить реально можно?

-atas-
20.01.2012, 21:16
Вопрос возник. Никто не копал ИИ актор аэродром? С зенитным более-менее понятно, как электричество подать тоже, спасибо naryv'у разобрались. А вот за что отвечает, или что делает ИИ-актор аэродром? Что к нему присоседить реально можно?

Можно попробовать оружейные автопоезда, которые бомбы к самолетам развозят. Такое впечатление, что видел в какой-то стоковой миссии.

Charger
20.01.2012, 21:23
Спасибо, попробуем.

Charger
23.01.2012, 09:55
Появились у меня некоторые шаблоны. Кому спасибо сказать, (не мне!) так понимаю понятно всем :) Сегодня вечером рассортирую и выложу. :)

Frezak
29.03.2012, 11:38
Ребят не посчитайте за хамство, поделитесь пожалуйста скриптом для перезагрузки карты по времени... Заранее спасибо!

podvoxx
29.03.2012, 11:45
Ребят не посчитайте за хамство, поделитесь пожалуйста скприптом для перезагрузки карты по времени... За ранее спасибо!

Именно карту из скриптов нельзя, насколько знаю. Можно отправлять команду серверу через специальный файл, здесь подробней - http://forum.1cpublishing.eu/showthread.php?t=26436. Но работает так себе, сейчас есть командеры, в них есть такая возможность - http://forum.1cpublishing.eu/showthread.php?t=29043.

Frezak
31.03.2012, 09:52
Приветствую Господа уделите малость времени, ответьте на пару вопросов...
Была такая темка http://www.sukhoi.ru/forum/showthread.php?t=69002 а теперь собственно вопросы
1) Я так понял скрипты совместно с тригерами не работают... Я правильно понял?
2) Можно ли тригер заменить скриптом? Если да, поделитесь примерами пожалуйста :)

Заранее спасибо, надеюсь тему для вопроса не перепутал... :)

podvoxx
02.04.2012, 09:36
Приветствую Господа уделите малость времени, ответьте на пару вопросов...
Была такая темка http://www.sukhoi.ru/forum/showthread.php?t=69002 а теперь собственно вопросы
1) Я так понял скрипты совместно с тригерами не работают... Я правильно понял?
2) Можно ли тригер заменить скриптом? Если да, поделитесь примерами пожалуйста :)

Заранее спасибо, надеюсь тему для вопроса не перепутал... :)

1. Работают, вот здесь (http://wiki.sukhoi.ru/index.php?title=%D0%98%D0%BB-2_%D0%A8%D1%82%D1%83%D1%80%D0%BC%D0%BE%D0%B2%D0%B8%D0%BA:_%D0%91%D0%B8%D1%82%D0%B2%D0%B0_%D0%B7%D0%B0_%D0%91%D1%80%D0%B8%D1%82%D0%B0%D0%BD%D0%B8%D1%8E._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B_%D0%B4%D0%BB%D1%8F_%D1%87%D0%B0%D0%B9%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2_-_%D0%97%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0_%D0%BF%D0%BE%D0%B4%D0%BC%D0%B8%D1%81%D1%81%D0%B8%D0%B9) пример. Однако триггеры на данный момент не всегда срабатывают или срабатывают непридвиденным образом, поэтому надежней использовать только скрипты, если задача того стоит.

2. Можно, но лучше укажи конкретное действие, которое необходимо сделать в скрипте.

Вообще лучше наверное подождать патча, возможно там будут полезные изменения и исправления в скриптах и триггерах. А может и нет :)

Frezak
02.04.2012, 10:59
1) podvoxx спасибо за ответы :)

В том что триггеры работают криво уже убедился сам, группы либо отказываются спавнится, либо спавнятся не все...

2) Нужно сделать спавн групп ботов и наземки после выполнения того или иного действия...

Опишу пример того чтобы хотелось бы сделать на карте:

группа синих танков(наземки в общем) атакует оборону красных, после уничтожения атакующих групп(синих) на 50(75, 100)% скриптом вызывается авиационная поддержка в "лице" звена штук( 110-к, хе-111) которые наносят удар по красной наземке...

В общем нужен скрипт для спавна наземки, авиагрупп, поездов и т.д после какого то действия( проход района, уничтожения группы и т.д) аналог триггеров так сказать

надеюсь изложил понятно...

З.Ы Еще хотел уточнить полный редактор при удалении групп статики только у меня жутко тормозит или у всех?

podvoxx
02.04.2012, 11:43
2) Нужно сделать спавн групп ботов и наземки после выполнения того или иного действия...
Опишу пример того чтобы хотелось бы сделать на карте:
группа синих танков(наземки в общем) атакует оборону красных, после уничтожения атакующих групп(синих) на 50(75, 100)% скриптом вызывается авиационная поддержка в "лице" звена штук( 110-к, хе-111) которые наносят удар по красной наземке...
В общем нужен скрипт для спавна наземки, авиагрупп, поездов и т.д после какого то действия( проход района, уничтожения группы и т.д) аналог триггеров так сказать

Реализовать довольно просто, хотя не смогу код написать.
Считаем сколько процентов синих убито, если определенное кол-во - загружаем подмиссию или спавним группу скриптом(второе сложнее, но можно менять юниты и их кол-во, а также место спавна и точку атаки).
Здесь (http://www.sukhoi.ru/forum/showthread.php?t=73858) лежит миссия, в которой считается кол-во уничтоженных юнитов. Еще вот этот (http://forum.1cpublishing.eu/showthread.php?t=26523) раздел очень полезный

-atas-
02.04.2012, 14:01
Вот этот командер что-то сам с триггерами делает. Возможно грузит миссию (подмиссию) по триггеру http://www.sukhoi.ru/forum/showthread.php?t=75288&p=1819840#post1819840

podvoxx
05.04.2012, 10:46
to Frezak

Вот пример с загрузкой подмиссий и уже подключенный скрипт уничтожения самолетов, позже краткое описание напишу.

Можно использовать как пример для организации структуры папок/файлов, есть пример брифингов на двух языках и загрузки подмиссий. Также подключается скрипт уничтожения разбившихся/севших/покинутых самолетов. Все подмиссии загружаются при старте миссии(можно добавить небольшой кусок кода с таймером). Также есть картинка-пример для брифинга, аэродромы с радиовышками и респауны для онлайна.

Frezak
13.04.2012, 23:42
to Frezak

Вот пример с загрузкой подмиссий и уже подключенный скрипт уничтожения самолетов, позже краткое описание напишу.

Можно использовать как пример для организации структуры папок/файлов, есть пример брифингов на двух языках и загрузки подмиссий. Также подключается скрипт уничтожения разбившихся/севших/покинутых самолетов. Все подмиссии загружаются при старте миссии(можно добавить небольшой кусок кода с таймером). Также есть картинка-пример для брифинга, аэродромы с радиовышками и респауны для онлайна.

Скажи пожалуйста я могу исспользовать данный пример для сервера? т.е я сделаю свою(красную-синюю) наземку
на тех миссиях что там уже есть..

podvoxx
14.04.2012, 22:11
Скажи пожалуйста я могу исспользовать данный пример для сервера? т.е я сделаю свою(красную-синюю) наземку
на тех миссиях что там уже есть..
Конечно можешь :) Да и СМП полную версию тоже можно

Frezak
15.04.2012, 08:44
podvoxx Пасяба

podvoxx
18.05.2012, 13:28
Файл с расширением cs - это просто исходник, чтоб выполнить код из него он должен быть откомпилирован компилятором языка C#, а результат помещен в исполняемый файл (exe) или файл динамической библиотеки (dll), которые в контексте платформы .NET называются сборками. Твой файлик со скриптом миссии при ее загрузке тоже будет откомпилирован в сборку, и помещен в папку временных файлов системы. SmallBee это подробно расписал в начале темы Как реализовывать ("включать") скрипты? (http://www.sukhoi.ru/forum/showthread.php?t=72899).

В куске кода из твоего примера:

- Загружается сборка.
- В ней ищется класс с полным именем "RepkaMissionsLib.core.RepkaBridge".
- Динамически создается экземпляр этого типа.
- Получаются описатели методов "OnBridgeActorCreated" "OnBridgeActorCreated".
- Описатели помещаются в массив, для последующего вызова.

Хотелось бы уточнить по .dll , так скорее всего буду через нее работать.
1. Для начала: аддин это и есть .dll в папке документов пользователя? Она запускается сразу с игрой?
Мне чтобы использовать наймспэйс и методы из .dll нужно поместить ее в папку, а потом обязательно обращаться через bridge(в примере - RepkaBridge.cs)?
Сложновато пока как-то. Вроде читал где-то про существующий пример готового аддина, но не нашел.

Пока задача сводится к отправке сообщений при помощи dll, чтобы подчистить скрипт.
Лучше одну .dll делать, или разбить на несколько по типу(для независимого использования) - сообщения, статистика и т.п.?

podvoxx
15.08.2012, 10:28
http://forum.1cpublishing.eu/showthread.php?t=33883

Скрипт айдиобрифинга после посадки игрока в самолет. Есть дикторы в разделе? :)
Можно видимо mp3 плеер поставить в кабину или радио какое-нибудь

Small_Bee
15.08.2012, 11:20
http://forum.1cpublishing.eu/showthread.php?t=33883

Скрипт айдиобрифинга после посадки игрока в самолет. Есть дикторы в разделе? :)
Можно видимо mp3 плеер поставить в кабину или радио какое-нибудь

Э.. я так понял он предлагает это для мультиплеера юзать? А музыка кому играть будет - серверу?

podvoxx
15.08.2012, 11:29
Э.. я так понял он предлагает это для мультиплеера юзать? А музыка кому играть будет - серверу?
Видимо так) Мы же не имеем доступа к компьютеру игрока? Кодиак вроде для радара сделал голосовые сообщения, но там средствами игры как я понял(и сэмплы из игры)

Small_Bee
15.08.2012, 11:36
Видимо так) Мы же не имеем доступа к компьютеру игрока? Кодиак вроде для радара сделал голосовые сообщения, но там средствами игры как я понял(и сэмплы из игры)

Нет, пока не имеем. Тьфу блин, страшное слово то какое ). А семплы из игры через SayToGroup() насколько я помню, играются.
Просто скриптом сервер будет играть музыку только сам себе. )