Как узнать, открыт ли чат в данный момент?
SF->getSamp()->getInput()->bEnabledКак узнать, открыт ли чат в данный момент?
По оффсету относительно базового адреса samp.dll вызвать функцию добавления сообщения в чатКак вывести в чат сообщение на чистых плюсах?
понял, но можно кодом?По оффсету относительно базового адреса samp.dll вызвать функцию добавления сообщения в чат
0.3.7-R3понял, но можно кодом?
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);
понял, но можно кодом?
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, загуглил, ничего не нашёл. только начинаю свой путь в с++ )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); }
DWORD dwSAMP = (DWORD)GetModuleHandle("samp.dll");Требуется объявление dwSAMP, загуглил, ничего не нашёл. только начинаю свой путь в с++ )
//пример
sendFake();
//задерка 100 милисекунд
sendFuck();
Sleep(100);Как сделать задержку перед отправкой пакета?
C++://пример sendFake(); //задерка 100 милисекунд sendFuck();
Разработчики, только перешедшие с клео\луа на 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!
Исходный код:
GitHub - allwanttokissme/coro_wait: Suspending coroutines by time
Suspending coroutines by time. Contribute to allwanttokissme/coro_wait development by creating an account on GitHub.github.com
хуки
sampapi
Где можно найти описание параметров RPC_InitGame?