From cd30aed80787cb56c888f0c5ad40482c4921f31b Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Thu, 9 Jan 2014 12:40:38 -0500 Subject: Fix #136 by always running commands as the placer --- mesecons_commandblock/init.lua | 125 +++++++++++++++++------------------------ 1 file changed, 51 insertions(+), 74 deletions(-) (limited to 'mesecons_commandblock/init.lua') diff --git a/mesecons_commandblock/init.lua b/mesecons_commandblock/init.lua index af7034d..1b2df85 100644 --- a/mesecons_commandblock/init.lua +++ b/mesecons_commandblock/init.lua @@ -23,14 +23,6 @@ minetest.register_chatcommand("tell", { end }) -minetest.register_chatcommand("tellme", { - params = "", - description = "Say to yourself", - func = function(name, param) - minetest.chat_send_player(name, param, false) - end -}) - minetest.register_chatcommand("hp", { params = " ", description = "Set health of to hitpoints", @@ -50,16 +42,15 @@ minetest.register_chatcommand("hp", { end }) -local initialize_data = function(meta, player, command, param) +local function initialize_data(meta) + local command = meta:get_string("command") + local param = meta:get_string("param") meta:set_string("formspec", - "invsize[9,6;]" .. - "field[1,1;7.5,1;player;Player;" .. player .. "]" .. - "button[1.3,2;2,1;nearest;Nearest]" .. - "button[3.3,2;2,1;farthest;Farthest]" .. - "button[5.3,2;2,1;random;Random]" .. - "field[1,4;2,1;command;Command;" .. command .. "]" .. - "field[3,4;5.5,1;param;Parameter;" .. param .. "]" .. - "button_exit[3.3,5;2,1;submit;Submit]") + "invsize[9,4;]" .. + "field[1,1;2,1;command;Command;" .. command .. "]" .. + "field[3,1;5.5,1;param;Parameter;" .. param .. "]" .. + "label[3,1.5;@nearest, @farthest, and @random are replaced by the respective player names]" .. + "button_exit[3.3,3;2,1;submit;Submit]") local owner = meta:get_string("owner") if owner == "" then owner = "not owned" @@ -71,78 +62,63 @@ local initialize_data = function(meta, player, command, param) "Command: /" .. command .. " " .. param) end -local construct = function(pos) +local function construct(pos) local meta = minetest.get_meta(pos) - meta:set_string("player", "@nearest") meta:set_string("command", "time") meta:set_string("param", "7000") meta:set_string("owner", "") - initialize_data(meta, "@nearest", "time", "7000") + initialize_data(meta) end -local after_place = function(pos, placer) +local function after_place(pos, placer) if placer then local meta = minetest.get_meta(pos) meta:set_string("owner", placer:get_player_name()) - initialize_data(meta, "@nearest", "time", "7000") + initialize_data(meta) end end -local receive_fields = function(pos, formname, fields, sender) +local function receive_fields(pos, formname, fields, sender) if fields.quit then return end local meta = minetest.get_meta(pos) - if fields.nearest then - initialize_data(meta, "@nearest", fields.command, fields.param) - elseif fields.farthest then - initialize_data(meta, "@farthest", fields.command, fields.param) - elseif fields.random then - initialize_data(meta, "@random", fields.command, fields.param) - else --fields.submit or pressed enter - meta:set_string("player", fields.player) - meta:set_string("command", fields.command) - meta:set_string("param", fields.param) - - initialize_data(meta, fields.player, fields.command, fields.param) + local owner = meta:get_string("owner") + if owner ~= "" and sender:get_player_name() ~= owner then + return end -end + meta:set_string("command", fields.command) + meta:set_string("param", fields.param) -local resolve_player = function(name, pos) - local get_distance = function(pos1, pos2) - return math.sqrt((pos1.x - pos2.x) ^ 2 + (pos1.y - pos2.y) ^ 2 + (pos1.z - pos2.z) ^ 2) - end + initialize_data(meta) +end - if name == "@nearest" then - local min_distance = math.huge - for index, player in ipairs(minetest.get_connected_players()) do - local distance = get_distance(pos, player:getpos()) - if distance < min_distance then - min_distance = distance - name = player:get_player_name() - end +local function resolve_param(param, pos) + local nearest, farthest = nil, nil + local min_distance, max_distance = math.huge, -1 + local players = minetest.get_connected_players() + for index, player in pairs(players) do + local distance = vector.distance(pos, player:getpos()) + if distance < min_distance then + min_distance = distance + nearest = player:get_player_name() end - elseif name == "@farthest" then - local max_distance = -1 - for index, player in ipairs(minetest.get_connected_players()) do - local distance = get_distance(pos, player:getpos()) - if distance > max_distance then - max_distance = distance - name = player:get_player_name() - end + if distance > max_distance then + max_distance = distance + farthest = player:get_player_name() end - elseif name == "@random" then - local players = minetest.get_connected_players() - local player = players[math.random(#players)] - name = player:get_player_name() end - return name + local random = players[math.random(#players)]:get_player_name() + param = param:gsub("@nearest", nearest) + param = param:gsub("@farthest", farthest) + param = param:gsub("@random", random) + return param end -local commandblock_action_on = function(pos, node) +local function commandblock_action_on(pos, node) if node.name ~= "mesecons_commandblock:commandblock_off" then return end @@ -160,19 +136,26 @@ local commandblock_action_on = function(pos, node) end local has_privs, missing_privs = minetest.check_player_privs(owner, command.privs) if not has_privs then - minetest.chat_send_player(owner, "You don't have permission to run this command (missing privileges: "..table.concat(missing_privs, ", ")..")") + minetest.chat_send_player(owner, "You don't have permission " + .."to run this command (missing privileges: " + ..table.concat(missing_privs, ", ")..")") return end - local player = resolve_player(meta:get_string("player"), pos) - command.func(player, meta:get_string("param")) + command.func(owner, resolve_param(meta:get_string("param"), pos)) end -local commandblock_action_off = function(pos, node) +local function commandblock_action_off(pos, node) if node.name == "mesecons_commandblock:commandblock_on" then minetest.swap_node(pos, {name = "mesecons_commandblock:commandblock_off"}) end end +local function can_dig(pos, player) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + return owner == "" or owner == player:get_player_name() +end + minetest.register_node("mesecons_commandblock:commandblock_off", { description = "Command Block", tiles = {"jeija_commandblock_off.png"}, @@ -181,10 +164,7 @@ minetest.register_node("mesecons_commandblock:commandblock_off", { on_construct = construct, after_place_node = after_place, on_receive_fields = receive_fields, - can_dig = function(pos,player) - local owner = minetest.get_meta(pos):get_string("owner") - return owner == "" or owner == player:get_player_name() - end, + can_dig = can_dig, sounds = default.node_sound_stone_defaults(), mesecons = {effector = { action_on = commandblock_action_on @@ -199,10 +179,7 @@ minetest.register_node("mesecons_commandblock:commandblock_on", { on_construct = construct, after_place_node = after_place, on_receive_fields = receive_fields, - can_dig = function(pos,player) - local owner = minetest.get_meta(pos):get_string("owner") - return owner == "" or owner == player:get_player_name() - end, + can_dig = can_dig, sounds = default.node_sound_stone_defaults(), mesecons = {effector = { action_off = commandblock_action_off -- cgit v1.2.3