GTA Builder Форум

GTA Vice City => Идеи => Тема начата: Prographer от Март 13, 2015, 06:14:42 pm

Название: Перевозка транспорта
Отправлено: Prographer от Март 13, 2015, 06:14:42 pm
Появилась идея сделать возможным транспортировку автомобилей с помощью Packer'а. Делать это с помощью Cleo, думаю, не самая лучшая идея. Есть идеи, господа?
Название: Re: Перевозка транспорта
Отправлено: Sektor от Март 13, 2015, 06:17:17 pm
Packer? Я что-то не знаю. Что за вещь такая, в чем отличие от CLEO ?
Название: Re: Перевозка транспорта
Отправлено: Prographer от Март 13, 2015, 08:42:30 pm
Packer? Я что-то не знаю. Что за вещь такая, в чем отличие от CLEO ?
Я имею в виду на Packer'е.
http://gta.wikia.com/Packer (http://gta.wikia.com/Packer)
Название: Re: Перевозка транспорта
Отправлено: Sektor от Март 13, 2015, 09:11:02 pm
Ох, а я уже подумал, появилась новая скриптовая система)
Название: Re: Перевозка транспорта
Отправлено: xanser от Март 14, 2015, 08:11:00 pm
Думаю, достаточно закрепить координаты перевозимых машин относительно пацкера, может еще углы, одним словом закрепить их матрицы.
Название: Re: Перевозка транспорта
Отправлено: Prographer от Март 15, 2015, 10:24:13 am
Думаю, достаточно закрепить координаты перевозимых машин относительно пакера, может еще углы, одним словом закрепить их матрицы.
Это конечно всё очень круто звучит, но возможно ли это сделать только возможностями Cleo?
Название: Re: Перевозка транспорта
Отправлено: xanser от Март 15, 2015, 11:09:00 am
Возможно, но нужем конечно пример, лучше его сделать на C++, потом переписать на Cleo.
У меня в планах была такая перевозка, если сделаю, покажу свой вариант

(http://s6.postimg.org/5vfar4wzl/image.jpg)
Название: Re: Перевозка транспорта
Отправлено: xanser от Июль 15, 2015, 05:07:32 pm
Ну вот и мой вариант перевозки, вполне рабочий. Средствами Cleo конечно можно повторить, если есть желание работать с векторами и матрицами, которых немалое количество потребуется, все на высшей математике завязано. Также понадобится двойной прогон всех машин, которые могут оказаться перевозчиками и потом которые на этих перевозчиках транпортируются в произвольном положении, вобщем возни с координатами и углами много. Подозреваю, что код на Cleo будет аццки трудоемким.

(http://s18.postimg.org/456r9xpeh/scr_20150714133108154.jpg) (http://s6.postimg.org/c43jfe1vl/scr_20150715133859376.jpg) (http://s6.postimg.org/owrnfbdhb/scr_20150715142541298.jpg)
Название: Re: Перевозка транспорта
Отправлено: GHOST от Июль 15, 2015, 05:51:57 pm
xanser, на GCU этот вопрос поднимали, но реализовать так и не смогли.. хочется надеяться в общий доступ эта твоя наработка все-таки выйдет..
Название: Re: Перевозка транспорта
Отправлено: Prographer от Июль 19, 2015, 08:32:36 pm
Думаю, что такое однозначно надо делать только в качестве .asi плагина. Честно говоря, не очень хочется возиться со скриптами.
Название: Re: Перевозка транспорта
Отправлено: xanser от Октябрь 24, 2018, 10:44:17 am
Добавлено на сайт  (http://gtabuilder.ru/gta_vc/mods/asi_plugins/465-buksirovka-i-perevozka-transporta-dlya-vice-city-v10.html)
Название: Re: Перевозка транспорта
Отправлено: kenking от Ноябрь 09, 2018, 04:58:06 pm
xanser, большое спасибо за плагин и особенно за предоставленный код.

Начал делать подобный мод (пока только для сцепки тягачей и прицепов) для GTA3 (1.0) на основе plugin-sdk.
(http://thumbs2.imagebam.com/be/ae/f5/d2cd161026768414.jpg) (http://www.imagebam.com/image/d2cd161026768414)

В общем разобрался. Есть затруднение с камерой. Вот эти строчки:
Код: C++
  1. Patch(0x68AB84, 1.0f);  // camera
  2. Patch(0x68AB84, 1.0f + 2 * ModelInfo[Trailers[T]->id]->colModel->colBox.inf.y); // camera


Не знаю как реализовать на основе plugin-sdk. Адрес 0x68AB84 используется в функции CCamera::SetZoomValueCamStringScript
В базе GTA3 получается в этой функции используется CCamera.m_fZoomValueCamStringScript
Попробовал записать так:
Код: C++
  1. patch::SetFloat(0x6FAE24, 1.0f + 2 * CModelInfo::ms_modelInfoPtrs[trail->m_nModelIndex]->m_pColModel->m_boundBox.m_vecMax.y, true);

не работает  :(

0x6FAE24 рассчитал так: к адресу 0x6FACF8 (TheCamera) прибавил смещение 0x12C (m_fZoomValueCamStringScript), поскольку в sdk нет этих данных в классе CCamera.

Или надо использовать не patch::SetFloat?
Кто может подсказать? Пожалуйста.
Название: Re: Перевозка транспорта
Отправлено: xanser от Ноябрь 10, 2018, 06:33:22 am
Я к сожалению по гта3 не подскажу, как отодвинуть камеру. Надо смотреть, как это сделано для грузовиков например.
Название: Re: Перевозка транспорта
Отправлено: kenking от Ноябрь 14, 2018, 08:30:44 am
Вопрос с камерой пока не решил.

Реализовал движение тягачей с прицепами в трафике.

https://www.youtube.com/watch?v=MsEpXEAPwvc&feature=youtu.be (https://www.youtube.com/watch?v=MsEpXEAPwvc&feature=youtu.be)

xanser, ещё раз большое спасибо за предоставленный код для VC.

Название: Re: Перевозка транспорта
Отправлено: xanser от Ноябрь 14, 2018, 12:39:16 pm
Круто, смотрится офигенно! Молодец, что разобрался с чужим кодом. Если вдруг у кого будут предложения по доработке физики прицепа, делитесь. Все-таки игра не знает, что мы все это делаем, и реагирует по-своему. На видео в конце как раз прицеп должно было жутко заколбасить от таких выкрутасов, жаль не видно.
Название: Re: Перевозка транспорта
Отправлено: kenking от Ноябрь 15, 2018, 09:51:32 am
Да, бывает, что прицеп "колбасит" в некоторых нестандартных аварийных ситуациях, но не часто. А с авто в трафике такого вообще не замечал. В общем по моим наблюдениям, если ездить нормально, то сцепка работает хорошо.

Мой код на основе plugin-sdk здесь https://github.com/kenkingGitHub/GTA-Projects/blob/master/III_TruckTrailer/III_TruckTrailer.cpp

Для сцепки в трафике настройками регулируется совпадение (или не совпадение) номеров экстр, цвета тягача и прицепа, варианты прицепов на тягач и будет ли тягач всегда с прицепом или будет встречаться и без прицепа.
Вариант не окончательный.
Надо ещё доработать оптику. Передний свет на прицепах не нужен. Есть прицепы, где и задний не нужен. Думаю тоже вынести в настройки. И при отцепке прицепа надо оптику выключать. Этими доработками буду заниматься. Ну и с камерой надо разобраться.
Название: Re: Перевозка транспорта
Отправлено: xanser от Ноябрь 15, 2018, 09:56:57 am
По оптике у меня тоже вопрос. Я не нашел способа убрать headlights и taillights, их удаление из модели ставит координаты фар в центр машины. Костыль - отодвинуть их глубоко под землю. Раздельное включение я тоже не нашел, только одновременное и при работающем моторе. Хотелось бы с этим разобраться.

P.S. Уточнение по коду - возможно некоторые функции работы с матрицами есть и в стандартной игре, я не стал разбираться и написал их заново.
Название: Re: Перевозка транспорта
Отправлено: kenking от Ноябрь 15, 2018, 10:43:52 am
Цитировать
Я не нашел способа убрать headlights и taillights, их удаление из модели ставит координаты фар в центр машины. Костыль - отодвинуть их глубоко под землю. Раздельное включение я тоже не нашел, только одновременное и при работающем моторе.
Да это всё верно.
Я на счёт оптики планирую сделать так: в настройки файла .dat добавить позицию для значения, которое будет определять надо на прицепе "убрать" свет передних фар или задних тоже. Т.е. своеобразный флаг. А потом в зависимости от значения этого флага "разбивать" соответствующие фары.
Код: C++
  1. automobile->m_carDamage.SetLightStatus(LIGHT_FRONT_LEFT, 1);
  2. automobile->m_carDamage.SetLightStatus(LIGHT_FRONT_RIGHT, 1);
Для задних фар при надобности также.
А при разбитых фарах короны оптики соответствующей функцией "не рисуются".

Можно попробовать ещё вариант с проверкой (здесь когда-то по координатам таких дамми для SA писали https://sannybuilder.com/forums/viewtopic.php?pid=14626#p14626 (https://sannybuilder.com/forums/viewtopic.php?pid=14626#p14626)) есть ли на модели дамми headlights, точнее считать координаты этого дамми и если координаты будут нулевые (а они по-идеи будут нулевые при отсутствие этого дамми), то "разбивать" передние фары. Тоже самое и с задними.

Для варианта с ненужными передними и задними фарами можно вероятно просто отключить флаг того, что двигатель включен?

Ещё по оптике вопрос в том, что на прицепе не срабатывает стопсигнал при торможении. Запись значения m_fBreakPedal тягача в соответствующее значение m_fBreakPedal прицепа ничего не даёт. Надо разбираться.
Название: Re: Перевозка транспорта
Отправлено: xanser от Ноябрь 16, 2018, 07:28:01 am
Второй вариант через проверку наличия headlights и taillights - отличная идея для работы со светом. Спасибо за совет. Интересно, как разбить фары в обычной игре, у меня не получилось, а программно все работает, теперь многие вещи можно поправить.
Название: Re: Перевозка транспорта
Отправлено: Shagg_E от Ноябрь 16, 2018, 08:54:51 am
Интересно, как разбить фары в обычной игре, у меня не получилось, а программно все работает, теперь многие вещи можно поправить.
Передние фары "разбиваются" при повреждении передних крыльев авто, задние и фары у байков - никак :(
Вариант kenking(удаление дамми, проверка нулевых координат и "разбивание" фар программно) видимо действительно пока единственный(только в "повторах" фары будут видны), т.к. даже в трехе у BF Injection, у которой нет передних фар, разрабы оставили их дамми (https://youtu.be/2Pn2dVwuFC0?t=20), т.к. в игре нет флага для отсутствия фар, как это есть в случае с отсутствием дверей(у той же BF Injection)...
Название: Re: Перевозка транспорта
Отправлено: kenking от Ноябрь 16, 2018, 01:14:51 pm
Цитировать
Передние фары "разбиваются" при повреждении передних крыльев авто, задние и фары у байков - никак
Задние разбиваются соответственно при повреждении задних крыльев авто.
Да у байка не повреждаются, в структуре нет CDamageManager.
Название: Re: Перевозка транспорта
Отправлено: xanser от Ноябрь 17, 2018, 03:57:40 am
Еще одна вещь, которую можно доработать - это вталкивание прицепа задним ходом в стену, не часто возникнет, но все же, прицеп ее проткнет. Думаю, тут подойдет проверка через функцию CWorld::ProcessLineOfSight от центра прицепа назад, и сравнение результата с длиной кола прицепа, который в этом случае можно будет отцепить.
Название: Re: Перевозка транспорта
Отправлено: kenking от Ноябрь 25, 2018, 04:22:50 pm
Решил настройки для оптики в .dat не прописывать, а реализовать проверкой координат дамми. Написал для этого такую функцию:
Код: C++
  1. static void TrailerLightControl(CAutomobile *trailer) {
  2.     CVehicleModelInfo *vehModel = reinterpret_cast<CVehicleModelInfo *>(CModelInfo::ms_modelInfoPtrs[trailer->m_nModelIndex]);
  3.     if ((vehModel->m_avDummyPos[0].x == 0.0f) && (vehModel->m_avDummyPos[0].y == 0.0f) && (vehModel->m_avDummyPos[0].z == 0.0f)) {
  4.         if (trailer->m_carDamage.GetLightStatus(LIGHT_FRONT_LEFT) == 0)
  5.             trailer->m_carDamage.SetLightStatus(LIGHT_FRONT_LEFT, 1);
  6.         if (trailer->m_carDamage.GetLightStatus(LIGHT_FRONT_RIGHT) == 0)
  7.             trailer->m_carDamage.SetLightStatus(LIGHT_FRONT_RIGHT, 1);
  8.     }
  9.     if ((vehModel->m_avDummyPos[1].x == 0.0f) && (vehModel->m_avDummyPos[1].y == 0.0f) && (vehModel->m_avDummyPos[1].z == 0.0f)) {
  10.         if (trailer->m_carDamage.GetLightStatus(LIGHT_REAR_LEFT) == 0)
  11.             trailer->m_carDamage.SetLightStatus(LIGHT_REAR_LEFT, 1);
  12.         if (trailer->m_carDamage.GetLightStatus(LIGHT_REAR_RIGHT) == 0)
  13.             trailer->m_carDamage.SetLightStatus(LIGHT_REAR_RIGHT, 1);
  14.     }    
  15. }

По оптике на прицепе добавил ещё такую штуку - в случае отцепки прицепа, двигатель на нём выключается и соответственно фары тоже.
Добавил проверку на нахождение после тягача другого транспорта, в случае отсутствия такового, прицеп добавляется к тягачу, иначе нет.
Название: Re: Перевозка транспорта
Отправлено: DK от Ноябрь 25, 2018, 10:40:29 pm
Надо в sdk будет добавить функцию GetVehicleModel(int), а то этот серпантин каждый раз приходиться писать  ;D
Название: Re: Перевозка транспорта
Отправлено: kenking от Декабрь 07, 2018, 11:44:13 am
Добавил ещё проверку, что игрок в авто, в случае нажатия клавиши для отцепки прицепа, а то получалось так, что игрок вышел из авто с прицепом, находится рядом с ним и  если нажата клавиша отцепки прицепа, то прицеп отцепляется.
Добавил проверку "брошенных" прицепов в трафике и их удаление.
Осталось разобраться с положением камеры.
Название: Re: Перевозка транспорта
Отправлено: xanser от Декабрь 07, 2018, 05:33:07 pm
Прицеп отцепляется, пока машина принадлежит игроку, в том числе и с улицы. Если сесть в другую, отцепка уже не действует. В жизни может быть похоже, вышел, отцепил, думаю это допустимо. По поводу брошенных прицепов, можно же создавать машины без запоминания (в классе CVehicle свойство 0x1F8 m_nCreatedBy), они сами исчезнут вне зоны видимости. Хотя могут быть подводные камни, типа прицеп в трафике с пропавшим тягачом.
Название: Re: Перевозка транспорта
Отправлено: kenking от Декабрь 08, 2018, 08:05:58 am
Цитировать
Прицеп отцепляется, пока машина принадлежит игроку, в том числе и с улицы. Если сесть в другую, отцепка уже не действует. В жизни может быть похоже, вышел, отцепил, думаю это допустимо.
Да так, но я посчитал, что лучше сделать возможность отцепить прицеп только находясь в тягаче.

Цитировать
По поводу брошенных прицепов, можно же создавать машины без запоминания (в классе CVehicle свойство 0x1F8 m_nCreatedBy), они сами исчезнут вне зоны видимости.
Сначала так и делал, создавал прицеп, чтобы игра сама его удаляла, как остальной транспорт в трафике. Происходило именно это
Цитировать
Хотя могут быть подводные камни, типа прицеп в трафике с пропавшим тягачом.
Либо наоборот - пропадал прицеп, а тягач оставался.

Потом стал устанавливать тягачу флаг trailer->m_nVehicleFlags.bIsLocked и проверял на определённом расстоянии от игрока есть ли тягач в заданных координатах от прицепа, в случае отсутствия, удалял прицеп.
(для SA я ставил и тягачу, потом проверял, если тягач и прицеп находятся от игрока на дистанции > 200,  выключал этот флаг и vehicle->m_pTrailer->CanBeDeleted(); vehicle->CanBeDeleted(); )

Теперь сделал по другому - добавил флаг, что прицеп прицеплен (включаю при создании прицепа). Написал функцию проверки, что прицеп "прицеплен". По-сути это часть твоего кода для проверки нахождения прицепа возле тягача:
Код: C++
  1. static bool TrailerAttached(CVehicle *trailer) {
  2.         bool result = FALSE;
  3.         for (int i = 0; i < CPools::ms_pVehiclePool->m_nSize; i++) {
  4.             CVehicle *vehicle = CPools::ms_pVehiclePool->GetAt(i);
  5.             if (vehicle && vehicle->m_nVehicleClass == VEHICLE_AUTOMOBILE && vehicle->m_fHealth > 0.1f && vehComps.Get(vehicle).misc
  6.                 && (vehComps.Get(vehicle).connector == vehComps.Get(trailer).connector)
  7.                 && (Distance(PointOffset(vehicle->m_matrix, 0, vehComps.Get(vehicle).misc->modelling.pos.y, vehComps.Get(vehicle).misc->modelling.pos.z), PointOffset(trailer->m_matrix, 0, vehComps.Get(trailer).hookup->modelling.pos.y, vehComps.Get(trailer).hookup->modelling.pos.z)) < 2.0f)) {
  8.                 result = TRUE;
  9.             }
  10.         }
  11.         return result;
  12. }

Потом так:
Код: C++
  1. ModelInfo &infoTrailer = modelInfo.Get(trailer);
  2. if (infoTrailer.isAttached && !trailer->GetIsOnScreen()) {
  3.    if (!TrailerAttached(trailer))
  4.        CWorld::Remove(trailer);
  5. }

Ну и "брошенных" прицепов в трафике нет.
Название: Re: Перевозка транспорта
Отправлено: xanser от Январь 19, 2019, 08:14:23 am
Есть идеи, как снизить скорость и ускорение тягача при движении с прицепом, ориентируясь на его настройки из handling.cfg?
Название: Re: Перевозка транспорта
Отправлено: kenking от Январь 19, 2019, 11:55:26 am
Имеется ввиду тягач с прицепом в трафике? Всё же решил добавить в трафик движение с прицепами? Это хорошо. Я добавил в трафик спавн двойных прицепов. В трафике встречается авто без прицепа, с одним прицепом и с двумя прицепами.
https://youtu.be/BaMZC1XafMc (https://youtu.be/BaMZC1XafMc)

Скорость тягача я не ограничивал, но может и есть смысл задуматься об этом.

Если рассмотреть опкод на максимальную скорость авто в трафике, то:
Код: C++
  1. case SET_CAR_CRUISE_SPEED:
  2. CRunningScript::CollectParameters(this, &this->m_nIp, 2);
  3. vehicle_00AD = CPool<CVehicle>::AtHandle(CPools::ms_pVehiclePool, ScriptParams[0].m_nIntValue);
  4. vehicle_00AD->m_autoPilot.m_nCruiseSpeed = ScriptParams[1].m_fFloatValue;
  5. maxSpeed_00AD = 60.0 * vehicle_00AD->m_pHandlingData->m_transmissionData.m_fMaxSpeed;
  6. if ( vehicle_00AD->m_autoPilot.m_nCruiseSpeed >= maxSpeed_00AD )
  7.     maxSpeed_00AD = vehicle_00AD->m_autoPilot.m_nCruiseSpeed;
  8. vehicle_00AD->m_autoPilot.m_nCruiseSpeed = maxSpeed_00AD;
  9. return 0;


Если не заморачиваться с данными из handling, то можно просто для всех тягачей с прицепами сделать так:
Код: C++
  1. vehicle->m_autoPilot.m_nCruiseSpeed = 5.0f;

А если изменить значение массы тягача - это же должно повлиять на скорость и ускорение?
Название: Re: Перевозка транспорта
Отправлено: Shagg_E от Январь 19, 2019, 03:34:58 pm
Есть идеи, как снизить скорость и ускорение тягача при движении с прицепом, ориентируясь на его настройки из handling.cfg?
Есть опкод
01EC: make_car $2159 very_heavy 1Он делает авто тяжелее и медленнее. Но я его не ковырял, так что может там всё настолько запутанно, что проще будет ограничить скорость, как написал kenking.

А если изменить значение массы тягача - это же должно повлиять на скорость и ускорение?
К сожалению, в ВС авто может весить 100 тонн и ездить, как болид "Формулы 1"...
Название: Re: Перевозка транспорта
Отправлено: kenking от Январь 19, 2019, 05:46:52 pm
Цитировать
Есть опкод 01EC: make_car $2159 very_heavy 1
Он делает авто тяжелее и медленнее. Но я его не ковырял, так что может там всё настолько запутанно
Там всё просто:
Код: C++
  1. case SET_CAR_HEAVY:
  2. CRunningScript::CollectParameters(this, &this->m_nIp, 2);
  3. vehicle_01EC = CPool<CVehicle>::AtHandle(CPools::ms_pVehiclePool, ScriptParams[0].m_nIntValue);
  4. if ( ScriptParams[1].m_nIntValue )
  5.     vehicle_01EC->physical.m_nMoveFlags = vehicle_01EC->physical.m_nMoveFlags & 0xFE | 1;
  6. else
  7.     vehicle_01EC->physical.m_nMoveFlags &= 0xFEu;
  8. result = 0;
  9. break;

т.е.
Код: C++
  1. vehicle->m_nMoveFlags.bHeavy = 1;

UPD:
Это я для gta3 разобрал опкод. Для VC так:
Код: C++
  1. case 0x1EC:
  2.       CRunningScript::CollectParameters(this + 16, 2);
  3.       vehicle_01EC = CPool_CVehicle_CAutomobile_GetAt(ScriptParams[0]);
  4.       if ( ScriptParams[1] )
  5.       {
  6.         vehicle_01EC->physical.m_nMoveFlags = vehicle_01EC->physical.m_nMoveFlags & 0xFE | 1;
  7.         vehicle_01EC->physical.m_fMass = 3.0 * vehicle_01EC->m_pHandlingData->m_fMass;
  8.         turnMass_01EC = 5.0 * vehicle_01EC->m_pHandlingData->m_fTurnMass;
  9.       }
  10.       else
  11.       {
  12.         vehicle_01EC->physical.m_nMoveFlags &= 0xFEu;
  13.         vehicle_01EC->physical.m_fMass = vehicle_01EC->m_pHandlingData->m_fMass;
  14.         turnMass_01EC = vehicle_01EC->m_pHandlingData->m_fTurnMass;
  15.       }
  16.       vehicle_01EC->physical.m_fTurnMass = turnMass_01EC;
  17.       result = 0;
  18.       break;

т.е. как раз масса изменяется

Код: C++
  1. vehicle->m_nMoveFlags.bHeavy = 1;
  2. vehicle->m_fMass = vehicle->m_pHandlingData->m_fMass * 3.0f;
  3. vehicle->m_fTurnMass = vehicle->m_pHandlingData->m_fTurnMass * 5.0f;
Название: Re: Перевозка транспорта
Отправлено: xanser от Январь 19, 2019, 08:19:17 pm
Уточню свое пожелание - в трафике скорость устраивает, там и так все тащатся как черепахи. Хотелось бы снизить лимит максимальной скорости именно для игрока, например взять из хэндлинга и поделить пополам, имитируя тяжесть прицепа. Сам тягач не хотелось бы утяжелять, превращая в локомотив, который всех снесет. Кроме того set_heavy плохо влияет на отображение колес при мягкой подвеске, они проседают, создавая развал. Нормального способа вытащить скорость или ускорение из хэндлинга через поля класса я не нашел, может это хранится умноженное на какой-то коэффициент. Можно и как-то проще придумать, например ограничить скорость при наличии прицепа 40 км/ч, только как это лучше сделать?
Название: Re: Перевозка транспорта
Отправлено: kenking от Январь 20, 2019, 12:05:21 pm
Есть опкод
04BA: set_car 0@ speed_instantly 5.0
Код: C++
  1. case 0x4BA:
  2.       CRunningScript::CollectParameters(this + 16, 2);
  3.       car_04BA = CPool<CVehicle>::AtHandle(ScriptParams[0]);
  4.       x_04BA = *&ScriptParams[1] * 0.016666668;
  5.       y_04BA = x_04BA * car_04BA->vehicle.physical.entity.m_placement.matrix.at.z;
  6.       z_04BA = x_04BA * car_04BA->vehicle.physical.entity.m_placement.matrix.at.y;
  7.       car_04BA->vehicle.physical.m_vecMoveSpeed.x = x_04BA * car_04BA->vehicle.physical.entity.m_placement.matrix.at.x;
  8.       car_04BA->vehicle.physical.m_vecMoveSpeed.y = z_04BA;
  9.       car_04BA->vehicle.physical.m_vecMoveSpeed.z = y_04BA;
  10.       if ( car_04BA->vehicle.m_pHandlingData->uFlags & 0x20000 && !car_04BA->vehicle.m_nVehicleClass )
  11.         car_04BA->fNegSpeed = 1046562734;       // 0.22
  12.       result = 0;
  13.       break;

Когда-то yelmi писал скрипт на ручную коробку передач для SA. Посмотри скрипт.

Если сильно не заморачиваться, то можно регулировать максимальную скорость так:
Код: C++
  1. playerCar->m_pHandlingData->m_transmissionData.m_fMaxGearVelocity *= 0.5f; // уменьшаем при наличии прицепа
  2. playerCar->m_pHandlingData->m_transmissionData.m_fMaxGearVelocity *= 2.0f; // восстанавливаем, когда прицеп отцеплен или игрок не в этом авто
  3.  

Правда изменение коснётся всего транспорта этой модели, в трафике в том числе, но в трафике это не так заметно, а на авто игрока ощущается изменение.


Название: Re: Перевозка транспорта
Отправлено: xanser от Январь 21, 2019, 03:30:51 pm
Второй вариант похож, на то, что я ищу. Уменьшение вдое замедляет машину. В трафике машины до определенного момента не замечают изменений, пока не "оживут". Но я так и не понимаю, что хранится в этих параметрах трансмиссии. Если рассмотреть cTranmissionGear.h, то должно быть так:
Код: C++
  1.     float             m_fEngineAcceleration; // 0.1 to 10.0
  2.     float             m_fMaxGearVelocity; // 5.0 to 150.0
  3.     float             m_fMaxSpeed;
  4.     float             m_fMinGearVelocity;
  5.     float             m_fCurrentSpeed;

Кто-нибудь анализировал эти значения? У меня какая-то каша, не пойму закономерности. И они у меня не соответствуют комментариям из cTranmissionGear.h. Сложность в том, чтобы определить момент сцепки и отцепки, в которые нужно делить или умножать скорость на 2.

Код: C++
  1. m_fEngineAcceleration = 0.0006    // handling = 15.0
  2. m_fMaxGearVelocity = 0.788001    // handling = 120.0
  3. m_fMaxSpeed = 0.656667
Код: C++
  1. m_fEngineAcceleration = 0.0008    // handling = 10.0
  2. m_fMaxGearVelocity = 0.654667   // handling = 100.0
  3. m_fMaxSpeed = 0.545556
Код: C++
  1. m_fEngineAcceleration = 0.00144    // handling = 18.0
  2. m_fMaxGearVelocity = 0.964001    // handling = 150.0
  3. m_fMaxSpeed = 0.803334
Название: Re: Перевозка транспорта
Отправлено: kenking от Январь 22, 2019, 04:07:48 pm
Я думаю, что расхождения в значениях из-за разных единиц измерения. Возможно используется какой-то коэффициент. В том же опкоде 04BA значение умножается на 0.016666668. При получении скорости транспорта значение тоже приходится пересчитывать, чтобы получилось в км/ч и т.д.

Цитировать
Сложность в том, чтобы определить момент сцепки и отцепки, в которые нужно делить или умножать скорость на 2.
Можно сделать так:
Добавить к CVehicle следующие данные
Код: C++
  1. CVehicle *m_pTrailer;
  2. bool enableSpeed;
 
Две функции (названия дамми для сцепки у меня другие)
Код: C++
  1. static CVector GetFramePosn(RwFrame *frame) {
  2.         CVector posnFrame;
  3.         RwV3d posn = RwFrameGetLTM(frame)->pos;
  4.         posnFrame.x = posn.x;
  5.         posnFrame.y = posn.y;
  6.         posnFrame.z = posn.z;
  7.         return posnFrame;
  8.     }
  9.  
  10.     static void SearchTrailer(CVehicle *vehicle) {
  11.         if (vehComps.Get(vehicle).misc) {
  12.             for (auto trailer : CPools::ms_pVehiclePool) {
  13.                 if (vehComps.Get(trailer).hookup && (vehComps.Get(vehicle).connector == vehComps.Get(trailer).connector)) {
  14.                     if (DistanceBetweenPoints(GetFramePosn(vehComps.Get(vehicle).misc), GetFramePosn(vehComps.Get(trailer).hookup)) <= 2.0f) {
  15.                         vehComps.Get(vehicle).m_pTrailer = trailer; break;
  16.                     }
  17.                 }
  18.             }
  19.         }
  20.     }

Далее так (тест с выводом на экран нужных данных, делал для GTA3)
Код: C++
  1. Events::drawingEvent += [] {
  2.     CPed *player = FindPlayerPed();
  3.     if (player) {
  4.         if (player->m_pVehicle && player->m_pVehicle->m_nVehicleClass == VEHICLE_AUTOMOBILE) {
  5.             vehComps.Get(player->m_pVehicle).m_pTrailer = nullptr;
  6.             if (player->m_bInVehicle) {
  7.                 SearchTrailer(player->m_pVehicle);
  8.                 if (vehComps.Get(player->m_pVehicle).m_pTrailer) {
  9.                     if (vehComps.Get(player->m_pVehicle).enableSpeed) {
  10.                         player->m_pVehicle->m_pHandlingData->m_transmissionData.m_fMaxGearVelocity *= 0.5f;
  11.                         vehComps.Get(player->m_pVehicle).enableSpeed = false;
  12.                     }
  13.                 }
  14.                 else if (!vehComps.Get(player->m_pVehicle).enableSpeed) {
  15.                     player->m_pVehicle->m_pHandlingData->m_transmissionData.m_fMaxGearVelocity *= 2.0f;
  16.                     vehComps.Get(player->m_pVehicle).enableSpeed = true;
  17.                 }
  18.             }
  19.             else if (!vehComps.Get(player->m_pVehicle).enableSpeed) {
  20.                 player->m_pVehicle->m_pHandlingData->m_transmissionData.m_fMaxGearVelocity *= 2.0f;
  21.                 vehComps.Get(player->m_pVehicle).enableSpeed = true;
  22.             }
  23.             CFont::SetScale(0.5f, 1.0f);
  24.             CFont::SetColor(CRGBA(238, 173, 53, 255));
  25.             CFont::SetJustifyOn();
  26.             CFont::SetFontStyle(0);
  27.             CFont::SetPropOn();
  28.             CFont::SetWrapx(600.0f);
  29.             wchar_t text[64];
  30.             swprintf(text, L"enableSpeed %d", vehComps.Get(player->m_pVehicle).enableSpeed);
  31.             CFont::PrintString(10.0f, 100.0f, text);
  32.             swprintf(text, L"MaxGearVelocity %.2f", player->m_pVehicle->m_pHandlingData->m_transmissionData.m_fMaxGearVelocity);
  33.             CFont::PrintString(10.0f, 120.0f, text);
  34.             if (vehComps.Get(player->m_pVehicle).m_pTrailer) {
  35.                 swprintf(text, L"ID trailer %d", vehComps.Get(player->m_pVehicle).m_pTrailer->m_nModelIndex);
  36.                 CFont::PrintString(10.0f, 80.0f, text);
  37.             }
  38.         }
  39.     }
  40. };


Можно, конечно, заморочиться ещё сильнее и значение на которое уменьшается максимальная скорость, "завязать" на массу прицепа. Больше масса - больше уменьшаем значение. Например, масса прицепа до 1000 кг - уменьшаем в два раза, масса больше 1000 кг - уменьшаем в три раза.

У кого-нибудь есть другой вариант реализации этой идеи или оптимизации этих функций? Пишите пожалуйста. Идея заинтересовала и думаю тоже реализовать это в плагине для GTA3.
Название: Re: Перевозка транспорта
Отправлено: liaz6212 от Январь 23, 2019, 11:03:15 am
А если изменить значение массы тягача - это же должно повлиять на скорость и ускорение?
Увеличение массы даёт увеличение максимальной скорости.
Название: Re: Перевозка транспорта
Отправлено: xanser от Январь 23, 2019, 11:26:09 am
Почему тогда в гонках это не используют, стараясь максимально облегчить машину.
Название: Re: Перевозка транспорта
Отправлено: kenking от Январь 24, 2019, 03:42:32 pm
Цитировать
Кто-нибудь анализировал эти значения? У меня какая-то каша, не пойму закономерности.
Посмотрел в базе для GTA3, для VC коэффициенты вроде такие же.
Код: C++
  1. void __thiscall cHandlingDataMgr::ConvertDataToGameUnits(cHandlingDataMgr *this, tHandlingData *vehicleHandling)
  2. {
  3.   tHandlingData *handling;
  4.   float v3;
  5.   double v4;
  6.   double v5;
  7.   double v6;
  8.   double i;
  9.   float engineAcceleration;
  10.   double _engineAcceleration;
  11.  
  12.   handling = vehicleHandling;
  13.   vehicleHandling->m_transmissionData.m_fEngineAcceleration = vehicleHandling->m_transmissionData.m_fEngineAcceleration * 0.00039999999;
  14.   handling->m_transmissionData.m_fMaxGearVelocity = handling->m_transmissionData.m_fMaxGearVelocity * 0.0055555599;
  15.   handling->m_transmissionData.field_60 = handling->m_transmissionData.field_60 * 0.00039999999;
  16.   handling->m_fTurnMass = (handling->m_vecDimensions.y * handling->m_vecDimensions.y
  17.                          + handling->m_vecDimensions.x * handling->m_vecDimensions.x)
  18.                         * handling->m_fMass
  19.                         * 0.083333336;
  20.   if ( vehicleHandling->m_fTurnMass >= 10.0 )
  21.     vehicleHandling->m_fTurnMass = vehicleHandling->m_fTurnMass * 5.0;
  22.   vehicleHandling->m_fInvMass = 1.0 / vehicleHandling->m_fMass;
  23.   vehicleHandling->m_fBuoyancyConstant = 0.0080000004
  24.                                        * vehicleHandling->m_fMass
  25.                                        * 100.0
  26.                                        / vehicleHandling->m_nPercentSubmerged;
  27.   v3 = vehicleHandling->m_vecDimensions.z * (vehicleHandling->m_vecDimensions.x * 0.5) / vehicleHandling->m_fMass;
  28.   v4 = v3;
  29.   v5 = 0.0;
  30.   v6 = 100.0;
  31.   for ( i = vehicleHandling->m_transmissionData.m_fMaxGearVelocity;
  32.         v5 >= v6 && i > 0.0;
  33.         v6 = (1.0 / (v4 * i * i + 1.0) - 1.0) * -i )
  34.   {
  35.     i = i - 0.0099999998;
  36.     engineAcceleration = vehicleHandling->m_transmissionData.m_fEngineAcceleration * 0.1666666666666666;
  37.     v5 = engineAcceleration;
  38.   }
  39.   if ( vehicleHandling->index == RUMPO )
  40.   {
  41.     vehicleHandling->m_transmissionData.m_fMaxSpeed = vehicleHandling->m_transmissionData.m_fMaxGearVelocity;
  42.   }
  43.   else
  44.   {
  45.     vehicleHandling->m_transmissionData.m_fMaxSpeed = i;
  46.     vehicleHandling->m_transmissionData.m_fMaxGearVelocity = 1.2 * i;
  47.   }
  48.   LODWORD(vehicleHandling->m_transmissionData.m_fMinGearVelocity) = -0.2;
  49.   if ( vehicleHandling->m_transmissionData.m_nDriveType == DRIVE_TYPE_4x4 )
  50.     _engineAcceleration = vehicleHandling->m_transmissionData.m_fEngineAcceleration * 0.25;
  51.   else
  52.     _engineAcceleration = vehicleHandling->m_transmissionData.m_fEngineAcceleration * 0.5;
  53.   vehicleHandling->m_transmissionData.m_fEngineAcceleration = _engineAcceleration;
  54.   cTransmission::InitGearRatios(&vehicleHandling->m_transmissionData);
  55. }


Цитировать
Увеличение массы даёт увеличение максимальной скорости.
Проверил увеличивая/уменьшая значение массы непосредственно в игре- на саму скорость изменение значения массы не влияет, влияет только на тормозной путь и время остановки авто. Меньше масса - быстрее останавливается и короче путь и наоборот.
Название: Re: Перевозка транспорта
Отправлено: xanser от Январь 25, 2019, 01:07:17 pm
Теперь понятно, что это за геморрой, как-то муторно. Сделал по-простому - сканируется трафик, накапливается m_fMaxGearVelocity в массив эталонных ускорений всех моделей авто, встретившихся первый раз. При сканировании трафика восстанавливается ускорение из эталонного, если оно уже обнаружено. Дальше при обработке сцепки тягачу присваивается уменьшенное от эталонного значение из массива. Сам момент сцепки и отцепки не проверяется. Если прицеп отвалится, то просто пропустится этап уменьшения ускорения и останется только восстановленное.
Название: Re: Перевозка транспорта
Отправлено: DK от Январь 25, 2019, 06:03:26 pm

1. В новой версией sdk добавлен автоматический конверт из RwV3d в CVector. Вот это:
static CVector GetFramePosn(RwFrame *frame) {
    CVector posnFrame;
    RwV3d posn = RwFrameGetLTM(frame)->pos;
    posnFrame.x = posn.x;
    posnFrame.y = posn.y;
    posnFrame.z = posn.z;
    return posnFrame;
}
Теперь можно записать так:
Код: C++
  1. // автоматическая конверсия RwV3d > CVector
  2. static CVector GetFramePosn(RwFrame *frame) {
  3.     return RwFrameGetLTM(frame)->pos;
  4. }
2. CFont::PrintString для GTA3/GTAVC поддерживает однобайтные строки (char *)
3. Для форматирования удобнее использовать функцию plugin::Format
4. Для быстрого вывода на экран можно использовать класс gamefont (обёртка над CFont)
5. Класс gamefont может выводить список из строк на экран
Код: C++
  1. // вывод списка строк на экран
  2. gamefont::Print({
  3.     Format("enableSpeed %d", vehComps.Get(player->m_pVehicle).enableSpeed),
  4.     Format("MaxGearVelocity %.2f", player->m_pVehicle->m_pHandlingData->m_transmissionData.m_fMaxGearVelocity),
  5.     Format("ID trailer %d", vehComps.Get(player->m_pVehicle).m_pTrailer ? vehComps.Get(player->m_pVehicle).m_pTrailer->m_nModelIndex : -1)
  6. }, 10, 100, 1, FONT_DEFAULT, 1, 1, color::Orange);
Название: Re: Перевозка транспорта
Отправлено: kenking от Январь 26, 2019, 11:24:41 am
Спасибо.
Цитировать
В новой версией sdk добавлен автоматический конверт из RwV3d в CVector.
Тогда там функция GetFramePosn вообще не нужна. Можно сразу так:
Код: C++
  1. if (DistanceBetweenPoints(RwFrameGetLTM(vehComps.Get(vehicle).misc)->pos, RwFrameGetLTM(vehComps.Get(trailer).hookup)->pos) <= 2.0f)

Цитировать
Класс gamefont может выводить список из строк на экран
Вот это очень полезная вещь!