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

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 233
  • Репутация: +323/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #210 : Ноябрь 24, 2018, 01:12:18 am »
Для клавиш с буквами алфавита можно использовать символ буквы (заглавной).
Например:
Код: C++
  1. if (KeyPressed('M'))
Для других клавиш есть константы VK_*, например:
VK_TAB - Tab
VK_CONTROL - Ctrl
VK_MENU - Alt
Весь список можно посмотреть здесь.

Код: C++
  1. class msg {
  2. ...
  3. } msg;
У тебя название класса и переменной одинаковые. Так лучше не делать. Если ты создаешь плагин через Мастер создания проекта, и даешь ему название msg, то мастер назовёт переменную как _msg.

как можно получить координаты игрока?
Есть статическая функция FindPlayerCoors. В Vice City она не принимает никаких входных параметров и возвращает позицию игрока. Перед её вызовом надо проверять, что игрок существует.

Также, у класса CEntity есть метод GetPosition. Этот метод доступен для всех классов, которые наследуют CEntity - т.е. CPed, CVehicle, CObject и другие.

Метод TransformFromObjectSpace можно применять для получения координат со смещением от центра обьекта. Но этот метод ещё не добавлен в версию для Vice City. В качестве замены - для получения координат со смещением можно умножить матрицу игрока на вектор с координатами смещения.

В функцию AddMessageJumpQ надо передавать указатель на C-строку (массив из char или wchar_t). Если хочешь вывести координаты - надо их отформатировать в строку (для этого есть функции plugin::FormatStatic (для получения C-строки) и plugin::Format (для получения std-строки)).

Код: C++
  1. #include "plugin.h"
  2.  
  3. using namespace plugin;
  4.  
  5. class PlayerCoors {
  6. public:
  7.     PlayerCoors() {
  8.         Events::drawingEvent += [] {
  9.             CPed *player = FindPlayerPed();
  10.             if (player) {
  11.                 CVector coors = player->m_placement * CVector(0.0f, 5.0f, 0.0f);
  12.                 gamefont::PrintAt3d(coors, Format("%.2f %.2f %.2f", coors.x, coors.y, coors.z),
  13.                     0, 0, FONT_DEFAULT, 2, 2, color::Pink, true, gamefont::AlignCenter);
  14.             }
  15.         };
  16.     }
  17. } playerCoors;
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн egor230

  • Прохожий
  • *
  • Сообщений: 109
  • Репутация: +3/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #211 : Ноябрь 24, 2018, 08:39:14 pm »
Здравствуйте уважаемый Дмитрий. Большое вам спасибо за ваше подробное объяснение очень вам признателен. Поймите меня правильно,  одно дело учить с++  по книгам, решая  простенькие задачи, как  создать функцию которая принимает целые и дробные числа. И столкнуться с реальным применение знаний на практике. moonloder было бывает легче,  там были  аналоги опкодов, которые являются простыми функциями, тут всё несколько сложнее,  но гораздо интереснее.  Больше возможности для фантазии. Когда кто-то даёт тебе совет, проблема решается быстрее. Благодарю вас за подсказку по поводу клавиш. Пришло в голову использовать emun.

Редко встретишь такого внимательного человека, вот что значит опыт! Буду называть класс и переменную разными  именам, чтобы не было ошибки.

Функция FindPlayerCoors возвращает координаты игрока в виде объекта класса,  если FindPlayerPed  вернула true, то есть игрок найден.

Сейчас наверно,вы будете смеяться над моей тупостью. я попробовал подключить библиотеку string не получается.
Потом пытался получить координаты так string x,y,z=FindPlayerCoors(); понимаю насколько это глупо. Потом хотел их преобразовать .
Код: Text
  1. string x,y,z=FindPlayerCoors();
  2. string coord = plugin::FormatStatic("%.2f %.2f %.2f", x, y, z)
  3. CMessages::AddMessageJumpQ(coord, 1000, 0);
  4.  

 Затем решил  преобразовать  координаты  Матрицы  игрока в строку через массив char.  Поскольку возвращает  объекты класса.
Код: Text
  1. CVector coors = player->m_placement * CVector(0.0f, 5.0f, 0.0f);
  2. Format("%.2f %.2f %.2f", coors.x, coors.y, coors.z);
  3. char a[] = coors.x;
  4. CMessages::AddMessageJumpQ(a, 1000, 0);
  5.  

Понимаете Уважаемый Дмитрий, хочу вывести  координаты  игрока  через функцию CMessages::AddMessageJumpQ();
 Зачем  вообще  хочу разобраться в этом? Cleo не дает воплотить свои идеи в жизнь из-за своей ограниченности.
« Последнее редактирование: Ноябрь 24, 2018, 09:15:21 pm от egor230 »

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 172
  • Репутация: +9/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #212 : Ноябрь 24, 2018, 09:13:46 pm »
Код: C++
  1. #include "plugin.h"
  2. #include "extensions\KeyCheck.h"
  3. #include "CMessages.h"
  4.  
  5. using namespace plugin;
  6.  
  7. class PlayerCoors {
  8. public:
  9.     PlayerCoors() {
  10.         Events::drawingEvent += [] {
  11.             CPed *player = FindPlayerPed();
  12.             KeyCheck::Update();
  13.             if (KeyCheck::CheckWithDelay('M', 200) && player) {
  14.                 static char message[256];
  15.                 snprintf(message, 256, "x = %.2f; y = %.2f; z = %.2f;", player->GetPosition().x, player->GetPosition().y, player->GetPosition().z);
  16.                 CMessages::AddMessageJumpQ(message, 5000, 3, false);
  17.             }
  18.         };
  19.     }
  20. } playerCoors;

Оффлайн egor230

  • Прохожий
  • *
  • Сообщений: 109
  • Репутация: +3/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #213 : Ноябрь 25, 2018, 06:54:40 pm »
Здравствуйте, уважаемый kenking, большое спасибо, что Вы мне ответили. Благодаря Вам, правильно выводятся координаты. Но, я решил сделать функцию, которая возвращает три координаты (х, у, z), но почему-то не получается передать player по указателю. Подскажите, пожалуйста, просто хочется упростить получение координат.
вот мой код.
Код: C++
  1. using namespace plugin;
  2. char getcoordes(CPed *player) {
  3.         static char x[256];
  4.         snprintf(x, 256, "%.2f;", player->GetPosition().x);
  5.         static char y[256];
  6.         snprintf(y, 256, "%.2f;", player->GetPosition().y);
  7.         static char z[256];
  8.         snprintf(z, 256, "%.2f;", player->GetPosition().z);
  9.         return x, y, z;
  10. };
  11. class PlayerCoors {
  12. public:
  13.         PlayerCoors() {
  14.                 Events::drawingEvent += [] {
  15.                         CPed *player = FindPlayerPed();
  16.                         if (KeyPressed('M') && player) {
  17.                                 char x, char y, char z = getcoordes(*player);
  18.                                 char mes[] = "x " << x << "y " << y << "z " << z;
  19.                                 CMessages::AddMessageJumpQ(mes, 5000, 3);
  20.                         }
  21.                 };
  22.         }
  23. } playerCoors;
  24.  

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 172
  • Репутация: +9/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #214 : Ноябрь 25, 2018, 07:31:21 pm »
Цитировать
просто хочется упростить получение координат.
Так ты не упрощаешь, а усложняешь. Функция GetPosition() как раз и возвращает координаты в виде вектора. Почитай про функции в С++ в том числе про возвращаемые значения и передачу параметров в функции по указателю и по ссылке.

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 233
  • Репутация: +323/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #215 : Ноябрь 25, 2018, 10:36:24 pm »
string x,y,z=FindPlayerCoors();
То, что ты пытался сделать, называется Structured Binding, и там надо использовать строго фиксированный синтаксис:
Код: C++
  1. auto [переменные] = Функция_которая_возвращает_обьект
Т.е. получится вот так:
Код: C++
  1. auto [x, y, z] = FindPlayerCoors();

Код: C++
  1. #include "plugin.h"
  2. #include "CMessages.h"
  3.  
  4. using namespace plugin;
  5.  
  6. class PlayerCoors {
  7. public:
  8.     PlayerCoors() {
  9.         Events::gameProcessEvent += [] {
  10.             if (FindPlayerPed()) {
  11.                 auto [x, y, z] = FindPlayerCoors();
  12.                 CMessages::AddMessageJumpQ(FormatStatic("%.2f %.2f %.2f", x, y, z), 1000, 0);
  13.             }
  14.         };
  15.     }
  16. } playerCoors;
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн egor230

  • Прохожий
  • *
  • Сообщений: 109
  • Репутация: +3/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #216 : Ноябрь 27, 2018, 09:59:26 pm »
Цитировать
просто хочется упростить получение координат.
Так ты не упрощаешь, а усложняешь. Функция GetPosition() как раз и возвращает координаты в виде вектора. Почитай про функции в С++ в том числе про возвращаемые значения и передачу параметров в функции по указателю и по ссылке.
Здравствуйте уважаемый kenking. Простите, пожалуйста,  не сразу вам смог ответить.  Вот что у меня получилось,  координаты выводится.

Код: C++
  1. using namespace plugin;
  2.  
  3. char * getcoordes(CPed *player) {
  4.         static char x[256];
  5.         snprintf(x, 256, "x = %.2f;y = %.2f;z = %.2f;", player->GetPosition().x, player->GetPosition().y, player->GetPosition().z);
  6.         return x;      
  7. };
  8. class PlayerCoors {
  9. public:
  10.         PlayerCoors() {
  11.                 Events::drawingEvent += [] {
  12.                         CPed *player = FindPlayerPed();
  13.                         if (KeyPressed('M') && player) {
  14.                                 char *s = getcoordes(player);//
  15.                                 CMessages::AddMessageJumpQ(s, 5000, 3);                 }
  16.                 };
  17.         }
  18. } playerCoors;
  19.  
DK,  вы   написали ещё круче,  чем я  мог подумать,  браво!
« Последнее редактирование: Ноябрь 27, 2018, 10:03:43 pm от egor230 »

Оффлайн egor230

  • Прохожий
  • *
  • Сообщений: 109
  • Репутация: +3/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #217 : Ноябрь 29, 2018, 07:04:00 pm »
Здравствуйте всем. Немного стал  понимать 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.  

Оффлайн egor230

  • Прохожий
  • *
  • Сообщений: 109
  • Репутация: +3/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #218 : Декабрь 07, 2018, 07:43:27 pm »
Здравствуйте уважаемые люди. все  думал как решить эту проблему?  Нашел, конечно громоздкое решение.
Может кому поможет.
Код: 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;// броня






Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 172
  • Репутация: +9/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #219 : Декабрь 08, 2018, 10:11:37 am »
Код: C++
  1. player->m_bInVehicle

Код: C++
  1. CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 5000;

Оффлайн egor230

  • Прохожий
  • *
  • Сообщений: 109
  • Репутация: +3/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #220 : Декабрь 09, 2018, 12:45:54 am »
Спасибо большое вам за ответ уважаемый 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.  

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


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




Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 172
  • Репутация: +9/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #221 : Декабрь 09, 2018, 10:29:32 am »
Цитировать
Вот какой плагин получится
Как ты любишь усложнять. Зачем писать функцию isPedInVehicle, если player->m_bInVehicle и так показывает, что игрок в авто?
Код: C++
  1. #include "plugin.h"
  2. #include "CWorld.h"
  3. #include "extensions\KeyCheck.h"
  4. #include "CMessages.h"
  5.  
  6. using namespace plugin;
  7.  
  8. class Test {
  9. public:
  10.     Test() {
  11.         Events::gameProcessEvent += [] {
  12.             CPed *player = FindPlayerPed();
  13.             KeyCheck::Update();
  14.             if (player && player->m_bInVehicle && player->m_pVehicle && KeyCheck::CheckWithDelay('M', 200)) {
  15.                 player->m_pVehicle->m_fHealth = 1000.0f;
  16.                 player->m_pVehicle->m_nPrimaryColor = 0;
  17.                 player->m_pVehicle->m_nSecondaryColor = 0;
  18.                 static char message[256];
  19.                 snprintf(message, 256, "x = %.2f; y = %.2f; z = %.2f;", player->m_pVehicle->GetPosition().x, player->m_pVehicle->GetPosition().y, player->m_pVehicle->GetPosition().z);
  20.                 CMessages::AddMessageJumpQ(message, 3000, false);
  21.                 CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 5000;
  22.             }
  23.         };
  24.     }
  25. } test;

Или так:
Код: C++
  1. #include "plugin.h"
  2. #include "CWorld.h"
  3. #include "extensions\KeyCheck.h"
  4. #include "CMessages.h"
  5.  
  6. using namespace plugin;
  7.  
  8. class Test {
  9. public:
  10.     Test() {
  11.         Events::gameProcessEvent += [] {
  12.             CVehicle *vehicle = FindPlayerVehicle();
  13.             KeyCheck::Update();
  14.             if (vehicle && KeyCheck::CheckWithDelay('M', 200)) {
  15.                 vehicle->m_fHealth = 1000.0f;
  16.                 vehicle->m_nPrimaryColor = 0;
  17.                 vehicle->m_nSecondaryColor = 0;
  18.                 static char message[256];
  19.                 snprintf(message, 256, "x = %.2f; y = %.2f; z = %.2f;", vehicle->GetPosition().x, vehicle->GetPosition().y, vehicle->GetPosition().z);
  20.                 CMessages::AddMessageJumpQ(message, 3000, false);
  21.                 CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 5000;
  22.             }
  23.         };
  24.     }
  25. } test;

Цитировать
Как найти случайную машину?
Как проверить находится ли машина в заданных координатах?
Код: C++
  1. #include "plugin.h"
  2. #include "CFont.h"
  3.  
  4. using namespace plugin;
  5.  
  6. class Test {
  7. public:
  8.     Test() {
  9.         Events::drawingEvent += [] {
  10.             CPed *player = FindPlayerPed();
  11.             if (player) {
  12.                 for (int i = 0; i < CPools::ms_pVehiclePool->m_nSize; i++) {
  13.                     CVehicle *vehicle = CPools::ms_pVehiclePool->GetAt(i);
  14.                     if (vehicle && (DistanceBetweenPoints(player->GetPosition(), vehicle->GetPosition()) < 5.0f)) {
  15.                         CFont::SetScale(0.5f, 1.0f);
  16.                         CFont::SetColor(CRGBA(255, 255, 255, 255));
  17.                         CFont::SetJustifyOn();
  18.                         CFont::SetFontStyle(1);
  19.                         CFont::SetPropOn();
  20.                         CFont::SetWrapx(600.0f);
  21.                         wchar_t text[64];
  22.                         swprintf(text, L"ID vehicle %.d", vehicle->m_nModelIndex);
  23.                         CFont::PrintString(10.0f, 10.0f, text);
  24.                     }
  25.                 }
  26.             }
  27.         };
  28.     }
  29. } test;


Оффлайн egor230

  • Прохожий
  • *
  • Сообщений: 109
  • Репутация: +3/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #222 : Декабрь 09, 2018, 03:16:58 pm »
Спасибо большое за ваш ответ уважаемый 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
А тут всё по-другому.
Странно, но игра вылетает, если приближаюсь к любому авто.
« Последнее редактирование: Декабрь 09, 2018, 05:28:20 pm от egor230 »

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 172
  • Репутация: +9/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #223 : Декабрь 10, 2018, 09:48:52 am »
Цитировать
KeyCheck
http://forum.gtabuilder.ru/index.php?topic=337.msg2356#msg2356

Цитировать
KeyPressed('M')?.  С ним часто возникают проблемы.  Хочется проверять клавиши  так нажал  и только когда отпустишь она вернула true, Чтобы избежать повторного нажатия и клавиша будет нажата только  1 раз.  Допустим при нажатии клавиши  даётся игроку  500$  я немного  дольше подержал  и бах у меня 5 миллионов. Это настоящая проблема.
Здесь http://forum.gtabuilder.ru/index.php?topic=337.msg3355#msg3355 в своём коде ты правильно используешь KeyPressed, а в предыдущем сообщении http://forum.gtabuilder.ru/index.php?topic=337.msg3422#msg3422 уже не правильно.

Цитировать
Думал что есть  аналог опкода 05F0: 3@ = random_vehicle_near_point 0@ 1@ 2@ in_radius 10.0 find_next 1 pass_wrecked 0 //IF and SET
А тут всё по-другому.
Так там похоже сделано, просто действия "завёрнуты" в опкод и ты их не видишь.

Цитировать
Странно, но игра вылетает, если приближаюсь к любому авто.


Оффлайн egor230

  • Прохожий
  • *
  • Сообщений: 109
  • Репутация: +3/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #224 : Декабрь 10, 2018, 08:57:52 pm »
Спасибо вам большое уважаемый  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.  
« Последнее редактирование: Декабрь 11, 2018, 09:28:26 pm от egor230 »