Другое С/С++ Вопрос - Ответ

Gafask

Участник
137
13
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);
    }


}
Неа , 0 эмоции . Я если что в том коде который кидал там есть пару косяков и недочетов . Но смысл вроде я донес . По логике цикл бесконечный лаги не вызывает у меня и работает стабильно . И по логике если цикл бесконечный то он проверяет всегда эту = или нет ( я про if ) , мне просто не понятно почему при считывании из памяти игры и потом проверки это значения толку 0 . Я хотел это реализовать типа проверку координат игрока и потом уже выполнение кода типа если ровно то это а если нет то будет то-то выполнено , а когда я вроде проверяю и значение одинаковы толку 0 . Я даже ставил промежуток между этими значениями типа проверку между 1 и 4 ( типа если равно 1 или 2 или 3 или 4) то код выполнится но нет . Ну у меня были предположение что иза того что значение флоат и типа оно плавает ( проще говоря с точкой ) то тогда можно же выполнить проверку денег и если оно верно то вывести на экран но и это тоже не хочет . Типа сама проблема в том что у меня не получается сделать проверку значения из адреса памяти ( if как будто его не читает ) . Код который ты дал я поправил ( там был старый мой косяк , указатели были не все заменены ) и вгрызся в игру ( заинжектил) то не чего не показало ( там должно было высветится типа подсказки ) . Потом поставив через CE значение на 100 и там и там и поменяв на 1-4 байт то толку не было ( менял для того что-бы убедится что точно не работает ) .
 

CleanLegend

Известный
Всефорумный модератор
477
935
  • Нравится
Реакции: Gafask

twixjr12s

Новичок
17
0
как сделать shadow by pass? как я понял в ShadowPlay можно не записывать рабочий стол и скрипт запускается от имени explorer'a или самого shadowplay, no kak?
 

Gafask

Участник
137
13
Попробуй так.
C++:
0xB7CE50 - адрес денег

if (*(DWORD*)0xB7CE50 == 100)

Еще можешь использовать вот этот плагин для логирования значений - https://blast.hk/threads/22179/
2.Cпасибо заработало , лайк поставил . А не подскажешь как можно еще реализовать это с 1-2 смещениями ? ( смещения адреса памяти )
 
Последнее редактирование:

CleanLegend

Известный
Всефорумный модератор
477
935
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 .

Выше в коде ты передаешь не адрес, а значение, получается $ у тебя имеет константу, которая задается один раз при инициализации, а при инициализации игры она скорее всего 0.

Можно сделать сразу так:
C++:
if (*(DWORD*)(0xB6F5F0 +0x756)== 100)
Либо передать указатель и потом его использовать из свое переменной:
C++:
DWORD *money = (DWORD*)(0xB6F5F0 +0x756)
if ((DWORD*)money == 100)
 
  • Нравится
Реакции: Gafask

Gafask

Участник
137
13
Выше в коде ты передаешь не адрес, а значение, получается $ у тебя имеет константу, которая задается один раз при инициализации, а при инициализации игры она скорее всего 0.

Можно сделать сразу так:
C++:
if (*(DWORD*)(0xB6F5F0 +0x756)== 100)
Либо передать указатель и потом его использовать из свое переменной:
C++:
DWORD *money = (DWORD*)(0xB6F5F0 +0x756)
if ((DWORD*)money == 100)
Вроде написал все верно , проверил но почему значение не верное (( не true) код уходит всегда на else ). Написал без указателей .
Отрывок кода.cpp:
#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;
}
(я комментарии к коду пишу , если не надо то не буду больше . )
По логике все должно работать но почему то не хочет . И если я тебя понял если оно равно 0 при запуске игры и вить там цикл идет оно его всегда чекает каждый раз без остановки ( ну если не добавить проверка на клавиши ) или я вообще не понял того что ты сказал , но как мне кажется понял .
И насчет того asi плагина , не понимаю как он работает но при запуске сампа не чего не появляться или как мне кажется его надо в сингле юзать ?
 

CleanLegend

Известный
Всефорумный модератор
477
935
Вроде написал все верно , проверил но почему значение не верное (( не true) код уходит всегда на else ). Написал без указателей .
Отрывок кода.cpp:
            if (*(float*)(((0xB6F5F0) + 0x14) + 0x30) == 1903.640259f) {        // там я написал float а DWORD это 4 байт вроде как и он не подходит в моем случаее.
ты делаешь просто смещение, а надо через указатель. координаты находятся в матрице по указателю:

C++:
DWORD* CPED = (DWORD*)0xB6F5F0; // передаем адрес в наш указатель
DWORD* pMtrx = (DWORD*)((*CPED) + 0x14); //получаем указатель по адресу со смещением и также передаем его
float* PosX = (float*)((*pMtrx) + 0x30);


if (*PosX == 1000.0f)
в собейте есть структура актора - https://github.com/BlastHackNet/mod_s0beit_sa-1/blob/master/src/cheat.h#L412

структура 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]
 
  • Нравится
Реакции: Gafask

Gafask

Участник
137
13
ты делаешь просто смещение, а надо через указатель. координаты находятся в матрице по указателю:

C++:
DWORD* CPED = (DWORD*)0xB6F5F0; // передаем адрес в наш указатель
DWORD* pMtrx = (DWORD*)((*CPED) + 0x14); //получаем указатель по адресу со смещением и также передаем его
float* PosX = (float*)((*pMtrx) + 0x30);


if (*PosX == 1000.0f)
в собейте есть структура актора - https://github.com/BlastHackNet/mod_s0beit_sa-1/blob/master/src/cheat.h#L412

структура 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]
Спасибо , Просто я думал если я могу добавить к этому указателю += 1 ( пример) то все работало ну я и думал что если так работает значит и в if будет работать . Спасибо еще раз , не кто не мог помочь и описать и рассказать как ты )) , кого спрашивал либо игнорили либо говорили типа хз , ну или ряльно не знали . Как я понял в эту тему эффективнее писать чем просто создавать тему и там задавать вопрос . Лайк поставил .
 

Dark_Knight

Me, me and me.
Друг
4,078
2,095
Вроде написал все верно , проверил но почему значение не верное (( не true) код уходит всегда на else ). Написал без указателей .
Лучше используй 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;
}
 
  • Нравится
Реакции: Gafask

Gafask

Участник
137
13
Лучше используй 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;
}
По мне так то лучше )) . Я просто не знаю чем это лучше .
 

Сырник

Известный
222
77
#include <iostream>
#include <conio.h>
using namespace std;
void main();
{
setlocale(LC_ALL, "RUS");
int a, b, c;
b = 2019;
cout « "Введите год рождения»\n";
Cin » a;
c == b - a;
cout«"Ваш возраст »"«c;
}
почему не работает? ошибки на инклуды