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

Petr_Sergeevich

Известный
Проверенный
707
296
Описание: получение минимального расстояния от точки до прямой в пространстве
Lua:
function getCanonicalEquation(segment)
    local p1, p2 = segment.p1, segment.p2
    local directingVector = { x = p2.x - p1.x, y = p2.y - p1.y, z = p2.z - p1.z }
    local point = { x = p1.x, y = p1.y, z = p1.z }
    return directingVector, point
end

function getVectorBetween2Vectors(cPosition, point)
    local v1, v2 = cPosition, point
    return { x = v2.x - v1.x, y = v2.y - v1.y, z = v2.z - v1.z }
end

function getVectorMultiply(vBetween2Vectors, directingVector)
    local v1, v2 = vBetween2Vectors, directingVector
    return { x = v1.y * v2.z - v1.z * v2.y, y = v1.z * v2.x - v1.x * v2.z, z = v1.x * v2.y - v1.y * v2.x }
end

function getDistanceBetweenPointAndLine(vBetween2Vectors, directingVector)
    local v1, v2 = vBetween2Vectors, directingVector
    return math.sqrt(v1.x * v1.x + v1.y * v1.y + v1.z * v1.z) / math.sqrt(v2.x * v2.x + v2.y * v2.y + v2.z * v2.z)
end

Пример использования:
Lua:
-- Ваши координаты
local x, y, z = getCharCoordinates(PLAYER_PED)
local vPos = { x = x, y = y, z = z }

-- Отрезок
local segment = {
    p1 = { x = 2572.2205, y = 1241.4359, z = 10.8203 },
    p2 = { x = 2572.2205, y = 1229.4359, z = 10.8203 }
}

local directingVector, point = getCanonicalEquation(segment)
local vBetween2Vectors = getVectorBetween2Vectors(vPos, point)
local vMultiply = getVectorMultiply(vBetween2Vectors, directingVector)

local distance = getDistanceBetweenPointAndLine(vMultiply, directingVector)
print(distance)
 
Последнее редактирование:

ShuffleBoy

Известный
Друг
754
429
Описание: Бег к координатам (2d)
Код:
Lua:
function go_to_point(point, is_sprint)
    local dist
    repeat
        set_camera_direction(point)
        wait(0)
        setGameKeyState(1, -255)
        local mx, my, mz = getCharCoordinates(playerPed)
        if is_sprint then setGameKeyState(16, 255) end
        dist = getDistanceBetweenCoords2d(point.x, point.y, mx, my)
    until dist < 0.6
end

function set_camera_direction(point)
    local c_pos_x, c_pos_y, c_pos_z = getActiveCameraCoordinates()
    local vect = {x = point.x - c_pos_x, y = point.y - c_pos_y}
    local ax = math.atan2(vect.y, -vect.x)
    setCameraPositionUnfixed(0.0, -ax)
end

Пример использования:
Lua:
lua_thread.create(go_to_point, {x=1337.228, y=720.000})
 

kotov

Участник
128
12
Описание: Рисует линию по 3d координатам.
Код:
Lua:
function renderDrawLineBy3dCoords(posX, posY, posZ, posX2, posY2, posZ2, width, color)
    local SposX, SposY = convert3DCoordsToScreen(posX, posY, posZ)
    local SposX2, SposY2 = convert3DCoordsToScreen(posX2, posY2, posZ2)
    if isPointOnScreen(posX, posY, posZ, 1) and isPointOnScreen(posX2, posY2, posZ2, 1) then
        renderDrawLine(SposX, SposY, SposX2, SposY2, width, color)
    end
end
Пример использования:
Lua:
renderDrawLineBy3dCoords(2329.4893, -1146.8486, 1050.7031, 2320.3384, -1146.9265, 1050.7101, 1, 0xffff0000)
Скриншот:
c624c70ee74e8c7db6e0c939aa36a4bd.png
 

trefa

Известный
Всефорумный модератор
2,097
1,230
Описание: Система диалогов с разными стилями.
Lua:
function start_dialog(menu)
    function _dialog(menu, id,  outs)
        sampShowDialog(id, menu.settings.title, tbl_split(menu.settings.style, menu, menu.settings.forward ,menu.settings.backwards ,menu.settings.score), menu.settings.btn1, (menu.settings.btn2 ~= nil and menu.settings.btn2 or _), menu.settings.style)
            repeat
                wait(0)
                local result, button, list, input = sampHasDialogRespond(id)
                if result then
                    local out, outs = menu[((menu.settings.style == 0 or menu.settings.style == 1 or menu.settings.style == 3) and 1 or ((list + 1) > #menu[1] and 2 or 1))][((menu.settings.style == 0 or menu.settings.style == 1 or menu.settings.style == 3) and 1 or ((list + 1) > #menu[1] and (list - #menu[1]) + 1  or list + 1))].click(button, list, input, outs)
                    if type(out) == "table" then
                        return _dialog(out, id - 1, outs)
                    elseif type(out) == "boolean" then
                        if not out then
                            return out
                        end
                            return _dialog(menu, id, outs)
                    end
                end
            until result
    end

    function tbl_split(style, tbl, forward ,backwards ,score)
        if style == 2 or style == 4 or style == 5 then
            text = (style == 5 and tbl[1].text.."\n" or "")
            for i, val in ipairs(tbl[1]) do
                text = text..""..forward..""..(score and "{ff0000}"..i.."){ffffff} " or "")..""..val.title..""..backwards
            end
            if tbl[2] ~= nil then
                for _, val in ipairs(tbl[2]) do
                    text = text..""..forward..""..val.title..""..backwards
                end
            end
            return text
        end
        return tbl[1].text
    end

    return _dialog(menu, 1337, outs)
end

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

Lua:
dialog = {
    {
         settings = {title = "Пример диалога" ,style = 4 ,btn1 = "Далее" ,btn2 = "Закрыть" ,forward =  "{ffffff}" ,backwards = "\n" ,score = true},
        {
            {
                title = "Диалог 0 стиля\t ",
                click = function(button, list, input , outs)
                    if button == 1 then return dialog[2] end
                end
            },
            {
                title = "Диалог 1 стиля\t ",
                click = function(button, list, input , outs)
                    if button == 1 then return dialog[3] end
                end
            },
            {
                title = "Диалог 2 стиля\t ",
                click = function(button, list, input , outs)
                    if button == 1 then return dialog[4] end
                end
            },
            {
                title = "Диалог 3 стиля\t ",
                click = function(button, list, input , outs)
                    if button == 1 then return dialog[5] end
                end
            },
            {
                title = "Диалог 4 стиля\t ",
                click = function(button, list, input , outs)
                    if button == 1 then return dialog[6] end
                end
            },
            {
                title = "Диалог 5 стиля\t ",
                click = function(button, list, input , outs)
                    if button == 1 then return dialog[7] end
                end
            }
        },
        {
            {
                title = " \t ",
                click = function(button, list, input , outs)
                    if button == 1 then
                        sampAddChatMessage("А тут пусто", 0xffcecece)
                        return true
                    end
                end
            },
            {
                title = "Сохранение параметров преведущих диалоговых окон\t ",
                click = function(button, list, input , outs)
                    if button == 1 then
                        dialog[8].settings.title = "Окно №1"
                        return dialog[8], {["i"] = 1,{"","","","",""}}
                    end
                end
            },
            {
                title = "Расчет номера элемента для первой таблицы\t{00ff00}Включено",
                click = function(button, list, input , outs)
                    if button == 1 then
                        dialog[1].settings.score = not dialog[1].settings.score
                        dialog[1][2][3].title = "Расчет номера элемента для первой таблицы\t"..(dialog[1].settings.score and "{00ff00}Включено" or "{ff0000}Выключено")
                        return true
                    end
                end
            }
        }
    },
    {
        settings = {title = "Диалог 0 стиля" ,style = 0 ,btn1 = "Назад" ,forward =  "{ff0000}" ,backwards = "\n" ,score = false},
        {
            text = "{ffffff}Привет\nЭто диалог нулевого стиля.",
            {
                click = function(button, list, input , outs)
                    return dialog[1]
                end
            }
        }
    },
    {
        settings = {title = "Диалог 1 стиля" ,style = 1 ,btn1 = "Текст",btn2 = "Назад",forward =  "{ff0000}" ,backwards = "\n" ,score = false},
        {
            text = "{ffffff}Привет\nЭто диалог первого стиля.\n \n{ff0000}А ниже можно что то написать.",
            {
                click = function(button, list, input , outs)
                    if button == 0 then
                        return dialog[1]
                    else
                        sampAddChatMessage("Вы написали в диалог вот это: "..input, 0xffcecece)
                        return true
                    end
                end
            }
        }
    },
    {
        settings = {title = "Диалог 2 стиля" ,style = 2 ,btn1 = "Назад",forward =  "{ff0000}" ,backwards = "\n" ,score = false},
        {
            {
                title = "1",
                click = function(button, list, input , outs)
                    sampAddChatMessage("Выбран пункт: "..(list + 1), 0xffcecece)
                    return dialog[1]
                end
            },
            {
                title = "2",
                click = function(button, list, input , outs)
                    sampAddChatMessage("Выбран пункт: "..(list + 1), 0xffcecece)
                    return dialog[1]
                end
            },
            {
                title = "3",
                click = function(button, list, input , outs)
                    sampAddChatMessage("Выбран пункт: "..(list + 1), 0xffcecece)
                    return dialog[1]
                end
            },
            {
                title = "4",
                click = function(button, list, input , outs)
                    sampAddChatMessage("Выбран пункт: "..(list + 1), 0xffcecece)
                    return dialog[1]
                end
            },
            {
                title = "5",
                click = function(button, list, input , outs)
                    sampAddChatMessage("Выбран пункт: "..(list + 1), 0xffcecece)
                    return dialog[1]
                end
            }
        }
    },
    {
        settings = {title = "Диалог 3 стиля" ,style = 3 ,btn1 = "Текст",btn2 = "Назад",forward =  "{ff0000}" ,backwards = "\n" ,score = false},
        {
            text = "{ffffff}Привет\nЭто диалог третьего стиля.\n \n{ff0000}А ниже можно что то написать.",
            {
                click = function(button, list, input , outs)
                    if button == 0 then
                        return dialog[1]
                    else
                        sampAddChatMessage("Вы написали в диалог вот это: "..input, 0xffcecece)
                        return true
                    end
                end
            }
        }
    },
    {
        settings = {title = "Диалог 4 стиля" ,style = 4 ,btn1 = "Далее",btn2 = "Назад",forward =  "{ff0000}" ,backwards = "\n" ,score = false},
        {
            {
                title = "1\t2",
                click = function(button, list, input , outs)
                    if button == 1 then
                        sampAddChatMessage("Выбран пункт: "..(list + 1), 0xffcecece)
                        return dialog[1]
                    end
                    return dialog[1]
                end
            },
            {
                title = "1\t2",
                click = function(button, list, input , outs)
                    if button == 1 then
                        sampAddChatMessage("Выбран пункт: "..(list + 1), 0xffcecece)
                        return dialog[1]
                    end
                    return dialog[1]
                end
            },
            {
                title = "1\t2",
                click = function(button, list, input , outs)
                    if button == 1 then
                        sampAddChatMessage("Выбран пункт: "..(list + 1), 0xffcecece)
                        return dialog[1]
                    end
                    return dialog[1]
                end
            },
            {
                title = "1\t2",
                click = function(button, list, input , outs)
                    if button == 1 then
                        sampAddChatMessage("Выбран пункт: "..(list + 1), 0xffcecece)
                        return dialog[1]
                    end
                    return dialog[1]
                end
            }
        }
    },
    {
        settings = {title = "Диалог 5 стиля" ,style = 5 ,btn1 = "Далее",btn2 = "Назад",forward =  "{ff0000}" ,backwards = "\n" ,score = false},
        {
            text = "Первое\tВторое",
            {
                title = "1\t2",
                click = function(button, list, input , outs)
                    if button == 1 then
                        sampAddChatMessage("Выбран пункт: "..(list + 1), 0xffcecece)
                        return dialog[1]
                    end
                    return dialog[1]
                end
            },
            {
                title = "1\t2",
                click = function(button, list, input , outs)
                    if button == 1 then
                        sampAddChatMessage("Выбран пункт: "..(list + 1), 0xffcecece)
                        return dialog[1]
                    end
                    return dialog[1]
                end
            },
            {
                title = "1\t2",
                click = function(button, list, input , outs)
                    if button == 1 then
                        sampAddChatMessage("Выбран пункт: "..(list + 1), 0xffcecece)
                        return dialog[1]
                    end
                    return dialog[1]
                end
            },
            {
                title = "1\t2",
                click = function(button, list, input , outs)
                    if button == 1 then
                        sampAddChatMessage("Выбран пункт: "..(list + 1), 0xffcecece)
                        return dialog[1]
                    end
                    return dialog[1]
                end
            }
        }
    },
    {
        settings = {title = "Окно №1" ,style = 1 ,btn1 = "Далее",btn2 = "Завершить",forward =  "{ff0000}" ,backwards = "\n" ,score = false},
        {
            text = "{ffffff}Напишите что то в диалоговое окно.",
            {
                click = function(button, list, input , outs)
                    if button == 1 then
                        outs[1][outs.i] = tostring(input)
                        outs.i = outs.i + 1
                        dialog[8].settings.title = "Окно №"..outs.i
                        if outs.i > 5 then
                            dialog[9][1].text = "{ffffff}"
                            for i = 1, #outs[1] do
                                dialog[9][1].text = dialog[9][1].text.."Диалог №"..i..": "..tostring(outs[1][i]).."\n"
                            end
                            return dialog[9]
                        else
                            return dialog[8], outs
                        end
                    else
                        return dialog[1]
                    end
                end
            }
        }
    },
    {
        settings = {title = "Итог" ,style = 0 ,btn1 = "Повторить",btn2 = "Завершить",forward =  "{ff0000}" ,backwards = "\n" ,score = false},
        {
            text = "",
            {
                click = function(button, list, input , outs)
                    if button == 1 then
                        dialog[8].settings.title = "Окно №1"
                        return dialog[8], {["i"] = 1,{"","","","",""}}
                    end
                    return dialog[1]
                end
            }
        }
    }
}


function main()
    sampRegisterChatCommand("/test", function()
        lua_thread.create(function()
            start_dialog(dialog[1])
        end)
    end)
    wait(-1)
end

function start_dialog(menu)
    function _dialog(menu, id,  outs)
        local text = tbl_split(menu.settings.style, menu, menu.settings.forward ,menu.settings.backwards ,menu.settings.score)
        sampShowDialog(id, menu.settings.title, text, menu.settings.btn1, (menu.settings.btn2 ~= nil and menu.settings.btn2 or _), menu.settings.style)
            repeat
                wait(0)
                local result, button, list, input = sampHasDialogRespond(id)
                if result then
                    local out, outs = menu[((menu.settings.style == 0 or menu.settings.style == 1 or menu.settings.style == 3) and 1 or ((list + 1) > #menu[1] and 2 or 1))][((menu.settings.style == 0 or menu.settings.style == 1 or menu.settings.style == 3) and 1 or ((list + 1) > #menu[1] and (list - #menu[1]) + 1  or list + 1))].click(button, list, input, outs)
                    if type(out) == "table" then
                        return _dialog(out, id - 1, outs)
                    elseif type(out) == "boolean" then
                        if not out then
                            return out
                        end
                            return _dialog(menu, id, outs)
                    end
                end
            until result
    end

    function tbl_split(style, tbl, forward ,backwards ,score)
        if style == 2 or style == 4 or style == 5 then
            text = (style == 5 and tbl[1].text.."\n" or "")
            for i, val in ipairs(tbl[1]) do
                text = text..""..forward..""..(score and "{ff0000}"..i..") " or "").."{ffffff}"..val.title..""..backwards
            end
            if tbl[2] ~= nil then
                for _, val in ipairs(tbl[2]) do
                    text = text..""..forward..""..val.title..""..backwards
                end
            end
            return text
        end
        return tbl[1].text
    end

    return _dialog(menu, 1337, outs)
end
Update: Ещё более большой пример работы с функцией click
 

Вложения

  • primer.lua
    13 KB · Просмотры: 61
Последнее редактирование:

Musaigen

abobusnik
Проверенный
1,582
1,302
Описание: Рисует прямоугольник с круглыми углами. Источник: клик
Lua:
-- r - округление
function renderBoxRounded(x, y, w, h, r, color)
    renderDrawBox(x + r, y, w - r, h - 1, color)

    renderCircle(x + r, y, r * 4, math.pi, 3 * math.pi / 2, color)
    renderDrawBox(x - r + 1, y + r * 2 - 1, r * 2 - 1, h - r * 4, color)
    renderRound(x + r, y + h - r * 4, r * 4, math.pi / 2, math.pi, color)

    renderCircle(x + w, y, r * 4, 3 * math.pi / 2, 2 * math.pi, color)
    renderDrawBox(x + w, y + r * 2 - 1, r * 2, h - r * 4, color)
    renderCircle(x + w, y + h - r * 4, r * 4, 0, math.pi / 2, color)

end

function renderCircle(x, y, d, s, e, color)
    local r = math.ceil( d / 2 )
    y = y - 1.0
    renderBegin(6)

    local step = math.abs(((e < 0) and (2 * math.pi + e) or e) - ((s < 0) and (2 * math.pi + s) or s)) / r
    renderColor(color)
    renderVertex(x, y + r)
    for i = s, e, step do
        renderVertex(x + r * math.cos( i ), y + r * math.sin( i ) + r)
    end
    renderVertex(x + r * math.cos( e ), y + r * math.sin( e ) + r)


    renderEnd()
end

function renderRound(x, y, d, s, e, color)
    local r = math.ceil( d / 2 )
    y = y - 1.0
    renderBegin(6)

    local step = e / (d - 1)
    renderColor(color)
    renderVertex(x, y + r)
    for i = s, e, step do
        renderVertex(x + r * math.cos( i ), y + r * math.sin( i ) + r)
    end
    r = r - 1
    renderVertex(x + r * math.cos( e ), y + r * math.sin( e ) + r)

    renderEnd()
end
Пример использования
Lua:
function main()
    while not isSampAvailable() do wait(0) end

    while true do wait(0)
        renderBoxRounded(250, 250, 100, 15, 4, 0xFF00FF00)
    end
end
sa-mp-011.png
 

FYP

Известный
Администратор
1,758
5,722
Описание: Рисует прямоугольник с круглыми углами. Источник: клик
Lua:
-- r - округление
function renderBoxRounded(x, y, w, h, r, color)
    renderDrawBox(x + r, y, w - r, h - 1, color)

    renderCircle(x + r, y, r * 4, math.pi, 3 * math.pi / 2, color)
    renderDrawBox(x - r + 1, y + r * 2 - 1, r * 2 - 1, h - r * 4, color)
    renderRound(x + r, y + h - r * 4, r * 4, math.pi / 2, math.pi, color)

    renderCircle(x + w, y, r * 4, 3 * math.pi / 2, 2 * math.pi, color)
    renderDrawBox(x + w, y + r * 2 - 1, r * 2, h - r * 4, color)
    renderCircle(x + w, y + h - r * 4, r * 4, 0, math.pi / 2, color)

end

function renderCircle(x, y, d, s, e, color)
    local r = math.ceil( d / 2 )
    y = y - 1.0
    renderBegin(6)

    local step = math.abs(((e < 0) and (2 * math.pi + e) or e) - ((s < 0) and (2 * math.pi + s) or s)) / r
    renderColor(color)
    renderVertex(x, y + r)
    for i = s, e, step do
        renderVertex(x + r * math.cos( i ), y + r * math.sin( i ) + r)
    end
    renderVertex(x + r * math.cos( e ), y + r * math.sin( e ) + r)


    renderEnd()
end

function renderRound(x, y, d, s, e, color)
    local r = math.ceil( d / 2 )
    y = y - 1.0
    renderBegin(6)

    local step = e / (d - 1)
    renderColor(color)
    renderVertex(x, y + r)
    for i = s, e, step do
        renderVertex(x + r * math.cos( i ), y + r * math.sin( i ) + r)
    end
    r = r - 1
    renderVertex(x + r * math.cos( e ), y + r * math.sin( e ) + r)

    renderEnd()
end
Пример использования
Lua:
function main()
    while not isSampAvailable() do wait(0) end

    while true do wait(0)
        renderBoxRounded(250, 250, 100, 15, 4, 0xFF00FF00)
    end
end
включение сглаживания
Lua:
renderSetRenderState(161 --[[D3DRS_MULTISAMPLEANTIALIAS]], 1)
 

TheRuthArbiter

Неповторимый РПшер
Проверенный
523
305
Описание: Округляет число до указанной точности.
Lua:
function math.round(num, idp)
    local mult = 10^(idp or 0)
    return math.floor(num * mult + 0.5) / mult
end
Пример использования:
Lua:
math.round(7.777777, 1) -- вернёт 7.8
 

штейн

Известный
Проверенный
1,001
687
Описание: заменяет все возможные символы на русские буквы, использует функцию от @qrlk
Lua:
function RusToEng(text)
    lang = {['`'] = 'ё', ['~'] = 'ё', ['q'] = 'й', ['w'] = 'ц', ['e'] = 'у', ['r'] = 'к', ['t'] = 'е', ['y'] = 'н', ['u'] = 'г', ['i'] = 'ш', ['o'] = 'щ', ['p'] = 'з', ['['] = 'х', ['{'] = 'х', [']'] = 'ъ', ['}'] = 'ъ', ['a'] = 'ф', ['s'] = 'ы', ['d'] = 'в', ['f'] = 'а', ['g'] = 'п', ['h'] = 'р', ['j'] = 'о', ['k'] = 'л', ['l'] = 'д', [';'] = 'ж', ["'"] = 'э', ['"'] = 'э', ['z'] = 'я', ['x'] = 'ч', ['c'] = 'с', ['v'] = 'м', ['b'] = 'и', ['n'] = 'т', ['m'] = 'ь', ['<'] = 'б', [','] = 'б', ['>'] = 'ю', ['.'] = 'ю'}
    result = text == '' and nil or ''
    if result then
        for i = 0, #text do
            letter = string.sub(text, i, i)
            if letter then
                result = (letter:find('[A-Z/{/}/</>]') and string.rupper(lang[string.lower(letter)]) or letter:find('[a-z/,]') and lang[letter] or letter)..result
            end
        end
    end
    return result and result:reverse() or result
end

Пример использования:
Lua:
-- если ввести [eq вернёт хуй
function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('asd', function(text) sampAddChatMessage(RusToEng(text), -1) end)
    wait(-1)
end

function RusToEng(text)
    lang = {['`'] = 'ё', ['~'] = 'ё', ['q'] = 'й', ['w'] = 'ц', ['e'] = 'у', ['r'] = 'к', ['t'] = 'е', ['y'] = 'н', ['u'] = 'г', ['i'] = 'ш', ['o'] = 'щ', ['p'] = 'з', ['['] = 'х', ['{'] = 'х', [']'] = 'ъ', ['}'] = 'ъ', ['a'] = 'ф', ['s'] = 'ы', ['d'] = 'в', ['f'] = 'а', ['g'] = 'п', ['h'] = 'р', ['j'] = 'о', ['k'] = 'л', ['l'] = 'д', [';'] = 'ж', ["'"] = 'э', ['"'] = 'э', ['z'] = 'я', ['x'] = 'ч', ['c'] = 'с', ['v'] = 'м', ['b'] = 'и', ['n'] = 'т', ['m'] = 'ь', ['<'] = 'б', [','] = 'б', ['>'] = 'ю', ['.'] = 'ю'}
    result = text == '' and nil or ''
    if result then
        for i = 0, #text do
            letter = string.sub(text, i, i)
            if letter then
                result = (letter:find('[A-Z/{/}/</>]') and string.rupper(lang[string.lower(letter)]) or letter:find('[a-z/,]') and lang[letter] or letter)..result
            end
        end
    end
    return result and result:reverse() or result
end

function string.rupper(s) -- function by qrlk (https://blast.hk/threads/13380/#post-170330)
    local russian_characters = { [168] = 'Ё', [184] = 'ё', [192] = 'А', [193] = 'Б', [194] = 'В', [195] = 'Г', [196] = 'Д', [197] = 'Е', [198] = 'Ж', [199] = 'З', [200] = 'И', [201] = 'Й', [202] = 'К', [203] = 'Л', [204] = 'М', [205] = 'Н', [206] = 'О', [207] = 'П', [208] = 'Р', [209] = 'С', [210] = 'Т', [211] = 'У', [212] = 'Ф', [213] = 'Х', [214] = 'Ц', [215] = 'Ч', [216] = 'Ш', [217] = 'Щ', [218] = 'Ъ', [219] = 'Ы', [220] = 'Ь', [221] = 'Э', [222] = 'Ю', [223] = 'Я', [224] = 'а', [225] = 'б', [226] = 'в', [227] = 'г', [228] = 'д', [229] = 'е', [230] = 'ж', [231] = 'з', [232] = 'и', [233] = 'й', [234] = 'к', [235] = 'л', [236] = 'м', [237] = 'н', [238] = 'о', [239] = 'п', [240] = 'р', [241] = 'с', [242] = 'т', [243] = 'у', [244] = 'ф', [245] = 'х', [246] = 'ц', [247] = 'ч', [248] = 'ш', [249] = 'щ', [250] = 'ъ', [251] = 'ы', [252] = 'ь', [253] = 'э', [254] = 'ю', [255] = 'я', }
    s = s:upper()
    local strlen = s:len()
    if strlen == 0 then return s end
    s = s:upper()
    local output = ''
    for i = 1, strlen do
        local ch = s:byte(i)
        if ch >= 224 and ch <= 255 then -- lower russian characters
            output = output .. russian_characters[ch - 32]
        elseif ch == 184 then -- ё
            output = output .. russian_characters[168]
        else
            output = output .. string.char(ch)
        end
    end
    return output
end
 
  • Нравится
Реакции: Alkasch226

rraggerr

проверенный какой-то
1,626
846
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Описание: Калькулятор
Lua:
function calc(str)
    return assert(load("return " .. str))()
end
Пример использования:
Lua:
print(calc("2+2*2+2*2*2+2")) -- 16
Lua:
print(calc("52+5039-212*521/22*12-424+522+11-11^2+6^6+6^2+2/2")) -- -8474.5454545455
 
Последнее редактирование:

Frapsy

Известный
Проверенный
393
226
Описание: Обфускатор(если его таковым можно назвать), который не даст через блокнот глянуть, что происходит в скрипте. Не спасет от hex'a или же питоновского декомпиля, но что один, что второй - оба неудобны для разбора глазом. Для отдельной темы - слишком много чести.
Lua:
local a=[[
  print("Сюда вставляете все то, что хотим спрятать от блокнота, будь то строка, функция либо же весь код.")
]]

a="--// Decompiled Code. \n"..a;function Obfuscate(b)local c="function IllIlllIllIlllIlllIlllIll(IllIlllIllIllIll) if (IllIlllIllIllIll==(((((919 + 636)-636)*3147)/3147)+919)) then return not true end if (IllIlllIllIllIll==(((((968 + 670)-670)*3315)/3315)+968)) then return not false end end; "local d=c;local e=""local f={"IllIllIllIllI","IIlllIIlllIIlllIIlllII","IIllllIIllll"}local g=[[local IlIlIlIlIlIlIlIlII = {]]local h=[[local IllIIllIIllIII = loadstring]]local i=[[local IllIIIllIIIIllI = table.concat]]local j=[[local IIIIIIIIllllllllIIIIIIII = "''"]]local k="local "..f[math.random(1,#f)].." = (7*3-9/9+3*2/0+3*3);"local l="local "..f[math.random(1,#f)].." = (3*4-7/7+6*4/3+9*9);"local m="--// Obfuscated with LuaSeel 1.1 \n\n"for n=1,string.len(b)do e=e.."'\\"..string.byte(b,n).."',"end;local o="function IllIIIIllIIIIIl("..f[math.random(1,#f)]..")"local p="function "..f[math.random(1,#f)].."("..f[math.random(1,#f)]..")"local q="local "..f[math.random(1,#f)].." = (5*3-2/8+9*2/9+8*3)"local r="end"local s="IllIIIIllIIIIIl(900283)"local t="function IllIlllIllIlllIlllIlllIllIlllIIIlll("..f[math.random(1,#f)]..")"local q="function "..f[math.random(1,#f)].."("..f[math.random(1,#f)]..")"local u="local "..f[math.random(1,#f)].." = (9*0-7/5+3*1/3+8*2)"local v="end"local w="IllIlllIllIlllIlllIlllIllIlllIIIlll(9083)"local x=m..d..k..l..i..";"..o.." "..p.." "..q.." "..r.." "..r.." "..r..";"..s..";"..t.." "..q.." "..u.." "..v.." "..v..";"..w..";"..h..";"..g..e.."}".."IllIIllIIllIII(IllIIIllIIIIllI(IlIlIlIlIlIlIlIlII,IIIIIIIIllllllllIIIIIIII))()"print(x)end;do Obfuscate(a)end
Пример использования: Идем в любой компилятор(я беру онлайн), вставляем туда код, компилируем и выхлоп кидаем себе в скрипт.
На выходе получаем что-то по типу такого, как на скрине
EHvY3.png
 
Последнее редактирование:

Shell :3

Активный
159
32
Описание: Ставит чекпоинт с указанным типом, координатами, радиусом. Также ставит метку на карте с указанным цветом.
Код:
Lua:
function setMarker(type, x, y, z, radius, color)
    deleteCheckpoint(marker)
    removeBlip(checkpoint)
    checkpoint = addBlipForCoord(x, y, z)
    marker = createCheckpoint(type, x, y, z, 1, 1, 1, radius)
    changeBlipColour(checkpoint, color)
    lua_thread.create(function()
    repeat
        wait(0)
        local x1, y1, z1 = getCharCoordinates(PLAYER_PED)
        until getDistanceBetweenCoords3d(x, y, z, x1, y1, z1) < radius or not doesBlipExist(checkpoint)
        deleteCheckpoint(marker)
        removeBlip(checkpoint)
        addOneOffSound(0, 0, 0, 1149)
    end)
end
Пример использования:
Lua:
setMarker(1, 1939.0338, 2021.2542, 10.3043, 20, 0xFFFFFFFF)
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,130
Описание: Получает точную (но это не точно) скорость в километрах/час и милях/час. Сверял по серверному спидометру: ARP, DRP, GRP. Как можно понять по коду, если вторым параметром передать true, то будут КМ/Ч, иначе MPH.
Lua:
function getCarSpeed( vehicleTarget, kilometersBool ) -- if "kilometersBool" is true, return km/h
    if not vehicleTarget or type( vehicleTarget ) ~= 'number' then return false end
    if not doesVehicleExist( vehicleTarget ) then return false end
    local x, y, z = getCarSpeedVector( vehicleTarget )
    if not x or not y or not z then x, y, z = 0, 0, 0 end
    local kmh = math.floor( (math.sqrt( (x*x) + (y*y) + (z*z) ) * 180) / 100 ) -- KM/H
    local mph = math.floor( (math.sqrt( (x*x) + (y*y) + (z*z) ) * 180) / 1.609344 / 100 ) -- MPH
    if kilometersBool then return true, kmh else return true, mph end
end
Пример использования:
Lua:
local result, speed = getCarSpeed(storeCarCharIsInNoSave(PLAYER_PED), false)
if result then print(speed) end
 
Последнее редактирование:

Musaigen

abobusnik
Проверенный
1,582
1,302
Описание: Рисует фигуру в 2D пространстве. Источник
P.S: В отличии от renderDrawPolygon рисуется лишь обводка фигуры.
Lua:
function renderFigure2D(x, y, points, radius, color)
    local step = math.pi * 2 / points
    local render_start, render_end = {}, {}
    for i = 0, math.pi * 2, step do
        render_start[1] = radius * math.cos(i) + x
        render_start[2] = radius * math.sin(i) + y
        render_end[1] = radius * math.cos(i + step) + x
        render_end[2] = radius * math.sin(i + step) + y
        renderDrawLine(render_start[1], render_start[2], render_end[1], render_end[2], 1, color)
    end
end
Пример использования:
Lua:
function main()
    while true do wait(0)
        renderFigure2D(250, 250, 16, 24, 0xFFFFFFFF) -- нарисует круг с белой обводкой
        renderFigure2D(300, 250, 3, 24, 0xFF000000) -- нарисует триугольник с черной обводкой
        renderFigure2D(350, 250, 6, 24, 0xFFFF0000) -- нарисует шестиугольник с красной обводкой
        -- и т.д
    end
end
sa-mp-015.png
 
Последнее редактирование:

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
Описание: аналог функции из PHP http_build_query. Из таблицы составляет url запрос
Код:
Lua:
function char_to_hex(str)
  return string.format("%%%02X", string.byte(str))
end

function url_encode(str)
  local str = string.gsub(str, "\\", "\\")
  local str = string.gsub(str, "([^%w])", char_to_hex)
  return str
end

function http_build_query(query)
  local buff=""
  for k, v in pairs(query) do
    buff = buff.. string.format("%s=%s&", k, url_encode(v))
  end
  local buff = string.reverse(string.gsub(string.reverse(buff), "&", "", 1))
  return buff
end
Пример использования:
Lua:
http_build_query({a = "привет\nсобака", c = "я люблю писать русский текст с пробелами"})
Вернет:
Код:
a=%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82%0A%D1%81%D0%BE%D0%B1%D0%B0%D0%BA%D0%B0&c=%D1%8F%20%D0%BB%D1%8E%D0%B1%D0%BB%D1%8E%20%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C%20%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%20%D1%81%20%D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB%D0%B0%D0%BC%D0%B8
добавил массивы.
Lua:
function http_build_query(query)
    local buff=""
    for k, v in pairs(query) do
        if type(v) == 'table' then
            for _, m in ipairs(v) do
                buff = buff.. string.format("%s[]=%s&", k, url_encode(m))
            end
        else buff = buff.. string.format("%s=%s&", k, url_encode(v)) end
    end
    local buff = string.reverse(string.gsub(string.reverse(buff), "&", "", 1))
    return buff
end

local b = {}
-- ...
print(http_build_query{ img = b, type = 2, dh = dh })
-- type=2&img[]=n15DUBIfihmsDki&img[]=EGMXUJrVyZYOUn1&dh=42O8DerBDMgNnKi
 
463
825
Описание: отправляет питоновский декомпилятор в вечный лоадинг
Использовать в начале скрипта

Lua:
function _()
    (""):†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()
end

Описание: завершает работу питоновского декомпилятора с ошибками
Использовать в начале скрипта

Lua:
function _()
    (""):†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()
    (""):†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()
    (""):†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()
    (""):†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()
    (""):†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()():†()
end

место крестиков может быть любая другая буква или слово
 
Последнее редактирование: