Files
wnsrc/lua/sam/player/sh_player.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

183 lines
4.0 KiB
Lua

--[[
| 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/
--]]
if SAM_LOADED then return end
local sam = sam
local config = sam.config
do
local _player = {}
sam.player = setmetatable(sam.player, {
__index = _player,
__newindex = function(_, k, v)
_player[k] = v
if sam.isfunction(v) and debug.getlocal(v, 1) == "ply" then
FindMetaTable("Player")["sam_" .. k] = v
sam.console["sam_" .. k] = v
end
end
})
end
function sam.player.find_by_name(name)
name = name:lower()
local current, players = nil, player.GetAll()
for i = 1, #players do
local ply = players[i]
local found = ply:Name():lower():find(name, 1, true)
if found then
if current then
if not sam.istable(current) then
current = {current, ply}
else
table.insert(current, ply)
end
else
current = ply
end
end
end
return current
end
do
if CLIENT then
config.add_menu_setting("Chat Prefix (Leave empty for no prefix)", function()
local entry = vgui.Create("SAM.TextEntry")
entry:SetPlaceholder("")
entry:SetNoBar(true)
entry:SetConfig("ChatPrefix", "")
return entry
end)
end
function sam.player.send_message(ply, msg, tbl)
if SERVER then
if sam.isconsole(ply) then
local result = sam.format_message(msg, tbl)
sam.print(unpack(result, 1, result.__cnt))
else
return sam.netstream.Start(ply, "send_message", msg, tbl)
end
else
local prefix_result = sam.format_message(config.get("ChatPrefix", ""))
local prefix_n = #prefix_result
local result = sam.format_message(msg, tbl, prefix_result, prefix_n)
chat.AddText(unpack(result, 1, result.__cnt))
end
end
if SERVER then
function sam.player.add_text(ply, ...)
if sam.isconsole(ply) then
sam.print(...)
else
sam.netstream.Start(ply, "add_text", ...)
end
end
end
if CLIENT then
sam.netstream.Hook("send_message", function(msg, tbl)
sam.player.send_message(nil, msg, tbl)
end)
sam.netstream.Hook("add_text", function(...)
chat.AddText(...)
end)
end
end
do
local PLAYER = FindMetaTable("Player")
function PLAYER:IsAdmin()
return self:CheckGroup("admin")
end
function PLAYER:IsSuperAdmin()
return self:CheckGroup("superadmin")
end
local inherits_from = sam.ranks.inherits_from
function PLAYER:CheckGroup(name)
return inherits_from(self:sam_getrank(), name)
end
local has_permission = sam.ranks.has_permission
function PLAYER:HasPermission(perm)
return has_permission(self:sam_getrank(), perm)
end
local can_target = sam.ranks.can_target
function PLAYER:CanTarget(ply)
return can_target(self:sam_getrank(), ply:sam_getrank())
end
function PLAYER:CanTargetRank(rank)
return can_target(self:sam_getrank(), rank)
end
local get_ban_limit = sam.ranks.get_ban_limit
function PLAYER:GetBanLimit(ply)
return get_ban_limit(self:sam_getrank())
end
function PLAYER:sam_get_play_time()
return self:sam_get_nwvar("play_time", 0) + self:sam_get_session_time()
end
function PLAYER:sam_get_session_time()
return os.time() - self:sam_get_nwvar("join_time", 0)
end
function PLAYER:sam_getrank()
return self:sam_get_nwvar("rank", "user")
end
function PLAYER:sam_setrank(name)
return self:sam_set_nwvar("rank", name)
end
if SERVER then
function PLAYER:Ban(length)
self:sam_ban(length)
end
hook.Remove("PlayerInitialSpawn", "PlayerAuthSpawn")
end
end
do
local set_cooldown = function(ply, name, time)
if not ply.sam_cool_downs then
ply.sam_cool_downs = {}
end
ply.sam_cool_downs[name] = SysTime() + time
return true
end
function sam.player.check_cooldown(ply, name, time)
if not ply.sam_cool_downs or not ply.sam_cool_downs[name] then
return set_cooldown(ply, name, time)
end
local current_time = SysTime()
local cool_down = ply.sam_cool_downs[name]
if cool_down > current_time then
return false, cool_down - current_time
else
return set_cooldown(ply, name, time)
end
end
end