LUA front | C++ back

g305noobo

Известный
Автор темы
210
184
Приветствую! Недавно пришла идея реализации проектов, придерживясь следующего концепта:
  • C++ реализация функционала, систем и прочее
  • LUA реализация визуальной части (различные менюшки)
Зачем это нужно?
  1. LUA почти ничем не ограничивает в создании меню, но процесс заметно проще (лично мне не нравится разработка меню и я считаю это душным процессом, но по крайней мере сделать это на LUA куда быстрее чем на C++)
  2. На LUA банально больше разработчиков в GTA SA:MP, а также сам форум имеет множество различных решений именно на LUA.
    Благодаря этому можно легко разрабатывать совместный проект на двух ЯП даже не задумываясь за часть второго разработчика.
  3. Отчасти модульность(если это можно так назвать =D)

Сюда решил опубликовать мини тему с примером подобной реализации, возможно кому-то понадобится.
Было бы неплохо прочитать какие-нибудь сообщения с критикой касаемо этой идеи, например как можно реализовать лучше.

Пример реализации:
1709881143770.png

C++:
#include <iostream>
#include <windows.h>
#include "minhook/include/MinHook.h"

class asi_plugin {
public:
    bool is_enabled() {
        return enabled;
    }
    void toggle() {
        enabled = !enabled;
    }

    float get_hp() {
        void* p_player = get_local_player();
        return *reinterpret_cast<float*>(reinterpret_cast<std::uintptr_t>(p_player) + 0x540);
    }
    void set_hp(float hp) {
        void* p_player = get_local_player();
        *reinterpret_cast<float*>(reinterpret_cast<std::uintptr_t>(p_player) + 0x540) = hp;
    }

private:
    void* get_local_player() {
        return *reinterpret_cast<void**>(0xB6F5F0U);
    }
    bool enabled = true;
}plugin;

#define EXPORT extern "C" __declspec(dllexport)
EXPORT bool is_enabled() {
    return plugin.is_enabled();
}
EXPORT void toggle() {
    return plugin.toggle();
}
EXPORT float get_hp() {
    return plugin.get_hp();
}
EXPORT void set_hp(float hp) {
    return plugin.set_hp(hp);
}

using ctimer_t = void(__cdecl*)();
ctimer_t ctimer;
void __cdecl ctimer_hooked() {
    if (is_enabled() && get_hp() <= 50)
        set_hp(100);

    ctimer();
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
    switch (dwReason)
    {
    case DLL_PROCESS_ATTACH:
        MH_Initialize();
        MH_CreateHook(reinterpret_cast<void*>(0x561B10), &ctimer_hooked, reinterpret_cast<void**>(&ctimer));
        MH_EnableHook(reinterpret_cast<void*>(0x561B10));
        break;
    case DLL_PROCESS_DETACH:
        MH_RemoveHook(reinterpret_cast<void*>(0x561B10));
        break;
    }
    return TRUE;
}
Lua:
-- подключаем приватки o_o
local imgui = require 'imgui'
local key = require 'vkeys'
local ffi = require 'ffi'

local window = imgui.ImBool(false)

-- определяем функции из плагина
ffi.cdef[[
bool is_enabled();
void toggle();
void set_hp(float hp);
]]
local asi = ffi.load("aboba.asi") -- получаем указатель на плагин

function main()
    while true do
        wait(0)

        if wasKeyPressed(key.VK_K) then
            window.v = not window.v
        end
 
        imgui.Process = window.v
    end
end

function imgui.get_bool(bool)
    return imgui.ImBool(bool)
end

function imgui.OnDrawFrame()
    if window.v then
        imgui.SetNextWindowSize(imgui.ImVec2(150, 100), imgui.Cond.FirstUseEver)
        imgui.Begin('Menu')

        if imgui.Checkbox("AutoHeal", imgui.get_bool(asi.is_enabled())) then
            asi.toggle()

            local msg = asi.is_enabled() and "AutoHeal enabled" or "AutoHeal disabled"
            sampAddChatMessage(msg, -1)
        end
        if imgui.Button('Random HP') then
            asi.set_hp(math.random(1, 100))
        end
        imgui.End()
    end
end
 
Последнее редактирование:

Fott

Простреленный
3,431
2,270
LUA почти ничем не ограничивает в создании меню на ImGui, но процесс заметно проще (лично мне не нравится разработка меню и я считаю это душным процессом, но по крайней мере сделать это на LUA куда быстрее чем на C++
Ограничивает версией, а соответственно функционалом. В мимгуи 1.72 версия,а на спп актуальная 1.90.4 на данный момент. Ну а если брать имгуи с твоего примера то вообще ужас, там 1.52 версия