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

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


Сообщения - kenking

Страницы: [1] 2 3 ... 13
1
Идеи / 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.

2
Идеи / 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.  

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



3
Идеи / 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;

4
Идеи / 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;

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

5
Цитировать
Добавьте еще, пожалуйста, 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;

6


{$CLEO .cs}
0000:
while true
wait 0
    if
      Player.Defined($PLAYER_CHAR)
    then
        if 
          05EE: key_pressed 50
        then
            Model.Load(3064)
            038B: load_requested_models
            if
              Model.Available(3064)
            then
                Object.Destroy(0@)
                0@ = Object.Init(3064, 288.0, -1303.0, 11.4)
                Object.CollisionDetection(0@, 1)
                Model.Destroy(3064)
                Object.RemoveReferences(0@)
            end
            repeat
              wait 0
            until 85EE: not key_pressed 50
        end 
    end
end

7
Проект обнови, в CAutoPilot я добавил m_nCruiseSpeed. По маркерам - надо разбирать класс CRadar.

8
Я ошибся. Там не m_fEngineInertia, а m_fMaxSpeed. Надо будет в sdk исправить для gta3 и для VC заодно разобрать.
Цитировать
Скажите пожалуйста как создать маркер на машины и удалить его?
Ты же в клео разбираешься? Смотри как устроены соответствующие опкоды в базе. Затем смотри в sdk добавлены ли нужные классы.
 

9
Цитировать
Чем заменить скриптовую команду?
Надо смотреть в базе, как устроен соответствующий опкод. Если я правильно разобрал опкод 00AD: set_car 36@ max_speed_to 30.0 то получается так:
Код: C++
  1. vehicle->m_autoPilot.m_nCruiseSpeed = 30.0f;
  2. float maxSpeed = 60.0f * vehicle->m_pHandling->m_transmissionData.m_fMaxSpeed;
  3. if ( vehicle->m_autoPilot.m_nCruiseSpeed >= maxSpeed )
  4.     maxSpeed = vehicle->m_autoPilot.m_nCruiseSpeed;
  5. vehicle->m_autoPilot.m_nCruiseSpeed = maxSpeed;

10
Не совсем понимаю твою задумку. Для чего это нужно? Примеры чтения данных из файла здесь ранее показывал DK.

11
Цитировать
Чтобы  машина ехала на определенные координаты, думал, что нужно использовать
    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;

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

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

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

13
Цитировать
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
А тут всё по-другому.
Так там похоже сделано, просто действия "завёрнуты" в опкод и ты их не видишь.

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


14
Цитировать
Вот какой плагин получится
Как ты любишь усложнять. Зачем писать функцию 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;


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

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

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