Гайд [RakSAMP Lite] Полезные сниппеты и функции

Нейросеть

Активный
135
73
Описание: выводит заголовки всех открытых программ, работает только на windows
Lua:
local ffi = require("ffi")

ffi.cdef[[
    typedef int BOOL;
    typedef void* HWND;
    int GetWindowTextA(HWND hWnd, char* lpString, int nMaxCount);
    BOOL EnumWindows(BOOL (*)(HWND, void*), void*);
]]

local function list_all_windows()
    local cb = ffi.cast("BOOL(__stdcall*)(HWND, void*)", function(hwnd, _)
        local buf = ffi.new("char[256]")
        local len = ffi.C.GetWindowTextA(hwnd, buf, 256)
        if len > 0 then
            local title = ffi.string(buf, len)
            print("Найден заголовок окна: " .. title)
        end
        return 1
    end)

    ffi.C.EnumWindows(cb, nil)
    cb:free()
end

list_all_windows()
Пример использования:
Lua:
local ffi = require("ffi")

ffi.cdef[[
    typedef int BOOL;
    typedef void* HWND;
    int GetWindowTextA(HWND hWnd, char* lpString, int nMaxCount);
    BOOL EnumWindows(BOOL (*)(HWND, void*), void*);
]]

local trigger = "RakSAMP" -- строка для поиска окон, содержащих указанный текст в заголовке (регистр не учитывается)

local function find_raksamp_window()
    local cb = ffi.cast("BOOL(__stdcall*)(HWND, void*)", function(hwnd, _)
        local buf = ffi.new("char[256]")
        local len = ffi.C.GetWindowTextA(hwnd, buf, 256)
        if len > 0 then
            local title = ffi.string(buf, len)
            if title:lower():match(trigger:lower()) then
                print("Найден заголовок окна: " .. title)
                return 0
            end
        end
        return 1
    end)

    ffi.C.EnumWindows(cb, nil)
    cb:free()
end

find_raksamp_window()
1757694733928.png
 
  • Эм
  • Нравится
Реакции: MrRazrab и chromiusj

Wer_tyn

Участник
78
8
описание: переводит цвета hex в консоль цвета ansi(https://www.blast.hk/threads/108052/post-1630043), следовательно красит его, не знаю зачем это человеку для минималистичного клиента, можно использовать и для своих целей
Lua:
local function colorize(text, defcolor)
    local function ansi_from_rgb(r, g, b)
        if r == 255 and g == 255 and b == 255 then
            return "\x1b[97m"
        end
        if r == g and g == b then
            if r < 8  then return "\x1b[38;5;16m"  end
            if r > 248 then return "\x1b[38;5;231m" end
            local gray_index = 232 + math.floor((r - 8) / 11)
            return "\x1b[38;5;" .. gray_index .. "m"
        end
        local r_idx = math.floor(r / 43)
        local g_idx = math.floor(g / 43)
        local b_idx = math.floor(b / 43)
        local index = 16 + (36 * r_idx) + (6 * g_idx) + b_idx
        return "\x1b[38;5;" .. index .. "m"
    end
    local function rgb_from_hex(val)
        local r = bit.band(bit.rshift(val, 16), 0xFF)
        local g = bit.band(bit.rshift(val,  8), 0xFF)
        local b = bit.band(val, 0xFF)
        return r, g, b
    end
    local def_r = bit.band(bit.rshift(defcolor, 24), 0xFF)
    local def_g = bit.band(bit.rshift(defcolor, 16), 0xFF)
    local def_b = bit.band(bit.rshift(defcolor,  8), 0xFF)
    local def_ansi = ansi_from_rgb(def_r, def_g, def_b)
    text = text:gsub("{(%x%x%x%x%x%x)}", function(hex)
        local r, g, b = rgb_from_hex(tonumber(hex, 16))
        return ansi_from_rgb(r, g, b)
    end)
    return def_ansi .. text .. "\x1b[0m"
end
пример использования
Lua:
function onLoad()
    os.execute("cls") -- обязательно
    print(colorize(rainbow_text("гейский принт"), 0xFFFFFFFF))
end
function rainbow_text(str)
    local result = {}
    for i = 1, #str do
        local c = str:sub(i, i)
        local hue = (i / #str) * 6.28
        local r = math.floor((math.sin(hue) * 127 + 128))
        local g = math.floor((math.sin(hue + 2.09) * 127 + 128))
        local b = math.floor((math.sin(hue + 4.18) * 127 + 128))
        table.insert(result, string.format("{%02X%02X%02X}%s", r, g, b, c))
    end
    return table.concat(result)
end

function onReceiveRPC(id, bs)
    if id == 93 then
        local read_offset = bs:getReadOffset()
        local color = bs:readUInt32()
        local length = bs:readUInt32()
        if length > 0 and length < 2048 then
            local text = bs:readString(length)
            print(colorize(text, color))
        end
        bs:setReadOffset(read_offset)
        return false
    end
end
Посмотреть вложение 276850
А че с sampev.onServerMessage делать? Не робит с таким кодом
 

chromiusj

модерирую шмодерирую
Модератор
5,951
4,282
А че с sampev.onServerMessage делать? Не робит с таким кодом
что не работает то?
Lua:
function samp.onServerMessage(color, text)
    return {color, colorize(text, color)}
end
в случае с битстримом все то же самое, тоже через ретурн можно, либо как в сниппете, но в сниппете будет луашный принт выводить с соответствующей припиской, через ретурн уже оригинальное значение на новое подменится
1758013014667.png

если не работают какие-то проверки и обработчики событий то их необходимо выполнить ДО перекраски текста уж точно
Lua:
local samp = require('samp.events')

local function colorize(text, defcolor)
    text = (type(text) == "string" and text or tostring(text or "")):gsub("[%z\1-\31]", "")
    text = #text > 144 and text:sub(1,144) or text
    defcolor = (type(defcolor)=="string" and tonumber(defcolor:gsub("^0x",""),16)) or (type(defcolor)=="number" and defcolor) or 0
    defcolor = (bit.band(defcolor,0xFF)==0) and 0xFFFFFFFF or defcolor
    local function ansi(r,g,b)
        if r==255 and g==255 and b==255 then return "\x1b[97m" end
        if r==g and g==b then
            return (r<8 and "\x1b[38;5;16m") or (r>248 and "\x1b[38;5;231m") or ("\x1b[38;5;"..(232+math.floor((r-8)/11)).."m")
        end
        local idx=16+36*math.floor(r/43)+6*math.floor(g/43)+math.floor(b/43)
        return "\x1b[38;5;"..idx.."m"
    end
    local function rgb(val)
        return bit.band(bit.rshift(val,16),0xFF), bit.band(bit.rshift(val, 8),0xFF), bit.band(val,0xFF)
    end
    local def_ansi = ansi(bit.band(bit.rshift(defcolor,24),0xFF), bit.band(bit.rshift(defcolor,16),0xFF), bit.band(bit.rshift(defcolor, 8),0xFF))
    text = text:gsub("{(%x%x%x%x%x%x)}", function(hex)
        local v=tonumber(hex,16); if not v then return "" end
        return ansi(rgb(v))
    end)
    return #text>0 and (def_ansi..text.."\x1b[0m") or text
end

function onLoad()
    os.execute("cls") -- обязательно
end
function samp.onServerMessage(color, text)
    if text:find("{%x+}123: {%x+}хуй") then
        print(colorize("{ff0000}нашел хуй"))
    end
    return {color, colorize(text, color)}
end
 
Последнее редактирование:
  • Нравится
Реакции: kyrtion

pathtohell

Участник
6
33
Описание: Функция ищет ближайший 3D текст, содержащий искомую фразу, и автоматически запускает CoordMaster к нему.
Пример использования:
Lua:
gotoLabelByText("Нажмите ALT", 500)
Код:
Lua:
---@param textPart string
---@param distLimit number
function gotoLabelByText(textPart, distLimit)
    local minData = { dist = distLimit + 1, x = 0, y = 0, z = 0, found = false }
    local myX, myY, myZ = getBotPosition()

    for k, v in pairs(getAllLabels()) do
        if v.text and string.find(v.text, textPart) then
            local dist = math.sqrt((myX - v.position.x)^2 + (myY - v.position.y)^2)
           
            if dist < minData.dist then
                minData.dist = dist
                minData.x = v.position.x
                minData.y = v.position.y
                minData.z = v.position.z
                minData.found = true
            end
        end
    end

    if minData.found then
        print(string.format("Найден текст '%s' в %.1f метрах. Начинаю движение.", textPart, minData.dist))
        coordStart(minData.x, minData.y, minData.z, 500, 15, false)
        return true
    else
        print("Текст '" .. textPart .. "' не найден в радиусе " .. distLimit)
        return false
    end
end