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

kjor32

¯\_(ツ)_/¯
Всефорумный модератор
1,684
1,396
Изменяет силу свечения светофоров,вызывается вроде один раз за игру при запуске
Lua:
local memory = require 'memory'
memory.setfloat(memory.getuint32(0x848F96 + 2, true),5000, true) --стандартное значение 10


sa-mp-013.png
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
local theme = decodeJson(JSON);
я бы сделал версию без поддержки json, чтобы можно было загружать свои шаблоны, вшитые в скрипт, и добавил обёртку.
Lua:
function imgui.LoadTheme(elements)
    -- ...
end

function imgui.LoadJsonTheme(JSON) return imgui.LoadTheme(decodeJSON(JSON)) end

local status, _ = pcall(function() return imgui.Col[param] ~= nil end);
...
imgui.GetStyle().Colors[imgui.Col[param]] = imgui.ImVec4(table.unpack(value));
через pcall можно получить значение и не индексировать снова, также ImVec4 может принимать таблицу (только в mimgui), поэтому table.unpack не нужен.
Lua:
local status, col = pcall(function() return imgui.Col[param] end);
-- ...
imgui.GetStyle().Colors[col] = imgui.ImVec4(value);
 

ARMOR

kjor32 is legend
Модератор
4,846
6,071
Описание: Возвращает тип приближения снайперской винтовки
  • 0 - Отдаление
  • 1 - Приближение
Lua:
local CPad__GetCPad = ffi.cast('int(__cdecl*)(void*)', 0x53FB70)
local Sniper__ZoomIn = ffi.cast('bool(__thiscall*)(void*)', 0x540B30)
local Sniper__ZoomOut = ffi.cast('bool(__thiscall*)(void*)', 0x540B80)

function GetSniperZoomMode()
    if Sniper__ZoomOut(ffi.cast('void*', CPad__GetCPad(0))) then
        return true, 0
    elseif Sniper__ZoomIn(ffi.cast('void*', CPad__GetCPad(0))) then
        return true, 1
    end
    return false
end

Пример использования:
Lua:
local result, mode = GetSniperZoomMode()

Отдельное спасибо @chapo за фикс кода
 
Последнее редактирование:

Andrinall

Известный
678
531
[mimgui]
Вращаем вершины по двум осям(x, y)
upd: не работает с AddRect(-Filled), PathArcTo и похожими. Вроде нормально работает с PathLineTo и AddText(-FontPtr)
upd2: или я дурак, но с AddRect(-Filled) заработало после перезапуска игры

Пример подсмотрел тут:

JO7OYQoc14.gif


Lua:
local imgui = require 'mimgui'

imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil

    angle = 0
    speed = 0.5
end)

imgui.OnFrame(function() return true end, function()
    local dl = imgui.GetBackgroundDrawList()

    local pos = imgui.ImVec2(50, 450)

    local start = dl.VtxBuffer.Size
    dl:AddText(pos, 0xFFFFFFFF, "TESTED ROTATED TEXT")
    local text_s = imgui.CalcTextSize("TESTED ROTATED TEXT")
 
    dl:RotateVerts(
        start,
        dl.VtxBuffer.Size,
        imgui.ImVec2(
            math.rad(angle),
            math.rad(-angle)
        ),
        imgui.ImVec2(
            pos.x + text_s.x/2,
            pos.y + text_s.y/2
        )
    )
 
    angle = angle + speed
end).HideCursor = true

Lua:
-- int vtx_start, int vtx_end, ImVec2 rotate_vec ( в радианах ), ImVec2 center_vec
function imgui.ImDrawList.__index:RotateVerts(vtx_start, vtx_end, rotate_vec, center_vec)
    local base = math.pi/2
    local sx, cx = math.sin(base + rotate_vec.x), math.cos(base + rotate_vec.x)
    local sy, cy = math.sin(base + rotate_vec.y), math.cos(base + rotate_vec.y)

    local center = {
        ImRotate(center_vec, sx, cx),
        ImRotate(center_vec, sy, cy)
    }

    center[1].x = center[1].x - center_vec.x
    center[2].y = center[2].y - center_vec.y

    for vert = vtx_start, vtx_end do
        local pos = self.VtxBuffer.Data[vert].pos
  
        local rot = { ImRotate(pos, sx, cx), ImRotate(pos, sy, cy) }
        self.VtxBuffer.Data[vert].pos.x = rot[1].x - center[1].x
        self.VtxBuffer.Data[vert].pos.y = rot[2].y - center[2].y
    end
end
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 -- imgui_internal.h
 
Последнее редактирование:

VRush

https://t.me/vrushscript
Проверенный
2,341
1,088
Описание: ASCII Table в массиве на луа, я не нашел поэтому переписал ее сам
Пример использования:
Lua:
print(ascii['t']) --116
Код:
Lua:
local ascii = {
  ['NULL'] = 0, ['SOH'] = 1, ['STX'] = 2, ['ETX'] = 3,
  ['EOT'] = 4, ['ENQ'] = 5, ['ACK'] = 6, ['BEL'] = 7,
  ['BS'] = 8, ['HT'] = 9, ['LF'] = 10, ['VT'] = 11,
  ['FF'] = 12, ['CR'] = 13, ['SO'] = 14, ['SI'] = 15,
  ['DLE'] = 16, ['DC1'] = 17, ['DC2'] = 18, ['DC3'] = 19,
  ['DC4'] = 20, ['NAK'] = 21, ['SYN'] = 22, ['ETB'] = 23,
  ['CAN'] = 24, ['EM'] = 25, ['SUB'] = 26, ['ESC'] = 27,
  ['FS'] = 28, ['GS'] = 29, ['RS'] = 30, ['US'] = 31,
  [' '] = 32, ['!'] = 33, ['"'] = 34, ['#'] = 35,
  ['$'] = 36, ['%'] = 37, ['&'] = 38, ['\''] = 39,
  ['('] = 40, [')'] = 41, ['*'] = 42, ['+'] = 43,
  [','] = 44, ['-'] = 45, ['.'] = 46, ['/'] = 47,
  ['0'] = 48, ['1'] = 49, ['2'] = 50, ['3'] = 51,
  ['4'] = 52, ['5'] = 53, ['6'] = 54, ['7'] = 55,
  ['8'] = 56, ['9'] = 57, [':'] = 58, [';'] = 59,
  ['<'] = 60, ['='] = 61, ['>'] = 62, ['?'] = 63,
  ['@'] = 64, ['A'] = 65, ['B'] = 66, ['C'] = 67,
  ['D'] = 68, ['E'] = 69, ['F'] = 70, ['G'] = 71,
  ['H'] = 72, ['I'] = 73, ['J'] = 74, ['K'] = 75,
  ['L'] = 76, ['M'] = 77, ['N'] = 78, ['O'] = 79,
  ['P'] = 80, ['Q'] = 81, ['R'] = 82, ['S'] = 83,
  ['T'] = 84, ['U'] = 85, ['V'] = 86, ['W'] = 87,
  ['X'] = 88, ['Y'] = 89, ['Z'] = 90, ['['] = 91,
  ['\\'] = 92, [']'] = 93, ['^'] = 94, ['_'] = 95,
  ['`'] = 96, ['a'] = 97, ['b'] = 98, ['c'] = 99,
  ['d'] = 100, ['e'] = 101, ['f'] = 102, ['g'] = 103,
  ['h'] = 104, ['i'] = 105, ['j'] = 106, ['k'] = 107,
  ['l'] = 108, ['m'] = 109, ['n'] = 110, ['o'] = 111,
  ['p'] = 112, ['q'] = 113, ['r'] = 114, ['s'] = 115,
  ['t'] = 116, ['u'] = 117, ['v'] = 118, ['w'] = 119,
  ['x'] = 120, ['y'] = 121, ['z'] = 122, ['{'] = 123,
  ['|'] = 124, ['}'] = 125, ['~'] = 126, ['DEL'] = 127,
}
 

ARMOR

kjor32 is legend
Модератор
4,846
6,071
Описание: Получает название шрифта используемый SAMP'ом

Код:
Lua:
local ffi = require 'ffi'

function getSAMPFont()
    return ffi.string(ffi.cast('const char*(__cdecl*)()', getModuleHandle("samp.dll") + 0xC5C00)())
end

--[[
Адреса для всех версий SAMP:
0xB3D40 - R1
0xB3F10 - R2
0xB3D40 - R3
0xC5390 - R4
0xC5370 - R5
0xC6A30 - DL
]]
 
  • Нравится
Реакции: MLycoris

Vespan

loneliness
Проверенный
2,101
1,632
отправка чего угодно в телегу
взял функцию с MoonGram'a(тему почему то удалена :=-( ) и чутка подправил
Lua:
function telegramRequest(token, telegramMethod, requestParameters, requestFile)
    local multipart  = require('multipart-post')
    local effil      = require('effil')
    local dkjson     = require('dkjson')

    local defValues = {
        ['caption'] = tostring(u8:encode('')),
        ['parse_mode'] = tostring('HTML'),
        ['disable_notification'] = tostring(false),
        ['reply_to_message_id'] = tostring(0),
        ['reply_markup'] = dkjson.encode({ ['inline_keyboard'] = { {  } } })
    }
    for k,v in pairs(defValues) do
        if requestParameters[k] == nil then;    requestParameters[k] = v;   end
    end
    for key, value in ipairs(requestParameters) do
        if (#requestParameters ~= 0) then
            requestParameters[key] = tostring(value)
        end
    end

    if (requestFile and next(requestFile) ~= nil) then
        local fileType, fileName = next(requestFile)
        local file = io.open(fileName, 'rb')
        if file then
            requestParameters[fileType] = {
                filename = fileName,
                data = file:read('*a')
            }
            file:close()
        else
            return false, 'io.open '..fileName..' = false'
        end
    end

    local body, boundary = multipart.encode(requestParameters)

    local thread = effil.thread(function (requestData, body, boundary)
        local response = {}

        local http  = require('ssl.https')
        local ltn12 = require('ltn12')

        local _, source = pcall(ltn12.source.string, body)
        local _, sink   = pcall(ltn12.sink.table, response)

        local result, _ = pcall(http.request, {
                ['url']     = string.format('https://api.telegram.org/bot%s/%s', tostring(token), tostring(telegramMethod)),
                ['method']  = 'POST',
                ['headers'] = {
                    ['Accept']          = '*/*',
                    ['Accept-Encoding'] = 'gzip, deflate',
                    ['Accept-Language'] = 'en-us',
                    ['Content-Type']    = string.format('multipart/form-data; boundary=%s', tostring(boundary)),
                    ['Content-Length']  = #body
                },
                ['source']  = source,
                ['sink']    = sink
        })
        if (result) then;   return { true, response }
        else;   return { false, response }
        end
    end)(requestData, body, boundary)
    local result = thread:get(0)
    while (not result) do
        result = thread:get(0)
        wait(0)
    end
    local status, error = thread:status()
    if (not error) then
        if (status == 'completed') then
            local response = dkjson.decode(result[2][1])
            if (result[1]) then
                return true, 'fin'
            else
                return false, response
            end
        elseif (status ~= 'running' and status ~= 'completed') then
            return false, status
        end
    else
        return false, error
    end
    thread:cancel(0)
    return true,'fin.'
end
примеры
отправка видева:
    local t = {
        ['chat_id'] = tostring(id),
        ['caption'] = u8:encode( ('летсплеи от лололошки'), 'CP1251'),
    }
    local b,e = telegramRequest(token, 'sendVideo', t, {video=getWorkingDirectory()..'/VIDEO.mp4'})
отправка фоточки:
    local t = {
        ['chat_id'] = tostring(id),
        ['caption'] = u8:encode( ('фото на паспорт'), 'CP1251'),
    }
    local b,e = telegramRequest(token, 'sendPhoto', t, {photo=getWorkingDirectory()..'/1.png'})
отправка текста:
    local t = {
        ['chat_id'] = tostring(id),
        ['text'] = u8:encode( ('ТЕКСТ!'), 'CP1251'),
    }
    local b,e = telegramRequest(token, 'sendMessage', t, _)
отправка AUDIO:
    local t = {
        ['chat_id'] = tostring(id),
        ['text'] = u8:encode( ('музочка'), 'CP1251'),
    }
    local b,e = telegramRequest(token, 'sendAudio', t, {audio = getWorkingDirectory()..'/белые розы.mp3'})
>>telegram bot api<<
 

why ega

РП игрок
Модератор
2,539
2,229
Описание: Переводит угол из GTA в quaternion по осям Z и W
Код:
Lua:
function angleToQuaternion(angle)
    local a = (angle * math.pi / 360.0) 
    local qz = -(math.sin(a))
    local qw = math.cos(a)   
    return qz, qw
end
Пример использования:
Lua:
local sampev = require("lib.samp.events")

function sampev.onSendPlayerSync(data)   
    local x, y = 1516, -5155
    local angle = getHeadingFromVector2d(x - data.position[1], y - data.position[2])
    local qz, qw = angleToQuaternion(angle)
    data.quaternion.z, data.quaternion.w = qz, qw -- повернет нас в сторону 1516, -5155 координат на исходящей синхре
end

function angleToQuaternion(angle)
    local a = (angle * math.pi / 360.0) 
    local qz = -(math.sin(a))
    local qw = math.cos(a)   
    return qz, qw
end
 

Musaigen

abobusnik
Проверенный
1,582
1,302
Описание: Переводит угол из GTA в quaternion по осям Z и W
Код:
Lua:
function angleToQuaternion(angle)
    local a = (angle * math.pi / 360.0)
    local qz = -(math.sin(a))
    local qw = math.cos(a)  
    return qz, qw
end
Пример использования:
Lua:
local sampev = require("lib.samp.events")

function sampev.onSendPlayerSync(data)  
    local x, y = 1516, -5155
    local angle = getHeadingFromVector2d(x - data.position[1], y - data.position[2])
    local qz, qw = angleToQuaternion(angle)
    data.quaternion.z, data.quaternion.w = qz, qw -- повернет нас в сторону 1516, -5155 координат на исходящей синхре
end

function angleToQuaternion(angle)
    local a = (angle * math.pi / 360.0)
    local qz = -(math.sin(a))
    local qw = math.cos(a)  
    return qz, qw
end
Сливаю две супер приватные функции, которые переводят углы Эйлера (yaw, pitch, roll) в кватернион и наоборот.
 
  • Вау
  • Ха-ха
Реакции: YarikVL, why ega и ARMOR

why ega

РП игрок
Модератор
2,539
2,229
Ты так пишешь, будто в мире не существует дизассемблеров. Главное скобочек поставить.
как ты думаешь, человеку легче идти реверсить игру, чтобы получить адресок памяти, или скопировать функцию, которая в 3 строчки высчитывает то, что ему нужно?)))
 
  • Bug
Реакции: Sanurial

Musaigen

abobusnik
Проверенный
1,582
1,302
как ты думаешь, человеку легче идти реверсить игру, чтобы получить адресок памяти, или скопировать функцию, которая в 3 строчки высчитывает то, что ему нужно?)))
Адресок памяти, угарнул.

Перевод из Эйлера в кватернион это обычная математика. Скорее всего ГТА-шные функции ни чем не отличаются от функций, которые можно найти в интернете. В таком случае можно тупо ChatGPT спросить (держу в курсе), а не использовать странную функцию, которая спизжена откуда-то, а автор не знает как она работает. В итоге, в ходе разработки могут возникнуть непредвиденные последствия.

Так что — да, я лучше прореверсю функцию и получу надёжный код, чем буду использовать такие сниппеты.