- 25
- 1
- Версия MoonLoader
- Другое
Делаю скрипт под штаб армии, нужно чтобы при переподключении к серверу он "замораживался" и не реагировал на команды, только проверял ник при спавне на сервере.
Может и говнокод, но что есть. По возможности подскажите ещё пожалуйста как сделать чтобы каждый день сохранялось время активности.
Lua:
script_name = '[Army LV | ШТАБ]'
script_author = 'Marcus Kransov'
script_description = 'Скрипт для штабных офицеров армии Las Venturas, сервер: Samp-Rp.Ru Underground'
require('lib.moonloader')
local samp = require('samp.events')
local imgui, inicfg = require('mimgui'), require('inicfg')
local encoding = require('encoding')
imgui.OnInitialize(function()
theme()
end)
encoding.default = 'CP1251'
local u8, new, tabs = encoding.UTF8, imgui.new, 0
local playTime = {0, 0, 0, 0, 0, 0, 0}
local lastCheckTime = os.time()
local lastDay = os.date('*t').day
local glavMenu = new.bool()
ranks, positions = {}, {}
function main()
while not isSampAvailable() do wait(200) end
local myID = select(2, sampGetPlayerIdByCharHandle(1))
game_username = sampGetPlayerNickname(myID)
if not game_username then sms('Не удалось получить ваш Nick_Name для проверки, возможно требуется перезайти в игру.') end
if checkNicknameAndGetDetails(game_username) then else end
sampRegisterChatCommand('am', function() glavMenu[0] = not glavMenu[0] end)
while true do
wait(0)
updatePlayTime()
end
end
Menu1 = imgui.OnFrame(function() return glavMenu[0] end,
function(self)
imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
imgui.SetNextWindowSize(imgui.ImVec2(800, 400), imgui.Cond.Always)
imgui.Begin(u8'Army Las Venturas | Штаб армии | Samp-Rp.Ru Underground', glavMenu, imgui.WindowFlags.NoResize)
imgui.BeginChild('#',imgui.ImVec2(200, 350),true)
imgui.CenterText('ВЫБОР МЕНЮ')
imgui.Separator()
if imgui.Button(u8'ГЛАВНОЕ МЕНЮ', imgui.ImVec2(180,40)) then tabs = 0 end
imgui.Separator()
if imgui.Button(u8'НАСТРОЙКА КОМАНД', imgui.ImVec2(180,40)) then tabs = 1 end
imgui.Separator()
if imgui.Button(u8'НАСТРОЙКА КЛАВИШ', imgui.ImVec2(180,40)) then tabs = 2 end
imgui.Separator()
if imgui.Button(u8'ИЗМЕНЕНИЕ СООБЩЕНИЙ', imgui.ImVec2(180,40)) then tabs = 3 end
imgui.Separator()
if imgui.Button(u8'МЕНЮ ГОС.ВЕЩАНИЙ', imgui.ImVec2(180,40)) then tabs = 4 end
imgui.Separator()
imgui.CenterTextDisabled('Army LV | Underground | ШТАБ')
imgui.CenterTextDisabled('Дата выпуска: 00.12.2024')
imgui.EndChild()
if tabs == 0 then
imgui.SetCursorPos(imgui.ImVec2(410, 32))
imgui.BeginChild('#2',imgui.ImVec2(380,100),true)
imgui.CenterText('ПЕРСОНАЛЬНАЯ ИНФОРМАЦИЯ')
imgui.Separator()
imgui.Text(u8'Имя, фамилия: ' .. game_username)
imgui.Text(u8'Звание: ' .. (ranks[game_username]))
imgui.Text(u8'Должность в штабе: ' .. (positions[game_username]))
imgui.EndChild()
imgui.SetCursorPos(imgui.ImVec2(590, 150))
imgui.BeginChild('#3',imgui.ImVec2(200,180),true)
imgui.CenterText('АКТИВНОСТЬ ЗА НЕДЕЛЮ')
imgui.Separator()
imgui.Text(u8'Понедельник: ' .. formatTime(playTime[2]))
imgui.Text(u8'Вторник: ' .. formatTime(playTime[3]))
imgui.Text(u8'Среда: ' .. formatTime(playTime[4]))
imgui.Text(u8'Четверг: ' .. formatTime(playTime[5]))
imgui.Text(u8'Пятница: ' .. formatTime(playTime[6]))
imgui.Text(u8'Суббота: ' .. formatTime(playTime[7]))
imgui.Text(u8'Воскресенье: ' .. formatTime(playTime[1]))
imgui.EndChild()
imgui.SetCursorPos(imgui.ImVec2(380, 150))
imgui.BeginChild('#4',imgui.ImVec2(200,180),true)
imgui.CenterText('СТАТИСТИКА ЗА НЕДЕЛЮ')
imgui.Separator()
imgui.Text(u8'Повышено/понижено бойцов:')
imgui.Text(u8'Принято гражданских:')
imgui.Text(u8'Уволено бойцов:')
imgui.EndChild()
end
imgui.End()
end)
function sms(message)
sampAddChatMessage(('{008D00}%s{FFFFFF} %s'):format(script_name, message), 0x008D00)
end
function theme()
imgui.SwitchContext()
local style = imgui.GetStyle()
local colors = style.Colors
local clr = imgui.Col
local ImVec4 = imgui.ImVec4
local ImVec2 = imgui.ImVec2
style.WindowRounding = 4.0
style.WindowTitleAlign = ImVec2(0.5, 0.5)
style.ChildRounding = 2.0
style.FrameRounding = 4.0
style.ItemSpacing = ImVec2(10, 5)
style.ScrollbarSize = 15
style.ScrollbarRounding = 0
style.GrabMinSize = 9.6
style.GrabRounding = 1.0
style.WindowPadding = ImVec2(10, 10)
style.AntiAliasedLines = true
style.FramePadding = ImVec2(5, 4)
style.DisplayWindowPadding = ImVec2(27, 27)
style.DisplaySafeAreaPadding = ImVec2(5, 5)
style.ButtonTextAlign = ImVec2(0.5, 0.5)
style.IndentSpacing = 12.0
style.Alpha = 1.0
colors[clr.Text] = ImVec4(1.00, 1.00, 1.00, 1.00)
colors[clr.TextDisabled] = ImVec4(0.50, 0.50, 0.50, 1.00)
colors[clr.WindowBg] = ImVec4(0.06, 0.06, 0.06, 0.94)
colors[clr.ChildBg] = ImVec4(0.00, 0.00, 0.00, 0.00)
colors[clr.PopupBg] = ImVec4(0.08, 0.08, 0.08, 0.94)
colors[clr.Border] = ImVec4(0.43, 0.43, 0.50, 0.50)
colors[clr.BorderShadow] = ImVec4(0.00, 0.00, 0.00, 0.00)
colors[clr.FrameBg] = ImVec4(0.44, 0.44, 0.44, 0.60)
colors[clr.FrameBgHovered] = ImVec4(0.57, 0.57, 0.57, 0.70)
colors[clr.FrameBgActive] = ImVec4(0.76, 0.76, 0.76, 0.80)
colors[clr.TitleBg] = ImVec4(0.04, 0.04, 0.04, 1.00)
colors[clr.TitleBgActive] = ImVec4(0.16, 0.16, 0.16, 1.00)
colors[clr.TitleBgCollapsed] = ImVec4(0.00, 0.00, 0.00, 0.60)
colors[clr.MenuBarBg] = ImVec4(0.14, 0.14, 0.14, 1.00)
colors[clr.ScrollbarBg] = ImVec4(0.02, 0.02, 0.02, 0.53)
colors[clr.ScrollbarGrab] = ImVec4(0.31, 0.31, 0.31, 1.00)
colors[clr.ScrollbarGrabHovered] = ImVec4(0.41, 0.41, 0.41, 1.00)
colors[clr.ScrollbarGrabActive] = ImVec4(0.51, 0.51, 0.51, 1.00)
colors[clr.CheckMark] = ImVec4(0.13, 0.75, 0.55, 0.80)
colors[clr.SliderGrab] = ImVec4(0.13, 0.75, 0.75, 0.80)
colors[clr.SliderGrabActive] = ImVec4(0.13, 0.75, 1.00, 0.80)
colors[clr.Button] = ImVec4(0.13, 0.75, 0.55, 0.40)
colors[clr.ButtonHovered] = ImVec4(0.13, 0.75, 0.75, 0.60)
colors[clr.ButtonActive] = ImVec4(0.13, 0.75, 1.00, 0.80)
colors[clr.Header] = ImVec4(0.13, 0.75, 0.55, 0.40)
colors[clr.HeaderHovered] = ImVec4(0.13, 0.75, 0.75, 0.60)
colors[clr.HeaderActive] = ImVec4(0.13, 0.75, 1.00, 0.80)
colors[clr.Separator] = ImVec4(0.13, 0.75, 0.55, 0.40)
colors[clr.SeparatorHovered] = ImVec4(0.13, 0.75, 0.75, 0.60)
colors[clr.SeparatorActive] = ImVec4(0.13, 0.75, 1.00, 0.80)
colors[clr.ResizeGrip] = ImVec4(0.13, 0.75, 0.55, 0.40)
colors[clr.ResizeGripHovered] = ImVec4(0.13, 0.75, 0.75, 0.60)
colors[clr.ResizeGripActive] = ImVec4(0.13, 0.75, 1.00, 0.80)
colors[clr.PlotLines] = ImVec4(0.61, 0.61, 0.61, 1.00)
colors[clr.PlotLinesHovered] = ImVec4(1.00, 0.43, 0.35, 1.00)
colors[clr.PlotHistogram] = ImVec4(0.90, 0.70, 0.00, 1.00)
colors[clr.PlotHistogramHovered] = ImVec4(1.00, 0.60, 0.00, 1.00)
colors[clr.TextSelectedBg] = ImVec4(0.26, 0.59, 0.98, 0.35)
colors[clr.ModalWindowDimBg] = ImVec4(0.80, 0.80, 0.80, 0.35)
end
function imgui.CenterText(text)
imgui.SetCursorPosX(imgui.GetWindowWidth()/2-imgui.CalcTextSize(u8(text)).x/2)
imgui.Text(u8(text))
end
function imgui.CenterTextDisabled(text)
imgui.SetCursorPosX(imgui.GetWindowWidth()/2-imgui.CalcTextSize(u8(text)).x/2)
imgui.TextDisabled(u8(text))
end
function updatePlayTime()
local currentTime = os.time()
local timeSpent = currentTime - lastCheckTime
local currentDate = os.date("*t")
playTime[currentDate.wday] = playTime[currentDate.wday] + timeSpent
lastCheckTime = currentTime
end
function resetPlayTime()
playTime = {0, 0, 0, 0, 0, 0, 0}
end
function formatTime(seconds)
local hours = math.floor(seconds / 3600)
local minutes = math.floor((seconds % 3600) / 60)
local seconds = seconds % 60
return string.format("%02d:%02d:%02d", hours, minutes, seconds)
end
function checkNewDay()
local currentDate = os.date("*t")
if currentDate.wday == 1 and currentDate.hour == 0 and currentDate.min == 0 and currentDate.sec == 0 then
resetPlayTime()
end
if currentDate.day ~= lastDay then lastDay = currentDate.day end
end
function checkNicknameAndGetDetails(game_username)
local https = require("ssl.https")
local ltn12 = require("ltn12")
local cjson = require("cjson")
local API_KEY = "-"
local SHEET_ID = "-"
local RANGE = "Sheet1!A1:C9"
local url = string.format("-", SHEET_ID, RANGE, API_KEY)
local response_body = {}
local res, code, response_headers = https.request{ url = url, method = "GET", sink = ltn12.sink.table(response_body) }
if code == 200 then
local data = table.concat(response_body)
local parsed_data = cjson.decode(data)
local nick_found = false
local title = nil
local position = nil
for i, row in ipairs(parsed_data.values) do
if row[1] == game_username then
nick_found = true
title = row[2]
position = row[3]
ranks[game_username] = row[2]
positions[game_username] = row[3]
break
end
end
if nick_found then
sms("Загружено как: " .. u8:decode(title) .. ' ' .. game_username .. ", " .. u8:decode(position))
sms("Открыть меню: /am | Активация на кнопку в разработке, приятной игры.")
else
sms("У вас нет доступа к скрипту, для получения доступа свяжитесь с генералом.")
sms("VK: -, Samp-Rp Forum: -. Скрипт отключён.")
thisScript():unload()
end
else
print("Ошибка при выполнении запроса: ", code)
print("Сообщение об ошибке: ", table.concat(response_body))
return false
end
end
Может и говнокод, но что есть. По возможности подскажите ещё пожалуйста как сделать чтобы каждый день сохранялось время активности.