Приветствую! Недавно пришла идея реализации проектов, придерживясь следующего концепта:
Сюда решил опубликовать мини тему с примером подобной реализации, возможно кому-то понадобится.
Было бы неплохо прочитать какие-нибудь сообщения с критикой касаемо этой идеи, например как можно реализовать лучше.
Пример реализации:
- C++ реализация функционала, систем и прочее
- LUA реализация визуальной части (различные менюшки)
- LUA почти ничем не ограничивает в создании меню, но процесс заметно проще (лично мне не нравится разработка меню и я считаю это душным процессом, но по крайней мере сделать это на LUA куда быстрее чем на C++)
- На LUA банально больше разработчиков в GTA SA:MP, а также сам форум имеет множество различных решений именно на LUA.
Благодаря этому можно легко разрабатывать совместный проект на двух ЯП даже не задумываясь за часть второго разработчика. - Отчасти модульность(если это можно так назвать =D)
Сюда решил опубликовать мини тему с примером подобной реализации, возможно кому-то понадобится.
Было бы неплохо прочитать какие-нибудь сообщения с критикой касаемо этой идеи, например как можно реализовать лучше.
Пример реализации:
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
Последнее редактирование: