Загрузка данных
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