NEW v2.4 Поддержка CEF Packet 220, Mimgui v1.8.2 и SA-MP 0.3.7

Разработка, Генерация и Валидация
Lua-Скриптов под Arizona RP

Создавайте безотказные скрипты с современным интерфейсом mimgui, мгновенным перехватом пакетов CEF, умной фильтрацией и 100% проверкой синтаксиса на совместимость с MoonLoader.

🛠️ Конструктор скрипта

Интерактивный AI-генератор
TaxiCatcher.lua CP1251 Windows

🔍 Анализатор кода MoonLoader

📋 Результаты анализа

Готов к проверке
🔎

Нажмите «Проверить скрипт на ошибки», чтобы получить отчёт о синтаксисе, утечках памяти и правилах Arizona RP.

Частые причины крашей скриптов на Arizona RP:

  • wait() вне потока: вызов wait() в обработчиках событий (onShowDialog, onServerMessage) намертво крашит скрипт. Всегда оборачивайте в lua_thread.create().
  • Отсутствие проверки SA-MP: отсутствие while not isSampAvailable() do wait(100) end в main() вызывает сбой при запуске игры.
  • Кодировка файлов: кириллические символы в коде при кодировке UTF-8 с BOM приводят к иероглифам или синтаксической ошибке.
  • Утечки BitStream: каждый raknetNewBitStream() обязательно должен закрываться через raknetDeleteBitStream().

Проверенная библиотека скриптов Arizona RP

Оптимизированные решения без мусора, готовые к установке в папку moonloader/

🚕

TaxiCatcher v2.0 (CEF)

Авто-ловля заказов такси с умным фильтром: мгновенно выбирает самый близкий заказ (≤ 2500м), вводит максимальный тариф при старте и жмёт Enter на диалог.

CEF 220 mimgui Auto-Enter
📞

IDCall (Звонилка по ID)

Позволяет набрать игрока одной командой /idc [id]. Автоматически отправляет /number, вытаскивает телефон из ответа и делает /call.

samp.events Chat Command Anti-Flood
🗑️

TrashCatcher (Авто-лут)

Скрипт для моментального перехвата ценных вещей из мусорок, шкафов и багажников при открытии инвентаря.

Fast Pick Dialog Intercept
🔄

AutoReboot Guard

Утилита для авто-перезагрузки редактируемых скриптов в реальном времени прямо в игре без перезахода.

Dev Tool Hot Reload

Перехват и эмуляция пакетов CEF (ID 220) на Arizona RP

Новые интерфейсы Arizona RP (телефон, мониторинг такси, донат, инвентарь, кастомные диалоги) работают поверх Chromium Embedded Framework (CEF) и общаются с сервером по пакету RakNet с ID 220.

Шаблон перехвата входящих событий CEF (onReceivePacket):
addEventHandler('onReceivePacket', function(id, bitStream)
    if id == 220 then
        local saved = raknetBitStreamGetReadOffset(bitStream)
        raknetBitStreamIgnoreBits(bitStream, 8) -- пропускаем ID пакета 220
        local pType = raknetBitStreamReadInt8(bitStream)
        
        -- Типы пакетов Arizona CEF: 17, 18, 0, 123
        if pType == 17 or pType == 18 or pType == 0 or pType == 123 then
            if pType == 17 then raknetBitStreamIgnoreBits(bitStream, 32) end
            local len = raknetBitStreamReadInt16(bitStream)
            if len and len < 0 then len = len + 65536 end
            
            if len and len > 0 and len < 500000 then
                local extra = raknetBitStreamReadInt8(bitStream)
                local ok, text = pcall(raknetBitStreamReadString, bitStream, len)
                if ok and text and #text > 0 then
                    -- Тут находится JavaScript-событие: window.executeEvent(...)
                    if text:find('arizonaDriver.initializeOrders') then
                        -- Обработка заказов такси
                    end
                end
            end
        end
        raknetBitStreamSetReadOffset(bitStream, saved)
    end
    return true
end)
Функция отправки команды CEF на сервер:
local function emulationCEF(str)
    local bs = raknetNewBitStream()
    raknetBitStreamWriteInt8(bs, 220)       -- ID пакета CEF
    raknetBitStreamWriteInt8(bs, 18)        -- Тип исходящего события
    raknetBitStreamWriteInt16(bs, #str)     -- Длина строки
    raknetBitStreamWriteString(bs, str)     -- Данные (например: "pickOrderWorker|4")
    raknetSendBitStream(bs)
    raknetDeleteBitStream(bs)              -- ОБЯЗАТЕЛЬНО удалять для предотвращения утечки памяти!
end

SAMP.Lua: Перехват диалогов и сообщений

Библиотека lib.samp.events используется для реакции на классические серверные диалоги и события чата.

Автоматический ответ на диалог (Enter / Button 1):
local sampev = require 'lib.samp.events'

function sampev.onShowDialog(dialogId, style, title, b1, b2, text)
    if title:find('ПОДТВЕРЖДЕНИЕ') or text:find('принять этот вызов') then
        -- Отправляем ответ первой кнопкой (Принять / Далее / Enter)
        sampSendDialogResponse(dialogId, 1, 0, '')
        return false -- скрывает диалог с экрана игрока
    end
end

Mimgui: Современная тёмная тема для Arizona RP

Шаблон стилизации интерфейсов на Mimgui с плавным скруглением и аккуратной тёмной палитрой.

Код кастомной тёмной темы:
local function applyModernTheme()
    local style = mimgui.GetStyle()
    style.WindowPadding = mimgui.ImVec2(14, 12)
    style.FramePadding = mimgui.ImVec2(8, 6)
    style.ItemSpacing = mimgui.ImVec2(10, 8)
    style.WindowRounding = 8.0
    style.FrameRounding = 5.0
    
    local colors = style.Colors
    colors[mimgui.Col.WindowBg]         = mimgui.ImVec4(0.08, 0.09, 0.12, 0.96)
    colors[mimgui.Col.Border]           = mimgui.ImVec4(0.18, 0.22, 0.28, 0.80)
    colors[mimgui.Col.Button]           = mimgui.ImVec4(0.18, 0.45, 0.75, 1.00)
    colors[mimgui.Col.ButtonHovered]    = mimgui.ImVec4(0.24, 0.55, 0.90, 1.00)
    colors[mimgui.Col.ButtonActive]     = mimgui.ImVec4(0.14, 0.38, 0.65, 1.00)
    colors[mimgui.Col.CheckMark]        = mimgui.ImVec4(0.20, 0.85, 0.45, 1.00)
    colors[mimgui.Col.SliderGrab]       = mimgui.ImVec4(0.20, 0.65, 0.95, 1.00)
end

Кодировки: Как избежать знаков вопросов и крашей

В SA-MP и MoonLoader стандартная кодировка интерфейсов и чата — Windows-1251 (CP1251). Для Mimgui текст переводится в UTF-8 через функцию u8.

Правильная инициализация кодировок:
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8

-- Использование в интерфейсе mimgui:
mimgui.Text(u8('Привет, мир!'))