реализация функции через рекон

linmsqn

Участник
Автор темы
337
9
Версия MoonLoader
.026-beta
первое что я хочу сделать - проверка на то, в реконе ли админ. типо чтобы менюшка с действиями открывалась только если человек в реконе за другим игроком.

второе мне нужен код чтобы кнопка на которую я нажму в меню, сработала на игрока за которым я в реконе.
пример - на сервере есть команда /ban, по нажатию на неё игрока за которым я в реконе забанит навсегда
 

манку хлебал

Потрачен
305
122
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Lua:
local events = require('lib.samp.events')

local spec_data = {
    id = -1
}

function events.onTogglePlayerSpectating(state)
    imgui.v = state -- imgui замени на свою переменную, которая отвечает за отрисовку окна
end

function events.onSpectatePlayer(playerid, camtype)
    spec_data.id = playerid -- в spec_data.id будет храниться id игрока, за которым идет слежка
    --[[
    if imgui.Button('ban') then 
        sampSendChat(('/ban %d'):format(spec_data.id))
    end
    ]]
end
 

A S K I T

Активный
200
69
Сам сегодня сделал такую фигню как ты описал.
Проверку в реконе-ли админ нужно сделать примерно вот так:

Lua:
function sampev.onTogglePlayerSpectating(playerSpectating)

    cfg.temp.user_isRecon = playerSpectating
    inicfg.save(cfg, direct_cfg)

end
Не помню почему, но для себя понял что результат обязательно нужно сохранять в конфиг.

Проверку за каким игроком админ следит, лучше сделать через поиск текстдрава с никнеймом и айди игрока:

Lua:
-- ЕСЛИ АДМИН В РЕКОНЕ.
for textdraw_id = 0, 2304 do -- Перебираем все текстдравы, и сохраняем в переменную.
    if sampTextdrawIsExists(textdraw_id) then -- Проверяем существование текстдрава когда админ в реконе.
        sampTextdrawSetPos(textdraw_id, 10000, 10000) -- Смещаем стандартные текстдравы за границы экрана.
        local textdraw_string = sampTextdrawGetString(textdraw_id) -- Получаем строки всех текстдравов.
        if textdraw_string:find('(%w+_%w+).%((%d+)%)') then -- Ищем текстдрав с никнеймом и айди игрока.
            spectatePlayer_id = textdraw_string:match('%d+') -- Записываем айди игрока в переменную.
        end
    end
end
Так-же через эту проверку можно сделать проверку в реконе ли админ, так будет даже лучше.

Вот код из моего скрипта:

Lua:
-- Рекон-панели.
if cfg.temp.user_isRecon and cfg.settings.widget_recon then
    for textdraw_id = 0, 2304 do
        if sampTextdrawIsExists(textdraw_id) then
            sampTextdrawSetPos(textdraw_id, 10000, 10000)
            local textdraw_string = sampTextdrawGetString(textdraw_id)
            if textdraw_string:find('(%w+_%w+).%((%d+)%)') then
                spectatePlayer_id = textdraw_string:match('%d+')
            end
        end
    end

    imgui.PushFont(font_22)
    imgui.SetNextWindowPos(imgui.ImVec2(resX-resX+20, resY/2-100))
    imgui.Begin('##window_widget_recon1', window_widget_recon, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoTitleBar + imgui.WindowFlags.AlwaysAutoResize)

            imgui.BeginChild('window_widget_recon1', imgui.ImVec2(100, 300))
            if imgui.Button(u8'СТАТ', imgui.ImVec2(100, 0)) then if spectatePlayer_id ~= nil then sampSendChat('/getstats '..spectatePlayer_id) else sampAddChatMessage(script_prefix..'Статистика не подгрузилась', -1) end end
            if imgui.Button(u8'ДЕНЬГИ', imgui.ImVec2(100, 0)) then if spectatePlayer_id ~= nil then sampSendChat('/checkmoney '..spectatePlayer_id) else sampAddChatMessage(script_prefix..'Статистика не подгрузилась', -1) end end
            if imgui.Button(button_recon_mute and u8'/mute <' or u8'/mute >', imgui.ImVec2(100, 0)) then button_recon_mute = not button_recon_mute end
            if imgui.Button(button_recon_ban and u8'/ban <' or u8'/ban >', imgui.ImVec2(100, 0)) then button_recon_ban = not button_recon_ban end
            imgui.EndChild()
            imgui.SameLine()

            if button_recon_mute then
                imgui.BeginChild('##button_recon_mute', imgui.ImVec2(100, -1))
                    imgui.Button(u8'МГ', imgui.ImVec2(100, 0))
                    imgui.Button(u8'ФЛУД', imgui.ImVec2(100, 0))
                    imgui.Button(u8'КАПС', imgui.ImVec2(100, 0))
                    if imgui.Button(u8'МАТ', imgui.ImVec2(100, 0)) then if spectatePlayer_id ~= nil then sampSendChat('/mute '..spectatePlayer_id..' 30 Мат') else sampAddChatMessage(script_prefix..'Статистика не подгрузилась', -1) end end
                    imgui.Button(u8'ОСК', imgui.ImVec2(100, 0))
                imgui.EndChild()
            end
            imgui.SameLine()

            if button_recon_ban then
                imgui.SameLine()
                imgui.BeginChild('##button_recon_ban', imgui.ImVec2(100, -1))
                    imgui.Button(u8'ЧИТЫ', imgui.ImVec2(100, 0))
                    imgui.Button(u8'ХУЙ', imgui.ImVec2(100, 0))
                    imgui.Button(u8'ПИЗДА', imgui.ImVec2(100, 0))
                    imgui.Button(u8'КОКС', imgui.ImVec2(100, 0))
                imgui.EndChild()
            end

    imgui.End()
    imgui.PopFont()

    -- imgui.SetNextWindowPos(imgui.ImVec2(1800, 400))
    -- imgui.Begin('##window_widget_recon2', window_widget_recon, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoTitleBar + imgui.WindowFlags.AlwaysAutoResize)

    --     imgui.Text(u8'Панель с информацией')

    -- imgui.End()
end

Этот код не дописан, но суть понятна. Ещё я планировал на каждую кнопку вешать проверку получен ли айди игрока, но это уже не нужно вроде.

Почему я написал получение айди игрока через поиск текстдрава? - Потому-что если игрок будет в машине, ты не сможешь определить его айди.