админ чекер

Kecer

Участник
Автор темы
241
11
Версия MoonLoader
.026-beta
Хочу реализовать админ чекер

126715


Не могу это сделать уже достаточно большой срок, не понимаю как работает рендер, пожалуйста покажите пример того как это можно реализовать, желательно на практике ибо на словах очень сложно понять, в мыслях понятно что нужно сделать функцию которая будет флудить /admins и брать от туда админов потом заносить в массив, но на реализации я застопорился

Если есть возможно объясните на примере /leaders ибо админка не у всех есть, условно говоря брать и /leaders ник лидера, организация

1659025291612.png
 
  • Злость
Реакции: qdIbp
Решение
@Kecer
Лично я делал, держи.

Lua:
local samp = require('samp.events')
local admins = { -- Наш массив для /admins
    bool = false,
    max_count = 0,
    now_count = 0,
    list = {}
}

local font = renderCreateFont('Arial', 10, 13) -- Загружаем шрифт

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    lua_thread.create(spam_admins) -- Создаю поток для вечного флуда
    while true do wait(0)
       
        if #admins.list > 0 then
            for k, v in ipairs(admins.list) do
                if tonumber(v.lvl) == 1 then -- Получаю лвл админки из таблице и присваиваю цвет
                    color = '{6bb5ff}'
                elseif...

qdIbp

Автор темы
Проверенный
1,435
1,175
Пойдет?

Lua:
local font_flag = require('moonloader').font_flag -- создание флага для стилей(Тень, курсив, жирный и тд)
local my_font = renderCreateFont('Verdana', 12, font_flag.BOLD + font_flag.SHADOW) -- создание шрифта

local nick = {'Ilya_Lua','Vas_MonteNegro','StarPlatinum'} --массив для хранения ников
local nicks = '' -- переменная которая будет выводить ники в render которые в сети
function main() -- Основная функция
    repeat wait(0) until isSampAvailable() -- Ожидает прогрузки сампа
        local res, myid = sampGetPlayerIdByCharHandle(playerPed) -- получает свой id и результат(есть ли у тебя ид или нет)
    while true do wait(0) -- беск цикл
        for i = 0,1000 do -- цикл от 0 до 1000 т.к максимум придел игроков на сервере 1000
            if sampIsPlayerConnected(i) or myid == i then -- Если данный ид подкл или число из цикла равно твоему иду то
                for l,k in pairs(nick) do -- вытаскиваем все ники из массива nick
                    if string.find(sampGetPlayerNickname(i),k) then -- ищим ники по иду паралельно сверяя с никами из массива
                        nicks = nicks..'\n'..k..'['..i..']' -- добавляем ник в переменную чтобы все ники в кучу не сбивались
                        renderFontDrawText(my_font, nicks, 10, 400, 0xFFFFFFFF) -- рендерим текст на экран
                    end -- конец ветвления
                end -- конец цикла
            end -- конец ветвления
        end -- конец цикла
        nicks = '' -- Опусташаем переменную т.к иначе будет набираться ники до бесконечности
    end -- конец цикла
end -- конец функции
 
  • Эм
Реакции: Rice.

Kecer

Участник
Автор темы
241
11
Пойдет?

Lua:
local font_flag = require('moonloader').font_flag -- создание флага для стилей(Тень, курсив, жирный и тд)
local my_font = renderCreateFont('Verdana', 12, font_flag.BOLD + font_flag.SHADOW) -- создание шрифта

local nick = {'Ilya_Lua','Vas_MonteNegro','StarPlatinum'} --массив для хранения ников
local nicks = '' -- переменная которая будет выводить ники в render которые в сети
function main() -- Основная функция
    repeat wait(0) until isSampAvailable() -- Ожидает прогрузки сампа
        local res, myid = sampGetPlayerIdByCharHandle(playerPed) -- получает свой id и результат(есть ли у тебя ид или нет)
    while true do wait(0) -- беск цикл
        for i = 0,1000 do -- цикл от 0 до 1000 т.к максимум придел игроков на сервере 1000
            if sampIsPlayerConnected(i) or myid == i then -- Если данный ид подкл или число из цикла равно твоему иду то
                for l,k in pairs(nick) do -- вытаскиваем все ники из массива nick
                    if string.find(sampGetPlayerNickname(i),k) then -- ищим ники по иду паралельно сверяя с никами из массива
                        nicks = nicks..'\n'..k..'['..i..']' -- добавляем ник в переменную чтобы все ники в кучу не сбивались
                        renderFontDrawText(my_font, nicks, 10, 400, 0xFFFFFFFF) -- рендерим текст на экран
                    end -- конец ветвления
                end -- конец цикла
            end -- конец ветвления
        end -- конец цикла
        nicks = '' -- Опусташаем переменную т.к иначе будет набираться ники до бесконечности
    end -- конец цикла
end -- конец функции
ну тут как я понимаю обычный чекер где самому ники надо добавлять, если я конечно не ошибаюсь просто не вижу функции которая флудит командой /leaders для получения от туда ников и добавления их в массив

Lua:
local imgui = require 'imgui'
local sampev = require 'lib.samp.events'
local font_flag = require('moonloader').font_flag

local leader_checker = imgui.ImBool(mainIni.leaders.leader_checker)
local ld_ping = imgui.ImBuffer('' .. mainIni.leaders.ld_ping, 256)
local ld_size = imgui.ImBuffer('' .. mainIni.leaders.ld_size, 256)
local ld_font = imgui.ImBuffer('' .. mainIni.leaders.ld_font, 256)
local ld_font_main = renderCreateFont(ld_font.v, tonumber(ld_size.v), font_flag.BOLD + font_flag.SHADOW)
local leaders, timer = { }, 0

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    while true do wait(0)
        if leader_checker.v then
            ld_flooder()
        
            renderFontDrawText(ld_font_main, 'Лидеры онлайн:', 10, 400, -1)
            for i = 1, #leaders do
                if leaders[i].ld_name and leaders[i].ld_id and leaders[i].ld_org and leaders[i].ld_number then
                    renderFontDrawText(ld_font_main,
                        ("%s[%d] - %s | AFK: %s"):format(
                            leaders[i].ld_name,
                            leaders[i].ld_id,
                            leaders[i].ld_org,
                            (leaders[i].ld_afk and leaders[i].ld_afk or "Нет")
                        ),
                        10, 400 + i * (tonumber(ld_size.v)+6), -1
                    )
                end
            end
        end
    end
end

--function imgui.OnDrawFrame()
--    imgui.Checkbox(u8'Включить чекер', leader_checker)
--    imgui.InputText(u8'Частота обновления', ld_ping)
--    imgui.InputText(u8'Шрифт', ld_font)
--    imgui.InputText(u8'Размер шрифта', ld_size)

function ld_flooder()
    if tonumber(ld_ping.v) <= 10000 and os.time() >= timer + 12 then
        timer = os.time()
        sampSendChat('/leaders')
    else
        if os.time() >= timer + tonumber(ld_ping.v)/1000 then
            timer = os.time()
            sampSendChat('/leaders')
        end
    end
end

function sampev.onServerMessage(color, text)
    if leader_checker.v and text:find('Лидеры онлайн:') then
        leaders = {}
        return false
    end
    if leader_checker.v and text:find('{FFFFFF}(%w+_%w+)%[%d+%] %- (.*) | Номер: (.*)') then
        local name, id, org, number = text:match('{FFFFFF}(%w+_%w+)%[(%d+)%] %- (.*) %| Номер: (.*)')
    
        table.insert(leaders, { ld_name = name, ld_id = id, ld_org = org, ld_number = number } )
        return false
    end

    if leader_checker.v and text:find('{FFFFFF}(%w+_%w+)%[(%d+)%] %- (.*) | Номер: (.*){FFFFFF} | AFK: (%d+) секунд') then
        local name, id, org, number, afk = text:match('{FFFFFF}(%w+_%w+)%[(%d+)%] %- (.*) | Номер: (.*){FFFFFF} | AFK: (%d+) секунд')   
    
        table.insert(leaders, { ['ld_name'] = name, ['ld_id'] = id, ['ld_org'] = org, ['ld_number'] = number, ['ld_afk'] = afk } )
        return false
    end
 
    if leader_checker.v and text:find('чтобы найти членов организаций') then
        return false
    end
end

Вот пример кода на бх нашёл, чекер лидеров, но он у меня не работает почему-то, ну тут очень много лишнего связанного с imgui? напримере такого пытаюсь сделать но не выходит, буду благодарен если кто-то поможет мне разобраться как это делать и объяснит вообще
 
Последнее редактирование:

Kecer

Участник
Автор темы
241
11
Рендер фигня, вот парсинг инфы с репой куда сложнее.
Да мне репа не обязательно, мне хотя бы просто реализовать что бы он команду /admins флудил каждые несколько секунд хукал текст что бы не видно было в чате флуда и от туда доставал ники админов и в столбек их выкладывал в рендер, а дальше я думаю уже как нибудь сам разберусь технику вообще это штуки понять бы, ибо мучаюсь уже довольно большой срок и особо толкого не где не нашёл по поводу этого не чего, а брать другие скрипты и там чёто понимать сложно, у того же дилса в опен сурсном тулсе для родины сделано это вообще как-то не очень, я там вообще не чо не понимаю
 

Rice.

Известный
Модератор
1,755
1,619
@Kecer
Лично я делал, держи.

Lua:
local samp = require('samp.events')
local admins = { -- Наш массив для /admins
    bool = false,
    max_count = 0,
    now_count = 0,
    list = {}
}

local font = renderCreateFont('Arial', 10, 13) -- Загружаем шрифт

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    lua_thread.create(spam_admins) -- Создаю поток для вечного флуда
    while true do wait(0)
       
        if #admins.list > 0 then
            for k, v in ipairs(admins.list) do
                if tonumber(v.lvl) == 1 then -- Получаю лвл админки из таблице и присваиваю цвет
                    color = '{6bb5ff}'
                elseif tonumber(v.lvl) == 2 then
                    color = '{2994ff}'
                elseif tonumber(v.lvl) == 3 then
                    color = '{FF8C00}'
                elseif tonumber(v.lvl) == 4 then
                    color = '{006edb}'
                end

                if v.re then -- Делаю проверку на рекон, потому что там разные тексты в /admins
                    renderFontDrawText(font, string.format('%s[A-%s] %s - AFK: %s {FF0000}- /re %s {9ACD32}- Rep: %s', color, v.lvl, v.nick, v.afk, v.re, v.rep), 10, 500+k*20, 0xFFFFFFFF)
                else
                    renderFontDrawText(font, string.format('%s[A-%s] %s - AFK: %s {9ACD32}- Rep: %s', color, v.lvl, v.nick, v.afk, v.rep), 10, 500+k*20, 0xFFFFFFFF)
                end
            end
        end

    end
end

function spam_admins() -- Сама функция для вечного флуда
    while true do wait(0)
        if sampIsLocalPlayerSpawned() then
            admins.bool = true
            sampSendChat('/admins')
        end
        wait(6000) -- Задержка 6 секунд в чекере /admins
    end
end

local temp_admins = {} -- Массив для временного хранения списка администрации (чтобы рендер текста не мерцал при получение информации)
function samp.onServerMessage(color, text)
    if admins.bool then -- Проверяю на то, что проверка включена
        if text:find('^%s*{33CC00}Администрация онлайн: %(в сети: %d+,') then
            admins.max_count = text:match('^%s*{33CC00}Администрация онлайн: %(в сети: (%d+),') -- Получаю макс. кол-во администраторов в онлайне, чтобы в рендер не попали лишние строчки
            return false
        end
        if text:find('^%s*{fefe22}.+%[%d+%] %- %[%d+ lvl%]') then
            admins.now_count = admins.now_count + 1 -- Обновлняю это число, чтобы в дальнейшем остновить чекер если будет равно макс. кол-во администрации
            local text = text:gsub('{......}', '')

            if text:find('/re %d+%-') then
                local nick, lvl, re, afk, rep = text:match('(.+) %- %[(.+) lvl%]   %- /re (.+)%- %[AFK: (.+)%] %- Репутация: (.+)')
                temp_admins[#temp_admins + 1] = {
                        nick = nick,
                        lvl = lvl,
                        re = re,
                        afk = afk,
                        rep = rep
                }
            else
                local nick, lvl, afk, rep = text:match('(.+) %- %[(.+) lvl%] %- %[AFK: (.+)%] %- Репутация: (.+)')
                temp_admins[#temp_admins + 1] = {
                        nick = nick,
                        lvl = lvl,
                        afk = afk,
                        rep = rep
                }
            end

            if tonumber(admins.now_count) == tonumber(admins.max_count) then -- Записываем в чекер
                admins.list = temp_admins
                table.sort(admins.list, function (a, b) return a.lvl > b.lvl end) -- Соритрую таблицу по лвл админки
                temp_admins = {}
                admins.bool = false
                admins.max_count = 0
                admins.now_count = 0
            end
            return false
        end
    end
end
Я заебусь писать объяснение к каждой строчке, написал только самое основное. Если будут вопросы - спрашивай
 
  • Грустно
Реакции: qdIbp