mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-11-22 18:41:09 +01:00
Command blocks: Only changable in Creative Mode
This commit is contained in:
parent
9417067a30
commit
7b424c5df0
1 changed files with 42 additions and 47 deletions
|
@ -44,51 +44,22 @@ minetest.register_chatcommand("hp", {
|
||||||
|
|
||||||
local function initialize_data(meta)
|
local function initialize_data(meta)
|
||||||
local commands = minetest.formspec_escape(meta:get_string("commands"))
|
local commands = minetest.formspec_escape(meta:get_string("commands"))
|
||||||
meta:set_string("formspec",
|
|
||||||
"invsize[9,5;]" ..
|
|
||||||
"textarea[0.5,0.5;8.5,4;commands;Commands;"..commands.."]" ..
|
|
||||||
"label[1,3.8;@nearest, @farthest, and @random are replaced by the respective player names]" ..
|
|
||||||
"button_exit[3.3,4.5;2,1;submit;Submit]")
|
|
||||||
local owner = meta:get_string("owner")
|
|
||||||
if owner == "" then
|
|
||||||
owner = "not owned"
|
|
||||||
else
|
|
||||||
owner = "owned by " .. owner
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function construct(pos)
|
local function construct(pos)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
|
|
||||||
meta:set_string("commands", "")
|
meta:set_string("commands", "")
|
||||||
|
|
||||||
meta:set_string("owner", "")
|
|
||||||
|
|
||||||
initialize_data(meta)
|
initialize_data(meta)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function after_place(pos, placer)
|
local function after_place(pos, placer)
|
||||||
if placer then
|
if placer then
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
meta:set_string("owner", placer:get_player_name())
|
|
||||||
initialize_data(meta)
|
initialize_data(meta)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function receive_fields(pos, formname, fields, sender)
|
|
||||||
if not fields.submit then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
local owner = meta:get_string("owner")
|
|
||||||
if owner ~= "" and sender:get_player_name() ~= owner then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
meta:set_string("commands", fields.commands)
|
|
||||||
|
|
||||||
initialize_data(meta)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function resolve_commands(commands, pos)
|
local function resolve_commands(commands, pos)
|
||||||
local players = minetest.get_connected_players()
|
local players = minetest.get_connected_players()
|
||||||
|
|
||||||
|
@ -132,10 +103,6 @@ local function commandblock_action_on(pos, node)
|
||||||
minetest.swap_node(pos, {name = "mesecons_commandblock:commandblock_on"})
|
minetest.swap_node(pos, {name = "mesecons_commandblock:commandblock_on"})
|
||||||
|
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local owner = meta:get_string("owner")
|
|
||||||
if owner == "" then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local commands = resolve_commands(meta:get_string("commands"), pos)
|
local commands = resolve_commands(meta:get_string("commands"), pos)
|
||||||
for _, command in pairs(commands:split("\n")) do
|
for _, command in pairs(commands:split("\n")) do
|
||||||
|
@ -147,18 +114,12 @@ local function commandblock_action_on(pos, node)
|
||||||
end
|
end
|
||||||
local cmddef = minetest.chatcommands[cmd]
|
local cmddef = minetest.chatcommands[cmd]
|
||||||
if not cmddef then
|
if not cmddef then
|
||||||
minetest.chat_send_player(owner, "The command "..cmd.." does not exist")
|
-- Invalid chat command
|
||||||
|
-- TODO: Somehow report this error
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
local has_privs, missing_privs = minetest.check_player_privs(owner, cmddef.privs)
|
local dummy_player = ""
|
||||||
if not has_privs then
|
cmddef.func(dummy_player, param)
|
||||||
minetest.chat_send_player(owner, "You don't have permission "
|
|
||||||
.."to run "..cmd
|
|
||||||
.." (missing privileges: "
|
|
||||||
..table.concat(missing_privs, ", ")..")")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
cmddef.func(owner, param)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -169,9 +130,22 @@ local function commandblock_action_off(pos, node)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function can_dig(pos, player)
|
local function can_dig(pos, player)
|
||||||
|
return minetest.setting_getbool("creative_mode")
|
||||||
|
end
|
||||||
|
|
||||||
|
local on_rightclick = function(pos, node, player, itemstack, pointed_thing)
|
||||||
|
-- Only allow access in Creative Mode
|
||||||
|
if not minetest.setting_getbool("creative_mode") then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local owner = meta:get_string("owner")
|
local commands = meta:get_string("commands")
|
||||||
return owner == "" or owner == player:get_player_name()
|
local formspec = "invsize[9,5;]" ..
|
||||||
|
"textarea[0.5,0.5;8.5,4;commands;Commands;"..commands.."]" ..
|
||||||
|
"label[1,3.8;@nearest, @farthest, and @random are replaced by the respective player names]" ..
|
||||||
|
"button_exit[3.3,4.5;2,1;submit;Submit]"
|
||||||
|
minetest.show_formspec(player:get_player_name(), "commandblock_"..pos.x.."_"..pos.y.."_"..pos.z, formspec)
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.register_node("mesecons_commandblock:commandblock_off", {
|
minetest.register_node("mesecons_commandblock:commandblock_off", {
|
||||||
|
@ -196,8 +170,8 @@ To execute the commands, supply the command block with redstone power once. To e
|
||||||
on_construct = construct,
|
on_construct = construct,
|
||||||
is_ground_content = false,
|
is_ground_content = false,
|
||||||
after_place_node = after_place,
|
after_place_node = after_place,
|
||||||
on_receive_fields = receive_fields,
|
|
||||||
can_dig = can_dig,
|
can_dig = can_dig,
|
||||||
|
on_rightclick = on_rightclick,
|
||||||
sounds = mcl_sounds.node_sound_stone_defaults(),
|
sounds = mcl_sounds.node_sound_stone_defaults(),
|
||||||
mesecons = {effector = {
|
mesecons = {effector = {
|
||||||
action_on = commandblock_action_on
|
action_on = commandblock_action_on
|
||||||
|
@ -213,8 +187,8 @@ minetest.register_node("mesecons_commandblock:commandblock_on", {
|
||||||
on_construct = construct,
|
on_construct = construct,
|
||||||
is_ground_content = false,
|
is_ground_content = false,
|
||||||
after_place_node = after_place,
|
after_place_node = after_place,
|
||||||
on_receive_fields = receive_fields,
|
|
||||||
can_dig = can_dig,
|
can_dig = can_dig,
|
||||||
|
on_rightclick = on_rightclick,
|
||||||
sounds = mcl_sounds.node_sound_stone_defaults(),
|
sounds = mcl_sounds.node_sound_stone_defaults(),
|
||||||
mesecons = {effector = {
|
mesecons = {effector = {
|
||||||
action_off = commandblock_action_off
|
action_off = commandblock_action_off
|
||||||
|
@ -222,6 +196,27 @@ minetest.register_node("mesecons_commandblock:commandblock_on", {
|
||||||
mcl_blast_resistance = 18000000,
|
mcl_blast_resistance = 18000000,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
|
if not fields.submit then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if string.sub(formname, 1, 13) == "commandblock_" then
|
||||||
|
local index, _, x, y, z = string.find(formname, "commandblock_(-?%d+)_(-?%d+)_(-?%d+)")
|
||||||
|
if index ~= nil and x ~= nil and y ~= nil and z ~= nil then
|
||||||
|
local pos = {x=tonumber(x), y=tonumber(y), z=tonumber(z)}
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
if not minetest.setting_getbool("creative_mode") then
|
||||||
|
minetest.chat_send_player(player:get_player_name(), "Editing the command block has failed! You can only change the command block in Creative Mode!")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
meta:set_string("commands", fields.commands)
|
||||||
|
initialize_data(meta)
|
||||||
|
else
|
||||||
|
minetest.chat_send_player(player:get_player_name(), "Editing the command block has failed! The command block is gone.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
-- Add entry alias for the Help
|
-- Add entry alias for the Help
|
||||||
if minetest.get_modpath("doc") then
|
if minetest.get_modpath("doc") then
|
||||||
doc.add_entry_alias("nodes", "mesecons_commandblock:commandblock_off", "nodes", "mesecons_commandblock:commandblock_on")
|
doc.add_entry_alias("nodes", "mesecons_commandblock:commandblock_off", "nodes", "mesecons_commandblock:commandblock_on")
|
||||||
|
|
Loading…
Reference in a new issue