Автор Тема: Перевозка транспорта  (Прочитано 1917 раз)

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 172
  • Репутация: +9/-0
    • Просмотр профиля
Re: Перевозка транспорта
« Ответ #15 : Ноябрь 15, 2018, 09:51:32 am »
Да, бывает, что прицеп "колбасит" в некоторых нестандартных аварийных ситуациях, но не часто. А с авто в трафике такого вообще не замечал. В общем по моим наблюдениям, если ездить нормально, то сцепка работает хорошо.

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

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

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 522
  • Репутация: +59/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Перевозка транспорта
« Ответ #16 : Ноябрь 15, 2018, 09:56:57 am »
По оптике у меня тоже вопрос. Я не нашел способа убрать headlights и taillights, их удаление из модели ставит координаты фар в центр машины. Костыль - отодвинуть их глубоко под землю. Раздельное включение я тоже не нашел, только одновременное и при работающем моторе. Хотелось бы с этим разобраться.

P.S. Уточнение по коду - возможно некоторые функции работы с матрицами есть и в стандартной игре, я не стал разбираться и написал их заново.
« Последнее редактирование: Ноябрь 15, 2018, 10:00:39 am от xanser »

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 172
  • Репутация: +9/-0
    • Просмотр профиля
Re: Перевозка транспорта
« Ответ #17 : Ноябрь 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) есть ли на модели дамми headlights, точнее считать координаты этого дамми и если координаты будут нулевые (а они по-идеи будут нулевые при отсутствие этого дамми), то "разбивать" передние фары. Тоже самое и с задними.

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

Ещё по оптике вопрос в том, что на прицепе не срабатывает стопсигнал при торможении. Запись значения m_fBreakPedal тягача в соответствующее значение m_fBreakPedal прицепа ничего не даёт. Надо разбираться.

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 522
  • Репутация: +59/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Перевозка транспорта
« Ответ #18 : Ноябрь 16, 2018, 07:28:01 am »
Второй вариант через проверку наличия headlights и taillights - отличная идея для работы со светом. Спасибо за совет. Интересно, как разбить фары в обычной игре, у меня не получилось, а программно все работает, теперь многие вещи можно поправить.

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 536
  • Репутация: +19/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Перевозка транспорта
« Ответ #19 : Ноябрь 16, 2018, 08:54:51 am »
Интересно, как разбить фары в обычной игре, у меня не получилось, а программно все работает, теперь многие вещи можно поправить.
Передние фары "разбиваются" при повреждении передних крыльев авто, задние и фары у байков - никак :(
Вариант kenking(удаление дамми, проверка нулевых координат и "разбивание" фар программно) видимо действительно пока единственный(только в "повторах" фары будут видны), т.к. даже в трехе у BF Injection, у которой нет передних фар, разрабы оставили их дамми, т.к. в игре нет флага для отсутствия фар, как это есть в случае с отсутствием дверей(у той же BF Injection)...

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 172
  • Репутация: +9/-0
    • Просмотр профиля
Re: Перевозка транспорта
« Ответ #20 : Ноябрь 16, 2018, 01:14:51 pm »
Цитировать
Передние фары "разбиваются" при повреждении передних крыльев авто, задние и фары у байков - никак
Задние разбиваются соответственно при повреждении задних крыльев авто.
Да у байка не повреждаются, в структуре нет CDamageManager.

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 522
  • Репутация: +59/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Перевозка транспорта
« Ответ #21 : Ноябрь 17, 2018, 03:57:40 am »
Еще одна вещь, которую можно доработать - это вталкивание прицепа задним ходом в стену, не часто возникнет, но все же, прицеп ее проткнет. Думаю, тут подойдет проверка через функцию CWorld::ProcessLineOfSight от центра прицепа назад, и сравнение результата с длиной кола прицепа, который в этом случае можно будет отцепить.

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 172
  • Репутация: +9/-0
    • Просмотр профиля
Re: Перевозка транспорта
« Ответ #22 : Ноябрь 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. }

По оптике на прицепе добавил ещё такую штуку - в случае отцепки прицепа, двигатель на нём выключается и соответственно фары тоже.
Добавил проверку на нахождение после тягача другого транспорта, в случае отсутствия такового, прицеп добавляется к тягачу, иначе нет.

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 233
  • Репутация: +323/-0
    • dk22pac
    • Просмотр профиля
Re: Перевозка транспорта
« Ответ #23 : Ноябрь 25, 2018, 10:40:29 pm »
Надо в sdk будет добавить функцию GetVehicleModel(int), а то этот серпантин каждый раз приходиться писать  ;D
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 172
  • Репутация: +9/-0
    • Просмотр профиля
Re: Перевозка транспорта
« Ответ #24 : Декабрь 07, 2018, 11:44:13 am »
Добавил ещё проверку, что игрок в авто, в случае нажатия клавиши для отцепки прицепа, а то получалось так, что игрок вышел из авто с прицепом, находится рядом с ним и  если нажата клавиша отцепки прицепа, то прицеп отцепляется.
Добавил проверку "брошенных" прицепов в трафике и их удаление.
Осталось разобраться с положением камеры.

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 522
  • Репутация: +59/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Перевозка транспорта
« Ответ #25 : Декабрь 07, 2018, 05:33:07 pm »
Прицеп отцепляется, пока машина принадлежит игроку, в том числе и с улицы. Если сесть в другую, отцепка уже не действует. В жизни может быть похоже, вышел, отцепил, думаю это допустимо. По поводу брошенных прицепов, можно же создавать машины без запоминания (в классе CVehicle свойство 0x1F8 m_nCreatedBy), они сами исчезнут вне зоны видимости. Хотя могут быть подводные камни, типа прицеп в трафике с пропавшим тягачом.

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 172
  • Репутация: +9/-0
    • Просмотр профиля
Re: Перевозка транспорта
« Ответ #26 : Декабрь 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. }

Ну и "брошенных" прицепов в трафике нет.