- 105
- 51
- Версия MoonLoader
- Другое
Всех приветствую. Недавно мне понадобился кусок кода (дабы вставить его в свой скрипт) который позволит проходить сквозь стены, сооружения ,и тп. Проще маппинг игры.
Очень долго искал нужный мне скрипт, но нашел только СФ плагин.
Т.к. я не шарю за C/C++ , я решил попросить помощи у вас!
Пожалуйста, перепишите на lua "collision.build" из этого плагина
Заранее выражаю огромную благодарность, всем кто хоть как то мне попытался помочь!
Очень долго искал нужный мне скрипт, но нашел только СФ плагин.
Т.к. я не шарю за C/C++ , я решил попросить помощи у вас!
Пожалуйста, перепишите на lua "collision.build" из этого плагина
Заранее выражаю огромную благодарность, всем кто хоть как то мне попытался помочь!
C++:
#include "main.h"
struct
{
bool active = false;
}gui;
struct
{
bool active = false;
bool player = false;
bool vehicle = false;
bool object = false;
bool build = false;
} collision;
bool CALLBACK Present(CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion)
{
if (SUCCEEDED(SF->getRender()->BeginRender()))
{
ImGui_ImplDX9_NewFrame();
ImGui_ImplWin32_NewFrame();
ImGui::NewFrame();
if (gui.active)
{
ImVec2 menu_center(ImGui::GetIO().DisplaySize.x * 0.5f, ImGui::GetIO().DisplaySize.y * 0.5f);
ImGui::SetNextWindowPos(menu_center, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f));
ImGui::SetNextWindowSize(ImVec2(180.0, 236.0));
if (ImGui::Begin(u8"NoCollision R3", &gui.active, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize))
{
ImGui::PushFont(font15);
ImGui::Checkbox(u8"Игроки", &collision.player);
ImGui::Checkbox(u8"Транспорт", &collision.vehicle);
ImGui::Checkbox(u8"Объекты", &collision.object);
ImGui::Checkbox(u8"Сооружения [exp]", &collision.build);
ImGui::Separator();
ImGui::Checkbox(u8"Активировать", &collision.active);
ImGui::Separator();
ImGui::PushFont(font13);
ImGui::SetCursorPosX((ImGui::GetWindowWidth() - ImGui::CalcTextSize(u8"NoCollision by FYP").x) / 2);
ImGui::TextDisabled(u8"NoCollision by FYP");
ImGui::SetCursorPosX((ImGui::GetWindowWidth() - ImGui::CalcTextSize(u8"Remade [R3] by Scar").x) / 2);
ImGui::TextDisabled(u8"Remade [R3] by Scar");
ImGui::PopFont();
ImGui::PopFont();
ImGui::End();
}
}
ImGui::EndFrame();
ImGui::Render();
ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
SF->getRender()->EndRender();
}
return true;
}
void CreateJump(BYTE* pAddress, DWORD dwJumpTo, DWORD dwLen)
{
DWORD dwOldProtect, dwBkup, dwRelAddr;
VirtualProtect(pAddress, dwLen, PAGE_EXECUTE_READWRITE, &dwOldProtect);
dwRelAddr = (DWORD)(dwJumpTo - (DWORD)pAddress) - 5;
*pAddress = 0xE9;
*((DWORD*)(pAddress + 0x1)) = dwRelAddr;
for (DWORD x = 0x5; x < dwLen; x++)*(pAddress + x) = 0x90;
VirtualProtect(pAddress, dwLen, dwOldProtect, &dwBkup);
return;
}
void WriteMemory(void* address, void* bytes, int byteSize)
{
DWORD NewProtection;
VirtualProtect(address, byteSize, PAGE_EXECUTE_READWRITE, &NewProtection);
memcpy(address, bytes, byteSize);
VirtualProtect(address, byteSize, NewProtection, &NewProtection);
}
bool CollisionCheck(object_base* obj1, object_base* obj2)
{
return (obj2->nType == 3 || obj2->nType == 2) &&
((obj1->nType == 2 && collision.vehicle) ||
(obj1->nType == 3 && collision.player) ||
(obj1->nType == 4 && collision.object));
}
void __declspec (naked) HOOK_PlayerCollision(void)
{
static object_base* _obj1, * _obj2;
static DWORD RETURN_ovrwr = 0x54CEFC, RETURN_process = 0x0054BCF4, RETURN_noProcessing = 0x54CF8D;
__asm
{
jz hk_PlCol_process
jmp RETURN_ovrwr
}
hk_PlCol_process:
__asm
{
pushad
mov _obj2, esi // processing collision of *_info (esi)
mov _obj1, edi // with *_info (edi)
}
// process collision if cheat not enabled
if (!collision.active)
goto hk_PlCol_processCol;
// already crashed, if true
if (_obj1 == nullptr || _obj2 == nullptr)
goto hk_PlCol_noCol;
// check for disable collision
if (CollisionCheck(_obj1, _obj2))
goto hk_PlCol_noCol;
if (collision.build)
{
__asm popad;
__asm jmp RETURN_ovrwr
}
hk_PlCol_processCol:
__asm popad
__asm jmp RETURN_process
hk_PlCol_noCol :
__asm popad
__asm jmp RETURN_noProcessing
}
void InstallNakedHooks(void) {
CreateJump((BYTE*)0x0054BCEE, (DWORD)&HOOK_PlayerCollision, 6U);
}
void InstallCollisionHook(void) {
CreateJump((BYTE*)0x0054BCEE, (DWORD)&HOOK_PlayerCollision, 6U);
}
void RemoveCollisionHook(void) {
WriteMemory((void*)0x0054BCEE, (BYTE*)"\x0F\x85\x08\x12\x00\x00", 6U);
}
void __stdcall mainloop()
{
static bool initialized = false;
if (!initialized)
{
if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
{
imguiInit(); // Инцииализация ImGui
SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_PRESENT, Present);
SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_RESET, Reset);
SF->getGame()->registerWndProcCallback(SFGame::MEDIUM_CB_PRIORITY, WndProcHandler);
SF->getGame()->registerGameDestructorCallback(DestructorPlugin);
InstallCollisionHook();
SF->getSAMP()->getChat()->AddChatMessage(0xFFFFFFFF, "{1895ac}[NoCollision]: {EAEAEA}Загружен");
SF->getSAMP()->getChat()->AddChatMessage(0xFFFFFFFF, "{1895ac}[NoCollision]: {EAEAEA}Автор {1895ac}FYP {EAEAEA}переделал {1895ac}Scar");
SF->getSAMP()->registerChatCommand("col", [](string) {
gui.active ^= true;
});
initialized = true;
}
}
if (menustate != gui.active) {
SF->getSAMP()->getMisc()->ToggleCursor(gui.active);
menustate = gui.active;
}
if (SF->getGame()->isKeyDown('N') && SF->getGame()->isKeyPressed('C') || SF->getGame()->isKeyPressed('N') && SF->getGame()->isKeyDown('C'))
{
gui.active ^= true;
}
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
if (dwReasonForCall == DLL_PROCESS_ATTACH)
SF->initPlugin(mainloop, hModule);
else if (dwReasonForCall == DLL_PROCESS_DETACH)
RemoveCollisionHook();
return TRUE;
}