помощь со скриптом

Joce

Участник
Автор темы
30
6
Версия MoonLoader
.026-beta
ку, написал скрипт, который проверяет, прошло ли кд повышения, чтобы повысить игрока на новый ранг. Но он не работает, уже попробовал много чего, может ошибка в логике работы или в синтаксисе скрипта, хз
Суть скрипта: вводится команда /grank id ранг, после чего открывается /checkjobprogress id и пишется команда /time, собирается инфа по последнем повышении игрока дата и время, также и с /time собирается инфа о дате и времени. Как инфа была собрана, то она проверяется, прошло ли кд для повышения допустим на 3 ранг (6 часов), если кд прошло то пишет /giverank id ранг, если нет то выдает ошибку
Text диалога:
Название: {BFBBBA}Успеваемость
Ид диалога: 0
Текст: {FFFFFF}Статистика успеваемости сотрудника {66FF6C}FBI{FFFFFF}: Resdf_Dedf
    1) Успешных арестов: {FFB323}0{FFFFFF}
    2) Обезвреживание бомбы: {FFB323}0{FFFFFF}
    3) Проведено обысков (на КПП): {FFB323}0{FFFFFF}
    4) Проверок документов: {FFB323}0{FFFFFF}
    5) Отправлено авто на штраф.стоянку: {FFB323}0{FFFFFF}

Статистика успеваемости за неделю:

    1) Успешных арестов: {F9FF23}0{FFFFFF}
    2) Обезвреживание бомбы: {F9FF23}0{FFFFFF}
    3) Проведено обысков (на КПП): {F9FF23}0{FFFFFF}
    4) Проверок документов: {F9FF23}0{FFFFFF}
    5) Отправлено авто на штраф.стоянку: {F9FF23}0{FFFFFF}

Статистика успеваемости за сегодня:

    1) Успешных арестов: {F9FF23}0{FFFFFF}
    2) Обезвреживание бомбы: {F9FF23}0{FFFFFF}
    3) Проведено обысков (на КПП): {F9FF23}0{FFFFFF}
    4) Проверок документов: {F9FF23}0{FFFFFF}
    5) Отправлено авто на штраф.стоянку: {F9FF23}0{FFFFFF}

Дата вступления в организацию:
{cccccc}15:39 15.07.2024{FFFFFF}
Последнее повышение:
 {cccccc}15.07.2024 15:39:22 (amember)

Сам скрипт:
script_properties('test')
require 'lib.moonloader'
local events = require 'lib.samp.events'

local monthMapping = {
    January = 1,
    February = 2,
    March = 3,
    April = 4,
    May = 5,
    June = 6,
    July = 7,
    August = 8,
    September = 9,
    October = 10,
    November = 11,
    December = 12
}

-- кд повышений на ранг
local cooldowns = {
    [3] = 6 * 60 * 60,   --6 часов
    [4] = 12 * 60 * 60,  --12 часов
    [5] = 24 * 60 * 60,  --24 часа
    [6] = 48 * 60 * 60,  --48 часов
    [7] = 72 * 60 * 60,  --72 часа
    [8] = 96 * 60 * 60,  --96 часов
    [9] = 120 * 60 * 60   --120 часов
}

local lastRankUpTime = {}
local currentId = 0  --ид
local pendingRankUp = nil  --инфа о повышении ранга
local currentTime = nil  -- текущее время в игре

function main()
    while not isSampAvailable() do
        wait(100)
    end

    sampRegisterChatCommand('grank', cmd_grank)

    while true do
        wait(0)
   
        if pendingRankUp and currentTime then
            local id, rank = pendingRankUp.id, pendingRankUp.rank

            --проверка даты и времени последнего повышения
            if lastRankUpTime[id] then
                local lastTime = lastRankUpTime[id]
                local timePassed = os.difftime(currentTime, os.time(lastTime))
                local cooldown = cooldowns[rank]

                if cooldown and timePassed >= cooldown then
                    sampSendChat(string.format("/giverank %d %d", id, rank))
                    sampAddChatMessage(string.format("Ранг %d был выдан игроку с ID %d.", rank, id), 0x8DFF18)
                else
                    local remainingTime = cooldown - timePassed
                    local hours = math.floor(remainingTime / 3600)
                    local minutes = math.floor((remainingTime % 3600) / 60)
                    sampAddChatMessage(string.format("Еще не прошло КД для повышения игрока на ранг %d. Ожидание: %d ч %d мин.", rank, hours, minutes), 0x8DFF18)
                end
            else
                sampAddChatMessage(string.format("Нет информации о последнем повышении для игрока с ID %d.", id), 0x8DFF18)
            end

            pendingRankUp = nil
        end
    end
end

function events.onShowDialog(dialogId, style, title, button1, button2, text)
    if title:find('Успеваемость') then
        local date = text:match('Последнее повышение:%s*{cccccc}(%d+%.%d+%.%d+ %d+:%d+:%d+)')
       
        if date then
            local year, month, day, hour, min = date:match('(%d+)%.(%d+)%.(%d+) (%d+):(%d+)')
            lastRankUpTime[currentId] = {
                year = tonumber(year),
                month = tonumber(month),
                day = tonumber(day),
                hour = tonumber(hour),
                min = tonumber(min),
                sec = 0
            }

            sampAddChatMessage(string.format("Последнее повышение игрока с ID %d: Дата: %s, Время: %s", currentId, date:sub(1, 10), date:sub(12, 16)), 0x8DFF18)
        else
            sampAddChatMessage("Не удалось получить дату из /checkjobprogress игрока: " .. text, 0x8DFF18)
        end
    end
end

function cmd_grank(param)
    local id, rank = param:match('(%d+) (%d+)')
    id = tonumber(id)
    rank = tonumber(rank)

    if id and rank then
        currentId = id  -- id из grank
        pendingRankUp = { id = id, rank = rank }

        sampSendChat(string.format("/checkjobprogress %d", id))
        sampSendChat("/time")
    else
        sampAddChatMessage("Используйте: /grank id ранг", 0x8DFF18)
    end
end

function events.onDisplayGameText(style, time, text)
    -- day - день, monthName = дата, hours = час, minutes = минуты
    local day, monthName, hours, minutes = text:match('~y~(%d+) ~y~(%a+)~n~~w~(%d+):(%d+)~n~ ~g~ Played ~w~%d+ min.')

    --месяца в числа
    local month = monthMapping[monthName]
    if day and month and hours and minutes then
        --преобразование даты
        local currentDate = os.date("*t")
        currentDate.day = tonumber(day)
        currentDate.month = month
        currentDate.hour = tonumber(hours)
        currentDate.min = tonumber(minutes)
        currentDate.sec = 0  -- Установим секунды в 0
        currentTime = os.time(currentDate)
        sampAddChatMessage(string.format("Текущее время: День: %s, Месяц: %d, Время: %02d:%02d", day, month, tonumber(hours), tonumber(minutes)), 0x8DFF18)
    else
        sampAddChatMessage("Не удалось извлечь данные c /time: " .. text, 0x8DFF18)
    end
end

@wojciech? Хелпани плиз

@ChаtGPT сможешь помочь?
 
Последнее редактирование:
  • Эм
Реакции: qdIbp

MrRazrab

Известный
472
237
Lua:
script_properties('test')
require 'lib.moonloader'
local events = require 'lib.samp.events'

local monthMapping = {
    January = 1, February = 2, March = 3, April = 4, May = 5, June = 6,
    July = 7, August = 8, September = 9, October = 10, November = 11, December = 12
}

-- кд повышений на ранг
local cooldowns = {
    [3] = 6 * 60 * 60,   --6 часов
    [4] = 12 * 60 * 60,  --12 часов
    [5] = 24 * 60 * 60,  --24 часа
    [6] = 48 * 60 * 60,  --48 часов
    [7] = 72 * 60 * 60,  --72 часа
    [8] = 96 * 60 * 60,  --96 часов
    [9] = 120 * 60 * 60   --120 часов
}

local lastRankUpTime = {}
local currentId = 0  --ид
local pendingRankUp = { id = 0, rank = 3 }
local currentTime = nil

function main()
    while not isSampAvailable() do
        wait(100)
    end

    sampRegisterChatCommand('grank', cmd_grank)

    while true do
        wait(0)
  
        if pendingRankUp and currentTime then
            local id, rank = pendingRankUp.id, pendingRankUp.rank

            if lastRankUpTime[id] then
                local lastTime = lastRankUpTime[id]
                local timePassed = os.difftime(currentTime, os.time(lastTime))
                local cooldown = cooldowns[rank]
                sampAddChatMessage(cooldown, 0x8DFF18)
                if cooldown and timePassed >= cooldown then
                    sampSendChat(string.format("/giverank %d %d", id, rank))
                    sampAddChatMessage(string.format("Ранг %d был выдан игроку с ID %d.", rank, id), 0x8DFF18)
                else
                    local remainingTime = cooldown - timePassed
                    local hours = math.floor(remainingTime / 3600)
                    local minutes = math.floor((remainingTime % 3600) / 60)
                    sampAddChatMessage(string.format("Еще не прошло КД для повышения игрока на ранг %d. Ожидание: %d ч %d мин.", rank, hours, minutes), 0x8DFF18)
                end
            else
                sampAddChatMessage(string.format("Нет информации о последнем повышении для игрока с ID %d.", id), 0x8DFF18)
            end

            pendingRankUp = nil
        end
    end
end

function events.onShowDialog(dialogId, style, title, button1, button2, text)
    if text:find('Последнее повышение') then
        local date = text:match('Последнее повышение:%s*{cccccc}(%d+%.%d+%.%d+ %d+:%d+:%d+)')
      
        if date then
            local year, month, day, hour, min, sec = date:match('(%d+)%.(%d+)%.(%d+) (%d+):(%d+):(%d+)')
            lastRankUpTime[currentId] = {
                year = tonumber(day),
                month = tonumber(month),
                day = tonumber(year),
                hour = tonumber(hour),
                min = tonumber(min),
                sec = tonumber(sec)
            }

            sampAddChatMessage(string.format("Последнее повышение игрока с ID %d: Дата: %s, Время: %s", currentId, date:sub(1, 10), date:sub(12, 16)), 0x8DFF18)
        else
            sampAddChatMessage("Не удалось получить дату из /checkjobprogress игрока: " .. text, 0x8DFF18)
        end
    end
end

function cmd_grank(param)
    local id, rank = param:match('(%d+) (%d+)')
    id = tonumber(id)
    rank = tonumber(rank)

    if id and rank then
        currentId = id
        pendingRankUp = { id = id, rank = rank }

        sampSendChat(string.format("/checkjobprogress %d", id))
        sampSendChat("/time")
    else
        sampAddChatMessage("Используйте: /grank id ранг", 0x8DFF18)
    end
end

function events.onDisplayGameText(style, time, text)
    local day, monthName, hours, minutes = text:match('~y~(%d+) ~y~(%a+)~n~~w~(%d+):(%d+)~n~ ~g~ Played ~w~%d+ min.')

    local month = monthMapping[monthName]
    if day and month and hours and minutes then
        local currentDate = os.date("*t")
        currentDate.day = tonumber(day)
        currentDate.month = month
        currentDate.hour = tonumber(hours)
        currentDate.min = tonumber(minutes)
        currentDate.sec = 0  -- Установим секунды в 0
        currentTime = os.time(currentDate)
        sampAddChatMessage(string.format("Текущее время: День: %s, Месяц: %d, Время: %02d:%02d", day, month, tonumber(hours), tonumber(minutes)), 0x8DFF18)
    else
        sampAddChatMessage("Не удалось извлечь данные c /time: " .. text, 0x8DFF18)
    end
end
Ты попутал year и day в onShowDialog