mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-15 21:03:46 +03:00
186 lines
4.4 KiB
Lua
186 lines
4.4 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 command = sam.command
|
|
|
|
local sub, match, lower = string.sub, string.match, string.lower
|
|
local WHITE, RED, BLUE, GREEN = Color(236, 240, 241), Color(244, 67, 54), Color(13, 130, 223), Color(0, 230, 64)
|
|
|
|
local prefix
|
|
local send_syntax = function(ply, args, cmd_name, cmd_args, cmd_args_n, from_console)
|
|
local tbl = {
|
|
WHITE,
|
|
from_console and "sam " or prefix,
|
|
cmd_name
|
|
}
|
|
|
|
for i = 1, cmd_args_n do
|
|
table.insert(tbl, " ")
|
|
|
|
local cmd_arg = cmd_args[i]
|
|
local arg = args[i]
|
|
|
|
if arg == "" then
|
|
arg = nil
|
|
end
|
|
|
|
local optional = cmd_arg.optional
|
|
local c_1, c_2 = "<", ">"
|
|
if optional then
|
|
c_1, c_2 = "[", "]"
|
|
end
|
|
|
|
table.insert(tbl, WHITE)
|
|
table.insert(tbl, arg and "\"" or c_1)
|
|
|
|
table.insert(tbl, cmd_arg.optional and BLUE or RED)
|
|
table.insert(tbl, arg or cmd_arg.hint or cmd_arg.name)
|
|
|
|
if not arg then
|
|
local default = cmd_arg.default
|
|
if default then
|
|
table.insert(tbl, WHITE)
|
|
table.insert(tbl, " = ")
|
|
|
|
table.insert(tbl, GREEN)
|
|
table.insert(tbl, tostring(default))
|
|
end
|
|
end
|
|
|
|
table.insert(tbl, WHITE)
|
|
table.insert(tbl, arg and "\"" or c_2)
|
|
end
|
|
|
|
sam.player.add_text(ply, unpack(tbl))
|
|
return ""
|
|
end
|
|
|
|
local run_command = function(ply, text, from_console)
|
|
local args = sam.parse_args(text)
|
|
local cmd_name = args[1]
|
|
if not cmd_name then return end
|
|
|
|
cmd_name = lower(cmd_name)
|
|
|
|
local cmd = command.get_command(cmd_name)
|
|
if not cmd then return end
|
|
|
|
if not cmd.can_console_run and sam.isconsole(ply) then
|
|
ply:sam_send_message("cant_use_as_console", {
|
|
S = cmd_name
|
|
})
|
|
return ""
|
|
end
|
|
|
|
if cmd.permission and not sam.isconsole(ply) and not ply:HasPermission(cmd.permission) then
|
|
ply:sam_send_message("no_permission", {
|
|
S = cmd_name
|
|
})
|
|
return ""
|
|
end
|
|
|
|
local can_run = hook.Call("SAM.CanRunCommand", nil, ply, cmd_name, args, cmd)
|
|
if can_run == false then return "" end
|
|
|
|
table.remove(args, 1)
|
|
|
|
local cmd_args = cmd.args
|
|
local cmd_args_n = #cmd_args
|
|
|
|
-- !kick srlion fuck off > !kick "srlion" "fuck off"
|
|
if cmd.get_rest_args then
|
|
local arg = table.concat(args, " ", cmd_args_n)
|
|
if arg ~= "" then
|
|
args[cmd_args_n] = arg
|
|
for i = cmd_args_n + 1, #args do
|
|
args[i] = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
-- we need to make sure that all required arguments are there
|
|
for i = 1, cmd_args_n do
|
|
if not cmd_args[i].optional then
|
|
local arg = args[i]
|
|
if arg == nil or arg == "" then
|
|
send_syntax(ply, args, cmd_name, cmd_args, cmd_args_n, from_console)
|
|
return ""
|
|
end
|
|
end
|
|
end
|
|
|
|
local result = {}
|
|
local args_count = 0
|
|
local arguments = command.get_arguments()
|
|
for i = 1, cmd_args_n do
|
|
local cmd_arg = cmd_args[i]
|
|
local arg = args[i]
|
|
|
|
if arg == nil or arg == "" then
|
|
arg = cmd_arg.default
|
|
else
|
|
args_count = args_count + 1
|
|
end
|
|
|
|
if arguments[cmd_arg.name](cmd_arg, arg, ply, cmd, result, i) == false then
|
|
return ""
|
|
end
|
|
end
|
|
|
|
cmd.on_execute(ply, unpack(result, 1, table.maxn(result)))
|
|
|
|
if not cmd.disable_notify then
|
|
sam.print(
|
|
RED, ply:Name(),
|
|
WHITE, "(",
|
|
BLUE, ply:SteamID(),
|
|
WHITE, ") ran command '",
|
|
RED, cmd_name,
|
|
WHITE,
|
|
args_count > 0
|
|
and "' with arguments: \"" .. table.concat(args, "\" \"") .. "\""
|
|
or "'"
|
|
)
|
|
end
|
|
|
|
hook.Call("SAM.RanCommand", nil, ply, cmd_name, args, cmd, result)
|
|
|
|
return ""
|
|
end
|
|
|
|
hook.Add("PlayerSay", "SAM.Command.RunCommand", function(ply, text)
|
|
prefix = sub(text, 1, 1)
|
|
if prefix ~= "!" then return end
|
|
if match(sub(text, 2, 2), "%S") == nil then return end
|
|
|
|
return run_command(ply, sub(text, 2), false)
|
|
end)
|
|
|
|
local console_run_command = function(ply, _, _, text)
|
|
if match(sub(text, 2, 2), "%S") == nil then return end
|
|
|
|
if not IsValid(ply) then
|
|
ply = sam.console
|
|
else
|
|
-- making it same as PlayerSay delay
|
|
-- https://github.com/ValveSoftware/source-sdk-2013/blob/0d8dceea4310fde5706b3ce1c70609d72a38efdf/sp/src/game/server/client.cpp#L747
|
|
-- no delay for server console
|
|
if not ply:sam_check_cooldown("RunCommand", 0.66) then
|
|
return
|
|
end
|
|
end
|
|
|
|
run_command(ply, text, true, false)
|
|
end
|
|
concommand.Add("sam", console_run_command)
|
|
concommand.Add("sam_run", console_run_command) -- for some dumb reason i cant make "sam" command clientside just for auto-complete |