Вопросы по Lua скриптингу

Общая тема для вопросов по разработке скриптов на языке программирования Lua, в частности под MoonLoader.
  • Задавая вопрос, убедитесь, что его нет в списке частых вопросов и что на него ещё не отвечали (воспользуйтесь поиском).
  • Поищите ответ в теме посвященной разработке Lua скриптов в MoonLoader
  • Отвечая, убедитесь, что ваш ответ корректен.
  • Старайтесь как можно точнее выразить мысль, а если проблема связана с кодом, то обязательно прикрепите его к сообщению, используя блок [code=lua]здесь мог бы быть ваш код[/code].
  • Если вопрос связан с MoonLoader-ом первым делом желательно поискать решение на wiki.

Частые вопросы

Как научиться писать скрипты? С чего начать?
Информация - Гайд - Всё о Lua скриптинге для MoonLoader(https://blast.hk/threads/22707/)
Как вывести текст на русском? Вместо русского текста у меня какие-то каракули.
Изменить кодировку файла скрипта на Windows-1251. В Atom: комбинация клавиш Ctrl+Shift+U, в Notepad++: меню Кодировки -> Кодировки -> Кириллица -> Windows-1251.
Как получить транспорт, в котором сидит игрок?
Lua:
local veh = storeCarCharIsInNoSave(PLAYER_PED)
Как получить свой id или id другого игрока?
Lua:
local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получить свой ид
local _, id = sampGetPlayerIdByCharHandle(ped) -- получить ид другого игрока. ped - это хендл персонажа
Как проверить, что строка содержит какой-то текст?
Lua:
if string.find(str, 'текст', 1, true) then
-- строка str содержит "текст"
end
Как эмулировать нажатие игровой клавиши?
Lua:
local game_keys = require 'game.keys' -- где-нибудь в начале скрипта вне функции main

setGameKeyState(game_keys.player.FIREWEAPON, -1) -- будет сэмулировано нажатие клавиши атаки
Все иды клавиш находятся в файле moonloader/lib/game/keys.lua.
Подробнее о функции setGameKeyState здесь: lua - setgamekeystate | BlastHack — DEV_WIKI(https://www.blast.hk/wiki/lua:setgamekeystate)
Как получить id другого игрока, в которого целюсь я?
Lua:
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE) -- получить хендл персонажа, в которого целится игрок
if valid and doesCharExist(ped) then -- если цель есть и персонаж существует
  local result, id = sampGetPlayerIdByCharHandle(ped) -- получить samp-ид игрока по хендлу персонажа
  if result then -- проверить, прошло ли получение ида успешно
    -- здесь любые действия с полученным идом игрока
  end
end
Как зарегистрировать команду чата SAMP?
Lua:
-- До бесконечного цикла/задержки
sampRegisterChatCommand("mycommand", function (param)
     -- param будет содержать весь текст введенный после команды, чтобы разделить его на аргументы используйте string.match()
    sampAddChatMessage("MyCMD", -1)
end)
Крашит игру при вызове sampSendChat. Как это исправить?
Это происходит из-за бага в SAMPFUNCS, когда производится попытка отправки пакета определенными функциями изнутри события исходящих RPC и пакетов. Исправления для этого бага нет, но есть способ не провоцировать его. Вызов sampSendChat изнутри обработчика исходящих RPC/пакетов нужно обернуть в скриптовый поток с нулевой задержкой:
Lua:
function onSendRpc(id)
  -- крашит:
  -- sampSendChat('Send RPC: ' .. id)

  -- норм:
  lua_thread.create(function()
    wait(0)
    sampSendChat('Send RPC: ' .. id)
  end)
end
 
Последнее редактирование:

sadbones

Известный
374
174
Как можно сменить часть текста? По есть я получил текст "Какой то текст 12321", "12321" будет изменится на "цифры".
Хукать onServerMessage и производить манипуляции. Миллион уже ответов в этой теме. Пользуйся поиском.
 

trefa

Известный
Всефорумный модератор
2,099
1,236

.Makarov.

Известный
190
36
Возможно, объект еще не создан на момент срабатывания хука. Попробуй задержку использовать:
Lua:
lua_thread.create(function ()
    wait(0)
    -- code
end)
Если выскакивает ошибка cannot resume coroutine, сохраняй data.modelId и др. в переменные, а внутри потока юзай только их.
Поставил задержку, начало убирать коллизию. Но когда я выхожу из инты дома, например в гараж или же на улицу - краш. Проблема появляется за создания потока. Как дальше быть, что делать?)
 

ne4estno

Участник
79
0
где можно взять инфу, как юзать вк апи в луа? мне просто надо через токен отправлять сообщение в кф в вк и можно ли это сделать без хоста?
 

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,130
где можно взять инфу, как юзать вк апи в луа? мне просто надо через токен отправлять сообщение в кф в вк и можно ли это сделать без хоста?
 

ru4z

Новичок
12
0
48063

как сделать чтоб ник игрока был не зеленым, а цветом его клиста?
 

Вложения

  • killedBy.lua
    2 KB · Просмотры: 6

sanders

Потрачен
253
126
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Посмотреть вложение 48063
как сделать чтоб ник игрока был не зеленым, а цветом его клиста?

Lua:
cped = getCharPointer(PLAYER_PED)
if isCharDead(PLAYER_PED) then
    reason = memory.read(cped + 0x760, 4)
    killer_ptr = memory.read(cped + 0x764, 4)
    killer_ped = getCharPointerHandle(killer_ptr)
    _, killer_id = sampGetPlayerIdByCharHandle(killer_ped)
    _, player_id = sampGetPlayerIdByCharHandle(PLAYER_PED)
        if killer_id ~= -1 and reason ~= nil and killer_id ~= nil and reason <= 46 and reason >= 0 and killer_id ~= player_id then
            killer_name = sampGetPlayerNickname(killer_id)
            color = sampGetPlayerColor(killer_id)
            sampAddChatMessage('[{ffffff}killed{ff0000}By{ffffff}] Вас убил {color}'..killer_name..'['..killer_id..'] {ffffff}с помощью {0e4bbe}'..getweaponname(reason), -1)
        end
    wait(4444)
end
 
  • Нравится
Реакции: ru4z

Pashyka

Участник
220
17
Lua:
cped = getCharPointer(PLAYER_PED)
if isCharDead(PLAYER_PED) then
    reason = memory.read(cped + 0x760, 4)
    killer_ptr = memory.read(cped + 0x764, 4)
    killer_ped = getCharPointerHandle(killer_ptr)
    _, killer_id = sampGetPlayerIdByCharHandle(killer_ped)
    _, player_id = sampGetPlayerIdByCharHandle(PLAYER_PED)
        if killer_id ~= -1 and reason ~= nil and killer_id ~= nil and reason <= 46 and reason >= 0 and killer_id ~= player_id then
            killer_name = sampGetPlayerNickname(killer_id)
            color = sampGetPlayerColor(killer_id)
            sampAddChatMessage('[{ffffff}killed{ff0000}By{ffffff}] Вас убил {color}'..killer_name..'['..killer_id..'] {ffffff}с помощью {0e4bbe}'..getweaponname(reason), -1)
        end
    wait(4444)
end

Помогите пожалуйста, вот такая ошибка в игре: и вот код со строчек 158-164

Lua:
result, target = getCharPlayerIsTargeting(PLAYER_HANDLE)
    if result then
    _, id = sampGetPlayerIdByCharHandle(target)
    text_buffer.v = id
    wait(300)
    sampProcessChatInput("/im")
end
не понимаю вообще
 

sanders

Потрачен
253
126
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Если я тебя правильно понял, то это так, в следующий раз попробуй правильнее составить вопросик

Lua:
function main()
    while not isSampAvailable() do wait(100)
    end
    while true do
        wait(0)
        if isKeyJustPressed(vk.VK_A) then 
            act = not act
            if act then
                sampAddChatMessage('Active!', -1)
            else
                sampAddChatMessage('Deactive!', -1)
            end
        end
        if act then -- если человек нажал на А, то у него активируется скрипт и появится возможность выполнить код ниже
            if wasKeyPressed(vk.VK_F) then
                giveWeaponToChar(PLAYER_PED, 46, 1)
            end
        end
end
 

Pashyka

Участник
220
17
Помогите пожалуйста, вот такая ошибка в игре: и вот код со строчек 158-164

Lua:
result, target = getCharPlayerIsTargeting(PLAYER_HANDLE)
    if result then
    _, id = sampGetPlayerIdByCharHandle(target)
    text_buffer.v = id
    wait(300)
    sampProcessChatInput("/im")
end
не понимаю вообще
 

sanders

Потрачен
253
126
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Помогите пожалуйста, вот такая ошибка в игре: и вот код со строчек 158-164

Lua:
result, target = getCharPlayerIsTargeting(PLAYER_HANDLE)
    if result then
    _, id = sampGetPlayerIdByCharHandle(target)
    text_buffer.v = id
    wait(300)
    sampProcessChatInput("/im")
end
не понимаю вообще
фулл код дай, так ничего не понятно
 

Pashyka

Участник
220
17
фулл код дай, так ничего не понятно

Фулл код большой, ну ща лан
фулл код дай, так ничего не понятно

Lua:
script_name('First_script')
script_author('Pasha')
script_description('Command')

require "lib.moonloader"
local keys = require "vkeys"
local tag = "MultiS by pasha is started!"
local imgui = require "imgui"
local encoding = require "encoding"
local inicfg = require 'inicfg'
local hook = require 'lib.samp.events'
local mem = require "memory"
encoding.default = "CP1251"
font = renderCreateFont('Calibri', 15, 9)
u8 = encoding.UTF8

local mainIni = inicfg.load({ -- Все в файле config
config =
{
lock = false,
key = false,
time = false,
GMcar = false,
repc = false,
run = false,
health = false,
mouse = false,
healthcar = false,
sbiv = false,
red = false,
}
}, "Binder by Pasha")

local lock = imgui.ImBool(mainIni.config.lock) -- Переменные для файла
local key = imgui.ImBool(mainIni.config.key)
local time = imgui.ImBool(mainIni.config.time)
local GMcar = imgui.ImBool(mainIni.config.GMcar)
local repc = imgui.ImBool(mainIni.config.repc)
local run = imgui.ImBool(mainIni.config.run)
local health = imgui.ImBool(mainIni.config.health)
local mouse = imgui.ImBool(mainIni.config.mouse)
local healthcar = imgui.ImBool(mainIni.config.healthcar)
local sbiv = imgui.ImBool(mainIni.config.sbiv)
local red = imgui.ImBool(mainIni.config.red)

local main_window_state = imgui.ImBool(false) -- Создание нового imgui
local text_buffer = imgui.ImBuffer(5) -- Текстовое поле
local status = inicfg.load(mainIni, 'Binder by Pasha.ini') -- загрузка данных из cfg
if not doesFileExist('moonloader/config/Binder by Pasha.ini') then inicfg.save(mainIni, 'Binder by Pasha.ini') end

function main() -- главная функция
    if not isSampAvailable or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    sampRegisterChatCommand("im", cmd_imgui) -- регистрация команды im
    sampRegisterChatCommand("red", cmd_red) -- регистрация команды im
    imgui.Process = false -- выключение imgui при запуске скрипта

    sampAddChatMessage(tag, 0xFF0000) -- вывод сообщения о запуске

    while true do -- будет выполняться всегда, обновление через 0 мс
        wait(0)

        if main_window_state.v == false then -- если ingui выключено, то и процесс тоже
            imgui.Process = false
        end
        if lock.v then -- если в cfg lock = true то при нажатии на L будет работать скрипт
            if not sampIsChatInputActive() and not sampIsCursorActive() then -- Если Чат в сампе не активен и курсор тоже не активен
                if isKeyJustPressed(VK_L) then -- если нажата клавиша L
                    sampSendChat("/lock") -- сервер вводит команду
                end
            end
        end
        if key.v then -- если в cfg key = true то при нажатии на K будет работать скрипт
            if not sampIsChatInputActive() and not sampIsCursorActive() then -- Если Чат в сампе не активен и курсор тоже не активен
                if isKeyJustPressed(VK_K) then -- если нажата клавиша K
                    sampSendChat("/key") -- сервер вводит команду
                end
            end
        end
        if time.v then -- если в cfg time = true то при нажатии на gg будет работать скрипт
            if testCheat("gg") and not sampIsCursorActive() then -- если введено gg чит-кодом и курсор не активен(чат не открыт)
                sampSendChat("/time") -- сервер вводит команду
                wait(1200) -- задержка 1.2 секунды
                sampSendChat ("/do На часах  "..os.date('%H:%M:%S.')) -- сервер вводит команду
            end
        end
        if repc.v then -- если в cfg repc = true, то при сочитании rep вы быстро почините машину
            if testCheat("rep") and not sampIsCursorActive() then -- если введено rep чит-кодом и курсор не активен(чат не открыт)
                sampSendChat("/repcar") -- сервер вводит команду
                wait(0) -- задержка 0 секунд
                sampSendChat ("/lock") -- сервер вводит команду
            end
        end
        if run.v then -- если чекбокс активен, то выполнять условие
            if isSampAvailable() then -- Проверяет активен ли самп
                mem.setint8(0xB7CEE4, 1) -- выставляет значение в адресах сампа
            end
        end
        if run.v == false then -- если чекбокс неактивен, то выполнять условие
            if isSampAvailable() then -- Проверяет активен ли самп
                mem.setint8(0xB7CEE4, 0) -- выставляет значение в адресах сампа
            end
        end
        if GMcar.v then -- если в cfg GMcar = true, то при нажатии на Shift будет работать ГМ кар
            local isInVeh = isCharInAnyCar(playerPed) -- переменная с проверкой(игрок находится в любой машине) возвращает true/false
            local car = nil -- переменная car = 0
        if isInVeh then car = storeCarCharIsInNoSave(playerPed) end -- если isInVeh = true, то car отвечает за машину в которой находится игрок
            if isCharInCar(playerPed, car) then -- Проверяет находиться ли игрок в указаной машине.
                setCarProofs(car, bull, fire, expl, bump, fist) -- выставляет иммунитеты машины на стандарт
            end
            if isCharInCar(playerPed, car) and isKeyDown(16) then -- если игрок находится в машине и нажата клавиша shift
                setCarProofs(car, true, true, true, true, true) -- выставлят все иммунитеты на true
                printStringNow("~r~Car GM: on", 10) -- выводит в чат пока зажата клавиша
            end
        end
        if health.v then -- если чекбокс активен, то выполнять условие
            if isKeyJustPressed(VK_CONTROL) then -- если нажата клавиша CTRL
                if gmped == false then -- если переменная gmped = false то
                    setCharProofs(playerPed, true, true, true, true, true) -- Устанавливает иммунитеты игроку(playerPed - ваш персонаж, иммунитет на пули(true/false),  иммунитет на огонь(true/false), иммунитет на взрывы(true/false), иммунитет на столкновения/падения(true/false), иммунитет на холодное оружие/кулаки(true/false))
                    writeMemory(0x96916E, 1, 1, false) -- 0x96916E - Бесконечный воздух (под водой), в сампе это бессмертие
                    gmped = true -- устанавливает переменную
                    printStringNow("~g~GMped on", 200) -- выводит на экран текст
                elseif gmped ~= false then -- если переменная gmped не равна false то
                    setCharProofs(playerPed, false, false, false, false, false) -- Устанавливает иммунитеты игроку(playerPed - ваш персонаж, иммунитет на пули(true/false),  иммунитет на огонь(true/false), иммунитет на взрывы(true/false), иммунитет на столкновения/падения(true/false), иммунитет на холодное оружие/кулаки(true/false))
                    writeMemory(0x96916E, 1, 0, false) -- 0x96916E - Бесконечный воздух (под водой), отключает бессмертие
                    gmped = false -- устанавливает переменную
                    printStringNow("~r~GMped off", 200) -- выводит на экран текст
                end
            end
        end
        if health.v == false then -- если чекбокс не установлен
            setCharProofs(playerPed, false, false, false, false, false) -- Устанавливает иммунитеты игроку(playerPed - ваш персонаж, иммунитет на пули(true/false),  иммунитет на огонь(true/false), иммунитет на взрывы(true/false), иммунитет на столкновения/падения(true/false), иммунитет на холодное оружие/кулаки(true/false))
            writeMemory(0x96916E, 1, 0, false) -- 0x96916E - Бесконечный воздух (под водой), отключает бессмертие
        end
        if mouse.v then -- если чекбокс установлен
            if isKeyJustPressed(VK_MBUTTON) then -- при нажатии на колесико мыши
                if mousec == false then -- если перменнная = false
                    imgui.ShowCursor = false -- курсор, при активном imgui отключен
                    mousec = true -- переменная = true
                    printStringNow("~r~Mouse off", 500) -- вывод текста на экран
                elseif mousec ~= false then -- если переменная не равна false
                    mousec = false -- устанавливает переменную на значение false
                    imgui.ShowCursor = true -- активирует курсор при активном imgui
                    printStringNow("~g~Mouse on", 500) -- вывод текста на экран
                end
            end
        end
        if healthcar.v then -- если чекбокс выставлен, то на экран будет выводить состояние машины
            local isInVeh = isCharInAnyCar(playerPed) -- переменная с проверкой(игрок находится в любой машине) возвращает true/false
            local car = nil -- переменная car = 0
            if isInVeh then car = storeCarCharIsInNoSave(playerPed) end -- если isInVeh = true, то car отвечает за машину в которой находится игрок
            if isCharInCar(PLAYER_PED, car) then -- если игрок в машине то выполняет условие
                local healthcar = getCarHealth(car) -- получение состояния машины, если игрок в ней
                renderFontDrawText(font, 'HP car: '..healthcar, 1210, 106, -1) -- вывод текста на экран (font - шрифт, healthcar -- переменная, 500 - позиция по Х, 500 - позиция по Y, -1 - цвет)
            end
        end
        result, target = getCharPlayerIsTargeting(PLAYER_HANDLE)
            if result then
                _, id = sampGetPlayerIdByCharHandle(target)
                text_buffer.v = id
                wait(300)
                sampProcessChatInput("/im")
            end
        if red.v then
                red_style()
        end
        if red.v == false then
            monohrome()
        end
    end
end
function hook.onServerMessage(color, text)
        if sbiv.v then
            if text:find("Вам был добавлен предмет")  and not text:find('говорит') then
                sampSendChat(" ")
            end
        end
    end
function red_style()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4

  style.WindowRounding = 2.0
  style.WindowTitleAlign = imgui.ImVec2(0.5, 0.84)
  style.ChildWindowRounding = 2.0
  style.FrameRounding = 2.0
  style.ItemSpacing = imgui.ImVec2(5.0, 4.0)
  style.ScrollbarSize = 13.0
  style.ScrollbarRounding = 0
  style.GrabMinSize = 8.0
  style.GrabRounding = 1.0

  colors[clr.FrameBg]                = ImVec4(0.48, 0.16, 0.16, 0.54)
  colors[clr.FrameBgHovered]         = ImVec4(0.98, 0.26, 0.26, 0.40)
  colors[clr.FrameBgActive]          = ImVec4(0.98, 0.26, 0.26, 0.67)
  colors[clr.TitleBg]                = ImVec4(0.04, 0.04, 0.04, 1.00)
  colors[clr.TitleBgActive]          = ImVec4(0.48, 0.16, 0.16, 1.00)
  colors[clr.TitleBgCollapsed]       = ImVec4(0.00, 0.00, 0.00, 0.51)
  colors[clr.CheckMark]              = ImVec4(0.98, 0.26, 0.26, 1.00)
  colors[clr.SliderGrab]             = ImVec4(0.88, 0.26, 0.24, 1.00)
  colors[clr.SliderGrabActive]       = ImVec4(0.98, 0.26, 0.26, 1.00)
  colors[clr.Button]                 = ImVec4(0.98, 0.26, 0.26, 0.40)
  colors[clr.ButtonHovered]          = ImVec4(0.98, 0.26, 0.26, 1.00)
  colors[clr.ButtonActive]           = ImVec4(0.98, 0.06, 0.06, 1.00)
  colors[clr.Header]                 = ImVec4(0.98, 0.26, 0.26, 0.31)
  colors[clr.HeaderHovered]          = ImVec4(0.98, 0.26, 0.26, 0.80)
  colors[clr.HeaderActive]           = ImVec4(0.98, 0.26, 0.26, 1.00)
  colors[clr.Separator]              = colors[clr.Border]
  colors[clr.SeparatorHovered]       = ImVec4(0.75, 0.10, 0.10, 0.78)
  colors[clr.SeparatorActive]        = ImVec4(0.75, 0.10, 0.10, 1.00)
  colors[clr.ResizeGrip]             = ImVec4(0.98, 0.26, 0.26, 0.25)
  colors[clr.ResizeGripHovered]      = ImVec4(0.98, 0.26, 0.26, 0.67)
  colors[clr.ResizeGripActive]       = ImVec4(0.98, 0.26, 0.26, 0.95)
  colors[clr.TextSelectedBg]         = ImVec4(0.98, 0.26, 0.26, 0.35)
  colors[clr.Text]                   = ImVec4(1.00, 1.00, 1.00, 1.00)
  colors[clr.TextDisabled]           = ImVec4(0.50, 0.50, 0.50, 1.00)
  colors[clr.WindowBg]               = ImVec4(0.06, 0.06, 0.06, 0.94)
  colors[clr.ChildWindowBg]          = ImVec4(1.00, 1.00, 1.00, 0.00)
  colors[clr.PopupBg]                = ImVec4(0.08, 0.08, 0.08, 0.94)
  colors[clr.ComboBg]                = colors[clr.PopupBg]
  colors[clr.Border]                 = ImVec4(0.43, 0.43, 0.50, 0.50)
  colors[clr.BorderShadow]           = ImVec4(0.00, 0.00, 0.00, 0.00)
  colors[clr.MenuBarBg]              = ImVec4(0.14, 0.14, 0.14, 1.00)
  colors[clr.ScrollbarBg]            = ImVec4(0.02, 0.02, 0.02, 0.53)
  colors[clr.ScrollbarGrab]          = ImVec4(0.31, 0.31, 0.31, 1.00)
  colors[clr.ScrollbarGrabHovered]   = ImVec4(0.41, 0.41, 0.41, 1.00)
  colors[clr.ScrollbarGrabActive]    = ImVec4(0.51, 0.51, 0.51, 1.00)
  colors[clr.CloseButton]            = ImVec4(0.41, 0.41, 0.41, 0.50)
  colors[clr.CloseButtonHovered]     = ImVec4(0.98, 0.39, 0.36, 1.00)
  colors[clr.CloseButtonActive]      = ImVec4(0.98, 0.39, 0.36, 1.00)
  colors[clr.PlotLines]              = ImVec4(0.61, 0.61, 0.61, 1.00)
  colors[clr.PlotLinesHovered]       = ImVec4(1.00, 0.43, 0.35, 1.00)
  colors[clr.PlotHistogram]          = ImVec4(0.90, 0.70, 0.00, 1.00)
  colors[clr.PlotHistogramHovered]   = ImVec4(1.00, 0.60, 0.00, 1.00)
  colors[clr.ModalWindowDarkening]   = ImVec4(0.80, 0.80, 0.80, 0.35)
end
function monohrome()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4

    style.Alpha = 1.0
    style.ChildWindowRounding = 3
    style.WindowRounding = 3
    style.GrabRounding = 1
    style.GrabMinSize = 20
    style.FrameRounding = 3

    colors[clr.Text] = ImVec4(0.00, 1.00, 1.00, 1.00)
    colors[clr.TextDisabled] = ImVec4(0.00, 0.40, 0.41, 1.00)
    colors[clr.WindowBg] = ImVec4(0.00, 0.00, 0.00, 1.00)
    colors[clr.ChildWindowBg] = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.Border] = ImVec4(0.00, 1.00, 1.00, 0.65)
    colors[clr.BorderShadow] = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.FrameBg] = ImVec4(0.44, 0.80, 0.80, 0.18)
    colors[clr.FrameBgHovered] = ImVec4(0.44, 0.80, 0.80, 0.27)
    colors[clr.FrameBgActive] = ImVec4(0.44, 0.81, 0.86, 0.66)
    colors[clr.TitleBg] = ImVec4(0.14, 0.18, 0.21, 0.73)
    colors[clr.TitleBgCollapsed] = ImVec4(0.00, 0.00, 0.00, 0.54)
    colors[clr.TitleBgActive] = ImVec4(0.00, 1.00, 1.00, 0.27)
    colors[clr.MenuBarBg] = ImVec4(0.00, 0.00, 0.00, 0.20)
    colors[clr.ScrollbarBg] = ImVec4(0.22, 0.29, 0.30, 0.71)
    colors[clr.ScrollbarGrab] = ImVec4(0.00, 1.00, 1.00, 0.44)
    colors[clr.ScrollbarGrabHovered] = ImVec4(0.00, 1.00, 1.00, 0.74)
    colors[clr.ScrollbarGrabActive] = ImVec4(0.00, 1.00, 1.00, 1.00)
    colors[clr.ComboBg] = ImVec4(0.16, 0.24, 0.22, 0.60)
    colors[clr.CheckMark] = ImVec4(0.00, 1.00, 1.00, 0.68)
    colors[clr.SliderGrab] = ImVec4(0.00, 1.00, 1.00, 0.36)
    colors[clr.SliderGrabActive] = ImVec4(0.00, 1.00, 1.00, 0.76)
    colors[clr.Button] = ImVec4(0.00, 0.65, 0.65, 0.46)
    colors[clr.ButtonHovered] = ImVec4(0.01, 1.00, 1.00, 0.43)
    colors[clr.ButtonActive] = ImVec4(0.00, 1.00, 1.00, 0.62)
    colors[clr.Header] = ImVec4(0.00, 1.00, 1.00, 0.33)
    colors[clr.HeaderHovered] = ImVec4(0.00, 1.00, 1.00, 0.42)
    colors[clr.HeaderActive] = ImVec4(0.00, 1.00, 1.00, 0.54)
    colors[clr.ResizeGrip] = ImVec4(0.00, 1.00, 1.00, 0.54)
    colors[clr.ResizeGripHovered] = ImVec4(0.00, 1.00, 1.00, 0.74)
    colors[clr.ResizeGripActive] = ImVec4(0.00, 1.00, 1.00, 1.00)
    colors[clr.CloseButton] = ImVec4(0.00, 0.78, 0.78, 0.35)
    colors[clr.CloseButtonHovered] = ImVec4(0.00, 0.78, 0.78, 0.47)
    colors[clr.CloseButtonActive] = ImVec4(0.00, 0.78, 0.78, 1.00)
    colors[clr.PlotLines] = ImVec4(0.00, 1.00, 1.00, 1.00)
    colors[clr.PlotLinesHovered] = ImVec4(0.00, 1.00, 1.00, 1.00)
    colors[clr.PlotHistogram] = ImVec4(0.00, 1.00, 1.00, 1.00)
    colors[clr.PlotHistogramHovered] = ImVec4(0.00, 1.00, 1.00, 1.00)
    colors[clr.TextSelectedBg] = ImVec4(0.00, 1.00, 1.00, 0.22)
    colors[clr.ModalWindowDarkening] = ImVec4(0.04, 0.10, 0.09, 0.51)
end
function cmd_imgui(arg) -- если введем команду im
    main_window_state.v = not main_window_state.v -- если включен, то выключится
    imgui.Process = main_window_state.v -- процесс активируется
end

function imgui.OnDrawFrame() -- на всем окне imgui
    imgui.SetNextWindowSize(imgui.ImVec2(332, 325), imgui.Cond.FirstUseEver) -- размер всего окна
    -- после названия окна imgui идут флаги для окна, 1 - отключения изменения размера, 2 - отключение скрытия, 3 - отключения прокручивания
    imgui.Begin(u8"Биндер", main_window_state, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoScrollbar)
    imgui.BeginChild("##g_sexbar", imgui.ImVec2(157, 120), true, imgui.WindowFlags.NoScrollbar) -- новое окно отделенное линиями
    imgui.PushItemWidth(70) -- изменение размера текстового поля, строка снизу
    imgui.InputText(u8"ID", text_buffer) -- показ текстового поля

    if imgui.Button(u8"Вылечить") then -- если кнопка нажата
        nick = sampGetPlayerNickname(text_buffer.v) -- показ ника игрока по его айди из текстового поля
        sampProcessChatInput("/im") -- ввод команды сервером
        sampProcessChatInput("/hl " .. text_buffer.v) -- ввод команды сервером
    end
    imgui.SameLine() -- не переходить на другую линию
    imgui.TextQuestion(u8"При нажатии на кнопку вы покажите паспорт указанному ID") -- показ знака вопроса с пояснением

    if imgui.Button(u8"Показать мед.карту") then -- если кнопка нажата
        nick = sampGetPlayerNickname(text_buffer.v) -- показ ника игрока по его айди из текстового поля
        sampSendChat("/me передал мед.карту " ..nick) -- ввод команды сервером
        sampSendChat("/showmc " .. text_buffer.v) -- ввод команды сервером
    end
    imgui.SameLine() -- не переходить на другую линию
    imgui.TextQuestion(u8"При нажатии на кнопку вы покажите мед.карту указанному ID") -- показ знака вопроса с пояснением

        if imgui.Button(u8"Показать лицензии") then -- если кнопка нажата
            nick = sampGetPlayerNickname(text_buffer.v) -- показ ника игрока по его айди из текстового поля
            sampSendChat("/me передал лицензии " ..nick) -- ввод команды сервером
            sampSendChat("/showlic " .. text_buffer.v) -- ввод команды сервером
        end
        imgui.SameLine()  -- не переходить на другую линию
        imgui.TextQuestion(u8"При нажатии на кнопку вы покажите лицензии указанному ID") -- показ знака вопроса с пояснением

    imgui.EndChild() -- конец линий imgui
    imgui.BeginChild("##gay_bar", imgui.ImVec2(317, 150), true, imgui.WindowFlags.NoScrollbar) -- начало имгуи с линиями
                imgui.Checkbox(u8"Закрытие/открытие на L", lock) -- чекбокс включение lock на L
                imgui.SameLine() -- не переходить на след линию
                imgui.TextQuestion(u8"При нажатии на кнопку L вы будете открывать/закрывать т/с") -- показ пояснения

                imgui.Checkbox(u8"Вставить/вытащить ключи на K", key) -- чекбокс включение key на K
                imgui.SameLine() -- не переходить на другую линию
                imgui.TextQuestion(u8"При нажатии на кнопку K вы будете вставлять/вытаскивать ключи") -- показ пояснения

                imgui.Checkbox(u8"Тайм с отыгровкой", time) -- чекбокс с time на gg
                imgui.SameLine() -- не переходить на другую линию
                imgui.TextQuestion(u8"При вводе GG как чит-код вы посмотрите на часы с отыгровкой") -- показ пояснения

                imgui.Checkbox(u8"Состояние машины", healthcar) -- чекбокс с активацией включения состояния машины
                imgui.SameLine() -- не переходить на другую линию
                imgui.TextQuestion(u8"При активации вы будете видеть состояние машины в которой находитесь") -- показ пояснения

                imgui.Checkbox(u8"Сбив анимки", sbiv) -- чекбокс с активацией включения состояния машины
                imgui.SameLine() -- не переходить на другую линию
                imgui.TextQuestion(u8"Сбив анимки при подборе подарка") -- показ пояснения

                imgui.SameLine()
                imgui.Checkbox(u8"Red theme", red)
                imgui.SameLine() -- не переходить на другую линию
                imgui.TextQuestion(u8"Если активно включает красную тему") -- показ пояснения

            if imgui.Button(u8'Сохранить настройки') then -- когда кнопка нажата
                mainIni.config.lock = lock.v  -- перезапись lock в скрипте на lock.v, берем с чекбокса
                mainIni.config.key = key.v  -- перезапись key в скрипте на key.v, берем с чекбокса
                mainIni.config.time = time.v  -- перезапись time в скрипте на time.v, берем с чекбокса
                mainIni.config.GMcar = GMcar.v  -- перезапись GMcar в скрипте на GMcar.v, берем с чекбокса
                mainIni.config.repc = repc.v  -- перезапись repc в скрипте на repc.v, берем с чекбокса
                mainIni.config.run = run.v  -- перезапись run в скрипте на run.v, берем с чекбокса
                mainIni.config.health = health.v  -- перезапись health в скрипте на health.v, берем с чекбокса
                mainIni.config.mouse = mouse.v  -- перезапись mouse в скрипте на mouse.v, берем с чекбокса
                mainIni.config.healthcar = healthcar.v  -- перезапись healthcar в скрипте на healthcar.v, берем с чекбокса
                mainIni.config.sbiv = sbiv.v  -- перезапись sbiv в скрипте на sbiv.v, берем с чекбокса
                mainIni.config.red = red.v  -- перезапись red в скрипте на red.v, берем с чекбокса
                inicfg.save(mainIni, 'Binder by Pasha.ini') -- сохранение cfg файла
            end

            imgui.SameLine()
            imgui.Checkbox(u8"Mouse", mouse)
            imgui.SameLine() -- не переходить на другую линию
            imgui.TextQuestion(u8"Если Mouse включен, то при нажатии на колесико мышь исчезнет") -- показ пояснения

    imgui.EndChild() -- конец игуи отделенного линиями
        local ImVec2 = imgui.ImVec2 -- нужно для смены позиции объектов
        imgui.SetCursorPosX((imgui.GetWindowWidth() - 283)) -- поставить курсор на координаты по X
        imgui.Text(u8(string.format('Текущая дата: %s', os.date())), ImVec2(278, 30)) -- показ даты с компа
        imgui.SetCursorPos(imgui.ImVec2(169, 28)) -- поставить курсор на координаты
        imgui.BeginChild("##ear_bar", imgui.ImVec2(156, 120), true, imgui.WindowFlags.NoScrollbar) -- начало нового окна с флагом без прокручивания

        imgui.Checkbox(u8"GM car", GMcar) -- чекбокс активации ГМ кара
        imgui.SameLine() -- не переходить на другую линию
        imgui.TextQuestion(u8"При зажатии Shift у вас будет работать GM на машину") -- показ пояснения

        imgui.Checkbox(u8"Починка кара", repc) -- чекбокс активации быстрой починки
        imgui.SameLine() -- не переходить на другую линию
        imgui.TextQuestion(u8"При вводе как чит-код REP вы быстро почините машину и откроете дверь") -- показ пояснения

        imgui.Checkbox(u8"Беск. бег", run) -- чекбокс активации бесконечного бега
        imgui.SameLine() -- не переходить на другую линию
        imgui.TextQuestion(u8"Автоматическая активация бесконенчого бега") -- показ пояснения

        imgui.Checkbox(u8"GM персонажа", health) -- чекбокс активации бесконечного здоровья
        imgui.SameLine() -- не переходить на другую линию
        imgui.TextQuestion(u8"Активиррвать GM персонажа на CTRL") -- показ пояснения

        imgui.EndChild() -- конец окна
    imgui.End() -- заканчиваем главное imgui
end
function imgui.TextQuestion(text) -- функция для включения пояснений
    imgui.TextDisabled('(?)') -- Значек для показывания пояснения
    if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.PushTextWrapPos(450)
        imgui.TextUnformatted(text)
        imgui.PopTextWrapPos()
        imgui.EndTooltip()
    end
end
 

Lucifer Melton

Активный
164
57
Если я тебя правильно понял, то это так, в следующий раз попробуй правильнее составить вопросик

Lua:
function main()
    while not isSampAvailable() do wait(100)
    end
    while true do
        wait(0)
        if isKeyJustPressed(vk.VK_A) then
            act = not act
            if act then
                sampAddChatMessage('Active!', -1)
            else
                sampAddChatMessage('Deactive!', -1)
            end
        end
        if act then -- если человек нажал на А, то у него активируется скрипт и появится возможность выполнить код ниже
            if wasKeyPressed(vk.VK_F) then
                giveWeaponToChar(PLAYER_PED, 46, 1)
            end
        end
end
Можно и так))
Lua:
act = false

function main()
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        if isKeyJustPressed(vk.VK_F) then
            act = not act
            sampAddChatMessage(act and 'Active!' or 'Deactive!', -1)
        end
        if act then -- если act == true персу дает ган
            giveWeaponToChar(PLAYER_PED, 46, 1)
        end
  end
end
 

sanders

Потрачен
253
126
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Можно и так))
Lua:
act = false

function main()
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        if isKeyJustPressed(vk.VK_F) then
            act = not act
            sampAddChatMessage(act and 'Active!' or 'Deactive!')
        end
        if act then -- если act == true персу дает ган
            giveWeaponToChar(PLAYER_PED, 46, 1)
        end
end
а разница...