#include "plugin.h"
#include "common.h"
#include "extensions\KeyCheck.h"
#include "CMessages.h"
#include "CTimer.h"
#include<thread> // std::thread
#include<chrono> // std::thread
#include<string>
#include<fstream>
#include<queue>
#include<map>
using namespace plugin;
using namespace std;
queue<double>q = {};// очередь для хранение всех значение координат из файла.
map<string, double> pos;// ассоциативный массив
bool readf = false;// начальное положение флага для чтение из файла.
bool off = false;// выключения записи флага
bool isPedInVehicle(CPed * player) { return player->m_bInVehicle && player->m_pVehicle != NULL; }
void write(CPed *player, string path, bool &off) {
CVehicle *v = player->m_pVehicle;// получить указатель на хенлд авто
fstream f; static char cord[256]; static unsigned int time = 0;// обнулить таймер
f.open(path, fstream::in | fstream::app | fstream::out);
if (f.is_open()) {while(true){if (CTimer::m_snTimeInMilliseconds - time > 5000) {
this_thread::sleep_for(chrono::milliseconds(600));// задержка
time = 0;// обнулить таймер
static string cord = ""; // строка для сравнение
char x[256]; snprintf(x, 256, "%.2f %.2f %.2f \n", v->GetPosition().x, v->GetPosition().y, v->GetPosition().z);
string cordnenxt = string(x); // массив char в string
if (cordnenxt != cord) {cord = cordnenxt;// сравнить с предыдущей значение
f << cordnenxt; }// записать координаты в файл.
if (off == true) { break; }}}// если кнопка в нажата, выкл запись координат.
}// записать координаты в файл.
f.close(); off = false;// выключения записи флага
return;
};
template <class t1, class t2>// это метод как шабло. функция.
void getcord(t1 *q, t2 *pos, string path, bool &readf, bool &oof) {
fstream f1;
f1.open(path, fstream::in | fstream::app | fstream::out);
static unsigned int time = 0;// обнулить таймер.
double a; // принимает очередь и ассо массив.
off = true; //выкл запись координат.
if (f1.is_open()) { if (readf == false) {// если false нужно прочитать файл.
while (f1 >> a) { if (CTimer::m_snTimeInMilliseconds - time > 500){
q->push(a); // считываем файл в очередь
readf = true; } }}//заполнена очередь, уст флаг.
if (q->empty()) { readf = false; }// если очередь пуста, уст флаг
else {pos->clear();// очистить ассо массив
pos->emplace("x", q->front()); q->pop();// добавить значение по ключу
pos->emplace("y", q->front()); q->pop();// и удалить из очереди.
pos->emplace("z", q->front()); q->pop();}
}
f1.close(); // деструктор, закрывает файл.
};
class PlayerCoors {
public:
PlayerCoors() { Events::gameProcessEvent += [] {//обработчик событий игры
KeyCheck::Update();
CPed *player = FindPlayerPed();// найти игрока
if (!player) return; {if (KeyCheck::CheckWithDelay('M', 200) && isPedInVehicle(player)) {// проверка найден игрок и за рулем.
CMessages::AddMessageJumpQ("this is gta vc", 5000, 3);//выводит сообщение на экран
thread th(write, player, "cord.txt", std::ref(off));th.detach();}// независим поток. записать координаты в файл.
// передаем в новом поток.
if (KeyCheck::CheckWithDelay('B', 200) && !isPedInVehicle(player)) { //если м нажата
getcord(&q, &pos, "cord.txt", readf, off);// получить координаты из файла.
char s[256];
snprintf(s, 256, "x = %.2f;y = %.2f;z = %.2f;", pos["x"], pos["y"], pos["z"]);
CMessages::AddMessageJumpQ(s, 5000, 3);//выводит сообщение на экран
} }
};
}
} playerCoors;