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

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


Сообщения - egor230

Страницы: [1] 2 3 ... 8
1
Спасибо большой за ответ 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.  

2
 Скажите пожалуйста, как проверить находится ли  авто в заданных координатах c радиусом?
Как пользоваться скриптами командой
    COMMAND_GET_CAR_COORDINATES = 0xAA,

3
спасибо большое уважаемый kenking очень  ждал вашего ответа, спасибо огромное за подсказку. Добавьте еще, пожалуйста, v->m_pHandling->m_transmissionData.m_fMaxSpeed для vice city его нет. CRadar тоже нет для vc.

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

5
Спасибо большое kenking Но для GTA Vice City  такого метода нет. Он есть для GTA San Andreas.
 А что обозначает m_pHandling->m_transmissionData.m_fEngineInertia?
 Скажите пожалуйста как создать маркер на машины и удалить его?  Интересно  что ждет  в новом обновлении sdk plugin?

6

Поражаюсь насколько 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); вообще стоит на месте. 
Чем заменить скриптовую команду?

7
Не совсем понимаю твою задумку. Для чего это нужно? Примеры чтения данных из файла здесь ранее показывал 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.  

8
Здравствуйте уважаемый 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.  

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

10
 Здравствуйте, уважаемый Дмитрий! Спасибо большое, что несмотря на Вашу огромную загруженность, нашли время мне ответить. Основная прелесть С++ в том, что одну и ту же задачу можно решить множеством способов. Вы предоставили два варианта функций. Подскажите, пожалуйста, как именно их вызывать? Дело в том, что я занимаюсь выкладыванием простых примеров на основе Вашего плагина в группу https://vk.com/gtabuilder. Чтобы расшевелить интерес у аудитории, показать им что это не так сложно, чем кажется. Год назад только от одного слова С++ у меня начинался ступор. Думал: "у меня же нет Нобелевской премии, чтобы в нем разбираться?". Два месяца почитал книги и уже основы понимаю. Думал, будет тяжелее.

 Скажите пожалуйста, как заставить автомобиль ехать на определенные координаты и проверить, находится ли он в этих координатах?

11
Спасибо вам большое уважаемый  kenking  за ваш ответ, выдали мне очень полезные ссылки.  Понимаете когда начинаешь изучать что-то новое всегда возникают трудности. Но я чётко понимаю огромным потенциал  создание плагинов. Конечно путь будет очень тернист,  Но это того стоит.  Одно дело решать задачи из учебников,  совсем другое  столкнуться с реальным проектом, при работе с которым, получаешь колоссальный, бесценный опыт.  Конечно им делишься с другими людьми.
Вот что у меня получилось,  но ищет как-то плохо.  Скажите пожалуйста, Почему поиск работает как-то рандомно? Очень интересно ваше мнение.
Код: C++
  1. #include "plugin.h"
  2. #include "CWorld.h"
  3. #include "extensions\KeyCheck.h"
  4. #include "CMessages.h"
  5.  
  6. #include "CFont.h"
  7.  
  8. #include "CAutomobile.h"
  9. #include "CModelInfo.h"
  10. using namespace plugin;
  11.  
  12. class Message {//имя класса
  13. public:
  14.  Message() {Events::gameProcessEvent += [] {//обработчик событий игры
  15.         KeyCheck::Update();
  16.         if (KeyCheck::CheckWithDelay('M', 200)) {//если м нажата
  17.         CPed *player = FindPlayerPed();// найти игрока
  18.         if (!player) return;// проверка найден игрок
  19.         for (int i = 0; i < CPools::ms_pVehiclePool->m_nSize; i++) {// перебираем путь
  20.          CVehicle *vehicle = CPools::ms_pVehiclePool->GetAt(i);
  21.          if (vehicle != NULL) {// если авто есть
  22.          if (vehicle && (DistanceBetweenPoints(player->GetPosition(), vehicle->GetPosition()) < 5.0f)) {
  23.                 CMessages::AddMessageJumpQ("this is car", 500, 0);//выводит сообщение на экран
  24.          }
  25.         else {  CMessages::AddMessageJumpQ("not found car", 500, 0);
  26.          break;
  27.          }
  28.          }      };
  29.         }
  30.         };
  31.         }
  32. } message;
  33.  
  34.  
https://www.youtube.com/watch?v=6f-KGoP8_Mo&feature=youtu.be
Так лучше работает
Код: C++
  1.  
  2. class Message {//имя класса
  3. public:
  4.  Message() {Events::gameProcessEvent += [] {//обработчик событий игры
  5.         KeyCheck::Update();
  6.         if (KeyCheck::CheckWithDelay('M', 200)) {//если м нажата
  7.         CPed *player = FindPlayerPed();// найти игрока
  8.         if (!player) return;// проверка найден игрок
  9.         for (int i = 0; i < CPools::ms_pVehiclePool->m_nSize; i++) {// перебираем путь
  10.          CVehicle *vehicle = CPools::ms_pVehiclePool->GetAt(i);
  11.          if (vehicle != NULL ) {// если авто есть
  12.          if (vehicle && (DistanceBetweenPoints(player->GetPosition(), vehicle->GetPosition()) < 20.0f) && vehicle->m_fHealth > 50) {
  13.                 CMessages::AddMessageJumpQ("this is car", 1000, 0);//выводит сообщение на экран
  14.                 vehicle->m_wBombTimer = 160;// взрыв по таймеру
  15.                 break;      
  16.          }
  17.         else {  CMessages::AddMessageJumpQ("not found car", 1000, 0);
  18.          }
  19.          }      };
  20.         }
  21.         };
  22.         }
  23. } message;
  24.  
  25.  

https://www.youtube.com/watch?v=1Y6XSOLO_Vk&feature=youtu.be

все заработало как надо.
Код: C++
  1. void randomfindcar(CPed *p, float r) {
  2.  for (int i = 0; i < CPools::ms_pVehiclePool->m_nSize; i++) {// перебираем путь
  3.                 CVehicle *v = CPools::ms_pVehiclePool->GetAt(i);// если авто есть
  4.                 if (v != NULL && v && DistanceBetweenPoints(p->GetPosition(), v->GetPosition()) < r && v->m_fHealth > 50) {
  5.                                 CMessages::AddMessageJumpQ("this is car", 1000, 0);//выводит сообщение на экран
  6.                                 v->m_wBombTimer = 160;// взрыв по таймеру
  7.                         break;}
  8.                 else {  CMessages::AddMessageJumpQ("not found car", 1000, 0);}
  9.  }
  10. };
  11.  
  12.  
  13. class Message {//имя класса
  14. public:
  15.  Message() {Events::gameProcessEvent += [] {//обработчик событий игры
  16.         KeyCheck::Update();
  17.         if (KeyCheck::CheckWithDelay('M', 200)) {//если м нажата
  18.         CPed *player = FindPlayerPed();// найти игрока
  19.         if (!player) return;// проверка найден игрок
  20.         randomfindcar(player, 20.0);}
  21.         };
  22.         }
  23. } message;
  24.  
  25.  

12
Спасибо большое за ваш ответ уважаемый kenking. Но новички  часто усложняю простые вещи.  Думаю всё приходит с опытом,  чем больше пишешь, тем лучше получается. Возможно через год буду сам в шоке от своего кода, просто нужно время и практика. Скажите пожалуйста вы используете KeyCheck  чем он отличается  от KeyPressed('M')?.  С ним часто возникают проблемы.  Хочется проверять клавиши  так нажал  и только когда отпустишь она вернула true, Чтобы избежать повторного нажатия и клавиша будет нажата только  1 раз.  Допустим при нажатии клавиши  даётся игроку  500$  я немного  дольше подержал  и бах у меня 5 миллионов. Это настоящая проблема.
Спасибо большое за вас Благодарю вас что ответили на  на вопрос,   буду разбирать в этом. Думал что есть  аналог опкода 05F0: 3@ = random_vehicle_near_point 0@ 1@ 2@ in_radius 10.0 find_next 1 pass_wrecked 0 //IF and SET
А тут всё по-другому.
Странно, но игра вылетает, если приближаюсь к любому авто.

13
Спасибо большое вам за ответ уважаемый kenking. Просто разбирался в sdk, как там все устроено. Вот какой плагин получится
Код: C++
  1. #include "plugin_vc.h"
  2. #include "common.h"
  3. #include "CMessages.h"
  4. #include "CWorld.h"
  5.  
  6. using namespace plugin;
  7.  
  8. bool isPedInVehicle(CPed * player) {
  9.         return player->m_bInVehicle && player->m_pVehicle != NULL;
  10. }
  11. class incar {//имя класса
  12. public:
  13.         incar() {      
  14.               Events::gameProcessEvent += [] {////обработчик событий игры
  15.                    CPed *player = FindPlayerPed();// найти игрока
  16.                    if (!player) return;//проверка найден игрок найти игрока
  17.                    if (KeyPressed('M')) {//если м нажата
  18.                            if (isPedInVehicle(player)) {// в авто игрок?
  19.                                    CVehicle *p = player->m_pVehicle;// получить указатель на хенлд авто
  20.                                    p->m_fHealth = 1000;// здоровье авто  
  21.                                    p->m_nPrimaryColor = 0;// уст 1 цвет авто.
  22.                                    p->m_nSecondaryColor = 0;// 2 цвет авто.
  23.                                    CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 5000;// дать денег
  24.                                    
  25.                                    static char x[256];
  26.                                    snprintf(x, 256, "x = %.2f;y = %.2f;z = %.2f;", p->GetPosition().x, p->GetPosition().y, p->GetPosition().z);
  27.                                    CMessages::AddMessageJumpQ(x, 3000, 0);// сообщение на экран
  28.                            }
  29.                            else { CMessages::AddMessageJumpQ("No in vehicle seet!", 3000, 0); }
  30.            }    };
  31.        
  32. }
  33. } incars;
  34.  

Хотел у вас спросить.
Как найти случайную машину?
Как заставить машину ехать в определенные координаты?
Как проверить находится ли машина в заданных координатах?


все это нужно для будущего плагина для воспроизведения маршрута движения




14
Здравствуйте уважаемые люди. все  думал как решить эту проблему?  Нашел, конечно громоздкое решение.
Может кому поможет.
Код: C++
  1. #include<string>
  2. #include "plugin_vc.h"
  3. #include "common.h"
  4. #include "CStreaming.h"// загрузка моделей.
  5. #include "eWeaponModel.h" // имя моделей имя.
  6. #include "eWeaponType.h"// тип моделей оружие.
  7.  
  8. using namespace std;
  9.  
  10. using namespace plugin;
  11. void weapongive(CPed *player, string name, int ammo) {
  12.         if (name == "TEC9") {
  13.                 CStreaming::RequestModel(MODEL_TEC9, 0);// загрузить модель оружие
  14.                 CStreaming::LoadAllRequestedModels(false);// Ставить модель в очередь
  15.                 player->GiveWeapon(WEAPONTYPE_TEC9, ammo, true);// дает оружие
  16.                 player->SetCurrentWeapon(WEAPONTYPE_TEC9);// устанавливает его в руке.
  17.                 CStreaming::SetModelIsDeletable(MODEL_TEC9);// удаляет модель
  18. }       if (name == "UZI") {//модели оружия смотрите eWeaponModel.h
  19.                 CStreaming::RequestModel(MODEL_UZI, 0);// загрузить модель оружие
  20.                 CStreaming::LoadAllRequestedModels(false);
  21.                 player->GiveWeapon(WEAPONTYPE_UZI, ammo, true);
  22.                 player->SetCurrentWeapon(WEAPONTYPE_UZI);
  23.                 CStreaming::SetModelIsDeletable(MODEL_UZI);// модели оружия смотрите eWeaponModel.h
  24.         }
  25. }
  26.  
  27.  
  28. class weapon {
  29. public:
  30. weapon() {      Events::drawingEvent += [] {
  31.         if (KeyPressed('M')) {
  32.                 CPed *player = FindPlayerPed();
  33.                 if (!player) return;// находим игрока
  34.                 weapongive(player,"UZI", 10);//передаем указатель на игрока, имя оружие и кол-во патронов
  35.                 }
  36.         };
  37.         }
  38. } weapons;
  39.  

Скажите пожалуйста, В каком файле посмотреть функция проверок, мне необходимо проверка  игрок в машине?  Как дать денег игроку?
Броню и здоровые мы даём  вот так
   player->m_fHealth = 150;//здоровье
   player->m_fArmour = 200;// броня






15
Здравствуйте всем. Немного стал  понимать plugin sdk от DK для Vice City.  Поучилось дать игроку оружие. Хочу немного упростить,  сделать функцию , которая  принимает имя оружие , количество патронов. Но к сожалению не получается, подскажите пожалуйста как решить эту проблему, конечно Я понимаю,  что в меня полетят палки, Но  чем больше людей будет уметь писать плагины, Чем лучше.

Код: C++
  1. #include <string>
  2. #include "plugin.h"
  3. #include "common.h"
  4. #include "CStreaming.h"
  5. #include "eWeaponModel.h"
  6. #include "CMessages.h"
  7.  
  8. using namespace plugin;
  9. void givweap(CPed *player, std::string model, int ammo) {
  10.         std::string mane = "MODEL_" + model;
  11.         std::string type = "WEAPONTYPE_" + model;
  12.         CStreaming::RequestModel(mane, 0);// загрузить модель оружие
  13.         CStreaming::LoadAllRequestedModels(false);
  14.         player->GiveWeapon(type, ammo, true);
  15.         player->SetCurrentWeapon(type);
  16.         CStreaming::SetModelIsDeletable(name);// модели оружия смотрите eWeaponModel.h
  17.  
  18. };
  19. class weapon {
  20. public:
  21.         bool m_bPressed;
  22.         weapon() {
  23.                 static bool bPressedM = false;
  24.                 Events::gameProcessEvent += [] {
  25.                         if ((KeyPressed('M')) && (!bPressedM)) {
  26.                                 bPressedM = true;
  27.                                 CPed *player = FindPlayerPed();
  28.                                 if (!player) return;
  29.                                 givweap(player,"TEC9",12);// функция дать оружие и патроны
  30.                 }
  31.                         // Если отпустили.
  32.                         if (!KeyPressed('M')) bPressedM = false;
  33.  
  34.                 };
  35.  
  36.         }
  37.  
  38. } giveweapon;
  39.  

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