Вопрос по памяти игры GTA SA или (SA-MP) , С++.

Gafask

Участник
Автор темы
137
13
Здравствуйте , не понимаю в чом проблема в коде . Когда я читаю Х из памяти SA и потом вывожу ее в проверку и когда по логике оно верное ( правда ) то не чего не происходит по ощущения что она даже не работает , даже обычный код который меня должен выкинуть или убить ( это смещение по координатам Х ) не срабатывает . Помогите уже ломал голову но толку 0 , я плохо понимаю еще в С++ но что-то делать пытаюсь и потихоньку изучаю его но с этим не сталкивался что if не работала при чтении из памяти игры .Пробовал менять значение через CE ( Cheat Engine ) на то значение которое в if и тоже толку 0 .

main.cpp:
// Если интересно что я хочу получить то я хочу получить проверку координат ,
//примеру я встаю на координаты 100 по Х и что-то делается или проверят
// равно ли Х 100 а если нет то делать то-то до того момента пока Х  не будет равно к примеру 100
// Я просто не знаю может надо для чтения памяти и проверки через if надо что-то другое ?



#include <Windows.h>
#include <process.h>
#include "main.h"



void __cdecl MainThread(void *pArg)
{
    while (true)
    {
                                         //Это 1993.362915f и 1996.362915f это координаты Х ( Х = это позиция игрока по Х )
        if (*(float*)(X)>= 1993.362915f && 1996.362915f>=*(float*)(X)) //(ПРОБЛЕМА ТУТ ) я писал просто X == к примеру 100 и с float и таким способом как щас .
        {
        // сюда я просто записал код чисто что-бы узнать работает или нет (эффект видеть что-бы в игре самой)
            Sleep(1);
            *reinterpret_cast<float*>(*reinterpret_cast<DWORD*>(*reinterpret_cast<DWORD*>(0xB6F5F0) + 0x14) + 0x30) += 0.07f; // я и просто без этого длинно кода прибавлять пробовал просто записывая Х и уже там типа += и тд -
            *reinterpret_cast<float*>(*reinterpret_cast<DWORD*>(*reinterpret_cast<DWORD*>(0xB6F5F0) + 0x14) + 0x30) += 0.07f; // но я подумал что возможно я иза этого и делаю что-то не так -
            *reinterpret_cast<float*>(*reinterpret_cast<DWORD*>(*reinterpret_cast<DWORD*>(0xB6F5F0) + 0x14) + 0x30) += 0.07f; // и решил просто записать это в полной форме без сокращений и тд .
            *reinterpret_cast<float*>(*reinterpret_cast<DWORD*>(*reinterpret_cast<DWORD*>(0xB6F5F0) + 0x14) + 0x30) += 0.07f;
            *reinterpret_cast<float*>(*reinterpret_cast<DWORD*>(*reinterpret_cast<DWORD*>(0xB6F5F0) + 0x14) + 0x30) += 0.07f;
        }
         
 
     }
}

BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ PVOID lpvReserved)
{
    if (fdwReason == DLL_PROCESS_ATTACH) _beginthread(MainThread, NULL, nullptr);
    return TRUE;
}



И второй ( чисто для удобства сделал что-бы уже хоть как то понимать и работать с .h файлами , ну мне так интереснее и удобнее )

main.h:
#pragma once // это было по стандарту не стал убирать .
DWORD Cped = *(DWORD*)0xB6F5F0;// тут мы читаем указатель на игрока
DWORD X = ((Cped + 0x14) + 0x30); // тут я пощитал смещение адресов и записал в Х (это если что координаты по Х игрока эт так к слову ну и другие тоже самое)
DWORD Y = ((Cped + 0x14) + 0x34); // тут я пощитал смещение адресов и записал в  Y
DWORD Z = ((Cped + 0x14) + 0x38); // тут я пощитал смещение адресов и записал в Z

Заранее спасибо ) .👍(●'◡'●)
 
Последнее редактирование:

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
Пробовал менять значение через CE ( Cheat Engine ) на то значение которое в if и тоже толку 0 .
В чём тогда твоя проблема? Ты уже сам ответил на свой вопрос - адрес в который ты записываешь не дает никакого результата. Сначала найди нужный тебе адрес, а только потом переключайся на код.
 

Gafask

Участник
Автор темы
137
13
В чём тогда твоя проблема? Ты уже сам ответил на свой вопрос - адрес в который ты записываешь не дает никакого результата. Сначала найди нужный тебе адрес, а только потом переключайся на код.
Если посмотреть в main.h то там я прочитал нужный адрес мне потом добавил к нему смещение и потом я это записал в Х и уже в main.cpp я начел делать проверку этого адреса if ( X == 100); но он не хочет работать как true , то есть если я сделав это значение Х ( это координаты игрока по Х ) через CE на 100 то я не получаю значение true для того что-бы код выполнился который будет ниже . Моя проблема в том что if не хочет читать этот адрес или проверять не знаю как выразится . То есть когда значение которое я проверяю в if на самом деле равно 100 и в проверке if тоже 100 , код не выполнятся . Я хочу у знать у вас как мне нужно правильно записывать проверку с адресами памятями или вы что-то исправили или подсказали что-то не так . Просто я уже не понимаю как это сделать а идей с этим много .
Отрывок из main.h:
DWORD Cped = *(DWORD*)0xB6F5F0;// тут мы читаем указатель на игрока
DWORD X = ((Cped + 0x14) + 0x30); // тут я пощитал смещение адресов и записал в Х (это если что координаты по Х игрока эт так к слову ну и другие тоже самое)
Если вдруг возникнет вопрос а работает ли Х . Да если ставить активацию по клавише и добавлять к Х к примеру 0.21f то оно будет спокойно добавляться .
Если вдруг будет вопрос верные ли адреса памяти gta sa я указал , да верные . ( Х - Это координаты игрока по х и там еще есть по y и z , Cped-это указатель на игрока)
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
Если твоя проблема только в сравнении чисел с плавающей точкой, то несколько гайдов по этому типу и одно из возможных решений:
 
  • Злость
Реакции: legend2360_tester

Gafask

Участник
Автор темы
137
13
Если твоя проблема только в сравнении чисел с плавающей точкой, то несколько гайдов по этому типу и одно из возможных решений:
Не нашел там решение проблемы но прочитал две статьи про плавающее значение )) .
Если твоя проблема только в сравнении чисел с плавающей точкой, то несколько гайдов по этому типу и одно из возможных решений:
Проблема состоит в том что если в if проверять значение из памяти игры ( АДрес и смещение записанное в Х ) то оно не хочет его читать , даже если поставить значение не флоат .
 
Последнее редактирование: