[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[] { });
Можно еще вот так:
Код: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 немцы дополнения делают в виде аддонов, в том числе кампанию. Может там что есть.
Подвох, там скрипты миссий практически пустые. Идут вызовы в их собственную библиотеку. Все интересное, если оно есть, находится в ней. К стати, кампания там статическая, просто с трекингом достижений пилота, наградами и прочими украшениями.
Да нет... Проверить элементарно! Ставишь самолетик в миссии (с галочкой для игрока), ставишь зенитку рядом и запускаешь это все прям из Полного редактора. Зенитка начинает стрелять по самолетику. Уйдет на это, если мне не изменяет память, не более двух минут. А вот количество залпов, я не считал. Без надобности было. В любом случае такие зенитки лучше не применять. Смотри, какие зенитки применил я (в моем скрипте). То есть взял я их из статической артиллерии, а не из "бронетехники".
Кстати, и размер умышленно выбрал побольше, чтобы игрокам было легче попадать. :)
Упс! А можно с этого места поподробнее?
Что значит подключить 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;
Точно, про эти скрипты я и забыл... спасибо
Посмотрел, в танках создается файл миссии и затем загружается. В миссии с вызовом машинок также вроде - 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()))
Как же это печально: быть серьезным, взрослым, и не верить в чудеса. :cry: Сорри за оффтоп :D
На самом деле, файлик со скриптом это не совсем файл C#. Все, кто пытался использовать C# как скриптовый язык, рано или поздно сталкиваются с проблемой, когда в скрипте становится нужна библиотека не входящая в обычный набор. Самое простое решение: обрабатывать файл перед компиляцией препроцессором, который извлечет все макросы и интерпретирует их, например как ссылки на библиотеки в случае макроса //$reference, или указание работать в отладочном режиме, макрос //-$debug. А затем есть два пути: либо все свои макросы и пометки из файла удалять, либо сразу оформлять их как комментарии. Иначе, компилятор просто не поймет юмора, и вместо сборки мы получим ошибку unexpected character.
Вопрос простой.
В редакторе при настройке брифингов есть несколько их типов. Эти понятны:
[Info] - брифинг при выборе миссии в "Отдельных заданиях" или при создании сервера
[Army Red] - брифинг красных
[Army Blue] - брифинг синих
[Army None] - брифинг игроков без армии
Есть еще два, кто-нибудь может подсказать для чего они?
[Mission]
[Regular]
Тут заинтересовался радиосредствами, спросил нашу надёжу и опору, naryv'а как сделать радиопривод работоспособным. Выяснилось следующее, цитата из переписки:
Вариант простой миссии, с примерами работы радио и подачи питания:Цитата:
Сообщение от naryv
У меня заработало. :)Цитата:
Сообщение от naryv
О, спасибо. Как раз вышки поставил на филдах, правда чтобы отличить их от недействующих. Теперь дать ток, назначить частоту и они еще и пользу будут приносить ))
Вот тут я по связи начал работать, правда царь ненастоящий, но есть :) Как кстати такой пункт связи правильно называется?
Если я до деревни снова доберусь она очень преобразится, поднаторел я тут в последнее время))
Я сегодня попробую тест маленький сделать, на радио. А называлось радарный пост. Обычно обеспечивался двумя радиомашинами, либо стационарными сборными конструкциями, парой генераторов, ПВО МЗА и СЗА, с ПУАЗО и дальномерным постом. Штабной домик. Дома что-то было по организации поста радионаблюдения.