Показать сообщение отдельно
Старый 12.10.2019, 13:50   #68
ildar
Чёрный бомбер
 
Аватар для ildar
 
Регистрация: 26.11.2018
Адрес: Бишкек, Кыргызстан
Сообщений: 329
По умолчанию

Извиняюсь за задержку.

Итак, после многочисленных тестов и анализа полученных данных, было выяснено следующее:

1. Движок игры корректно рассчитывает модель повреждения самолета только для стандартных названий мэшей частей самолета (например, CF_D0, VatorL_D1, WingLOut_D0 и т.д.), если мэш имеет нестандартное название, то его повреждение сразу приводит к уничтожению самолета.

2. Из списка стандартных названий, только названия мэшей для экипажа PilotX_D0 не приводят к повреждению самолета, в то время как другие названия приводят к различной степени повреждения, например, названия рулевых поверхностей приводит к отстрелу всех элеронов/рулей самолета и самолет падает без управления.

3. Обязательно надо увеличить параметр CollisionObject sphere в файле hier.him до нужного нам радиуса действия трала. Без изменения этого параметра игра не будет рассчитывать коллижн модель самолета за пределом указанного радиуса!

Таким образом для работы трала подходит только название мэша PilotX_D0. При этом номер X должен отличаться от используемых данным самолетом, иначе у нас будут дохнуть члены экипажа, а трал будет срабатывать только один раз, так как такой мэш сразу заменяется на PilotX_D1.


В то же время, если мы дадим мэшу, например, название Pilot5_D0 для трехместного самолета, то при каждом срабатывании трала в консоль игры будет сыпаться эта ошибка:

Код:
java.lang.ArrayIndexOutOfBoundsException
	at com.maddox.il2.fm.AircraftState.hitPilot(AircraftState.java:3086)
	at com.maddox.il2.objects.air.Aircraft.killPilot(Aircraft.java:3715)
	at com.maddox.il2.objects.air.Aircraft.msgExplosion(Aircraft.java:1159)
	at com.maddox.il2.objects.air.TB_3_4M_17.msgExplosion(TB_3_4M_17.java:306)
	at com.maddox.il2.ai.MsgExplosion.invokeListener(MsgExplosion.java:78)
	at com.maddox.rts.Message._send(Message.java:1217)
	at com.maddox.rts.Message.sendToObject(Message.java:1158)
	at com.maddox.rts.Message.sendTo(Message.java:1134)
	at com.maddox.rts.Message.trySend(Message.java:1115)
	at com.maddox.rts.Message.send(Message.java:1091)
	at com.maddox.il2.ai.MsgExplosion.send(MsgExplosion.java:54)
	at com.maddox.il2.objects.weapons.Bomb.doExplosion(Bomb.java:568)
	at com.maddox.il2.objects.weapons.Bomb.doExplosion(Bomb.java:484)
	at com.maddox.il2.objects.weapons.Torpedo.msgCollision(Torpedo.java:125)
	at com.maddox.il2.objects.weapons.BombTorp45_36AV_A.msgCollision(BombTorp45_36AV_A.java:71)
	at com.maddox.il2.engine.MsgCollision.invokeListener(MsgCollision.java:72)
	at com.maddox.rts.Message._send(Message.java:1217)
	at com.maddox.rts.Message.sendToObject(Message.java:1158)
	at com.maddox.rts.Message.sendTo(Message.java:1134)
	at com.maddox.rts.Message.trySend(Message.java:1115)
	at com.maddox.rts.Time.loopMessages(Time.java:252)
	at com.maddox.rts.RTSConf.loopMsgs(RTSConf.java:101)
	at com.maddox.il2.game.MainWin3D.loopApp(MainWin3D.java:131)
	at com.maddox.il2.game.Main.exec(Main.java:439)
	at com.maddox.il2.game.GameWin3D.main(GameWin3D.java:235)
Все дело в том, что движок игры при повреждении мэша PilotX_D0 должен показывать на экране кого из члена экипажа убило, а так как номер X не совпадает с числом членов экипажа данного самолета, то он не может определить роль убитого.

Список и роль членов экипажа прописаны в FMD-файле каждого самолета, например, для ТБ-3 это:

Код:
[Aircraft]
  Type 4
  Crew 8
  Wingspan 39.5
  Length 24.4
  Seaplane 0
  Canard 0
  Jet 0
  JetHiV 0
  CrewFunction0 1
  CrewFunction1 2
  CrewFunction2 3
  CrewFunction3 9
  CrewFunction4 10
  CrewFunction5 4
  CrewFunction6 4
  CrewFunction7 8
CrewFunction3 обозначает номер члена экипажа, число 9 его роль.

Роли членов экипажа прописаны в class-файле com\maddox\il2\fm\AircraftState.class

В строке:
Код:
public static final String astateHUDPilotHits[] = { "Player", "Pilot", "CPilot", "NGunner", "TGunner", "WGunner", "VGunner", "RGunner", "EngMas", "BombMas", "RadMas", "ObsMas" };
Роль Player имеет число 0, Pilot - 1 и так до ObsMas - 11.

Таким образом 4-й член экипажа CrewFunction3 это BombMas, то есть Штурман-бомбардир.

После чего языковое название роли берется соответственно из файлов i18n/hud_log.properties и i18n/hud_log_ru.properties и после выводится на экране.

Таким образом, чтобы убрать вывод ошибки при каждом срабатывании трала на ТБ-3 нам надо дополнительно добавить в FMD-файл дополнительную строку CrewFunction8 12, потом отредактировать файл AircraftState.class добавив туда 12-ю роль члена экипажа, например, "MineMas".

И отредактировать файлы hud_log.properties и hud_log_ru.properties, добавив туда строки с пустыми значениями

Код:
BombMas
BombMasAION
BombMasAIOFF
BombMasHIT0
BombMasHIT1
BombMasHIT2
BombMasBLEED0
BombMasBLEED1
После этого ошибок в консоли не будет.

Теперь поговорим о форме и радиусе действия коллижн модели трала.

Многочисленные тесты показали следующее:

1. Боты не хотят нормально летать на высотах ниже 50 метров, они сразу пытаются набрать большую высоту уходя в резкую горку. Если мы ставим высоту 50 метров, все ок, но они летят несколько на большей высоте в среднем 55-59 метров, поэтому минимальный радиус действия трала это 60 метров, иначе трал не будет работать у ботов.

2. Форма коллижн модели трала. Так как радиус действия ограничен сферой CollisionObject sphere из файла hier.him, то для расчетов игры модель всегда будет рассчитываться с круглым обрезанием, если модель будет выходить за пределы указанного параметра (см. рисунок), как видим чтобы увеличить зону охвата трала надо уменьшать высоту полета.


Использование форм цилиндра, полусферы, тора приводит к тому, что мины взрываются перед самолетом, а не за ним. К тому же повышается риск того, что взрыв мины перед самолетом может задеть сам самолет, а также повышают риск пересечения коллижн моделей, если боты летят в строю, а также в местах разворота. Боты любят в таких случаях сильно сближаться.

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

Однако, если тральщик будет лететь слишком медленно и мина будет иметь мощный заряд ВВ, то самолет может подорваться на мине, как это было в реальности (см. видео).

https://www.youtube.com/watch?v=yvm1d22PoEY

Последний раз редактировалось ildar; 26.12.2021 в 15:41.
ildar вне форума   Ответить с цитированием