Донат промо

как сделать донат промокод условно /start на любые деньги, нужно чтоб игрок отыграл 1 час, после этого сможет ввести, после каждого /start будет писаться сколько время осталось
/start Промокод можно будет использовать только через 1 час.
/start Промокод можно будет использовать только через 20 минут и т.д

-- sv_promocodes.lua

local PromoSystem = {}
PromoSystem.Codes = {}

function PromoSystem:AddCode(command, money, igs, maxUses, minTime)
    local cmdKey = "/" .. string.lower(command)
    
    self.Codes[cmdKey] = {
        money = money,
        igs     = igs,
        maxUses = maxUses or 999999,
        minTime = minTime or 0
    }
end


-- PromoSystem:AddCode("название промо", игровая валюта, донат валюта, кл-во активаций(если вписать ноль то активировать смогут все), наигранное время в секундах)
PromoSystem:AddCode("bonus", 50000, 5000, 100, 3600)

hook.Add("Initialize", "PromoSystem_InitDB", function()
    if not sql.TableExists("darkrp_promo_logs") then
        sql.Query("CREATE TABLE darkrp_promo_logs (steamid TEXT, code TEXT)")
    end
    
    if not sql.TableExists("darkrp_promo_counts") then
        sql.Query("CREATE TABLE darkrp_promo_counts (code TEXT PRIMARY KEY, uses INTEGER)")
    end
end)

hook.Add("PlayerSay", "PromoSystem_Handler", function(ply, text)
    local cleanText = string.lower(string.Trim(text))
    
    local codeData = PromoSystem.Codes[cleanText]
    
    if codeData then
        local steamID = ply:SteamID()
        local codeKey = cleanText 

        if codeData.minTime > 0 then
            if ply.GetUTimeTotalTime then
                local playedTime = ply:GetUTimeTotalTime()
                if playedTime < codeData.minTime then
                    local timeLeft = math.ceil((codeData.minTime - playedTime) / 60)
                    DarkRP.notify(ply, 1, 4, "Нужно отыграть еще " .. timeLeft .. " мин. для активации!")
                    return ""
                end
            end
        end

        local usedCheck = sql.QueryValue("SELECT code FROM darkrp_promo_logs WHERE steamid = " .. sql.SQLStr(steamID) .. " AND code = " .. sql.SQLStr(codeKey))
        
        if usedCheck then
            DarkRP.notify(ply, 1, 4, "Вы уже активировали этот промокод!")
            return ""
        end

        if codeData.maxUses > 0 then
            local globalUses = tonumber(sql.QueryValue("SELECT uses FROM darkrp_promo_counts WHERE code = " .. sql.SQLStr(codeKey))) or 0
            
            if globalUses >= codeData.maxUses then
                DarkRP.notify(ply, 1, 4, "Этот промокод закончился!")
                return ""
            end
        end

        sql.Query("INSERT INTO darkrp_promo_logs (steamid, code) VALUES(" .. sql.SQLStr(steamID) .. ", " .. sql.SQLStr(codeKey) .. ")")
        
        local exists = sql.QueryValue("SELECT uses FROM darkrp_promo_counts WHERE code = " .. sql.SQLStr(codeKey))
        if exists then
            sql.Query("UPDATE darkrp_promo_counts SET uses = uses + 1 WHERE code = " .. sql.SQLStr(codeKey))
        else
            sql.Query("INSERT INTO darkrp_promo_counts (code, uses) VALUES(" .. sql.SQLStr(codeKey) .. ", 1)")
        end

        ply:addMoney(codeData.money)
        ply:AddIGSFunds(codeData.igs, 'С промокода: ' .. cleanText)
        --print("игрок" .. ply:Name() .. "использовал промокод ".. cleanText)
        DarkRP.notify(ply, 0, 5, "Вы активировали промокод и получили " .. DarkRP.formatMoney(codeData.money) .. " и ".. IGS.SignPrice(codeData.igs))
        return ""
    end
end)

создай в любом lua/autorun/server файл с названием sv_promo и закинь туда

я зашел, нажал /start, он дал мне деньги, но час не прошел, или он уже знает что я отыграл больше часа?

У тебя стоит Utime? Если да то попробуй его сбросить и проверить ещё раз

Что за утиме?

Он так же вшит в админку SAM, если у тебя стоит SAM то очисти в базе данных таблицу sam_players (либо удали sv.db, но если знаешь как открывать бд SQL то очисти просто)

Всё работает

image

image

понял спасибо