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

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,633
2,479
понял, но можно кодом?
0.3.7-R3
C++:
uintptr_t CChatPtr = *reinterpret_cast<uintptr_t*>(0x26E8C8);

reinterpret_cast<void(__thiscall*)(uintptr_t ptr, uint32_t /*D3DCOLOR*/ color, const char* text)>(0x679F0)(CChatPtr, color, text);

Или:
 

kin4stat

mq-team
Всефорумный модератор
2,731
4,693
понял, но можно кодом?
C++:
constexpr auto SAMP_037_R1_CHAT_OFFSET = 0x21A0E4;
constexpr auto SAMP_037_R3_CHAT_OFFSET = 0x26E8C8;
constexpr auto SAMP_037_R1_ADDCHATMSG_FUNC = 0x64010;
constexpr auto SAMP_037_R3_ADDCHATMSG_FUNC = 0x67460;

inline void AddChatMessage_R1(int nType, const char* szText, const char* szPrefix, unsigned int textColor, unsigned int prefixColor) {
    using AddChatMsgProt = void (__thiscall*)(void*, int, const char*, const char*, unsigned int, unsigned int);
    auto pChat = *reinterpret_cast<void**>(dwSAMP + SAMP_037_R1_CHAT_OFFSET);
    return reinterpret_cast<AddChatMsgProt>(SAMP_037_R1_ADDCHATMSG_FUNC)(pChat, nType, szText, szPrefix, textColor, prefixColor);
}

inline void AddChatMessage_R3(int nType, const char* szText, const char* szPrefix, unsigned int textColor, unsigned int prefixColor) {
    using AddChatMsgProt = void (__thiscall*)(void*, int, const char*, const char*, unsigned int, unsigned int);
    auto pChat = *reinterpret_cast<void**>(dwSAMP + SAMP_037_R3_CHAT_OFFSET);
    return reinterpret_cast<AddChatMsgProt>(SAMP_037_R3_ADDCHATMSG_FUNC)(pChat, nType, szText, szPrefix, textColor, prefixColor);
}
 
  • Нравится
Реакции: ROBERT PUSHER

ROBERT PUSHER

Известный
305
212
C++:
constexpr auto SAMP_037_R1_CHAT_OFFSET = 0x21A0E4;
constexpr auto SAMP_037_R3_CHAT_OFFSET = 0x26E8C8;
constexpr auto SAMP_037_R1_ADDCHATMSG_FUNC = 0x64010;
constexpr auto SAMP_037_R3_ADDCHATMSG_FUNC = 0x67460;

inline void AddChatMessage_R1(int nType, const char* szText, const char* szPrefix, unsigned int textColor, unsigned int prefixColor) {
    using AddChatMsgProt = void (__thiscall*)(void*, int, const char*, const char*, unsigned int, unsigned int);
    auto pChat = *reinterpret_cast<void**>(dwSAMP + SAMP_037_R1_CHAT_OFFSET);
    return reinterpret_cast<AddChatMsgProt>(SAMP_037_R1_ADDCHATMSG_FUNC)(pChat, nType, szText, szPrefix, textColor, prefixColor);
}

inline void AddChatMessage_R3(int nType, const char* szText, const char* szPrefix, unsigned int textColor, unsigned int prefixColor) {
    using AddChatMsgProt = void (__thiscall*)(void*, int, const char*, const char*, unsigned int, unsigned int);
    auto pChat = *reinterpret_cast<void**>(dwSAMP + SAMP_037_R3_CHAT_OFFSET);
    return reinterpret_cast<AddChatMsgProt>(SAMP_037_R3_ADDCHATMSG_FUNC)(pChat, nType, szText, szPrefix, textColor, prefixColor);
}
Требуется объявление dwSAMP, загуглил, ничего не нашёл. только начинаю свой путь в с++ )
 

EclipsedFlow

Известный
Проверенный
1,040
459
Как сделать задержку перед отправкой пакета?
C++:
//пример
sendFake();
//задерка 100 милисекунд
sendFuck();
 

legendabrn

Известный
Проверенный
122
172
Как сделать задержку перед отправкой пакета?
C++:
//пример
sendFake();
//задерка 100 милисекунд
sendFuck();
Sleep(100);
но перед этим создай поток что бы не зафризило игру
или же
Разработчики, только перешедшие с клео\луа на C++ негодуют из-за необходимости использовать разного рода таймеры и лапшу из GetTickCount'ов вместо полюбившихся функций wait. Но особо ярых фанатов клео это не устраивает, отчего они начинают использовать потоки ради функций вроде Sleep для того чтобы не блокировать цикл игры. Однако это не безопасно. Функции ни GTA ни SAMP'а абсолютно не предназначены для использования в разных потоках и их использование может привести к рандомным крашам.

Выход есть!

Example:
#include <string>
#include <chrono>

#include "Yet-another-hook-library/hook.h"
#include "sampapi/CChat.h"

#include "coro_wait/coro_wait.h"

using namespace sampapi::v037r1;

void foo() {
    using namespace std::chrono_literals;
    CChat *&pChat = RefChat();

    while (!pChat) {
        this_coro::wait(100ms);
    }

    unsigned int counter = 0;
    while (true) {
        pChat->AddMessage(-1, (std::string("Hello ") + std::to_string(counter)).c_str());
        counter++;

        this_coro::wait(1s);
    }
}

void CGame_Process_hk() {
    static coro_wait instance{ foo };

    instance.process();
}

class coro_wait_example {
public:
    coro_wait_example() {
        using CGame_Process_t = void(__cdecl*)();
        CGame_Process_t CGame_Process = reinterpret_cast<CGame_Process_t>(0x53BEE0);

        static hook CGame_Process_hook(CGame_Process, CGame_Process_hk);
    }
} coro_wait_example;

Выполнение функции foo приостанавливается на время, переданное функции this_coro::wait, и продолжается с того же места. Все это работает в одном потоке, благодаря чему можно не переживать за потокобезопасность вызываемых внутри функций.
В бесконечных или очень больших циклах требуется вызывать wait(0), все по канонам клео.
Функция coro_wait::process должна вызываться в потоке игры (перехваченном как в примере, либо в функции mainloop для SF API).

Требуется библиотека Boost.Context!

Исходный код:


хуки
sampapi
 
  • Нравится
Реакции: Vintik
У

Удалённый пользователь 123482

Гость
В какой адрес пишет опкод 0B56: set_game_key 1@ state 2@ или какую функцию вызывает