Спасибо, информация по параметрам очень пригодится. :thx:
Еще параметр видел, но пока не проверял - I_Time. Это время на часах в кабине должно быть?
Вид для печати
Спасибо, информация по параметрам очень пригодится. :thx:
Еще параметр видел, но пока не проверял - I_Time. Это время на часах в кабине должно быть?
I_Time нет, есть I_Timer - часы и секундомер:ещё время получить можно так - GamePlay.gpTimeofDay();Код:/// <summary>
/// [Inst: Timer]
/// <para>Returns timer reading.</para>
/// <para>Generic subtype (-1) shows clock / time of day, hours, [0.0, 24.0);</para>
/// <para>Subtype 0 shows stopwatch reading, seconds.</para>
/// </summary>
I_Timer
1. Снова вопрос по GamePlay.gpNextMissionNumber(), намучался я тут с ним.
При вот таком применении выдает номер подмиссии 0. Почему так может быть? До этого -1 было получается? Почему не 1?
Задача была в методе OnActorCreated сохранить все созданные акторы в заранее созданные списки. Актор добавляется в список только если номер подмиссии совпадает с тем, что получен при помощи GamePlay.gpNextMissionNumber(). Потом этими списками легко управлять: удалять акторы, заново создавать и т.п.Код:public override void Inited()
{
SendMessage.ToServer("[TEST] Номер подмиссии - [{0}]", GamePlay.gpNextMissionNumber());
GamePlay.gpPostMissionLoad("missions\\SMP\\Battle\\submission\\destroyAI.mis");
}
Далее необходимо было удалить все созданные акторы из одного из таких списков, создать новые и также добавить по номеру подмиссии в этот же список. Аналогично третья чистка/замена
В игре выглядит так - город сначала имеет обычное зенитное прикрытие. Как только его выбирают для штурма - все зенитки удаляются и загружается усиленный набор зениток. Штурм закончился, снова загрузился первоначальный набор зениток. Это работает и вполне нормально.
Однако сначала я не заметил баг, но потом попались на глаза зенитки синие и красные в одной точке, так как удаление акторов не происходило из-за неправильно определенного номера подмиссии. Разница была в единицу.
- Т.е. первая загрузка зениток - номер определен неверно, на единицу меньше
- Вторая и третья, уже во время миссии - номер в GamePlay.gpNextMissionNumber() верный
Тут еще особенность, точнее две. В миссии используется наследование от миссии командера. И вторая - первоначально загрузка зениток происходила до Inited(), примерно так:
В этом Data в методе создания зениток правильный номер подмиссии определялся только если прибавить к нему единицу(так как на этот момент GamePlay.gpNextMissionNumber() равен нулю, т.е. номеру хост-миссии):Код:public class Mission : RSTMission
{
MissionBOR Data = MissionBOR.GetInstance; // Get MissionSMP class
public override void Inited()
{
SendMessage.ToServer("[TEST] Номер подмиссии - [{0}]", GamePlay.gpNextMissionNumber());
GamePlay.gpPostMissionLoad("missions\\SMP\\Battle\\submission\\destroyAI.mis");
}
}
Однако если потом в методе OnTickGame(к примеру) удалить акторы-зенитки и создать новые методом SetAAA(), то к номеру подмиссии уже не нужно прибавлять единицу, а если прибавить - то новые акторы не попадут в список через метод OnActorCreatedКод:public void SetAAA()
{
AAAMisNumber = GamePlay.gpNextMissionNumber() + 1;
SMPLibrary.LoadSubmission(BORLibrary.CreateAAArtilleryByTemplate(mapFile, this.Army, 0.2));
SendMessage.ToServer("[SERVER]: Номер подмиссии ААА гарнизона [{0}] - [{1}]", Name, AAAMisNumber);
}
Позже я вынес первое создание акторов в OnTickGame, номера стали совпадать.Код:public void SetAAA()
{
AAAMisNumber = GamePlay.gpNextMissionNumber();
SMPLibrary.LoadSubmission(BORLibrary.CreateAAArtilleryByTemplate(mapFile, this.Army, 0.2));
}
Т.е. сейчас так выглядит:
Выходит до загрузки хостмиссии номер подмиссии на единицу меньше определяется?Код:[15:19:09] 35>difficulty Vulnerability 1
[15:19:09] 36>difficulty WindTurbulence 1
[15:19:09] 37>missLoad missions\SMP\Battle\battle.mis
[15:19:19] 38>[15:19:19] Loading mission ...
[15:19:19] Server to [Server]: ......................
[15:19:19] Server to [Server]: [SERVER]: Инициализация миссии...ok
[15:19:20] Server to [Server]: [SERVER]: Load hostmission: Battle.mis
[15:19:20] Server to [Server]: [TEST] Номер подмиссии - [0]
[15:19:20] Load landscape...
[15:19:22] Load bridges
[15:19:22] LongBridge: wrong width. (3)
[15:19:24] Load static objects...
[15:19:25] Mission loaded. time = 5,933
[15:19:25] Loading mission ...
[15:19:25] Server to [Server]: [SERVER]: Load submission: destroyAI.mis
[15:19:25] Server to [Server]: [TEST]: ЗАГРУЖЕНА МИССИЯ # [1]
2. Вопрос по линии фронта. Сейчас она черная, это будет правиться?
3. Постоянно сообщают о взрывах на аэродромах в некоторых ангарах. Имеет ли смысл собрать информацию о таких ангарах?
Inited() вызывается до загрузки хост миссии, поэтому gpNextMissionNumber() - показывает 0, это номер хост миссии будет.
до загрузки 0-й миссии gpNextMissionNumber() будет показывать 0 (см. лог -
[15:19:09] 37>missLoad missions\SMP\Battle\battle.mis
[15:19:19] 38>[15:19:19] Loading mission ... - миссия начала загружаться
[15:19:20] Server to [Server]: [TEST] Номер подмиссии - [0] - она ещё не загружена, миссий в битве ещзё нет, gpNextMissionNumber() показывает 0
[15:19:25] Mission loaded. time = 5,933 а вот тут она уже загрузилась, в битве есть миссия, gpNextMissionNumber() покажет 1),и я очень бы не советовал загружать какие-то подмиссии до старта основной, лучше это сделать хотя-бы в OnBattleStarted().
думаю да.
ну наверное да.
а после этого уже грузить. Но в Inited-е грузить точно не стоит - может абсолютно не корректно работать.Код:public override void OnBattleStarted()
{
base.OnBattleStarted();
MissionNumberListener = -1;
}
PS а ещё - зачем 400 точек линии фронта ставить - она прокладывается как среднее между соседними маркерами разных цветов. Может проще в центре миссионных районов ставить по флажку соответствующего цвета ?
В такой конструкции работают дополнительные команды, их 5 штук - "?","help", "battle", "missLoad","record" , чтобы использовать kick и другие основные команды надо вот такую конструкцию использовать :
Код:if( !gameServerDef.consoleInput(command)) // выполнит если команда из доп. списка, в противном случае вернёт false и тогда -
gameServerDef.game.CmdExec(command)// должно выполнить основную команду
Спасибо, но с game у меня связана проблема такого плана - любая попытка обращения к нему из скрипта миссии вызывает ошибку. Что-то связанное с сериализацией. Вечером воспроизведу и точнее скажу. Аналогичная ситуация, если подсовывать свою strategy.dll, и пытаться то же самое из нее сделать.
Единственное, как работает - если подсовывать свой серверный аддин (по аналогии с синглом), и запускать ее из интерфейса игры. Там даже срабатывает активация аддина (по крайней мере событие активации приходит). А вот как то же самое сделать для выделенного сервера пока не допер.
Пока эту проблему правда (именно с командой сервера) тупо обошел - сначала команда уходит коммандеру, а он уже непосредственно в консоль ее транслирует.
И никак не получается разобрать, как работают консольные команды admin и secure.
хорошо, буду ждать уточнение, постараемся исправить.
UPD. Можно попробовать поиграть ключём scriptAppDomain в секции [rts] confs.ini:
[rts]
scriptAppDomain=0
0 или 1 возможные значения, может быть ошибка уйдёт.
Завтра напомните пожалуйста, попробую уточнить
admin позволяет назначить клиента администратором сервера. Такой клиент-админ может запускать все команды сервера - в консоль сервера их надо писать с приставкой sc перед командой, например "sc battle start" и т.п.
secure позволяет поставить пароль на, армию, группу или юнит.
Вот такая ошибка
Скрытый текст:
И кусочек кода Strategy, который ее вызывает
А именно строка GameServerIterface gi = gameServer.game;Код:public override void Init(IGamePlay gamePlay)
{
base.Init(gamePlay);
if (gamePlay is GameServerDef)
{
gameServer = (GameServerDef)gamePlay;
gameServer.EventChat += new GameDef.Chat(gameServer_EventChat);
GameServerIterface gi = gameServer.game;
string addinName = gameServer.addInName;
this.GamePlay.gpLogServer(null, "Addin name is `" + addinName + "`", null);
}
}
public override void OnEventGame(GameEventId eventId, object eventArg0, object eventArg1, int eventArgInt)
{
base.OnEventGame(eventId, eventArg0, eventArg1, eventArgInt);
}
Похожую ошибку вызывает также строка
gameServer.EventChat += new GameDef.Chat(gameServer_EventChat);
если ее написать в скрипте миссии. В стратегии нормально.
А АИ наземки правился? Просто колонны как-то плохо ездить стали(машинки разных типов). Ведущая машина постоянно на три-пять корпусов влево по направлению движения держится. Спотыкаются друг об друга часто, раньше стабильней было и резвей ехали
как я понял, при scriptAppDomain=1(по умолчанию) весь game пытается перекинуться в другой домен, что и вызывает ошибку сериализации, глав. программист сказал, что вообще game не планировался для работы из скрипта - он для своего сервера скорее. При scriptAppDomain=0 game остаётся в своём домене и ошибку не должен давать,а вот что за проблема с стартом и стопом - не знаю, вроде-бы не должно ничего страшного происходить.
только это - у меня вроде как ездили так и ездят, может им дорога узковата, если на обочину их маршрут сильно вынуждает выехать - они пытаются вернуться на дорогу, поэтому могут быть косяки.
Для юзерских меток - вот пример миссии Вложение 159600 при создании юзером метки - пишется об этом сообщение и в точку метки от позиции игрока +1000м вылетают бомбардировщики, метка рисуется у всех клиентов. Есть один момент - ивенты о метках приходят в скрипт в сингле, либо от клиентов в сетевой игре, сервер сам свои ивенты не получает.
Не знаю, может из-за сборной колонны(могут быть танки с грузовиками) так. Но первая машина всегда в стороне от дороги, позже еще потестирую. До этого проверял на двух разных дорогах, результат примерно один и тот же.
И они точно не едут по одной колее. Т.е. к примеру 5-6 машин более-менее ровно идут, а пара драндулетов на корпус или больше может в сторону уходить.
На форуме 1С не могут с метками разобраться. Нужна помощь http://forum.1cpublishing.eu/showthread.php?t=34676
Hello naryv,
thanks for posting the hind with "scriptAppDomain = 0", this finally allows me to register to the EventChat.
I have some problems with the creation of user labels. Basically I want to use gpMakeUserLabel to create a user label for each waypoint of an air group, and than use gpMakeUserLabel to draw it to the player. This is needed to show the waypoints to the players under full real realism settings.
The problem is that the labels are not displayed. The creation seems to have been successful, at least gpMakeUserLabel didn't return null. There is also no error or exception in the log.Код:public override void OnPlaceEnter(Player player, AiActor actor, int placeIndex)
{
base.OnPlaceEnter(player, actor, placeIndex);
if (actor is AiAircraft)
{
AiAircraft aiAircraft = actor as AiAircraft;
AiAirGroup aiAirGroup = aiAircraft.AirGroup();
if (aiAirGroup != null)
{
AiWayPoint[] waypoints = aiAirGroup.GetWay();
foreach (AiWayPoint waypoint in waypoints)
{
GPUserLabel userLabel = GamePlay.gpMakeUserLabel(new maddox.GP.Point2d(waypoint.P.x, waypoint.P.x), player, waypoint.P.z.ToString(System.Globalization.CultureInfo.InvariantCulture.NumberFormat), GamePlay.gpTimeofDay(), (int)GPUserIconType.Waypoint);
GamePlay.gpDrawUserLabel(new Player[] { player }, userLabel);
}
}
}
}
Am I missing something? Do I have to store the created user label in order to display it? Is it because the same player is used to create and draw it?
Hi Banks!
Now in single mission there would be event OnUserCreateUserLabel(GPUserLabel ul) after you make gpDrawUserLabel(), but it really don't display, this is bug ( hope it would be fixed with next patch, we didn't test it this way in single). But it should work in online missions, displaying labels for users thats not a server, i mean client players would get displayed labels, server player wouldn't.