Неактуально imqui.InputText

btrtmr

Известный
Автор темы
41
2
Версия MoonLoader
.026-beta
Есть такой скрипт:
main.lua:
-- ARZ-Helper.lua

-- Подключение необходимых библиотек
require("moonloader")
require("sampfuncs")
local imgui = require 'mimgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8
local fa = require("fAwesome6")
local ffi = require("ffi")

-- Инициализация иконок
imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
    local config = imgui.ImFontConfig()
    config.MergeMode = true
    config.PixelSnapH = true
    local iconRanges = imgui.new.ImWchar[3](fa.min_range, fa.max_range, 0)
    imgui.GetIO().Fonts:AddFontFromMemoryCompressedBase85TTF(fa.get_font_data_base85("solid"), 14, config, iconRanges)
end)

-- Функции для отображения подсказок и центрированного текста
function imgui.TextQuestion(text)
    imgui.TextDisabled("(?)")
    if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.PushTextWrapPos(450)
        imgui.TextUnformatted(text)
        imgui.PopTextWrapPos()
        imgui.EndTooltip()
    end
end

function imgui.CenterText(text)
    imgui.SetCursorPosX(imgui.GetWindowWidth()/2 - imgui.CalcTextSize(u8(text)).x/2)
    imgui.Text(u8(text))
end

-- Состояние окна и текущая вкладка
local WinState = imgui.new.bool()
local tab = 1

-- Переменные для автообъявлений
local autoAnnounceEnabled = imgui.new.bool(false)  -- Флаг для включения автообъявлений
local announceText = imgui.new.char[256]()          -- Текст для автообъявлений

-- Фоновый поток для отправки сообщений
lua_thread.create(function()
    while true do
        wait(5000)  -- Интервал в миллисекундах между проверками
        if autoAnnounceEnabled[0] then  -- Проверка включения автообъявлений
            local text = ffi.string(announceText)  -- Преобразуем введенный текст в строку
            if text ~= "" then  -- Если текст не пустой
                -- Преобразуем текст в строку в кодировке CP1251 для правильной передачи в SAMP
                local cp1251Text = encoding.CP1251(text)
                -- Отправка в обычный чат
                sampSendChat("/c " .. cp1251Text)
                wait(1000)  -- Задержка в 1 секунду
                -- Отправка в командный чат
                sampSendChat("/b " .. cp1251Text)
                wait(1000)  -- Задержка в 1 секунду
                -- Отправка в системный чат
                sampSendChat(cp1251Text)
            end
        end
    end
end)

-- Главная функция
function main()
    while not isSampAvailable() do wait(100) end

    sampAddChatMessage('[ARZ-Helper] Скрипт успешно запущен. Введите команду /test13.', 0xff0000)

    sampRegisterChatCommand('test13', function()
        WinState[0] = not WinState[0]
    end)

    while true do wait(0) end
end

-- Отрисовка окна
imgui.OnFrame(function() return WinState[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(1000, 500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(1100, 250), imgui.Cond.Always)

    imgui.Begin(fa('folder')..u8' [ARZ-Helper]: Помощь', WinState,
        imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove + imgui.WindowFlags.NoCollapse)

    -- Стили кнопок
    local button_bg_color = imgui.ImVec4(0.2, 0.2, 0.2, 1.0)
    local button_hover_color = imgui.ImVec4(0.3, 0.3, 0.3, 1.0)
    local button_active_color = imgui.ImVec4(0.4, 0.4, 0.4, 1.0)

    local function DrawTabButton(icon, label, tabIndex)
        imgui.PushStyleColor(imgui.Col.Button, button_bg_color)
        imgui.PushStyleColor(imgui.Col.ButtonHovered, button_hover_color)
        imgui.PushStyleColor(imgui.Col.ButtonActive, button_active_color)
        if imgui.Button(fa(icon).." "..u8(label), imgui.ImVec2(225, 30)) then
            tab = tabIndex
        end
        imgui.PopStyleColor(3)
    end

    DrawTabButton("shield-alt", "Помощник для страховой компании", 1)
    DrawTabButton("list", "Команды", 2)
    DrawTabButton("info-circle", "О скрипте", 3)
    DrawTabButton("bullhorn", "Автообъявление", 4)

    -- Контент
    imgui.SetCursorPos(imgui.ImVec2(240, 28))
    if imgui.BeginChild('TabContent##'..tab, imgui.ImVec2(850, 160), true) then
        if tab == 1 then
            imgui.CenterText('Описание')
            imgui.Separator()
            imgui.TextColored(imgui.ImVec4(1.0, 0.647, 0.0, 1.0), u8'Оповещение:')
            imgui.SameLine()
            imgui.Text(u8'При наличии игрока на пикапах оформления страховок скрипт активирует уведомление и звонок колокольчика.')
            imgui.Text(u8"Команда:")
            imgui.SameLine()
            imgui.TextColored(imgui.ImVec4(1.0, 0.647, 0.0, 1.0), u8'/ins')

        elseif tab == 2 then
            imgui.CenterText('Описание команд')
            imgui.Separator()

            -- Команда /findihouse
            imgui.Text(u8"Сокращение команды /findihouse [ID]")
            imgui.SameLine()
            imgui.TextQuestion(u8'/fh [ID]')
            imgui.Text(u8"Используйте эту команду для поиска дома по ID. Введите команду с ID, чтобы найти дом.")

            -- Команда /findibiz
            imgui.Text(u8"Сокращение команды /findibiz [ID]")
            imgui.SameLine()
            imgui.TextQuestion(u8'/fib [ID]')
            imgui.Text(u8"Используйте эту команду для поиска бизнеса по ID. Введите команду с ID, чтобы найти бизнес.")

            -- Команда /test12
            imgui.Text(u8"Сокращение команды /test12")
            imgui.SameLine()
            imgui.TextQuestion(u8'/t12')
            imgui.Text(u8"Используйте команду для тестирования функционала. Это демонстрация некоторых функций скрипта.")

        elseif tab == 3 then
            imgui.Text(u8"Разработчик скрипта: Timur//.")
            imgui.Text(u8"Скрипт разработан персонально для ... .")
            if imgui.Button(fa('user')..u8' Связь с автором скрипта') then
                os.execute("start https://vk.com/id124779478")
            end

        elseif tab == 4 then
            imgui.CenterText('Настройки автообъявлений')  -- Заголовок
            imgui.Separator()  -- Разделитель
            -- Чекбокс для включения автообъявлений
            imgui.Checkbox(u8" Включить автообъявления", autoAnnounceEnabled)
            -- Поле для ввода текста
            imgui.InputText(u8"Сообщение для отправки", announceText, 255)
        
            -- Проверка, если текст введен и автообъявление включено
            if autoAnnounceEnabled[0] and ffi.string(announceText) ~= "" then
                imgui.Text(u8"Текст будет отправлен в 3 чата при активации автообъявлений.")
            else
                imgui.Text(u8"Введите текст и активируйте автообъявления для отправки.")
            end
        end
    end
end)
В разделе автообъявления, когда ввожу текст на русском языке и включаю функцию, то в чат отправляются иероглифы, а не русский текст. Помогите исправить, буду благодарен.
 
Решение
У тебя после ffi.string текст в UTF8 все еще

Lua:
lua_thread.create(function()
    while true do
        wait(5000)  -- Интервал в миллисекундах между проверками
        if autoAnnounceEnabled[0] then  -- Проверка включения автообъявлений
            local text = u8:decode(ffi.string(announceText))  -- Преобразуем введенный текст в строку
            if text ~= "" then  -- Если текст не пустой
                -- Отправка в обычный чат
                sampSendChat("/c " .. text)
                wait(1000)  -- Задержка в 1 секунду
                -- Отправка в командный чат
                sampSendChat("/b " .. text)
                wait(1000)  -- Задержка в 1 секунду
                -- Отправка в системный чат...

Неадекватная сова

Известный
Проверенный
288
233
У тебя после ffi.string текст в UTF8 все еще

Lua:
lua_thread.create(function()
    while true do
        wait(5000)  -- Интервал в миллисекундах между проверками
        if autoAnnounceEnabled[0] then  -- Проверка включения автообъявлений
            local text = u8:decode(ffi.string(announceText))  -- Преобразуем введенный текст в строку
            if text ~= "" then  -- Если текст не пустой
                -- Отправка в обычный чат
                sampSendChat("/c " .. text)
                wait(1000)  -- Задержка в 1 секунду
                -- Отправка в командный чат
                sampSendChat("/b " .. text)
                wait(1000)  -- Задержка в 1 секунду
                -- Отправка в системный чат
                sampSendChat(text)
            end
        end
    end
end)
 
  • Нравится
Реакции: btrtmr

btrtmr

Известный
Автор темы
41
2
Попробуй такой вариант
Код:
-- ARZ-Helper.lua

-- Подключение необходимых библиотек
require("moonloader")
require("sampfuncs")
local imgui = require 'mimgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8
local fa = require("fAwesome6")
local ffi = require("ffi")

-- Инициализация иконок
imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
    local config = imgui.ImFontConfig()
    config.MergeMode = true
    config.PixelSnapH = true
    local iconRanges = imgui.new.ImWchar[3](fa.min_range, fa.max_range, 0)
    imgui.GetIO().Fonts:AddFontFromMemoryCompressedBase85TTF(fa.get_font_data_base85("solid"), 14, config, iconRanges)
end)

-- Функции для отображения подсказок и центрированного текста
function imgui.TextQuestion(text)
    imgui.TextDisabled("(?)")
    if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.PushTextWrapPos(450)
        imgui.TextUnformatted(text)
        imgui.PopTextWrapPos()
        imgui.EndTooltip()
    end
end

function imgui.CenterText(text)
    imgui.SetCursorPosX(imgui.GetWindowWidth()/2 - imgui.CalcTextSize(u8(text)).x/2)
    imgui.Text(u8(text))
end

-- Состояние окна и текущая вкладка
local WinState = imgui.new.bool()
local tab = 1

-- Переменные для автообъявлений
local autoAnnounceEnabled = imgui.new.bool(false)  -- Флаг для включения автообъявлений
local announceText = imgui.new.char[256]()          -- Текст для автообъявлений

-- Функция для корректной отправки сообщений
local function sendAnnouncement(text)
    -- Преобразуем текст в кодировку CP1251 для SAMP
    local cp1251Text = encoding.convert(text, "CP1251")
    -- Отправка в обычный чат
    sampSendChat("/c " .. cp1251Text)
    wait(1000)
    -- Отправка в командный чат
    sampSendChat("/b " .. cp1251Text)
    wait(1000)
    -- Отправка в системный чат
    sampSendChat(cp1251Text)
end

-- Фоновый поток для отправки сообщений
lua_thread.create(function()
    while true do
        wait(5000)  -- Интервал в миллисекундах между проверками
        if autoAnnounceEnabled[0] then  -- Проверка включения автообъявлений
            local text = ffi.string(announceText)  -- Получаем текст из поля ввода
            if text ~= "" then  -- Если текст не пустой
                sendAnnouncement(text)
            end
        end
    end
end)

-- Главная функция
function main()
    while not isSampAvailable() do wait(100) end

    sampAddChatMessage('[ARZ-Helper] Скрипт успешно запущен. Введите команду /test13.', 0xff0000)

    sampRegisterChatCommand('test13', function()
        WinState[0] = not WinState[0]
    end)

    while true do wait(0) end
end

-- Отрисовка окна
imgui.OnFrame(function() return WinState[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(1000, 500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(1100, 250), imgui.Cond.Always)

    imgui.Begin(fa('folder')..u8' [ARZ-Helper]: Помощь', WinState,
        imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove + imgui.WindowFlags.NoCollapse)

    -- Стили кнопок
    local button_bg_color = imgui.ImVec4(0.2, 0.2, 0.2, 1.0)
    local button_hover_color = imgui.ImVec4(0.3, 0.3, 0.3, 1.0)
    local button_active_color = imgui.ImVec4(0.4, 0.4, 0.4, 1.0)

    local function DrawTabButton(icon, label, tabIndex)
        imgui.PushStyleColor(imgui.Col.Button, button_bg_color)
        imgui.PushStyleColor(imgui.Col.ButtonHovered, button_hover_color)
        imgui.PushStyleColor(imgui.Col.ButtonActive, button_active_color)
        if imgui.Button(fa(icon).." "..u8(label), imgui.ImVec2(225, 30)) then
            tab = tabIndex
        end
        imgui.PopStyleColor(3)
    end

    DrawTabButton("shield-alt", "Помощник для страховой компании", 1)
    DrawTabButton("list", "Команды", 2)
    DrawTabButton("info-circle", "О скрипте", 3)
    DrawTabButton("bullhorn", "Автообъявление", 4)

    -- Контент
    imgui.SetCursorPos(imgui.ImVec2(240, 28))
    if imgui.BeginChild('TabContent##'..tab, imgui.ImVec2(850, 160), true) then
        if tab == 1 then
            imgui.CenterText('Описание')
            imgui.Separator()
            imgui.TextColored(imgui.ImVec4(1.0, 0.647, 0.0, 1.0), u8'Оповещение:')
            imgui.SameLine()
            imgui.Text(u8'При наличии игрока на пикапах оформления страховок скрипт активирует уведомление и звонок колокольчика.')
            imgui.Text(u8"Команда:")
            imgui.SameLine()
            imgui.TextColored(imgui.ImVec4(1.0, 0.647, 0.0, 1.0), u8'/ins')

        elseif tab == 2 then
            imgui.CenterText('Описание команд')
            imgui.Separator()

            -- Команда /findihouse
            imgui.Text(u8"Сокращение команды /findihouse [ID]")
            imgui.SameLine()
            imgui.TextQuestion(u8'/fh [ID]')
            imgui.Text(u8"Используйте эту команду для поиска дома по ID. Введите команду с ID, чтобы найти дом.")

            -- Команда /findibiz
            imgui.Text(u8"Сокращение команды /findibiz [ID]")
            imgui.SameLine()
            imgui.TextQuestion(u8'/fib [ID]')
            imgui.Text(u8"Используйте эту команду для поиска бизнеса по ID. Введите команду с ID, чтобы найти бизнес.")

            -- Команда /test12
            imgui.Text(u8"Сокращение команды /test12")
            imgui.SameLine()
            imgui.TextQuestion(u8'/t12')
            imgui.Text(u8"Используйте команду для тестирования функционала. Это демонстрация некоторых функций скрипта.")

        elseif tab == 3 then
            imgui.Text(u8"Разработчик скрипта: Timur//.")
            imgui.Text(u8"Скрипт разработан персонально для ... .")
            if imgui.Button(fa('user')..u8' Связь с автором скрипта') then
                os.execute("start https://vk.com/id124779478")
            end

        elseif tab == 4 then
            imgui.CenterText('Настройки автообъявлений')
            imgui.Separator()
            imgui.Checkbox(u8" Включить автообъявления", autoAnnounceEnabled)
            imgui.InputText(u8"Сообщение для отправки", announceText, 255)
       
            if autoAnnounceEnabled[0] and ffi.string(announceText) ~= "" then
                imgui.Text(u8"Текст будет отправлен в 3 чата при активации автообъявлений.")
            else
                imgui.Text(u8"Введите текст и активируйте автообъявления для отправки.")
            end
        end
        imgui.EndChild()
    end
    imgui.End()
end)
Крашит скрипт после активации чекбокса

У тебя после ffi.string текст в UTF8 все еще

Lua:
lua_thread.create(function()
    while true do
        wait(5000)  -- Интервал в миллисекундах между проверками
        if autoAnnounceEnabled[0] then  -- Проверка включения автообъявлений
            local text = u8:decode(ffi.string(announceText))  -- Преобразуем введенный текст в строку
            if text ~= "" then  -- Если текст не пустой
                -- Отправка в обычный чат
                sampSendChat("/c " .. text)
                wait(1000)  -- Задержка в 1 секунду
                -- Отправка в командный чат
                sampSendChat("/b " .. text)
                wait(1000)  -- Задержка в 1 секунду
                -- Отправка в системный чат
                sampSendChat(text)
            end
        end
    end
end)
Спасибо, всё заработало!