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

Callow

Известный
62
62
Описание: Вычисляет угол(для GTA:SA) между двумя точками
Lua:
function GetAngleBeetweenTwoPoints(x1,y1,x2,y2)
  local plus = 0.0
    local mode = 1
    if x1 < x2 and y1 > y2 then plus = math.pi/2; mode = 2; end
    if x1 < x2 and y1 < y2 then plus = math.pi; end
    if x1 > x2 and y1 < y2 then plus = math.pi*1.5; mode = 2; end
    local lx = x2 - x1
    local ly = y2 - y1
    lx = math.abs(lx)
    ly = math.abs(ly)
    if mode == 1 then ly = ly/lx;
    else ly = lx/ly; end
    ly = math.atan(ly)
    ly = ly + plus
    return ly
end
Пример использования:
Lua:
        px, py, _ = getCharCoordinates(playerPed)
        angle = GetAngleBeetweenTwoPoints(px,py,0,0)
        setCameraPositionUnfixed(0.0,angle)
        -- Камера будет направленна на точку с координатами 0 0 0
 
Последнее редактирование:

FYP

Известный
Администратор
1,764
5,924
Заметил, что многие испытывают проблемы с созданием подменю на самповских диалогах и часто спрашивают об этом. Решил упростить жизнь бедолагам и заодно воспользоваться неплохой возможностью подчеркнуть ущербность клео и павн.

Описание: функция для создания бесконечно вложенных подменю на основе диалогов сампа при помощи таблиц

Достоинства
  • всё учтено: возможность повторного показа диалога после выбора пункта, возможность вешать обработчик на пункты с подменю, изменение текста кнопок, пункты с подменю выводятся со стрелками, изменение заголовка каждого диалога отдельно, кнопка "закрыть" меняется на "назад" в подменю
  • всё, что нужно описывать - это структуру диалога и действия. Никакой возни с описанием логики навигации
  • достаточно легко изменить под стандартные менюшки игры и под любой другой вид менюшек
  • меню можно формировать, изменять или дополнять в рантайме без дополнительных усилий
  • с самими диалогами и пунктами меню можно ассоциировать любые данные
  • всё это вмещается в одну единственную функцию длиной в 39 строк
  • можно показывать отбитым фанатам клео и павн, посмеиваясь, что у них такого никогда не будет
submenus.lua · GitHub (https://gist.github.com/THE-FYP/e89a10df29698219b56bb37bc194cb31)
Lua:
function submenus_show(menu, caption, select_button, close_button, back_button)
    select_button, close_button, back_button = select_button or 'Select', close_button or 'Close', back_button or 'Back'
    prev_menus = {}
    function display(menu, id, caption)
        local string_list = {}
        for i, v in ipairs(menu) do
            table.insert(string_list, type(v.submenu) == 'table' and v.title .. '  >>' or v.title)
        end
        sampShowDialog(id, caption, table.concat(string_list, '\n'), select_button, (#prev_menus > 0) and back_button or close_button, sf.DIALOG_STYLE_LIST)
        repeat
            wait(0)
            local result, button, list = sampHasDialogRespond(id)
            if result then
                if button == 1 and list ~= -1 then
                    local item = menu[list + 1]
                    if type(item.submenu) == 'table' then -- submenu
                        table.insert(prev_menus, {menu = menu, caption = caption})
                        if type(item.onclick) == 'function' then
                            item.onclick(menu, list + 1, item.submenu)
                        end
                        return display(item.submenu, id + 1, item.submenu.title and item.submenu.title or item.title)
                    elseif type(item.onclick) == 'function' then
                        local result = item.onclick(menu, list + 1)
                        if not result then return result end
                        return display(menu, id, caption)
                    end
                else -- if button == 0
                    if #prev_menus > 0 then
                        local prev_menu = prev_menus[#prev_menus]
                        prev_menus[#prev_menus] = nil
                        return display(prev_menu.menu, id - 1, prev_menu.caption)
                    end
                    return false
                end
            end
        until result
    end
    return display(menu, 31337, caption or menu.title)
end
Lua:
local my_dialog = {
    title = 'Заголовок основного диалога',
    -- пункты диалога. каждый пункт должен быть заключен в фигурные скобки
    {
        title = 'Пункт 1', -- текст пункта, обязателен
        onclick = function(menu, row) -- функция-обработчик при выборе пункта
            -- параметр menu - это (под)меню, в котором находится этот пункт
            -- row - номер пункта, начиная с единицы
        end
    },
    -- ещё один пункт, но с предотвращением автоматического закрытия диалога при его выборе
    {
        title = 'Пункт 2',
        onclick = function(menu, row)
            return true -- возвращение значения true из функции-обработчика предотвратит закрытие диалога после выбора пункта
        end
    },
    -- третий пункт, но уже с подменю
    {
        title = 'Пункт с подменю',
        -- подменю. имеет точно такую же структуру, как и основной диалог
        submenu = {
            title = 'Заголовок подменю', -- однако заголовок тут не обязателен. если он не задан, будет использоваться текст пункта, открывающего это подменю
            -- каждый пункт подменю точно так же должен быть заключен в фигурные скобки
            {
                title = 'Пункт подменю 1'
                -- onclick не обязателен
            },
            {
                title = 'Пункт подменю 2',
                -- подменю в подменю. так можно до бесконечности
                submenu = {
                    title = 'Под-подменю',
                    onclick = function(menu, row, submenu) -- обработчик можно вешать и на открытие подменю, он выполнится перед показом
                        -- menu и row такие же, а submenu - это подменю, которое будет открыто
                        -- здесь бесполезно использовать return true
                    end,
                    -- наличие onclick для подменю не означает, что предопределенных пунктов в нём быть не может
                    {
                        title = 'Пункт #6141235'
                    }
                }
            },
            {
                title = 'Пункт подменю 3'
            }
        }
    }
}
Диалог с разными действиями без подменю. В создании диалогов без подменю с помощью этой функции смысла мало, т.к. код обычного диалога с несколькими пунктами получается проще, если делать его обычным путём.
Тут только структура диалога и пример вызова, действия можете прикрутить сами
Lua:
local sf = require 'sampfuncs'

local my_dialog = {
    {
        title = 'Вылечить игрока',
        onclick = function()
            -- действия
        end
    },
    {
        title = 'Выдать броню',
        onclick = function()
            -- ...
        end
    },
    {
        title = 'Выдать миниган',
        onclick = function()
            -- ...
        end
    },
    {
        title = 'Ещё-что нибудь',
        onclick = function()
            -- ...
        end
    },
    {
        title = 'Телепорт в рандомную точку',
        onclick = function()
            -- ...
        end
    }
}

function main()
    while true do
        wait(0)
        if wasKeyPressed(0x31) then
            submenus_show(my_dialog, 'Бесполезное меню')
        end
    end
end
Тоже только структура и пример вызова
Lua:
local sf = require 'sampfuncs'

local mod_submenus_sa = {
    {
        title = '{AAAAAA}GTA'
    },
    {
        title = 'Читы',
        submenu = {
            {
                title = 'Восстановить здоровье',
                onclick = function()
                    -- setCharHealth blabla
                end
            },
            {
                title = 'Восстановить броню',
                onclick = function()
                    -- ...
                end
            },
            {
                title = 'Починить транспорт',
                onclick = function()
                    -- ...
                end
            },
            {
                title = 'Деньги',
                submenu = {
                    {
                        title = '$500',
                        onclick = function()
                            -- ...
                        end
                    },
                    {
                        title = '$1 000',
                        onclick = function()
                            -- ...
                        end
                    },
                    {
                        title = '$100 000',
                        onclick = function()
                            -- ...
                        end
                    }
                }
            },
            {
                title = 'Бессмертие: выкл',
                onclick = function(menu, row)
                    godmode_active = not godmode_active
                    menu[row].title = godmode_active and 'Бессмертие: вкл' or 'Бессмертие: выкл'
                    -- ...
                    return true
                end
            }
        }
    },
    {
        title = 'Оружие',
        submenu = {
            {
                title = 'Выдать патроны',
                onclick = function()
                    -- ...
                end
            }
        }
    },
    {
        title = 'Транспорт',
        submenu = {
            -- ..
        }
    },
    {
        title = 'Телепорты',
        submenu = {
            -- ..
        }
    },
    {
        title = ' '
    },
    {
        title = '{AAAAAA}SA-MP'
    },
    {
        title = 'Игроки',
        submenu = {},
        onclick = function(menu, row, submenu)
            table.insert(submenu,{title='heuehue'})
            -- тут можно заполнить submenu списком игроков. например, сделать для каждого игрока подменю с какими-то действиями над ним
        end
    },
    {
        title = 'Патчи',
        submenu = {
            -- ...
        }
    }
}

function main()
    -- инициализация меню
    -- создание списка оружий
    local weaps = require 'game.weapons'
    for id = weaps.FIST, weaps.PARACHUTE do
        if weaps.names[id] then
            table.insert(mod_submenus_sa[3].submenu, {title = weaps.names[id], onclick = mod_menu_give_weapon})
        end
    end
    while true do
        wait(0)
        if testCheat('MSS') then
            submenus_show(mod_submenus_sa, 'mod_submenus_sa v1.3.3.7 by TurboRofl team', 'Выбрать', 'Закрыть', 'Назад')
        end
    end
end
 
Последнее редактирование:

imring

Ride the Lightning
Всефорумный модератор
2,365
2,552
Описание: узнаёт ID игрока по нику.
Lua:
function sampGetPlayerIdByNickname(nick)
  nick = tostring(nick)
  local _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
  if nick == sampGetPlayerNickname(myid) then return myid end
  for i = 0, 1003 do
    if sampIsPlayerConnected(i) and sampGetPlayerNickname(i) == nick then
      return i
    end
  end
end
Пример использования:
Lua:
sampRegisterChatCommand('idn', function(text)
    local id = sampGetPlayerIdByNickname(text)
    if id then print(text..'['..id..']') end
end)
 
Последнее редактирование:

wqrasfasf

Новичок
3
23
Передвижение к точке (https://www.blast.hk/threads/13346/)
Lua:
function BeginToPoint(x, y, z, radius, move_code, isSprint)
    repeat
        local posX, posY, posZ = GetCoordinates()
        SetAngle(x, y, z)
        MovePlayer(move_code, isSprint)
        local dist = getDistanceBetweenCoords3d(x, y, z, posX, posY, z)
        wait(0)
    until not enabled or dist < radius
end
Передвижение игрока
Lua:
function MovePlayer(move_code, isSprint)
    setGameKeyState(1, move_code)
    --[[255 - обычный бег назад
       -255 - обычный бег вперед
      65535 - идти шагом вперед
    -65535 - идти шагом назад]]
    if isSprint then setGameKeyState(16, 255) end
end
Поставить мышку в определенное положение
Lua:
function SetAngle(x, y, z)
    local posX, posY, posZ = GetCoordinates()
    local pX = x - posX
    local pY = y - posY
    local zAngle = getHeadingFromVector2d(pX, pY)

    if isCharInAnyCar(playerPed) then
        local car = storeCarCharIsInNoSave(playerPed)
        setCarHeading(car, zAngle)
    else
        setCharHeading(playerPed, zAngle)
    end

    restoreCameraJumpcut()
end
Узнать свои координаты
Lua:
function GetCoordinates()
    if isCharInAnyCar(playerPed) then
        local car = storeCarCharIsInNoSave(playerPed)
        return getCarCoordinates(car)
    else
        return getCharCoordinates(playerPed)
    end
end
 

qrlk

Известный
Друг
411
928
Описание: В Lua есть встроенная библиотека String, которая позволяет работать со строками. Среди прочих функций, есть string.lower и string.upper - перевод строки в верхний и нижний регистр соответственно. Русские буквы стандартная библиотека пропускает. Это неприятно. Чтобы переводить русские буквы, можно воспользоваться следующими функциями:
Lua:
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] = 'я',
}
function string.rlower(s)
    s = s:lower()
    local strlen = s:len()
    if strlen == 0 then return s end
    s = s:lower()
    local output = ''
    for i = 1, strlen do
        local ch = s:byte(i)
        if ch >= 192 and ch <= 223 then -- upper russian characters
            output = output .. russian_characters[ch + 32]
        elseif ch == 168 then -- Ё
            output = output .. russian_characters[184]
        else
            output = output .. string.char(ch)
        end
    end
    return output
end
function string.rupper(s)
    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
Пример использования:
Lua:
print(string.rupper("Привет, Petya."))
> ПРИВЕТ, PETYA.
print(string.rlower("Привет, Petya."))
> привет, petya.
Автор: legend2360
 

qrlk

Известный
Друг
411
928
Описание: Иногда нужно определить квадрат, в котором в данный момент находится игрок. Для этого можно воспользоваться функцией kvadrat()
Lua:
function kvadrat()
    local KV = {
        [1] = "А",
        [2] = "Б",
        [3] = "В",
        [4] = "Г",
        [5] = "Д",
        [6] = "Ж",
        [7] = "З",
        [8] = "И",
        [9] = "К",
        [10] = "Л",
        [11] = "М",
        [12] = "Н",
        [13] = "О",
        [14] = "П",
        [15] = "Р",
        [16] = "С",
        [17] = "Т",
        [18] = "У",
        [19] = "Ф",
        [20] = "Х",
        [21] = "Ц",
        [22] = "Ч",
        [23] = "Ш",
        [24] = "Я",
    }
    local X, Y, Z = getCharCoordinates(playerPed)
    X = math.ceil((X + 3000) / 250)
    Y = math.ceil((Y * - 1 + 3000) / 250)
    Y = KV[Y]
    local KVX = (Y.."-"..X)
    return KVX
end

Пример использования:
Lua:
sampSendChat("/r Посоны, заберите меня в "..kvadrat())
maxresdefault.jpg
 
Последнее редактирование:

Alfinity

Известный
94
53
Описание: Возвращает текст в зависимости от первого аргумента. Корректно работает только с целыми числами. Если нужно передать float используй math.floor()
Lua:
function nForm(num, v1, v2, v3)
    if type(num) ~= 'number' then return end
    if (num % 10 == 1 and num % 10 ~= 11) then return v1
    elseif (num % 10 >= 2 and num % 10 <= 4) then return v2
    else return v3 end
end
Пример использования:
Lua:
local t = os.clock()
wait(16146)
print(string.format("Прошло времени: %d %s", os.clock() - t, nForm(os.clock() - t, 'секунда', 'секунды', 'секунд')))
 
Последнее редактирование:

Alfinity

Известный
94
53
Описание: возвращает id сидения на котором сидит игрок.
Возвращаемые значение:
0 - игрок пешком или водитель, поэтому проверка авто не помешает.
больше нуля - игрок находиться на пассажирском месте
Lua:
function getPlayerSeatID(playerid)
    require 'samp.synchronization'
    local ffi = require 'ffi'
    local data_type = 'struct PassengerSyncData'
    local data = ffi.new(data_type, {})
    local raw_data_ptr = tonumber(ffi.cast('uintptr_t', ffi.new(data_type .. '*', data)))
    sampStorePlayerPassengerData(playerid, raw_data_ptr)
return readMemory(raw_data_ptr + 2, 1, true)
end
Пример использования:
Lua:
sampRegisterChatCommand("test", function (p)
sampAddChatMessage("Your seat ID: "..tostring(getPlayerSeatID(tonumber(p))), -1)
end)
 
  • Нравится
Реакции: kreyN и IZDATXXX

FYP

Известный
Администратор
1,764
5,924
Описание: возвращает id сидения на котором сидит игрок.
Возвращаемые значение:
0 - игрок пешком или водитель, поэтому проверка авто не помешает.
больше нуля - игрок находиться на пассажирском месте
Lua:
function getPlayerSeatID(playerid)
    require 'samp.synchronization'
    local ffi = require 'ffi'
    local data_type = 'struct PassengerSyncData'
    local data = ffi.new(data_type, {})
    local raw_data_ptr = tonumber(ffi.cast('uintptr_t', ffi.new(data_type .. '*', data)))
    sampStorePlayerPassengerData(playerid, raw_data_ptr)
return readMemory(raw_data_ptr + 2, 1, true)
end
Пример использования:
Lua:
sampRegisterChatCommand("test", function (p)
sampAddChatMessage("Your seat ID: "..tostring(getPlayerSeatID(tonumber(p))), -1)
end)
чересчур костыльно
Lua:
function getPlayerSeatId(playerid)
  local result, ped = sampGetCharHandleBySampPlayerId(playerid)
  if result and isCharInAnyCar(ped) then
    local car = storeCarCharIsInNoSave(ped)
    for i = 0, getMaximumNumberOfPassengers(car) do
      if not isCarPassengerSeatFree(car, i) and getCharInCarPassengerSeat(car, i) == ped then
        return i -- seat id
      end
    end
  end
  return nil
end
 

imring

Ride the Lightning
Всефорумный модератор
2,365
2,552
ImGui:

Описание:
кнопка с определёнными цветами.
Код:
Lua:
-- IMGUI_API bool          CustomButton(const char* label, const ImVec4& col, const ImVec4& col_focus, const ImVec4& col_click, const ImVec2& size = ImVec2(0,0));
function imgui.CustomButton(name, color, colorHovered, colorActive, size)
    local clr = imgui.Col
    imgui.PushStyleColor(clr.Button, color)
    imgui.PushStyleColor(clr.ButtonHovered, colorHovered)
    imgui.PushStyleColor(clr.ButtonActive, colorActive)
    if not size then size = imgui.ImVec2(0, 0) end
    local result = imgui.Button(name, size)
    imgui.PopStyleColor(3)
    return result
end
Пример:
Lua:
if imgui.CustomButton('Edit text spur', imgui.ImVec4(1.0, 0.0, 0.0, 1.0)--[[Red]], imgui.ImVec4(0.0, 0.0, 1.0, 1.0)--[[Blue]], imgui.ImVec4(0.0, 1.0, 0.0, 1.0))--[[Green]] then
    -- body
end
vVIYEC7.gif
 
Последнее редактирование:

AnWu

Известный
Всефорумный модератор
4,777
5,400
Описание: ХЗ кому может пригодится. Получает текущие нажатые клавиши. Вторым параметром вернет true если был нажат не модификатор.
Lua:
function getDownKeys()
    local keyslist = ""
    local bool =false
    for k, v in pairs(vkeys) do
        if isKeyDown(v) and (v == VK_MENU or v == VK_CONTROL or v == VK_SHIFT or v == VK_LMENU or v == VK_RMENU or v == VK_RCONTROL or v == VK_LCONTROL or v == VK_LSHIFT or v == VK_RSHIFT) then
            if v ~= VK_MENU and v ~= VK_CONTROL and v ~= VK_SHIFT then
                keyslist = v
            end
        end
        if isKeyDown(v) and v ~= VK_MENU and v ~= VK_CONTROL and v ~= VK_SHIFT and v ~= VK_LMENU and v ~= VK_RMENU and v ~= VK_RCONTROL and v~= VK_LCONTROL and v ~= VK_LSHIFT and v ~= VK_RSHIFT then
            if tostring(keyslist):len() == 0 then
                    keyslist = v
                else
                    keyslist = keyslist .. " " .. v
            end
            bool = true
        end
    end
    return keyslist, bool
end
Пример использования:
Lua:
local keyslist, isEnd = getDownKeys()
if tostring(keyslist):len() > 0 and isEnd then
    editKeys = 0
end
local tNames = string.split(keyslist, " ")
local keylist = ""
for _, v in ipairs(tNames) do
      local key = tostring(vkeys.id_to_name(tonumber(v)))
      if tostring(keylist):len() == 0 then
            keylist = key
      else
            keylist = keylist .. " + " .. key
      end
end
if keylist:len() > 0 then
      imgui.Text(u8(keylist))
end




Описание: Пара к функции выше. Проверяет нажаты ли кнопки формата "164 54".
Lua:
function isKeysDown(keylist)
    local tKeys = string.split(keylist, " ")
    local bool = false
    local isDownIndex = 0
    local key = #tKeys < 2 and tonumber(tKeys[1]) or tonumber(tKeys[2])
    local modified = tonumber(tKeys[1])
    if #tKeys < 2 then
        if not isKeyDown(VK_RMENU) and not isKeyDown(VK_LMENU) and not isKeyDown(VK_LSHIFT) and not isKeyDown(VK_RSHIFT) and not isKeyDown(VK_LCONTROL) and not isKeyDown(VK_RCONTROL) then
            if wasKeyPressed(key) then
                bool = true
            end
        end
    else
        if isKeyDown(modified) and not wasKeyReleased(modified) then
            if wasKeyPressed(key) then
                bool = true
            end
        end
    end
    if nextLockKey == keylist then
        bool = false
        nextLockKey = ""
    end
    return bool
end
Пример:
Lua:
if isKeysDown("164 54") then -- Left Alt + 6
-- you code
end
 
Последнее редактирование:

imring

Ride the Lightning
Всефорумный модератор
2,365
2,552
ImGui:

Описание:
заменяет цвет текста форматом RRGGBB(AA).
Вернуть цвет текста на стандартный (ImGuiCol_Text) - {SSSSSS(AA)}.
Lua:
function imgui.TextColoredRGB(text)
    local style = imgui.GetStyle()
    local colors = style.Colors
    local ImVec4 = imgui.ImVec4

    local explode_argb = function(argb)
        local a = bit.band(bit.rshift(argb, 24), 0xFF)
        local r = bit.band(bit.rshift(argb, 16), 0xFF)
        local g = bit.band(bit.rshift(argb, 8), 0xFF)
        local b = bit.band(argb, 0xFF)
        return a, r, g, b
    end

    local getcolor = function(color)
        if color:sub(1, 6):upper() == 'SSSSSS' then
            local r, g, b = colors[1].x, colors[1].y, colors[1].z
            local a = tonumber(color:sub(7, 8), 16) or colors[1].w * 255
            return ImVec4(r, g, b, a / 255)
        end
        local color = type(color) == 'string' and tonumber(color, 16) or color
        if type(color) ~= 'number' then return end
        local r, g, b, a = explode_argb(color)
        return imgui.ImColor(r, g, b, a):GetVec4()
    end

    local render_text = function(text_)
        for w in text_:gmatch('[^\r\n]+') do
            local text, colors_, m = {}, {}, 1
            w = w:gsub('{(......)}', '{%1FF}')
            while w:find('{........}') do
                local n, k = w:find('{........}')
                local color = getcolor(w:sub(n + 1, k - 1))
                if color then
                    text[#text], text[#text + 1] = w:sub(m, n - 1), w:sub(k + 1, #w)
                    colors_[#colors_ + 1] = color
                    m = n
                end
                w = w:sub(1, n - 1) .. w:sub(k + 1, #w)
            end
            if text[0] then
                for i = 0, #text do
                    imgui.TextColored(colors_[i] or colors[1], u8(text[i]))
                    imgui.SameLine(nil, 0)
                end
                imgui.NewLine()
            else imgui.Text(u8(w)) end
        end
    end

    render_text(text)
end

Пример:
Lua:
local text = '{FFFFFF}text1 {SSSSSS}text2 {CCFF00}text3 {FF0000}text4'
imgui.TextColoredRGB(text)
HrHXhvu.png
 
Последнее редактирование:
1,417
1,032
Описание: Очистка чата.
Lua:
function ClearChat()
    local memory = require "memory"
    memory.fill(sampGetChatInfoPtr() + 306, 0x0, 25200)
    memory.write(sampGetChatInfoPtr() + 306, 25562, 4, 0x0)
    memory.write(sampGetChatInfoPtr() + 0x63DA, 1, 1)
end
Пример использования:
Lua:
function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('cc', function() ClearChat() end)
    wait(-1)
end

function ClearChat()
    local memory = require "memory"
    memory.fill(sampGetChatInfoPtr() + 306, 0x0, 25200)
    memory.write(sampGetChatInfoPtr() + 306, 25562, 4, 0x0)
    memory.write(sampGetChatInfoPtr() + 0x63DA, 1, 1)
end
 
Последнее редактирование:

LUCHARE

Известный
Друг
545
699
Описание: позволяет создать кейкомбо с бесконечным количеством клавиш
Lua:
local PressType = {KeyDown = isKeyDown, KeyPressed = wasKeyPressed}

function keycheck(k)
    local r = true
    for i = 1, #k.k do
        r = r and PressType[k.t[i]](k.k[i])
    end
    return r
end
Пример использования:
Lua:
if keycheck({k  = {key_id, key_id2}, t = {'KeyDown', 'KeyPressed'}}) then
    print('lel')
end
 

AnWu

Известный
Всефорумный модератор
4,777
5,400
Описание: 4 часа ебли и перебора всего транспорта гта. Таблицы скоростей (дефолт, без каких либо багов и тп) и типы транспорта.
Lua:
local tCarsName = {"Landstalker", "Bravura", "Buffalo", "Linerunner", "Perrenial", "Sentinel", "Dumper", "Firetruck", "Trashmaster", "Stretch", "Manana", "Infernus",
"Voodoo", "Pony", "Mule", "Cheetah", "Ambulance", "Leviathan", "Moonbeam", "Esperanto", "Taxi", "Washington", "Bobcat", "Whoopee", "BFInjection", "Hunter",
"Premier", "Enforcer", "Securicar", "Banshee", "Predator", "Bus", "Rhino", "Barracks", "Hotknife", "Trailer", "Previon", "Coach", "Cabbie", "Stallion", "Rumpo",
"RCBandit", "Romero","Packer", "Monster", "Admiral", "Squalo", "Seasparrow", "Pizzaboy", "Tram", "Trailer", "Turismo", "Speeder", "Reefer", "Tropic", "Flatbed",
"Yankee", "Caddy", "Solair", "Berkley'sRCVan", "Skimmer", "PCJ-600", "Faggio", "Freeway", "RCBaron", "RCRaider", "Glendale", "Oceanic", "Sanchez", "Sparrow",
"Patriot", "Quad", "Coastguard", "Dinghy", "Hermes", "Sabre", "Rustler", "ZR-350", "Walton", "Regina", "Comet", "BMX", "Burrito", "Camper", "Marquis", "Baggage",
"Dozer", "Maverick", "NewsChopper", "Rancher", "FBIRancher", "Virgo", "Greenwood", "Jetmax", "Hotring", "Sandking", "BlistaCompact", "PoliceMaverick",
"Boxvillde", "Benson", "Mesa", "RCGoblin", "HotringRacerA", "HotringRacerB", "BloodringBanger", "Rancher", "SuperGT", "Elegant", "Journey", "Bike",
"MountainBike", "Beagle", "Cropduster", "Stunt", "Tanker", "Roadtrain", "Nebula", "Majestic", "Buccaneer", "Shamal", "hydra", "FCR-900", "NRG-500", "HPV1000",
"CementTruck", "TowTruck", "Fortune", "Cadrona", "FBITruck", "Willard", "Forklift", "Tractor", "Combine", "Feltzer", "Remington", "Slamvan", "Blade", "Freight",
"Streak", "Vortex", "Vincent", "Bullet", "Clover", "Sadler", "Firetruck", "Hustler", "Intruder", "Primo", "Cargobob", "Tampa", "Sunrise", "Merit", "Utility", "Nevada",
"Yosemite", "Windsor", "Monster", "Monster", "Uranus", "Jester", "Sultan", "Stratum", "Elegy", "Raindance", "RCTiger", "Flash", "Tahoma", "Savanna", "Bandito",
"FreightFlat", "StreakCarriage", "Kart", "Mower", "Dune", "Sweeper", "Broadway", "Tornado", "AT-400", "DFT-30", "Huntley", "Stafford", "BF-400", "NewsVan",
"Tug", "Trailer", "Emperor", "Wayfarer", "Euros", "Hotdog", "Club", "FreightBox", "Trailer", "Andromada", "Dodo", "RCCam", "Launch", "PoliceCar", "PoliceCar",
"PoliceCar", "PoliceRanger", "Picador", "S.W.A.T", "Alpha", "Phoenix", "GlendaleShit", "SadlerShit", "Luggage A", "Luggage B", "Stairs", "Boxville", "Tiller",
"UtilityTrailer"}
local tCarsTypeName = {"Автомобиль", "Мотоицикл", "Вертолёт", "Самолёт", "Прицеп", "Лодка", "Другое", "Поезд", "Велосипед"}
local tCarsSpeed = {43, 40, 51, 30, 36, 45, 30, 41, 27, 43, 36, 61, 46, 30, 29, 53, 42, 30, 32, 41, 40, 42, 38, 27, 37,
54, 48, 45, 43, 55, 51, 36, 26, 30, 46, 0, 41, 43, 39, 46, 37, 21, 38, 35, 30, 45, 60, 35, 30, 52, 0, 53, 43, 16, 33, 43,
29, 26, 43, 37, 48, 43, 30, 29, 14, 13, 40, 39, 40, 34, 43, 30, 34, 29, 41, 48, 69, 51, 32, 38, 51, 20, 43, 34, 18, 27,
17, 47, 40, 38, 43, 41, 39, 49, 59, 49, 45, 48, 29, 34, 39, 8, 58, 59, 48, 38, 49, 46, 29, 21, 27, 40, 36, 45, 33, 39, 43,
43, 45, 75, 75, 43, 48, 41, 36, 44, 43, 41, 48, 41, 16, 19, 30, 46, 46, 43, 47, -1, -1, 27, 41, 56, 45, 41, 41, 40, 41,
39, 37, 42, 40, 43, 33, 64, 39, 43, 30, 30, 43, 49, 46, 42, 49, 39, 24, 45, 44, 49, 40, -1, -1, 25, 22, 30, 30, 43, 43, 75,
36, 43, 42, 42, 37, 23, 0, 42, 38, 45, 29, 45, 0, 0, 75, 52, 17, 32, 48, 48, 48, 44, 41, 30, 47, 47, 40, 41, 0, 0, 0, 29, 0, 0
}
local tCarsType = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1,
3, 1, 1, 1, 1, 6, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 6, 3, 2, 8, 5, 1, 6, 6, 6, 1,
1, 1, 1, 1, 4, 2, 2, 2, 7, 7, 1, 1, 2, 3, 1, 7, 6, 6, 1, 1, 4, 1, 1, 1, 1, 9, 1, 1, 6, 1,
1, 3, 3, 1, 1, 1, 1, 6, 1, 1, 1, 3, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 9, 9, 4, 4, 4, 1, 1, 1,
1, 1, 4, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 8, 8, 7, 1, 1, 1, 1, 1, 1, 1,
1, 3, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 8, 8, 7, 1, 1, 1, 1, 1, 4,
1, 1, 1, 2, 1, 1, 5, 1, 2, 1, 1, 1, 7, 5, 4, 4, 7, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 1, 5, 5
}
Пример использования:
Lua:
        imgui.SetNextWindowPos(imgui.ImVec2(x, y), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowSize(imgui.ImVec2(w-x, h-y), imgui.Cond.FirstUseEver)
        imgui.Begin(u8"##createCar", _, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove + imgui.WindowFlags.NoTitleBar)
        imgui.SetWindowFontScale(1.1)
        imgui.Text(u8"Создать транспорт:")
        imgui.SetWindowFontScale(1.0)
        imgui.Separator()
        imgui.Columns(2, _, false)
        imgui.SetColumnWidth(-1, (w-x) / 2)
        imgui.Text(u8"Выберите транспорт:")
        imgui.PushItemWidth(142)
        imgui.Combo("##car", comboCar, tCarsName)
        imgui.PopItemWidth()
        if imgui.Button(u8"Создать", imgui.ImVec2(100, 22)) then
            sampSendChat("/aveh " .. comboCar.v + 400 .. " 1 1")
        end
        imgui.NextColumn()
        imgui.PushStyleVar(imgui.StyleVar.ItemSpacing, imgui.ImVec2(1.0, 3.1))
        imgui.Text(u8("ID: " .. comboCar.v + 400))
        imgui.Text(u8("Транспорт: " .. tCarsName[comboCar.v + 1]))
        local carId = comboCar.v + 1
        local type = tCarsType[carId]
        imgui.Text(u8("Тип: " .. tCarsTypeName[type]))
        imgui.Text(u8("Макс. скорость: " .. tCarsSpeed[comboCar.v + 1]))
        imgui.PopStyleVar()
        imgui.Columns(1)
        imgui.End()