PDA

Просмотр полной версии : Тема для нубов в С#, которые всё-таки хотят использовать скрипты...



=Svogris=Kranz
23.04.2012, 03:28
Камрады програмисты! Если вам не трудно уважте: напишите стандартные скриптики для определённых сценарных ситуёвин (и обьяснялки типа "чтобы и дурак понял" к этим скриптикам). Для таких опоссумов в програмировании, вроде меня. Тут ведь вот в чём дело: полазал я по этой ветке, честно и самонадеянно пытаясь разобраться - и преждевременно поседел... И образцы миссий скачивал, и смотрел что там в редакторе скриптов имеется, и с бубном плясал... Нифига не помогает. Как не понимал нихрена, так и... Вот к примеру, по замыслу у мну в миссии должно произойти следующее: группа вылетает на патрулирование, в ходе которого уничтожает вражеского разведчика. Но тот, по сценарию , успевает вызвать своих ястребов, которые приходят и жёстко мстят за сбитого бомбера. Ну, ясно дело, всё вроде элементарно - гибель разведчика становится триггером, который включает зарождение мстительных асов-истребителей. Ага, думаю я себе и чтобы разобраться на живом примере лезу в миссию, выложенную Маленькой Пчёлкой (респект, кстати, парню!). И первое, во что я упираюсь - это, тупо, отсутствие триггеров в редакторе скриптов... То-есть я понимаю, что у него в показательной миссии триггеры не нужны, поскольку там триггером является уничтожение вражеской группы, которая всего одна. И когда на карте не остаётся ни одного противника, тут скрипт и срабатывает, порождая следующую группу. Ну а у меня-то вражин две группы ! Одна - бобёр-разведчик, а вторая - прикрывающая его пара ястребов... А зародиться должна более другая группа истребителей, ибо в прикрытии (по сценарию) лохи, колторые поджлежат попутному истреблению вместе с разведчиком...
В общем, ребята, если вам не трудно, ну напишите несколько стандартных скриптов для таких ситуёвин, как:
1) зарождение некой группы после уничтожения воздушной цели;
2) зарождение некой группы после уничтожения наземной цели;
3) зарождение некой группы после прохождения игроком или юнитом определённой точки на карте;
4) зарождение некой группы по истечению определённого временного интервала;
Ну и разумеется, осветите такие аспекты, как пошаговость действий. Ну, вроде: Выбираем группу, щёлкаем редактор скрипта, назначаем триггер, и присваеваем ему значение (и каким, кстати, образом мы должны указать это значение, чтобы программа связала триггер с нужным нам действом), запускающее то-то и то-то...
Ведь все эти варианты присутствуют в списке триггеров скриптового редактора. Но использовать их могут только те, кто шарит в С#... Абыдно!
Выручайте, пожалуйста)))!!!!!

podvoxx
23.04.2012, 09:05
Камрады програмисты! Если вам не трудно уважте: напишите стандартные скриптики для определённых сценарных ситуёвин (и обьяснялки типа "чтобы и дурак понял" к этим скриптикам).

Пока кратко попробую. Нужно помаленьку осваивать основы самого c#, я начинал наоборот с БОБа и постепенно на сайте MS и здесь(задавая простые довольно вопросы, спасибо за терпение отвечавшим :) ) сам язык(он сравнительно простой, логичный и красивый на самом деле, особенно для скриптов). Я и сейчас помаленьку копаюсь в нем, программку первую осознанную начал лепить. Вот здесь неплохое руководство на английском - http://www.homeandlearn.co.uk/csharp/csharp.html. Написать универсальные скрипты практически невозможно, всегда будут варианты. Проще все-таки понять суть - кирпичики, из которых можно будет собрать нужное решение(из этих кирпичиков можно будет потом составлять логику миссий любой сложности). В твоем случае это:

1. Зарождение группы самолетов по условию.
2. Условие, при котором они зарождаются (уничтожение разведчика, хотя может быть любое другое - вэйпоинт, таймер).

Триггеры я не использовал, т.к. они глючат и работают плохо, хотя их можно также отслеживать в скрипте. В Вики есть уроки на эту тему.
Если нет - скачать удобные, бесплатные и полезные программы. Это обязательно, иначе будут лишние вопросы и мучения - ссылка ниже (Visual Studio 2010 Express-предпочтительней или SharpDevelop 4.1-на крайний случай) и подключить к ним библиотеки игры - http://forum.1cpublishing.eu/showthread.php?t=28997.
Там содержатся все доступные методы/классы.
Для редактирования брифингов и быстрой правки скриптов лучше использовать бесплатный текстовый редактор Notepad++.

Начинаем допустим с этого (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):


using System;
using maddox.game;
using maddox.game.world;
public class Mission : AMission
{
public override void OnBattleStarted()
{
base.OnBattleStarted();
MissionNumberListener = -1;
}
}

Сначала создаем в папке missions(там же, гда лежат папки со стандартными миссиями Single и Dogfight) папку TEST, там будут храниться все миссии для опытов. Можно в ней же размещать другие папки(их даже можно создавать из скриптов, как и файлы миссий, текстовые файлы и т.п. для хранения сэйвов, параметров, статистики и т.д.). Допустим загружаем разведчик из подмиссии razvedchik.mis, используем метод OnActorDead для определения живы юниты или нет(здесь используется определение по номеру подмиссии, армии. Можно сохранять рожденные группы в списке и определять по нему, варианты разные могут быть. Здесь вариант именно с подмиссией. При уничтожении юнита - появится сообщение(потом можно добавить код для вызова рождения группы).



// Указываем нэймспэйсы - namespace, тут есть лишние, не могу без игры определить нужные
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using maddox.game;
using maddox.game.world;
using maddox.GP;
// далее идет код миссии

public class Mission : AMission
{
public override void OnBattleStarted() //этод метод срабатывает после старта мисссии
{
base.OnBattleStarted();
MissionNumberListener = -1;
GamePlay.gpPostMissionLoad("missions\\TEST\\razvedchik.mis"); //01 подмиссия с разведчиком
}

public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages) //этод метод срабатывает после смерти любого юнита
{
base.OnActorDead(missionNumber, shortName, actor, damages);
//сначала фильтруем сообщения о трупиках и проверяем на null, если все условия выполняютс, т.е. актор и есть тот самый разведчик - предпринимаем какие-либо действия

if (actor != null) //проверка на null
{
//AiAircraft STATISTIC
if (actor is AiAircraft) //проверяем самолет ли убитый актор
{
if (missionNumber == 1) //проверяем из какой подмиссии убитый юнит(подмиссия номер 1). С номером ноль - главная миссия, хост-миссия которую мы запускаем.
{
AiAircraft aircraft = (actor as AiAircraft);
if (aircraft != null) //проверяем на null
{

if (aircraft.Army() == 1) //проверяем армию актора, 1 или 2
{
GamePlay.gpHUDLogCenter("Внимание! Разведчик уничтожен!"); //выводим сообщение о сбитом разведчике
GamePlay.gpPostMissionLoad("missions\\TEST\\patrol.mis"); // здесь вызываем рождение группы самолетов, например грузим подмиссию

}
}
}
}
}//null
}
}


После определения армии можно встроить определения типа(бомбер, истребитель, эсминец, танкер и т.д) или имя объекта(кажется совпадает с названием в файле миссии, точно не помню). Типы есть здесь (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._AircraftType) и в архиве от Атаса. Здесь уже без игры не смогу сказать, но это все есть в подключаемых .dll. Условие будет похоже на это:

if (groundActor.Type() == AiGroundActorType.Tank)
{
GamePlay.gpHUDLogCenter("Внимание! Танк уничтожен!"); //выводим сообщение
}

В случае имени объекта будет кажется так: groundActor.Name()

naryv
23.04.2012, 12:47
В данном случае всё-же проще использовать триггеры, без скриптов, пример - 153684 . Разведчик (He-115 ) прикрывается парой 109Е-1 новичков, атакуют его 3 спита(один из них игрока), после уничтожения разведчика, "вызываются" 4 109Е-4 опытных, которые нападают на спитов. Как сделано: сначала обычным образом расставлены группы самолётов и их действия - прикрышка, атака и т.д. Для группы появляющейся по триггеру, не забываем ставить галочку "рождение скриптом" - это значит, что пока не выполнится действие, группа не "родится". Потом выбираем триггеры, создаём новый с типом GroupDestroy и справа по кнопочке "выбрать группу" выбираем нашего "разведчика". Когда выбранный самолёт будет уничтожен - триггер сработает. Далее надо чтобы по срабатыванию триггера родилась новая группа. Копируем название триггера(в примере оно "оригинальное" - "trigger":) ) и создаём в соседней вкладке экшн с таким же названием - этот экшн выполниться по срабатыванию триггера. В свойствах экшна выбираем рождение группы и по кнопке "выбрать группу" - выбираем группу "мстителей". Сохраняем всё, запускаем. При уничтожении "разведчика" срабатывает триггер и запускает экшн рождающий новую группу, они прилетают и пытаются отомстить спитам.

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

=Svogris=Kranz
23.04.2012, 16:45
В данном случае всё-же проще использовать триггеры, без скриптов...
Скрипты в такого рода миссиях не нужны особо - с ними получится сложнее и дольше, их стоит применять для более нетривиальных сцен.
Спасибо, naryv! Посмотрел твою миссию, выставил всё также у себя и обрадовался - заработало! Но потом пришла печалька - осмелев попробовал-было добавить ещё один триггер и обломался :(. Первый - продолжает срабатывать и запускает рождение "мстителей", а вот второй - не срабатывает... удаляю первый - второй начинает работать... Может конечно я чёй-то напахал, но вроде делал всё правильно... А ты не пробовал два триггера в миссию засунуть? Получалось? Или это у Бобки такая особенность?

2 podvoxx. Спасибо, камрад! Попробую разобраться. И то верно, в самом деле - XXI Век на дворе, а я дуб дубом)))! Ежели чё - буду к тебе за советом обращаться, ладно?

podvoxx
23.04.2012, 16:57
2 podvoxx. Спасибо, камрад! Попробую разобраться. И то верно, в самом деле - XXI Век на дворе, а я дуб дубом)))! Ежели чё - буду к тебе за советом обращаться, ладно?

Конечно)

naryv
23.04.2012, 18:23
Спасибо, naryv! Посмотрел твою миссию, выставил всё также у себя и обрадовался - заработало! Но потом пришла печалька - осмелев попробовал-было добавить ещё один триггер и обломался :(. Первый - продолжает срабатывать и запускает рождение "мстителей", а вот второй - не срабатывает... удаляю первый - второй начинает работать... Может конечно я чёй-то напахал, но вроде делал всё правильно... А ты не пробовал два триггера в миссию засунуть? Получалось? Или это у Бобки такая особенность?
конечно, два триггера работают - второй пример : 153685 добавлена группа 110-х, которая появляется при уничтожении прикрышки разведчика(оставил один Е1, чтобы побыстрее его сбить :) ) . Вы, скорее всего, добавив второй триггер не сделали экшн который должен запуститься по срабатыванию второго триггера, либо не назвали его так-же как этот второй триггер, а по умолчанию есть жёсткая связь - по срабатыванию триггера запускается экшн одноимённый со сработавшим триггером, это важно помнить. Если экшна одноимённого с триггером нет, ничего и не сработает :).

=Svogris=Kranz
23.04.2012, 20:28
конечно, два триггера работают - второй пример : 153685 добавлена группа 110-х, которая появляется при уничтожении прикрышки разведчика(оставил один Е1, чтобы побыстрее его сбить :) ) . Вы, скорее всего, добавив второй триггер не сделали экшн который должен запуститься по срабатыванию второго триггера, либо не назвали его так-же как этот второй триггер, а по умолчанию есть жёсткая связь - по срабатыванию триггера запускается экшн одноимённый со сработавшим триггером, это важно помнить. Если экшна одноимённого с триггером нет, ничего и не сработает :).
Да вроде сделал экшн и обозвал его также как триггер - "trigger_1" (без кавычек, разумеется), но видимо что-то всё-равно напутал :). Сейчас буду изучать trigger_sample2, и разбеираться - где именно напахал... Заранее спасибо.
ЗЫ. Может, если не против, меня на "ты" лучше :beer:? А то я вроде-как, того... Перешёл без спросу... Неудобно теперь:ups:

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

Не. И в trigger_sample2 у меня не работает. Видимо что-то с моим Бобом. Вот гадство-то... Проверил в стиме целостность кеша и выяснилось, что два каких-то файла не прошли проверку и загружены по-новой, но один хрен - второй триггер не запускает действие... Чё теперь делать хрен его знает... naryv, есть какие-нибудь соображения?

naryv
23.04.2012, 22:41
Да вроде сделал экшн и обозвал его также как триггер - "trigger_1" (без кавычек, разумеется), но видимо что-то всё-равно напутал :). Сейчас буду изучать trigger_sample2, и разбеираться - где именно напахал... Заранее спасибо.
ЗЫ. Может, если не против, меня на "ты" лучше :beer:? А то я вроде-как, того... Перешёл без спросу... Неудобно теперь:ups: Хорошо, можно "на ты":)


Не. И в trigger_sample2 у меня не работает. Видимо что-то с моим Бобом. Вот гадство-то... Проверил в стиме целостность кеша и выяснилось, что два каких-то файла не прошли проверку и загружены по-новой, но один хрен - второй триггер не запускает действие... Чё теперь делать хрен его знает... naryv, есть какие-нибудь соображения? Сейчас дома проверил - всё работает, чтобы сработал второй триггер - надо уничтожить один Е1 "прикрывающий разведчика". Попробуй в начале миссии (внешние виды лучше включёнными сделать для теста)правой кнопкой->посмотреть самолёт-> должно быть в списке Хе-115, 109Е1 и три спита, атаковать Е1 первым, дождаться, чтобы он совсем умер - упал в воду , на землю и взорвался и т.п. Потом - правой кнопкой->посмотреть самолёт-> в списке должны добавиться 4 110х. Тут вроде косякам неоткуда браться:)

=Svogris=Kranz
24.04.2012, 00:32
Разобрался в чём дело. Действительно, всё работает. Просто я Е1 вообще не атаковал, а сцеплялся сразу с Е4-ми... И покончив с ними ждал, что 110-е народятся.
Ну а в моём случае косяк был вот где - запускателем своего второго триггера я назначал группу, зародившуюся от первого триггера. Я кстати, поначалу думал, что и в твоём примере так, потому и ждал появления 110-х после уничтожения Е4-х, а Е1-го игнорил. Но похоже что (как это не грустно), если на группу, запущенную первым триггером (в твоём примере это Е4) повесить триггер, запускающий рождение новой группы (у тебя это 110-е), то этот второй триггер не сработает. По крайней мере, у мну не получилось... Жаль. Очень удобная фишка была бы.

naryv
24.04.2012, 12:01
Но похоже что (как это не грустно), если на группу, запущенную первым триггером (в твоём примере это Е4) повесить триггер, запускающий рождение новой группы (у тебя это 110-е), то этот второй триггер не сработает. По крайней мере, у мну не получилось... Жаль. Очень удобная фишка была бы. да, так не сработает - триггер "взводится" при старте миссии, а при старте группы, которая родится по первому триггеру ещё нет, соответственно и триггер на её уничтожение не сработает. Здесь уже надо скриптами пользоваться.