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

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


Сообщения - kenking

Страницы: [1] 2 3 ... 13
1
Цитировать
как заставить педа бежать к координатам?
В который раз объясняю, что надо смотреть в базе, как устроен соответствующий опкод, без этого не разберёшься.
Код: C++
  1. CPed *ped;
  2. CVector *point;
  3. ped->m_nPedFlags.b32 = 0;
  4. CPed::SetObjective(ped, OBJECTIVE_RUN_TO_AREA, point);

Цитировать
в некоторые функциях есть параметр CVector, что передаем в таком случае?
Вектор и передаём.

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

2
Цитировать
//ped->bfFlagsD &= 0x7F;//это метода нет
Это установка флага. В базе и в sdk записи в данный момент не совпадают и не все флаги "обозначены" правильно.
Надо так:
Код: C++
  1. ped->m_nPedFlags.b32 = 0;

3
Цитировать
Есть  задача, чтобы ped нападал  на  игрока.
Думал, сделать так, через функции не получилось.
пришлось, чтобы пед  атаковал игрока, использовать скриптовую команду.
Надо смотреть, как устроен соответствующий опкод в базе (я уже ранее писал про это). Опкоды:
01C9: actor $2324 kill_actor $2291
01CA: actor $853 kill_player $PLAYER_CHAR

в базе выглядят так:
Код: C++
  1. case SET_CHAR_OBJ_KILL_CHAR_ON_FOOT:
  2.       CRunningScript::CollectParameters(this, &this->m_nIp, 2);
  3.       CPed *ped_01C9 = CPool<CPed,CPlayerPed>::GetAt(CPools::ms_pPedPool, ScriptParams[0].m_nIntValue);
  4.       CPed *ped_01C9a = CPool<CPed,CPlayerPed>::GetAt(CPools::ms_pPedPool, ScriptParams[1].m_nIntValue);
  5.       ped_01C9->bfFlagsD &= 0x7F;
  6.       CPed::SetObjective(ped_01C9, OBJECTIVE_KILL_CHAR_ON_FOOT, ped_01C9a);
  7.       result = 0;
  8. break;
  9. case SET_CHAR_OBJ_KILL_PLAYER_ON_FOOT:
  10.       CRunningScript::CollectParameters(this, &this->m_nIp, 2);
  11.       CPed *ped_01CA = CPool<CPed,CPlayerPed>::GetAt(CPools::ms_pPedPool, ScriptParams[0].m_nIntValue);
  12.       id_01CA = ScriptParams[1].m_nIntValue;
  13.       ped_01CA->bfFlagsD &= 0x7F;
  14.       CPed::SetObjective(ped_01CA, OBJECTIVE_KILL_CHAR_ON_FOOT, CWorld::Players[id_01CA].m_pPed);
  15.       result = 0;
  16. break;

Значит в первом случае надо сделать так:
Код: C++
  1. pedOne->bfFlagsD &= 0x7F;
  2. CPed::SetObjective(pedOne, OBJECTIVE_KILL_CHAR_ON_FOOT, pedTwo);

Во втором случае с игроком так:
Код: C++
  1. ped->bfFlagsD &= 0x7F;
  2. CPed::SetObjective(ped, OBJECTIVE_KILL_CHAR_ON_FOOT, CWorld::Players[CWorld::PlayerInFocus].m_pPed);


4
Этот пул CPool<CObject, CCutsceneObject> *&ms_pObjectPool; не только для CObject, но и для CCutsceneObject.

Цитировать
То есть если создать расширенный класс CObject с размером 0x1A0, то все становится правильно.
Это класс CCutsceneObject, размер как раз 0x1A0
https://github.com/DK22Pac/plugin-sdk/blob/master/plugin_vc/game_vc/CCutsceneObject.h


UPD:
Да у меня тоже не получилось перебрать объекты. Странно...
DK же делал пример для объектов SA и там это работает.


UPD2:
Действительно, всё работает, я оказывается не тот ID объекта в свой проверочный код написал.  :)

5
15 - это компонент  CAR_DOOR_LF (водитель выходит через левую переднюю дверь)
16 - CAR_DOOR_LR
11 - CAR_DOOR_RF
12 - CAR_DOOR_RR

Смотри eCarNodes

6
Код: C++
  1. #include "plugin.h"
  2. #include "CPed.h"
  3.  
  4. using namespace plugin;
  5.  
  6. class Test {
  7. public:
  8.     Test() {
  9.         Events::gameProcessEvent += [] {
  10.             CPed *player = FindPlayerPed();
  11.             if (player) {
  12.                 for (auto car : CPools::ms_pVehiclePool) {
  13.                     if (DistanceBetweenPoints(car->GetPosition(), player->GetPosition()) < 20.0f && car->m_nVehicleClass == VEHICLE_AUTOMOBILE && car->m_fHealth > 50.0f) {
  14.                         if (car->m_pDriver && car->m_pDriver != player)
  15.                             car->m_pDriver->SetExitCar(car, 15);
  16.                     }
  17.                 }
  18.             }
  19.         };
  20.     }
  21. } test;

7
... в CCarCtrl::JoinCarWithRoadSystemGotoCoors ошибочный лишний третий параметр.
Оказывается там всё верно, сорри.

8
Цитировать
как сделать  функцию, которая  проверяет нажата ли клавиша? возвращает true, только когда  эта клавиша  отпущена?
class KeyCheck http://forum.gtabuilder.ru/index.php?topic=337.msg2356#msg2356

9
Идеи / Re: Перевозка транспорта
« : Январь 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 может выводить список из строк на экран
Вот это очень полезная вещь!

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


Цитировать
Увеличение массы даёт увеличение максимальной скорости.
Проверил увеличивая/уменьшая значение массы непосредственно в игре- на саму скорость изменение значения массы не влияет, влияет только на тормозной путь и время остановки авто. Меньше масса - быстрее останавливается и короче путь и наоборот.

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

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

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



13
Идеи / Re: Перевозка транспорта
« : Январь 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;

14
Идеи / Re: Перевозка транспорта
« : Январь 19, 2019, 11:55:26 am »
Имеется ввиду тягач с прицепом в трафике? Всё же решил добавить в трафик движение с прицепами? Это хорошо. Я добавил в трафик спавн двойных прицепов. В трафике встречается авто без прицепа, с одним прицепом и с двумя прицепами.
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;

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

15
Цитировать
Добавьте еще, пожалуйста, v->m_pHandling->m_transmissionData.m_fMaxSpeed для vice city его нет.
Было добавлено в том же коммите.

Цитировать
CRadar тоже нет для vc.
надо разбирать класс CRadar.

Цитировать
Скажите пожалуйста, как проверить находится ли  авто в заданных координатах c радиусом?
В предыдущих постах уже писали.

Цитировать
Как пользоваться скриптами командой
    COMMAND_GET_CAR_COORDINATES = 0xAA,
Код: C++
  1. #include "plugin.h"
  2. #include "extensions\KeyCheck.h"
  3. #include "extensions\ScriptCommands.h"
  4. #include "eScriptCommands.h"
  5. #include "CMessages.h"
  6.  
  7. using namespace plugin;
  8.  
  9. class Test {
  10. public:
  11.     Test() {
  12.         Events::gameProcessEvent += [] {
  13.             CVehicle *vehicle = FindPlayerVehicle();
  14.             KeyCheck::Update();
  15.             if (vehicle && KeyCheck::CheckWithDelay('M', 200)) {
  16.                 CVector pos = { 0.0f, 0.0f, 0.0f };
  17.                 Command<COMMAND_GET_CAR_COORDINATES>(CPools::GetVehicleRef(vehicle), &pos.x, &pos.y, &pos.z);
  18.                 static char message[256];
  19.                 snprintf(message, 256, "x = %.2f; y = %.2f; z = %.2f; ", pos.x, pos.y, pos.z);
  20.                 CMessages::AddMessageJumpQ(message, 3000, false);
  21.             }
  22.         };
  23.     }
  24. } test;

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