Неа , 0 эмоции . Я если что в том коде который кидал там есть пару косяков и недочетов . Но смысл вроде я донес . По логике цикл бесконечный лаги не вызывает у меня и работает стабильно . И по логике если цикл бесконечный то он проверяет всегда эту = или нет ( я про if ) , мне просто не понятно почему при считывании из памяти игры и потом проверки это значения толку 0 . Я хотел это реализовать типа проверку координат игрока и потом уже выполнение кода типа если ровно то это а если нет то будет то-то выполнено , а когда я вроде проверяю и значение одинаковы толку 0 . Я даже ставил промежуток между этими значениями типа проверку между 1 и 4 ( типа если равно 1 или 2 или 3 или 4) то код выполнится но нет . Ну у меня были предположение что иза того что значение флоат и типа оно плавает ( проще говоря с точкой ) то тогда можно же выполнить проверку денег и если оно верно то вывести на экран но и это тоже не хочет . Типа сама проблема в том что у меня не получается сделать проверку значения из адреса памяти ( if как будто его не читает ) . Код который ты дал я поправил ( там был старый мой косяк , указатели были не все заменены ) и вгрызся в игру ( заинжектил) то не чего не показало ( там должно было высветится типа подсказки ) . Потом поставив через CE значение на 100 и там и там и поменяв на 1-4 байт то толку не было ( менял для того что-бы убедится что точно не работает ) .0xB7CE50 - [dword] Деньги \\ - пробуй через это
и поменяй название перменной
P.s. а вообще у тебя цикл while постоянно идет
Писал в блокноте , может что то и не так , но суть думаю понятна будет
sad:DWORD Cped = *(DWORD*)0xB6F5F0; // тут мы прочитали указатель на игрока ну адрес игрока типо . DWORD dwMoney = (Cped + 0x756); // а это смещение адреса для денег , мы его прочитали и записали в $ ну или в что-то другое разницы нету вроде ) . Хоть в 1 . #define FUNC_CMessages__AddMessageJumpQ 0x69F1E0 void AddMessageJumpQ(PCHAR text, UINT time, USHORT flag, bool bPreviousBrief) // Функция показа сообщения на экране. { ((void(__cdecl *)(PCHAR, UINT, USHORT, bool))FUNC_CMessages__AddMessageJumpQ)(text, time, flag, bPreviousBrief); } void __cdecl MainThread(void *pArg) { static DWORD dwOldMoney = 0; static bool _bInit = false; while(true) { if(!_bInit) { dwOldMoney = (Cped + 0x756); // Или тот адресс который я кинул выше. _bInit = true; } if(dwOldMoney != (Cped + 0x756)) { if ($ == 100) { AddMessageJumpQ("Проверка выполнена и денег 100 . ", 1500, NULL, false); dwOldMoney = (Cped + 0x756); } else { AddMessageJumpQ("Проверка на то что денег 100 не верно", 1500, NULL, false); dwOldMoney = (Cped + 0x756); } } Sleep(100); } }
Попробуй так.1. Как правильно выполнить проверку через if при работает с адресами памяти игры .
0xB7CE50 - адрес денег
if (*(DWORD*)0xB7CE50 == 100)
2.Cпасибо заработало , лайк поставил . А не подскажешь как можно еще реализовать это с 1-2 смещениями ? ( смещения адреса памяти )Попробуй так.
C++:0xB7CE50 - адрес денег if (*(DWORD*)0xB7CE50 == 100)
Еще можешь использовать вот этот плагин для логирования значений - https://blast.hk/threads/22179/
2.Cпасибо заработало , лайк поставил . А не подскажешь как можно еще реализовать это с 1-2 смещениями ? ( смещения адреса памяти )
Вопрос.CPP:#include <Windows.h> #include <process.h> #include "main.h" void __cdecl MainThread(void *pArg) { while (true) Sleep(1); { if ($ == 100)// Проверка на то что $ = 100 и если оно верное ( true ) то выполнится код нижу. { Sleep(1);//Задержка 1 мс. Добавил чисто для безопасности шобы не было просадки , ну а вдруг нада . AddMessageJumpQ("Проверка выполнена и равна 100 . ", 1500, NULL, false);//Выводит подсказку с текстом , ну это стандарт функция) } else { //Если $ не равна 100 то выполнится этот код ниже . Sleep(10000);// Задержка 10 Сек. AddMessageJumpQ("Значение не 100", 1500, NULL, false);//Выводит подсказку с текстом , ну это стандарт функция) } } }
main.h:DWORD Cped = *(DWORD*)0xB6F5F0; // тут мы прочитали указатель на игрока ну адрес игрока типо . DWORD ZZZ = (Cped + 0x756); // а это смещение адреса для денег , мы его прочитали и записали в $ ну или в что-то другое разницы нету вроде ) . Хоть в 1 .
if (*(DWORD*)(0xB6F5F0 +0x756)== 100)
DWORD *money = (DWORD*)(0xB6F5F0 +0x756)
if ((DWORD*)money == 100)
Вроде написал все верно , проверил но почему значение не верное (( не true) код уходит всегда на else ). Написал без указателей .Выше в коде ты передаешь не адрес, а значение, получается $ у тебя имеет константу, которая задается один раз при инициализации, а при инициализации игры она скорее всего 0.
Можно сделать сразу так:
Либо передать указатель и потом его использовать из свое переменной:C++:if (*(DWORD*)(0xB6F5F0 +0x756)== 100)
C++:DWORD *money = (DWORD*)(0xB6F5F0 +0x756) if ((DWORD*)money == 100)
#include <process.h> // тут мы подгрузили инелуиды для работы всего что ниже есть .
#include <Windows.h> // тут мы подгрузили инелуиды для работы всего что ниже есть .
#include "main.h" // в main.h лежит сама функция (внутрености я хз как называются )-AddMessageJumpQ
#define VK_Z 0x5A // Индификатор для красоты что-бы конпка VK_Z была красивее а не прросто 0x5A , и понятно будет что это конпка Z
void __cdecl MainThread(void *pArg) // cтандарт
{
while (true) { //тут цикл бесконечный (лагов нет)
if (GetAsyncKeyState(VK_CONTROL)&& GetAsyncKeyState(VK_Z)) { // проверка на то что нажата кнопки CTR и Z
if (*(float*)(((0xB6F5F0) + 0x14) + 0x30) == 1903.640259f) { // там я написал float а DWORD это 4 байт вроде как и он не подходит в моем случаее.
AddMessageJumpQ("VERNO", 1500, NULL, false); // Функция вывода подсказки или субритров если их так можно называть в самом сампе
Sleep(100); // зажерка а дальше все ясно , я так подумал вы и так все знаете ))))))).
}
else {
AddMessageJumpQ("NE-ROBIT-IDI-DUMAI", 1500, NULL, false);
Sleep(100);
}
}
}
}
BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ PVOID lpvReserved)
{
if (fdwReason == DLL_PROCESS_ATTACH) _beginthread(MainThread, NULL, nullptr);
return TRUE;
}
ты делаешь просто смещение, а надо через указатель. координаты находятся в матрице по указателю:Вроде написал все верно , проверил но почему значение не верное (( не true) код уходит всегда на else ). Написал без указателей .
Отрывок кода.cpp:if (*(float*)(((0xB6F5F0) + 0x14) + 0x30) == 1903.640259f) { // там я написал float а DWORD это 4 байт вроде как и он не подходит в моем случаее.
DWORD* CPED = (DWORD*)0xB6F5F0; // передаем адрес в наш указатель
DWORD* pMtrx = (DWORD*)((*CPED) + 0x14); //получаем указатель по адресу со смещением и также передаем его
float* PosX = (float*)((*pMtrx) + 0x30);
if (*PosX == 1000.0f)
actor_struct *pGTA_Ped = (actor_struct*)0xB6F5F0
float PosX = pGTA_Ped->base.matrix[12]
Спасибо , Просто я думал если я могу добавить к этому указателю += 1 ( пример) то все работало ну я и думал что если так работает значит и в if будет работать . Спасибо еще раз , не кто не мог помочь и описать и рассказать как ты )) , кого спрашивал либо игнорили либо говорили типа хз , ну или ряльно не знали . Как я понял в эту тему эффективнее писать чем просто создавать тему и там задавать вопрос . Лайк поставил .ты делаешь просто смещение, а надо через указатель. координаты находятся в матрице по указателю:
в собейте есть структура актора - https://github.com/BlastHackNet/mod_s0beit_sa-1/blob/master/src/cheat.h#L412C++:DWORD* CPED = (DWORD*)0xB6F5F0; // передаем адрес в наш указатель DWORD* pMtrx = (DWORD*)((*CPED) + 0x14); //получаем указатель по адресу со смещением и также передаем его float* PosX = (float*)((*pMtrx) + 0x30); if (*PosX == 1000.0f)
структура base_object имеет начало структура с координатами с этими смещениями - https://github.com/BlastHackNet/mod_s0beit_sa-1/blob/master/src/cheat.h#L347
+0x14(20 в десятичной) это выход на матрицу
использовать так:
C++:actor_struct *pGTA_Ped = (actor_struct*)0xB6F5F0 float PosX = pGTA_Ped->base.matrix[12]
Лучше используй std::thread;Вроде написал все верно , проверил но почему значение не верное (( не true) код уходит всегда на else ). Написал без указателей .
#include <thread>
#include <chrono>
#include <iostream>
#include <mutex>
#include <string>
using namespace std;
void func(mutex& mut, string& text) {
mut.lock();
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
this_thread::sleep_for(10ms);
cout << text;
}
cout << endl;
}
mut.unlock();
text = "$";
}
mutex mute;
int main() {
string text = "#";
thread t1(func, ref(mute), ref(text));
thread t2(func, ref(mute), ref(text));
t1.join();
t2.join();
return 0;
}
По мне так то лучше )) . Я просто не знаю чем это лучше .Лучше используй std::thread;
Накидаю для примера.
C++:#include <thread> #include <chrono> #include <iostream> #include <mutex> #include <string> using namespace std; void func(mutex& mut, string& text) { mut.lock(); for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { this_thread::sleep_for(10ms); cout << text; } cout << endl; } mut.unlock(); text = "$"; } mutex mute; int main() { string text = "#"; thread t1(func, ref(mute), ref(text)); thread t2(func, ref(mute), ref(text)); t1.join(); t2.join(); return 0; }
C STL куда удобней работать. Твой код более сишный, чем цппшныйПо мне так то лучше )) . Я просто не знаю чем это лучше .
в больших проектахC STL куда удобней работать.
Мое мнение, что к хорошему и простому лучше приучатся сначалав больших проектах