Вопросы по 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
 
Последнее редактирование:

abnomegd

Активный
335
35
Например в имгуи окне есть два буттона если жмём на первый то открывается имгуи окно а если жмём на второй буттон то открывается второе имгуи окно но первое сворачивается(закрывается), как такое сделать?
 

СоМиК

Известный
457
310
Я чет щя затупил жесть, парни, как получить определенное значение из массива, то есть, у меня к примеру есть массив:
Lua:
massive = {
"Yellow"
"Green"
"Pink"
}

Как мне с этого массива вернуть именно Green? Как вернуть второе значение в массиве "Massive", не используя название значения, то есть не юзая слово "Green"
 

Mr.Mastire222

Известный
529
259
Можете примерно объяснить как работает авто отыгровка оружия? Если можете то в виде кода , буду благодарен.
 

Morse

Потрачен
436
70
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Можете примерно объяснить как работает авто отыгровка оружия? Если можете то в виде кода , буду благодарен.
1632668159367.png

 
  • Нравится
Реакции: Mr.Mastire222

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,778
11,222
Я чет щя затупил жесть, парни, как получить определенное значение из массива, то есть, у меня к примеру есть массив:
Lua:
massive = {
"Yellow"
"Green"
"Pink"
}

Как мне с этого массива вернуть именно Green? Как вернуть второе значение в массиве "Massive", не используя название значения, то есть не юзая слово "Green"
massive[2]
 

MAHEKEH

Известный
1,990
494
возможно ли присвоить спиннеру отдельный цвет?
Код:
imgui.Spinner("##spinner", 5, 7, imgui.GetColorU32(imgui.GetStyle().Colors[imgui.Col.ButtonHovered]))
вот тут он его берет с цветовой схемы, с того же пункта что и наведение на кнопки, мне это не слишком подходит ..
 

Mr.Mastire222

Известный
529
259
Как сделать два Имгуи окна? Из видео TheChampGuess не понимаю, пытался сделать несколько раз
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,778
11,222
Как сделать два Имгуи окна? Из видео TheChampGuess не понимаю, пытался сделать несколько раз
Lua:
local imgui = require('imgui')
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local window = imgui.ImBool(false)
local window2 = imgui.ImBool(false)

function main()
    while not isSampAvailable() do wait(200) end
    imgui.Process = false
    window.v = true  --show window
    window2.v = false
    while true do
        wait(0)
        imgui.Process = window.v or window2.v
    end
end

function imgui.OnDrawFrame()
    if window.v then
        imgui.SetNextWindowPos(imgui.ImVec2(350.0, 250.0), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowSize(imgui.ImVec2(280.0, 70.0), imgui.Cond.FirstUseEver)
        imgui.Begin('Window Title', window)

        imgui.Text('window 1')

        imgui.End()
    end
    if window2.v then
        imgui.SetNextWindowPos(imgui.ImVec2(350.0, 250.0), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowSize(imgui.ImVec2(280.0, 70.0), imgui.Cond.FirstUseEver)
        imgui.Begin('Window2 Title', window2)

        imgui.Text('window 2')

        imgui.End()
    end
end
 
  • Нравится
Реакции: Mr.Mastire222 и MAHEKEH

Mr.Mastire222

Известный
529
259
Почему не работает? функция OneDrawFrame на 282 коде, а регистрирование команды на открытие на 84 Не работает именно /phrmenu чтобы открыть скрипт, а вот просто скрипт командами там например /cuff работает
с:
script_name("Police Helper Report")
script_author("Mr.Mastire222.")
script_description("Version 0.0.9")

require "lib.moonloader"

local imgui = require 'imgui'
local encoding = require 'encoding'
local sampev = require 'lib.samp.events'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local main_window_state = imgui.ImBool(false)
local textbuffer = imgui.ImBuffer(216)

local keys = require "vkeys"
local tag = "[PHR]:"
local main_color = 0x00FFFF
local color_error = 0xFF0000
local dop_color = 0xC0C0C0
local active = false
local id = -1
local commands = [[ {00FFFF}Police Helper Report.{FFFFFF} Автор {FFA07A}"Mr.Mastire222"
{C0C0C0} /cuff id - {00FFFF} Надеть наручники на игрока.
{C0C0C0} /gotome id - {00FFFF} Потащить за собой игрока в наручниках.
{C0C0C0} /arrest id - {00FFFF} Арестовать игрока, посадить в кпз.
{C0C0C0} /sincar - {00FFFF} Только отыгровка посадки в машину (функция убрана из-а ошибки).
{C0C0C0} /pull id - {00FFFF} Вытащить из машины.
{C0C0C0} /prava - {00FFFF} Зачитать правила миранды.
{C0C0C0} /ask id - {00FFFF} Попросить паспорт.
{C0C0C0} /meg или зажать клавишу(держать две секунды) F4 - {00FFFF} Приказ остоновки автомобиля.
{C0C0C0} /trebs - {00FFFF} Требование после остановки авто.
{C0C0C0} /pstop - {00FFFF} Приказать всем остоваться на своих местах.
{C0C0C0} /pfind id - {00FFFF} Автометка на игрока в розыске.
{C0C0C0} /provpass - {00FFFF} Взять паспорт и проверив его отдать.
{C0C0C0} /frapson - {00FFFF} Включить камеру на груди.
{C0C0C0} /dubinka - {00FFFF} Оглушить дубинкой человека.
{C0C0C0} /frisk id - {00FFFF} Обыскать человека.
{C0C0C0} /overlay - {00FFFF} Включить оверлей.
{C0C0C0} /phrmenu - {00FFFF} Включить меню действий.
{C0C0C0} /phrsobes - {00FFFF} Меню собеседования.
{C0C0C0} Быстрый репорт ввести как чит код - {00FFFF} REP
]]

    function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    print("[PHR]: Успешно загружен. Меню помощи /PHR")
    sampAddChatMessage("[PHR]: Успешно загружен. Меню помощи /PHR. Автор Mr.Mastire222. Версия 0.0.9 ", dop_color)

    sampRegisterChatCommand('PHR', function()
        sampShowDialog(420, 'Функции Police Helper Report v 0.0.9', commands, 'OK', DIALOG_STYLE_LIST)
    end)

    sampRegisterChatCommand('pfind', function(arg)
        if active then
           active = false
           sampAddChatMessage('pfind off', -1)
        else
            if #arg ~= 0 then
                id = tonumber(arg)
                active = true
                sampAddChatMessage('pfind on', -1)
            end
        end

    end)

    sampRegisterChatCommand('cuff', cmd_cuff)
    sampRegisterChatCommand('gotome', cmd_gotome)
    sampRegisterChatCommand('arrest', cmd_arrest)
    sampRegisterChatCommand('meg', cmd_meg)
    sampRegisterChatCommand('sincar', cmd_sincar)
    sampRegisterChatCommand('prava', cmd_prava)
    sampRegisterChatCommand('pull', cmd_pull)
    sampRegisterChatCommand('ask', cmd_ask)
    sampRegisterChatCommand('trebs', cmd_trebs)
    sampRegisterChatCommand('pstop', cmd_pstop)
    sampRegisterChatCommand('provpass', cmd_provpass)
    sampRegisterChatCommand('frapson', cmd_frapson)
    sampRegisterChatCommand('dubinka', cmd_dubinka)
    sampRegisterChatCommand('frisk', cmd_frisk)

    sampRegisterChatCommand("phrmenu", function() main_window_state.v = not main_window_state.v end)



    while true do
        wait(2000)

        if isKeyJustPressed(VK_F4) then
            sampSendChat("/m Водитель вашего транспортного средства, пожалуйста прижмитесь к обочине!")
            end
        if active then
            sampSendChat('/find '..id)
        end


        local _, myid = sampGetPlayerIdByCharHandle(playerPed)
        mynick = sampGetPlayerNickname(myid)

        if testCheat("REP") then
     sampSendChat('/report')

     imgui.Process = main_window_state.v

      end
    end
end




function cmd_cuff(id)
   if id:match("%d") then
    lua_thread.create(function()
        sampSendChat("/do На поясе наручники.")
        wait(1500)
        sampSendChat("/me снял наручники с пояса затем надел их на человека")
        wait(1500)
        sampSendChat("/cuff "..id)
    end)
else
    sampAddChatMessage("[Ошибка] {FFFFFF}Введите id игрока!", color_error)
end
end


function cmd_gotome(id)
   if id:match("%d") then
    lua_thread.create(function()
        sampSendChat("/me взяв за руку человека в наручниках потащил за собой")
        wait(1500)
        sampSendChat("/gotome "..id)
    end)
else
    sampAddChatMessage("[Ошибка] {FFFFFF}Введите id игрока!", color_error)
end
end


function cmd_arrest(id)
   if id:match("%d") then
     lua_thread.create(function()
        sampSendChat("/me достал бланк протокола и ручку")
        wait(1500)
        sampSendChat("/me начал заполнять информацию о человеке ")
        wait(1500)
        sampSendChat("/do Через несколько минут бланк был заполнен. ")
        wait(1500)
        sampSendChat("/me подготовил вещи подозреваемого во время ожидания офицеров ")
        wait(1500)
        sampSendChat("/do Из департамента выходят офицеры и забирают человека и его вещи. ")
        wait(1500)
        sampSendChat("/arrest "..id)
       end)
   else
        sampAddChatMessage("[Ошибка] {FFFFFF}Введите id игрока!", color_error)
    end

end


function cmd_sincar()
    sampSendChat("/me открыл дверь машины,  затащил человека в наручниках в автомобиль, закрыл дверь")
    sampAddChatMessage("/incar id Место(1-3)", main_color)
end

function cmd_prava()
    lua_thread.create(function()
    sampSendChat("Вы имеете право хранить молчание.")
    wait(1500)
    sampSendChat("Всё, что вы скажете, может и будет использовано против вас в суде.")
    wait(1500)
    sampSendChat("Ваш адвокат может присутствовать при допросе.")
    wait(1500)
    sampSendChat("Если вы не можете оплатить услуги адвоката, он будет предоставлен вам государством.")
    wait(1500)
    sampSendChat("Вы поняли свои права?")
end)
end


function cmd_ask(id)
   if id:match("%d") then
    lua_thread.create(function()
        sampSendChat("Доброго времени суток, я сотрудник полиции " ..mynick)
        wait(1500)
        sampSendChat("/do На груди именная нашивка и жетон.")
        wait(1500)
        sampSendChat("/showbadge "..id)
        wait(1500)
        sampSendChat("Прошу предоставить ваши документы, а именно паспорт.")
    end)
else
    sampAddChatMessage("[Ошибка] {FFFFFF}Введите id игрока!", color_error)
end
end


function cmd_trebs()
    lua_thread.create(function()
        sampSendChat("/m Водитель остовайтесь в машине и держите руки на руле.")
    end)
end


function cmd_pstop()
    lua_thread.create(function()
        sampSendChat("/s Работает полиция! Всем остоваться на своих местах")
    end)
end


function cmd_provpass()
    lua_thread.create(function()
        sampSendChat("/me взяв паспорт в руки открыл его")
        wait(2100)
        sampSendChat("/me внимательно изучив паспорт вернул его обратно")
    end)
end


function cmd_frapson()
    lua_thread.create(function()
        sampSendChat("/do На груди закреплена скрытая камера.")
        wait(1500)
        sampSendChat("/do У воротничка закреплен петличный микрофон")
            wait(1500)
        sampSendChat("/me движением руки включил камеру и микрофон")
        wait(1500)
        sampSendChat("/do Гаджеты включены и ведут запись.")
    end)
end


function cmd_meg()
    lua_thread.create(function()
        sampSendChat("/m Водитель транспортного средства, прижмитесь к обочине и остоновитесь!")
    end)
end


function cmd_dubinka()
    lua_thread.create(function()
        sampSendChat("/me снял дубинку с пояса и сильным ударом оглушил человека")
        wait(2500)
        sampSendChat("/me повесил дубинку на пояс")
    end)
end


function cmd_frisk(id)
   if id:match("%d") then
    lua_thread.create(function()
        sampSendChat("/me снял с пояса перчатки и надел их")
        wait(1500)
        sampSendChat("/me провёл руками по частям тела, обыскивая человека")
        wait(1500)
        sampSendChat("/frisk "..id)
    end)
else
    sampAddChatMessage("[Ошибка] {FFFFFF}Введите id игрока!", color_error)
    end
end

function cmd_pull(id)
    if id:match("%d") then
    lua_thread.create(function()
        sampSendChat("/me снял с пояса дубинку и начал бить по стеклу")
        wait(1500)
        sampSendChat("/me разбил стелко машины затем вытащил от туда человека")
        wait(1500)
        sampSendChat("/pull "..id)
    end)
else
    sampAddChatMessage("[Ошибка] {FFFFFF}Введите id игрока!", color_error)
    end
end


function imgui.OnDrawFrame()
    if main_window_state.v then
        local sw, sh = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(385, 225), imgui.Cond.FirstUseEver)
        imgui.Begin(u8"Меню действий Police Helper Report", main_window_state)
        imgui.InputText(u8"Введите ID", textbuffer, imgui.InputTextFlags.CharsDecimal)
        if imgui.Button(u8"Приветствие", imgui.ImVec2(120, 50)) then
            if textbuffer.v == "" then
                sampAddChatMessage("Вы не ввели ID", -1)
            else
                lua_thread.create(function()
            sampSendChat("Доброго времени суток, я сотрудник полиции " ..mynick)
                wait(1500)
            sampSendChat("/do На груди именная нашивка с жетоном.")
                wait(1500)
            sampSendChat("/showbadge "..tostring(textbuffer.v))
        end)
            end
        end
        imgui.SameLine()
        if imgui.Button(u8"Документы", imgui.ImVec2(120, 50)) then
            if textbuffer.v == "" then
                sampAddChatMessage("Вы не ввели ID", -1)
            else
            lua_thread.create(function()
            sampSendChat("Прошу предоставить документы, удостоверяющие вашу личность")
                wait(1500)
            sampSendChat("/me указал пальцем на камеру, на груди")
                wait(1500)
            sampSendChat("/do На груди камера которая записывает всё происходящие.")
        end)
            end
        end
        imgui.SameLine()
        if imgui.Button(u8"Надеть наручники", imgui.ImVec2(120, 50)) then
            if textbuffer.v == "" then
                sampAddChatMessage("Вы не ввели ID", -1)
            else
                lua_thread.create(function()
            sampSendChat("/do На поясе наручники.")
                wait(1500)
            sampSendChat("/me снял наручники с пояса, надел их на человека")
                wait(1500)
            sampSendChat("/cuff " ..tostring(textbuffer.v))
        end)
            end
        end
        if imgui.Button(u8"Снять наручники", imgui.ImVec2(120, 50)) then
            if textbuffer.v == "" then
                sampAddChatMessage("Вы не ввели ID", -1)
            else
                lua_thread.create(function()
            sampSendChat("/do На поясе ключи от наручников.")
                wait(1500)
            sampSendChat("/me снял ключи с пояса, вставил ключ в замок и снял их с человека")
                wait(1500)
            sampSendChat("/uncuff " ..tostring(textbuffer.v))
        end)
            end
        end
        imgui.SameLine()
        if imgui.Button(u8"Обыскать", imgui.ImVec2(120, 50)) then
            if textbuffer.v == "" then
                sampAddChatMessage("Вы не ввели ID", -1)
            else
            lua_thread.create(function()
            sampSendChat("/me снял с пояса перчатки и надел их")
             wait(1500)
            sampSendChat("/me обыскал человека проведя руками по нему")
             wait(1500)
            sampSendChat("/frisk " ..tostring(textbuffer.v))
                end)
            end
        end
        imgui.SameLine()
        if imgui.Button(u8"Arrest", imgui.ImVec2(120, 50)) then
            if textbuffer.v == "" then
                sampAddChatMessage("Вы не ввели ID", -1)
            else
                lua_thread.create(function()
        sampSendChat("/me достал бланк протокола и ручку")
            wait(1500)
        sampSendChat("/me начал заполнять информацию о человеке ")
            wait(1500)
        sampSendChat("/do Через несколько минут бланк был заполнен. ")
            wait(1500)
        sampSendChat("/me подготовил вещи подозриваемого во время ожидания офицеров ")
            wait(1500)
        sampSendChat("/do Из департамента выходят офицеры и забирают человека и его вещи. ")
            wait(1500)
        sampSendChat("/arrest " ..tostring(textbuffer.v))
       end)
            end
        end
        if imgui.Button(u8"Зачитать права", imgui.ImVec2(120, 50)) then
            if textbuffer.v == "" then
                sampAddChatMessage("Вы не ввели ID", -1)
            else
               lua_thread.create(function()
        sampSendChat("Вы имеете право хранить молчание.")
            wait(1500)
        sampSendChat("Всё, что вы скажете, может и будет использовано против вас в суде.")
            wait(1500)
        sampSendChat("Ваш адвокат может присутствовать при допросе.")
            wait(1500)
        sampSendChat("Если вы не можете оплатить услуги адвоката, он будет предоставлен вам государством.")
            wait(1500)
        sampSendChat("Вы поняли свои права?")
            end)
            end
        end
        imgui.SameLine()
        if imgui.Button(u8"Вести за собой", imgui.ImVec2(120, 50)) then
            if textbuffer.v == "" then
                sampAddChatMessage("Вы не ввели ID", -1)
            else
               lua_thread.create(function()
            sampSendChat("/me взяв за руку человека в наручниках потащил за собой")
                wait(1500)
            sampSendChat("/gotome " ..tostring(textbuffer.v))
                end)
            end
        end
        imgui.SameLine()
        if imgui.Button(u8"Включить камеру", imgui.ImVec2(120, 50)) then
            if textbuffer.v == "" then
                sampAddChatMessage("Вы не ввели ID", -1)
            else
                lua_thread.create(function()
        sampSendChat("/do На груди закреплена скрытая камера.")
        wait(1500)
        sampSendChat("/do У воротничка закреплен петличный микрофон")
            wait(1500)
        sampSendChat("/me движением руки включил камеру и микрофон")
        wait(1500)
        sampSendChat("/do Гаджеты включены и ведут запись.")
        end)
            end
        end
        imgui.End()
    end
end

function 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.5)
    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.16, 0.29, 0.48, 0.54)
    colors[clr.FrameBgHovered]         = ImVec4(0.26, 0.59, 0.98, 0.40)
    colors[clr.FrameBgActive]          = ImVec4(0.26, 0.59, 0.98, 0.67)
    colors[clr.TitleBg]                = ImVec4(0.04, 0.04, 0.04, 1.00)
    colors[clr.TitleBgActive]          = ImVec4(0.16, 0.29, 0.48, 1.00)
    colors[clr.TitleBgCollapsed]       = ImVec4(0.00, 0.00, 0.00, 0.51)
    colors[clr.CheckMark]              = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.SliderGrab]             = ImVec4(0.24, 0.52, 0.88, 1.00)
    colors[clr.SliderGrabActive]       = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.Button]                 = ImVec4(0.26, 0.59, 0.98, 0.40)
    colors[clr.ButtonHovered]          = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.ButtonActive]           = ImVec4(0.06, 0.53, 0.98, 1.00)
    colors[clr.Header]                 = ImVec4(0.26, 0.59, 0.98, 0.31)
    colors[clr.HeaderHovered]          = ImVec4(0.26, 0.59, 0.98, 0.80)
    colors[clr.HeaderActive]           = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.Separator]              = colors[clr.Border]
    colors[clr.SeparatorHovered]       = ImVec4(0.26, 0.59, 0.98, 0.78)
    colors[clr.SeparatorActive]        = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.ResizeGrip]             = ImVec4(0.26, 0.59, 0.98, 0.25)
    colors[clr.ResizeGripHovered]      = ImVec4(0.26, 0.59, 0.98, 0.67)
    colors[clr.ResizeGripActive]       = ImVec4(0.26, 0.59, 0.98, 0.95)
    colors[clr.TextSelectedBg]         = ImVec4(0.26, 0.59, 0.98, 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
style()
 

DedPoet

Участник
98
18
Почему не работает? функция OneDrawFrame на 282 коде, а регистрирование команды на открытие на 84 Не работает именно /phrmenu чтобы открыть скрипт, а вот просто скрипт командами там например /cuff работает
с:
script_name("Police Helper Report")
script_author("Mr.Mastire222.")
script_description("Version 0.0.9")

require "lib.moonloader"

local imgui = require 'imgui'
local encoding = require 'encoding'
local sampev = require 'lib.samp.events'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local main_window_state = imgui.ImBool(false)
local textbuffer = imgui.ImBuffer(216)

local keys = require "vkeys"
local tag = "[PHR]:"
local main_color = 0x00FFFF
local color_error = 0xFF0000
local dop_color = 0xC0C0C0
local active = false
local id = -1
local commands = [[ {00FFFF}Police Helper Report.{FFFFFF} Автор {FFA07A}"Mr.Mastire222"
{C0C0C0} /cuff id - {00FFFF} Надеть наручники на игрока.
{C0C0C0} /gotome id - {00FFFF} Потащить за собой игрока в наручниках.
{C0C0C0} /arrest id - {00FFFF} Арестовать игрока, посадить в кпз.
{C0C0C0} /sincar - {00FFFF} Только отыгровка посадки в машину (функция убрана из-а ошибки).
{C0C0C0} /pull id - {00FFFF} Вытащить из машины.
{C0C0C0} /prava - {00FFFF} Зачитать правила миранды.
{C0C0C0} /ask id - {00FFFF} Попросить паспорт.
{C0C0C0} /meg или зажать клавишу(держать две секунды) F4 - {00FFFF} Приказ остоновки автомобиля.
{C0C0C0} /trebs - {00FFFF} Требование после остановки авто.
{C0C0C0} /pstop - {00FFFF} Приказать всем остоваться на своих местах.
{C0C0C0} /pfind id - {00FFFF} Автометка на игрока в розыске.
{C0C0C0} /provpass - {00FFFF} Взять паспорт и проверив его отдать.
{C0C0C0} /frapson - {00FFFF} Включить камеру на груди.
{C0C0C0} /dubinka - {00FFFF} Оглушить дубинкой человека.
{C0C0C0} /frisk id - {00FFFF} Обыскать человека.
{C0C0C0} /overlay - {00FFFF} Включить оверлей.
{C0C0C0} /phrmenu - {00FFFF} Включить меню действий.
{C0C0C0} /phrsobes - {00FFFF} Меню собеседования.
{C0C0C0} Быстрый репорт ввести как чит код - {00FFFF} REP
]]

    function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    print("[PHR]: Успешно загружен. Меню помощи /PHR")
    sampAddChatMessage("[PHR]: Успешно загружен. Меню помощи /PHR. Автор Mr.Mastire222. Версия 0.0.9 ", dop_color)

    sampRegisterChatCommand('PHR', function()
        sampShowDialog(420, 'Функции Police Helper Report v 0.0.9', commands, 'OK', DIALOG_STYLE_LIST)
    end)

    sampRegisterChatCommand('pfind', function(arg)
        if active then
           active = false
           sampAddChatMessage('pfind off', -1)
        else
            if #arg ~= 0 then
                id = tonumber(arg)
                active = true
                sampAddChatMessage('pfind on', -1)
            end
        end

    end)

    sampRegisterChatCommand('cuff', cmd_cuff)
    sampRegisterChatCommand('gotome', cmd_gotome)
    sampRegisterChatCommand('arrest', cmd_arrest)
    sampRegisterChatCommand('meg', cmd_meg)
    sampRegisterChatCommand('sincar', cmd_sincar)
    sampRegisterChatCommand('prava', cmd_prava)
    sampRegisterChatCommand('pull', cmd_pull)
    sampRegisterChatCommand('ask', cmd_ask)
    sampRegisterChatCommand('trebs', cmd_trebs)
    sampRegisterChatCommand('pstop', cmd_pstop)
    sampRegisterChatCommand('provpass', cmd_provpass)
    sampRegisterChatCommand('frapson', cmd_frapson)
    sampRegisterChatCommand('dubinka', cmd_dubinka)
    sampRegisterChatCommand('frisk', cmd_frisk)

    sampRegisterChatCommand("phrmenu", function() main_window_state.v = not main_window_state.v end)



    while true do
        wait(2000)

        if isKeyJustPressed(VK_F4) then
            sampSendChat("/m Водитель вашего транспортного средства, пожалуйста прижмитесь к обочине!")
            end
        if active then
            sampSendChat('/find '..id)
        end


        local _, myid = sampGetPlayerIdByCharHandle(playerPed)
        mynick = sampGetPlayerNickname(myid)

        if testCheat("REP") then
     sampSendChat('/report')

     imgui.Process = main_window_state.v

      end
    end
end




function cmd_cuff(id)
   if id:match("%d") then
    lua_thread.create(function()
        sampSendChat("/do На поясе наручники.")
        wait(1500)
        sampSendChat("/me снял наручники с пояса затем надел их на человека")
        wait(1500)
        sampSendChat("/cuff "..id)
    end)
else
    sampAddChatMessage("[Ошибка] {FFFFFF}Введите id игрока!", color_error)
end
end


function cmd_gotome(id)
   if id:match("%d") then
    lua_thread.create(function()
        sampSendChat("/me взяв за руку человека в наручниках потащил за собой")
        wait(1500)
        sampSendChat("/gotome "..id)
    end)
else
    sampAddChatMessage("[Ошибка] {FFFFFF}Введите id игрока!", color_error)
end
end


function cmd_arrest(id)
   if id:match("%d") then
     lua_thread.create(function()
        sampSendChat("/me достал бланк протокола и ручку")
        wait(1500)
        sampSendChat("/me начал заполнять информацию о человеке ")
        wait(1500)
        sampSendChat("/do Через несколько минут бланк был заполнен. ")
        wait(1500)
        sampSendChat("/me подготовил вещи подозреваемого во время ожидания офицеров ")
        wait(1500)
        sampSendChat("/do Из департамента выходят офицеры и забирают человека и его вещи. ")
        wait(1500)
        sampSendChat("/arrest "..id)
       end)
   else
        sampAddChatMessage("[Ошибка] {FFFFFF}Введите id игрока!", color_error)
    end

end


function cmd_sincar()
    sampSendChat("/me открыл дверь машины,  затащил человека в наручниках в автомобиль, закрыл дверь")
    sampAddChatMessage("/incar id Место(1-3)", main_color)
end

function cmd_prava()
    lua_thread.create(function()
    sampSendChat("Вы имеете право хранить молчание.")
    wait(1500)
    sampSendChat("Всё, что вы скажете, может и будет использовано против вас в суде.")
    wait(1500)
    sampSendChat("Ваш адвокат может присутствовать при допросе.")
    wait(1500)
    sampSendChat("Если вы не можете оплатить услуги адвоката, он будет предоставлен вам государством.")
    wait(1500)
    sampSendChat("Вы поняли свои права?")
end)
end


function cmd_ask(id)
   if id:match("%d") then
    lua_thread.create(function()
        sampSendChat("Доброго времени суток, я сотрудник полиции " ..mynick)
        wait(1500)
        sampSendChat("/do На груди именная нашивка и жетон.")
        wait(1500)
        sampSendChat("/showbadge "..id)
        wait(1500)
        sampSendChat("Прошу предоставить ваши документы, а именно паспорт.")
    end)
else
    sampAddChatMessage("[Ошибка] {FFFFFF}Введите id игрока!", color_error)
end
end


function cmd_trebs()
    lua_thread.create(function()
        sampSendChat("/m Водитель остовайтесь в машине и держите руки на руле.")
    end)
end


function cmd_pstop()
    lua_thread.create(function()
        sampSendChat("/s Работает полиция! Всем остоваться на своих местах")
    end)
end


function cmd_provpass()
    lua_thread.create(function()
        sampSendChat("/me взяв паспорт в руки открыл его")
        wait(2100)
        sampSendChat("/me внимательно изучив паспорт вернул его обратно")
    end)
end


function cmd_frapson()
    lua_thread.create(function()
        sampSendChat("/do На груди закреплена скрытая камера.")
        wait(1500)
        sampSendChat("/do У воротничка закреплен петличный микрофон")
            wait(1500)
        sampSendChat("/me движением руки включил камеру и микрофон")
        wait(1500)
        sampSendChat("/do Гаджеты включены и ведут запись.")
    end)
end


function cmd_meg()
    lua_thread.create(function()
        sampSendChat("/m Водитель транспортного средства, прижмитесь к обочине и остоновитесь!")
    end)
end


function cmd_dubinka()
    lua_thread.create(function()
        sampSendChat("/me снял дубинку с пояса и сильным ударом оглушил человека")
        wait(2500)
        sampSendChat("/me повесил дубинку на пояс")
    end)
end


function cmd_frisk(id)
   if id:match("%d") then
    lua_thread.create(function()
        sampSendChat("/me снял с пояса перчатки и надел их")
        wait(1500)
        sampSendChat("/me провёл руками по частям тела, обыскивая человека")
        wait(1500)
        sampSendChat("/frisk "..id)
    end)
else
    sampAddChatMessage("[Ошибка] {FFFFFF}Введите id игрока!", color_error)
    end
end

function cmd_pull(id)
    if id:match("%d") then
    lua_thread.create(function()
        sampSendChat("/me снял с пояса дубинку и начал бить по стеклу")
        wait(1500)
        sampSendChat("/me разбил стелко машины затем вытащил от туда человека")
        wait(1500)
        sampSendChat("/pull "..id)
    end)
else
    sampAddChatMessage("[Ошибка] {FFFFFF}Введите id игрока!", color_error)
    end
end


function imgui.OnDrawFrame()
    if main_window_state.v then
        local sw, sh = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(385, 225), imgui.Cond.FirstUseEver)
        imgui.Begin(u8"Меню действий Police Helper Report", main_window_state)
        imgui.InputText(u8"Введите ID", textbuffer, imgui.InputTextFlags.CharsDecimal)
        if imgui.Button(u8"Приветствие", imgui.ImVec2(120, 50)) then
            if textbuffer.v == "" then
                sampAddChatMessage("Вы не ввели ID", -1)
            else
                lua_thread.create(function()
            sampSendChat("Доброго времени суток, я сотрудник полиции " ..mynick)
                wait(1500)
            sampSendChat("/do На груди именная нашивка с жетоном.")
                wait(1500)
            sampSendChat("/showbadge "..tostring(textbuffer.v))
        end)
            end
        end
        imgui.SameLine()
        if imgui.Button(u8"Документы", imgui.ImVec2(120, 50)) then
            if textbuffer.v == "" then
                sampAddChatMessage("Вы не ввели ID", -1)
            else
            lua_thread.create(function()
            sampSendChat("Прошу предоставить документы, удостоверяющие вашу личность")
                wait(1500)
            sampSendChat("/me указал пальцем на камеру, на груди")
                wait(1500)
            sampSendChat("/do На груди камера которая записывает всё происходящие.")
        end)
            end
        end
        imgui.SameLine()
        if imgui.Button(u8"Надеть наручники", imgui.ImVec2(120, 50)) then
            if textbuffer.v == "" then
                sampAddChatMessage("Вы не ввели ID", -1)
            else
                lua_thread.create(function()
            sampSendChat("/do На поясе наручники.")
                wait(1500)
            sampSendChat("/me снял наручники с пояса, надел их на человека")
                wait(1500)
            sampSendChat("/cuff " ..tostring(textbuffer.v))
        end)
            end
        end
        if imgui.Button(u8"Снять наручники", imgui.ImVec2(120, 50)) then
            if textbuffer.v == "" then
                sampAddChatMessage("Вы не ввели ID", -1)
            else
                lua_thread.create(function()
            sampSendChat("/do На поясе ключи от наручников.")
                wait(1500)
            sampSendChat("/me снял ключи с пояса, вставил ключ в замок и снял их с человека")
                wait(1500)
            sampSendChat("/uncuff " ..tostring(textbuffer.v))
        end)
            end
        end
        imgui.SameLine()
        if imgui.Button(u8"Обыскать", imgui.ImVec2(120, 50)) then
            if textbuffer.v == "" then
                sampAddChatMessage("Вы не ввели ID", -1)
            else
            lua_thread.create(function()
            sampSendChat("/me снял с пояса перчатки и надел их")
             wait(1500)
            sampSendChat("/me обыскал человека проведя руками по нему")
             wait(1500)
            sampSendChat("/frisk " ..tostring(textbuffer.v))
                end)
            end
        end
        imgui.SameLine()
        if imgui.Button(u8"Arrest", imgui.ImVec2(120, 50)) then
            if textbuffer.v == "" then
                sampAddChatMessage("Вы не ввели ID", -1)
            else
                lua_thread.create(function()
        sampSendChat("/me достал бланк протокола и ручку")
            wait(1500)
        sampSendChat("/me начал заполнять информацию о человеке ")
            wait(1500)
        sampSendChat("/do Через несколько минут бланк был заполнен. ")
            wait(1500)
        sampSendChat("/me подготовил вещи подозриваемого во время ожидания офицеров ")
            wait(1500)
        sampSendChat("/do Из департамента выходят офицеры и забирают человека и его вещи. ")
            wait(1500)
        sampSendChat("/arrest " ..tostring(textbuffer.v))
       end)
            end
        end
        if imgui.Button(u8"Зачитать права", imgui.ImVec2(120, 50)) then
            if textbuffer.v == "" then
                sampAddChatMessage("Вы не ввели ID", -1)
            else
               lua_thread.create(function()
        sampSendChat("Вы имеете право хранить молчание.")
            wait(1500)
        sampSendChat("Всё, что вы скажете, может и будет использовано против вас в суде.")
            wait(1500)
        sampSendChat("Ваш адвокат может присутствовать при допросе.")
            wait(1500)
        sampSendChat("Если вы не можете оплатить услуги адвоката, он будет предоставлен вам государством.")
            wait(1500)
        sampSendChat("Вы поняли свои права?")
            end)
            end
        end
        imgui.SameLine()
        if imgui.Button(u8"Вести за собой", imgui.ImVec2(120, 50)) then
            if textbuffer.v == "" then
                sampAddChatMessage("Вы не ввели ID", -1)
            else
               lua_thread.create(function()
            sampSendChat("/me взяв за руку человека в наручниках потащил за собой")
                wait(1500)
            sampSendChat("/gotome " ..tostring(textbuffer.v))
                end)
            end
        end
        imgui.SameLine()
        if imgui.Button(u8"Включить камеру", imgui.ImVec2(120, 50)) then
            if textbuffer.v == "" then
                sampAddChatMessage("Вы не ввели ID", -1)
            else
                lua_thread.create(function()
        sampSendChat("/do На груди закреплена скрытая камера.")
        wait(1500)
        sampSendChat("/do У воротничка закреплен петличный микрофон")
            wait(1500)
        sampSendChat("/me движением руки включил камеру и микрофон")
        wait(1500)
        sampSendChat("/do Гаджеты включены и ведут запись.")
        end)
            end
        end
        imgui.End()
    end
end

function 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.5)
    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.16, 0.29, 0.48, 0.54)
    colors[clr.FrameBgHovered]         = ImVec4(0.26, 0.59, 0.98, 0.40)
    colors[clr.FrameBgActive]          = ImVec4(0.26, 0.59, 0.98, 0.67)
    colors[clr.TitleBg]                = ImVec4(0.04, 0.04, 0.04, 1.00)
    colors[clr.TitleBgActive]          = ImVec4(0.16, 0.29, 0.48, 1.00)
    colors[clr.TitleBgCollapsed]       = ImVec4(0.00, 0.00, 0.00, 0.51)
    colors[clr.CheckMark]              = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.SliderGrab]             = ImVec4(0.24, 0.52, 0.88, 1.00)
    colors[clr.SliderGrabActive]       = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.Button]                 = ImVec4(0.26, 0.59, 0.98, 0.40)
    colors[clr.ButtonHovered]          = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.ButtonActive]           = ImVec4(0.06, 0.53, 0.98, 1.00)
    colors[clr.Header]                 = ImVec4(0.26, 0.59, 0.98, 0.31)
    colors[clr.HeaderHovered]          = ImVec4(0.26, 0.59, 0.98, 0.80)
    colors[clr.HeaderActive]           = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.Separator]              = colors[clr.Border]
    colors[clr.SeparatorHovered]       = ImVec4(0.26, 0.59, 0.98, 0.78)
    colors[clr.SeparatorActive]        = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.ResizeGrip]             = ImVec4(0.26, 0.59, 0.98, 0.25)
    colors[clr.ResizeGripHovered]      = ImVec4(0.26, 0.59, 0.98, 0.67)
    colors[clr.ResizeGripActive]       = ImVec4(0.26, 0.59, 0.98, 0.95)
    colors[clr.TextSelectedBg]         = ImVec4(0.26, 0.59, 0.98, 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
style()
а зачем end в скобку ставить?