[Tutorial] Simple Scripting Lessons - Trigger Part 1 (Basics)
http://forum.1cpublishing.eu/showthread.php?t=28454
Тутор от Кодиака на английском
[Tutorial] Simple Scripting Lessons - Trigger Part 1 (Basics)
http://forum.1cpublishing.eu/showthread.php?t=28454
Тутор от Кодиака на английском
Только сегодня удалось посмотреть, спасибо! Сейчас делаю миссию по захвату населенного пункта и как раз с наземкой работать придется.
Есть вопросы по зениткам. В городке их будет много, зенитный обстрел выглядит феерично, однако боеприпасов хватает примерно на 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[] { });
Крайний раз редактировалось podvoxx; 19.12.2011 в 13:46.
Можно еще вот так:
Код: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"); } }
Тут видишь ли, какое дело... Это очень все легко и просто для того, кто варится в этом C# и занимается им профессионально. Для меня же это темный лес. Был бы тут ДО КОНЦА ПОЛНЫЙ ПРИМЕР с созданием экземпляра класса и с вызовом некого метода этого класса по событию убиения чего либо в Битве, и пусть бы этот метод произвел бы звук из динамика компьютера на вроде команды "Beep". И очень желательно с комментариями на каждую строку кода. Тогда я может быть врубился бы в синтаксис всей этой мешанины "закорючек". То есть разобрался бы в последовательности написания скрипта миссии и скрипта класса, работающего с базой (или производящего звук "Beep"). И так же понял бы, как скрипт миссии должен подцеплять другую сборку. В примере Small_Bee нет ни одного комментария, (буквально за каждой командой скрипта нужно лезть в справку). Человеку, который впервые залез в этот C#, все это очень сложно. В принципе, я во все врубался пока дело не коснулось того, что игровой скрипт не поддерживает таких важных вещей, как:
Поддерживал бы, я бы уже давно начала делать статистику.Код:using System.Data; using System.Data.OleDb;
Но в любому случае спасибо на попытку пояснить мне, чайнику, всю эту сложную кухню!
Почему 15 минут? Откуда такая цифра? Зенитки хватает не больше, чем на пару минут, если она интенсивно стреляет. А потом все! Туши фонарь и выноси мебель... Все же, я воспользовался бы обычной статической зениткой с бесконечным боезапасом.
Можно по таймеру. Но тут следует учесть, что перед этим нужно удалять старую зенитку, иначе получится слоеный пирог из зениток. А значит, нужно где-то обязательно сохранять имя этой удаляемой зенитки...
Лично я не знаю другого способа респавна объектов в Битве кроме, как подзагрузкой их через вспомогательную подмиссию. Для меня пока получается несколько странная ситуация... Выходит, что в идеале, на каждый объект в битве, нужно создавать свою личную подмисссию. Сколько объектов на карте, столько и подмиссий.
Нет в русском языке слова дешеГО. Есть слово дешеВО.
Это субъективная оценка интенсивности зенитного огня, т.е. после 10 минут он уже затухающий. Так как информации никакой нет нужно проводить опыты на сколько выстрелов и времени хватает боезапаса, а на это уходит время, которое можно потратить на более важные вещи. А что это за статическая зенитка?
Плохо это, конечно. Если бы можно было создавать наземку скриптом без подмиссии можно было бы хоть в шахматы играть танчиками. А так пока только создавать скриптом новый файл с миссией, куда заносить нужные зенитки с координатами и загружать потом эту подмиссию...
Славик, скрипт поддеживает все, что поддерживает платформа .NET. Чтобы использовать классы из пространства имен System.Data надо подключить библиотеку в которой они определены, макросом //$reference, в начале скрипта:
Код://$reference "System.Data.dll" using System.Data; using System.Data.OleDb;
Я бы тоже взглянул на полный пример, но бобом вообще мало людей занимается, а скриптами и т.п. единицы. От разработчиков SDK неизвестно когда будет, как и неизвестно что в нем будет.
Вот тут http://www.desastersoft.com/en/1/0/0...downloads.html немцы дополнения делают в виде аддонов, в том числе кампанию. Может там что есть.
Крайний раз редактировалось podvoxx; 20.12.2011 в 13:05.
Подвох, там скрипты миссий практически пустые. Идут вызовы в их собственную библиотеку. Все интересное, если оно есть, находится в ней. К стати, кампания там статическая, просто с трекингом достижений пилота, наградами и прочими украшениями.
Да нет... Проверить элементарно! Ставишь самолетик в миссии (с галочкой для игрока), ставишь зенитку рядом и запускаешь это все прям из Полного редактора. Зенитка начинает стрелять по самолетику. Уйдет на это, если мне не изменяет память, не более двух минут. А вот количество залпов, я не считал. Без надобности было. В любом случае такие зенитки лучше не применять. Смотри, какие зенитки применил я (в моем скрипте). То есть взял я их из статической артиллерии, а не из "бронетехники".
Кстати, и размер умышленно выбрал побольше, чтобы игрокам было легче попадать.
Упс! А можно с этого места поподробнее?
Что значит подключить DDL-ку макросом? Сама DLL, на сколько я понимаю, сидит тут:
C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client\System.Data.dll
Но как ее подключить?
Если писать в начале скрипта буквально это:
$reference ...
то, естественно, выскакивает ошибка.
В самом Microsoft Visual Studio я просто пишу это:
и все работает на ура. А вот когда уже пытаюсь запускать сервак с таким скриптом, то выскакивает ошибка. Не видит скрипт эту "Data".Код:using System.Data; using System.Data.OleDb;
Нет в русском языке слова дешеГО. Есть слово дешеВО.
...зелёные горят.
----------------------
i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.
Точно, про эти скрипты я и забыл... спасибо
Посмотрел, в танках создается файл миссии и затем загружается. В миссии с вызовом машинок также вроде - GamePlay.gpPostMissionLoad(CreateEmrgCarMission()). Лишние сложности с этими подмиссиями получаются. Т.е. если нам нужно создать объект, мы сначала создаем миссию скриптом и ее подгружаем. Проще разработчикам добавить новый метод, который бы делал тоже самое по заданным параметрам, чем постоянно такое сложное решение писать.Код: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()))
Крайний раз редактировалось podvoxx; 20.12.2011 в 14:36.
Как же это печально: быть серьезным, взрослым, и не верить в чудеса. Сорри за оффтоп
На самом деле, файлик со скриптом это не совсем файл C#. Все, кто пытался использовать C# как скриптовый язык, рано или поздно сталкиваются с проблемой, когда в скрипте становится нужна библиотека не входящая в обычный набор. Самое простое решение: обрабатывать файл перед компиляцией препроцессором, который извлечет все макросы и интерпретирует их, например как ссылки на библиотеки в случае макроса //$reference, или указание работать в отладочном режиме, макрос //-$debug. А затем есть два пути: либо все свои макросы и пометки из файла удалять, либо сразу оформлять их как комментарии. Иначе, компилятор просто не поймет юмора, и вместо сборки мы получим ошибку unexpected character.
Крайний раз редактировалось Octocat; 20.12.2011 в 18:29.
Вопрос простой.
В редакторе при настройке брифингов есть несколько их типов. Эти понятны:
[Info] - брифинг при выборе миссии в "Отдельных заданиях" или при создании сервера
[Army Red] - брифинг красных
[Army Blue] - брифинг синих
[Army None] - брифинг игроков без армии
Есть еще два, кто-нибудь может подсказать для чего они?
[Mission]
[Regular]
...зелёные горят.
----------------------
i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.
Тут заинтересовался радиосредствами, спросил нашу надёжу и опору, naryv'а как сделать радиопривод работоспособным. Выяснилось следующее, цитата из переписки:
Вариант простой миссии, с примерами работы радио и подачи питания:Сообщение от naryv
У меня заработало.Сообщение от naryv
Крайний раз редактировалось Charger; 13.01.2012 в 19:53.
Мля, идите на дуэльный сервер - там ваши кони, сэры рыцари (c)mamali
Я дрался с асами WarBirds(c)Varga
Основная проблема русского витуального сообщества - избыток лыцарелизателей и рыцаререзателей и нехватка наевропуболтоположителей... (с)CoValent
БоБ прямее руганью не станет. (с) Harh
Oculos habent non viclebunt.(c) Псалом 134
Q9650+8GbRAM+560Ti/2Gbi7-4790k+32Gb+2060/6Gb
О, спасибо. Как раз вышки поставил на филдах, правда чтобы отличить их от недействующих. Теперь дать ток, назначить частоту и они еще и пользу будут приносить ))
Мля, идите на дуэльный сервер - там ваши кони, сэры рыцари (c)mamali
Я дрался с асами WarBirds(c)Varga
Основная проблема русского витуального сообщества - избыток лыцарелизателей и рыцаререзателей и нехватка наевропуболтоположителей... (с)CoValent
БоБ прямее руганью не станет. (с) Harh
Oculos habent non viclebunt.(c) Псалом 134
Q9650+8GbRAM+560Ti/2Gbi7-4790k+32Gb+2060/6Gb
Вот тут я по связи начал работать, правда царь ненастоящий, но есть Как кстати такой пункт связи правильно называется?
Если я до деревни снова доберусь она очень преобразится, поднаторел я тут в последнее время))
Я сегодня попробую тест маленький сделать, на радио. А называлось радарный пост. Обычно обеспечивался двумя радиомашинами, либо стационарными сборными конструкциями, парой генераторов, ПВО МЗА и СЗА, с ПУАЗО и дальномерным постом. Штабной домик. Дома что-то было по организации поста радионаблюдения.
Мля, идите на дуэльный сервер - там ваши кони, сэры рыцари (c)mamali
Я дрался с асами WarBirds(c)Varga
Основная проблема русского витуального сообщества - избыток лыцарелизателей и рыцаререзателей и нехватка наевропуболтоположителей... (с)CoValent
БоБ прямее руганью не станет. (с) Harh
Oculos habent non viclebunt.(c) Псалом 134
Q9650+8GbRAM+560Ti/2Gbi7-4790k+32Gb+2060/6Gb
Мля, идите на дуэльный сервер - там ваши кони, сэры рыцари (c)mamali
Я дрался с асами WarBirds(c)Varga
Основная проблема русского витуального сообщества - избыток лыцарелизателей и рыцаререзателей и нехватка наевропуболтоположителей... (с)CoValent
БоБ прямее руганью не станет. (с) Harh
Oculos habent non viclebunt.(c) Псалом 134
Q9650+8GbRAM+560Ti/2Gbi7-4790k+32Gb+2060/6Gb
Мля, идите на дуэльный сервер - там ваши кони, сэры рыцари (c)mamali
Я дрался с асами WarBirds(c)Varga
Основная проблема русского витуального сообщества - избыток лыцарелизателей и рыцаререзателей и нехватка наевропуболтоположителей... (с)CoValent
БоБ прямее руганью не станет. (с) Harh
Oculos habent non viclebunt.(c) Псалом 134
Q9650+8GbRAM+560Ti/2Gbi7-4790k+32Gb+2060/6Gb