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

CleanLegend

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

Известный
Всефорумный модератор
476
929
Вроде написал все верно , проверил но почему значение не верное (( не 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,062
2,078
Вроде написал все верно , проверил но почему значение не верное (( не 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;
}
По мне так то лучше )) . Я просто не знаю чем это лучше .
 

Сырник

Известный
225
80
#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;
}
почему не работает? ошибки на инклуды
 

Stiopko

Известный
Проверенный
307
218
  • Нравится
Реакции: Сырник

Stiopko

Известный
Проверенный
307
218
Там ошибки на нклуды идут, типа их нету.
Можешь дать свой вк еще?
убери из инклудов conio.h, не нужно и его походу нету в стандарте, но это не точно, насчет вк сорян не сижу там давно, в 2021 или 2020 разблокируют
 
  • Нравится
Реакции: Сырник

Сырник

Известный
225
80
убери из инклудов conio.h, не нужно и его походу нету в стандарте, но это не точно, насчет вк сорян не сижу там давно, в 2021 или 2020 разблокируют
6:11: error: '::main' must return 'int'
7:1: error: expected unqualified-id before '{' token
теперь такое