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

Оффлайн egor230

  • Прохожий
  • *
  • Сообщений: 117
  • Репутация: +4/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #240 : Январь 03, 2019, 04:46:25 pm »
 Скажите пожалуйста, как проверить находится ли  авто в заданных координатах c радиусом?
Как пользоваться скриптами командой
    COMMAND_GET_CAR_COORDINATES = 0xAA,

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 181
  • Репутация: +9/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #241 : Январь 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

  • Прохожий
  • *
  • Сообщений: 117
  • Репутация: +4/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #242 : Январь 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.  
« Последнее редактирование: Январь 05, 2019, 03:21:20 am от egor230 »