local imgui = require 'mimgui' local new = imgui.new local okEncoding, encoding = pcall(require, 'encoding') local u8 = function(text) return text end if okEncoding then encoding.default = 'CP1251' u8 = encoding.UTF8 end local showWindow = new.bool(false) local yellow = imgui.ImVec4(1.0, 0.87, 0.0, 1.0) local red = imgui.ImVec4(1.0, 0.4, 0.4, 1.0) local green = imgui.ImVec4(0.67, 1.0, 0.67, 1.0) local white = imgui.ImVec4(1.0, 1.0, 1.0, 1.0) local function header(text) imgui.TextColored(yellow, u8(text)) end local function section(text) imgui.TextColored(red, u8(text)) end local function sub(text) imgui.TextColored(green, u8(text)) end local function item(text) imgui.TextColored(white, u8(text)) end local topBlocks = { { {'h', '== УК / РОЗЫСК =='}, {'s', 'Гл.1 - Низкая тяжесть'}, {'u', '1 УР розыска'}, {'i', '1.1 Угон / попытка угона ТС'}, {'i', '1.2 Оружие в открыт. виде'}, {'i', '1.3 Угрозы гражданам'}, {'i', '1.4 Неуплата штрафа / комп.'}, {'i', '1.5 Частная тер. без разреш.'}, {'i', '1.6 Ложный теракт -> 2 УР'}, {'i', '1.7 Порча имущества'}, {'i', '1.8 Ложный вызов гос. орг.'}, {'i', '1.9 Попытка суицида'}, {'i', '1.10 Проституция'}, {'i', '1.11 Легкий вред здоровью'}, {'i', '1.12 Помеха мед. помощи'}, {'b'}, {'u', '2 УР розыска'}, {'i', '2.1 Изнасилование'}, {'i', '2.2 Избиение'}, {'i', '2.3 Вымогательство'}, {'i', '2.4 Неподчинение'}, {'i', '2.5 Охраняемая тер.'}, {'i', '2.6 Муниц. имущество'}, {'i', '2.7 Оскорбление / мат'}, {'i', '2.8 Митинг / бунт'}, {'i', '2.9 Срыв мероприятия'}, {'i', '2.10 Кража'}, {'i', '2.11 Материалы для оружия'}, {'i', '2.12 Оружие без лицензии'}, {'i', '2.13 Самовольное оставл. части'}, {'i', '2.14 Попытка скрыться пешком'}, {'i', '2.15 Проникновение в гос. ТС'}, }, { {'s', 'Гл.2 - Средняя тяжесть'}, {'u', '3 УР розыска'}, {'i', '3.1 Нападение на гражданина'}, {'i', '3.2 Убийство гражданина'}, {'i', '3.3 Ограбление'}, {'i', '3.4 Расизм / национализм'}, {'i', '3.5 Ключи от камер'}, {'i', '3.6 Попытка скрыться'}, {'i', '3.7 Помеха аресту / укрыв.'}, {'i', '3.8 Наркотики'}, {'i', '3.9 ДТП со смертью'}, {'i', '3.10 Помеха задержанию'}, {'b'}, {'u', '4 УР розыска'}, {'i', '4.1 Военная база / ФСИН'}, {'i', '4.2 Подрыв ТС / авиа'}, {'i', '4.3 Кража гос. имущества'}, {'i', '4.4 Убийство военного'}, {'i', '4.5 Террор. деятельность'}, {'i', '4.6 Слежка за ФСБ'}, {'i', '4.7 Похищение человека'}, {'i', '4.8 Помощь в побеге от ареста'}, {'i', 'ООП: 4.3 / 4.4 / 4.7'}, }, { {'s', 'Гл.3 - Высокая тяжесть'}, {'u', '5 УР розыска'}, {'i', '5.1 Нападение на полицию'}, {'i', '5.2 Попытка дать взятку'}, {'i', '5.3 Взятка > 20.000'}, {'i', '5.4 Убийство полиции'}, {'b'}, {'u', '6 УР розыска'}, {'i', '5.5 Нападение ФСБ / власть'}, {'i', '5.6 Теракт'}, {'i', '5.7 Захват заложников'}, {'i', '5.8 Шпионаж / слив гос. инфы'}, {'i', '5.9 Инфа мафии'}, {'i', '5.10 ОПГ'}, {'i', '5.11 Посредничество во взятке'}, {'i', '5.12 Гос. тайна'}, {'i', '5.13 Превышение полномочий'}, {'i', '5.14 Удержание заложника'}, {'b'}, {'s', 'Гл.4 - Спец. статьи'}, {'i', '6.1 Явка 2-3 УР -> 1 УР'}, {'i', '6.2 Явка 4-6 УР -> 3 УР'}, {'i', '6.3 Соучастие = тот же УР'}, {'i', '6.4 Уход/AFK 60+ -> 6 УР'}, {'i', '6.5 Побег КПЗ/ФСИН -> 6 УР'}, }, { {'h', '== ФП =='}, {'s', 'Р.1 - Общие запреты'}, {'i', '1.1 Нарушение законов/уставов'}, {'i', '1.2 Превышение полномочий'}, {'i', '1.3 Оружие без оснований'}, {'i', '1.4 Спецсредства без осн.'}, {'i', '1.5 Алко/нарко на службе'}, {'i', '1.6 Личные дела на работе'}, {'i', '1.7 Провокация сотрудника'}, {'i', '1.8 Помеха работе гос. лиц'}, {'i', '1.9 Угрозы'}, {'i', '1.10 Нарушение деп. волны'}, {'i', '1.11 Нецензурная брань'}, {'i', '1.12 Ключи от камер'}, {'i', '1.13 Взятки/оружие/нарко'}, {'i', '1.14 Арест без причины'}, {'i', '1.15 Вмешательство в СО'}, {'i', '1.16 Розыск не по УК/КоАП'}, {'i', '1.17 Ложный розыск'}, {'i', '1.18 Снятие розыска без осн.'}, {'i', '1.19 Бездействие'}, {'i', '1.20 Возврат наказанных'}, {'i', '1.21 Уклонение от проверок'}, {'i', '1.22 Clear без увед. ФСБ'}, {'i', '1.23 Убийство в наручниках'}, {'i', '1.24 Розыск игрока в маске'}, {'i', '1.25 Неадекват на службе'}, {'i', '1.26 Обыск/доки без осн.'}, {'i', '1.27 Розыск по просьбе'}, {'i', '1.28 Лицензии без причины'}, {'i', '1.29 Личный ТС на службе'}, }, { {'s', 'Р.2 - ФСБ / Правительство'}, {'i', '2.1 Обман ФСБ / прав-ва'}, {'i', '2.2 Раскрытие личности ФСБ'}, {'i', '2.3 Нарушение субординации'}, {'i', '2.4 Обыск ФСБ / губернатора'}, {'i', '2.5 Неподчинение ФСБ'}, {'i', '2.6 Офис ФСБ без вызова'}, {'i', '2.7 Неявка по вызову ФСБ'}, {'b'}, {'s', 'Р.3 - Армия'}, {'i', '3.1 Самовольный уход из ВЧ'}, {'i', '3.2 Продажа гос. имущества'}, {'i', '3.3 Повреждение воен. имущества'}, {'b'}, {'s', 'Р.4 - Деп. волна'}, {'i', '4.1 Нарушение правил волны'}, {'i', '4.2 Негатив по структурам'}, {'i', '4.3 Мат / фамильярность'}, {'i', '4.4 Реакция на помехи'}, {'i', '4.5 Контакт с похитителями'}, {'i', '4.6 Агитация без капитана+'}, {'i', '4.7 Агитация чаще 15 мин.'}, {'b'}, {'s', 'Р.5 - Полномочия ФСБ'}, {'i', '5.1 Приказы при теракте/похищ.'}, {'i', '5.2 Неправ. приказ = 1.2 ФП'}, }, { {'h', '== ФЗ О ФСБ =='}, {'s', 'Гл.I - Общие положения'}, {'i', 'Ст.1 ФСБ - безопасность области'}, {'i', 'Ст.2 Основа: Конституция/законы'}, {'i', 'Ст.3 Нельзя вмешиваться в ФСБ'}, {'i', 'Ст.4 Защита сотрудников ФСБ'}, {'i', 'Ст.5 Нужна военная выучка'}, {'i', 'Ст.6 Действовать в интересах обл.'}, {'i', 'Ст.7 Руководство: Генерал/замы'}, {'b'}, {'s', 'Гл.II - Деятельность'}, {'i', 'Ст.8 Терроризм / экстремизм'}, {'i', ' Коррупция / оружие / ОПГ'}, {'i', 'Ст.9 КТО, оцепления, досмотры'}, {'i', 'Ст.10 Мониторинг экстремизма'}, {'i', 'Ст.11 Выявление коррупции'}, {'i', 'Ст.12 Наркотрафик / контрабанда'}, }, { {'s', 'Гл.III - Права ФСБ'}, {'u', 'Ст.13 - Полномочия'}, {'i', 'а) Документы / личный обыск'}, {'i', 'б) Связь с органами'}, {'i', 'в) Собственная безопасность'}, {'i', 'г) Оружие / спецсредства'}, {'i', 'д) Задержание / следствие'}, {'i', 'е) Гос. тайна / доступ'}, {'i', 'ж) Летальное оружие'}, {'i', 'з) Скрытая форма / транспорт'}, {'i', 'и) Допрос / обыск / выемка'}, {'i', 'й) Экспертизы'}, {'i', 'к) Инспекции правоохр. орг.'}, {'i', 'л) Повестки / документы'}, {'i', 'м) Проверка знаний доков'}, {'i', 'н) Проф. пригодность'}, {'i', 'о) Отчет о проблемах орг.'}, {'b'}, {'u', 'Ст.14 - Обязанности'}, {'i', 'Законность, права граждан'}, {'i', 'Раскрытие преступлений'}, {'i', 'Борьба с терроризмом'}, {'i', 'Коррупция/оружие/нарко'}, {'i', 'Этика и разъяснение оснований'}, {'i', 'Под прикрытием - позывной'}, }, { {'s', 'ФСБ - руководство / содействие'}, {'u', 'Ст.15 - Руководство'}, {'i', 'а) Руководство ФСБ'}, {'i', 'б) Координация при ЧС'}, {'i', 'в) Координация при воен. пол.'}, {'i', 'г) Штаб спецопераций'}, {'i', 'д) Предписания / взыскания'}, {'b'}, {'u', 'Ст.16 - Содействие'}, {'i', 'Право: контракт с ФСБ'}, {'i', 'Право: разъяснения задач'}, {'i', 'Право: конспирация / доки'}, {'i', 'Право: вознаграждение'}, {'i', 'Обяз.: соблюдать контракт'}, {'i', 'Обяз.: выполнять поручения'}, {'i', 'Обяз.: давать правдивую инфу'}, {'i', 'Обяз.: не разглашать тайну'}, {'i', 'Обяз.: подчиняться ФСБ'}, {'b'}, {'s', 'Ст.17 - Жалобы'}, {'i', 'Проверки ФСБ - внутри ведомства'}, } } local bottomBlocks = { { {'h', '== ФЗ О ПОЛИЦИИ =='}, {'s', 'Гл.I - Общие положения'}, {'i', 'Ст.1 Полиция: порядок, защита'}, {'i', ' помощь гражданам, охрана лиц'}, {'i', 'Ст.2 Предупреждение нарушений'}, {'i', ' задержание, вызовы, ДТП'}, {'i', ' охрана, защита, законность'}, {'i', 'Ст.3 Единая система МВД'}, {'i', ' подразделения??? службы'}, {'i', 'Ст.4 Закон, права, этика'}, }, { {'s', 'Гл.II - Принципы'}, {'i', 'Ст.5 Уважать права граждан'}, {'i', ' без пыток и унижения'}, {'i', ' представиться и объяснить цель'}, {'i', 'Ст.6 Только законные требования'}, {'i', 'Ст.7 Беспристрастность'}, {'i', 'Ст.8 Доверие и поддержка'}, {'b'}, {'s', 'Ст.9 - Обязанности'}, {'i', 'Прием заявлений / вызовы'}, {'i', 'Прибытие на место / фиксация'}, {'i', 'Первая помощь / порядок'}, {'i', 'Выявлять причины нарушений'}, {'i', 'Видеофиксация действий'}, {'i', 'Жетон на видном месте'}, }, { {'s', 'Ст.10 - Права полиции'}, {'i', 'Требовать прекратить нарушение'}, {'i', 'Проверять документы'}, {'i', 'Патрули / КПП / посты'}, {'i', 'Требовать покинуть место'}, {'i', 'Привод в отдел / установить личн.'}, {'i', 'Личный досмотр / проверка ТС'}, {'i', 'Остановка ТС / блок-посты'}, {'b'}, {'u', 'Задержание'}, {'i', 'Подозрение / доказательства'}, {'i', 'Побег / уклонение'}, {'i', 'Статус разыскиваемого'}, {'i', 'Проникновение на объект'}, {'i', 'Назвать причину и статью'}, {'i', 'Розыск/арест: 2+ порядок'}, {'i', 'Патруль/обыск: 3+ порядок'}, {'i', 'СОБР: маски на операциях'}, }, { {'s', 'Гл.IV - Иерархия МВД'}, {'i', 'Ст.11 При ЧС выполнять приказы'}, {'i', ' доклад, если приказ опасен'}, {'i', ' дисциплина и содействие'}, {'b'}, {'s', 'Ст.12 - Оружие МВД'}, {'i', 'Защита жизни от угрозы'}, {'i', 'Пресечение опасных действий'}, {'i', 'Задержание при сопротивлении'}, {'i', 'Предупреждение побега'}, {'i', 'Сначала оценить необходимость'}, {'i', 'Без оружия, если можно мягче'}, {'b'}, {'s', 'Ст.13 - Регистрация ТС'}, {'i', 'Регистрация через МВД'}, {'i', 'Нужны заявление, паспорт, право'}, {'i', 'ПТС/СТС, пошлины, осмотр'}, {'i', 'Перерегистрация при сменах'}, }, { {'h', '== ДОП. ПАМЯТКА =='}, {'s', 'ФЗоЗОТ'}, {'i', '3.3.2 Задержание'}, {'i', 'МО: военная база'}, {'i', 'ГУ МВД: КПЗ / служ. зоны'}, {'i', 'ФСБ: здание / крыша / парковка'}, {'i', 'ФСИН: все с начала КПП'}, {'b'}, {'s', 'Процессуальный кодекс'}, {'i', '2.5 Субъекты задержания:'}, {'i', '- два сотрудника'}, {'i', '- задержанный'}, {'i', '- адвокат'}, {'i', '- начальство при запросе'}, {'i', '- сотрудник ФСБ'}, {'b'}, {'i', 'F10 - открыть / закрыть'}, } } local function drawBlock(block) for _, line in ipairs(block) do local kind = line[1] local text = line[2] if kind == 'h' then header(text) imgui.Spacing() elseif kind == 's' then section(text) elseif kind == 'u' then sub(text) elseif kind == 'i' then item(text) elseif kind == 'b' then imgui.Spacing() end end end local function drawColumns(id, blocks, totalWidth) local count = #blocks local colW = math.floor(totalWidth / count) imgui.Columns(count, id, false) for i = 0, count - 2 do imgui.SetColumnWidth(i, colW) end imgui.SetColumnWidth(count - 1, totalWidth - colW * (count - 1)) for i = 1, count do drawBlock(blocks[i]) if i < count then imgui.NextColumn() end end imgui.Columns(1) end imgui.OnInitialize(function() local io = imgui.GetIO() local glyph_ranges = io.Fonts:GetGlyphRangesCyrillic() io.Fonts:Clear() io.Fonts:AddFontFromFileTTF(getFolderPath(0x14) .. '\\Verdana.ttf', 14.0, nil, glyph_ranges) end) imgui.OnFrame( function() return showWindow[0] end, function(self) self.HideCursor = true local screenW = imgui.GetIO().DisplaySize.x local screenH = imgui.GetIO().DisplaySize.y imgui.SetNextWindowPos(imgui.ImVec2(0, 0), imgui.Cond.Always) imgui.SetNextWindowSize(imgui.ImVec2(screenW, screenH), imgui.Cond.Always) -- Темный фон под текстом, чтобы подсказка читалась на любом фоне игры imgui.SetNextWindowBgAlpha(0.92) imgui.PushStyleColor(imgui.Col.WindowBg, imgui.ImVec4(0.01, 0.01, 0.015, 1.0)) imgui.Begin('##uk', showWindow, imgui.WindowFlags.NoTitleBar + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove + imgui.WindowFlags.NoScrollbar + imgui.WindowFlags.NoScrollWithMouse + imgui.WindowFlags.NoInputs ) imgui.PopStyleColor() local fontScale = 0.82 if screenH <= 720 then fontScale = 0.68 end if screenH > 720 and screenH <= 800 then fontScale = 0.74 end if screenH > 800 and screenH <= 900 then fontScale = 0.78 end if screenW <= 1280 then fontScale = fontScale - 0.05 end if fontScale < 0.62 then fontScale = 0.62 end imgui.SetWindowFontScale(fontScale) local padX = 8 local totalW = screenW - padX * 2 local bottomY = math.floor(screenH * 0.62) imgui.SetCursorPos(imgui.ImVec2(padX, 8)) drawColumns('top_laws', topBlocks, totalW) imgui.SetCursorPos(imgui.ImVec2(padX, bottomY)) drawColumns('bottom_laws', bottomBlocks, totalW) imgui.End() end ) function main() while not isSampAvailable() or not isSampPostInit() do wait(0) end wait(1000) sampAddChatMessage("{b1f2f1}[MHelp]{FFFFFF} Подсказка загружена Открыть: {b1f2f1}F10", -1) while true do wait(0) if wasKeyPressed(121) and not sampIsChatInputActive() and not sampIsDialogActive() then showWindow[0] = not showWindow[0] end end end function isSampPostInit() local ok, result = pcall(function() return sampGetCurrentServerName() ~= "SA-MP" end) return ok and result end