Полезные сниппеты и функции

Startracker983274

Известный
43
122
Описание: получает состояние DriveBy игрока (вылез ли из окна с оружием) по его ID. Для корректной работы игрок должен находиться в зоне прорисовки.

Код:
Lua:
function isPlayerDriveBy(playerId)
    if playerId ~= nil then
        local data = allocateMemory(24)
        sampStorePlayerPassengerData(playerId, data)
        local state = bit.rshift(getStructElement(data, 2, 1, false), 6)
        freeMemory(data)
        return (state == 1 and true)
    end
    return false
end

Пример использования:
Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    repeat wait(0) until isSampAvailable()
    while true do
        wait(0)
        if isCharInAnyCar(PLAYER_PED) then
            printStringNow(tostring(isPlayerDriveBy(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))), 1000)
        end
    end
end
 

Andrinall

Известный
701
518
Описание: Рисует часть окружности или окружность целиком с неким "свечением". Данный способ и быстрее(за счёт значительного снижения кол-ва вершин) и приятнее глазу, чем простой флуд кучей линий с угасанием цвета. Не уверен что это кому-то вообще нужно, может кто-то придумает интереснее и с меньшим кол-вом костылей, но пусть будет.

Пришлось костылить, чтобы не было такой шляпы при отрисовке полной окружности:
изображение_2023-09-05_175400849.pngизображение_2023-09-05_175443060.png

Важно: glowSize всегда должен быть меньше radius, иначе случится графическая жепа.
изображение_2023-09-05_184602712.png изображение_2023-09-05_184627678.png
Lua:
--- Draw curve with inner or outer glow
--- @param drawList     ImDrawList
--- @param position     ImVec2                    - position for centre
--- @param first        number|float (in radians) - start point for curve
--- @param last         number|float (in radians) - last point for curve
--- @param radius       number|float              - radius of shape
--- @param glowSize     number|float              - thickness for glow curve, must be smaller then radius
--- @param color        number(U32)|ImVec4        - color for main curve and glow curve
--- @param thickness    number                    - thickness for main curve
--- @param num_segments number|nil                - number of curve segments(imgui default 10, function default ( radius - glowSize / 4 ))
--- @param isInner      bool|nil                  - defines inner or outer glow. nil or true - inner, false - outer
function drawCurveWithGlow(drawList, position, first, last, radius, glowSize, color, thickness, num_segments, isInner)
    local function getDistance(p1, p2) return ((p2.x-p1.x)^2+(p2.y-p1.y)^2)^0.5 end

    local rd     = (radius - glowSize / 4)
    color        = type(color) == 'number' and imgui.ColorConvertU32ToFloat4(color) or color
    num_segments = (num_segments and (num_segments < rd and rd or num_segments) or rd)
    isInner      = (isInner == nil and true or isInner)
    local temp_alpha  = color.w
    local glow_radius = (radius - (isInner and (glowSize / 2) or -(glowSize / 2)))
    local vtxstart    = drawList.VtxBuffer.Size
    local f2, l2 = 
        ((last == math.pi*2 and first == 0) and first or ((last == 0 and first == math.pi*2) and first - math.rad(14) or first)),
        ((last == 0 and first == math.pi*2) and last  or ((last == math.pi*2 and first == 0) and last - math.rad(14)  or last))
    drawList:PathArcTo(position, glow_radius, f2, l2, num_segments)
    drawList:PathStroke(0xFFFFFFFF, (last == math.pi*2 and first == 0) or (last == 0 and first == math.pi*2), glowSize)
    drawList:PathClear()
    local vtxend = drawList.VtxBuffer.Size

    for idx = vtxstart, vtxend do
        local distance = getDistance(position, drawList.VtxBuffer.Data[idx].pos)
        color.w = (distance < glow_radius and (isInner and 0.01 or 0.2) or (isInner and 0.2 or 0.01))
        drawList.VtxBuffer.Data[idx].col = imgui.ColorConvertFloat4ToU32(color)
    end
    
    color.w = temp_alpha
    drawList:PathArcTo(position, radius, first, last, num_segments)
    drawList:PathStroke(imgui.ColorConvertFloat4ToU32(color), false, thickness)
    drawList:PathClear()
end
изображение_2023-09-05_173501416.png

изображение_2023-09-05_175719431.png

изображение_2023-09-05_175754252.png
Lua:
local imgui = require 'mimgui'

local sw, sh = 0, 0
imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
    sw, sh = getScreenResolution()
end)

--[[
function drawCircleWithGlow(draw_list, pos, radius, glowSize, color, thickness, num_segments, isInner)
    drawCurveWithGlow(draw_list, pos, 0, math.pi * 2, radius, glowSize, color, thickness, num_segments, isInner)
end
]]

imgui.OnFrame(function() return true end, function()
    local dl = imgui.GetBackgroundDrawList()
    local pos = imgui.ImVec2(sw / 2, sh / 2)
    local radius = sh * 0.25
    local glow_size = sh * 0.1

    local size = imgui.ImVec2(radius * 1.5, radius * 1.5)
    dl:AddRectFilled(pos - size, pos + size, 0xFF121212, 5, 15) -- black background

    -- For screenshot 1 in demo
    --[[local clr = imgui.ImVec4(0.7, 0.1, 0.1, 1)
    drawCurveWithGlow(dl, pos, math.rad(180), math.rad(270), radius, glow_size, clr, 3, 64)
    clr.x = 0.1; clr.y = 0.7
    drawCurveWithGlow(dl, pos, math.rad(270), math.rad(360), radius, glow_size, clr, 3, 64, false)
    clr.y = 0.1; clr.z = 0.7
    drawCurveWithGlow(dl, pos, math.rad(0), math.rad(90), radius, glow_size, clr, 3, 64)
    clr.x = 0.7; clr.y = 0.7; clr.w = 0.7
    drawCurveWithGlow(dl, pos, math.rad(90), math.rad(180), radius, glow_size, clr, 3, 64, false)]]

    -- For screenshot 2 in demo
    -- drawCurveWithGlow(dl, pos, 0, math.rad(360), radius, glow_size, imgui.ImVec4(1.0, 0.4, 0.8, 0.8), 3, 64, false)

    -- For screenshot 3 in demo
    -- drawCurveWithGlow(dl, pos, 0, math.rad(360), radius, glow_size, imgui.ImVec4(1.0, 0.4, 0.8, 0.8), 3, 64)
end).HideCursor = true
 

Gorskin

♥ Love Lua ♥
Проверенный
1,342
1,179
Описание: Отключает запрет на бег с тяжелым оружием, и запрет на прыжок.
Lua:
writeMemory(0x6886F8, 4, 0x90909090, true)--прыгать с тяжелым оружием
writeMemory(0x6886F8+4, 2, 0x9090, true)--прыгать с тяжелым оружием
writeMemory(0x68858B, 4, 0xC1909090, true)--быстрый бег с тяжелым оружием

Описание: Убирает задержку на появление прицела. Прицел рисуется моментально как только вы нажимаете клавишу прицеливания.
Lua:
writeMemory(0x58E1DD, 2, 0x9090, true)

Описание: Отключает действие на кнопку "Начать новую игру" в меню паузы.
Т.к в сампе вас всё равно крашнет при нажатии этой кнопки.

Lua:
memory.fill(0x57733B, 0x90, 5, true)
 
Последнее редактирование:

chapo

чопа сребдс // @moujeek
Модератор
8,934
11,700
Описание: отображает уведомление от винды
Код:
Lua:
local ffi = require('ffi');
local shell32 = ffi.load('shell32');

ffi.cdef([[
    typedef int BOOL;
    typedef unsigned int DWORD;
    typedef unsigned int UINT;
    typedef intptr_t HANDLE;
    typedef intptr_t HWND;
    typedef intptr_t HICON;
    typedef intptr_t HINSTANCE;
    typedef struct {int Data[4];} GUID;

    typedef struct {
        DWORD cbSize;
        HWND  hWnd;
        UINT  uID;
        UINT  uFlags;
        UINT  uCallbackMessage;
        HICON hIcon;
        char  szTip[128];
        DWORD dwState;
        DWORD dwStateMask;
        char  szInfo[256];
        union {
            UINT uTimeout;
            UINT uVersion;
        };
        char  szInfoTitle[64];
        DWORD dwInfoFlags;
        GUID  guidItem;
        HICON hBalloonIcon;
        } NOTIFYICONDATAA;

        BOOL Shell_NotifyIconA(
        int dwMessage,
        NOTIFYICONDATAA * lpData
        );
        HICON LoadIconA(
        HINSTANCE hInstance,
        intptr_t IconCode
        );
        BOOL DestroyIcon(
        HICON hIcon
    );
    int __stdcall GetModuleHandleA(const char* lpModuleName);
]]);



---@enum WindowsNotificationIcon
local WindowsNotificationIcon = {
    None = 0,
    Application = 32512,
    Error = 32513,
    Question = 32514,
    Warning = 32515,
    Information = 32516,
    Security = 32518
}

---@param iconType WindowsNotificationIcon | number | nil
---@param text string
---@param title string
function showWindowsNotification(iconType, title, text)
    local noIcon = iconType == nil;
    local hInstance = noIcon and ffi.C.GetModuleHandleA(ffi.NULL) or 0;
    local iconType = noIcon and 100 or (iconType or 0);
    local function copy_string(dest_array_ptr, str)
        ffi.copy(dest_array_ptr, (str or ""):sub(1, ffi.sizeof(dest_array_ptr) - 1));
    end

    --// Create tray icon
    local tray_icon_handle = ffi.C.LoadIconA(hInstance, iconType == 0 and 100 or iconType);
    local balloon_icon_handle = ffi.C.LoadIconA(hInstance, iconType);
    local notify_icon_data = ffi.new('NOTIFYICONDATAA');
    notify_icon_data.cbSize = ffi.sizeof(notify_icon_data);
    notify_icon_data.hWnd = ffi.cast('int', readMemory(0x00C8CF88, 4, false));
    notify_icon_data.uFlags = 1 + 2;
    notify_icon_data.hIcon = tray_icon_handle;
    notify_icon_data.uVersion = 4;
    notify_icon_data.hBalloonIcon = balloon_icon_handle;
    shell32.Shell_NotifyIconA(0, notify_icon_data);
    shell32.Shell_NotifyIconA(4, notify_icon_data);

    --// Show notification
    notify_icon_data.uFlags = 1 + 2 + 16;
    notify_icon_data.dwInfoFlags = iconType == 0 and 0 or 4 + 32;
    copy_string(notify_icon_data.szInfoTitle, title);
    copy_string(notify_icon_data.szInfo, text);
    shell32.Shell_NotifyIconA(1, notify_icon_data);
    lua_thread.create(function()
        wait(500);
        --// Remove tray icon and notification
        shell32.Shell_NotifyIconA(2, notify_icon_data);
        ffi.C.DestroyIcon(balloon_icon_handle);
        ffi.C.DestroyIcon(tray_icon_handle);
    end)
end

Пример использования:
Lua:
local sampev = require('lib.samp.events');
local weapons = require('game.weapons');

function sampev.onSendClientJoin()
    showWindowsNotification(WindowsNotificationIcon.Information, 'Вы подключились к серверу', sampGetCurrentServerName());
end

function sampev.onSendTakeDamage(id, damage, weapon, bodypart)
    local isPlayer = sampIsPlayerConnected(id);
    if (isPlayer) then
        showWindowsNotification(
            WindowsNotificationIcon.Warning,
            ('%s [%d] нанес вам урон!'):format(sampGetPlayerNickname(id), id),
            ('%d хп из %s'):format(damage, weapons.get_name(weapon) or '-')
        );
    end
end
1694530473506.png

1694530728232.png

1694528780182.png

Типы уведомлений:

1. nil - иконка игры
1694533941367.png


2. WindowsNotificationIcon.None (0) - без иконки
1694534007243.png


3. WindowsNotificationIcon.Application (32512) - иконка говна
1694534027893.png


4. WindowsNotificationIcon.Error (32513) - Ошибка
1694534169065.png


5. WindowsNotificationIcon.Question (32514) - Вопрос
1694534184444.png


6. WindowsNotificationIcon.Warning (32515) - Предупреждение
1694534200185.png


7. WindowsNotificationIcon.Information (32516) - Информация
1694534213415.png


8. WindowsNotificationIcon.Security (32518) - Щит (защита типа)
1694534226531.png
Если параметр "iconType" равен nil, то будет использована иконка игры
 
Последнее редактирование:

chapo

чопа сребдс // @moujeek
Модератор
8,934
11,700
Описание: открывает диалог сохранения/выбора файла
Код:
Lua:
local ffi = require('ffi');
local bit = require('bit');

ffi.cdef([[
    static const int OFN_FILEMUSTEXIST             = 0x1000;
    static const int OFN_NOCHANGEDIR               = 8;
    static const int OFN_PATHMUSTEXIST             = 0x800;

    typedef bool BOOL;
    typedef char CHAR;

    typedef unsigned short WORD;
    typedef unsigned long DWORD;

    typedef void *PVOID;
    typedef void *LPVOID;
    typedef void *LPOFNHOOKPROC;

    typedef unsigned long HANDLE;
    typedef HANDLE HWND;
    typedef HANDLE HINSTANCE;

    typedef const char *LPCSTR;
    typedef const char *LPCTSTR;

    typedef char *LPSTR;
    typedef char *LPTSTR;

    typedef unsigned long LPARAM;

    typedef struct {
        DWORD         lStructSize;
        HWND          hwndOwner;
        HINSTANCE     hInstance;
        LPCTSTR       lpstrFilter;
        LPTSTR        lpstrCustomFilter;
        DWORD         nMaxCustFilter;
        DWORD         nFilterIndex;
        LPTSTR        lpstrFile;
        DWORD         nMaxFile;
        LPTSTR        lpstrFileTitle;
        DWORD         nMaxFileTitle;
        LPCTSTR       lpstrInitialDir;
        LPCTSTR       lpstrTitle;
        DWORD         flags;
        WORD          nFileOffset;
        WORD          nFileExtension;
        LPCTSTR       lpstrDefExt;
        LPARAM        lCustData;
        LPOFNHOOKPROC lpfnHook;
        LPCTSTR       lpTemplateName;

        LPVOID        pvReserved;
        DWORD         dwReserved;
        DWORD         flagsEx;

    } OPENFILENAME;

    BOOL GetSaveFileNameA( OPENFILENAME *lpofn );
    BOOL GetOpenFileNameA( OPENFILENAME *lpofn );
    DWORD GetLastError(void);
]]);
local com = ffi.load("comdlg32");
local krnl = ffi.load("kernel32");

---@param saveDialog boolean true - save, false - open
---@param fileExtension string?
---@param defaultDir string?
---@return boolean status
---@return string result
function FileDialog(saveDialog, fileExtension, defaultDir)
    local Ofn = ffi.new("OPENFILENAME")
    ffi.fill(Ofn,ffi.sizeof(Ofn))
    local szFile = ffi.new("char[260]","\0");
    local hwnd = ffi.new("HWND",0);
    Ofn.lStructSize = ffi.sizeof(Ofn);
    Ofn.hwndOwner = hwnd;
    Ofn.lpstrFile = szFile;
    Ofn.nMaxFile = ffi.sizeof(szFile);
    Ofn.lpstrFilter = fileExtension;
    Ofn.nFilterIndex = 1;
    Ofn.lpstrFileTitle = nil;
    Ofn.nMaxFileTitle = 0;
    Ofn.lpstrInitialDir = defaultDir or getGameDirectory();
    Ofn.flags = bit.bor(com.OFN_PATHMUSTEXIST, com.OFN_FILEMUSTEXIST, com.OFN_NOCHANGEDIR);

    if (com[saveDialog and 'GetSaveFileNameA' or 'GetOpenFileNameA'](Ofn)) then
        return true, ffi.string(Ofn.lpstrFile, Ofn.nMaxFile);
    end
    return false, krnl.GetLastError();
end
Пример использования:
Lua:
local status, path = FileDialog(false, nil, getWorkingDirectory());
if (status) then
    sampAddChatMessage('Ты выбрал файл ' .. path, -1);
end
1694634038882.png

Параметры:
saveDialog (boolean)тип диалогаtrue - открытие файла, false - сохранение
fileExtension (string | nil)фильтры файловуказатель на статический буфер, в котором находится пара ноль-терминированных(null-terminated) строк для определения шаблона пользователя. Первая строка описывает шаблон, вторая - сам шаблон. Первый раз, когда Ваше приложение создает диалоговое окно, вы определяет первую строку(не должна быть пустой). Когда пользователь выбирает файл, диалог копирует текущий шаблон фильтра во вторую строку. Этот шаблон может быть как одним из шаблонов, определенных в буфере lpstrFilter, так и может быть введен пользователем. Система использует эти строки для определения шаблона, указанного пользователем, в следующий раз, когда диалог будет вызван. Если параметр nFilterIndex равен нулю, то диалог использует пользовательский шаблон. Если этот параметр имеет значение NULL, то диалог не поддерживает использование пользовательского шаблона. Если значение этого параметра не равно NULL, то параметр nMaxCustFilter должен указывать размер буфера lpstrCustomFilter: для ANSI в байтах, а для Unicode - в символах.
defaultDir (string | nil)начальная директория
 

chapo

чопа сребдс // @moujeek
Модератор
8,934
11,700
Описание: парочка полезных функций для работы с таблицами (пародия на методы из JavaScript)
Код:
Lua:
---@diagnostic disable-next-line:deprecated
table.length = table.getn;
table.push = table.insert;

---@param self table
---@param callback fun(value: unknown, index: number | string)
function table.forEach(self, callback)
    for k, v in pairs(self) do
        callback(v, k);
    end
end

---@param self table
---@param callback fun(value: unknown, index: number | string): boolean
function table.filter(self, callback)
    table.forEach(self, function(value, index)
        if (not callback(value, index)) then
            self[index] = nil;
        end
    end)
end

---@param self table
---@param value any
---@param searchStartIndex number?
---@return boolean status
---@return number index
function table.includes(self, value, searchStartIndex)
    local foundIndex;
    table.forEach(self, function(v, index)
        if (v == value and index >= (searchStartIndex or 1)) then
            foundIndex = index;
        end
    end);
    return foundIndex ~= nil, foundIndex;
end

---@param self table
function table.keys(self)
    local keys = {};
    table.forEach(self, function(_, k)
        table.insert(keys, k);
    end);
    return keys;
end

---@param self table
function table.values(self)
    local values = {};
    table.forEach(self, function(v, _)
        table.insert(values, v);
    end);
    return values;
end
или
Lua:
---@diagnostic disable-next-line:deprecated
table.length, table.push = table.getn, table.insert;
function table.forEach(self, callback) for k, v in pairs(self) do callback(v, k); end end
function table.filter(self, callback) table.forEach(self, function(value, index) if (not callback(value, index)) then self[index] = nil; end end); end
function table.includes(self, value, searchStartIndex) local foundIndex; table.forEach(self, function(v, index) if (v == value and index >= (searchStartIndex or 1)) then foundIndex = index; end end); return foundIndex ~= nil, foundIndex; end
function table.keys(self) local keys = {}; table.forEach(self, function(_, k) table.insert(keys, k); end); return keys; end
function table.values(self) local values = {}; table.forEach(self, function(v, _) table.insert(values, v); end); return values; end
Пример использования:
Lua:
local function printTable(title, t)
    print('\n' .. (title or 'Table:'));
    table.forEach(t, function(a, b) print(a, b) end);
end

local list = { 'a', 'b', 'c' };
printTable('Default', list);

table.filter(list, function(value, index)
    return value == 'a';
end)
printTable('After filter', list);
1694871212909.png


Функция
Описание
Аргументы
Возвращаемое значение
table.includes(self, value)проверяет находится ли элемент в массивеself: table
value: any
boolean status, string|number index
table.forEach(self, callback)вызывает коллбек для каждого элемента в массивеself: table
callback: function(value, key)
Нет
table.filter(self, callback)вызывает коллбек для каждого элемента в массиве, удаляет элемент если коллбек вернул false/nilself: table
callback: function(value, key): boolean
Нет
table.values(self)Возвращает массив из значений таблицыself: tabletable values
table.keys(self)Возвращает массив из ключей таблицыself: tabletable keys
 

chapo

чопа сребдс // @moujeek
Модератор
8,934
11,700
Описание: переводит луа таблицу в строку. Отличается от других подобных функций тем, что автоматически оборачивает ключ в [] там, где это необходимо.
Код:
Lua:
local function tableToString(tbl, indent)
    local function formatTableKey(k)
        local defaultType = type(k);
        if (defaultType ~= 'string') then
            k = tostring(k);
        end
        local useSquareBrackets = k:find('^(%d+)') or k:find('(%p)') or k:find('\\') or k:find('%-');
        return useSquareBrackets == nil and k or ('[%s]'):format(defaultType == 'string' and "'" .. k .. "'" or k);
    end
    local str = { '{' };
    local indent = indent or 0;
    for k, v in pairs(tbl) do
        table.insert(str, ('%s%s = %s,'):format(string.rep("    ", indent + 1), formatTableKey(k), type(v) == "table" and tableToString(v, indent + 1) or (type(v) == 'string' and "'" .. v .. "'" or tostring(v))));
    end
    table.insert(str, string.rep('    ', indent) .. '}');
    return table.concat(str, '\n');
end
Пример использования:
Lua:
local myTable = {
    name = 'chapo',
    education = 'Electrical engineer',
    skills = {
        'shitcode'
    },
    body = {
        ['Content-Type'] = 'application/json',
        height = 190,
        weight = 70,
        age = 19,
        skinColor = 'white',
        eyes = 'blue',
        bodyParts = {
            'Head',
            'Left Hand',
            'Right Hand',
            'Left foot',
            'Right foot'
        }
    }
}

print(tableToString(myTable));
1694879538578.png
 

Gorskin

♥ Love Lua ♥
Проверенный
1,342
1,179
Описание: Активирует "гуляющий" туман на любой погоде.
(Недавно видел тему где человек хотел чтобы кто-то это реализовал. Думаю пригодится кому-нибудь ещё.
Lua:
local state = false

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("fgs", function()
        state = not state
        Foggyness(state)
    end)
    wait(-1)
end

function Foggyness(bool)
    return writeMemory(0x72BE29, 2, bool and 0x9090 or 0x12EB, true) -- вечный гуляющий туман
end
 
Последнее редактирование:

Gorskin

♥ Love Lua ♥
Проверенный
1,342
1,179
Описание: Недавно зашел в самп случайно нажал на PageDown, меня выбесила эта фигня и я решил жахнуть 0xC3 по адресу этой твари.
Убирает действие на кнопку PageDown тем самым у вас не будет скролиться чат вверх.
Lua:
writeMemory(getModuleHandle("samp.dll") + 0x63700, 1, 0xC3, true) -- ____0x63700 for R1 ____0x66B50 for R3 | блокировка PageDown
 

ARMOR

011110000111100101101001
Модератор
4,969
6,890
Описание: Недавно зашел в самп случайно нажал на PageDown, меня выбесила эта фигня и я решил жахнуть 0xC3 по адресу этой твари.
Убирает действие на кнопку PageDown тем самым у вас не будет скролиться чат вверх.
Lua:
writeMemory(getModuleHandle("samp.dll") + 0x63700, 1, 0xC3, true) -- ____0x63700 for R1 ____0x66B50 for R3 | блокировка PageDown
1. Это отключение не PageDown, а PageUp.
2. Если уже отключил PageUp то почему сразу не отключить и PageDown? Они же рядом находятся как по вызовах так и по инициализации:
p.png

1696200517107.png

Lua:
local samp = getModuleHandle('samp.dll');
memory.setuint8(samp + 0x63700, 0xC3, true); -- PageUP
memory.setuint8(samp + 0x63760, 0xC3, true); -- PageDown

Можешь юзать базы сампа от @KOPAbJIuK . Жаль только что там РакПира нет: https://github.com/Northn/SAMP_IDBs

PS: Костя, это не доеб кста, а просто совёт)
 

Gorskin

♥ Love Lua ♥
Проверенный
1,342
1,179
1. Это отключение не PageDown, а PageUp.
2. Если уже отключил PageUp то почему сразу не отключить и PageDown? Они же рядом находятся как по вызовах так и по инициализации:
Посмотреть вложение 216604
Посмотреть вложение 216605
Lua:
local samp = getModuleHandle('samp.dll');
memory.setuint8(samp + 0x63700, 0xC3, true); -- PageUP
memory.setuint8(samp + 0x63760, 0xC3, true); -- PageDown

Можешь юзать базы сампа от @KOPAbJIuK . Жаль только что там РакПира нет: https://github.com/Northn/SAMP_IDBs

PS: Костя, это не доеб кста, а просто совёт)
Ну так они обе не работают после отключения. Я не стал отключать обе.
 
  • Вау
Реакции: ARMOR

Gorskin

♥ Love Lua ♥
Проверенный
1,342
1,179
Описание: Моментально завершает процесс, в данном случае убивает процесс gta_sa.exe
Можно использовать для быстрого выхода из игры.
Для завершения текущего процесса необходимо вызвать функцию killProcGame()
Lua:
local ffi = require("ffi")

ffi.cdef[[
    uint32_t GetLastError();
    void* OpenProcess(uint32_t dwDesiredAccess, int32_t bInheritHandle, uint32_t dwProcessId);
    int TerminateProcess(void* hProcess, uint32_t uExitCode);
    uint32_t GetCurrentProcessId();
]]


function killProcGame()
     local PROCESS_TERMINATE = 0x0001

     -- Получаем идентификатор процесса gta_sa.exe
     local processId = ffi.C.GetCurrentProcessId()

     -- Открываем процесс gta_sa.exe для его завершения
     local processHandle = ffi.C.OpenProcess(PROCESS_TERMINATE, 0, processId)
     if processHandle == nil then
         -- Если возникла ошибка при открытии процесса, выводим сообщение об ошибке
         local errorCode = ffi.C.GetLastError()
         print("Ошибка при открытии процесса: " .. errorCode)
     else
         -- Вызываем функцию TerminateProcess для завершения процесса gta_sa.exe
         local exitCode = 0 -- Код завершения процесса (в данном случае 0)
         local result = ffi.C.TerminateProcess(processHandle, exitCode)
         if result == 0 then
             -- Если возникла ошибка при завершении процесса, выводим сообщение об ошибке
             local errorCode = ffi.C.GetLastError()
             print("Ошибка при завершении процесса: " .. errorCode)
         else
             print("Процесс gta_sa.exe успешно завершен!")
         end
     end
end
 
  • Вау
  • Нравится
Реакции: Bene //, whyega52 и cord

DZONE

Известный
188
200
Описание: Моментально завершает процесс, в данном случае убивает процесс gta_sa.exe
Можно использовать для быстрого выхода из игры.
Для завершения текущего процесса необходимо вызвать функцию killProcGame()
Lua:
local ffi = require("ffi")

ffi.cdef[[
    uint32_t GetLastError();
    void* OpenProcess(uint32_t dwDesiredAccess, int32_t bInheritHandle, uint32_t dwProcessId);
    int TerminateProcess(void* hProcess, uint32_t uExitCode);
    uint32_t GetCurrentProcessId();
]]


function killProcGame()
     local PROCESS_TERMINATE = 0x0001

     -- Получаем идентификатор процесса gta_sa.exe
     local processId = ffi.C.GetCurrentProcessId()

     -- Открываем процесс gta_sa.exe для его завершения
     local processHandle = ffi.C.OpenProcess(PROCESS_TERMINATE, 0, processId)
     if processHandle == nil then
         -- Если возникла ошибка при открытии процесса, выводим сообщение об ошибке
         local errorCode = ffi.C.GetLastError()
         print("Ошибка при открытии процесса: " .. errorCode)
     else
         -- Вызываем функцию TerminateProcess для завершения процесса gta_sa.exe
         local exitCode = 0 -- Код завершения процесса (в данном случае 0)
         local result = ffi.C.TerminateProcess(processHandle, exitCode)
         if result == 0 then
             -- Если возникла ошибка при завершении процесса, выводим сообщение об ошибке
             local errorCode = ffi.C.GetLastError()
             print("Ошибка при завершении процесса: " .. errorCode)
         else
             print("Процесс gta_sa.exe успешно завершен!")
         end
     end
end
Lua:
os.exit(0)
 

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,798
2,659
Описание: Насилуем CLEO, а точнее получаем его версию (аналог функции из SF)
Код:

Lua:
local ffi = require("ffi")



ffi.cdef[[
    uint32_t __stdcall CLEO_GetVersion();
]]



function getCleoVersion()
    local cleo = ffi.load("CLEO.asi")
    if cleo then return cleo.CLEO_GetVersion() end
end
Пример использования:
Lua:
local ffi = require("ffi")



ffi.cdef[[
    uint32_t __stdcall CLEO_GetVersion();
]]



function getCleoVersion()
    local cleo = ffi.load("CLEO.asi")
    if cleo then return cleo.CLEO_GetVersion() end
end



print(getCleoVersion())
 
  • Нравится
  • Вау
Реакции: 1NS и XRLM

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,656
2,541
Функция, позволяющая устанавливать элементам mimgui окна позицию в зависимости от позиции системного курсора.

Код:
function cursor_pos()
    local resX, resY = getScreenResolution()
    local p = imgui.GetWindowPos()
    local cpX, cpY = getCursorPos()
    local s = imgui.GetWindowSize()
    local k = { x = resX / s.x, y = resY / s.y }
    imgui.SetCursorPos(imgui.ImVec2((cpX / k.x * k.x) - (p.x / k.x * k.x),
        (cpY / k.y * k.y) - (p.y / k.y * k.y)))
end

Пример использования:
local imgui = require('mimgui')
local ImVec2 = imgui.ImVec2

function cursor_pos()
    local resX, resY = getScreenResolution()
    local p = imgui.GetWindowPos()
    local cpX, cpY = getCursorPos()
    local s = imgui.GetWindowSize()
    local k = { x = resX / s.x, y = resY / s.y }
    imgui.SetCursorPos(ImVec2((cpX / k.x * k.x) - (p.x / k.x * k.x),
        (cpY / k.y * k.y) - (p.y / k.y * k.y)))
end

local main_frame = imgui.OnFrame(function() return isSampAvailable() end,
    function(game)
        imgui.SetNextWindowSize(ImVec2(500, 300))
        if imgui.Begin('window', nil, imgui.WindowFlags.NoResize) then
            cursor_pos()
            imgui.BeginChild('second_child', ImVec2(100, 50), true)
            imgui.EndChild()
            imgui.End()
        end
    end
)

Посмотреть вложение 217943
Lua:
function cursor_pos()
    local cpX, cpY = getCursorPos()
    imgui.SetCursorScreenPos(imgui.ImVec2(cpX, cpY))
end