Загрузка данных


script_name("AutoInv")
script_author("Gemini")

local imgui = require 'mimgui'
local sampev = require 'samp.events'
local vkeys = require 'vkeys'
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8

-- === Переменные состояния ===
local win_state = imgui.new.bool(false)
local active_tab = 1

-- Настройки инвайтов
local auto_inv = imgui.new.bool(false)
local auto_fam = imgui.new.bool(false)

-- Настройки биндера
local bind_key = imgui.new.int(vkeys.VK_X) -- По умолчанию клавиша X
local bind_text = imgui.new.char[256](u8"Здравствуйте! Что вас интересует?")
local is_bind_active = imgui.new.bool(false)

-- === Основной цикл скрипта ===
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not sampIsLocalPlayerSpawned() do wait(100) end

    -- Регистрация новой команды для открытия меню
    sampRegisterChatCommand("autoinv", function()
        win_state[0] = not win_state[0]
    end)

    -- Главный цикл для обработки нажатий клавиш (Биндер)
    while true do
        wait(0)
        if is_bind_active[0] and not sampIsChatInputActive() and not sampIsDialogActive() then
            if isKeyJustPressed(bind_key[0]) then
                sampSendChat(u8:decode(ffi.string(bind_text)))
            end
        end
    end
end

-- === Отрисовка меню ===
imgui.OnFrame(function() return win_state[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500, 500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(450, 320), imgui.Cond.FirstUseEver)
    
    -- Обновленное название в заголовке окна
    if imgui.Begin(u8"AutoInv | Панель управления", win_state, imgui.WindowFlags.NoCollapse) then
        
        -- Кнопки вкладок
        if imgui.Button(u8"Инвайты", imgui.ImVec2(130, 30)) then active_tab = 1 end
        imgui.SameLine()
        if imgui.Button(u8"Биндер", imgui.ImVec2(130, 30)) then active_tab = 2 end
        imgui.Separator()

        -- Вкладка 1: Авто-Инвайты
        if active_tab == 1 then
            imgui.Text(u8"Настройки автоматизации:")
            imgui.Spacing()
            imgui.Checkbox(u8"Принимать по фразе 'инв' (в орг)", auto_inv)
            imgui.Checkbox(u8"Принимать по фразе 'инв фам' (в семью)", auto_fam)
            imgui.Spacing()
            imgui.Separator()
            imgui.TextColored(imgui.ImVec4(0.6, 0.6, 1.0, 1.0), u8"Статус: работает в фоновом режиме")
        end

        -- Вкладка 2: Личный биндер
        if active_tab == 2 then
            imgui.Text(u8"Настройка личного биндера:")
            imgui.Checkbox(u8"Включить биндер", is_bind_active)
            imgui.Spacing()
            
            imgui.InputInt(u8"Код клавиши (по умолчанию 88=X)", bind_key)
            
            imgui.Text(u8"Текст для отправки:")
            imgui.InputTextMultiline("##bindtext", bind_text, 256, imgui.ImVec2(400, 80))
        end

        imgui.End()
    end
end)

-- === Перехват сообщений и обработка ошибок ===
function sampev.onServerMessage(color, text)
    -- Поиск ника и ID игрока в сообщении чата
    local name, id, msg = text:match("([%w_]+)%[(%d+)%]%s*:%s*(.*)")
    
    if id and msg then
        msg = msg:lower()
        
        -- Обработка команды "инв"
        if auto_inv[0] and (msg == "инв" or msg == "inv") then
            sampSendChat("/invite " .. id)
        end
        
        -- Обработка команды "инв фам"
        if auto_fam[0] and (msg == "инв фам" or msg == "inv fam") then
            sampSendChat("/faminvite " .. id)
        end
    end

    -- Чтение системных ошибок сервера и дублирование в чат
    -- Если сервер пишет, что у игрока нет жилья:
    if text:find("не имеет жилья") or text:find("нет жилья") then
        sampSendChat("У вас нет жилья, я не могу вас пригласить.")
    end

    -- Если игрок уже где-то состоит:
    if text:find("уже состоит в организации") or text:find("уже находится в семье") then
        sampSendChat("Вы уже состоите в организации или семье!")
    end

    -- Если у игрока нет паспорта или мал уровень:
    if text:find("нету паспорта") or text:find("уровень слишком мал") then
        sampSendChat("Проверьте ваш паспорт или уровень, вы не подходите.")
    end
end