PDA

Просмотр полной версии : Вопросы.



Страницы : 1 2 3 [4]

naryv
21.11.2012, 14:12
Из-за чего могут пропадать все декали мелкого калибра после достижения определенного их количества? (подробности по ссылке у меня в подписи) бага какая-то, не отловленная :(. Только эта тема скорее про редактор и скрипты:)

eekz
21.11.2012, 14:36
бага какая-то, не отловленная :(.

Будем копать :)

podvoxx
04.12.2012, 09:02
Вопрос по респаунам BirthPlace появился.

Есть набор эскадрилий, у каждой на вооружении стоят определенные самолеты. Задача - изменение плейнсета на аэродроме в зависимости от находящихся на нем эскадрилий.

При загрузке миссии читается файл сохранения, откуда берется список эскадрилий и аэродромы на которых они базируются, далее в цикле каждая авиачасть добавляется на свой аэродром. При этом удаляется старый респаун с таким же именем и создается новый. Но тут я не учел время на загрузку подмиссии с респауном(а он создается как подмиссия). Получается что удаления не происходит, т.к. респаун еще не был загружен. В результате загружаются все подмиссии с респаунами и для каждой эскадрилии создается свой отдельный с таким же именем(кол-во респаунов равно кол-во добавленных эскадрилий, т.к. неактуальные не удаляются). При получении массива выглядит это примерно так:



[22:23:16] Server to [podvoxx]: [TEST]: BirthPlace [Dieppe_Saint_Aubin]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.SpitfireMkIIa]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.SpitfireMkI]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.SpitfireMkIa]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.SpitfireMkIa_100oct]
[22:23:16] Server to [podvoxx]: [TEST]: BirthPlace [Grandvilliers]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.HurricaneMkI_100oct]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.HurricaneMkI_dH5-20]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.HurricaneMkI]
[22:23:16] Server to [podvoxx]: [TEST]: BirthPlace [Deauville_Saint_Gatien]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.HurricaneMkI_100oct]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.HurricaneMkI_dH5-20]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.HurricaneMkI]
[22:23:16] Server to [podvoxx]: [TEST]: BirthPlace [Montdidier]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.BlenheimMkIV]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.DH82A]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.BR-20M]
[22:23:16] Server to [podvoxx]: [TEST]: BirthPlace [Dieppe_Saint_Aubin]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.SpitfireMkIIa]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.SpitfireMkI]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.SpitfireMkIa]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.SpitfireMkIa_100oct]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.BlenheimMkIV]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.DH82A]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.BR-20M]


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

Вопрос такой. Возможно ли создание BirthPlace не используя подмиссию(чтобы сразу получить над ним контроль, не дожидаясь загрузки подмиссии)?
Возможно ли модифицировать уже созданный BirthPlace(поменять настройки, изменить список самолетов). Нашел пока только методы для чтения параметров BirthPlace.

Если нельзя ни первое ни второе хотелось бы, чтобы в будущем такая возможность была(подмиссии неудобны для динамичных респаунов). Также пригодилось бы событие на создание BirthPlace.
Ну и может какой-нибудь совет кто-то даст, как в таком случае решить проблему корректной замены респауна на новый с удалением старого(так как именно он выбирается при клике на карте).
Я пока придумал вариант с периодическим(например 5-10 сек) сканированием массива GamePlay.gpBirthPlaces() и при наличии в нем BirthPlace с одинаковыми именами удалять имеющие меньший индекс, но это будут постоянные проверки в OnTickGame()

naryv
04.12.2012, 11:26
Вопрос по респаунам BirthPlace появился.

Есть набор эскадрилий, у каждой на вооружении стоят определенные самолеты. Задача - изменение плейнсета на аэродроме в зависимости от находящихся на нем эскадрилий.

При загрузке миссии читается файл сохранения, откуда берется список эскадрилий и аэродромы на которых они базируются, далее в цикле каждая авиачасть добавляется на свой аэродром. При этом удаляется старый респаун с таким же именем и создается новый. Но тут я не учел время на загрузку подмиссии с респауном(а он создается как подмиссия). Получается что удаления не происходит, т.к. респаун еще не был загружен. В результате загружаются все подмиссии с респаунами и для каждой эскадрилии создается свой отдельный с таким же именем(кол-во респаунов равно кол-во добавленных эскадрилий, т.к. неактуальные не удаляются). При получении массива выглядит это примерно так:



[22:23:16] Server to [podvoxx]: [TEST]: BirthPlace [Dieppe_Saint_Aubin]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.SpitfireMkIIa]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.SpitfireMkI]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.SpitfireMkIa]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.SpitfireMkIa_100oct]
[22:23:16] Server to [podvoxx]: [TEST]: BirthPlace [Grandvilliers]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.HurricaneMkI_100oct]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.HurricaneMkI_dH5-20]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.HurricaneMkI]
[22:23:16] Server to [podvoxx]: [TEST]: BirthPlace [Deauville_Saint_Gatien]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.HurricaneMkI_100oct]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.HurricaneMkI_dH5-20]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.HurricaneMkI]
[22:23:16] Server to [podvoxx]: [TEST]: BirthPlace [Montdidier]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.BlenheimMkIV]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.DH82A]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.BR-20M]
[22:23:16] Server to [podvoxx]: [TEST]: BirthPlace [Dieppe_Saint_Aubin]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.SpitfireMkIIa]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.SpitfireMkI]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.SpitfireMkIa]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.SpitfireMkIa_100oct]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.BlenheimMkIV]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.DH82A]
[22:23:16] Server to [podvoxx]: [TEST]: at [Aircraft.BR-20M]


Создано два респауна Dieppe_Saint_Aubin с одинаковыми координатами, но активный тот, что создан первым(где доступны только спиты). Это не дает быстро менять доступные самолеты на аэродромах, нужно вводить какую-то задержку для загрузки подмиссии с респауном. я бы просто в миссию с BirthPlace-ом из списка все доступные самолёты добавлял и эту миссию грузил - получится на одном аэродроме - один спаун, с доступными самолётами, не надо никаких таймеров и т.п. что-то типа такого -
ISectionFile f = GamePlay.gpCreateSectionFile();
string sect;
string key;
string value;
for (int i = 0; i < список аэродромов.length; i++)
{
sect = "BirthPlace";
key = список аэродромов[i].name;
string Country = ".";
if (army == 1) Country = "gb"; // страну выбираем
if (army == 2) Country = "de";
value = " " + army.ToString() + " " + (список аэродромов[i].x).ToString() + " " + (список аэродромов[i].y).ToString() + " 0 " + BPMaxPlanesAllowed + " " + BPSpawnParked + " 0 " + Country + " . .";
f.add(sect, key, value);

sect = "BirthPlace" + список аэродромов[i].name;
string[] PlaneSet = список нужных самолётов;
if (PlaneSet.Length > 0)
for (int j = 0; j < PlaneSet.Length; j++)
{
key = PlaneSet[j];
value = "";
f.add(sect, key, value);
}
}
GamePlay.gpPostMissionLoad(f); а в Вашем варианте, более поздние не доступны скорее не потому-что удаляться не успевают, а стоят в одной точке и при клике на них берётся какой-то верхний из списка. Ну либо надо вокруг аэродрома их расставлять, чтобы не в одной точке были.


Вопрос такой. Возможно ли создание BirthPlace не используя подмиссию(чтобы сразу получить над ним контроль, не дожидаясь загрузки подмиссии)?
Возможно ли модифицировать уже созданный BirthPlace(поменять настройки, изменить список самолетов). Нашел пока только методы для чтения параметров BirthPlace. нет, создать без миссии или модифицировать нельзя, только дестроить и читать св-ва.


Я пока придумал вариант с периодическим(например 5-10 сек) сканированием массива GamePlay.gpBirthPlaces() и при наличии в нем BirthPlace с одинаковыми именами удалять имеющие меньший индекс, но это будут постоянные проверки в OnTickGame() ну вот как выше написал, например, по событию когда надо сменить спаун - удаляете старый и генерите миссию в которой в одном спауне все нужные самолёты прописаны(у меня правда для списка аэродромов написано но для одного то-же самое будет, без верхнего цикла), мне кажется это оптимальный вариант.

podvoxx
04.12.2012, 11:37
я бы просто в миссию с BirthPlace-ом из списка все доступные самолёты добавлял и эту миссию грузил - получится на одном аэродроме - один спаун, с доступными самолётами, не надо никаких таймеров и т.п. что-то типа такого -

Я так и сделал, но так как респауны постоянно меняются, а время загрузки подмиссии выходит за пределы методов, то только что созданные респауны не обрабатываются(не загрузились). Еще попробую сделать что-то вроде очереди событий типа удалить/создать, которые будут добавляться в список и обрабатываться по таймеру последовательно и учитывать время на загрузку подмиссии. А лучше наверное в событии OnMissionLoaded поставить на проверку - если есть уже такой респаун просто заменять его

naryv
04.12.2012, 12:07
А лучше наверное в событии OnMissionLoaded поставить на проверку - если есть уже такой респаун просто заменять его да, так можно без таймеров обойтись - если миссия загрузилась - тогда можно со спауном работать, не дёргаясь постоянно в тиках.

Я так и сделал, но так как респауны постоянно меняются, а время загрузки подмиссии выходит за пределы методов, то только что созданные респауны не обрабатываются(не загрузились). Еще попробую сделать что-то вроде очереди событий типа удалить/создать, которые будут добавляться в список и обрабатываться по таймеру последовательно и учитывать время на загрузку подмиссии. тут я не очень понял, спауны меняются многократно в пределах секунд?

podvoxx
04.12.2012, 12:13
тут я не очень понял, спауны меняются многократно в пределах секунд?
Да, при загрузке миссии эскадрилии добавляются на аэродром и "обновляют" респауны за очень маленький промежуток времени(по логу - в пределах одной секунды, в следующую секунду уже идет сообщение о загрузке подмиссий, но к этому времени все эскадрилии распределены). Такая же ситуация может случится при одновременном перебазировании

naryv
04.12.2012, 12:48
Да, при загрузке миссии эскадрилии добавляются на аэродром и "обновляют" респауны за очень маленький промежуток времени(по логу - в пределах одной секунды, в следующую секунду уже идет сообщение о загрузке подмиссий, но к этому времени все эскадрилии распределены). Такая же ситуация может случится при одновременном перебазировании
всё равно не очень понял - если в течении короткого времени спауны много раз обновляются - это, наверное, не очень хорошо с точки зрения построения логики миссии, а если один раз обновляется - тогда секундная задержка не влияет ни на что , нет?

podvoxx
04.12.2012, 13:08
всё равно не очень понял - если в течении короткого времени спауны много раз обновляются - это, наверное, не очень хорошо с точки зрения построения логики миссии, а если один раз обновляется - тогда секундная задержка не влияет ни на что , нет?

Они обновляются, только когда добавляются эскадрилии на аэродром, что-то вроде Airfield.Add(Sqadron Name). Добавление происходит при загрузке миссии, при отступлении с потерянной территории, при перебазировании. В методе Add происходит сначала удаление старого респауна с тем же именем(если он есть) и загрузка подмисии с новым(в котором изменяется только список доступных самолетов). Загрузка подмиссии происходит независимо от выполнения метода Add в том смысле, что добавлено уже несколько эскадрилий, а респаун еще не один не загрузился. Timeout я не могу в коде dll поставить, да и неправильно это будет так как неизвестно сколько миссия грузится. Т.е. проблема в том, что нет метода который бы создавал респаун и только после него код исполнялся дальше, сейчас одно с другим не связано. Было бы проще при возможности изменять список самолетов/вооружения уже созданных респаунов - тогда их можно было бы создать "пустыми" заранее и управлять уже только параметрами.
OnMissionLoaded позволит сделать "пошаговую" загрузку - даже если код по созданию респаунов уже выполнен здесь можно проверить результат и убрать ненужные респауны.

naryv
04.12.2012, 13:27
Они обновляются, только когда добавляются эскадрилии на аэродром, что-то вроде Airfield.Add(Sqadron Name). Добавление происходит при загрузке миссии, при отступлении с потерянной территории, при перебазировании. В методе Add происходит сначала удаление старого респауна с тем же именем(если он есть) и загрузка подмисии с новым(в котором изменяется только список доступных самолетов). Загрузка подмиссии происходит независимо от выполнения метода Add в том смысле, что добавлено уже несколько эскадрилий, а респаун еще не один не загрузился. Timeout я не могу в коде dll поставить, да и неправильно это будет так как неизвестно сколько миссия грузится. Т.е. проблема в том, что нет метода который бы создавал респаун и только после него код исполнялся дальше, сейчас одно с другим не связано. Было бы проще при возможности изменять список самолетов/вооружения уже созданных респаунов - тогда их можно было бы создать "пустыми" заранее и управлять уже только параметрами.
OnMissionLoaded позволит сделать "пошаговую" загрузку - даже если код по созданию респаунов уже выполнен здесь можно проверить результат и убрать ненужные респауны.
Ага, так вроде бы понятнее, Airfield.Add может приключаться в любой, заранее не известный момент времени и для каждого аэродрома их может быть любое количество, так? Если так и у аэродрома есть список эскадрилий на нём, я бы в конце метода Add вызвал бы функцию, которая удаляла бы спаун с именем аэродрома(если такой уже есть) и генерировала миссию со спауном в который записывались бы все доступные эскадрильи/самолёты и грузила бы её, тогда после крайнего Add-а для аэродрома всегда на нём будет актуальный спаун. Ну а если списка нет - тогда сделать его для аэродрома, и в Add добавлять сначала эскадрилью в этот список, а потом запускать рефреш спауна для этого аэродрома.

podvoxx
04.12.2012, 13:51
Ага, так вроде бы понятнее, Airfield.Add может приключаться в любой, заранее не известный момент времени и для каждого аэродрома их может быть любое количество, так? Если так и у аэродрома есть список эскадрилий на нём, я бы в конце метода Add вызвал бы функцию, которая удаляла бы спаун с именем аэродрома(если такой уже есть) и генерировала миссию со спауном в который записывались бы все доступные эскадрильи/самолёты и грузила бы её, тогда после крайнего Add-а для аэродрома всегда на нём будет актуальный спаун. Ну а если списка нет - тогда сделать его для аэродрома, и в Add добавлять сначала эскадрилью в этот список, а потом запускать рефреш спауна для этого аэродрома.
Примерно так я и сделал(или даже точно также, список и рефреш есть), но проблема появляется из-за отсутствия времени на загрузку подмиссии. Либо нужно метод Add делать индивидуальный для загрузки сохранения(чтобы сначала собирался список самолетов и потом только один раз создавался респаун). Такой же метод нужно использовать при отступлении на ближайшие аэродромы - если сейчас я последовательно перебрасываю методом Add более двух эскадрилий - подмиссия тоже не успеет загрузиться(нужно будет сначала сформировать общий список и только потом менять респаун).

naryv
04.12.2012, 14:12
Примерно так я и сделал(или даже точно также, список и рефреш есть), но проблема появляется из-за отсутствия времени на загрузку подмиссии. Либо нужно метод Add делать индивидуальный для загрузки сохранения(чтобы сначала собирался список самолетов и потом только один раз создавался респаун). Такой же метод нужно использовать при отступлении на ближайшие аэродромы - если сейчас я последовательно перебрасываю методом Add более двух эскадрилий - подмиссия тоже не успеет загрузиться(нужно будет сначала сформировать общий список и только потом менять респаун). да, что-то я не подумал, что несколько спаунов могут параллельно грузиться. Тогда по загрузке миссии проверять и старые спауны чистить.

podvoxx
05.12.2012, 10:02
Хотел сделать блокировку аэродромов по результату падения бомб на взлетку, однако нашел только такие типы поверхности:



LandTypes gpLandType(double x, double y);

public enum LandTypes
{
NONE = 0,
CITY = 16,
ROAD = 32,
RAIL = 64,
HIGHWAY = 128,
WATER = 28,
OBJECTS_MASK = 3,
ROAD_MASK = 224
}


Есть способ определить падение бомбы именно на ВПП?

И по приведенному выше хотелось бы уточнить как этим пользоваться. Номер означает цвет?
Непонятно значение NONE, OBJECTS_MASK и ROAD_MASK.

И что подразумевается под CITY? Это только города или деревни тоже? Если так можно определить падение бомбы на город, то отлично - можно расширить триггеры(сейчас я зону бомбежки по ним задаю) до максимального радиуса, а в зачет пойдут только бомбы упавшие и вызывающие CITY. Если это маска, то она есть в ресурсах игры?(возможность их посмотреть у меня есть)

naryv
05.12.2012, 12:01
Хотел сделать блокировку аэродромов по результату падения бомб на взлетку, однако нашел только такие типы поверхности:



LandTypes gpLandType(double x, double y);

public enum LandTypes
{
NONE = 0,
CITY = 16,
ROAD = 32,
RAIL = 64,
HIGHWAY = 128,
WATER = 28,
OBJECTS_MASK = 3,
ROAD_MASK = 224
}


Есть способ определить падение бомбы именно на ВПП? ВПП - это ROAD в границах аэродрома.


И по приведенному выше хотелось бы уточнить как этим пользоваться. Номер означает цвет? номер - это значение элемента в перечислении, можно использовать как номер, так и текстовое значение.


Непонятно значение NONE, OBJECTS_MASK и ROAD_MASK. И что подразумевается под CITY? Это только города или деревни тоже? Если так можно определить падение бомбы на город, то отлично - можно расширить триггеры(сейчас я зону бомбежки по ним задаю) до максимального радиуса, а в зачет пойдут только бомбы упавшие и вызывающие CITY. Если это маска, то она есть в ресурсах игры?(возможность их посмотреть у меня есть) ROAD_MASK - это одно из ROAD,RAIL,HIGHWAY можно с результатом с помощью "|","&" и т.д. сравнивать. А вот с CITY сейчас посмотрел - плохо, он не работает корректно:(, корректно работают дороги, вода. OBJECTS_MASK - это внутренний тип используеся в редакторе только.

podvoxx
05.12.2012, 12:12
ВПП - это ROAD в границах аэродрома.

Спасибо. Т.е. именно ВПП без рулежек и полян?

naryv
05.12.2012, 12:52
Спасибо. Т.е. именно ВПП без рулежек и полян? рулёжки надо смотреть, скорее всего тоже будут road, просто поляна - none. Если надо прямо совсем полосу - можно из св-в аэропорта взять направление, длину и ширину полосы и посчитать попали ли в прямоугольник.

LePage
08.12.2012, 00:48
Парни! Простите за нубский вопрос. AiAircraft и классы из part не позволяют определить какую систему измерения использует панель приборов данного крафта, не хотелось бы переопределять классы (память), по армии же будет не слишком универсально (что там серверострители удумают?), ни у кого идей нет на этот счет?

Small_Bee
09.12.2012, 15:26
Парни! Простите за нубский вопрос. AiAircraft и классы из part не позволяют определить какую систему измерения использует панель приборов данного крафта, не хотелось бы переопределять классы (память), по армии же будет не слишком универсально (что там серверострители удумают?), ни у кого идей нет на этот счет?

А не переопределяй классы. переопредели поведение.
Я не в курсе, как у тебя все устроено, но к примеру.

public double AircraftObserver.GetIAS(IMeasureConverter converter)

где AircraftObserver твой класс, который следит за самолетом.
GetIAS метод, возвращающий IAS
IMeasureConverter интерфейс, ответственный за перевод значений из одной системы в другую. Содержит набор методов для перевода м/с в что-то еще, метры в что-то еще и т.п. AircraftObserver получает сырые данные и переводит их в требуемый формат, используя класс с этим интерфейсом.
Можно класс этот к примеру вообще в конструкторе передавать.
Юзер к примеру может сам выбрать, в какой системе ему данные возвращать. Тогда скажем класс UserDefinitions будет в одном из свойств содержать конкретную, нужную именно этому юзеру реализацию IMeasureConverter. Оттуда ее берем и передаем в методе GetIAS и остальных.

Т.е. у тебя будет набор "переводчиков" IMeasureConverter на все случаи жизни, подставляй нужный.

LePage
09.12.2012, 19:31
А не переопределяй классы. переопредели поведение.
Я не в курсе, как у тебя все устроено, но к примеру.

public double AircraftObserver.GetIAS(IMeasureConverter converter)

где AircraftObserver твой класс, который следит за самолетом.
GetIAS метод, возвращающий IAS
IMeasureConverter интерфейс, ответственный за перевод значений из одной системы в другую. Содержит набор методов для перевода м/с в что-то еще, метры в что-то еще и т.п. AircraftObserver получает сырые данные и переводит их в требуемый формат, используя класс с этим интерфейсом.
Можно класс этот к примеру вообще в конструкторе передавать.
Юзер к примеру может сам выбрать, в какой системе ему данные возвращать. Тогда скажем класс UserDefinitions будет в одном из свойств содержать конкретную, нужную именно этому юзеру реализацию IMeasureConverter. Оттуда ее берем и передаем в методе GetIAS и остальных.

Т.е. у тебя будет набор "переводчиков" IMeasureConverter на все случаи жизни, подставляй нужный.

Спасибо! Мда, так мыслить классами мне еще учиться и учиться. Правда, мне этот вариант не совсем подходит.
Задача - определить какие данные идут, преобразовать их не проблема (можно и на клиенте).
Так сказать для аутентичной внешней панели, чтоб она сама настраивалась : идут данные в футах (игрок выбрал английски самолет) - панель натягивает скин с приборами в британской системе, идут метры - скин с приборами в метрической системе. Как-то так.
Не найду свойство однозначно определяющее страну-производителя самолета :(

Small_Bee
09.12.2012, 21:02
Спасибо! Мда, так мыслить классами мне еще учиться и учиться. Правда, мне этот вариант не совсем подходит.
Задача - определить какие данные идут, преобразовать их не проблема (можно и на клиенте).
Так сказать для аутентичной внешней панели, чтоб она сама настраивалась : идут данные в футах (игрок выбрал английски самолет) - панель натягивает скин с приборами в британской системе, идут метры - скин с приборами в метрической системе. Как-то так.
Не найду свойство однозначно определяющее страну-производителя самолета :(

Страна-производитель, имхо, тебе мало поможет. Потому что у одной и той же страны та же скорость может измеряться и в милях и в узлах (поправьте, если не прав).

Я бы примерно вот так сделал, навскидку.

Класс AircraftObserver, уже упомянутый. В OnTickGame обновляет состояние; смотрит за GamePlay.gpPlayer().Place() - самолет/что угодно, где сидит игрок в сингл-плеере.
Он же, в зависимости от того, что в GamePlay.gpPlayer().Place() создает требуемый конкретный экземпляр IMeasureConverter (по стране, по типу самолета или предпочтениям юзера)
Структура, скажем AircraftParameters, содержащая снятые в текущей итерации данные по самолету и идентификатор скина, согласно текущему IMeasureConverter
В AircraftObserver публичный метод, возвращающий текущую AircraftParameters по запросу с клиента. Данные сериализуются и отправляется клиенту.
Клиент на основании полученных данных ставит нужный скин и нужные положения стрелочек/индикаторов. Все.

Можно вообще задачу перевода из одной системы в другую отдать клиенту, что бы сама миссия поменьше считала, отдавать сырые данные и идентификатор скина/"во что надо переводить".

LePage
09.12.2012, 22:00
Страна-производитель, имхо, тебе мало поможет. Потому что у одной и той же страны та же скорость может измеряться и в милях и в узлах (поправьте, если не прав).

Я бы примерно вот так сделал, навскидку.

Класс AircraftObserver, уже упомянутый. В OnTickGame обновляет состояние; смотрит за GamePlay.gpPlayer().Place() - самолет/что угодно, где сидит игрок в сингл-плеере.
Он же, в зависимости от того, что в GamePlay.gpPlayer().Place() создает требуемый конкретный экземпляр IMeasureConverter (по стране, по типу самолета или предпочтениям юзера)
Структура, скажем AircraftParameters, содержащая снятые в текущей итерации данные по самолету и идентификатор скина, согласно текущему IMeasureConverter
В AircraftObserver публичный метод, возвращающий текущую AircraftParameters по запросу с клиента. Данные сериализуются и отправляется клиенту.
Клиент на основании полученных данных ставит нужный скин и нужные положения стрелочек/индикаторов. Все.

Вот и где их найти?


Можно вообще задачу перевода из одной системы в другую отдать клиенту, что бы сама миссия поменьше считала, отдавать сырые данные и идентификатор скина/"во что надо переводить".
Так и хочу, но getParameter отдает данные в системе конкретных приборов кокпита, если пересел с мерса в спит данные тут-же идут уже в футах/милях. И вот ищу этот «идентификатор скина», сиречь идентификатор кокпита. Есть возможность читать абсолютные данные (Z_Orientation и т.д., они всегда в метрах) как сейчас сделал в версии Beta 2.3 (http://www.sukhoi.ru/forum/showthread.php?t=78021), но это немного читерно :), в онлайн точно не стоит.

Small_Bee
09.12.2012, 23:00
Вот и где их найти?


Брать самолет, смотреть какие у него там приборы и в чем передают, и делать конвертер персонально. По каждому летабу. После смотреть на AiAircraft.InternalTypeName() и подставлять соответствующий.
Например будет у тебя метод IMeasureConverter GetConverterForAircraft(string internalTypeName).

Отсюда (примерный код)


AiAircraft airc = GamePlay.gpPlayer().Place() as AiAircraft;
if (airc != null)
{
IMeasureConverter converter = GetConverterForAircraft(airc.InternalTypeName());
AircraftObserver observer = new AircraftObserver(airc, converter);

// юзаем observer;

}

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


в онлайн точно не стоит.

Если сделаешь онлайн, а после объяснишь, как сделал, цены тебе не будет! ;)

LePage
09.12.2012, 23:25
Брать самолет, смотреть какие у него там приборы и в чем передают, и делать конвертер персонально. По каждому летабу. После смотреть на AiAircraft.InternalTypeName() и подставлять соответствующий.
Например будет у тебя метод IMeasureConverter GetConverterForAircraft(string internalTypeName).

Отсюда (примерный код)


AiAircraft airc = GamePlay.gpPlayer().Place() as AiAircraft;
if (airc != null)
{
IMeasureConverter converter = GetConverterForAircraft(airc.InternalTypeName());
AircraftObserver observer = new AircraftObserver(airc, converter);

// юзаем observer;

}

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



Если сделаешь онлайн, а после объяснишь, как сделал, цены тебе не будет! ;)

Спасибо за AiAircraft.InternalTypeName(). Имхо, проще его значение передать клиенту и там отпарсить на предмет модели крафта. :) И уже понятно в чем данные идут:).
Эх, жаль нет подробного описания на манер этого http://www.sukhoi.ru/forum/attachment.php?attachmentid=138127&d=1311685400
Naryv, у Вас еще чего нибудь подобного не завалялось в закромах?

С онлайном, ИМХО, думаю так, как и сейчас поднимать HTTP-сервер в хост-миссии на дедикейтед-сервере, передавать ему хост-миссию, по IP идентифицировать игрока, и отсылать ему данные по его запросу + плюшки по управлению геймплеем. Оценочный траффик 100 кбит/с на игрока.

Small_Bee
10.12.2012, 00:46
Спасибо за AiAircraft.InternalTypeName(). Имхо, проще его значение передать клиенту и там отпарсить на предмет модели крафта. :) И уже понятно в чем данные идут:).
Эх, жаль нет подробного описания на манер этого http://www.sukhoi.ru/forum/attachment.php?attachmentid=138127&d=1311685400
Naryv, у Вас еще чего нибудь подобного не завалялось в закромах?

С онлайном, ИМХО, думаю так, как и сейчас поднимать HTTP-сервер в хост-миссии на дедикейтед-сервере, передавать ему хост-миссию, по IP идентифицировать игрока, и отсылать ему данные по его запросу + плюшки по управлению геймплеем. Оценочный траффик 100 кбит/с на игрока.

Да в студии прямо открой и смотри все методы, свойства и т.п. Там все практически ясно без слов.
С HTTP сервер не завалишь? Имхо тяжеловато будет.

LePage
10.12.2012, 01:21
Да в студии прямо открой и смотри все методы, свойства и т.п. Там все практически ясно без слов.
С HTTP сервер не завалишь? Имхо тяжеловато будет.

Нифига в студии неясно. maddox.game.world.AiAircraft.TypedName(), maddox.game.world.AiAircraft.Type(), maddox.game.world.AiActor.Name(), maddox.game.world.AiCart.InternalTypeName() : все что про них написано - тип и член :). Найдите 10 отличий.
162516

з/ы/ Разработчики вроде писали что просчет миссий вынесли в отдельный поток? Но и сам НТТР-сервер простой до безобразия.

LePage
12.12.2012, 16:47
А кто-нибудь, ничем типа doxygen и graphviz пройтись не пробовал?

naryv
12.12.2012, 17:37
Нифига в студии неясно. maddox.game.world.AiAircraft.TypedName(), maddox.game.world.AiAircraft.Type(), maddox.game.world.AiActor.Name(), maddox.game.world.AiCart.InternalTypeName() : все что про них написано - тип и член :). Найдите 10 отличий.
162516
Пардон, проглядел :(. Так как GetParameter закомментированного нет, но примерно так :


AiAircraft
bool IsKilled(); // убит ли юнит
Regiment Regiment(); // см. ниже описание типа
string HullNumber(); // борт. номер
string CallSign(); // позывной, емнип, который голосом проговаривается
int CallSignNumber(); // позывной номер
string TypedName(); // модель самолёта
AircraftType Type(); // тип самолёта см. ниже описание енума
bool IsAirborne(); // рождение в воздухе
AiAirGroup AirGroup(); // группа

/// <summary>
/// Sets visible integrity of the given limb.
/// </summary>
/// <param name="limb">Object limb to modify</param>
/// <param name="value">Integrity modifier.
/// <para>Negative values degrade integrity by given value.</para>
/// <para>Positive values set absolute value, where applicable.</para></param>
void hitLimb ( part.LimbNames limb, double value );

/// <summary>
/// Detaches given limb.
/// </summary>
/// <param name="limb">Object limb to detach</param>
void cutLimb ( part.LimbNames limb );

/// <summary>
/// Activates given named damage.
/// </summary>
/// <param name="type">Flag type</param>
void hitNamed ( part.NamedDamageTypes type );

/// <summary>
/// Returns parameter.
/// </summary>
/// <param name="type">Parameter name or system type.</param>
/// <param name="subtype">Subtype of given parameter, -1 is generic.</param>
/// <returns>Value</returns>
double getParameter ( part.ParameterTypes type, int subtype );

void SayToGroup(AiAirGroup group, string msg); // сообщение для группы



Regiment {
int army();
string name();
string fileNameEmblem();
string country();
string speech();
string id();
int gruppeNumber();
}

public enum AircraftType {
UNKNOWN = 0,
Fighter = 1 << 0, // GUI - FT (любой истребитель)
BNZFighter = 1 << 1,
TNBFighter = 1 << 2,
HeavyFighter = 1 << 3, // GUI - FT (любой истребитель) FH (тяжелый истребитель)
JaBo = 1 << 4, // GUI - FB (истр-бомбардировщик) FT (любой истребитель) BB (любой бомбер)
Sturmovik = 1 << 5, // GUI - BB (любой бомбер)
Bomber = 1 << 6, // GUI - BB (любой бомбер)
DiveBomber = 1 << 7, // GUI - DB (пикировщик) BB (любой бомбер)
TorpedoBomber = 1 << 8, // GUI - TB (торпедоносец) BB (любой бомбер)
AmphibiousPlane = 1 << 9, // GUI - MS (miscellaneous, разное)
Glider = 1 << 10,// GUI - MS (miscellaneous, разное)
SailPlane = 1 << 11,// GUI - MS (miscellaneous, разное)
Scout = 1 << 12,// GUI - RC (разведчик) MS (miscellaneous, разное)
Transport = 1 << 13,// GUI - TS (транспорт) MS (miscellaneous, разное)
Blenheim = 1 << 14 // хак для бленхеймов, которые бомберы, но могут закладывать виражи как истребители
}




з/ы/ Разработчики вроде писали что просчет миссий вынесли в отдельный поток? Но и сам НТТР-сервер простой до безобразия. В отдельном потоке маршруты расчитываются.

LePage
12.12.2012, 18:21
Пардон, проглядел :(. Так как GetParameter закомментированного нет, но примерно так :


AiAircraft
bool IsKilled(); // убит ли юнит
Regiment Regiment(); // см. ниже описание типа
string HullNumber(); // борт. номер
string CallSign(); // позывной, емнип, который голосом проговаривается
int CallSignNumber(); // позывной номер
string TypedName(); // модель самолёта
AircraftType Type(); // тип самолёта см. ниже описание енума
bool IsAirborne(); // рождение в воздухе
AiAirGroup AirGroup(); // группа

/// <summary>
/// Sets visible integrity of the given limb.
/// </summary>
/// <param name="limb">Object limb to modify</param>
/// <param name="value">Integrity modifier.
/// <para>Negative values degrade integrity by given value.</para>
/// <para>Positive values set absolute value, where applicable.</para></param>
void hitLimb ( part.LimbNames limb, double value );

/// <summary>
/// Detaches given limb.
/// </summary>
/// <param name="limb">Object limb to detach</param>
void cutLimb ( part.LimbNames limb );

/// <summary>
/// Activates given named damage.
/// </summary>
/// <param name="type">Flag type</param>
void hitNamed ( part.NamedDamageTypes type );

/// <summary>
/// Returns parameter.
/// </summary>
/// <param name="type">Parameter name or system type.</param>
/// <param name="subtype">Subtype of given parameter, -1 is generic.</param>
/// <returns>Value</returns>
double getParameter ( part.ParameterTypes type, int subtype );

void SayToGroup(AiAirGroup group, string msg); // сообщение для группы



Regiment {
int army();
string name();
string fileNameEmblem();
string country();
string speech();
string id();
int gruppeNumber();
}

public enum AircraftType {
UNKNOWN = 0,
Fighter = 1 << 0, // GUI - FT (любой истребитель)
BNZFighter = 1 << 1,
TNBFighter = 1 << 2,
HeavyFighter = 1 << 3, // GUI - FT (любой истребитель) FH (тяжелый истребитель)
JaBo = 1 << 4, // GUI - FB (истр-бомбардировщик) FT (любой истребитель) BB (любой бомбер)
Sturmovik = 1 << 5, // GUI - BB (любой бомбер)
Bomber = 1 << 6, // GUI - BB (любой бомбер)
DiveBomber = 1 << 7, // GUI - DB (пикировщик) BB (любой бомбер)
TorpedoBomber = 1 << 8, // GUI - TB (торпедоносец) BB (любой бомбер)
AmphibiousPlane = 1 << 9, // GUI - MS (miscellaneous, разное)
Glider = 1 << 10,// GUI - MS (miscellaneous, разное)
SailPlane = 1 << 11,// GUI - MS (miscellaneous, разное)
Scout = 1 << 12,// GUI - RC (разведчик) MS (miscellaneous, разное)
Transport = 1 << 13,// GUI - TS (транспорт) MS (miscellaneous, разное)
Blenheim = 1 << 14 // хак для бленхеймов, которые бомберы, но могут закладывать виражи как истребители
}



В отдельном потоке маршруты расчитываются.

Спасибо огромное!!! Regiment.country() это как я понимаю флаг какой страны? Если так - то немного не подходит.
А за AircraftType - отдельное спасибо - никак не мог логично интерпретировать результаты, теперь все ясно!!!

з/ы/ Эх, жаль подобного механизма мы нигде больше не увидим :(. Кто этот светлый человек, кто предложил дать такой инструмент в руки пользователям? Передайте ему низкий поклон.



p/p/s/ И походу еще вопрос :)

А почему для GetParameter был выбран тип double, а не float - ИМХО точность избыточная даже для масштабов авиасимулятора, памяти экономим в два раза, скорость вычислений опять-таки?
Наверно все вычисления в игре с этим типом double. ИМХО ресурсы разбазариваются, считаем и выбрасывает половину расчетов. 7 значащих знаков - это миллимитровая точность на расстоянии километра, в масштабах внутри самолета - микронная, в масштабах карты метровая на несколько тысяч километров - float вполне-бы хватило для всех задач, не в этом ли одна из причин тормозов?

может есть еще возможность движок перекомпилировать на 32-х разрядную точность? К черту Point3d..

naryv
13.12.2012, 10:39
Спасибо огромное!!! Regiment.country() это как я понимаю флаг какой страны? Если так - то немного не подходит. Да, это строковое значение страны за которую летит самолёт - "nn", "gb", "ge" и т.д.


з/ы/ Эх, жаль подобного механизма мы нигде больше не увидим :(. Кто этот светлый человек, кто предложил дать такой инструмент в руки пользователям? Передайте ему низкий поклон. кто предложил - не знаю, даже, наверное плод коллективного творчества :)


А почему для GetParameter был выбран тип double, а не float - ИМХО точность избыточная даже для масштабов авиасимулятора, памяти экономим в два раза, скорость вычислений опять-таки? параметры могут быть разных типов, в интерфейсе к double привели для однообразия, памяти и скорости экономилось бы практически нисколько.

Наверно все вычисления в игре с этим типом double. ИМХО ресурсы разбазариваются, считаем и выбрасывает половину расчетов. 7 значащих знаков - это миллимитровая точность на расстоянии километра, в масштабах внутри самолета - микронная, в масштабах карты метровая на несколько тысяч километров - float вполне-бы хватило для всех задач, не в этом ли одна из причин тормозов?
вычисления с разными типами - есть и double и float, в каждом конкретном случае брались оптимальные типы.


может есть еще возможность движок перекомпилировать на 32-х разрядную точность? К черту Point3d.. нет, конечно такой возможности нет - надо было бы переписать весь код, кроме того это вряд-ли дало бы прибавку в скорости даже в доли процентов.

LePage
14.12.2012, 09:47
Ну тогда передайте мой низкий поклон всему коллективу!!! :)

Надеюсь у Вас, в связи с работой над новым проектом, все-же останется время проконсультировать иногда по БзБ?

з/ы/ Ну и может (надеюсь), получится прикрутить аналогичную по фукционалу фичу в новом проекте, пусть и не на c#... на с++ тоже можно :)

naryv
14.12.2012, 10:10
Ну тогда передайте мой низкий поклон всему коллективу!!! :) хорошо:)


Надеюсь у Вас, в связи с работой над новым проектом, все-же останется время проконсультировать иногда по БзБ? это и раньше не было моими должностными обязанностями:) насколько смогу - помогу, конечно:).

podvoxx
25.01.2013, 18:38
Такой вопрос возник, так как боюсь протестировать нормально не получится.

Если на ж/д платформе стоит зенитка или танк/машина, то уничтожение зенитки ведет к уничтожению вагона?

naryv
26.01.2013, 00:28
Нет, вообще "грузы" должны умирать отдельно от "носителя", правда, некоторые грузы могут при гибели взрываться или загораться, и повреждать носитель. А вот при уничтожении носителя - груз, емнип умирает тоже.

podvoxx
27.01.2013, 17:16
Нет, вообще "грузы" должны умирать отдельно от "носителя", правда, некоторые грузы могут при гибели взрываться или загораться, и повреждать носитель. А вот при уничтожении носителя - груз, емнип умирает тоже.
Спасибо :thx:

podvoxx
04.02.2013, 09:02
Есть вопрос по поездам.
Пытаюсь определить уничтожение вагонов и зениток на платформах в событии OnActorDead.
Поставил зенитку, которая лупит по эшелонам и вывод в чат имени актора(который определен до этого как AiGroundActor). Также добавил проверку AiGroundGroup, но вроде не срабатывает.

В чат идут сообщения о коллизии с меткой "ошибка", а также по четыре "сообщения смерти" на каждую зенитку, по вагонам ничего нет.

Как правильно уничтожение вагона определить и почему на статики-"груз" срабатывает 4 события об уничтожении?

naryv
04.02.2013, 10:22
Есть вопрос по поездам.
Пытаюсь определить уничтожение вагонов и зениток на платформах в событии OnActorDead.
Поставил зенитку, которая лупит по эшелонам и вывод в чат имени актора(который определен до этого как AiGroundActor). Также добавил проверку AiGroundGroup, но вроде не срабатывает.

В чат идут сообщения о коллизии с меткой "ошибка", а также по четыре "сообщения смерти" на каждую зенитку, по вагонам ничего нет.

Как правильно уничтожение вагона определить и почему на статики-"груз" срабатывает 4 события об уничтожении? Странно, а приложи миссию, пожалуйста, посмотрю.

podvoxx
04.02.2013, 10:51
Странно, а приложи миссию, пожалуйста, посмотрю.
Там куча всего, ее просто так не запустить, попробую сам разобраться

naryv
04.02.2013, 10:59
Там куча всего, ее просто так не запустить, попробую сам разобраться да просто кусок с паровозами и зениткой, без скрипта, чтобы точно на той же сцене посмотреть какие ивенты пойдут при убийстве. Я могу и сам такую миссию сделать, но время уйдёт и результат может отличаться

podvoxx
04.02.2013, 11:29
да просто кусок с паровозами и зениткой, без скрипта, чтобы точно на той же сцене посмотреть какие ивенты пойдут при убийстве. Я могу и сам такую миссию сделать, но время уйдёт и результат может отличаться
Они в скрипте создаются, в файле миссии стандартный состав от которого маршрут берется(вагоны в dll-ке создаются).
Но по сути поезд - паровоз, 8 вагонов, 2 платформы с бофорсами. По ним стреляет вражеский бофорс.
Скорее всего я где-то в определении события ошибся(определяю принадлежость акторов по номеру подмиссий). Цель, которой добиваюсь - посчитать кол-во убитых вагонов, кол-во статиков груженых на них.