да, раздел лебёдки , там немецкая и английская лебёдки с аэростатами, если галочка стоит - высота фиксируется, если нет - после таймаута с начальной до конечной высоты будет перемещаться.
Вид для печати
да, раздел лебёдки , там немецкая и английская лебёдки с аэростатами, если галочка стоит - высота фиксируется, если нет - после таймаута с начальной до конечной высоты будет перемещаться.
Вложение 144538Установка высоты статического аэростата(не лебёдка).
У меня такой вопрос - можно ли из подмиссии через другую подмиссию загрузить окопы и др. обЪекты из группы "Здания" и если да, то как. На выходных мучался и не понял как (получается только если добавить их в файл первой хост миссии).
Подскажите пожалуйста как вызвать скриптом стандартную функцию перезарядки и заправки самолета? Где то здесь вычитал что вроде такая функция есть и она длится вроде около получаса. Но как её вызвать. Вроде посмотрел соответсвующие темы найти не могу.
Тоже пробовал. Сплайновые дороги и здания из подмиссий не загружаются.
--- Добавлено ---
Нет такой функции, и вроде как не будет. Да и смысл ждать 30 минут, когда можно создать новый самолет и переместить себя на место его пилота. Команда: player.PlaceEnter(aircraft, placeIndex);
Скорее всего ты скрипт видел. http://www.sukhoi.ru/forum/showthread.php?t=71750 тут что-то есть
И по смене самолета: http://www.sukhoi.ru/forum/showthread.php?t=72046
--- Добавлено ---
Спасибо, хотя и так вроде работает.
Запостите пожалуйста, у кого английская версия клиента, названия британских, немецких и итальянских позывных (callsigns), и названия скилов пилотов. Можно текстом, или скриншотами из полного редактора, как удобнее.
Влияет только на внешний вид. У меня идейка есть насчет скрипта отказов систем самолета. То есть в зависимости от изношенности возрастает вероятность поломки. Следовательно вопрос - можно ли получить параметр износа для самолета игрока и как, если это возможно? Систему отказов можно и так организовать в принципе, адреналинчику может добавить.
И еще вопрос, не могу найти что-то. Как получить стимовское ID игрока и его ник?
Еще один (надеюсь не столь риторический как предыдущие) вопрос. При задании наземке маршрутов линии между вэйпоинтами постоянно цепляются к дорогам, что просто ужасно мешает и утомляет. Приходится ради такого элементарного действия двигать туда-сюда вэйпоинты и результат так себе получается. Галочка в меню "Проложить дороги" не ставится. В итоге, когда танкам нужно наступать по полю они ищут дорожки, вэйпоинтов вместо двух становится три-четыре. Это баг или так задумано? Если задумано, то могу сказать что эта задумка отнимает в три раза больше времени, чем следовало бы тратить на прокладку маршрутов.
Хотелось бы, чтобы было так: в свойствах каждой точки маршрута наземки, был чекбокс "Использовать дороги".
Если он включен, маршрут выбирается с учетом дорог, иначе - по полю напрямую. Этот чекбокс по умолчанию включен у обычных маршевых точек маршрута, и выключен у точек типа АТАКА.
Серверная команда host + прочитать чат телнетом (Small_Bee умеет :) ).
--- Добавлено ---
Проще при застревании на 3-5 минут скриптом их переносить на 500 м. вперед, если не в бою и если там не вода. 41Sqn_Banks емнип писал на желтом.
Например перед мостами бывают застревания, когда поворот очень крутой, танк на скорости не вписывается.
Вопрос по статистике.В "Битве за деревню" в ходе миссии нужно учитывать уничтоженные вражеские объекты:
- зенитная артиллерия - AAGun
- противотанковая артиллерия, стационарные танки из раздела "Артиллерия" - Artillery
- самолеты
- наземная техника("живая")
Все будет довольно простенько силами самой миссии без всяких заморочек: убил зенитку - получай +20, убил бомбер +50 и т.п.
Во время миссии стороны могут вызывать подкрепления, каждая миссия будет стоить определенное количество очков. Счет будет вестись для красных и синих. Сам подсчет я себе примерно представляю, а вот как хранить и/или передавать данные не очень. Если писать заработанные очки в файл, то может так получиться что к этому файлу будет несколько обращений одновременно.
1. Можно хранить очки в переменной, но я не знаю как сделать эту переменную доступной в нескольких запущенных скриптах. Кто-нибудь может подсказать как это делается?
2. И еще сопутствующий вопрос: как удобней и правильней задавать/читать параметры из конфиг-файла. Сейчас у меня в каждой строчке параметр в виде string, допустим "1" или текст какой-то. Хотелось бы(точнее это уже необходимость) что-то вроде этого:
И чтобы оно легко менялось неподготовленным человеком(не учитывались лишние пробелы и т.п.). Подробно не нужно, общее направление и/или хорошей ссылки будет достаточно. Заранее спасибоКод:maxNumberPlanes = 10
RedPoints = 560
С точки зрения .NET ini файлы походу рассматриваются как архаизм, и родных классов для чтения ини в нем вроде как и нет. заменой ини служит XML. В этом случае смотреть в сторону XDocument.
Если все же ини, то читаем сюда - http://msdn.microsoft.com/ru-ru/library/ezwyzy7b.aspx.
После ищем первое вхождение знака "равно" и по нему разбиваем строку на имя-значение. После убираем лишние пробелы через trim(). Смотрим String http://msdn.microsoft.com/ru-ru/library/a292he7t.aspx
В инете есть классы разработанные третьими лицами для работы с ини, на крайний случай.
По поводу разделения данных между миссиями можно свой аbattle сделать через дополнения (только для оффлайна, онлайн тоже вроде можно, но как - хз).Соответственно он будет доступен всем миссиям. Все остальные способы относительно сложные.
Правда я не вижу задач, которые бы это требовали. Убиение наземки можно из одной миссии отслеживать, и там же считать очки и принимать решения о запрете или разрешении вызова новой миссии.
а зачем в нескольких скриптах? В стартовом скрипте можно считать всю статистику по OnActorDead и всё.
есть класс ISectionFile с помощью которого можно читать "секционные" файлы, в файле формат записи такой примерно :
где VARS - имя секции, "attackTime" - имя ключа и "30" - значение, "=" не надо писать. Обрабатывить так примерно:Код:[VARS]
attackTime 30
attackedMarkers 1
frontMarkers 1
attackCountsRed 3
attackCountsBlue 3
attackTanksNrRed 4
attackTanksNrBlue 4
Код:public class Mission : AMission
{
// переменные из инишника
internal double attackTime = 10;
internal int attackedMarkers = 10;
internal int frontMarkers = 10;
internal int attackCountsRed = 30;
internal int attackCountsBlue = 30;
internal int attackTanksNrRed = 40;
internal int attackTanksNrBlue = 40;
public void iniFileRead()
{
ISectionFile iniFile = GamePlay.gpLoadSectionFile("missions\\Multi\\Dogfight\\SmallWar\\smallWar.ini");
string section, key, value;
section = "VARS";
key = "attackTime";
value = iniFile.get(section, key);
if (value != null)
double.TryParse(value, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture.NumberFormat, out attackTime); // в переменную attackTime записывается значение ключа key = "attackTime"
key = "attackedMarkers";
value = iniFile.get(section, key);
if (value != null)
int.TryParse( value, out attackedMarkers); // в переменную attackTime записывается значение ключа key ="attackedMarkers"
key = "frontMarkers";
value = iniFile.get(section, key);
if (value != null)
int.TryParse( value, out frontMarkers);
key = "attackCountsRed";
value = iniFile.get(section, key);
if (value != null)
int.TryParse( value, out attackCountsRed);
key = "attackCountsBlue";
value = iniFile.get(section, key);
if (value != null)
int.TryParse( value, out attackCountsBlue);
key = "attackTanksNrRed";
value = iniFile.get(section, key);
if (value != null)
int.TryParse( value, out attackTanksNrRed);
key = "attackTanksNrBlue";
value = iniFile.get(section, key);
if (value != null)
int.TryParse( value, out attackTanksNrBlue);
}
}
Спасибо за ответы!
Не очень подходит вариант, так как использую для основы загрузчик и кол-во очков стороны должно влиять на возможность загрузки миссии через меню- если их недостаточно ,миссия не грузится, выводится соответствующее сообщение. В один файл все скидывать не хочется, он и так уже большой.
За секции отдельное спасибо, видел похожий код в миссии "Танки", там таким образом создаются файлы миссии.
naryv, а можно еще по этим вопросам разъяснить:
http://www.sukhoi.ru/forum/showthrea...=1#post1755337
http://www.sukhoi.ru/forum/showthrea...=1#post1744470
Обновление в коллекции от Атаса, как раз про подсчет очков и мн. другое - http://forum.1cpublishing.eu/showpos...3&postcount=14. :thx:
ну, мне кажется так удобнее - меню же в стартовом скрипте создаётся? Если в нём же и статистика ведётся - проще разрешать или нет запуск миссии, можно вообще по очкам показывать только доступные для загрузки миссии в меню. А несколько перекрёстно связанных скриптов это скорее всего какие-нибудь глюки будут, я так никогда не делал.
да, конечно, файл миссии - это тоже секционный файл.
так задумано, техника старается по дороге всегда ехать, на дорогах скорость гораздо выше чем "в поле". "Проложить дороги" - это пункт, который позволяет сплайновую дорогу из сплайна сделать дорогой, он к маршрутам движения напрямую не относится. В принципе при прокладке маршрута достаточно начальной и конечной точек, остальной маршрут оптимальный сама группа выбирает. Вот в городах проблема, да, там домов очень много :(.
Сейчас не могу ответить, по моему здания нельзя было подгрузить но мне надо уточнять.
А как же бой? У меня есть группа танков (допустим 15 штук), мне достаточно только две точки - начало движения и конец на вражеской позиции. Когда ставишь второй вэйпоинт маршрут начинает прилипать к дорогам и танк в результате подставляет бок под прицел противотанковой артиллерии на поворотах. Если дорог много или она близко от направления атаки - это довольно быстро утомляет двигать туда-сюда, притом что это ни к чему и вредно для танкистов. Ну и не реалистично, вчера тестировал - по шоссе три танчика едут по ПДД, хотя вокруг все горит и взрывается, в том числе и их собратья в поле. Помогает поставить больше вэйпоинтов. А это +15 точек, у меня три таких подмиссии +45 точек всего, довольно много времени отнимает.
Может настройку ввести какую-нибудь, чтобы отключить движение по дорогам, если не требуется?
Для авиасима двигаются неплохо вполне, в Арме примерно также очень часто бывает :)
Да и даже реалистичности можно сказать добавляет - пока он в городе плутает, его легче добить артиллерии и самолетам
емнип в бою танки должны в боевой порядок перестраиваться и направляться в сторону врага, когда заметили того, но это когда заметят, в случае неожиданного огня их судьба сгореть :) .
Не знаю, точно не в ближайшее время, и будет ли вообще - обещать не могу.
ну, всё-же иногда очень тупят:)
ВНИМАНИЕ! Код приведенный здесь не работает, рабочая версия кода находится на несколько постов ниже.
Подвох, если все скрипты исполняются в одном процессе, то обмен данными можно организовать так:
Код:// требуемые пространства имен
using System.Windows;
using System.Collections.Generic;
// при инициализации хост миссии создаем и регистрируем таблицу достижений пилотов
var table = new Dictionary<Player, int>();
Application.Current.Properties.Add("PlayerScoreTable", table);
// в процессе игры, в подмиссии, получаем количество очков пилота
if (Application.Current.Properties.Contains("PlayerScoreTable"))
{
// получаем таблицу
var tablex = (Dictionary<Player, int>)Application.Current.Properties["PlayerScoreTable"];
// блокируем таблицу на время использования
lock (tablex)
{
// тут получаем, не важно откуда, объект нужного нам игрока
Player player = GamePlay.gpPlayer();
// проверяем, есть ли в таблице запись для указанного игрока
if (tablex.ContainsKey(player))
{
// получаем количество очков
int score = tablex[player];
// добавляем указанному игроку 25 очков
tablex[player] += 25;
}
else
{
// добавляем в таблицу запись для указанного игрока
tablex.Add(player, 0);
}
}
}
Если под рукой нет Вижуал Студио, в подобных случаях можно делать так:
- Смотрим какие новые классы введены в программу:
1. Dictionary - он из System.Collections, и к возникшей проблеме явно не имеет отношения.
2. Application - этот подозрительный, смотрим на него доку в онлайн MSDN-е, и там видим такие строчки:
Namespace: System.Windows.Forms
Assembly: System.Windows.Forms (in System.Windows.Forms.dll)
Ага, это явно наш пациент. :D
Добавляем в скрипт макрос с линком на указанную в доке сборку:
//$reference System.Windows.Forms.dll
Полный путь к сборке указывать не надо, она системная, поэтому заранее откомпилированная лежит в глобальном кэше сборок, и там будет найдена по любому. ;)
Спасибо, формы видел, но в мсдн пропустил мимо мозга :) Еще и папку NET всю просмотрел, теперь знают где что лежит. А студия не работает, только 2008я и только с++, решение -переустановка системы, но эти сотни гигабайт музыкальных программ убивают напрочь такое желание))
По кикобане посредством скриптов ничего нового? Все остановилось на этом?
http://forum.1cpublishing.eu/showthr...246#post348246
Как получить чьё-то сообщение из чата?
Small_Bee кажется говорил, что его лимитер-коммандер читает чат через телнет. Телнет программка, что стоит на Репках тоже видит, что в чате пишется.
По другому видимо только лог копировать, сравнивать с новым и парсить новые строчки, что образовались.
Разработчики давно молчат по этому поводу.
Подвох, сорри за нерабочий пример, вот 100% рабочий код:
Код://$reference "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Xaml.dll"
//$reference "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WindowsBase.dll"
//$reference "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\PresentationFramework.dll"
using System;
using System.Globalization;
using System.IO;
using System.Windows;
using maddox.game;
using maddox.GP;
using maddox.game.world;
public class Mission : AMission
{
private void Log(string format, params object[] args)
{
GamePlay.gpLogServer(new[] { GamePlay.gpPlayer() }, string.Format(CultureInfo.InvariantCulture, format, args), null);
}
public override void OnBattleInit()
{
base.OnBattleInit();
try
{
if (Application.Current == null)
{
new Application();
Log("**Application Instance Created");
}
Application.Current.Properties.Add("AF2505FCA", "OurStatsTable");
Log("**Stats Table Added");
if (Application.Current.Properties.Contains("AF2505FCA"))
{
Log("**Stats Table Founded");
Log("**Value is: {0}", (string)System.Windows.Application.Current.Properties["AF2505FCA"]);
}
}
catch (Exception error)
{
Log("**EXCEPTION: {0}", error);
}
}
}
Полная версия, с таблицей достижений:
Код://$reference "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Xaml.dll"
//$reference "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WindowsBase.dll"
//$reference "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\PresentationFramework.dll"
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Windows;
using maddox.game;
using maddox.game.world;
public class Mission : AMission
{
private void Log(string format, params object[] args)
{
GamePlay.gpLogServer(new[] { GamePlay.gpPlayer() }, string.Format(CultureInfo.InvariantCulture, format, args), null);
}
public override void OnBattleInit()
{
base.OnBattleInit();
try
{
// Master-mission
if (true)
{
var player = GamePlay.gpPlayer();
var pscore = PlayerScore.Get(player.Name());
Log("********Initial PlayerScore {0}", pscore);
}
// Submission
Timeout(5, () =>
{
var player = GamePlay.gpPlayer();
var pscore = PlayerScore.Get(player.Name());
pscore.KillsGnd++;
pscore.Score += 10;
Log("********PlayerScore After Tank Destroyed {0}", pscore);
});
// Another submission
Timeout(10, () =>
{
var player = GamePlay.gpPlayer();
var pscore = PlayerScore.Get(player.Name());
pscore.KillsAir++;
pscore.Score += 50;
Log("********PlayerScore After Aircraft Killed {0}", pscore);
});
}
catch (Exception error)
{
Log("********EXCEPTION: {0}", error);
}
}
class PlayerScore
{
public string Name { get; private set; }
public double Score { get; set; }
public int KillsAir { get; set; }
public int KillsGnd { get; set; }
public override string ToString()
{
return string.Format(CultureInfo.InvariantCulture,
"Name:{0} Score:{1} KillsAir/Ground: {2}/{3}", Name, Score, KillsAir, KillsGnd);
}
public static PlayerScore Get(string pname)
{
if (Application.Current == null)
{
new Application();
}
string token = "AF2505FCA";
Dictionary<string, PlayerScore> table = null;
if (Application.Current.Properties.Contains(token))
{
table = (Dictionary<string, PlayerScore>)Application.Current.Properties[token];
}
else Application.Current.Properties.Add(token, table = new Dictionary<string, PlayerScore>());
PlayerScore pscore = null;
if (table.TryGetValue(pname, out pscore) == false)
{
table.Add(pname, pscore = new PlayerScore() { Name = pname });
}
return pscore;
}
}
}
Спасибо большое! :thx:
Пока не пробовал, но уже выяснил что NET 4.0 у меня по указанному пути нет.:eek: В этой папке только 3.0 , 3.5. Сам 4-й есть, на всякий случай заново установил. Наверное искать его надо :)
Нашелся в папке Windows по такому пути:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319
На сервере это не создаст проблемы?
Да, у меня они тоже там есть. Поправил исходный пост.
Попробуй, думаю все будет нормально.
1. Сейчас есть возможность в скриптах завершить миссию без использования аддинов? И загрузить потом следующую, т.е. oрганизовать ротацию?
Пробовал сделать ротацию на выделенном - первая миссия грузится нормально, в последующих подмиссии не грузятся. Читал на желтом о различии команд f и file, но не разобрался, подписсии все равно оказываются за бортом.
2. Старт самолетов на парковке сейчас корректно работает?
Нарисовалась проблема. Запустил миссию на выделенном, все воюет считается нормально, а как только сам захожу выскакивают ошибки и почти все объекты пропадают из миссии. Самому можно вообще заходить на свой выделенный?
Раньше это удавалось... Что в скрипте может приводить к такой ошибке?
Код:=================================================
[21:56:12] System.NullReferenceException: Object reference not set to an instance of an object.
[21:56:12]
[21:56:12] Server stack trace:
[21:56:12] at 6UZP66dp5dKAdD5LMYr.F9pJL9dGtcbAt8r8Umh.JwjWWYN9w9(xnKDxkk8wATA33F3hpA , G7xPRi2e9fpuLtHG23a )
[21:56:12] at 5iyST5gABhh0WhImZtw.4W7PgSgvHpySuqonJno.sp1UnA9jmwb(Player[] , String , Object[] , Double )
[21:56:12] at 5iyST5gABhh0WhImZtw.4W7PgSgvHpySuqonJno.yEy1eAe2YPQxskLBZIku(Object , Object , Object , Double )
[21:56:12] at 5iyST5gABhh0WhImZtw.4W7PgSgvHpySuqonJno.d87UnNOmgnm(Player[] , String , Object[] )
[21:56:12] at pqlnUTF7gnMAoU4L9MP.lm1GgkFoiOOBGu1gmwf.ZnhKPrKgxsgJUIGtmgOK(Object , Object , Object )
[21:56:12] at pqlnUTF7gnMAoU4L9MP.lm1GgkFoiOOBGu1gmwf.HUDLogCenter(Player[] , String , Object[] )
[21:56:12] at maddox.game.GameDef.gpHUDLogCenter(Player[] to, String msg, Object[] parms)
[21:56:12] at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
[21:56:12] at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)
[21:56:12]
[21:56:12] Exception rethrown at [0]:
[21:56:12] at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
[21:56:12] at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
[21:56:12] at maddox.game.IGamePlay.gpHUDLogCenter(Player[] to, String msg, Object[] parms)
[21:56:12] at Mission.sendScreenMessageTo(Int32 army, String msg, Object[] parms)
[21:56:12] at Mission.OnActorDead(Int32 missionNumber, String shortName, AiActor actor, List`1 damages)
[21:56:12] at maddox.game.world.Strategy.OnActorDead(Int32 missionNumber, String shortName, AiActor actor, AiDamageInitiator initiator)
[21:56:12] at maddox.game.ABattle.OnEventGame(GameEventId eventId, Object eventArg0, Object eventArg1, Int32 eventArgInt)
[21:56:12] at maddox.game.world.Strategy.OnEventGame(GameEventId eventId, Object eventArg0, Object eventArg1, Int32 eventArgInt)
[21:56:12] at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
[21:56:12] at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)
[21:56:12]
[21:56:12] Exception rethrown at [1]:
[21:56:12] at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
[21:56:12] at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
[21:56:12] at maddox.game.IBattle.OnEventGame(GameEventId eventId, Object eventArg0, Object eventArg1, Int32 eventArgInt)
[21:56:12] at maddox.game.GameDef.eventGame(GameEventId eventId, Object eventArg0, Object eventArg1, Int32 eventArgInt)
[21:56:12] at RoFTf9069W6jWRmA8PN.U2RoVL0OVdWjVQJ7319.eventGame(GameEventId , Object , Object , Int32 )
[21:56:12] at NTlYp6NdtgpnKt7wGgO.VvFELvNie2My3mOTesk.WPGBQuHHKI8(GameEventId , Object , Object , Int32 )
[21:56:12] =================================================
Это только из .cmd файла вроде. Из скрипта должно работать если все миссии будут подмиссией мастермиссии или 2я миссия будет подмиссией первой и т.д. Самое надежное, наверное, все подмиссии всех миссий из одного мастер-скрипта грузить.
Ошибка вроде бы с отправкой сообщений как-то связана. Попробуй отключить. На выделенном сервере отсутствуют player, есть только remoteplayers емнип. У Kodiak система сообщений для онлайна и офлайна отличается поэтому.
Так и есть сейчас. Могу выслать миссию
Вот тут может быть. Хотя на нуль проверяется, а у Кодиака скрипты универсальные. Видимо из-за player, хотя проверка стоит же вроде..
Код://=========================LOCALIZATION=============================
string[] languageArray = { "en", "ru", "de", "fr", "es", "cs", "it", "pl" };
//******************Localize Message Method*******************
private string getLocalizedMessage(string textTranslate)
{
if (GamePlay.gpPlayer() != null)
{
string[] localizeArray;
string langIndex = GamePlay.gpPlayer().LanguageName();
switch (textTranslate)
{
//GET TEAM POINTS and win-msg
case "getPointsRED":
{
localizeArray = new string[]
{
"Red team gets points for complite task : ",
"Команда красных получает очки за выполнение задания: ",
"Red team gets points for complite task : ",
"Red team gets points for complite task : ",
"Red team gets points for complite task : ",
"Red team gets points for complite task : ",
"Red team gets points for complite task : ",
"Red team gets points for complite task : "
};
return localizeArray.GetValue(Array.IndexOf(languageArray, langIndex)).ToString();
} break;
}
return textTranslate;
}
//======================================================================
[QUOTE=podvoxx;1767574]Так и есть сейчас. Могу выслать миссию
Вот тут может быть. Хотя на нуль проверяется, а у Кодиака скрипты универсальные.
Высылал ты мне эту миссию? Если хочешь, прикручу к ней свой локалайзер и отправлю назад - сразу пример будет.
Сами сообщения сервера проходят как положено. Думаю разберусь, только нескоро получится. Заодно добавлю еще пару интересных вещей.
Кажется нашел ошибку, хотя не уверен. Много раз читал тему, но все равно особенности выделеного не учел.
Сам скрипт сообщений работает идеально.
Код://******************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);
}
Пока "в игре" только [Server] - локализация тоже работает правильно, но в ней есть определение языка игрока:Код:[21:34:02] Server to [Server]: ======================================
[21:34:02] Server to [Server]: RED> [ 142 ] / [ 166 ] <BLUE
[21:34:02] Server to [Server]: Миссия будет остановлена через 2 min.
[21:34:02] Server to [Server]: ======================================
[21:34:19] Server to [Server]: Команда красных уничтожила самолет-разведчик синих[ 1 ]
[21:34:19] Server to [Server]: Команда красных получает очки за выполнение задания: [ 100 ]
[21:34:19] Server: Bf 110 C-4 () (Бот) сбил FW 200 () (Бот).
Получается, что текст сообщения определяется по GamePlay.gpPlayer()(скорее всего здесь конфликт), а сообщения отправляются массиву игроков(они все могут оказаться с разными языками):Код:string langIndex = GamePlay.gpPlayer().LanguageName();
Попробую сделать определение языка для каждого игрока из массива и тправку сообщений в соответствии с ним, но я не очень хорошо понимаю отличия выделенного/сингла от мультиплеера. Хотел бы уточнить, чтобы правильно понимать что происходит с этими плеерами, так как они везде используются.Код:sendScreenMessageTo(-1, getLocalizedMessage("noWinner"), new object[] { });
Для сингла и dedi:
GamePlay.gpPlayer() - это кто?
Для мультиплеера:
GamePlay.gpRemotePlayers() - массив игроков на сервере(он состоит из GamePlay.gpPlayer() ?)
И почему определение игрока отличается для сингла и выделенного?
Еще пара вопросов.
1.
GamePlay.gpPlayer() - игрок , выделенный сервер/сингл
GamePlay.gpPlayer().LanguageName() - язык игрока, string, вида "ru", "en" и т.д.
GamePlay.gpPlayer().Army() - армия игрока, может быть 1 и 2
GamePlay.gpRemotePlayers() - игрок , мультиплеер через главное меню
GamePlay.gpRemotePlayers().Length - количество игроков
Какие еще есть варианты и можно ли при помощи GamePlay.gpPlayer() определить ник игрока?
2.
Корректно ли в БОБе будет использовать метод определения и отсчета времени на основе DateTime?
Например для отсчета времени от начала миссии? Подойдет для точной засечки времени в миссии на гоночном сервере?
3.Код:DateTime dateTime = DateTime.Now;
C.WriteLine ("d = {0:d}", dateTime ); // mm/dd/yyyy
C.WriteLine ("D = {0:D}", dateTime ); // month dd, yyyy
C.WriteLine ("f = {0:f}", dateTime ); // day, month dd, yyyy hh:mm
C.WriteLine ("F = {0:F}", dateTime ); // day, month dd, yyyy HH:mm:ss AM/PM
C.WriteLine ("g = {0:g}", dateTime ); // mm/dd/yyyy HH:mm
C.WriteLine ("G = {0:G}", dateTime ); // mm/dd/yyyy hh:mm:ss
C.WriteLine ("M = {0:M}", dateTime ); // month dd
C.WriteLine ("R = {0:R}", dateTime ); // ddd Month yyyy hh:mm:ss GMT
C.WriteLine ("s = {0:s}", dateTime ); // yyyy-mm-dd hh:mm:ss (Sortable)
C.WriteLine ("t = {0:t}", dateTime ); // hh:mm AM/PM
C.WriteLine ("T = {0:T}", dateTime ); // hh:mm:ss AM/PM
// yyyy-mm-dd hh:mm:ss (Sortable)
C.WriteLine ("u = {0:u}", dateTime );
// day, month dd, yyyy hh:mm:ss AM/PM
C.WriteLine ("U = {0:U}", dateTime );
// month, yyyy (March, 2006)
C.WriteLine ("Y = {0:Y}", dateTime );
C.WriteLine ("Month = " + dateTime.Month); // month number (3)
// day of week name (Friday)
C.WriteLine ("Day Of Week = " + dateTime.DayOfWeek);
// 24 hour time (16:12:11)
C.WriteLine ("Time Of Day = " + dateTime.TimeOfDay);
// (632769991310000000)
C.WriteLine("DateTime.Ticks = " + dateTime.Ticks);
// Ticks are the number of 100 nanosecond intervals since 01/01/0001 12:00am
// Ticks are useful in elapsed time measurement.
Есть примеры с использованием Stopwatch(), он тоже подходит для отсчета времени? Выглядит очень удобным
Подвох, вот SharpDevelop - думаю неплохой вариант для тебя, раз уж студия не встает. Ставишь, подключаешь игровые либы, как описано здесь [Tutorial] Simple Scripting Lessons - Preparations. Писать и отлаживать код в блокноте - это не вариант.