mirror of
https://git.minetest.land/MineClone2/MineClone2.git
synced 2024-12-05 01:03:44 +01:00
201 lines
4.7 KiB
Lua
201 lines
4.7 KiB
Lua
local S = minetest.get_translator(minetest.get_current_modname())
|
|
local C = minetest.colorize
|
|
|
|
--TODO: like mc error message
|
|
--TODO: complex command handling
|
|
--TODO: mc like help system
|
|
|
|
mcl_commands.types = {
|
|
bool = {
|
|
lengh = 1,
|
|
msg = S("Invalid boolean"),
|
|
func = function(word)
|
|
if word == "true" then
|
|
return true, true
|
|
elseif world == "false" then
|
|
return true, false
|
|
else
|
|
return false, nil
|
|
end
|
|
end,
|
|
},
|
|
int = {
|
|
lengh = 1,
|
|
msg = S("Invalid integer"),
|
|
func = function(int)
|
|
if tonumber(int) and tonumber(int) == math.round(int) then
|
|
return true, tonumber(int)
|
|
else
|
|
return false, nil
|
|
end
|
|
end,
|
|
},
|
|
float = {
|
|
lengh = 1,
|
|
msg = S("Invalid integer"),
|
|
func = function(float)
|
|
if tonumber(float) then
|
|
return true, tonumber(float)
|
|
else
|
|
return false, nil
|
|
end
|
|
end,
|
|
},
|
|
word = {
|
|
lengh = 1,
|
|
msg = S("Invalid word"),
|
|
func = function(word)
|
|
if word then
|
|
return true, word
|
|
else
|
|
return false, nil
|
|
end
|
|
end,
|
|
},
|
|
text = {},
|
|
pos = {
|
|
lengh = 3,
|
|
msg = S("Invalid position"),
|
|
func = function(x, y, z)
|
|
--FIXME
|
|
if true then
|
|
return true, nil
|
|
else
|
|
return false, nil
|
|
end
|
|
end,
|
|
},
|
|
target = {
|
|
lengh = 1,
|
|
msg = S("Invalid target selector"),
|
|
func = function(target)
|
|
--mcl_commands.get_target_selector(target_selector)
|
|
if minetest.player_exists(target) then
|
|
return true, target
|
|
else
|
|
return false, nil
|
|
end
|
|
end,
|
|
},
|
|
playername = {
|
|
lengh = 1,
|
|
msg = S("Invalid player name"),
|
|
func = function(name)
|
|
if minetest.player_exists(name) then
|
|
return true, name
|
|
else
|
|
return false, nil
|
|
end
|
|
end,
|
|
},
|
|
}
|
|
|
|
function mcl_commands.match_param(table, index, type, params)
|
|
local typedef = mcl_commands.types[type]
|
|
if typedef.lengh > 1 then
|
|
return
|
|
else
|
|
local params = {}
|
|
typedef.func()
|
|
end
|
|
end
|
|
|
|
mcl_commands.registered_commands = {}
|
|
|
|
function mcl_commands.register_complex_command()
|
|
end
|
|
|
|
--aims to avoid complexity for basic commands while keeping proper messages and privs management
|
|
function mcl_commands.register_basic_command(name, def)
|
|
local func
|
|
if def.params then
|
|
func = function(name, param)
|
|
local funcparams = {}
|
|
local i = 0
|
|
for str in string.gmatch(params, "([^ ]+)") do
|
|
i = i + 1
|
|
funcparams[i] = str
|
|
end
|
|
for _,type in pairs(def.params) do
|
|
mcl_commands.match_param(funcparams, index, type, params)
|
|
end
|
|
end
|
|
else
|
|
mcl_commands.registered_commands[name] = {type = "basic", description = def.desc, privs = def.privs}
|
|
func = function(name, param)
|
|
if param == "" then
|
|
local out, msg = def.func(name)
|
|
if out then
|
|
return true, C(mcl_colors.GRAY, msg) or C(mcl_colors.GRAY, S("succesful"))
|
|
else
|
|
return false, C(mcl_colors.RED, msg) or C(mcl_colors.RED, S("failed"))
|
|
end
|
|
else
|
|
return false, C(mcl_colors.RED, S("Invalid command usage"))
|
|
end
|
|
end
|
|
end
|
|
minetest.register_chatcommand(name, {
|
|
description = def.desc,
|
|
privs = def.privs,
|
|
func = func,
|
|
})
|
|
end
|
|
|
|
--[[
|
|
mcl_commands.register_basic_command("test", {
|
|
description = S("testing command"),
|
|
params = nil,
|
|
func = function(name)
|
|
end,
|
|
})
|
|
]]
|
|
|
|
mcl_commands.register_basic_command("testb", {
|
|
description = S("testing command"),
|
|
params = {
|
|
{type="bool"},
|
|
{type="int", params={min=1, max=10}}
|
|
},
|
|
func = function(name, bool, int)
|
|
return true, "test: "..int
|
|
end,
|
|
})
|
|
|
|
function mcl_commands.alias_command(alias, original_name, bypass_setting)
|
|
if minetest.settings:get_bool("mcl_builtin_commands_overide", true) or bypass_setting then
|
|
local def = minetest.registered_chatcommands[original_name]
|
|
minetest.register_chatcommand(alias, def)
|
|
minetest.log("action", string.format("[mcl_commands] Aliasing [%s] command to [%s]", original_name, alias))
|
|
else
|
|
minetest.log("action", string.format("[mcl_commands] Aliasing [%s] command to [%s] skipped according to setting", original_name, alias))
|
|
end
|
|
end
|
|
|
|
function mcl_commands.rename_command(new_name, original_name, bypass_setting)
|
|
if minetest.settings:get_bool("mcl_builtin_commands_overide", true) or bypass_setting then
|
|
local def = minetest.registered_chatcommands[original_name]
|
|
minetest.register_chatcommand(new_name, def)
|
|
minetest.unregister_chatcommand(original_name)
|
|
minetest.log("action", string.format("[mcl_commands] Renaming [%s] command to [%s]", original_name, new_name))
|
|
else
|
|
minetest.log("action", string.format("[mcl_commands] Renaming [%s] command to [%s] skipped according to setting", original_name, new_name))
|
|
end
|
|
end
|
|
|
|
|
|
--0: succesfull, table
|
|
--1: not connected player, nil
|
|
--2: invalid target selector, nil
|
|
function mcl_commands.get_target_selector(target_selector)
|
|
if minetest.player_exists(target_selector) then
|
|
local obj = minetest.get_player_by_name(target_selector)
|
|
if obj then
|
|
return 0, {obj}
|
|
else
|
|
return 1, nil
|
|
end
|
|
else
|
|
return 0, {}
|
|
end
|
|
end |