в sampapi возможно создавать свой кастомный диалог? если да каким образом это реализуется ?
#include "sampapi/CDialog.h"
sampapi::v037r3::RefDialog()-Show(1488, 2, "Title", "Hello", "Ok", "Sosat", false);
При загрузке плагина добавь проверку наличия "ключа" в строке запуска сампа, при наличии твоего IP будет выполнятся функция, если же его не будет то самп запустится как обычно.как можно реализовать привязку сервера, например если подключаешься на IP 127.0.0.1:7777, то будет выводиться определенная функция, а если на другой IP то ничего не будет
BOOL APIENTRY DllEntryPoint(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
if (dwReasonForCall == DLL_PROCESS_ATTACH) {
DisableThreadLibraryCalls(hModule);
TCHAR* cmdline = GetCommandLine();
if (StrStr(cmdline, "127.0.0.1:7777")) {
// ТУТ ТВОЙ КОД
}
}
return TRUE;
LoadLibrary("samp.dll");
}
как можно реализовать привязку сервера, например если подключаешься на IP 127.0.0.1:7777, то будет выводиться определенная функция, а если на другой IP то ничего не будет
Можно хукнуть метод RakClient, отвечающий за подключение к серверуПри загрузке плагина добавь проверку наличия "ключа" в строке запуска сампа, при наличии твоего IP будет выполнятся функция, если же его не будет то самп запустится как обычно.
с++:BOOL APIENTRY DllEntryPoint(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved) { if (dwReasonForCall == DLL_PROCESS_ATTACH) { DisableThreadLibraryCalls(hModule); TCHAR* cmdline = GetCommandLine(); if (StrStr(cmdline, "127.0.0.1:7777")) { // ТУТ ТВОЙ КОД } } return TRUE; LoadLibrary("samp.dll"); }
#include "kthook/kthook.hpp"
using RakClientConnect_t = bool(__thiscall*)(void* pRakClient, const char* host, unsigned short serverPort, unsigned short clientPort, unsigned int depreciated, int threadSleepTimer);
kthook::kthook_simple<RakClientConnect_t>(RakClientConnectHook);
bool RakClientConnectHooked(const decltype(RakClientConnectHook)& hook, void* pRakClient, const char* host, unsigned short serverPort, unsigned short clientPort, unsigned int depreciated, int threadSleepTimer)
{
if (strcmp(host, "127.0.0.1") == 0))
std::cout << "Ochko anus rvat ebat" << std::endl;
else
std::cout << "Ne chunazes" << std::endl;
return hook.get_trampoline()(pRakClient, host, serverPort, clientPort, depreciated, threadSleepTimer);
}
auto SAMPHandle = reinterpret_cast<std::uintptr_t>(GetModuleHandle("samp.dll"));
RakClientConnectHook.set_cb(&RakClientHooked);
RakClientConnectHook.set_dest(SAMPHandle + 0x339F0); // R3
RakClientConnectHook.install();
а через rakclient можно создать коннект на другой айпи ?Можно хукнуть метод RakClient, отвечающий за подключение к серверу
C++:#include "kthook/kthook.hpp" using RakClientConnect_t = bool(__thiscall*)(void* pRakClient, const char* host, unsigned short serverPort, unsigned short clientPort, unsigned int depreciated, int threadSleepTimer); kthook::kthook_simple<RakClientConnect_t>(RakClientConnectHook); bool RakClientConnectHooked(const decltype(RakClientConnectHook)& hook, void* pRakClient, const char* host, unsigned short serverPort, unsigned short clientPort, unsigned int depreciated, int threadSleepTimer) { if (strcmp(host, "127.0.0.1") == 0)) std::cout << "Ochko anus rvat ebat" << std::endl; else std::cout << "Ne chunazes" << std::endl; return hook.get_trampoline()(pRakClient, host, serverPort, clientPort, depreciated, threadSleepTimer); } auto SAMPHandle = reinterpret_cast<std::uintptr_t>(GetModuleHandle("samp.dll")); RakClientConnectHook.set_cb(&RakClientHooked); RakClientConnectHook.set_dest(SAMPHandle + 0x339F0); // R3 RakClientConnectHook.install();
Еще к примеру можно хукать какую-нибудь функцию из winsock (получать адрес экпортируемой функции из Ws2_32.dll), но тогда есть вероятность. то функция вызвана не из samp.dll, а например из какого-то плагина
на любой можноа через rakclient можно создать коннект на другой айпи ?
Если я правильно понимаю, ты хочешь изменить айпи при подключении в сампе?а через rakclient можно создать коннект на другой айпи ?
using NetGameConnect_t = int(__thiscall*)(std::uintptr_t* netgame);
kthook::kthook_simple<NetGameConnect_t> NetGameConnectHook;
// r3
NetGameConnectHook.set_dest(reinterpret_cast<std::uintptr_t>(GetModuleHandleA("samp.dll")) + 0x85D0);
NetGameConnectHook.set_cb([](const decltype(NetGameConnectHook)& hook, std::uintptr_t* netgame)
{
char* host = reinterpret_cast<char*>(*netgame + 0x30);
strcpy(host, "127.0.0.1");
*reinterpret_cast<int*>(*netgame + 0x235) = 7777;
return hook.get_trampoline()(netgame);
});
NetGameConnectHook.install();
крашит, при попытке подключенияЕсли я правильно понимаю, ты хочешь изменить айпи при подключении в сампе?
Тогда ты можешь делать что-то типа такого
C++:using NetGameConnect_t = int(__thiscall*)(std::uintptr_t* netgame); kthook::kthook_simple<NetGameConnect_t> NetGameConnectHook; // r3 NetGameConnectHook.set_dest(reinterpret_cast<std::uintptr_t>(GetModuleHandleA("samp.dll")) + 0x85D0); NetGameConnectHook.set_cb([](const decltype(NetGameConnectHook)& hook, std::uintptr_t* netgame) { char* host = reinterpret_cast<char*>(*netgame + 0x30); strcpy(host, "127.0.0.1"); *reinterpret_cast<int*>(*netgame + 0x235) = 7777; return hook.get_trampoline()(netgame); }); NetGameConnectHook.install();
float distance = bet.Length();
if (distance >= 10)
{
bet.Normalize();
c.fX += bet.fX * 3;
c.fY += bet.fY * 3;
c.fZ += bet.fZ * 3;
sendVehicle(c);
AddMessageJumpQ(reinterpret_cast<char*>(distance), 1500, 12, true);
time = GetTickCount();
}
std::to_string{distance}.c_str()выдаёт ошибку: недопустимое преобразование типа.C++:float distance = bet.Length(); if (distance >= 10) { bet.Normalize(); c.fX += bet.fX * 3; c.fY += bet.fY * 3; c.fZ += bet.fZ * 3; sendVehicle(c); AddMessageJumpQ(reinterpret_cast<char*>(distance), 1500, 12, true); time = GetTickCount(); }
помогите решить пж
std::to_string{distance}.c_str()