#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <dirent.h>
#include <pthread.h>
#include <fstream>
#include <string.h>
#include <time.h>
#include <malloc.h>
#include <iostream>
#include <fstream>
#include<iostream>
#include<ctime>
using namespace std;
#include "Draw.h"
#include "VulkanUtils.h"
#include <iostream>
#include <chrono>
#include <ctime>
#include <string>
#define MAX_LENGTH 1024
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <thread>
#include <chrono>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <poll.h>
#include <main.h>
#include "main.h"
#include "draw.cpp"
int fbl; bool 开关 = true; bool 快捷 = false;
typedef struct {
    const void* data; // 图片数据的地址
    size_t size;      // 图片数据的大小
    void* id;         // 纹理ID的指针，类型改为 void*
} TextureInfo;

TextureInfo textures[] = {
    {&枪101001, sizeof(枪101001), &ID101001},
    {&枪101002, sizeof(枪101002), &ID101002},
    {&枪101003, sizeof(枪101003), &ID101003},
    {&枪101004, sizeof(枪101004), &ID101004},
    {&枪101005, sizeof(枪101005), &ID101005},
    {&枪101006, sizeof(枪101006), &ID101006},
    {&枪101007, sizeof(枪101007), &ID101007},
    {&枪101008, sizeof(枪101008), &ID101008},
    {&枪101009, sizeof(枪101009), &ID101009},
    {&枪101010, sizeof(枪101010), &ID101010},
    {&枪101011, sizeof(枪101011), &ID101011},
    {&枪101012, sizeof(枪101012), &ID101012},
    {&枪102001, sizeof(枪102001), &ID102001},
    {&枪102002, sizeof(枪102002), &ID102002},
    {&枪102003, sizeof(枪102003), &ID102003},
    {&枪102004, sizeof(枪102004), &ID102004},
    {&枪102005, sizeof(枪102005), &ID102005},
    {&枪102007, sizeof(枪102007), &ID102007},
    {&枪102105, sizeof(枪102105), &ID102105},
    {&枪103001, sizeof(枪103001), &ID103001},
    {&枪103002, sizeof(枪103002), &ID103002},
    {&枪103003, sizeof(枪103003), &ID103003},
    {&枪103004, sizeof(枪103004), &ID103004},
    {&枪103005, sizeof(枪103005), &ID103005},
    {&枪103006, sizeof(枪103006), &ID103006},
    {&枪103007, sizeof(枪103007), &ID103007},
    {&枪103008, sizeof(枪103008), &ID103008},
    {&枪103009, sizeof(枪103009), &ID103009},
    {&枪103010, sizeof(枪103010), &ID103010},
    {&枪103011, sizeof(枪103011), &ID103011},
    {&枪103012, sizeof(枪103012), &ID103012},
    {&枪103013, sizeof(枪103013), &ID103013},
    {&枪103014, sizeof(枪103014), &ID103014},
    {&枪103015, sizeof(枪103015), &ID103015},
    {&枪103100, sizeof(枪103100), &ID103100},
    {&枪103901, sizeof(枪103901), &ID103901},
    {&枪103902, sizeof(枪103902), &ID103902},
    {&枪103903, sizeof(枪103903), &ID103903},
    {&枪104001, sizeof(枪104001), &ID104001},
    {&枪104002, sizeof(枪104002), &ID104002},
    {&枪104003, sizeof(枪104003), &ID104003},
    {&枪104004, sizeof(枪104004), &ID104004},
    {&枪105001, sizeof(枪105001), &ID105001},
    {&枪104100, sizeof(枪104100), &ID104100},
    {&枪105002, sizeof(枪105002), &ID105002},
    {&枪105010, sizeof(枪105010), &ID105010},
    {&枪106001, sizeof(枪106001), &ID106001},
    {&枪106002, sizeof(枪106002), &ID106002},
    {&枪106003, sizeof(枪106003), &ID106003},
    {&枪106004, sizeof(枪106004), &ID106004},
    {&枪106005, sizeof(枪106005), &ID106005},
    {&枪106006, sizeof(枪106006), &ID106006},
    {&枪106007, sizeof(枪106007), &ID106007},
    {&枪106008, sizeof(枪106008), &ID106008},
    {&枪106010, sizeof(枪106010), &ID106010},
    {&枪107001, sizeof(枪107001), &ID107001},
    {&枪107006, sizeof(枪107006), &ID107006},
    {&拳头, sizeof(拳头), &ID0},
    {&手雷弹, sizeof(手雷弹), &ID602004},
    {&燃烧瓶, sizeof(燃烧瓶), &ID602003},
    {&烟雾弹, sizeof(烟雾弹), &ID602002}
};




// 保持原始函数名不变
void 加载内存图片() {
    // 可以保留预加载或改为按需加载
    for (size_t i = 0; i < sizeof(textures) / sizeof(textures[0]); ++i) {
        LoadTextureFromMemory(textures[i].data, textures[i].size, (MyTextureData*)textures[i].id);
    }
}


int 按键次数 = 0;
int 数据() {
    DIR *dir = opendir("/dev/input/");
    dirent *ptr = NULL;
    int count = 0;
    while ((ptr = readdir(dir)) != NULL) {
        if (strstr(ptr->d_name, "event"))
            count++;
    }
    return count ? count : -1;
}

int 音量() {
    int EventCount = 数据();
    if (EventCount < 0) {
        printf("未找到输入设备\n");
        return -1;
    }

    int *fdArray = (int *)malloc(EventCount * sizeof(int));
    if (!fdArray) {
        perror("malloc");
        return -1;
    }

    for (int i = 0; i < EventCount; i++) {
        char temp[128];
        sprintf(temp, "/dev/input/event%d", i);
        fdArray[i] = open(temp, O_RDWR | O_NONBLOCK);
        if (fdArray[i] < 0) {
            perror("open");
            free(fdArray);
            return -1;
        }
    }

    struct pollfd polls[EventCount];
    int count;

    for (int i = 0; i < EventCount; i++) {
        polls[i].fd = fdArray[i];
        polls[i].events = POLLIN;
    }

    const int LONG_PRESS_THRESHOLD = 2000; // 2秒
    int volumeUpPressed = 0;
    struct timespec pressTime;
    int isBall = 0; // 控制悬浮球的显示和隐藏

    while (1) {
        count = poll(polls, EventCount, 1000);
        if (count < 0) {
            perror("poll");
            break;
        }

        for (int i = 0; i < EventCount; i++) {
            if (polls[i].revents & POLLIN) {
                input_event ev;
                memset(&ev, 0, sizeof(ev));
                read(fdArray[i], &ev, sizeof(ev));
                if (ev.type == EV_KEY) {
                    if (ev.code == KEY_VOLUMEUP) {
                        if (ev.value == 1) { // 按下
                            volumeUpPressed = 1;
                            clock_gettime(CLOCK_MONOTONIC, &pressTime);
                        } else if (ev.value == 0) { // 释放
                            volumeUpPressed = 0;
                            struct timespec releaseTime;
                            clock_gettime(CLOCK_MONOTONIC, &releaseTime);
                            long long elapsed = (releaseTime.tv_sec - pressTime.tv_sec) * 1000LL + (releaseTime.tv_nsec - pressTime.tv_nsec) / 1000000LL;
                            if (elapsed < LONG_PRESS_THRESHOLD) {
if (!DrawIo[57]) {
        
开关 = true;
IsBall = true; // 显示悬浮球
}
                            }
                        }
                    } else if (ev.code == KEY_VOLUMEDOWN && ev.value == 1) {
开关 = false;
IsBall = false; // 隐藏悬浮球
按键次数++;
快捷 = (按键次数 % 2 == 0);
                    }
                }
            }
        }

        if (volumeUpPressed) {
            struct timespec currentTime;
            clock_gettime(CLOCK_MONOTONIC, &currentTime);
            long long elapsed = (currentTime.tv_sec - pressTime.tv_sec) * 1000LL + (currentTime.tv_nsec - pressTime.tv_nsec) / 1000000LL;
            if (elapsed >= LONG_PRESS_THRESHOLD) {
                
                for (int i = 0; i < EventCount; i++) {
                    close(fdArray[i]);
                }
                free(fdArray);
                exit(0);
            }
        }

        usleep(1000);
    }

    for (int i = 0; i < EventCount; i++) {
        close(fdArray[i]);
    }
    free(fdArray);
    return 0;
}





bool main_thread_flag = true;

int abs_ScreenX = 0;
int abs_ScreenY = 0;


void getRoot(char **argv)
{
    char shellml[512];
    sprintf(shellml, "su -c %s", *argv);
    if (getuid() != 0)
    {
        system(shellml);
        exit(1);
    }
}
void config()
{
    NumIo[83] = 1.0f;//触摸Y位置
    NumIo[49] = 660.0f;//触摸Y位置
    NumIo[48] = 900.0f;//触摸X位置
    NumIo[50] = 300.0f;//触摸范围    
    NumIo[96] = 500.0f;
	NumIo[36] = 1.4f;
	NumIo[98] = 50.0f;
	NumIo[68] = 50.0f;
    NumIo[45] = 100.0f;
    NumIos[13] = 0;
    NumIo[77] = 1.0f;
    NumIo[78] =1.0f;
    NumIo[1] = 300.0f;//雷达X位置
    NumIo[2] = 400.0f;//雷达Y位置
    NumIo[3] = 150.0f;//自瞄范围
    NumIo[4] = 1.4f;//压枪力度
    NumIo[5] = 670.0f;//触摸Y位置
    NumIo[6] = 1400.0f;//触摸X位置
    NumIo[7] = 300.0f;//触摸范围
    NumIo[8] = 2.0f;//自瞄部位
    NumIo[9] = 9.0f;//平滑力度
    NumIo[10] = 0.0f;//充电口位置
    NumIo[11] = 600.0f;//子弹速度
    NumIo[12] = 60;//帧率
    NumIo[14] = 800;//
    NumIo[15] = 200;//
    NumIo[16] = 15.0f;//自瞄速度
    NumIo[17] = 150.0f;//雷达大小
    NumIo[18] = 0.0f;//瞄准方式
    NumIo[30] = 300.0f;//自瞄速度
    NumIo[32] = 1.0f;//骨骼粗细
    NumIo[62] = 1.0f;
	NumIo[34] = 0.0f;
NumIo[41] = 0.0f;
NumIo[42] = 0.0f;
NumIo[43] = 0.0f;
    NumIo[46] = 18.0f;
	NumIo[35] = 150.0f;//骨骼最大显示距离

	
	
}
void NumIoSave(const char *name) // 保存配置
{
    if (numSave == nullptr)
    {
        string SaveFile = "/data";
        SaveFile += "/";
        SaveFile += name;
        numSave = fopen(SaveFile.c_str(), "wb+");
    }
    fseek(numSave, 0, SEEK_SET);

    // 保存现有数据
    fwrite(NumIo, sizeof(float) * 300, 1, numSave);
    fwrite(DrawIo, sizeof(bool) * 300, 1, numSave);
    fwrite(NumIos, sizeof(float) * 300, 1, numSave);
    fwrite(intIo, sizeof(int) * 10, 1, numSave);

    // 保存额外的布尔变量
    fwrite(&Config.showRifle, sizeof(bool), 1, numSave);
    fwrite(&Config.showSubmachine, sizeof(bool), 1, numSave);
    fwrite(&Config.showSniper, sizeof(bool), 1, numSave);
    fwrite(&Config.showShotgun, sizeof(bool), 1, numSave);
    fwrite(&Config.showPistol, sizeof(bool), 1, numSave);
    fwrite(&Config.宝箱, sizeof(bool), 1, numSave);
    fwrite(&Config.狗, sizeof(bool), 1, numSave);
    fwrite(&Config.武器, sizeof(bool), 1, numSave);
    fwrite(&Config.信号枪, sizeof(bool), 1, numSave);
    fwrite(&Config.自救器, sizeof(bool), 1, numSave);
    fwrite(&Config.钞票, sizeof(bool), 1, numSave);
    fwrite(&Config.showChest, sizeof(bool), 1, numSave);
    fwrite(&Config.showDrop, sizeof(bool), 1, numSave);
    fwrite(&Config.showDrug, sizeof(bool), 1, numSave);
    fwrite(&Config.showArmor, sizeof(bool), 1, numSave);
    fwrite(&Config.showMirror, sizeof(bool), 1, numSave);
    fwrite(&Config.showExpansion, sizeof(bool), 1, numSave);
    fwrite(&Config.showOtherParts, sizeof(bool), 1, numSave);
    fwrite(&Config.show556, sizeof(bool), 1, numSave);
    fwrite(&Config.show762, sizeof(bool), 1, numSave);
    fwrite(&防录屏, sizeof(bool), 1, numSave);


    // 保存颜色变量
    fwrite(&真人射线, sizeof(ImColor), 1, numSave); // 真人射线颜色
    fwrite(&人机射线, sizeof(ImColor), 1, numSave); // 人机射线颜色
    fwrite(&自瞄圈, sizeof(ImColor), 1, numSave); // 自瞄圈颜色
    fwrite(&十字架, sizeof(ImColor), 1, numSave); // 十字架颜色

    fflush(numSave);
    fsync(fileno(numSave));
}

void NumIoLoad(const char *name)//加载配置
{
    ColorInitialization(); // 队伍颜色初始化
    if (numSave == nullptr)
    {
        string SaveFile = "/data";
        SaveFile += "/";
        SaveFile += name;
        numSave = fopen(SaveFile.c_str(), "rb+");
    }
    if (numSave != nullptr)
    {
        fseek(numSave, 0, SEEK_SET);
        fread(NumIo, sizeof(float) * 300, 1, numSave);
        fread(DrawIo, sizeof(bool) * 300, 1, numSave);
        fread(NumIos, sizeof(float) * 300, 1, numSave);
        fread(intIo, sizeof(int) * 10, 1, numSave);

        // 加载额外的布尔变量
    fread(&Config.showRifle, sizeof(bool), 1, numSave);
    fread(&Config.showSubmachine, sizeof(bool), 1, numSave);
    fread(&Config.showSniper, sizeof(bool), 1, numSave);
    fread(&Config.showShotgun, sizeof(bool), 1, numSave);
    fread(&Config.showPistol, sizeof(bool), 1, numSave);
    fread(&Config.宝箱, sizeof(bool), 1, numSave);
    fread(&Config.狗, sizeof(bool), 1, numSave);
    fread(&Config.武器, sizeof(bool), 1, numSave);
    fread(&Config.信号枪, sizeof(bool), 1, numSave);
    fread(&Config.自救器, sizeof(bool), 1, numSave);
    fread(&Config.钞票, sizeof(bool), 1, numSave);
    fread(&Config.showChest, sizeof(bool), 1, numSave);
    fread(&Config.showDrop, sizeof(bool), 1, numSave);
    fread(&Config.showDrug, sizeof(bool), 1, numSave);
    fread(&Config.showArmor, sizeof(bool), 1, numSave);
    fread(&Config.showMirror, sizeof(bool), 1, numSave);
    fread(&Config.showExpansion, sizeof(bool), 1, numSave);
    fread(&Config.showOtherParts, sizeof(bool), 1, numSave);
    fread(&Config.show556, sizeof(bool), 1, numSave);
    fread(&Config.show762, sizeof(bool), 1, numSave);
        fread(&防录屏, sizeof(bool), 1, numSave);
        // 加载颜色变量
        fread(&真人射线, sizeof(ImColor), 1, numSave); // 真人射线颜色
        fread(&人机射线, sizeof(ImColor), 1, numSave); // 人机射线颜色
        fread(&自瞄圈, sizeof(ImColor), 1, numSave); // 自瞄圈颜色
        fread(&十字架, sizeof(ImColor), 1, numSave); // 十字架颜色
    }
    else
    {
        config();
    }
}


   







int main(int argc, char *argv[])
{
//启动();
    printf("ZZZZZZZZZZZZZZZZZZZZZZZ      EEEEEEEEEEEEEEEEEE      UUUUU           UUUUU      SSSSSSSS\n");
    printf("                 ZZZZ         EEEEEEEEEEEEEEEEEE      UUUUU           UUUUU     SSSSSSSSSSS\n");
    printf("               ZZZZ           EEE                     UUUUU           UUUUU     SSS\n");
    printf("             ZZZZ             EEE                     UUUUU           UUUUU     SSS\n");
    printf("           ZZZZ               EEEEEEEEEEEEEEEEEE      UUUUU           UUUUU     SSSSSSSSSSS\n");
    printf("         ZZZZ                 EEEEEEEEEEEEEEEEEE      UUUUU           UUUUU     SSSSSSSSSSS\n");
    printf("       ZZZZ                   EEE                     UUUUU           UUUUU             SSS\n");
    printf("     ZZZZ                     EEE                     UUUUU           UUUUU             SSS\n");
    printf("   ZZZZ                       EEEEEEEEEEEEEEEEEE        UUUUUU     UUUUUU       SSSSSSSSSSS\n");
    printf("ZZZZZZZZZZZZZZZZZZZZZZZZ      EEEEEEEEEEEEEEEEEE          UUUUUUUUUUUUU          SSSSSSSS\n");
printf(" ");
printf(" \n");
设备信息();
卡密();
const char *liandian = "连点枪械配置.cfg";
        FILE *file666 = fopen(liandian, "r");
        if (file666 == NULL) {
            FILE *fp = fopen(liandian, "w");
            if (fp != NULL) {
                fclose(fp);
            }
        } else {
            fclose(file666);
        }
DrawInt();
std::string filePath = "无后台.txt";  // 移除了固定路径
std::ifstream file(filePath);
if (file.is_open()) {
    pid_t pid = fork();
    if (pid > 0) {
        exit(0);
        file.close();
    } else if (pid == 0) {
        // 子进程代码
    } else {
        fprintf(stderr, "[-]无后台创建失败\n");
        exit(1);
    }
} else {
    // 文件不存在时的处理
}


bool log;
    pid_t nowpid = getpid();
    char command[100];
    string strbool;
std::string filePaths = "防录屏.txt";  // 移除了固定路径
std::ifstream file2(filePaths);
if (file2.is_open()) {
    log = true;
    file2.close();
} else {
    log = false;
}

RenderWeaponSlider();
getRoot(argv);    
    screen_config(); 
    ::abs_ScreenX = (displayInfo.height > displayInfo.width ? displayInfo.height : displayInfo.width);
    ::abs_ScreenY = (displayInfo.height < displayInfo.width ? displayInfo.height : displayInfo.width);
    
    ::native_window_screen_x = (displayInfo.height > displayInfo.width ? displayInfo.height : displayInfo.width);
    ::native_window_screen_y = (displayInfo.height > displayInfo.width ? displayInfo.height : displayInfo.width);
    // 初始化imgui
    if (!initGUI_draw(native_window_screen_x, native_window_screen_y, log)) {
        return -1;
    }
      
    
    
    
    
    NumIoLoad("PUBG");
    std::thread volumeThread(音量);
    timer FPS限制;
    FPS限制.AotuFPS_init();
    FPS限制.setAffinity();

std::string filePathss = "陀螺仪.txt";
std::ifstream file3(filePathss);
bool TuoLuoYi = file3.good();
file3.close();

if (TuoLuoYi) {
Touch_Init(&abs_ScreenY,&abs_ScreenX,false);
new std::thread(AimBot, ImGui::GetForegroundDrawList());
} else {
Touch_Init(&abs_ScreenY,&abs_ScreenX,true);
new std::thread(AimBotAuto, ImGui::GetForegroundDrawList());
}

static bool texturesLoaded = false;
if (!texturesLoaded) {
    加载内存图片();
    texturesLoaded = true;
}
   LoadTextureFromMemory((const void *)&没人, sizeof(没人), &没人图);
   LoadTextureFromMemory((const void *)&真人, sizeof(真人), &真人图);
    LoadTextureFromMemory((const void *)&人机, sizeof(人机), &人机图);
	LoadTextureFromMemory((const void *)&自瞄关, sizeof(自瞄关), &悬浮自瞄开关); 
    while (main_thread_flag)
    {
        FPS限制.SetFps(FPS);
        FPS限制.AotuFPS();
        drawBegin();// imgui画图开始
     if (防录屏)
{
android::ANativeWindowCreator::ProcessMirrorDisplay();
}

if (!更新){
        win1();
}
UpdateAndRenderToasts();
        FPS = NumIo[12];
        if(初始化)
        DrawPlayer(ImGui::GetForegroundDrawList());
        
        drawEnd();// imgui画图结束
     //   std::this_thread::sleep_for(1ms);
    }
    shutdown();
    return 1;
}
float Numlo[300];
#include "Ui.h"
