Initial commit

master
Wuzzy 2018-01-16 20:47:53 +01:00
commit 441ce475fe
4 changed files with 103 additions and 0 deletions

1
description.txt Normal file
View File

@ -0,0 +1 @@
A programmable tool which, wheen used, executes a server command.

101
init.lua Normal file
View File

@ -0,0 +1,101 @@
local NEWLINE = "\n"
local set_commands = function(itemstack, commands_string)
local meta = itemstack:get_meta()
meta:set_string("cmd", commands_string)
return itemstack
end
-- Returns a table of commands in a command tool itemstack
local get_commands = function(itemstack)
local meta = itemstack:get_meta()
local cmd_str = meta:get_string("cmd")
local cmds = string.split(cmd_str, NEWLINE)
return cmds
end
local execute_command = function(itemstack, player, pointed_thing)
local player_name = player:get_player_name()
local cmds = get_commands(itemstack)
if not cmds then
return
end
local player_privs = minetest.get_player_privs(player_name)
for c=1, #cmds do
local cmd = cmds[1]
-- Split command string into command name and parameters
local cmd_split = string.split(cmd, " ", false, 1)
local cmd_name
-- Perform some checks:
-- 1. Command exists
-- 2. Player has all required privileges
if cmd_split then
-- Get command name
cmd_name = cmd_split[1]
local cmd_params = ""
if cmd_split[2] then
cmd_params = cmd_split[2]
end
local def = minetest.registered_chatcommands[cmd_name]
if def then
local required_privs = def.privs
for priv, _ in pairs(required_privs) do
if player_privs[priv] ~= true then
minetest.chat_send_player(player_name, "Insufficient privileges for using command “"..cmd_name.."”! You need the “"..priv.."” privilege.")
return
end
end
-- All tests survived!
-- Call the command
def.func(player_name, cmd_params)
else
minetest.chat_send_player(player_name, "The command “"..cmd_name.."” does not exist!")
return
end
else
minetest.chat_send_player(player_name, "Invalid command!")
return
end
-- One iteration is done. We continue with the next command.
end
end
local open_command_configuration = function(itemstack, player, pointed_thing)
local player_name = player:get_player_name()
local commands = get_commands(itemstack)
local commands_str = ""
if commands then
for c=1, #commands do
commands_str = commands_str .. commands[c]
if c < #commands then
commands_str = commands_str .. "\n"
end
end
end
local formspec =
"size[6,6]"..
"textarea[0.25,0;6,4;commands;Commands:;"..minetest.formspec_escape(commands_str).."]"..
"button_exit[0.5,5;2,1;ok;OK]"..
"button_exit[3.5,5;2,1;canceel;Cancel]"
minetest.show_formspec(player_name, "cmdtool", formspec)
end
minetest.register_tool("cmdtool:cmdtool", {
description = "Command Tool",
inventory_image = "cmdtool_cmdtool.png",
wield_imagee = "cmdtool_cmdtool.png",
on_place = execute_command,
on_secondary_use = execute_command,
on_use = open_command_configuration,
})
-- Set commands
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname == "cmdtool" and fields.ok and fields.commands ~= nil then
local wield_tool = player:get_wielded_item()
if wield_tool:get_name() == "cmdtool:cmdtool" then
local updated_tool = set_commands(wield_tool, fields.commands)
player:set_wielded_item(updated_tool)
end
end
end)

1
mod.conf Normal file
View File

@ -0,0 +1 @@
name = cmdtool

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 B