local PLUGIN = PLUGIN

local tick = 0

function SWEP:InitTimers()
  self.ActiveTimers = {} -- { { time, id, func } }
end

function SWEP:SetTimer(time, callback, id)
  if not IsFirstTimePredicted() then return end

  table.insert(self.ActiveTimers, { time + CurTime(), id or "", callback })
end

function SWEP:TimerExists(id)
  for _, v in pairs(self.ActiveTimers) do
    if v[2] == id then return true end
  end

  return false
end

function SWEP:KillTimer(id)
  local keeptimers = {}

  for _, v in pairs(self.ActiveTimers) do
    if v[2] ~= id then table.insert(keeptimers, v) end
  end

  self.ActiveTimers = keeptimers
end

function SWEP:KillTimers()
  self.ActiveTimers = {}
end

function SWEP:ProcessTimers()
  local keeptimers, UCT = {}, CurTime()

  if CLIENT and UCT == tick then return end

  if not self.ActiveTimers then self:InitTimers() end

  for _, v in pairs(self.ActiveTimers) do
    if v[1] <= UCT then v[3]() end
  end

  for _, v in pairs(self.ActiveTimers) do
    if v[1] > UCT then table.insert(keeptimers, v) end
  end

  self.ActiveTimers = keeptimers
end
