Загрузка данных


#include <windows.h>
#include "inc\main.h"
#include "inc\natives.h"
#include "inc\types.h"

// Состояния скрипта
bool isWaitingForMission = false; // Флаг: включен ли режим ожидания кнопкой J
bool timerRunning = false;        // Флаг: запущен ли сам отсчет времени
int savedElapsedTime = 0;         // Сохраненный финальный результат из памяти
bool wasKeyPressed = false;       // Защита от дребезга клавиши J

void ScriptMain() {
    char timeStr[32];

    while (true) {
        // 1. Обработка клавиши J (0x4A) для включения/выключения скрипта
        bool isPressed = (GetAsyncKeyState(0x4A) & 0x8000) != 0;

        if (isPressed && !wasKeyPressed) {
            if (!isWaitingForMission && !timerRunning) {
                // Активируем режим ожидания миссии
                isWaitingForMission = true;
                savedElapsedTime = 0;
            } else {
                // Если таймер работал или ждал — полностью выключаем и сбрасываем всё
                isWaitingForMission = false;
                timerRunning = false;
                savedElapsedTime = 0;
            }
        }
        wasKeyPressed = isPressed;

        // 2. Логика отслеживания миссии
        if (isWaitingForMission) {
            BOOL isMissionActive = GAMEPLAY::GET_MISSION_FLAG();

            if (isMissionActive && !timerRunning) {
                // Миссия началась
                timerRunning = true;
            }
            else if (!isMissionActive && timerRunning) {
                // Миссия завершилась
                timerRunning = false;
                isWaitingForMission = false; // Выходим из режима ожидания
            }
        }

        // 3. Вычисление времени напрямую из Global_76136
        int displayTime = 0;

        int* targetGlobalPtr = reinterpret_cast<int*>(getGlobalPtr(76136));
        if (targetGlobalPtr != nullptr) {
            int currentMemoryValue = *targetGlobalPtr;

            // Если значение в памяти корректное (больше нуля)
            if (currentMemoryValue >= 0) {
                if (timerRunning) {
                    savedElapsedTime = currentMemoryValue; // Постоянно обновляем результат во время миссии
                    displayTime = currentMemoryValue;
                } else {
                    // Если миссия не идет, но есть сохраненный результат
                    displayTime = savedElapsedTime;
                }
            }
        }

        // 4. Отрисовка интерфейса на экране
        // Показываем статус "WAITING FOR MISSION..."
        if (isWaitingForMission && !timerRunning) {
            UI::SET_TEXT_SCALE(0.4f, 0.4f);
            UI::SET_TEXT_COLOUR(150, 150, 150, 200); // Серый цвет ожидания
            UI::SET_TEXT_CENTRE(1);

            UI::_SET_TEXT_ENTRY("STRING");
            UI::_ADD_TEXT_COMPONENT_STRING("WAITING FOR MISSION..."); 
            UI::_DRAW_TEXT(0.5f, 0.06f);
        }

        // Показываем таймер или сообщение о кат-сцене
        if (timerRunning || savedElapsedTime > 0) {

            // НОВАЯ ПРОВЕРКА: если миссия идет, но таймер в памяти еще равен 0
            if (timerRunning && displayTime == 0) {
                UI::SET_TEXT_SCALE(0.4f, 0.4f);
                UI::SET_TEXT_COLOUR(255, 255, 255, 255);
                UI::SET_TEXT_CENTRE(1);

                UI::_SET_TEXT_ENTRY("STRING");
                UI::_ADD_TEXT_COMPONENT_STRING("MISSION STARTED...");
                UI::_DRAW_TEXT(0.5f, 0.06f);
            } 
            else {
                // Обычный вывод таймера, если значение больше нуля (или остался сохраненный результат)
                int totalSeconds = displayTime / 1000;
                int minutes = totalSeconds / 60;
                int seconds = totalSeconds % 60;
                int milliseconds = displayTime % 1000;

                wsprintfA(timeStr, "%02d:%02d.%03d", minutes, seconds, milliseconds);

                UI::SET_TEXT_SCALE(0.46f, 0.46f);

                if (timerRunning) {
                    UI::SET_TEXT_COLOUR(255, 255, 255, 255); // Белый во время прохождения миссии
                } else {
                    UI::SET_TEXT_COLOUR(240, 200, 80, 255);  // Золотой после ее завершения
                }

                UI::_SET_TEXT_ENTRY("STRING");
                UI::_ADD_TEXT_COMPONENT_STRING(timeStr);
                UI::_DRAW_TEXT(0.46f, 0.06f);
            }
        }

        scriptWait(0);
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
    switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
        scriptRegister(hModule, ScriptMain);
        break;
    case DLL_PROCESS_DETACH:
        scriptUnregister(hModule);
        break;
    }
    return TRUE;
}