From 7fb54c9b2c0ecb19a12dd09bf7ad792da579cc73 Mon Sep 17 00:00:00 2001 From: rubin Date: Tue, 31 Jan 2023 21:59:44 +0300 Subject: [PATCH] added menu & blacklist --- mafia-tools.lua | 261 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 252 insertions(+), 9 deletions(-) diff --git a/mafia-tools.lua b/mafia-tools.lua index 3cb4f69..2265a09 100644 --- a/mafia-tools.lua +++ b/mafia-tools.lua @@ -2,8 +2,6 @@ script_name('mafia-tools') script_author("Serhiy_Rubin") script_version("29.01.2023") -inspect = require("inspect") - sampev = require 'samp.events' inicfg = require "inicfg" dlstatus = require("moonloader").download_status @@ -23,12 +21,201 @@ function main() lua_thread.create(timer_2min.loop) lua_thread.create(ammo_timer.loop) lua_thread.create(request.loop) + lua_thread.create(menu.loop) while true do wait(0) end end +--[[ + Синхронизация таймингов + > Комната + > Участники комнаты + > Список блокировщика + > Использовать список как: Черный/Белый +]] +-->> MENU DIALOG +menu = {} +menu.dialog = {} +menu.color = "{fffd8f}" +menu.data = {} +menu.update = function() + + -->> Обновление инфы от сервера + local players = getNicknamesOnline() + local count = 0 + local members = {} + for sender, sender_data in pairs(menu.data) do + count = count + 1 + -- for key, v in pairs(sender_data) do + -- if ammo_timer.data[key] ~= nil then + -- if ammo_timer.data[key]["time"] < v["time"] then + -- ammo_timer.data[key]["time"] = v["time"] + -- ammo_timer.data[key]["text"] = v["text"] + -- end + -- end + -- end + + members[#members+1] = { + title = string.format("%s\t", (players[sender] ~= nil and sender.."["..players[sender].."]" or sender)), + click = function(button, list, input, outs) + if button == 1 then + menu.show = { + true, + "members_user", + { + { + title = (config.data.list[sender] ~= nil and "Убрать из списка" or "Добавить в список"), + click = function(button, list, input , outs) + if button == 1 then + if config.data.list[sender] == nil then + config.data.list[sender] = true + addChatMessage(string.format("Вы добавли %s в список!", sender)) + else + config.data.list[sender] = nil + addChatMessage(string.format("Вы удалили %s из списка!", sender)) + end + config.save(config.data) + end + menu.show = { true, "members" } + end + }, + { + title = menu.color.."Тайминги от пользователя:", + click = function(button, list, input , outs) + menu.show = { true, "members" } + end + }, + { + title = menu.color..">{FFFFFF} LS: "..sender_data["ls"]["text"].." "..(sender_data["mhcars"]["time"] > 0 and math.floor(msk_time.get() - sender_data["mhcars"]["time"]).." sec" or ""), + click = function(button, list, input , outs) + menu.show = { true, "members" } + end + }, + { + title = menu.color..">{FFFFFF} SF: "..sender_data["sf"]["text"].." "..(sender_data["mhcars"]["time"] > 0 and math.floor(msk_time.get() - sender_data["mhcars"]["time"]).." sec" or ""), + click = function(button, list, input , outs) + menu.show = { true, "members" } + end + }, + { + title = menu.color..">{FFFFFF} LV: "..sender_data["lv"]["text"].." "..(sender_data["mhcars"]["time"] > 0 and math.floor(msk_time.get() - sender_data["mhcars"]["time"]).." sec" or ""), + click = function(button, list, input , outs) + menu.show = { true, "members" } + end + }, + { + title = menu.color..">{FFFFFF} MHCARS: "..sender_data["mhcars"]["text"].." "..(sender_data["mhcars"]["time"] > 0 and math.floor(msk_time.get() - sender_data["mhcars"]["time"]).." sec" or ""), + click = function(button, list, input , outs) + menu.show = { true, "members" } + end + }, + } + } + else + menu.show = { true, "main" } + end + end + } + + + end + + + + + menu.dialog = { + ["main"] = { + settings = {title = "mafia-tools" ,style = 4 ,btn1 = "Выбрать" ,btn2 = "Закрыть" ,forward = "{ffffff}" ,backwards = "\n" ,score = false}, + { + { + title = menu.color.."Синхронизация таймингов\t", + click = function(button, list, input , outs) + if button ~= 1 then return end + menu.show = { true, "main" } + end + }, + { + title = menu.color..">{ffffff} Комната\t"..config.data.room, + click = function(button, list, input , outs) + if button ~= 1 then return end + menu.show = { true, "edit", function(button, list, input, outs) + if button == 1 then + if #input > 0 then + config.data.room = input + config.save(config.data) + end + end + menu.show = { true, "main" } + end, config.data.room} + end + }, + { + title = menu.color..">{ffffff} Участники комнаты\t"..count, + click = function(button, list, input , outs) + if button ~= 1 then return end + menu.show = { true, "members" } + end + }, + { + title = menu.color..">{ffffff} Список блокировщика\t", + click = function(button, list, input , outs) + if button ~= 1 then return end + + end + }, + { + title = menu.color..">{ffffff} Использовать список как:\t"..(config.data.list_block and "Черный список" or "Белый список"), + click = function(button, list, input , outs) + if button ~= 1 then return end + config.data.list_block = not config.data.list_block + config.save(config.data) + menu.show = { true, "main" } + end + } + } + }, + ["edit"] = { + settings = {title = "mafia-tools" ,style = 1 ,btn1 = "Выбрать" ,btn2 = "Назад" ,forward = "{ffffff}" ,backwards = "\n" ,score = true}, + { + text = "", + { + click = function(button, list, input, outs) + menu.show[3](button, list, input, outs) + end + } + } + }, + ["members"] = { + settings = {title = "mafia-tools" ,style = 4 ,btn1 = "Выбрать" ,btn2 = "Назад" ,forward = "{ffffff}" ,backwards = "\n" ,score = true}, + members + }, + ["members_user"] = { + settings = {title = "mafia-tools" ,style = 2 ,btn1 = "Выбрать" ,btn2 = "Назад" ,forward = "{ffffff}" ,backwards = "\n" ,score = true}, + menu.show[3] + } + + } +end +menu.show = { false, "main" } +menu.put = "" +menu.loop = function() + sampRegisterChatCommand('maf', function(param) + menu.show = { true, "main" } + end) + while true do + wait(0) + if menu.show[1] then + menu.show[1] = false + menu.update() + if menu.dialog[menu.show[2]] ~= nil then + start_dialog(menu.dialog[menu.show[2]], menu.show[4]) + end + end + end +end + -->> MSK TIME msk_time = {} msk_time.update = 0 @@ -77,12 +264,15 @@ request.handler = function(text) msk_time.time = info["time"] end if info["result"] == "ok" then + menu.data = info["data"] for sender, sender_data in pairs(info["data"]) do - for key, v in pairs(sender_data) do - if ammo_timer.data[key] ~= nil then - if ammo_timer.data[key]["time"] < v["time"] then - ammo_timer.data[key]["time"] = v["time"] - ammo_timer.data[key]["text"] = v["text"] + if config.data.list[sender] == nil then + for key, v in pairs(sender_data) do + if ammo_timer.data[key] ~= nil then + if ammo_timer.data[key]["time"] < v["time"] then + ammo_timer.data[key]["time"] = v["time"] + ammo_timer.data[key]["text"] = v["text"] + end end end end @@ -104,7 +294,7 @@ ammo_timer.onServerMessage = function(color, message) request.wait = 0 end end - if message:find("Задание будет доступно через: ") then + if message:find("^ Задание будет доступно через: ") then local p1, p2, p3 = string.match(message, "Задание будет доступно через: (%d+):(%d+):(%d+)") if(p3 == nil)then p1, p2 = string.match(message, "Задание будет доступно через: (%d+):(%d+)") @@ -212,7 +402,9 @@ config.default = { y = y1 }, time_2min = 0, - room = "all" + room = "all", + list = {}, -->> Список + list_block = true, -->> Использовать как Черный или Белый список } config.directory = string.format("%s\\moonloader\\config\\%s\\", getGameDirectory(), thisScript().name) config.init = function() @@ -318,6 +510,57 @@ function convertTableToString(table) end return result end +function start_dialog(menu, put) -- module by trefa & modify (put & list in []) + function _dialog(menu, id, outs, put) + sampShowDialog(id, menu.settings.title, tbl_split(menu.settings.style, menu, menu.settings.forward ,menu.settings.backwards ,menu.settings.score), menu.settings.btn1, (menu.settings.btn2 ~= nil and menu.settings.btn2 or _), menu.settings.style) + repeat + wait(0) + if put ~= nil and sampIsDialogActive() then + sampSetCurrentDialogEditboxText(put) + put = nil + end + local result, button, list, input = sampHasDialogRespond(id) + if result then + local out, outs = menu[((menu.settings.style == 0 or menu.settings.style == 1 or menu.settings.style == 3) and 1 or ((list + 1) > #menu[1] and 2 or 1))][((menu.settings.style == 0 or menu.settings.style == 1 or menu.settings.style == 3) and 1 or ((list + 1) > #menu[1] and (list - #menu[1]) + 1 or list + 1))].click(button, list, input, outs) + if type(out) == "table" then + return _dialog(out, id - 1, outs, put) + elseif type(out) == "boolean" then + if not out then + return out + end + return _dialog(menu, id, outs, put) + end + end + until result + end + + function tbl_split(style, tbl, forward ,backwards ,score) + if style == 2 or style == 4 or style == 5 then + text = (style == 5 and tbl[1].text.."\n" or "") + for i, val in ipairs(tbl[1]) do + text = text..""..forward..""..(score and "["..(i-1).."] " or "")..""..val.title..""..backwards + end + if tbl[2] ~= nil then + for _, val in ipairs(tbl[2]) do + text = text..""..forward..""..val.title..""..backwards + end + end + return text + end + return tbl[1].text + end + + return _dialog(menu, 1337, outs, put) +end +function getNicknamesOnline() + local result = {} + for i = 0, sampGetMaxPlayerId(false) do + if sampIsPlayerConnected(i) or select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)) == i then + result[sampGetPlayerNickname(i)] = i + end + end + return result +end -->> UPDATE MODULE function openURL(url, fpath, message_off)