mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-15 21:03:46 +03:00
289 lines
5.9 KiB
Lua
289 lines
5.9 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 istable, isstring = sam.istable, sam.isstring
|
|
|
|
local commands = {}
|
|
local arguments = {}
|
|
|
|
do
|
|
local command = {}
|
|
|
|
local current_category = "other"
|
|
function command.set_category(category)
|
|
if isstring(category) then
|
|
current_category = category
|
|
end
|
|
end
|
|
|
|
function command.get_commands()
|
|
return commands
|
|
end
|
|
|
|
function command.get_command(name)
|
|
for i = 1, #commands do
|
|
local cmd = commands[i]
|
|
if cmd.name == name then
|
|
return cmd, i
|
|
end
|
|
|
|
local aliases = cmd.aliases
|
|
for i2 = 1, #aliases do
|
|
local alias = aliases[i2]
|
|
if alias == name then
|
|
return cmd, i
|
|
end
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function command.remove_command(name)
|
|
local cmd, index = command.get_command(name)
|
|
if index then
|
|
table.remove(commands, index)
|
|
hook.Call("SAM.CommandRemoved", nil, cmd.name, cmd, index)
|
|
return index
|
|
end
|
|
return false
|
|
end
|
|
|
|
function command.get_arguments()
|
|
return arguments
|
|
end
|
|
|
|
do
|
|
local argument_methods = {
|
|
OnExecute = function(self, func)
|
|
if isfunction(func) and SERVER then
|
|
self.on_execute = func
|
|
end
|
|
return self
|
|
end,
|
|
Menu = function(self, func)
|
|
if isfunction(func) and CLIENT then
|
|
self.menu = func
|
|
end
|
|
return self
|
|
end,
|
|
AutoComplete = function(self, func)
|
|
if isfunction(func) and CLIENT then
|
|
self.auto_complete = func
|
|
end
|
|
return self
|
|
end,
|
|
End = function(self)
|
|
if SERVER then
|
|
arguments[self.name] = self.on_execute
|
|
else
|
|
arguments[self.name] = self
|
|
end
|
|
end
|
|
}
|
|
|
|
local argument_meta = {__index = argument_methods}
|
|
function command.new_argument(name)
|
|
if isstring(name) then
|
|
return setmetatable({name = name}, argument_meta)
|
|
end
|
|
end
|
|
end
|
|
|
|
if CLIENT then
|
|
function command.run_commands(to_run)
|
|
local time = 0
|
|
for i = 1, #to_run do
|
|
timer.Simple(time, function()
|
|
RunConsoleCommand("sam", unpack(to_run[i]))
|
|
end)
|
|
time = time + 0.76
|
|
end
|
|
end
|
|
end
|
|
|
|
--
|
|
-- Methods
|
|
--
|
|
local Command_Methods = {}
|
|
local Command_meta = {__index = Command_Methods}
|
|
|
|
function command.new(cmd)
|
|
if not isstring(cmd) then return end
|
|
|
|
local new_command = setmetatable({}, Command_meta)
|
|
new_command.can_console_run = true
|
|
new_command.args = {}
|
|
new_command.name = cmd:lower()
|
|
new_command.aliases = {}
|
|
new_command.category = current_category
|
|
|
|
return new_command
|
|
end
|
|
|
|
local AddMethod = function(name, func)
|
|
Command_Methods[name] = func
|
|
end
|
|
|
|
AddMethod("Aliases", function(self, ...)
|
|
for k, v in ipairs({...}) do
|
|
table.insert(self.aliases, v)
|
|
end
|
|
return self
|
|
end)
|
|
|
|
AddMethod("AddArg", function(self, name, data)
|
|
if not isstring(name) then return end
|
|
if not istable(data) then
|
|
data = {}
|
|
end
|
|
data.name = name
|
|
table.insert(self.args, data)
|
|
return self
|
|
end)
|
|
|
|
AddMethod("DisallowConsole", function(self, disallow)
|
|
self.can_console_run = isbool(disallow) and disallow or false
|
|
return self
|
|
end)
|
|
|
|
AddMethod("SetCategory", function(self, category)
|
|
if isstring(category) then
|
|
self.category = category
|
|
end
|
|
return self
|
|
end)
|
|
|
|
AddMethod("Help", function(self, help)
|
|
if isstring(help) then
|
|
self.help = sam.language.get(help) or help
|
|
end
|
|
return self
|
|
end)
|
|
|
|
AddMethod("OnExecute", function(self, func)
|
|
if isfunction(func) and SERVER then
|
|
self.on_execute = func
|
|
end
|
|
return self
|
|
end)
|
|
|
|
AddMethod("SetPermission", function(self, perm, default_rank)
|
|
if isstring(perm) then
|
|
self.permission = perm
|
|
self.default_rank = default_rank
|
|
end
|
|
return self
|
|
end)
|
|
|
|
AddMethod("GetRestArgs", function(self, get)
|
|
if not isbool(get) then
|
|
get = true
|
|
end
|
|
self.get_rest_args = get
|
|
return self
|
|
end)
|
|
|
|
AddMethod("MenuHide", function(self, should_hide)
|
|
if isbool(should_hide) then
|
|
self.menu_hide = should_hide
|
|
else
|
|
self.menu_hide = true
|
|
end
|
|
return self
|
|
end)
|
|
|
|
AddMethod("DisableNotify", function(self, disable)
|
|
if isbool(disable) then
|
|
self.disable_notify = disable
|
|
else
|
|
self.disable_notify = true
|
|
end
|
|
return self
|
|
end)
|
|
|
|
AddMethod("End", function(self)
|
|
local name = self.name
|
|
if SERVER and not self.on_execute then
|
|
sam.print("need an OnExecute function for the command!")
|
|
debug.Trace()
|
|
return
|
|
end
|
|
|
|
if self.permission then
|
|
sam.permissions.add(self.permission, "Commands - " .. self.category, self.default_rank)
|
|
end
|
|
|
|
local _, index = command.get_command(name)
|
|
if index then
|
|
commands[index] = self
|
|
hook.Call("SAM.CommandModified", nil, name, self, index)
|
|
else
|
|
hook.Call("SAM.CommandAdded", nil, name, self, table.insert(commands, self))
|
|
end
|
|
end)
|
|
|
|
AddMethod("GetRequiredArgs", function(self)
|
|
local required_args = {}
|
|
local args = self.args
|
|
for i = 1, #args do
|
|
local v = args[i]
|
|
if not v.optional then
|
|
table.insert(required_args, v)
|
|
end
|
|
end
|
|
return required_args
|
|
end)
|
|
|
|
AddMethod("GetOptionalArgs", function(self)
|
|
local optional_args = {}
|
|
local args = self.args
|
|
for i = 1, #args do
|
|
local v = args[i]
|
|
if v.optional then
|
|
table.insert(optional_args, v)
|
|
end
|
|
end
|
|
return optional_args
|
|
end)
|
|
|
|
AddMethod("ArgsToString", function(self, return_table)
|
|
local str_table = {}
|
|
local args = self.args
|
|
for i = 1, #self.args do
|
|
local v = args[i]
|
|
if not v.optional then
|
|
table.insert(str_table, "<" .. (v.hint or v.name) .. ">")
|
|
else
|
|
table.insert(str_table, "[" .. (v.hint or v.name) .. "]")
|
|
end
|
|
end
|
|
return return_table and str_table or table.concat(str_table, " ")
|
|
end)
|
|
|
|
AddMethod("HasArg", function(self, arg)
|
|
local args = self.args
|
|
for i = 1, #self.args do
|
|
if args[i].name == arg then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end)
|
|
|
|
command.add_method = AddMethod
|
|
|
|
sam.command = command
|
|
end
|
|
|
|
sam.__commands = commands
|
|
sam.__arguments = arguments |