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

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


Сообщения - egor230

Страницы: 1 ... 3 4 [5] 6 7 ... 13
61
Получилось  реализовать работу с клавишами. Столкнулся с интересным поведением функции.
Код: 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.  

62
Спасибо большое за добрые слова поддержки и понимания, Shagge_E, я недоволен своим прогрессом, этот прогресс нужно было достичь за неделю, я всегда хотел сделать настоящий прорыв в области изучения нового, но на деле происходит долго, тяжело, часто не понятно. Но буду стараться, потому что другого выхода у нас просто нет. Много общался с Виталием, его интересуют совершенно другие вещи, мне нравится очень общаться с Вами, всегда получишь четкий, ясный, правильный ответ, который нужен в данный момент. Я Вам очень признателен за ту помощь в 17 году. Виталий из-за скорости выполнения предпочитает команды ассемблера, я считаю, что это шаг назад, весь мир повышает уровень программирования, делая его простым и лёгким, ну что более легко изучить? Что более понятно обычным людям? Во что, как говорит наша молодежь, в что можно быстрее въехать: в сложный, непонятный ассемблер, или лёгкий и простой питон?
 
Поэтому, я внедряю в sdk lua, ведь функции готовы, только писать большое объём кода на с++ очень тяжело. Большая вероятность ошибки. Да, признаюсь, тяжело постигать sdk, нет документации, но когда это меня останавливало? Только лишь тормозило меня. Но идти медленно это не значит стоять на месте, как многие думают. Очень хочется услышать реальный совет, который поможет в реализации моей идеи.

63
Здравствуйте, уважаемый Shagg_E, очень, очень рад Вашему ответу. Первый раз писал на форуме почти 2 года назад. Многому с того времени научился, и не перестаю узнавать интересное в программировании. Сейчас те вопросы, которые я Вам задавал вначале кажутся глупыми. Изучил основы с++, lua api, и продолжаю совершенствоваться. Мне ещё давно понравился sdk plugin, но я думал, что не смогу с ним справиться. Но после изучения с++, появилось некоторая уверенность. Сейчас я делаю на основе sdk plugin типа moonloader, только для vc, но единственную сложность представляет для меня использование скриптовых команд, поскольку мы не знаем в каком порядке, какие и сколько аргументов передавать, как их получать. С обычными функциями ещё можно разобраться, но с этими очень тяжело без совета знающего человека.
 
Все-таки очень хочу встроить код в lua, пока получилось реализовать 3 функции, конечно, можно добавить ещё функции. Но без wait 0 это теряет всякий смысл. Есть скриптовая команда, просто я не знаю как её использовать, она нужна, чтобы бесконечный цикл не вылетал. Уже удалось реализовать перезагрузку скрипта на лету. На это ушло много часов, но только терпение, упорство и огромное желание приводит нас к результату. Буду очень рад любой помощи.

64
здравствуйте всем. сейчас пытаюсь реализовать 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.  

65
спасибо за Ваш ответ 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.  


66
У меня  к вам такой вопрос,  как сделать  функцию, которая  проверяет нажата ли клавиша? возвращает 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.  

67
Спасибо большой за ответ 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.  

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

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

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

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

72

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

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

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

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

Страницы: 1 ... 3 4 [5] 6 7 ... 13