Загрузка данных
#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;
}