Ответ

Имя:
E-mail:
Тема:
Иконка:

Вложение:
(Удалить вложение)
(Добавить ещё)
Ограничения: максимум вложений в сообщении — 4, максимальный размер всех файлов — 192 Кбайт, максимальный размер одного файла — 128 Кбайт
Визуальная проверка:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:
О какой игре форум? (три буквы заглавные):
Сколько будет (5*5 + 2) ответ цифрой.:

подсказка: нажмите alt+s для отправки или alt+p для предварительного просмотра сообщения


Сообщения в этой теме

Автор: egor230
« : Январь 05, 2019, 02:25:34 am »

Спасибо большой за ответ kenking  и разъяснение.
  Всё-таки  я не оставлял попыток,  сделать булевую функцию пытался через консоль,она работает правильно,мы передаем 3  координаты первый точки, потом 3  координаты другой точки, радиус в 3 координатах, она возвращает true или false.
Код: C++
  1. bool in_point_in_car_in_radius(double x, double y, double z, double x1,
  2.         double y1, double z1, double rx=0, double ry=0, double rz=0){
  3.         rx = abs(rx); ry = abs(ry);     rz = abs(rz);
  4.         if (rx == 0 || ry == 0)
  5.         {
  6.                 if (x == x1 && y == y1) {
  7.                         return true;
  8.                 }
  9.                 else {double r2 = rx * rx + ry * ry + rz * rz;
  10.                         x -= x1;
  11.                         y -= y1;
  12.                         z -= z1;
  13.                         if (x * x + y * y + z * z <= r2)
  14.                                 return true;
  15.                         else
  16.                                 return false;
  17.                 }
  18.         }
  19. };
  20. int main(int args, char* argv[]) {
  21.         if (in_point_in_car_in_radius(2, 1, 0,    0, 0, 0,     2, 1, 0)) {
  22.                 cout << "yes " << endl;
  23.         }
  24.         else {cout <<"no " << endl;  
  25.         };
  26.  
  27. return 0;
  28. system("pause");
  29. }
  30.  
  31.  

Потом перенес в плагин.  Записал  одну точку в текстовой файл, Нажал кнопку "в" создалась  машина   И поехала  В эту точку, потом встала как вкопанная.  Конечно надо улучшать, хотел  вывести сообщения. Пока не получилось   вот видео
https://www.youtube.com/watch?v=1EDkZUxfjZU&feature=youtu.be
код с комментариями
Код: C++
  1. #include "plugin.h"
  2. #include "common.h"
  3. #include "CStreaming.h"
  4. #include "eWeaponModel.h"
  5. #include "CModelInfo.h"
  6. #include "CWorld.h"
  7. #include "eVehicleModel.h"
  8. #include "CCarCtrl.h"
  9. #include "CVehicle.h"
  10. #include "CBoat.h"
  11. #include "CAutomobile.h"
  12. #include "CBike.h"
  13. #include "extensions\KeyCheck.h"
  14. #include "CMessages.h"
  15. #include "CTimer.h"
  16. #include "extensions\ScriptCommands.h"
  17. #include "eScriptCommands.h"
  18. #include<thread> // std::thread
  19. #include<chrono> // std::thread
  20. #include<string>
  21. #include<fstream>
  22. #include<queue>
  23. using namespace plugin;
  24.  
  25. using namespace std;
  26. struct pos { double x; double y; double z; };//структура для координат.
  27. queue<double>q = {};// очередь для хранение всех значение координат из файла.
  28. bool readf = false;// начальное положение флага для чтение из файла.
  29. bool off = false;// выключения записи флага
  30. bool isPedInVehicle(CPed * player) { return player->m_bInVehicle && player->m_pVehicle != NULL; }
  31. CVehicle * createcar(int modelID, float distance = 10.f) {// создать авто
  32.         char reference = 2;
  33.         CPed *player = FindPlayerPed();
  34.         CVector position = player->m_placement.pos;
  35.         position += player->m_placement.up * distance; // Вектор оси прямо от игрока умножаем на 10 метров и прибавляем к позиции.
  36.         CStreaming::RequestModel(modelID, 0); // ANGEL 166 ModelID
  37.         CStreaming::LoadAllRequestedModels(false);
  38.         CVehicle * v;
  39.         if (CModelInfo::IsCarModel(modelID))// если создаем авто.
  40.                 v = new CAutomobile(modelID, reference);
  41.         if (CModelInfo::IsBikeModel(modelID))
  42.                 v = new CBike(modelID, reference);
  43.         if (CModelInfo::IsBoatModel(modelID))
  44.                 v = new CBoat(modelID, reference);
  45.         CCarCtrl::JoinCarWithRoadSystem(v);// ии машина в системе.
  46.         v->m_nState = 4;
  47.         v->CVehicle::m_nCreatedBy = reference; // Если один то транспорт будет удален позже...
  48.         v->m_placement.SetRotate(0, 0, 3.5f);
  49.         v->m_placement.pos.x = position.x;
  50.         v->m_placement.pos.y = position.y;
  51.         v->m_placement.pos.z = position.z + v->GetDistanceFromCentreOfMassToBaseOfModel();
  52.         CWorld::Add(v);
  53.         return v;
  54. }
  55.  
  56. void write(CPed *player, string path, bool &off) {
  57.         CVehicle *v = player->m_pVehicle;// получить указатель на хенлд авто
  58.         fstream f; static char cord[256];
  59.         f.open(path, fstream::in | fstream::app | fstream::out);
  60.         if (f.is_open()) {
  61.           while (true) {this_thread::sleep_for(chrono::milliseconds(600));// задержка
  62.                         static string cord = ""; // строка для сравнение
  63.                         char x[256]; snprintf(x, 256, "%.2f %.2f %.2f \n", v->GetPosition().x, v->GetPosition().y, v->GetPosition().z);
  64.                         string cordnenxt = string(x); // массив char в string
  65.                         if (cordnenxt != cord) {        cord = cordnenxt;// сравнить с предыдущей значение
  66.                                         f << cordnenxt; }// записать координаты в файл.
  67.                         if (KeyPressed('N')) {
  68.                                 CMessages::AddMessageJumpQ("Stop rec ", 5000, 3);//выводит сообщение на экран
  69.                                 break;  }
  70.                         }// если кнопка в нажата, выкл запись координат.
  71.         }// записать координаты в файл.
  72.         f.close();      off = false;// выключения записи флага
  73.         return;
  74. };
  75. void getcord(queue<double>&q, pos &cord, string path, bool &readf, bool &oof) {
  76.         off = true; //выкл запись координат.
  77.         static unsigned int time = 0;// обнулить таймер.
  78.         if (CTimer::m_snTimeInMilliseconds - time > 500) {
  79.                 time = 0; // обнулить таймер
  80.                 fstream f1;
  81.                 f1.open(path, fstream::in | fstream::app | fstream::out);
  82.                 double a; // принимает очередь и ассо массив.
  83.                 if (f1.is_open()) {
  84.                         if (readf == false) {// если false нужно прочитать файл.
  85.                                 while (f1 >> a) {
  86.                                         q.push(a); // считываем файл в очередь
  87.                                         readf = true;
  88.                                 }
  89.                         }
  90.                 }//заполнена очередь, уст флаг.
  91.                 if (q.empty()) { readf = false; }// если очередь пуста, уст флаг
  92.                 else {cord.x = q.front(); q.pop();
  93.                         cord.y = q.front(); q.pop();
  94.                         cord.z = q.front(); q.pop();
  95.                 }// добавить в структуру и удалить из очереди.
  96.                 f1.close();  // деструктор, закрывает файл.
  97.         }
  98. };
  99. bool in_point_in_car_in_radius(CVehicle *v, double x1,double y1, double z1,
  100.         double rx = 0, double ry = 0, double rz = 0) {
  101.     double      x = v->GetPosition().x;
  102.     double      y = v->GetPosition().y;
  103.     double      z = v->GetPosition().z;
  104.         rx = abs(rx); ry = abs(ry);     rz = abs(rz);
  105.         if (rx == 0 || ry == 0)
  106.         {if (x == x1 && y == y1) {
  107.                         return true;    }
  108.         else {  double r2 = rx * rx + ry * ry + rz * rz;
  109.                         x -= x1;
  110.                         y -= y1;
  111.                         z -= z1;
  112.         if (x * x + y * y + z * z <= r2)
  113.                 return true;
  114.         else
  115.                 return false;
  116.                 }
  117.         }
  118. };
  119.  
  120. void drive(CVehicle *v, queue<double>&q, pos &pos, string path, bool &readf, bool &oof) {
  121.         v->m_autopilot.m_fMaxTrafficSpeed = 60.0;
  122.         v->m_fTotSpeed = 30.0;
  123.         v->m_autopilot.m_nDrivingStyle = 2;
  124.         static double x, y, z;// эти переменные нужны для сравнение
  125.          getcord(q, pos, path, readf, off);// получить координаты из очереди.
  126.          Command<COMMAND_CAR_GOTO_COORDINATES>(v, pos.x, pos.y, pos.z);
  127.          CMessages::AddMessageJumpQ("my sas", 5000, 3);//выводит сообщение на экран
  128.         while (true) {  this_thread::sleep_for(chrono::milliseconds(600));// задержка
  129.         double x1 = pos.x; double y1 = pos.y; double z1 = pos.z;// записаем координаты в переменные.
  130.         if (!in_point_in_car_in_radius(v, x1, y1, z1, 4.0, 4.0, 0))     return; {// ждем пока машина не будет в радиусе.
  131.                  x = x1; y = y; z = z1;// записываем координаты в стастик переменные.
  132.                  getcord(q, pos, path, readf, off);// получаем новые координаты из очереди.
  133.                  Command<COMMAND_CAR_GOTO_COORDINATES>(v, pos.x, pos.y, pos.z); }
  134.          if (x == x1 && y == y1 && z == z1) {// стастик переменне равны новым из очереди, значить преврать цикл.
  135.                  char s[256];
  136.                  snprintf(s, 256, "x = %.2f;y = %.2f;z = %.2f;", pos.x, pos.y, pos.z);
  137.                 CMessages::AddMessageJumpQ(s, 5000, 3);//выводит сообщение на экран
  138.                  break;}       
  139.          else { continue; }
  140.          }
  141.         v->m_wBombTimer=100;//взорвать авто
  142.         return;
  143. };
  144. class PlayerCoors {public:
  145.         PlayerCoors() { Events::gameProcessEvent += [] {//обработчик событий игры 
  146.                         KeyCheck::Update();
  147.                         pos pos;
  148.                         CPed *player = FindPlayerPed();// найти игрока
  149.                         if (!player) return; {if (KeyCheck::CheckWithDelay('M', 200) && isPedInVehicle(player)) {// проверка найден игрок и за рулем.
  150.                                 CMessages::AddMessageJumpQ("this is gta vc", 5000, 3);//выводит сообщение на экран
  151.                                 thread th(write, player, "cord.txt", std::ref(off)); th.detach();}// независим поток. записать координаты в файл. передаем в новом поток.
  152.                         if (KeyCheck::CheckWithDelay('B', 600) && !isPedInVehicle(player)) { //если м нажата
  153.                                 CVehicle *v = createcar(MODEL_AMBULAN); // Спавним скорую
  154.                                 thread th1(drive, v, q, pos, "cord.txt", std::ref(readf), std::ref(off)); th1.detach();
  155.                             }// независим поток. записать координаты в файл. передаем в новом поток.
  156.                      }
  157.                 };
  158.         }
  159. } playerCoors;
  160.  
  161.  
  162.  
  163.  
Автор: kenking
« : Январь 04, 2019, 01:17:28 pm »

Цитировать
Добавьте еще, пожалуйста, 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;
Автор: egor230
« : Январь 03, 2019, 04:46:25 pm »

 Скажите пожалуйста, как проверить находится ли  авто в заданных координатах c радиусом?
Как пользоваться скриптами командой
    COMMAND_GET_CAR_COORDINATES = 0xAA,
Автор: egor230
« : Декабрь 30, 2018, 06:12:35 pm »

спасибо большое уважаемый kenking очень  ждал вашего ответа, спасибо огромное за подсказку. Добавьте еще, пожалуйста, v->m_pHandling->m_transmissionData.m_fMaxSpeed для vice city его нет. CRadar тоже нет для vc.
Автор: kenking
« : Декабрь 30, 2018, 06:09:13 pm »

Проект обнови, в CAutoPilot я добавил m_nCruiseSpeed. По маркерам - надо разбирать класс CRadar.
Автор: egor230
« : Декабрь 30, 2018, 11:57:27 am »

kenking для  Vice City у m_autoPilot  Нет метода m_nCruiseSpeed   Вот даже видео записал https://www.youtube.com/watch?v=qglTA3su3Tg&feature=youtu.be  Может надо что-то подключить?  Поймите меня правильно я хочу разобраться, чтобы потом помогать разбираться  другим.  Может  этот метод ещё не добавлен.
Автор: kenking
« : Декабрь 29, 2018, 04:25:41 pm »

Я ошибся. Там не m_fEngineInertia, а m_fMaxSpeed. Надо будет в sdk исправить для gta3 и для VC заодно разобрать.
Цитировать
Скажите пожалуйста как создать маркер на машины и удалить его?
Ты же в клео разбираешься? Смотри как устроены соответствующие опкоды в базе. Затем смотри в sdk добавлены ли нужные классы.
 
Автор: egor230
« : Декабрь 29, 2018, 10:46:20 am »

Спасибо большое kenking Но для GTA Vice City  такого метода нет. Он есть для GTA San Andreas.
 А что обозначает m_pHandling->m_transmissionData.m_fEngineInertia?
 Скажите пожалуйста как создать маркер на машины и удалить его?  Интересно  что ждет  в новом обновлении sdk plugin?
Автор: kenking
« : Декабрь 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;
Автор: egor230
« : Декабрь 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); вообще стоит на месте. 
Чем заменить скриптовую команду?
Автор: egor230
« : Декабрь 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.  
Автор: kenking
« : Декабрь 22, 2018, 04:52:47 pm »

Не совсем понимаю твою задумку. Для чего это нужно? Примеры чтения данных из файла здесь ранее показывал DK.
Автор: egor230
« : Декабрь 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
« : Декабрь 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
« : Декабрь 13, 2018, 01:22:45 pm »

Благодарю вас,  что уделяйте мне ваше время уважаемый  kenking.  Мне очень хочется чтобы больше людей писали плагины.  Бывает нелегко разобраться в этом, в книгах Мы изучали  работу с числами и строками, тут немного другое, поэтому сложнее,  но интересно. писал раньше  на cleo, но у с++  гораздо больше возможностей, всё-таки  пишешь плагин всё равно в стиле cleo, по внутренней привычке.  Например, так В функцию CVehicle *v = randomfindcar(player, 20.0);;//передаем указатель на игрока, размер диаметра радиуса через дробное число, возвращаем указатель на найденный автомобиль. Чтобы  машина ехала на определенные координаты, думал, что нужно использовать
    CAutoPilot m_autopilot; но как?  Буду очень вам признателен если вы  подскажите мне.