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

Оффлайн egor230

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

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-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

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-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 »

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #243 : Январь 26, 2019, 06:49:30 pm »
У меня  к вам такой вопрос,  как сделать  функцию, которая  проверяет нажата ли клавиша? возвращает true, только когда  эта клавиша  отпущена?  Пока приходится пользоваться такой конструкцией.
Код: C++
  1.        
  2. bool wait(const char k []) {
  3.         unsigned int key = (unsigned int)k;
  4.         if (!KeyCheck::CheckWithDelay(key, 200)) { return true; }
  5.         else { return false; }
  6. }      
  7. KeyCheck::Update();
  8. if (KeyCheck::CheckWithDelay('M', 200)) {//если м нажата
  9. if (wait("M")) return; {//если м нажата
  10.  
Хочется чтобы  чтобы была функция, которая выполняет действия После нажатия и опусканием, а не только при нажатии и задержки.
 Хочу прикрутить lua к sdk, как лучше это сделать?
  Пока Вот так получилось.
Код: C++
  1. #include "common.h"
  2. #include "plugin.h"
  3. #include "CWorld.h"
  4. #include "extensions\KeyCheck.h"
  5. #include "CMessages.h"
  6. #include"include/lua.hpp"
  7. using namespace plugin;
  8. using namespace std;
  9. bool wait(const char k []) {
  10.         unsigned int key = (unsigned int)k;
  11.         if (!KeyCheck::CheckWithDelay(key, 200)) { return true; }
  12.         else { return false; }
  13. }
  14. class Message {//имя класса
  15. public: Message() {     Events::gameProcessEvent += [] {//обработчик событий игры
  16.                 CPed *player = FindPlayerPed();// найти игрока
  17.                 if (!player) return;// проверка найден игрок
  18.                 KeyCheck::Update();
  19.                 if (KeyCheck::CheckWithDelay('M', 200)) {//если м нажата
  20.                 if (wait("M")) return; {//если м нажата
  21.                         lua_State *L = luaL_newstate();
  22.                         luaL_dofile(L, "lualoader\\main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
  23.                         lua_getglobal(L, "money");// получить значение глобальной переменной x.
  24.                         int money = lua_tonumber(L, 1);
  25.                         lua_close(L);// закрыть состояние
  26.                 CWorld::Players[CWorld::PlayerInFocus].m_nMoney += money;// дать денег
  27.                 }
  28.                 }};
  29. }
  30. } message;
  31.  
  32.  

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #244 : Январь 27, 2019, 08:21:49 am »
Цитировать
как сделать  функцию, которая  проверяет нажата ли клавиша? возвращает true, только когда  эта клавиша  отпущена?
class KeyCheck http://forum.gtabuilder.ru/index.php?topic=337.msg2356#msg2356

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #245 : Февраль 04, 2019, 10:14:18 am »
спасибо за Ваш ответ kenking.
все-таки хочу встроить lua plugin. с api lua получалось, оно слишком сложно в реализации.

остановил свой выбор на luabridge, изучил основы.

Не получается прикрутить lua к sdk plugin vice.

При добавлении  новых функций, возникает ошибка  C3861   getGlobalNamespace: идентификатор не найден   plugin   d:\games\gta vice city\plugin\plugin.cpp

Скажите пожалуйста как эту проблему решить?

Код: C++
  1.  
  2. #include "include/lua.hpp"
  3. #include"LuaBridge/LuaBridge.h"
  4. #include "common.h"
  5. #include "plugin.h"
  6. #include "CWorld.h"
  7. #include "extensions\KeyCheck.h"
  8. #include "CMessages.h"
  9. using namespace plugin;
  10. using namespace std;
  11. bool wait(const char k []) {
  12.         unsigned int key = (unsigned int)k;
  13.         if (!KeyCheck::CheckWithDelay(key, 200)) { return true; }
  14.         else { return false; }
  15. }
  16. void foo() {
  17.         CMessages::AddMessageJumpQ("ok lua", 1000, 0);//выводит сообщение на экран
  18.  
  19. }
  20.  
  21. class Message {//имя класса
  22. public: Message() {     Events::gameProcessEvent += [] {//обработчик событий игры
  23.                 CPed *player = FindPlayerPed();// найти игрока
  24.                 if (!player) return;// проверка найден игрок
  25.                 KeyCheck::Update();
  26.                 if (KeyCheck::CheckWithDelay('M', 200)) {//если м нажата
  27.                 if (wait("M")) return; {//если м нажата
  28.                 lua_State* L = luaL_newstate();
  29.                 luaL_openlibs(L);
  30.                 .getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
  31.                 .addFunction("foo", foo)// название функции в lua и c++.
  32.                 .endNamespace();
  33.                         luaL_dofile(L, "lualoader\\main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
  34.  
  35.                         lua_close(L);// закрыть состояние
  36.                 }
  37.                 }};
  38. }
  39. } message;
  40.  


все прикрутил две функции к lua.

Код: C++
  1. #include "include/lua.hpp"
  2. #include"LuaBridge/LuaBridge.h"
  3. #include "common.h"
  4. #include "plugin.h"
  5. #include "CWorld.h"
  6. #include "extensions\KeyCheck.h"
  7. #include "CMessages.h"
  8. using namespace plugin;
  9. using namespace std;
  10. using namespace luabridge;
  11. bool wait(const char k[]) {
  12.         unsigned int key = (unsigned int)k;
  13.         if (!KeyCheck::CheckWithDelay(key, 200)) { return true; }
  14.         else { return false; }
  15. }
  16. CPed *findplayer(lua_State* L)  {
  17.         CPed *player = FindPlayerPed();// получить указатель на игрока.
  18.         CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 500;// дать денег
  19.         return player;// вернуть указатель на игрока.
  20. };
  21.  
  22. void sethealth(CPed *player, int health, lua_State* L) {
  23.         CPed *b = (CPed*)Userdata::get<CPed>(L, 1, false);
  24.         b->m_fHealth =  health;// уст здоровье игрока.
  25. };
  26. class Message {//имя класса
  27. public: Message() {     Events::gameProcessEvent += [] {//обработчик событий игры
  28.         CPed *player = FindPlayerPed();// найти игрока
  29.         if (!player) return;// проверка найден игрок
  30.         KeyCheck::Update();
  31.         if (KeyCheck::CheckWithDelay('M', 200)) {//если м нажата
  32.         if (!wait("M")) return; {//если м отпущена.
  33.                 lua_State* L = luaL_newstate();
  34.                 luaL_openlibs(L);
  35.                 getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
  36.                 .beginClass<CPed>("cped")// имя класса в lua.
  37.                 .endClass()// закрыть регистрацию класса.
  38.                 .addFunction("findplayer", &findplayer)// возвращает указатель игрока.
  39.                 .addFunction("sethealth", &sethealth);// название функции в lua и c++.// название функции в lua и c++.
  40.                 luaL_dofile(L, "lualoader\\main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
  41.                 lua_close(L);// закрыть состояние
  42. }}};}
  43. } message;
  44.  
  45.  

« Последнее редактирование: Февраль 05, 2019, 04:35:39 am от egor230 »

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #246 : Февраль 07, 2019, 04:27:37 am »
здравствуйте всем. сейчас пытаюсь реализовать lua встроить в sdk plugin. Скажите, пожалуйста, как реализовать функцию wait, чтобы бесконечный цикл на lua не вылетал? как можно лучше реализовать перезагрузку скрипта(открыть и закрыть lua состояния)?

Код: C++
  1. #include<fstream>
  2. #include "include/lua.hpp"
  3. #include"LuaBridge/LuaBridge.h"
  4. #include "common.h"
  5. #include "plugin.h"
  6. #include "CWorld.h"
  7. #include "extensions\KeyCheck.h"
  8. #include "CMessages.h"
  9.  
  10. using namespace plugin;
  11. using namespace std;
  12. using namespace luabridge;
  13.  
  14. void writelog(const char x[]) {
  15.         string path = "lualoader\\log.txt";
  16.         fstream f1; {f1.open(path, fstream::in | fstream::out | fstream::app);
  17.         f1 << x << "\n"; }
  18.         f1.close();
  19. };
  20.  
  21. bool wait(const char k[]) {
  22.         unsigned int key = (unsigned int)k;
  23.         if (!KeyCheck::CheckWithDelay(key, 200)) { return true; }
  24.         else { return false; }
  25. }
  26. CPed *findplayer(lua_State* L)  {
  27.         CPed *player = FindPlayerPed();// получить указатель на игрока.
  28.         return player;// вернуть указатель на игрока.
  29. };
  30.  
  31. int gethealth(lua_State* L) {
  32.         try {
  33.                 if (LUA_TUSERDATA == lua_type(L, -1)) {// указатель на игрока.
  34.                         CPed *b = (CPed*)Userdata::get<CPed>(L, 1, false);// получить указатель на игрока.
  35.                         int health = b->m_fHealth; // получить кол-во здоровья игрока.
  36.                         lua_pushnumber(L, health);// отправить в стек.   
  37.                         return 1;
  38.                 }
  39.                 else { throw "bad argument in function gethealth option of the player"; }
  40.         }
  41.         catch (const char* x) {
  42.                 writelog(x);
  43.                 return 0;
  44.         }
  45.         return 0;
  46. };
  47.  
  48. int sethealth(lua_State* L) {
  49.         try {if ( LUA_TUSERDATA == lua_type(L, -2) ) {// указатель на игрока.
  50.                 double x = lua_tonumber(L, -1);// если число.
  51.                 int health = (int)x;
  52.                 if (x == health && LUA_TNUMBER == lua_type(L, -1)) {
  53.                         CPed *b = (CPed*)Userdata::get<CPed>(L, 1, false);// получить указатель на игрока.
  54.                         b->m_fHealth = health;}// уст здоровье игрока.
  55.                 else { throw "bad argument in function sethealth option health"; }
  56.                 }
  57.                 else { throw "bad argument in function sethealth option of the player"; }
  58.         }catch (const char* x) {
  59.                 writelog(x);    }
  60. return 0;};
  61.  
  62. void man(lua_State* L) {
  63.         luaL_openlibs(L);
  64.         getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
  65.                 .beginClass<CPed>("cped")// имя класса в lua.
  66.                 .endClass()// закрыть регистрацию класса.
  67.                 .addFunction("findplayer", &findplayer)// возвращает указатель игрока.
  68.                 .addCFunction("gethealth", &gethealth)// название функции в lua и c++. уст здоровье.
  69.                 .addCFunction("sethealth", &sethealth);// название функции в lua и c++. получить здоровье.
  70.                 luaL_dofile(L, "lualoader\\main.lua"); // Загружает и запускает заданный файл. файл в которым все происходит.  
  71. };
  72. bool reload = false;
  73. class Message {//имя класса
  74. public: Message() {     Events::gameProcessEvent += [] {//обработчик событий игры
  75.         CPed *player = FindPlayerPed();// найти игрока
  76.         if (!player) return;// проверка найден игрок
  77.         lua_State* L = luaL_newstate();
  78.         if (reload == false){ reload = true;
  79.         man(L);}
  80.      if (KeyPressed(VK_CONTROL)&& reload == true) {// перезагрузка скрипта
  81.                 reload = false;
  82.                 lua_close(L); // закрыть состояние
  83.                 }
  84. };};
  85. }message;
  86.  

lua
Код: C++
  1. while true do
  2. wait() -- миллисекунды в скобках
  3. player= findplayer()-- получить игрока
  4. x = gethealth(player)-- получить здоровье игрока.
  5.  
  6.  if x<100 then
  7.  sethealth(player, 150) -- 150 хп.
  8.  end
  9. end
  10.  

может так реализовать wait 0??

Код: Text
  1.  
  2. int wait(lua_State* L) {
  3.  
  4.         Command<COMMAND_WAIT>(100);
  5.         return 0;
  6. };
  7.  
« Последнее редактирование: Февраль 07, 2019, 05:22:41 am от egor230 »

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Написание плагина. Настройка проекта
« Ответ #247 : Февраль 07, 2019, 11:28:06 am »
как реализовать функцию wait
Нужно делать таймер и проверять каждый цикл, прошло ли нужное количество времени.
Притом в идеале нужно синхронизироваться не с реальным временем Windows, а с внутриигровым таймером:
Код: C++
  1. INT 0x974B2C(InGame Timer in ms)

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #248 : Февраль 07, 2019, 06:37:03 pm »
Здравствуйте, уважаемый Shagg_E, очень, очень рад Вашему ответу. Первый раз писал на форуме почти 2 года назад. Многому с того времени научился, и не перестаю узнавать интересное в программировании. Сейчас те вопросы, которые я Вам задавал вначале кажутся глупыми. Изучил основы с++, lua api, и продолжаю совершенствоваться. Мне ещё давно понравился sdk plugin, но я думал, что не смогу с ним справиться. Но после изучения с++, появилось некоторая уверенность. Сейчас я делаю на основе sdk plugin типа moonloader, только для vc, но единственную сложность представляет для меня использование скриптовых команд, поскольку мы не знаем в каком порядке, какие и сколько аргументов передавать, как их получать. С обычными функциями ещё можно разобраться, но с этими очень тяжело без совета знающего человека.
 
Все-таки очень хочу встроить код в lua, пока получилось реализовать 3 функции, конечно, можно добавить ещё функции. Но без wait 0 это теряет всякий смысл. Есть скриптовая команда, просто я не знаю как её использовать, она нужна, чтобы бесконечный цикл не вылетал. Уже удалось реализовать перезагрузку скрипта на лету. На это ушло много часов, но только терпение, упорство и огромное желание приводит нас к результату. Буду очень рад любой помощи.

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Написание плагина. Настройка проекта
« Ответ #249 : Февраль 07, 2019, 08:19:58 pm »
egor230> Твои успехи вдохновляют: за полтора года научился стольким вещам. Удачи в дальнейшем!
Насчет lua - спроси у Sektor, он же запилил Vice Lua, он по-любому сталкивался со всеми этими проблемами. А может, и вовсе имеет смысл не изобретать велосипед, а продолжить его разработку?..

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #250 : Февраль 08, 2019, 10:01:29 am »
Спасибо большое за добрые слова поддержки и понимания, Shagge_E, я недоволен своим прогрессом, этот прогресс нужно было достичь за неделю, я всегда хотел сделать настоящий прорыв в области изучения нового, но на деле происходит долго, тяжело, часто не понятно. Но буду стараться, потому что другого выхода у нас просто нет. Много общался с Виталием, его интересуют совершенно другие вещи, мне нравится очень общаться с Вами, всегда получишь четкий, ясный, правильный ответ, который нужен в данный момент. Я Вам очень признателен за ту помощь в 17 году. Виталий из-за скорости выполнения предпочитает команды ассемблера, я считаю, что это шаг назад, весь мир повышает уровень программирования, делая его простым и лёгким, ну что более легко изучить? Что более понятно обычным людям? Во что, как говорит наша молодежь, в что можно быстрее въехать: в сложный, непонятный ассемблер, или лёгкий и простой питон?
 
Поэтому, я внедряю в sdk lua, ведь функции готовы, только писать большое объём кода на с++ очень тяжело. Большая вероятность ошибки. Да, признаюсь, тяжело постигать sdk, нет документации, но когда это меня останавливало? Только лишь тормозило меня. Но идти медленно это не значит стоять на месте, как многие думают. Очень хочется услышать реальный совет, который поможет в реализации моей идеи.
« Последнее редактирование: Февраль 08, 2019, 12:42:51 pm от egor230 »

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #251 : Февраль 17, 2019, 09:00:23 am »
Получилось  реализовать работу с клавишами. Столкнулся с интересным поведением функции.
Код: Text
  1. int printmessage(lua_State* L) {
  2.         try {
  3.                 if (LUA_TSTRING == lua_type(L, -1)) {//money.
  4.                 string msg = lua_tostring(L, -1);
  5.                 char str[255];
  6.                 strcpy(str, msg.c_str());
  7.  
  8.                         static char x[255];
  9.                         snprintf(x, 255,"%s", str);
  10.                         CMessages::AddMessageJumpQ(x, 5000, 3);
  11.                         return 0;
  12.                 }
  13.                 else { throw "bad argument in function printmessage"; }
  14.         }
  15.         catch (const char* x) {
  16.                 writelog(x);
  17.         }
  18.         return 0;
  19. };
  20.  
  21.  

Иногда она некорректно выводит сообщения,   А когда вообще ничего мы не видим  никакого текст на экране.
Как вы думаете с чем связанное такое поведение? Может я как-то не так делаю?

Оказалось нужно строку перевести в wchar_t.

Код: C++
  1. int printmessage(lua_State* L) {// аргументы текст и и время вывода на экран.
  2.         try {
  3.                 if (LUA_TSTRING == lua_type(L, -2) && LUA_TNUMBER == lua_type(L, -1)) {//строка.
  4.                         string aString = lua_tostring(L, -2);
  5.                         double t = lua_tonumber(L, -1);// если число.
  6.                         int time = (int)t;
  7.                         const int maxSize = 1024; // 1Мб символов
  8.                         wchar_t *str = L"_";
  9.                         wchar_t buff[maxSize];
  10.                         int nSize = ::MultiByteToWideChar(CP_UTF8, 0, aString.c_str(), static_cast<int>(aString.length() + 1), NULL, NULL);
  11.                         wchar_t *tBuff = buff;
  12.                         ::MultiByteToWideChar(CP_UTF8, 0, aString.c_str(), static_cast<int>(aString.length() + 1), buff, nSize);
  13.                         str = tBuff;
  14.                         CMessages::AddMessageJumpQ(str, time, 3);
  15.                         this_thread::sleep_for(chrono::milliseconds(time));
  16.                         return 0;
  17.                 }
  18.                 else { throw "bad argument in function printmessage"; }
  19.         }
  20.         catch (const char* x) {
  21.                 writelog(x);// записать ошибку в файл.
  22.         }
  23.         return 0;
  24.  
  25.  
« Последнее редактирование: Февраль 19, 2019, 01:40:54 am от egor230 »

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #252 : Март 09, 2019, 04:56:01 pm »
... в CCarCtrl::JoinCarWithRoadSystemGotoCoors ошибочный лишний третий параметр.
Оказывается там всё верно, сорри.

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #253 : Март 10, 2019, 02:37:37 pm »
Помогите,  пожалуйста,  нужно найти  не только всех педов, которые которые находятся в радиусе,  но и тех кто сидит за рулём.
 Может так находим авто, как проверить есть ли  в нём водителей? И получить указатель  на его?

Код: Text
  1.  
  2. void randomfindcar(CPed *p, float radius) {
  3.         CVehicle*  v = isPedInVehicle(p);// авто игрока.
  4.                 for (auto car : CPools::ms_pVehiclePool) {
  5.                         if (car != v && DistanceBetweenPoints(car->GetPosition(), p->GetPosition()) < radius && car->m_fHealth > 50)
  6.                           car->???????
  7.         }
  8.                 for (auto ped : CPools::ms_pPedPool) {
  9.                         if (ped != p && DistanceBetweenPoints(ped->GetPosition(), p->GetPosition()) < radius && ped->m_fHealth > 50)
  10.                                 ped->m_fHealth = 0;
  11.  
  12.                 }
  13. };
  14.  

вроде так, но водитель не выходит.
Код: Text
  1. CVehicle* isPedInVehicle(CPed * player) {
  2.         if (player->m_bInVehicle && player->m_pVehicle != NULL) {// в авто игрок?
  3.                 CVehicle *v = player->m_pVehicle;
  4.                 return v;}// получить указатель на хенлд авто в котором сидит томии.
  5.         else {
  6.                 CVehicle *v = NULL;
  7.                 return v;}//если томми не в авто вернуть null;
  8. }
  9. void randomfindcar(CPed *p, float radius) {
  10.         CVehicle*  v = isPedInVehicle(p);// авто игрока.             
  11.         for (auto car : CPools::ms_pVehiclePool) {
  12.                         if (car != v && DistanceBetweenPoints(car->GetPosition(), p->GetPosition()) < radius && car->m_fHealth > 50) {
  13.                
  14.                                 if (CPed*p =car->m_pDriver) {
  15.                                        
  16.                                         if (p != NULL) {
  17.                                                 p->ExitCar();
  18.                                         CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 1;// дать денег
  19.                                         }
  20.                         }
  21.                 }
  22.         }
  23.  
« Последнее редактирование: Март 10, 2019, 05:56:13 pm от egor230 »

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #254 : Март 12, 2019, 07:26:25 am »
Код: C++
  1. #include "plugin.h"
  2. #include "CPed.h"
  3.  
  4. using namespace plugin;
  5.  
  6. class Test {
  7. public:
  8.     Test() {
  9.         Events::gameProcessEvent += [] {
  10.             CPed *player = FindPlayerPed();
  11.             if (player) {
  12.                 for (auto car : CPools::ms_pVehiclePool) {
  13.                     if (DistanceBetweenPoints(car->GetPosition(), player->GetPosition()) < 20.0f && car->m_nVehicleClass == VEHICLE_AUTOMOBILE && car->m_fHealth > 50.0f) {
  14.                         if (car->m_pDriver && car->m_pDriver != player)
  15.                             car->m_pDriver->SetExitCar(car, 15);
  16.                     }
  17.                 }
  18.             }
  19.         };
  20.     }
  21. } test;