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

AnWu

Guardian of Order
Всефорумный модератор
4,687
5,163
Описание: Позволяет установить угол картинке
Lua:
function ImRotate(v, cos_a, sin_a) return imgui.ImVec2(v.x * cos_a - v.y * sin_a, v.x * sin_a + v.y * cos_a); end
function calcAddImVec2(l, r) return imgui.ImVec2(l.x + r.x, l.y + r.y) end

function ImageRotated(tex_id, center, size, angle, color)
   local color = color or 0xFFFFFFFF
   local drawlist = imgui.GetWindowDrawList()
   local cos_a = math.cos(angle)
   local sin_a = math.sin(angle)
   local pos = {
      calcAddImVec2(center, ImRotate(imgui.ImVec2(-size.x * 0.5, -size.y * 0.5), cos_a, sin_a)),
      calcAddImVec2(center, ImRotate(imgui.ImVec2(size.x * 0.5, -size.y * 0.5), cos_a, sin_a)),
      calcAddImVec2(center, ImRotate(imgui.ImVec2(size.x * 0.5, size.y * 0.5), cos_a, sin_a)),
      calcAddImVec2(center, ImRotate(imgui.ImVec2(-size.x * 0.5, size.y * 0.5), cos_a, sin_a))
    }
    local uvs =
    {
      imgui.ImVec2(0.0, 0.0),
      imgui.ImVec2(1.0, 0.0),
      imgui.ImVec2(1.0, 1.0),
      imgui.ImVec2(0.0, 1.0)
    }
    drawlist:AddImageQuad(tex_id, pos[1], pos[2], pos[3], pos[4], uvs[1], uvs[2], uvs[3], uvs[4], color)
end
Пример использования: Вертим бх! (Скачал лого бх, пример в файле)
Lua:
local angle = -os.clock() * 5.0
ImageRotated(imageBH, imgui.ImVec2(p.x + 368.0, p.y + 196.0), imgui.ImVec2(100, 100), -angle, 0x20FFFFFF)
Original: https://github.com/ocornut/imgui/issues/1982#issuecomment-408834301
Video:

При участии @Lil Xean (https://vk.com/xeaan) - наброски луа с плюсов, основной код окна в видео, респект этому человеку!
 

Вложения

  • mimgui blank.lua
    9 KB · Просмотры: 32
Последнее редактирование:
У

Удалённый пользователь 236316

Гость
Описание: Проверяет инициализацию структур CR:MP. (only 0.3.7 R3)
Lua:
local memory = require "memory"
local CR_addrs = {
    0x26E8C8, -- CChat
    0x26E8CC, -- CInput
    0x26E8D0, -- CDeathWindow
    0x26E894, -- CScoreboard
    0x26E898, -- CDialog
    0x26E8F4, -- CGame
}

function isCRMPAvailable()
    local CRMPHandle = getModuleHandle("samp.dll")
    local result = true
    for k, v in pairs(CR_addrs) do
        result = result and memory.getuint32(CRMPHandle + v) ~= 0x0
    end
    return result
end
Пример использования:
Lua:
local memory = require "memory"

function main()
    repeat wait(0) until isCRMPAvailable()
    printStringNow("CRMP loaded!")
end
 
Последнее редактирование модератором:

~Justie~

Участник
133
25
Описание: Рандом, принимает минимальное возможное число и максимальное. Работает на math.randomseed(os.time()), который умножается на псевдо рандом своих же значений
Lua:
function random(min, max)
    kf = math.random(min, max)
    math.randomseed(os.time() * kf)
    rand = math.random(min, max)
    return tonumber(rand)
end

Пример использования:
Lua:
local players = {
    'Ricardo_Milos',
    'Justie',
    'cheremuxa',
    'MrCreepTon',
    'Joni_Scripts',
    'Loony_Herrera'
}

function win()
    sampAddChatMessage('Победил игрок: ' .. players[random(1, #players)], -1)
end

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('win', win)
    wait(-1)
end

function random(min, max)
    kf = math.random(min, max)
    math.randomseed(os.time() * kf)
    rand = math.random(min, max)
    return tonumber(rand)
end
 

asdzxcjqwe

¯\_(ツ)_/¯
Друг
621
704
Описание: скрываем код от Python декомпилятора. Тупо для баловства, т.к. снимается так же легко, как и любой другой антидекомп метод.

Lua:
goto hidden
goto visible


::hidden:: -- под этой меткой код, который будет скрыт от декомпилятора

-- ЗДЕСЬ ВАШ КОД


::visible:: -- под этой меткой код, который будет виден после декомпиляции


Пример использования:

Lua:
goto hidden
goto visible


::hidden:: -- под этой меткой код, который будет скрыт от декомпилятора

-- moonloader
function main()
    repeat wait(0) until isSampAvailable()
    sampAddChatMessage("Тестовое сообщение", -1)
end

-- luajit.exe
if not isSampAvailable then
    os.setlocale("rus")
    print("Тестовое сообщение")
end


::visible:: -- под этой меткой код, который будет виден после декомпиляции

function __nosource__()
    __info__("Haha get lost")
end



Описание: если кто-то умудрился запустить скрипт через luajit.exe, не даем скрипту крашнуться, а выдаем сообщение об ошибке.

Lua:
-- поместить в самое начало вашего кода
if not getMoonloaderVersion then -- тут НЕ нужны скобки (можно также проверить тип переменной и убедиться, что это не функция)
    return print("This script requires MoonLoader to be installed")
end


Пример использования:

Lua:
if not getMoonloaderVersion then
    return print("This script requires MoonLoader to be installed")
end

function main()
    repeat wait(0) until isSampAvailable()
    sampAddChatMessage("Тестовое сообщение", -1)
end
 
Последнее редактирование:

asdzxcjqwe

¯\_(ツ)_/¯
Друг
621
704
такое и без наличия сф сработает, так что лучше not getMoonloaderVersion
не шарю спс исправил, но...
тогда поместив в main() проверку на подгруженность сампа т.е. isSampAvailable(), скрипт без установленного sf тупо крашнется? если так, тогда абсолютно неважно, какую функу чекать.
что тогда может мун без установленного sf?
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
isSampAvailable(), скрипт без установленного sf тупо крашнется?
скрипт выдаст ошибку, что isSampAvailable - не функция


что тогда может мун без установленного sf?
использовать функции, которые есть в мунлоадере, не включая для самп/сф/клео
 

_raz0r

t.me/sssecretway | ТГК: t.me/razor_code
Модератор
1,888
3,047
Описание: Отправляет sampSendGiveDamage для SAMP 0.3.7 R3/CRMP
Lua:
local ffi = require "ffi"

function sampSendGiveDamage(playerId, damage, weaponId, bodyPart)
    local sampBase = getModuleHandle("samp.dll")
    ffi.cast('void (__thiscall *)(void *, int, float, int, int)', sampBase + 0x6780)(sampBase + 0x4A80, playerId, damage, weaponId, bodyPart)
end
Пример использования:
Lua:
function main()
    local randomBodypart = math.random(0, 5)
    sampSendGiveDamage(1, 10.0, 0, randomBodypart)
end
 
Последнее редактирование:

AnWu

Guardian of Order
Всефорумный модератор
4,687
5,163
Описание: Регистрируем глобальные клавиши в игре
Lua:
local ffi = require 'ffi'
local vkeys = require 'vkeys'
local wm = require 'windows.message'
ffi.cdef[[
    typedef unsigned long HANDLE;
    typedef HANDLE HWND;

    HWND GetActiveWindow(void);

    bool RegisterHotKey(
        HWND hWnd,
        int  id,
        unsigned int fsModifiers,
        unsigned int vk
    );
    bool UnregisterHotKey(
        HWND hWnd,
        int  id
    );
]]
Пример использования:
Lua:
local ffi = require 'ffi'
local vkeys = require 'vkeys'
local wm = require 'windows.message'
ffi.cdef[[
    typedef unsigned long HANDLE;
    typedef HANDLE HWND;

    HWND GetActiveWindow(void);

    bool RegisterHotKey(
        HWND hWnd,
        int  id,
        unsigned int fsModifiers,
        unsigned int vk
    );
    bool UnregisterHotKey(
        HWND hWnd,
        int  id
    );
]]
function main()
    ffi.C.RegisterHotKey(ffi.C.GetActiveWindow(), 1, 0x4000, vkeys.VK_X)
    wait(-1)
end
function onWindowMessage(msg, wparam, lparam)
    if msg == wm.WM_HOTKEY then
        print('WM_HOTKEY triggered:', lparam, wparam)
    end
end
function onScriptTerminate(dScript)
    if dScript == thisScript() then
        ffi.C.UnregisterHotKey(ffi.C.GetActiveWindow(), 1)
    end
end
 

smurf1k➹

Участник
78
67
Описание: Вычисляет ближайшую координату от игрока
Lua:
function GetNearestCoord(Array)
    local x, y, z = getCharCoordinates(playerPed)
    local distance = {}
    for k, v in pairs(Array) do
        distance[k] = {distance = math.floor(getDistanceBetweenCoords3d(v[1], v[2], v[3], x, y, z)), name = v[4]}
    end
    table.sort(distance, function(a, b) return a.distance < b.distance end)
    for k, v in pairs(distance) do
        CoordName, CoordDist = v.name, v.distance
        break
    end
    return CoordName, CoordDist
end
Пример использования:
Lua:
coords = {
    {-2468.6934,2264.1389,4.8359, 'Порт SF'}, --координата и название
    {-2381.5042,78.3322,35.3125, 'Баскетбольное поле'},
    {-2500.6475,-653.4509,138.6319, 'Радио-Вышка'}
}

function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('yebatyadaun', yebatyadaun)
    wait(-1)
end

function yebatyadaun()
    local name, dist = GetNearestCoord(coords) -- указываем массив с координатами
    sampAddChatMessage('Ближайшая к Вам координата с названием '..name..' в '..dist..' метрах(е) от Вас', -1)
end

function GetNearestCoord(Array)
    local x, y, z = getCharCoordinates(playerPed)
    local distance = {}
    for k, v in pairs(Array) do
        distance[k] = {distance = math.floor(getDistanceBetweenCoords3d(v[1], v[2], v[3], x, y, z)), name = v[4]}
    end
    table.sort(distance, function(a, b) return a.distance < b.distance end)
    for k, v in pairs(distance) do
        CoordName, CoordDist = v.name, v.distance
        break
    end
    return CoordName, CoordDist
end
спасибо kerosin
 
Последнее редактирование:

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
Описание: Получает айди листбокса по заданному ранее тексту
Lua:
function get_id_listbox_by_text(text_for_find)
    list_boxes_count = sampGetListboxItemsCount()
    for i = 0, list_boxes - 1 do
        if sampGetListboxItemText(i):gsub("{%S%S%S%S%S%S}", ""):find(text_for_find) then
            print('Айди листбокса: ' .. i)
        end
    end
end
Пример использования:
Lua:
local ev = require('lib.samp.events')
local text = 'Состав партии'

function ev.onShowDialog(dialogId, style, title, but1, but2, text)
    list_boxes = sampGetListboxItemsCount()
    for i = 0, list_boxes - 1 do
        if sampGetListboxItemText(i):gsub("{%S%S%S%S%S%S}", ""):find(text) then
            print('Айди листбокса ' .. i)
        end
    end
end

и да, твой пример не сработает
 

черный кот

Известный
167
182
Конвертирует 3D координаты в 2D для drawSprite. Нашел на гитхабе

Lua:
function convert3Dto2D(x, y, z)
    local result, wposX, wposY, wposZ, w, h = convert3DCoordsToScreenEx(x, y, z, true, true)
    local fullX = readMemory(0xC17044, 4, false)
    local fullY = readMemory(0xC17048, 4, false)
    wposX = wposX * (640.0 / fullX)
    wposY = wposY * (448.0 / fullY)
    return result, wposX, wposY
end
 

trefa

Известный
Всефорумный модератор
2,097
1,230
Описание: Возвращает информацию о гангзоне на которой стоит игрок. Возвращает пустую таблицу если игрок не находится в гангзоне.
Lua:
local ffi = require 'ffi'
ffi.cdef [[
struct stGangzone
{
    float    fPosition[4];
    uint32_t    dwColor;
    uint32_t    dwAltColor;
};

struct stGangzonePool
{
    struct stGangzone    *pGangzone[1024];
    int iIsListed[1024];
};
]]


function IsPlayerGangZone()
    local gang = {}
    local gz_pool = ffi.cast('struct stGangzonePool*', sampGetGangzonePoolPtr())
    for i = 0,1023 do
        if gz_pool.iIsListed[i] ~= 0 and gz_pool.pGangzone[i] ~= nil then
            local gz_pos = gz_pool.pGangzone[i].fPosition
            local color = gz_pool.pGangzone[i].dwColor
            local x,y, z = getCharCoordinates(PLAYER_PED)
            if ((x >= gz_pos[0] and x <= gz_pos[2]) or (x <= gz_pos[0] and x >= gz_pos[2])) and ((y >= gz_pos[1] and y <= gz_pos[3]) or (y <= gz_pos[1] and y >= gz_pos[3])) then
                table.insert(gang, {id = id,pos1 = {x = gz_pos[0],y = gz_pos[1]},pos2 = {x = gz_pos[2],y = gz_pos[3]},color = color})
            end
        end
    end
    return gang
end
Пример использования:
Lua:
sampRegisterChatCommand("gang",function()
    local gang = IsPlayerGangZone()
    if #gang > 0 then
        for _, val in ipairs(gang) do
            sampAddChatMessage(val.id,-1)
        end
    end
end)
 
  • Нравится
Реакции: tyukapa и Joni Scripts

Joni Scripts

Известный
535
374
Описание: Разворачивание игры
Lua:
local ffi = require 'ffi'
ffi.cdef [[
    typedef int BOOL;
    typedef unsigned long HANDLE;
    typedef HANDLE HWND;
    HWND GetActiveWindow(void);
    BOOL ShowWindow(HWND hWnd, int  nCmdShow);
]]

function main()
    repeat wait(100) until isSampAvailable()
    hwin = ffi.C.GetActiveWindow() -- получение хэндла окна (использовать только когда окно GTA активное)
    while true do
        wait(-1)
    end
end
Пример использования:
Lua:
local events = require 'lib.samp.events'

function events.onSendClientJoin() -- хук на подключение к серверу
    ffi.C.ShowWindow(hwin, 3) -- коды разворачивания окон: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showwindow
    --итог: GTA развернется когда вы подключитесь к серверу
end
 

Koletron

Известный
18
7
Описание: Генерация рандомной строки(пароля)
Lua:
function randomString(size) -- size - длина рандомной строки, которую выдаст функция
    local char = '0123456789abcdefghijklmnopqrstuvwxyz'
    local letters = {}
    local shuffleStr = ''
    for i=1, string.len(char) do
        letters[i] = char:match('.', i)
    end
    for j=1, size do
        local rand = math.random(1, #letters)
        shuffleStr = string.format('%s%s', shuffleStr, letters[rand])
    end
    return shuffleStr
end

Пример использования:
Lua:
function main()
    repeat wait(10) until isSampAvailable()
    sampRegisterChatCommand('randomString', function() sampAddChatMessage(randomString(12), -1) end)
    wait(-1)
end
 
Последнее редактирование: