From 51b6d07d0c2da109255e72fa5bdbee75b09fb072 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 May 2018 16:55:52 +0200 Subject: [PATCH] Make cmd blocks execute cmds on behalf of placer --- .../REDSTONE/mesecons_commandblock/init.lua | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua index b7343c9376..1af11a196c 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua @@ -1,19 +1,15 @@ -local function initialize_data(meta) - local commands = minetest.formspec_escape(meta:get_string("commands")) -end - local function construct(pos) local meta = minetest.get_meta(pos) meta:set_string("commands", "") - initialize_data(meta) + meta:set_string("commander", "") end local function after_place(pos, placer) if placer then local meta = minetest.get_meta(pos) - initialize_data(meta) + meta:set_string("commander", placer:get_player_name()) end end @@ -93,19 +89,20 @@ local function commandblock_action_on(pos, node) local commands = resolve_commands(meta:get_string("commands"), pos) for _, command in pairs(commands:split("\n")) do - local pos = command:find(" ") + local cpos = command:find(" ") local cmd, param = command, "" - if pos then - cmd = command:sub(1, pos - 1) - param = command:sub(pos + 1) + if cpos then + cmd = command:sub(1, cpos - 1) + param = command:sub(cpos + 1) end local cmddef = minetest.chatcommands[cmd] if not cmddef then -- Invalid chat command return end - local dummy_player = "" - cmddef.func(dummy_player, param) + -- Execute command in the name of commander + local commander = meta:get_string("commander") + cmddef.func(commander, param) end end @@ -128,10 +125,18 @@ local on_rightclick = function(pos, node, player, itemstack, pointed_thing) local meta = minetest.get_meta(pos) local commands = meta:get_string("commands") + local commander = meta:get_string("commander") + local commanderstr + if commander == "" or commander == nil then + commanderstr = "Error: No commander! Block must be replaced." + else + commanderstr = "Commander: "..commander + end local formspec = "invsize[9,5;]" .. "textarea[0.5,0.5;8.5,4;commands;Commands;"..commands.."]" .. "button_exit[3.3,4.5;2,1;submit;Submit]" .. "image_button[8,4.5;1,1;doc_button_icon_lores.png;doc;]" .. + "label[0,4.5;"..minetest.formspec_escape(commanderstr).."]" .. "tooltip[doc;Help]" minetest.show_formspec(player:get_player_name(), "commandblock_"..pos.x.."_"..pos.y.."_"..pos.z, formspec) end @@ -168,6 +173,8 @@ minetest.register_node("mesecons_commandblock:commandblock_off", { To place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Rightclick the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how they work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom. +All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block. + You can optionally use the following placeholders in your commands: • “@nearest” is replaced by the name of the player nearest to the command block • “@farthest” is replaced by the name of the player farthest away from the command block @@ -250,7 +257,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) return else meta:set_string("commands", fields.commands) - initialize_data(meta) end else minetest.chat_send_player(player:get_player_name(), "Editing the command block has failed! The command block is gone.")