Lua | Wanted on screen

AngelMAILS228

Известный
Автор темы
89
12
Версия MoonLoader
.026-beta
Приветствую, желаю сделать себе скрипт который будет мне на экран выводить игроков которые находятся в /wanted 1, для начала хочу разобраться с первым вантедом, а далее сделать пробив с 1-7.
Но столкнулся с проблемой что никогда не делал ничего с парсингом данных из диалоговых окон и тем более с renderFontDrawText, хотя с ним разобрался и вывел себе надпись.
Но с горя пополам получилось сделать что бы отображало инфу с /wanted 1, но никак не разберусь с тем что окно само открывается каждые 15 секунд, а хотелось бы что бы я его не видел. Получалось делать что то такое но потом я не мог самостоятельно проверять /wanted 1, и даже некоторые другие диалоговые окна, даже окно авторизации не открывалось и тд.

Вообщем я запутался
b9a3a99a-71d0-4a1c-8a12-1f3edb115828.png



код:
local sampev = require 'lib.samp.events'
local font_flag = require('moonloader').font_flag
local my_font = renderCreateFont("Arial", 10, font_flag.BOLD)

local wanted = false
local wanted_players = {}
local page = 1

function main()
    repeat wait(100) until isSampAvailable()

    sampRegisterChatCommand("showwanted", function()
        wanted = not wanted
        sampAddChatMessage("{A598EB}Мониторинг розыска: " .. (wanted and "{28FF2B}включен" or "{FF2B2B}отключен"), -1)
        if wanted then
            lua_thread.create(function()
                while wanted do
                    sampSendChat("/wanted 1")
                    wait(15000)
                end
            end)
        end
    end)

    while true do
        wait(0)
        if wanted then
            renderFontDrawText(my_font, "Игроки в розыске:", 10, 400, 0xFFFFFFFF)
            for i, line in ipairs(wanted_players) do
                renderFontDrawText(my_font, line, 10, 400 + 15 * i, 0xFFFFFFFF)
            end
        end
    end
end

function sampev.onShowDialog(dialogId, style, title, b1, b2, text)
    if wanted and text:find("Уровень розыска") then
        wanted_players = {}

        text = text:gsub("{.-}", "")
        text = text:gsub("Ник%s+Уровень розыска%s+Расстояние\n", "")
        for line in text:gmatch("[^\n]+") do
            table.insert(wanted_players, line)
        end

        return true
    end

    return false
end
 

kirieshki.

Участник
52
39
return false делает окно невидимым
Lua:
function sampev.onShowDialog(dialogId, style, title, b1, b2, text)
    if wanted and text:find("Уровень розыска") then
        wanted_players = {}

        text = text:gsub("{.-}", "")
        text = text:gsub("Ник%s+Уровень розыска%s+Расстояние\n", "")
        for line in text:gmatch("[^\n]+") do
            table.insert(wanted_players, line)
        end

        return false
    end
end
 

AngelMAILS228

Известный
Автор темы
89
12
return false делает окно невидимым
Lua:
function sampev.onShowDialog(dialogId, style, title, b1, b2, text)
    if wanted and text:find("Уровень розыска") then
        wanted_players = {}

        text = text:gsub("{.-}", "")
        text = text:gsub("Ник%s+Уровень розыска%s+Расстояние\n", "")
        for line in text:gmatch("[^\n]+") do
            table.insert(wanted_players, line)
        end

        return false
    end
end
Все супер все сработало, дальше немного покопался, поучил и сделал практически готовый скрипт, но возникла новая проблема.
Когда скрипт работает и был запущен, перестал работать инвентарь на Аризона РП, то есть он открывается но кнопки там не работают, нельзя ничего надеть или использовать, просто ничего не показывает. Вероятно что то с проверкой диалоговых окон, я проверяю по их ид, так как заголовка у них нет, а как удобно сделать хз что бы не конфликтовало


Lua:
script_name('WantedOnScreen')
script_version('1.0')
script_author('#Mails scripts')

require 'moonloader'
local sampev = require 'lib.samp.events'
local vkeys = require 'vkeys'
local inicfg = require 'inicfg'
local font_flag = require('moonloader').font_flag
local my_font = renderCreateFont("Arial", 10, font_flag.BOLD)

-- Конфигурация
local config_path = "wanted_config.ini"
local config = inicfg.load({
    position = { x = 10, y = 400 }
}, config_path)

local wanted = false
local wanted_players = {}
local temp_players = {}
local current_wanted = 1
local manual_wanted = false
local max_wanted = 7
local pos_x = config.position.x
local pos_y = config.position.y
local is_moving = false
local move_mode = false
local mouse_offset_x, mouse_offset_y = 0, 0

function isMouseInBounds()
    local cursor_x, cursor_y = getCursorPos()
    local list_height = (1 + #wanted_players) * 20
    return cursor_x >= pos_x and cursor_x <= pos_x + 300 and
           cursor_y >= pos_y and cursor_y <= pos_y + list_height
end

function main()
    repeat wait(100) until isSampAvailable()
    sampAddChatMessage("{1288E8}[#Mails scripts]: {FFFFFF}WantedOnScreen {28FF2B}успешно загружен!", -1)
    sampAddChatMessage("{1288E8}[#Mails scripts]: {FFFFFF}Используйте {28FF2B}/showwanted и /movewanted!", -1)

    sampRegisterChatCommand("showwanted", function()
        wanted = not wanted
        current_wanted = 1
        sampAddChatMessage("{1288E8}[#Mails scripts]: {FFFFFF}Мониторинг розыска: " .. (wanted and "{28FF2B}включен" or "{FF2B2B}отключен"), -1)
        if wanted then
            lua_thread.create(function()
                while wanted do
                    temp_players = {}
                    for i = 1, max_wanted do
                        if not wanted then break end
                        manual_wanted = false
                        sampSendChat("/wanted " .. i)
                        wait(1000)
                    end
                    if #temp_players > 0 then
                        wanted_players = temp_players
                    end
                    wait(15000)
                end
            end)
        end
    end)

    sampRegisterChatCommand("wanted", function(param)
        if param then
            manual_wanted = true
            sampSendChat("/wanted " .. param)
        end
    end)

    sampRegisterChatCommand("movewanted", function()
        move_mode = not move_mode
        if move_mode then
            sampAddChatMessage("{1288E8}[#Mails scripts]: {FFFFFF}Режим перемещения {28FF2B}включен{A598EB}. Зажмите ЛКМ и двигайте список.", -1)
        else
            sampAddChatMessage("{1288E8}[#Mails scripts]: {FFFFFF}Режим перемещения {FF2B2B}выключен", -1)
        end
    end)

    while true do
        wait(0)
        if wanted then
            renderFontDrawText(my_font, "{FF9D00}Игроки в розыске:", pos_x, pos_y, 0xFFFFFFFF)
            for i, line in ipairs(wanted_players) do
                renderFontDrawText(my_font, line, pos_x, pos_y + 20 * i, 0xFFFFFFFF)
            end

            if move_mode then
                if isKeyDown(vkeys.VK_LBUTTON) then
                    local cursor_x, cursor_y = getCursorPos()
                    if not is_moving and isMouseInBounds() then
                        is_moving = true
                        mouse_offset_x = cursor_x - pos_x
                        mouse_offset_y = cursor_y - pos_y
                    elseif is_moving then
                        pos_x = cursor_x - mouse_offset_x
                        pos_y = cursor_y - mouse_offset_y

                        config.position.x = pos_x
                        config.position.y = pos_y
                        inicfg.save(config, config_path)
                    end
                else
                    is_moving = false
                end
            end
        end
    end
end

function sampev.onShowDialog(dialogId, style, title, b1, b2, text)
    if dialogId == 1780 then
        if wanted and not manual_wanted then
            text = text:gsub("{.-}", "")
            for line in text:gmatch("[^\n]+") do
                if not line:find("Ник%s+Уровень розыска%s+Расстояние") then
                    local nick, id, level_full, distance = line:match("([^%(]+)%((%d+)%)%s*([^%[]+)%[([^%]]+)%]")
                    if nick and id and level_full and distance then
                        table.insert(temp_players, string.format(
                            "{42f595}%s(%s) {B5B5B5}| {FF9D00}%s {B5B5B5}| {42f595}%s",
                            nick:gsub("%s+$", ""), id, level_full:gsub("%s+$", ""), distance:gsub("^%s*(.-)%s*$", "%1")
                        ))
                    end
                end
            end
            return false
        end
        manual_wanted = false
        return true
    end
    return true
end

function sampev.onServerMessage(color, text)
    if text:find("Игроков с таким уровнем розыска нету!") then
        if wanted and not manual_wanted then
            return false
        end
    end
    return true
end
 

kirieshki.

Участник
52
39
Все супер все сработало, дальше немного покопался, поучил и сделал практически готовый скрипт, но возникла новая проблема.
Когда скрипт работает и был запущен, перестал работать инвентарь на Аризона РП, то есть он открывается но кнопки там не работают, нельзя ничего надеть или использовать, просто ничего не показывает. Вероятно что то с проверкой диалоговых окон, я проверяю по их ид, так как заголовка у них нет, а как удобно сделать хз что бы не конфликтовало


Lua:
script_name('WantedOnScreen')
script_version('1.0')
script_author('#Mails scripts')

require 'moonloader'
local sampev = require 'lib.samp.events'
local vkeys = require 'vkeys'
local inicfg = require 'inicfg'
local font_flag = require('moonloader').font_flag
local my_font = renderCreateFont("Arial", 10, font_flag.BOLD)

-- Конфигурация
local config_path = "wanted_config.ini"
local config = inicfg.load({
    position = { x = 10, y = 400 }
}, config_path)

local wanted = false
local wanted_players = {}
local temp_players = {}
local current_wanted = 1
local manual_wanted = false
local max_wanted = 7
local pos_x = config.position.x
local pos_y = config.position.y
local is_moving = false
local move_mode = false
local mouse_offset_x, mouse_offset_y = 0, 0

function isMouseInBounds()
    local cursor_x, cursor_y = getCursorPos()
    local list_height = (1 + #wanted_players) * 20
    return cursor_x >= pos_x and cursor_x <= pos_x + 300 and
           cursor_y >= pos_y and cursor_y <= pos_y + list_height
end

function main()
    repeat wait(100) until isSampAvailable()
    sampAddChatMessage("{1288E8}[#Mails scripts]: {FFFFFF}WantedOnScreen {28FF2B}успешно загружен!", -1)
    sampAddChatMessage("{1288E8}[#Mails scripts]: {FFFFFF}Используйте {28FF2B}/showwanted и /movewanted!", -1)

    sampRegisterChatCommand("showwanted", function()
        wanted = not wanted
        current_wanted = 1
        sampAddChatMessage("{1288E8}[#Mails scripts]: {FFFFFF}Мониторинг розыска: " .. (wanted and "{28FF2B}включен" or "{FF2B2B}отключен"), -1)
        if wanted then
            lua_thread.create(function()
                while wanted do
                    temp_players = {}
                    for i = 1, max_wanted do
                        if not wanted then break end
                        manual_wanted = false
                        sampSendChat("/wanted " .. i)
                        wait(1000)
                    end
                    if #temp_players > 0 then
                        wanted_players = temp_players
                    end
                    wait(15000)
                end
            end)
        end
    end)

    sampRegisterChatCommand("wanted", function(param)
        if param then
            manual_wanted = true
            sampSendChat("/wanted " .. param)
        end
    end)

    sampRegisterChatCommand("movewanted", function()
        move_mode = not move_mode
        if move_mode then
            sampAddChatMessage("{1288E8}[#Mails scripts]: {FFFFFF}Режим перемещения {28FF2B}включен{A598EB}. Зажмите ЛКМ и двигайте список.", -1)
        else
            sampAddChatMessage("{1288E8}[#Mails scripts]: {FFFFFF}Режим перемещения {FF2B2B}выключен", -1)
        end
    end)

    while true do
        wait(0)
        if wanted then
            renderFontDrawText(my_font, "{FF9D00}Игроки в розыске:", pos_x, pos_y, 0xFFFFFFFF)
            for i, line in ipairs(wanted_players) do
                renderFontDrawText(my_font, line, pos_x, pos_y + 20 * i, 0xFFFFFFFF)
            end

            if move_mode then
                if isKeyDown(vkeys.VK_LBUTTON) then
                    local cursor_x, cursor_y = getCursorPos()
                    if not is_moving and isMouseInBounds() then
                        is_moving = true
                        mouse_offset_x = cursor_x - pos_x
                        mouse_offset_y = cursor_y - pos_y
                    elseif is_moving then
                        pos_x = cursor_x - mouse_offset_x
                        pos_y = cursor_y - mouse_offset_y

                        config.position.x = pos_x
                        config.position.y = pos_y
                        inicfg.save(config, config_path)
                    end
                else
                    is_moving = false
                end
            end
        end
    end
end

function sampev.onShowDialog(dialogId, style, title, b1, b2, text)
    if dialogId == 1780 then
        if wanted and not manual_wanted then
            text = text:gsub("{.-}", "")
            for line in text:gmatch("[^\n]+") do
                if not line:find("Ник%s+Уровень розыска%s+Расстояние") then
                    local nick, id, level_full, distance = line:match("([^%(]+)%((%d+)%)%s*([^%[]+)%[([^%]]+)%]")
                    if nick and id and level_full and distance then
                        table.insert(temp_players, string.format(
                            "{42f595}%s(%s) {B5B5B5}| {FF9D00}%s {B5B5B5}| {42f595}%s",
                            nick:gsub("%s+$", ""), id, level_full:gsub("%s+$", ""), distance:gsub("^%s*(.-)%s*$", "%1")
                        ))
                    end
                end
            end
            return false
        end
        manual_wanted = false
        return true
    end
    return true
end

function sampev.onServerMessage(color, text)
    if text:find("Игроков с таким уровнем розыска нету!") then
        if wanted and not manual_wanted then
            return false
        end
    end
    return true
end
инвентарь не работает, потому что сервер думает, что диалог открыт, попробуй использвать sampCloseCurrentDialogWithButton(1)
 

AngelMAILS228

Известный
Автор темы
89
12

Вложения

  • vr5OQ5SVSMqg8zJ224EUKxV_NcAuEM2V2d0zad1v6EzyZ65BawmIne0f5Rat0o5IP5j6CNbbbMub-V5fCU9BRIrJ.jpg
    vr5OQ5SVSMqg8zJ224EUKxV_NcAuEM2V2d0zad1v6EzyZ65BawmIne0f5Rat0o5IP5j6CNbbbMub-V5fCU9BRIrJ.jpg
    165.7 KB · Просмотры: 43

AngelMAILS228

Известный
Автор темы
89
12
откуда ты 2 взял вторым аргументом то, он принимает только 0/1 (close/apply)
Если стоит 1 аргумент, он открывает первую кнопку "Погоня" , там на скрине видно, и как итог скрипт при пробиве /вантед постоянно открывает дополнительное диалоговое окно которое открывается на кнопку погоня, а вторая кнопка как раз таки отмена
 

wojciech?

Известный
Проверенный
457
419
Если стоит 1 аргумент, он открывает первую кнопку "Погоня" , там на скрине видно, и как итог скрипт при пробиве /вантед постоянно открывает дополнительное диалоговое окно которое открывается на кнопку погоня, а вторая кнопка как раз таки отмена
0 закрывает диалог
 
  • Нравится
Реакции: AngelMAILS228

AngelMAILS228

Известный
Автор темы
89
12
0 закрывает диалог
Дружище, спасибо большое, все сработало, буду еще тестировать.

Lua:
function sampev.onShowDialog(dialogId, style, title, b1, b2, text)
    if dialogId == 1780 then
        if wanted and not manual_wanted then
            text = text:gsub("{.-}", "")
            for line in text:gmatch("[^\n]+") do
                if not line:find("Ник%s+Уровень розыска%s+Расстояние") then
                    local nick, id, level_full, distance = line:match("([^%(]+)%((%d+)%)%s*([^%[]+)%[([^%]]+)%]")
                    if nick and id and level_full and distance then
                        table.insert(temp_players, string.format(
                            "{42f595}%s(%s) {B5B5B5}| {FF9D00}%s {B5B5B5}| {42f595}%s",
                            nick:gsub("%s+$", ""), id, level_full:gsub("%s+$", ""), distance:gsub("^%s*(.-)%s*$", "%1")
                        ))
                    end
                end
            end

            -- Автоматически закрываем окно (жмем кнопку "Отмена" — index 1)
            lua_thread.create(function()
                wait(100)
                sampSendDialogResponse(dialogId, 0, 0, "")
            end)

            return false -- Не показываем диалог пользователю
        end

        manual_wanted = false
        return true -- Показываем диалог, если вручную вызывали
    end
    return true
end