Files
wnsrc/gamemodes/helix/plugins/tempflags.lua
lifestorm df294d03aa Upload
2024-08-04 23:54:45 +03:00

294 lines
9.5 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local PLUGIN = PLUGIN
PLUGIN.name = "Temporary Flags"
PLUGIN.author = "Gr4Ss"
PLUGIN.description = "Allows temporary flags to be given to characters or players. Based on SleepyMode's Player Flags plugin."
CAMI.RegisterPrivilege({
Name = "Helix - Manage Temp Flags",
MinAccess = "admin"
})
ix.lang.AddTable("english", {
cmdCharGiveTempFlags = "Bir karaktere geçici flagler verin. Zaman dakika cinsinden belirtilmiştir.",
cmdCharExtendTempFlags = "Bir karakterin mevcut geçici flaglerini uzatın (veya azaltın). Belirtilen süre sonunda sona erecektir.",
flagTempGiveTitle = "Geçici flagler Ver",
flagTempGive = "%s, %s'e '%s' flaglerini %d dakika için verdi.",
flagAlreadyGiven = "%s zaten '%s' flaglerına sahip, veya bu flagler mevcut değil.",
cmdCharTakeTempFlags = "Bir karakterden geçici flagleri alın.",
flagAlreadyTaken = "%s, '%s' flaglerine sahip değil.",
flagTempTake = "%s, %s'den '%s' geçici flaglerini aldı.",
cmdCharClearTempFlag = "Bir karakterden tüm geçici flaglerı alın.",
flagNoClear = "%s'in herhangi bir geçici bayrağı yok.",
flagExpired = "%s'in geçici '%s' flagleri süresi doldu.",
flagExpireWarn = "Geçici '%s' flagleriniz 5 dakika içinde süresi dolacak."
})
ix.lang.AddTable("spanish", {
cmdCharGiveTempFlags = "Da permisos temporales a un personaje. Tiempo especificado en minutos.",
flagTempGive = "%s ha dado &s '%s' permisos por %d minutos.",
flagTempGiveTitle = "Dar Permisos Temporales",
cmdCharExtendTempFlags = "Extiende (o reduce) los permisos temporales de un personaje. Se acabarán después de la cantidad de tiempo.",
cmdCharTakeTempFlags = "Quita los permisos temporales de un personaje.",
flagTempTake = "%s ha quitado los permisos temporales '%s' de %s.",
flagAlreadyTaken = "%s no tiene los permisos '%s'.",
flagNoClear = "%s no tiene ningún permiso temporal.",
cmdCharClearTempFlag = "Quita todos los permisos temporales de un personaje.",
flagExpireWarn = "Tus permisos temporales '%s' expirarán en 5 minutos.",
flagAlreadyGiven = "%s ya tiene los permisos '%s', o estos permisos no existen.",
flagExpired = "Los permisos de %s de tipo '%s' han expirado."
})
ix.config.Add("TempFlagsRemoveOnCharSwap", true, "Should all temporary flags be removed when a player changes character.", nil, {category = "administration"})
function PLUGIN:CharacterHasFlags(character, flags)
local client = character:GetPlayer()
if (!IsValid(client)) then return end
local tempFlags = client:GetLocalVar("tempFlags")
if (!tempFlags) then return end
for i = 1, #flags do
if (tempFlags[flags[i]] and tempFlags[flags[i]] > os.time()) then
return true
end
end
end
if (SERVER) then
function PLUGIN:InitializedPlugins()
timer.Create("ixTempFlags", 61, 0, function()
local time = os.time()
local players = player.GetAll()
for _, client in ipairs(players) do
local flags = client:GetLocalVar("tempFlags")
if (!flags) then continue end
local expired = ""
local warn = ""
for flag, expire in pairs(flags) do
if (expire < time) then
flags[flag] = nil
expired = expired..flag
local info = ix.flag.list[flag]
if (!info or !info.callback or client:GetCharacter():HasFlags(flag)) then continue end
info.callback(client, false)
elseif (expire - 300 >= time and expire - 361 < time) then
warn = warn..flag
end
end
if (warn != "") then
client:NotifyLocalized("flagExpireWarn", warn)
end
if (expired == "") then continue end
for _, v in ipairs(players) do
if (CAMI.PlayerHasAccess(v, "Helix - Manage Temp Flags") or v == client) then
v:NotifyLocalized("flagExpired", client:SteamName(), expired)
end
end
if (table.IsEmpty(flags)) then
client:SetLocalVar("tempFlags", nil)
else
client:SetLocalVar("tempFlags", flags)
end
end
end)
end
end
function PLUGIN:PostPlayerLoadout(client)
if (ix.config.Get("TempFlagsRemoveOnCharSwap")) then
client:SetLocalVar("tempFlags", nil)
return
end
local tempFlags = client:GetLocalVar("tempFlags", {})
for flag in pairs(tempFlags) do
local info = ix.flag.list[flag]
if (info and info.callback) then
info.callback(client, true)
end
end
end
ix.command.Add("CharGiveTempFlags", {
description = "@cmdCharGiveTempFlags",
privilege = "Manage Temp Flags",
arguments = {
ix.type.player,
ix.type.string,
ix.type.number
},
argumentNames = {"target", "flags", "time (10 to 120)"},
OnRun = function(self, client, target, toGive, time)
local flags = target:GetLocalVar("tempFlags", {})
local newTime = os.time() + math.Clamp(math.floor(time), 10, 120) * 60
local character = target:GetCharacter()
local given = ""
for i = 1, #toGive do
local flag = toGive[i]
local info = ix.flag.list[flag]
if (!info) then continue end
if (!flags[flag] and character:HasFlags(flag)) then continue end
flags[flag] = newTime
given = given..flag
if (info.callback) then
info.callback(target, true)
end
end
if (given == "") then
client:NotifyLocalized("flagAlreadyGiven", target:SteamName(), toGive)
return
end
target:SetLocalVar("tempFlags", flags)
for _, v in ipairs(player.GetAll()) do
if (self:OnCheckAccess(v) or v == target) then
v:NotifyLocalized("flagTempGive", client:SteamName(), target:SteamName(), given, math.Clamp(math.floor(time), 10, 120))
end
end
end
})
ix.command.Add("CharExtendTempFlags", {
description = "@cmdCharExtendTempFlags",
privilege = "Manage Temp Flags",
arguments = {
ix.type.player,
ix.type.number
},
argumentNames = {"target", "time (10 to 120)"},
OnRun = function(self, client, target, time)
local flags = target:GetLocalVar("tempFlags", {})
local newTime = os.time() + math.Clamp(math.floor(time), 10, 120) * 60
local given = ""
for flag in pairs(flags) do
flags[flag] = newTime
given = given..flag
end
if (given == "") then
client:NotifyLocalized("flagNoClear", target:SteamName())
return
end
target:SetLocalVar("tempFlags", flags)
for _, v in ipairs(player.GetAll()) do
if (self:OnCheckAccess(v) or v == target) then
v:NotifyLocalized("flagTempGive", client:SteamName(), target:SteamName(), given, math.Clamp(math.floor(time), 10, 120))
end
end
end
})
ix.command.Add("CharTakeTempFlag", {
description = "@cmdCharTakeTempFlags",
privilege = "Manage Temp Flags",
arguments = {
ix.type.player,
ix.type.string
},
OnRun = function(self, client, target, toTake)
local flags = target:GetLocalVar("tempFlags")
if (!flags) then
client:NotifyLocalized("flagNoClear", target:SteamName())
return
end
local character = target:GetCharacter()
local taken = ""
for i = 1, #toTake do
local flag = toTake[i]
local info = ix.flag.list[flag]
if (!info) then continue end
if (!flags[flag]) then continue end
flags[flag] = nil
taken = taken..flag
if (info.callback and !character:HasFlags(flag)) then
info.callback(target, false)
end
end
if (!table.IsEmpty(flags)) then
target:SetLocalVar("tempFlags", flags)
else
target:SetLocalVar("tempFlags", nil)
end
if (taken == "") then
client:NotifyLocalized("flagAlreadyTaken", target:SteamName(), toTake)
return
end
for _, v in ipairs(player.GetAll()) do
if (self:OnCheckAccess(v) or v == target) then
v:NotifyLocalized("flagTempTake", client:SteamName(), taken, target:SteamName())
end
end
end
})
ix.command.Add("CharClearTempFlag", {
description = "@cmdCharClearTempFlag",
privilege = "Manage Temp Flags",
arguments = {
ix.type.player,
},
OnRun = function(self, client, target)
local flags = target:GetLocalVar("tempFlags")
if (!flags) then
client:NotifyLocalized("flagNoClear", target:SteamName())
return
end
target:SetLocalVar("tempFlags", nil)
local character = target:GetCharacter()
local taken = ""
for flag in pairs(flags) do
taken = taken..flag
local info = ix.flag.list[flag]
if (info and info.callback and !character:HasFlags(flag)) then
info.callback(target, false)
end
end
if (taken == "") then
client:NotifyLocalized("flagNoClear", target:SteamName())
return
end
for _, v in ipairs(player.GetAll()) do
if (self:OnCheckAccess(v) or v == target) then
v:NotifyLocalized("flagTempTake", client:SteamName(), taken, target:SteamName())
end
end
end
})