83 lines
2.9 KiB
Lua
83 lines
2.9 KiB
Lua
local PLUGIN = PLUGIN
|
|
|
|
-- Tracking when the last salary "tick" happened to avoid double triggers within the same minute
|
|
PLUGIN.lastTickMinute = PLUGIN.lastTickMinute or -1
|
|
|
|
function PLUGIN:Tick()
|
|
local currentMinute = tonumber(os.date("%M"))
|
|
|
|
-- Check for 00 or 30 minutes
|
|
if (currentMinute == 0 or currentMinute == 30) then
|
|
if (PLUGIN.lastTickMinute != currentMinute) then
|
|
PLUGIN.lastTickMinute = currentMinute
|
|
self:DistributeSalary()
|
|
end
|
|
else
|
|
-- Reset the tick tracker when we are not in the target minute
|
|
if (PLUGIN.lastTickMinute != -1) then
|
|
PLUGIN.lastTickMinute = -1
|
|
end
|
|
end
|
|
end
|
|
|
|
function PLUGIN:OnCharacterLoaded(character)
|
|
-- Store the time the character was loaded/joined if not already set
|
|
-- This helps tracking playtime for the first salary
|
|
if (!character:GetData("salary_start_time")) then
|
|
character:SetData("salary_start_time", os.time())
|
|
end
|
|
end
|
|
|
|
function PLUGIN:DistributeSalary(bIgnorePlaytime)
|
|
local minPlaytime = ix.config.Get("salary_min_playtime", 30) * 60 -- convert to seconds
|
|
local salaryTable = ix.config.Get("salary_amounts", {})
|
|
local currentTime = os.time()
|
|
|
|
for _, client in ipairs(player.GetAll()) do
|
|
local character = client:GetCharacter()
|
|
if (!character) then continue end
|
|
|
|
local startTime = character:GetData("salary_start_time", currentTime)
|
|
local playtime = currentTime - startTime
|
|
|
|
if (bIgnorePlaytime or playtime >= minPlaytime) then
|
|
local rank = tonumber(character:GetRank()) or 1
|
|
|
|
-- Hardcoded fallback table in case config is empty or missing keys in database
|
|
local defaultSalaries = {
|
|
[1] = 500, [2] = 630, [3] = 760, [4] = 890, [5] = 1020,
|
|
[6] = 1150, [7] = 1280, [8] = 1410, [9] = 1540, [10] = 1670,
|
|
[11] = 1800, [12] = 1930, [13] = 2060, [14] = 2190, [15] = 2320, [16] = 2500
|
|
}
|
|
|
|
-- 1. Try to get value from config first
|
|
local amount = 0
|
|
for k, v in pairs(salaryTable) do
|
|
if (tonumber(k) == rank) then
|
|
amount = v
|
|
break
|
|
end
|
|
end
|
|
|
|
-- 2. If config has no data for this rank (or it's fallback 500 but not rank 1),
|
|
-- use the hardcoded table in code.
|
|
if (amount == 0 or (amount == 500 and rank != 1)) then
|
|
amount = defaultSalaries[rank] or defaultSalaries[1] or 500
|
|
end
|
|
|
|
character:GiveMoney(amount)
|
|
character:SetData("salary_start_time", currentTime) -- Reset timer for next salary
|
|
|
|
client:Notify("Вы получили зарплату в размере " .. ix.currency.Get(amount) .. " за вашу службу!")
|
|
else
|
|
local remaining = math.ceil((minPlaytime - playtime) / 60)
|
|
client:Notify("Вам не начислена зарплата, так как вы отыграли меньше " .. (minPlaytime / 60) .. " минут. Осталось: " .. remaining .. " мин.")
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Force reset salary start time on join just in case
|
|
function PLUGIN:PlayerLoadedCharacter(client, character, oldCharacter)
|
|
character:SetData("salary_start_time", os.time())
|
|
end
|