Коллизия с SF на Lua

rafo420

Активный
Автор темы
105
51
Версия MoonLoader
Другое
Всех приветствую. Недавно мне понадобился кусок кода (дабы вставить его в свой скрипт) который позволит проходить сквозь стены, сооружения ,и тп. Проще маппинг игры.
Очень долго искал нужный мне скрипт, но нашел только СФ плагин.
Т.к. я не шарю за 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;
}
 

rafo420

Активный
Автор темы
105
51
мне надо что то по типу "collision.build" из того плагина, а тут только "collision.object"
 
  • Эм
Реакции: wojciech?