- 34
- 17
The script was published by a Russian-speaking person, we only have a dozen servers where you need to press the Spawn button, usually the server-side code does everything for you, if it's normal.it's good but what if you have to press everytime spawn when you enter your password? Some servers do not require the SPAWN button to be pressed, while some do require it when the password is entered.
#include <windows.h>
#define PATCH_OFFSET 0x753F7
#define PATCH_BYTE 0x31
DWORD old = 0;
BYTE orig = 0;
BOOL WINAPI DllMain(HINSTANCE h, DWORD r, LPVOID) {
if (r == DLL_PROCESS_ATTACH) {
DisableThreadLibraryCalls(h);
HMODULE m = GetModuleHandleA("samp.dll");
if (m) {
LPVOID a = (BYTE*)m + PATCH_OFFSET;
orig = *(BYTE*)a;
VirtualProtect(a, 1, 0x40, &old);
*(BYTE*)a = PATCH_BYTE;
VirtualProtect(a, 1, old, &old);
}
} else if (r == DLL_PROCESS_DETACH) {
HMODULE m = GetModuleHandleA("samp.dll");
if (m) {
LPVOID a = (BYTE*)m + PATCH_OFFSET;
DWORD t;
VirtualProtect(a, 1, 0x40, &t);
*(BYTE*)a = orig;
VirtualProtect(a, 1, t, &t);
}
}
return 1;
}
видимо самп версия отличается, поэтому и не сработало. только если следовать по сурс коду
Закинуть файл в папку moonloader
Запускаю друна на r4, твоя тарантас машина не пых-пыхну типа:
И кнопки удалятсяLua:function emul_requestclass() local bs = raknetNewBitStream() raknetBitStreamWriteInt8(bs, 1) raknetBitStreamWriteInt8(bs, 0) raknetBitStreamWriteInt32(bs, 2) raknetBitStreamWriteInt8(bs, 0) raknetBitStreamWriteFloat(bs, 0) raknetBitStreamWriteFloat(bs, 0) raknetBitStreamWriteFloat(bs, 0) raknetBitStreamWriteFloat(bs, 0.0) raknetBitStreamWriteInt32(bs, 0) raknetBitStreamWriteInt32(bs, 0) raknetBitStreamWriteInt32(bs, 0) raknetBitStreamWriteInt32(bs, 0) raknetBitStreamWriteInt32(bs, 0) raknetBitStreamWriteInt32(bs, 0) raknetEmulRpcReceiveBitStream(128, bs) raknetDeleteBitStream(bs) end


А оригинальный .asi поддерживает все версии сампа?Запускаю друна на r4, твоя тарантас машина не пых-пых![]()
Я к тому, что это ебучий костыль. В оригинале достаточно добавить оффсеты с других версий. Чтобы завести это на r2, r4, r4-2 и, возможно, dl (хз, есть ли там SF), нужно перелопачивать весь SF. Раз уж даешь реализацию на муне, будь добр хотя бы писать адекватный код, а не этот костыль, который потом все дети будут брать себе. Делай мир лучше - пиши красивоА оригинальный .asi поддерживает все версии сампа?
у меня родная р1видимо самп версия отличается, поэтому и не сработало. только если следовать по сурс коду
#include "pch.h"
#include <unordered_map>
#include <string>
std::string sampVersion = "unknown";
BYTE orig = 0;
DWORD old = 0;
DWORD PATCHBYTE = 0x31;
uintptr_t patchOffset = 0;
struct sampversion {
std::string version;
uintptr_t offset;
};
std::unordered_map<uintptr_t, sampversion> sampVersions = {
{ 0x31DF13, { "0.3.7-R1", 0x714EF } },
{ 0x3195DD, { "0.3.7-R2", 0x7158F } },
{ 0xCC490, { "0.3.7-R3", 0x753F7 } },
{ 0xCC4D0, { "0.3.7-R3-1", 0x753F7 } },
{ 0xCBCB0, { "0.3.7-R4", 0x75B37 } },
{ 0xCBCD0, { "0.3.7-R4-2", 0x75B66 } },
{ 0xCBC90, { "0.3.7-R5", 0x75B06 } }
};
bool getSampVersion(HMODULE samp) {
char* base = reinterpret_cast<char*>(samp);
auto* dos = reinterpret_cast<IMAGE_DOS_HEADER*>(base);
auto* nt = reinterpret_cast<IMAGE_NT_HEADERS*>(base + dos->e_lfanew);
DWORD entryRVA = nt->OptionalHeader.AddressOfEntryPoint;
auto it = sampVersions.find(entryRVA);
if (it == sampVersions.end()) {
return false;
}
sampVersion = it->second.version;
patchOffset = it->second.offset;
return true;
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);
HMODULE samp = GetModuleHandleA("samp.dll");
if (samp and getSampVersion(samp)) {
LPVOID addr = (BYTE*)samp + patchOffset;
orig = *(BYTE*)addr;
VirtualProtect(addr, 1, PAGE_EXECUTE_READWRITE, &old);
*(BYTE*)addr = PATCHBYTE;
VirtualProtect(addr, 1, old, &old);
}
}
if (ul_reason_for_call == DLL_PROCESS_DETACH)
{
HMODULE samp = GetModuleHandleA("samp.dll");
if (samp and sampVersion != "unknown") {
LPVOID addr = (BYTE*)samp + patchOffset;
DWORD t;
VirtualProtect(addr, 1, PAGE_EXECUTE_READWRITE, &t);
*(BYTE*)addr = orig;
VirtualProtect(addr, 1, t, &t);
}
}
return TRUE;
}
ты простоПоддержка R1 R2 R3 R3-1 R4 R4-2 R5
C++:#include "pch.h" #include <unordered_map> #include <string> std::string sampVersion = "unknown"; BYTE orig = 0; DWORD old = 0; DWORD PATCHBYTE = 0x31; uintptr_t patchOffset = 0; struct sampversion { std::string version; uintptr_t offset; }; std::unordered_map<uintptr_t, sampversion> sampVersions = { { 0x31DF13, { "0.3.7-R1", 0x714EF } }, { 0x3195DD, { "0.3.7-R2", 0x7158F } }, { 0xCC490, { "0.3.7-R3", 0x753F7 } }, { 0xCC4D0, { "0.3.7-R3-1", 0x753F7 } }, { 0xCBCB0, { "0.3.7-R4", 0x75B37 } }, { 0xCBCD0, { "0.3.7-R4-2", 0x75B66 } }, { 0xCBC90, { "0.3.7-R5", 0x75B06 } } }; bool getSampVersion(HMODULE samp) { char* base = reinterpret_cast<char*>(samp); auto* dos = reinterpret_cast<IMAGE_DOS_HEADER*>(base); auto* nt = reinterpret_cast<IMAGE_NT_HEADERS*>(base + dos->e_lfanew); DWORD entryRVA = nt->OptionalHeader.AddressOfEntryPoint; auto it = sampVersions.find(entryRVA); if (it == sampVersions.end()) { return false; } sampVersion = it->second.version; patchOffset = it->second.offset; return true; } BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { if (ul_reason_for_call == DLL_PROCESS_ATTACH) { DisableThreadLibraryCalls(hModule); HMODULE samp = GetModuleHandleA("samp.dll"); if (samp and getSampVersion(samp)) { LPVOID addr = (BYTE*)samp + patchOffset; orig = *(BYTE*)addr; VirtualProtect(addr, 1, PAGE_EXECUTE_READWRITE, &old); *(BYTE*)addr = PATCHBYTE; VirtualProtect(addr, 1, old, &old); } } if (ul_reason_for_call == DLL_PROCESS_DETACH) { HMODULE samp = GetModuleHandleA("samp.dll"); if (samp and sampVersion != "unknown") { LPVOID addr = (BYTE*)samp + patchOffset; DWORD t; VirtualProtect(addr, 1, PAGE_EXECUTE_READWRITE, &t); *(BYTE*)addr = orig; VirtualProtect(addr, 1, t, &t); } } return TRUE; }