Files
VnUtest/garrysmod/gamemodes/militaryrp/plugins/salary/sv_plugin.lua
2026-03-31 10:27:04 +03:00

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