RenderScreenBuffer - простенькая библиотека на C++ для получения буфера окна в качестве текстуры для рендера.
Исходный код: GitHub
Имеет как CAPI, так и полноценный API C++ библиотеки, которую при необходимости вы можете подключить свой проект. На все том же CAPI реализована обертка для Lua, таким образом можно использовать внутри MoonLoader.
Первое, что приходит на ум - рендер окна игры внутри окна ImGui:
Исходный код: GitHub
Имеет как CAPI, так и полноценный API C++ библиотеки, которую при необходимости вы можете подключить свой проект. На все том же CAPI реализована обертка для Lua, таким образом можно использовать внутри MoonLoader.
Первое, что приходит на ум - рендер окна игры внутри окна ImGui:
Lua:
local RenderScreenBuffer = require("RenderScreenBuffer")
local imgui = require("mimgui")
local renderer = nil
function main()
-- Аргументы: minX, minY, maxX, maxY
renderer = RenderScreenBuffer:new(100, 100, 200, 200)
--[[
Fullscreen:
renderer = RenderScreenBuffer:new()
]]
end
imgui.OnInitialize(function()
imgui.GetIO().IniFilename = nil
end)
imgui.OnFrame(
function() return true end,
function(player)
local sizeX, sizeY = getScreenResolution()
imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
imgui.SetNextWindowSize(imgui.ImVec2(500, 500), imgui.Cond.FirstUseEver)
imgui.Begin("Main Window")
if renderer ~= nil then
local texture = renderer:get()
if texture then
imgui.Image(texture, imgui.ImVec2(100, 100))
end
end
imgui.End()
end
)
Но никто не мешает делать более интересные штуки, к примеру, скриншоты игры:
Lua:
local RenderScreenBuffer = require("RenderScreenBuffer")
local ffi = require("ffi")
ffi.cdef [[
long D3DXSaveTextureToFileA(
const char* pDestFile,
int DestFormat,
void* pSrcTexture,
const void *pSrcPalette
);
]]
local d3dx9 = ffi.load(("%s\\d3dx9_25.dll"):format(getFolderPath(0x25)))
function main()
local renderer = RenderScreenBuffer:new(100, 100, 200, 200)
while not isSampAvailable() do wait(0) end
sampRegisterChatCommand("ts", function()
local path = [[C:\Users\egaaa\OneDrive\Рабочий стол\test.png]]
d3dx9.D3DXSaveTextureToFileA(path, 3, renderer:get(), nil)
sampAddChatMessage("TakeScreenshot", -1)
end)
end
Установка для MoonLoader: разархивировать содержимое архива в папку moonloader/lib