mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-15 21:03:46 +03:00
121 lines
2.7 KiB
Lua
121 lines
2.7 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, command = sam, sam.command
|
|
|
|
local cached_ranks = {}
|
|
local targeting_offline = {}
|
|
|
|
local check_steamid = function(steamid)
|
|
if not sam.is_steamid(steamid) then
|
|
if sam.is_steamid64(steamid) then
|
|
return util.SteamIDFrom64(steamid)
|
|
else
|
|
return nil
|
|
end
|
|
end
|
|
|
|
return steamid
|
|
end
|
|
|
|
local can_target_steamid_callback = function(data, promise)
|
|
local ply, steamid = promise.ply, promise.steamid
|
|
|
|
if not data or sam.ranks.can_target(promise.rank, data.rank) then
|
|
promise:resolve({steamid})
|
|
elseif IsValid(ply) then
|
|
ply:sam_send_message("cant_target_player", {
|
|
S = steamid
|
|
})
|
|
end
|
|
|
|
targeting_offline[ply] = nil
|
|
cached_ranks[steamid] = data ~= nil and data or false
|
|
end
|
|
|
|
command.new_argument("steamid")
|
|
:OnExecute(function(argument, input, ply, _, result, i)
|
|
local steamid = check_steamid(input)
|
|
if not steamid then
|
|
ply:sam_send_message("invalid", {
|
|
S = "steamid/steamid64", S_2 = input
|
|
})
|
|
return false
|
|
end
|
|
|
|
if argument.allow_higher_target then
|
|
result[i] = steamid
|
|
return
|
|
end
|
|
|
|
local promise = sam.Promise.new()
|
|
promise.ply = ply
|
|
promise.rank = ply:sam_getrank()
|
|
promise.steamid = steamid
|
|
|
|
local target = player.GetBySteamID(steamid)
|
|
if sam.isconsole(ply) then
|
|
promise:resolve({steamid})
|
|
elseif target then
|
|
if ply:CanTarget(target) then
|
|
promise:resolve({steamid, target})
|
|
else
|
|
ply:sam_send_message("cant_target_player", {
|
|
S = steamid
|
|
})
|
|
end
|
|
elseif cached_ranks[steamid] ~= nil then
|
|
can_target_steamid_callback(cached_ranks[steamid], promise)
|
|
else
|
|
targeting_offline[ply] = true
|
|
|
|
sam.SQL.FQuery([[
|
|
SELECT
|
|
`rank`
|
|
FROM
|
|
`sam_players`
|
|
WHERE
|
|
`steamid` = {1}
|
|
]], {steamid}, can_target_steamid_callback, true, promise)
|
|
end
|
|
|
|
result[i] = promise
|
|
end)
|
|
:Menu(function(set_result, body, buttons, argument)
|
|
local steamid_entry = buttons:Add("SAM.TextEntry")
|
|
steamid_entry:SetTall(25)
|
|
steamid_entry:SetUpdateOnType(true)
|
|
steamid_entry:SetPlaceholder("steamid/steamid64")
|
|
|
|
steamid_entry:SetCheck(function(steamid)
|
|
steamid = check_steamid(steamid)
|
|
set_result(steamid)
|
|
return steamid or false
|
|
end)
|
|
|
|
return steamid_entry
|
|
end)
|
|
:End()
|
|
|
|
timer.Create("SAM.ClearCachedRanks", 60 * 2.5, 0, function()
|
|
table.Empty(cached_ranks)
|
|
end)
|
|
|
|
hook.Add("SAM.ChangedSteamIDRank", "RemoveIfCached", function(steamid)
|
|
cached_ranks[steamid] = nil
|
|
end)
|
|
|
|
hook.Add("SAM.CanRunCommand", "StopIfTargetingOffline", function(ply)
|
|
if targeting_offline[ply] then
|
|
return false
|
|
end
|
|
end) |