Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - kenking

Страницы: [1] 2 3 ... 12
1
Цитировать
Чтобы  машина ехала на определенные координаты, думал, что нужно использовать
    CAutoPilot m_autopilot; но как?  Буду очень вам признателен если вы  подскажите мне.
Чтобы разобраться, надо смотреть в базе, как устроен соответствующий опкод 00A7: car 0@ drive_to 103.1 -832.3 9.317

Если я правильно его разобрал, то получается так:
Код: C++
  1. #include "plugin.h"
  2. #include "CWorld.h"
  3. #include "CTimer.h"
  4. #include "CVehicle.h"
  5. #include "CCarCtrl.h"
  6.  
  7. using namespace plugin;
  8.  
  9. class Test {
  10. public:
  11.     Test() {
  12.         Events::gameProcessEvent += [] {
  13.             CPed *player = FindPlayerPed();
  14.             if (player) {
  15.                 for (int i = 0; i < CPools::ms_pVehiclePool->m_nSize; i++) {
  16.                     CVehicle *vehicle = CPools::ms_pVehiclePool->GetAt(i);
  17.                     if (vehicle && (DistanceBetweenPoints(player->GetPosition(), vehicle->GetPosition()) < 5.0f)) {
  18.                         CVector offset = { 0.0f, 10.0f, 0.0f };
  19.                         CVector point = vehicle->m_placement * offset;
  20.                        
  21.                         //опкод 00A7:
  22.                         if (point.z <= -100.0f)
  23.                             point.z = CWorld::FindGroundZForCoord(point.x, point.y);
  24.                         point.z = vehicle->GetDistanceFromCentreOfMassToBaseOfModel() + point.z;
  25.                         if (CCarCtrl::JoinCarWithRoadSystemGotoCoors(vehicle, point))
  26.                             vehicle->m_autopilot.m_nCarMission = 9;
  27.                         else
  28.                             vehicle->m_autopilot.m_nCarMission = 8;
  29.                         vehicle->m_nType |= 0x18;
  30.                         vehicle->m_nVehicleFlags.bIsEngineOn = 1;
  31.                         if (vehicle->m_autopilot.m_nCruiseSpeed <= 6)
  32.                             vehicle->m_autopilot.m_nCruiseSpeed = 6;
  33.                         else
  34.                             vehicle->m_autopilot.m_nCruiseSpeed = vehicle->m_autopilot.m_nCruiseSpeed;
  35.                         vehicle->m_autopilot.m_nTimeToStartMission = CTimer::m_snTimeInMilliseconds;
  36.  
  37.                     }
  38.                 }
  39.             }
  40.         };
  41.     }
  42. } test;

Но! CAutoPilot не полностью разобран в sdk и в CCarCtrl::JoinCarWithRoadSystemGotoCoors ошибочный лишний третий параметр.

Поэтому пока это не исправили в sdk, можно использовать скриптовую команду:
Код: C++
  1. #include "plugin.h"
  2. #include "extensions\ScriptCommands.h"
  3. #include "eScriptCommands.h"
  4.  
  5. using namespace plugin;
  6.  
  7. class Test {
  8. public:
  9.     Test() {
  10.         Events::gameProcessEvent += [] {
  11.             CPed *player = FindPlayerPed();
  12.             if (player) {
  13.                 for (int i = 0; i < CPools::ms_pVehiclePool->m_nSize; i++) {
  14.                     CVehicle *vehicle = CPools::ms_pVehiclePool->GetAt(i);
  15.                     if (vehicle && (DistanceBetweenPoints(player->GetPosition(), vehicle->GetPosition()) < 5.0f)) {
  16.                         CVector offset = {0.0f, 10.0f, 0.0f};
  17.                         CVector point = vehicle->m_placement * offset;
  18.                         Command<COMMAND_CAR_GOTO_COORDINATES>(CPools::GetVehicleRef(vehicle), point.x, point.y, point.z);
  19.                     }
  20.                 }
  21.             }
  22.         };
  23.     }
  24. } test;

2
Цитировать
Вы предоставили два варианта функций. Подскажите, пожалуйста, как именно их вызывать?
Смотри аргументы функции и возвращаемое значение.

Цитировать
Зачем?
Вот
Цитировать
Если надо найти один рандомный транспорт

Цитировать
проверить, находится ли он в этих координатах?
Сравнение дистанции между двумя точками с радиусом как раз и есть эта проверка.

3
Цитировать
KeyCheck
http://forum.gtabuilder.ru/index.php?topic=337.msg2356#msg2356

Цитировать
KeyPressed('M')?.  С ним часто возникают проблемы.  Хочется проверять клавиши  так нажал  и только когда отпустишь она вернула true, Чтобы избежать повторного нажатия и клавиша будет нажата только  1 раз.  Допустим при нажатии клавиши  даётся игроку  500$  я немного  дольше подержал  и бах у меня 5 миллионов. Это настоящая проблема.
Здесь http://forum.gtabuilder.ru/index.php?topic=337.msg3355#msg3355 в своём коде ты правильно используешь KeyPressed, а в предыдущем сообщении http://forum.gtabuilder.ru/index.php?topic=337.msg3422#msg3422 уже не правильно.

Цитировать
Думал что есть  аналог опкода 05F0: 3@ = random_vehicle_near_point 0@ 1@ 2@ in_radius 10.0 find_next 1 pass_wrecked 0 //IF and SET
А тут всё по-другому.
Так там похоже сделано, просто действия "завёрнуты" в опкод и ты их не видишь.

Цитировать
Странно, но игра вылетает, если приближаюсь к любому авто.


4
Цитировать
Вот какой плагин получится
Как ты любишь усложнять. Зачем писать функцию isPedInVehicle, если player->m_bInVehicle и так показывает, что игрок в авто?
Код: C++
  1. #include "plugin.h"
  2. #include "CWorld.h"
  3. #include "extensions\KeyCheck.h"
  4. #include "CMessages.h"
  5.  
  6. using namespace plugin;
  7.  
  8. class Test {
  9. public:
  10.     Test() {
  11.         Events::gameProcessEvent += [] {
  12.             CPed *player = FindPlayerPed();
  13.             KeyCheck::Update();
  14.             if (player && player->m_bInVehicle && player->m_pVehicle && KeyCheck::CheckWithDelay('M', 200)) {
  15.                 player->m_pVehicle->m_fHealth = 1000.0f;
  16.                 player->m_pVehicle->m_nPrimaryColor = 0;
  17.                 player->m_pVehicle->m_nSecondaryColor = 0;
  18.                 static char message[256];
  19.                 snprintf(message, 256, "x = %.2f; y = %.2f; z = %.2f;", player->m_pVehicle->GetPosition().x, player->m_pVehicle->GetPosition().y, player->m_pVehicle->GetPosition().z);
  20.                 CMessages::AddMessageJumpQ(message, 3000, false);
  21.                 CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 5000;
  22.             }
  23.         };
  24.     }
  25. } test;

Или так:
Код: C++
  1. #include "plugin.h"
  2. #include "CWorld.h"
  3. #include "extensions\KeyCheck.h"
  4. #include "CMessages.h"
  5.  
  6. using namespace plugin;
  7.  
  8. class Test {
  9. public:
  10.     Test() {
  11.         Events::gameProcessEvent += [] {
  12.             CVehicle *vehicle = FindPlayerVehicle();
  13.             KeyCheck::Update();
  14.             if (vehicle && KeyCheck::CheckWithDelay('M', 200)) {
  15.                 vehicle->m_fHealth = 1000.0f;
  16.                 vehicle->m_nPrimaryColor = 0;
  17.                 vehicle->m_nSecondaryColor = 0;
  18.                 static char message[256];
  19.                 snprintf(message, 256, "x = %.2f; y = %.2f; z = %.2f;", vehicle->GetPosition().x, vehicle->GetPosition().y, vehicle->GetPosition().z);
  20.                 CMessages::AddMessageJumpQ(message, 3000, false);
  21.                 CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 5000;
  22.             }
  23.         };
  24.     }
  25. } test;

Цитировать
Как найти случайную машину?
Как проверить находится ли машина в заданных координатах?
Код: C++
  1. #include "plugin.h"
  2. #include "CFont.h"
  3.  
  4. using namespace plugin;
  5.  
  6. class Test {
  7. public:
  8.     Test() {
  9.         Events::drawingEvent += [] {
  10.             CPed *player = FindPlayerPed();
  11.             if (player) {
  12.                 for (int i = 0; i < CPools::ms_pVehiclePool->m_nSize; i++) {
  13.                     CVehicle *vehicle = CPools::ms_pVehiclePool->GetAt(i);
  14.                     if (vehicle && (DistanceBetweenPoints(player->GetPosition(), vehicle->GetPosition()) < 5.0f)) {
  15.                         CFont::SetScale(0.5f, 1.0f);
  16.                         CFont::SetColor(CRGBA(255, 255, 255, 255));
  17.                         CFont::SetJustifyOn();
  18.                         CFont::SetFontStyle(1);
  19.                         CFont::SetPropOn();
  20.                         CFont::SetWrapx(600.0f);
  21.                         wchar_t text[64];
  22.                         swprintf(text, L"ID vehicle %.d", vehicle->m_nModelIndex);
  23.                         CFont::PrintString(10.0f, 10.0f, text);
  24.                     }
  25.                 }
  26.             }
  27.         };
  28.     }
  29. } test;


5
Код: C++
  1. player->m_bInVehicle

Код: C++
  1. CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 5000;

6
Идеи / Re: Перевозка транспорта
« : Декабрь 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. }

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

7
Идеи / Re: Перевозка транспорта
« : Декабрь 07, 2018, 11:44:13 am »
Добавил ещё проверку, что игрок в авто, в случае нажатия клавиши для отцепки прицепа, а то получалось так, что игрок вышел из авто с прицепом, находится рядом с ним и  если нажата клавиша отцепки прицепа, то прицеп отцепляется.
Добавил проверку "брошенных" прицепов в трафике и их удаление.
Осталось разобраться с положением камеры.

8
Цитировать
просто хочется упростить получение координат.
Так ты не упрощаешь, а усложняешь. Функция GetPosition() как раз и возвращает координаты в виде вектора. Почитай про функции в С++ в том числе про возвращаемые значения и передачу параметров в функции по указателю и по ссылке.

9
Идеи / Re: Перевозка транспорта
« : Ноябрь 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. }

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

10
Код: C++
  1. #include "plugin.h"
  2. #include "extensions\KeyCheck.h"
  3. #include "CMessages.h"
  4.  
  5. using namespace plugin;
  6.  
  7. class PlayerCoors {
  8. public:
  9.     PlayerCoors() {
  10.         Events::drawingEvent += [] {
  11.             CPed *player = FindPlayerPed();
  12.             KeyCheck::Update();
  13.             if (KeyCheck::CheckWithDelay('M', 200) && player) {
  14.                 static char message[256];
  15.                 snprintf(message, 256, "x = %.2f; y = %.2f; z = %.2f;", player->GetPosition().x, player->GetPosition().y, player->GetPosition().z);
  16.                 CMessages::AddMessageJumpQ(message, 5000, 3, false);
  17.             }
  18.         };
  19.     }
  20. } playerCoors;

11
Код: C++
  1. #include "CMessages.h"
  2. CMessages::AddMessageJumpQ(L"kj", 5000, 0);

12
Цитировать
перечисления в смысле emum именованные константы?
Да, в смысле enum.

Цитировать
Сейчас, конечно за мои вопросы по cleo  мне стыдно. Теперь кажется всё Элементарно, чем тогда.
Лучше спросить и разобраться в вопросе, чем не спросить и дальше не знать ответа.

13
Идеи / Re: Перевозка транспорта
« : Ноябрь 16, 2018, 01:14:51 pm »
Цитировать
Передние фары "разбиваются" при повреждении передних крыльев авто, задние и фары у байков - никак
Задние разбиваются соответственно при повреждении задних крыльев авто.
Да у байка не повреждаются, в структуре нет CDamageManager.

14
Идеи / Re: Перевозка транспорта
« : Ноябрь 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 прицепа ничего не даёт. Надо разбираться.

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

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

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

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