Автор Тема: Написание плагина. Настройка проекта  (Прочитано 27272 раз)

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 234
  • Репутация: +325/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #225 : Декабрь 12, 2018, 11:08:43 am »
Если надо найти один рандомный транспорт - то надо весь созданный транспорт записать в список, и из списка выбрать рандомный элемент.
Код: C++
  1. CVehicle *GetRandomVehicle(CVector const &posn, float radius) {
  2.     std::vector<CVehicle *> vehicles;
  3.     for (auto vehicle : CPools::ms_pVehiclePool) {
  4.         if (DistanceBetweenPoints(vehicle->GetPosition(), posn) <= radius)
  5.             vehicles.push_back(vehicle);
  6.     }
  7.     return vehicles.empty() ? nullptr : vehicles[plugin::Random(0, vehicles.size() - 1)];
  8. }
Функцию можно оптимизировать, - выделяя память под список только один раз
Код: C++
  1. CVehicle *GetRandomVehicle(CVector const &posn, float radius) {
  2.     static std::vector<CVehicle *> vehicles(CPools::ms_pVehiclePool->m_nCapacity);
  3.     unsigned int counter = 0;
  4.     for (auto vehicle : CPools::ms_pVehiclePool) {
  5.         if (DistanceBetweenPoints(vehicle->GetPosition(), posn) <= radius)
  6.             vehicles[counter++] = vehicle;
  7.     }
  8.     return counter == 0 ? nullptr : vehicles[plugin::Random(0, counter - 1)];
  9. }
« Последнее редактирование: Декабрь 12, 2018, 11:11:44 am от DK »
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

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

Оффлайн egor230

  • Новичек
  • **
  • Сообщений: 133
  • Репутация: +5/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #226 : Декабрь 12, 2018, 06:55:34 pm »
 Здравствуйте, уважаемый Дмитрий! Спасибо большое, что несмотря на Вашу огромную загруженность, нашли время мне ответить. Основная прелесть С++ в том, что одну и ту же задачу можно решить множеством способов. Вы предоставили два варианта функций. Подскажите, пожалуйста, как именно их вызывать? Дело в том, что я занимаюсь выкладыванием простых примеров на основе Вашего плагина в группу https://vk.com/gtabuilder. Чтобы расшевелить интерес у аудитории, показать им что это не так сложно, чем кажется. Год назад только от одного слова С++ у меня начинался ступор. Думал: "у меня же нет Нобелевской премии, чтобы в нем разбираться?". Два месяца почитал книги и уже основы понимаю. Думал, будет тяжелее.

 Скажите пожалуйста, как заставить автомобиль ехать на определенные координаты и проверить, находится ли он в этих координатах?
« Последнее редактирование: Декабрь 13, 2018, 12:45:06 pm от egor230 »

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 192
  • Репутация: +12/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #227 : Декабрь 13, 2018, 08:34:45 am »
Цитировать
Вы предоставили два варианта функций. Подскажите, пожалуйста, как именно их вызывать?
Смотри аргументы функции и возвращаемое значение.

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

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

Оффлайн egor230

  • Новичек
  • **
  • Сообщений: 133
  • Репутация: +5/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #228 : Декабрь 13, 2018, 01:22:45 pm »
Благодарю вас,  что уделяйте мне ваше время уважаемый  kenking.  Мне очень хочется чтобы больше людей писали плагины.  Бывает нелегко разобраться в этом, в книгах Мы изучали  работу с числами и строками, тут немного другое, поэтому сложнее,  но интересно. писал раньше  на cleo, но у с++  гораздо больше возможностей, всё-таки  пишешь плагин всё равно в стиле cleo, по внутренней привычке.  Например, так В функцию CVehicle *v = randomfindcar(player, 20.0);;//передаем указатель на игрока, размер диаметра радиуса через дробное число, возвращаем указатель на найденный автомобиль. Чтобы  машина ехала на определенные координаты, думал, что нужно использовать
    CAutoPilot m_autopilot; но как?  Буду очень вам признателен если вы  подскажите мне.

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 192
  • Репутация: +12/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #229 : Декабрь 13, 2018, 06:57:49 pm »
Цитировать
Чтобы  машина ехала на определенные координаты, думал, что нужно использовать
    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;

Оффлайн egor230

  • Новичек
  • **
  • Сообщений: 133
  • Репутация: +5/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #230 : Декабрь 21, 2018, 04:19:41 pm »
Здравствуйте уважаемый kenking, благодарю Вас за ответ. Очень долго его обдумывал, чтобы правильно понять. Очень жаль, что CАutoPilot пока не разобран в SDK , у него огромное будущее и колоссальные возможности. В моих экспериментах использование цикла while приводит к зависанию. А почему? Ведь он очень удобен. Я написал функцию в виде класса. Но почему-то она зависает. Я комментировал почти каждую строчку кода, чтобы было понятно. Но все равно не пойму где ошибка?
 
При нажатии кнопки М, мы передаем в конструктор класса. Первым параметром имя файла с расширением и указатель на хендл авто в котором сидит игрок. Потом вызываем метод writte, но как записать координаты без использования цикла while? В метод getcord мы передаём ссылку на очередь и ассоциативный массив. Потом вводим его по ключам x,y,z значения. Но в теории все хорошо, а на практике при записи все зависает, при выводе ничего не выводится. Я  тут уже неделю голову ломаю. Надеюсь на Ваш совет.
Код: C++
  1. #include<string>
  2. #include<fstream>
  3. #include<queue>
  4. #include<map>
  5. #include "plugin.h"
  6. #include "common.h"
  7. #include "CWorld.h"
  8. #include "extensions\KeyCheck.h"
  9. #include "CMessages.h"
  10. #include "CAutomobile.h"
  11. #include "CModelInfo.h"
  12. using namespace plugin;
  13.  
  14. using namespace std;
  15.  
  16. queue<double>q = {};// очередь для хранение всех значение координат из файла.
  17. map<string, double> pos;// ассоциативный массив
  18. //bool readf проверка прочитан файл координат?
  19. class fille {bool readf = false;  static char cord[255];
  20. public: string path;// адрес файла
  21. fstream f;
  22. fille(string path, CVehicle *v) {CVehicle *v1 =  v;
  23.  
  24. f.open(path, fstream::in | fstream::app | fstream::out);
  25. if (f.is_open()) { }}// файл открыть.
  26.        
  27. void write(){   CVehicle *v1 = v1;      char x[256];
  28.         snprintf(x, 256, "x = %.2f;y = %.2f;z = %.2f;", v1->GetPosition().x, v1->GetPosition().y, v1->GetPosition().z);
  29.         if (x != cord){ char cord =  x[256];// сравнить с предыдущей значение
  30.         f << x; }// записать координаты в файл.
  31. }
  32. template <class t1, class t2>// это метод как шабло. функция.
  33. void getcord(t1 *q, t2 *pos) {int a; // принимает очередь и ассо массив.
  34. if (readf == false){ while (f >> a) { q->push(a); // считываем файл в очередь
  35.         readf = true;}//заполнена очередь, уст флаг.
  36. }
  37. if (q->empty()) { readf = false; }// если очередь пуста, уст флаг
  38.  
  39. else {pos->clear();// очистить ассо массив
  40.                 pos->emplace("x", q->front());  q->pop();// добавить значение по ключу
  41.                 pos->emplace("y", q->front());  q->pop();// и удаляет из очереди.
  42.                 pos->emplace("z", q->front());  q->pop();}
  43. }
  44. ~fille() {      f.close();} // деструктор, закрывает файл.
  45. };
  46. char fille::cord[255]; // предущеннее значение
  47.  
  48. bool isPedInVehicle(CPed * player) {return player->m_bInVehicle && player->m_pVehicle != NULL;}
  49.  
  50. class Message {//имя класса
  51. public:
  52.         Message() {     Events::gameProcessEvent += [] {//обработчик событий игры
  53.                 CPed *player = FindPlayerPed();// найти игрока
  54.                 if (!player) return;// проверка найден игрок
  55.                 if (!isPedInVehicle(player)) return; // в авто игрок?
  56.                 KeyCheck::Update();
  57.                 if (KeyCheck::CheckWithDelay('M', 200)) {//если м нажата
  58.                         CMessages::AddMessageJumpQ("red on", 5000, 3);//выводит сообщение на экран              
  59.                         CVehicle *v = player->m_pVehicle;// получить указатель на хенлд авто
  60.                         fille f("cord.txt", v);  // Вызывается конструктор.
  61.                         f.write();// записать координаты в файл.
  62.                 KeyCheck::Update();
  63.                 if (KeyCheck::CheckWithDelay('B', 200)) {//если м нажата
  64.                         f.getcord(&q, &pos);// получить координаты из файла.
  65.                         char s[256];
  66.                         snprintf(s, 256, "x = %.2f;y = %.2f;z = %.2f;", pos["x"], pos["y"], pos["z"]);
  67.                         CMessages::AddMessageJumpQ(s, 5000, 3);
  68.  
  69.                         }
  70.                   }  
  71.                 };
  72.         }
  73. } message;
  74.  
  75.  

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 192
  • Репутация: +12/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #231 : Декабрь 22, 2018, 04:52:47 pm »
Не совсем понимаю твою задумку. Для чего это нужно? Примеры чтения данных из файла здесь ранее показывал DK.

Оффлайн egor230

  • Новичек
  • **
  • Сообщений: 133
  • Репутация: +5/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #232 : Декабрь 23, 2018, 05:40:54 pm »
Не совсем понимаю твою задумку. Для чего это нужно? Примеры чтения данных из файла здесь ранее показывал DK.
Здравствуйте, уважаемый kenking, задумка состоит в следующем: при нажатии определённой клавиши, записываются файлы-координаты по трём осям y, x, z. Нужно организовать так, чтобы записывались пока игрок не нажал другую кнопку. Тут без цикла while никак не обойтись. Потом из этого файла эти координаты могли считаться. Скажите, пожалуйста, как реализовать построение условной конструкции в sdk? Например, нажимаешь одну кнопку, выполняется одно, нажимаешь другую-другое. У меня это приводит к зависанию и вылету игры после вывода координат.

Код: C++
  1. #include "plugin.h"
  2. #include "common.h"
  3. #include "CWorld.h"
  4. #include "extensions\KeyCheck.h"
  5. #include "CMessages.h"
  6. #include "CAutomobile.h"
  7. #include "CModelInfo.h"
  8. #include<string>
  9. #include<fstream>
  10. #include<queue>
  11. #include<map>
  12. using namespace plugin;
  13.  
  14. using namespace std;
  15. static bool readf = false;
  16.  
  17. queue<double>q = {};// очередь для хранение всех значение координат из файла.
  18. map<string, double> pos;// ассоциативный массив
  19.  
  20. bool isPedInVehicle(CPed * player) { return player->m_bInVehicle && player->m_pVehicle != NULL; }
  21.  
  22. void write(CPed *player, string path) {
  23.         CVehicle *v = player->m_pVehicle;// получить указатель на хенлд авто
  24.         fstream f; static char cord[256];
  25.         f.open(path, fstream::in | fstream::app | fstream::out);
  26.         if (f.is_open()) {
  27.                 char x[256];
  28.                 snprintf(x, 256, "%.2f %.2f %.2f \n", v->GetPosition().x, v->GetPosition().y, v->GetPosition().z);
  29.                 if (x != cord) {
  30.                         char cord = x[256];// сравнить с предыдущей значение
  31.                         f << x;
  32.                 }// записать координаты в файл.
  33.         }f.close();
  34. };
  35. template <class t1, class t2>// это метод как шабло. функция.
  36. void getcord(t1 *q, t2 *pos, string path) {     fstream f1;
  37. f1.open(path, fstream::in | fstream::app | fstream::out);
  38.         int a; // принимает очередь и ассо массив.
  39.         if (f1.is_open()) {
  40.                 if (readf == false) {
  41.                         while (f1 >> a) {
  42.                                 q->push(a); // считываем файл в очередь
  43.                                 readf = true;
  44.                         }//заполнена очередь, уст флаг.
  45.                 }
  46.                 if (q->empty()) { readf = false; }// если очередь пуста, уст флаг
  47.  
  48.                 else {
  49.                         pos->clear();// очистить ассо массив
  50.                         pos->emplace("x", q->front());  q->pop();// добавить значение по ключу
  51.                         pos->emplace("y", q->front());  q->pop();// и удаляет из очереди.
  52.                         pos->emplace("z", q->front());  q->pop();
  53.                 }
  54.         }
  55.  f1.close();  // закрывает файл.
  56. };
  57. class PlayerCoors {
  58. public:
  59.         PlayerCoors() {
  60.                 Events::gameProcessEvent += [] {//обработчик событий игры
  61.                         KeyCheck::Update();
  62.                         if (KeyCheck::CheckWithDelay('M', 200)) {//если м нажата
  63.                                 CPed *player = FindPlayerPed();// найти игрока
  64.                                 if (!player && !isPedInVehicle(player)) return; {// проверка найден игрок
  65.                                         CMessages::AddMessageJumpQ("this is gta vc", 5000, 3);//выводит сообщение на экран
  66.                                         write(player, "cord.txt");  // записать координаты в файл.
  67.                 }       }
  68.                     if (KeyCheck::CheckWithDelay('B', 200)) {//если м нажата
  69.                                 CPed *player = FindPlayerPed();// найти игрока
  70.                                 if (!player) return;
  71.                                                 getcord(&q, &pos, "cord.txt");// получить координаты из файла.
  72.                                                 static char s[256];
  73.                                                 snprintf(s, 256, "x = %.2f;y = %.2f;z = %.2f;", pos["x"], pos["y"], pos["z"]);
  74.                                                 CMessages::AddMessageJumpQ(s, 5000, 3);
  75.                         }
  76.                 };
  77.         }
  78. } playerCoors;
  79.  
  80.  

так все стало работать, как надо.

Код: C++
  1.  
  2. #include "plugin.h"
  3. #include "common.h"
  4. #include "extensions\KeyCheck.h"
  5. #include "CMessages.h"
  6. #include "CTimer.h"
  7. #include<thread> // std::thread
  8. #include<chrono> // std::thread
  9. #include<string>
  10. #include<fstream>
  11. #include<queue>
  12. #include<map>
  13. using namespace plugin;
  14.  
  15. using namespace std;
  16.  
  17. queue<double>q = {};// очередь для хранение всех значение координат из файла.
  18. map<string, double> pos;// ассоциативный массив
  19. bool readf = false;// начальное положение флага для чтение из файла.
  20. bool off = false;// выключения записи флага
  21. bool isPedInVehicle(CPed * player) { return player->m_bInVehicle && player->m_pVehicle != NULL; }
  22.  
  23. void write(CPed *player, string path, bool &off) {
  24.         CVehicle *v = player->m_pVehicle;// получить указатель на хенлд авто
  25.         fstream f; static char cord[256]; static unsigned int time = 0;// обнулить таймер
  26.         f.open(path, fstream::in | fstream::app | fstream::out);
  27.         if (f.is_open()) {while(true){if (CTimer::m_snTimeInMilliseconds - time > 5000) {
  28.                 this_thread::sleep_for(chrono::milliseconds(600));// задержка
  29.                 time = 0;// обнулить таймер
  30.                 static string cord = ""; // строка для сравнение
  31.                 char x[256]; snprintf(x, 256, "%.2f %.2f %.2f \n", v->GetPosition().x, v->GetPosition().y, v->GetPosition().z);
  32.                  string cordnenxt = string(x); // массив char в string
  33.                 if (cordnenxt != cord) {cord = cordnenxt;// сравнить с предыдущей значение
  34.                         f << cordnenxt; }// записать координаты в файл.
  35.                         if (off == true) {      break;  }}}// если кнопка в нажата, выкл запись координат.
  36.                 }// записать координаты в файл.
  37.         f.close();      off = false;// выключения записи флага
  38.         return;
  39. };
  40. template <class t1, class t2>// это метод как шабло. функция.
  41. void getcord(t1 *q, t2 *pos, string path, bool &readf, bool &oof) {
  42.         fstream f1;
  43.         f1.open(path, fstream::in | fstream::app | fstream::out);
  44.         static unsigned int time = 0;// обнулить таймер.
  45.         double a; // принимает очередь и ассо массив.
  46.         off = true; //выкл запись координат.
  47.         if (f1.is_open()) {     if (readf == false) {// если false нужно прочитать файл.
  48.                 while (f1 >> a) {       if (CTimer::m_snTimeInMilliseconds - time > 500){
  49.                                 q->push(a); // считываем файл в очередь
  50.                                 readf = true; } }}//заполнена очередь, уст флаг.
  51.         if (q->empty()) { readf = false; }// если очередь пуста, уст флаг
  52.  
  53.                 else {pos->clear();// очистить ассо массив
  54.                         pos->emplace("x", q->front());  q->pop();// добавить значение по ключу
  55.                         pos->emplace("y", q->front());  q->pop();// и удалить из очереди.
  56.                         pos->emplace("z", q->front());  q->pop();}
  57.         }
  58.         f1.close();  // деструктор, закрывает файл.
  59. };
  60. class PlayerCoors {
  61. public:
  62.         PlayerCoors() { Events::gameProcessEvent += [] {//обработчик событий игры 
  63.                 KeyCheck::Update();
  64.                 CPed *player = FindPlayerPed();// найти игрока
  65.                 if (!player) return; {if (KeyCheck::CheckWithDelay('M', 200) && isPedInVehicle(player)) {// проверка найден игрок и за рулем.
  66.                         CMessages::AddMessageJumpQ("this is gta vc", 5000, 3);//выводит сообщение на экран
  67.                         thread th(write, player, "cord.txt", std::ref(off));th.detach();}// независим поток. записать координаты в файл.
  68.             // передаем в новом поток.
  69.                 if (KeyCheck::CheckWithDelay('B', 200) && !isPedInVehicle(player)) { //если м нажата
  70.              getcord(&q, &pos, "cord.txt", readf, off);// получить координаты из файла.                                                       
  71.                      char s[256];
  72.                           snprintf(s, 256, "x = %.2f;y = %.2f;z = %.2f;", pos["x"], pos["y"], pos["z"]);
  73.                           CMessages::AddMessageJumpQ(s, 5000, 3);//выводит сообщение на экран
  74.                         } }
  75.                 };
  76.         }
  77. } playerCoors;
  78.  
« Последнее редактирование: Декабрь 26, 2018, 11:07:46 pm от egor230 »

Оффлайн egor230

  • Новичек
  • **
  • Сообщений: 133
  • Репутация: +5/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #233 : Декабрь 28, 2018, 07:10:33 pm »

Поражаюсь насколько plugin sdk крутая вещь. Особенно в умелых руках. Потихоньку его осваиваю, возникли следующие вопросы: на что влияют данные функции?

            v->m_autopilot.m_fMaxTrafficSpeed = 300.0;
            v->m_fTotSpeed = 140.0;
            v->m_fGasPedal = 40.0;
            v->m_vecMoveSpeed.Set(-92.69, -997.78, 10.28);
            v->m_fVelocityFrequency = 100.0;// что это отвечает?

Все равно машина не едет без этих команд.
            Command<COMMAND_CAR_GOTO_COORDINATES>(CPools::GetVehicleRef(v), -92.69, -997.78, 10.28);
            Command<COMMAND_SET_CAR_CRUISE_SPEED>(CPools::GetVehicleRef(v), 30.0);   

Без команды Command<COMMAND_SET_CAR_CRUISE_SPEED>(CPools::GetVehicleRef(v), 30.0); вообще стоит на месте. 
Чем заменить скриптовую команду?

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 192
  • Репутация: +12/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #234 : Декабрь 29, 2018, 09:23:32 am »
Цитировать
Чем заменить скриптовую команду?
Надо смотреть в базе, как устроен соответствующий опкод. Если я правильно разобрал опкод 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;
« Последнее редактирование: Декабрь 29, 2018, 04:19:40 pm от kenking »

Оффлайн egor230

  • Новичек
  • **
  • Сообщений: 133
  • Репутация: +5/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #235 : Декабрь 29, 2018, 10:46:20 am »
Спасибо большое kenking Но для GTA Vice City  такого метода нет. Он есть для GTA San Andreas.
 А что обозначает m_pHandling->m_transmissionData.m_fEngineInertia?
 Скажите пожалуйста как создать маркер на машины и удалить его?  Интересно  что ждет  в новом обновлении sdk plugin?

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 192
  • Репутация: +12/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #236 : Декабрь 29, 2018, 04:25:41 pm »
Я ошибся. Там не m_fEngineInertia, а m_fMaxSpeed. Надо будет в sdk исправить для gta3 и для VC заодно разобрать.
Цитировать
Скажите пожалуйста как создать маркер на машины и удалить его?
Ты же в клео разбираешься? Смотри как устроены соответствующие опкоды в базе. Затем смотри в sdk добавлены ли нужные классы.
 

Оффлайн egor230

  • Новичек
  • **
  • Сообщений: 133
  • Репутация: +5/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #237 : Декабрь 30, 2018, 11:57:27 am »
kenking для  Vice City у m_autoPilot  Нет метода m_nCruiseSpeed   Вот даже видео записал https://www.youtube.com/watch?v=qglTA3su3Tg&feature=youtu.be  Может надо что-то подключить?  Поймите меня правильно я хочу разобраться, чтобы потом помогать разбираться  другим.  Может  этот метод ещё не добавлен.

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 192
  • Репутация: +12/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #238 : Декабрь 30, 2018, 06:09:13 pm »
Проект обнови, в CAutoPilot я добавил m_nCruiseSpeed. По маркерам - надо разбирать класс CRadar.

Оффлайн egor230

  • Новичек
  • **
  • Сообщений: 133
  • Репутация: +5/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #239 : Декабрь 30, 2018, 06:12:35 pm »
спасибо большое уважаемый kenking очень  ждал вашего ответа, спасибо огромное за подсказку. Добавьте еще, пожалуйста, v->m_pHandling->m_transmissionData.m_fMaxSpeed для vice city его нет. CRadar тоже нет для vc.
« Последнее редактирование: Декабрь 30, 2018, 07:06:17 pm от egor230 »