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

damag

Женюсь на официантке в моем любимом баре
Проверенный
1,152
1,192
Как sleep() сделать в цикле, просто когда юзаю sleep игра зависает...
 

traceattack

Известный
218
119
Как sleep() сделать в цикле, просто когда юзаю sleep игра зависает...
Новый поток создай и в нем уже используй sleep
а чё за

int AlmostMain ( int argc, char ** argv )
{

int C = 2019;
//C++;
size_t _( &C != &C );
for(;C&(_=(_?_<<(C!=~C):(C==C)));C&=~_){}
C|=_;

}
Инкремент переменной C на 1
 
Последнее редактирование:

Adder

Известный
22
0
Возможно ли определить примерные координаты прицеливания игрока?
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,133
Всем привет 👋

Есть нужда в создании плагина, который бы запускался на всех последних версиях SAMP, а значит возможность написания SF плагина сразу отпадает. Собственно, в C++ я новичок, можно сказать, но всё равно попытался всё сделать сам - ничего не получилось, по итогам тестирования было установлено, что игра офигевает от происходящего и крашится. Мои цели в данный момент достаточно простые - заставить ASI плагин выводить сообщение в чат после инициализации SAMP'a.

Пожалуйста, не нужно советовать различные ASI Framework - это не то, что мне нужно. Помогите разобраться с тем, как это работает в идеале, пожалуйста.

main.cpp:
#include "main.h"

void MainThread()
{
    do {
        samp.dwModule = (DWORD)GetModuleHandle(L"samp.dll");
    } while (!samp.dwModule);
    do {
        Sleep(1);
    } while (IsSampInit() != TRUE);
    Sleep(2500);
    AddChatMessage("Hello world!");
}

BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved)
{
    switch (dwReason)
    {
    case DLL_PROCESS_ATTACH:
    {
        DisableThreadLibraryCalls(hModule);
        _beginthread((_beginthread_proc_type)MainThread, NULL, NULL);
        break;
    }
    }
}
main.h:
#pragma once
#include <Windows.h>
#include <iostream>
#include <string>
#include <process.h>
#include <stdio.h>

struct SAMPStruct
{
    DWORD dwModule;
} samp;

struct SAMPOffsets
{
    DWORD registerClientCommand = 0x65AC0;
    DWORD addChatMessage = 0x64520;
} offset;

bool IsSampInit()
{
    return ((bool(__thiscall *)())(samp.dwModule + 0x9BF70))();
}

void RegisterChatCommand(const char *command, void *function)
{
    ((void(__thiscall *)(DWORD str, const char* cmd, void* func))(samp.dwModule + offset.registerClientCommand))(*(DWORD*)(samp.dwModule + 0x21A0E8), command, function);
}

void AddChatMessage(const char *message)
{
    ((void(__thiscall *)(DWORD str, const char* text))(samp.dwModule + offset.addChatMessage))(*(DWORD*)(samp.dwModule + 0x21A0E4), message);
}
Warning! Указатели, находящиеся в моём коде неправильные. Всё, что они Вам дадут - краш игры.
 
Последнее редактирование:

Roger571

Известный
58
31
Всем привет 👋

Есть нужда в создании плагина, который бы запускался на всех последних версиях SAMP, а значит возможность написания SF плагина сразу отпадает. Собственно, в C++ я новичок, можно сказать, но всё равно попытался всё сделать сам - ничего не получилось, по итогам тестирования было установлено, что игра офигевает от происходящего и крашится. Мои цели в данный момент достаточно простые - заставить ASI плагин выводить сообщение в чат после инициализации SAMP'a.

Пожалуйста, не нужно советовать различные ASI Framework - это не то, что мне нужно. Помогите разобраться с тем, как это работает в идеале, пожалуйста.

main.cpp:
#include "main.h"

void MainThread()
{
    do {
        samp.dwModule = (DWORD)GetModuleHandle(L"samp.dll");
    } while (!samp.dwModule);
    do {
        Sleep(1);
    } while (IsSampInit() != TRUE);
    Sleep(2500);
    AddChatMessage("Hello world!");
}

BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved)
{
    switch (dwReason)
    {
    case DLL_PROCESS_ATTACH:
    {
        DisableThreadLibraryCalls(hModule);
        _beginthread((_beginthread_proc_type)MainThread, NULL, NULL);
        break;
    }
    }
}
main.h:
#pragma once
#include <Windows.h>
#include <iostream>
#include <string>
#include <process.h>
#include <stdio.h>

struct SAMPStruct
{
    DWORD dwModule;
} samp;

struct SAMPOffsets
{
    DWORD registerClientCommand = 0x65AC0;
    DWORD addChatMessage = 0x64520;
} offset;

bool IsSampInit()
{
    return ((bool(__thiscall *)())(samp.dwModule + 0x9BF70))();
}

void RegisterChatCommand(const char *command, void *function)
{
    ((void(__thiscall *)(DWORD str, const char* cmd, void* func))(samp.dwModule + offset.registerClientCommand))(*(DWORD*)(samp.dwModule + 0x21A0E8), command, function);
}

void AddChatMessage(const char *message)
{
    ((void(__thiscall *)(DWORD str, const char* text))(samp.dwModule + offset.addChatMessage))(*(DWORD*)(samp.dwModule + 0x21A0E4), message);
}
Определяй версию сампа при загрузке плагина и уже после инициализируй оффсеты для конкретной версии. Пример определения посмотри в собейте, основан на проверке массива байт
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,133
Определяй версию сампа при загрузке плагина и уже после инициализируй оффсеты для конкретной версии. Пример определения посмотри в собейте, основан на проверке массива байт
Посмотри исходный код под спойлером, там есть всё, кроме определения, но оно даже так не работает. Там явно где-то есть ошибка, но я её не вижу.
 

Roger571

Известный
58
31
Посмотри исходный код под спойлером, там есть всё, кроме определения, но оно даже так не работает. Там явно где-то есть ошибка, но я её не вижу.
Проблема в прототипе функции.
C++:
void AddChatMessage(const char *message)
{
    ((void(__cdecl *)(DWORD str, const char* text, ...))(samp.dwModule + offset.addChatMessage))(*(DWORD*)(samp.dwModule + 0x21A0E4), message);
}
 
  • Нравится
Реакции: Pakulichev

mrdiimax

Известный
566
79
Как через .exe C++ получить уровень хп игрока? К примеру, через Read Process Memory