fix missing protection on sofas and coffee tables

add some informative messages
This commit is contained in:
Vanessa Ezekowitz 2015-07-21 05:08:40 -04:00
parent b20b3bb8e9
commit e492780510
4 changed files with 59 additions and 28 deletions

View File

@ -24,9 +24,13 @@ minetest.register_node("lrfurn:coffeetable_back", {
} }
}, },
on_construct = function(pos) after_place_node = function(pos, placer, itemstack, pointed_thing)
if minetest.is_protected(pos, placer:get_player_name()) then return true end
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local param2 = node.param2 local param2 = node.param2
if lrfurn.check_forward(pos, fdir, false, placer) then
node.name = "lrfurn:coffeetable_front" node.name = "lrfurn:coffeetable_front"
if param2 == 0 then if param2 == 0 then
pos.z = pos.z+1 pos.z = pos.z+1
@ -37,14 +41,19 @@ minetest.register_node("lrfurn:coffeetable_back", {
elseif param2 == 3 then elseif param2 == 3 then
pos.x = pos.x-1 pos.x = pos.x-1
end end
if( minetest.get_node({x=pos.x, y=pos.y, z=pos.z}).name == "air" ) then
minetest.set_node(pos, node) minetest.set_node(pos, node)
else
minetest.chat_send_player(placer:get_player_name(), "No room to place the coffee table!")
minetest.set_node(pos, {name = "air"})
return true
end end
end, end,
on_destruct = function(pos) after_dig_node = function(pos, oldnode, oldmetadata, digger)
local node = minetest.get_node(pos) if minetest.is_protected(pos, digger:get_player_name()) then return true end
local param2 = node.param2
local param2 = oldnode.param2
if param2 == 0 then if param2 == 0 then
pos.z = pos.z+1 pos.z = pos.z+1
elseif param2 == 1 then elseif param2 == 1 then
@ -54,11 +63,13 @@ minetest.register_node("lrfurn:coffeetable_back", {
elseif param2 == 3 then elseif param2 == 3 then
pos.x = pos.x-1 pos.x = pos.x-1
end end
if( minetest.get_node({x=pos.x, y=pos.y, z=pos.z}).name == "lrfurn:coffeetable_front" ) then
if( minetest.get_node({x=pos.x, y=pos.y, z=pos.z}).param2 == param2 ) then if minetest.is_protected(pos, digger:get_player_name()) then return true end
if (minetest.get_node({x=pos.x, y=pos.y, z=pos.z}).name == "lrfurn:coffeetable_front")
and (minetest.get_node({x=pos.x, y=pos.y, z=pos.z}).param2 == param2) then
minetest.remove_node(pos) minetest.remove_node(pos)
end end
end
end, end,
}) })

View File

@ -8,19 +8,32 @@ lrfurn.fdir_to_fwd = {
{ -1, 0 }, { -1, 0 },
} }
function lrfurn.check_forward(pos, fdir, long) function lrfurn.check_forward(pos, fdir, long, placer)
if not fdir or fdir > 3 then fdir = 0 end if not fdir or fdir > 3 then fdir = 0 end
local pos2 = { x = pos.x + lrfurn.fdir_to_fwd[fdir+1][1], y=pos.y, z = pos.z + lrfurn.fdir_to_fwd[fdir+1][2] } local pos2 = { x = pos.x + lrfurn.fdir_to_fwd[fdir+1][1], y=pos.y, z = pos.z + lrfurn.fdir_to_fwd[fdir+1][2] }
local pos3 = { x = pos.x + lrfurn.fdir_to_fwd[fdir+1][1] * 2, y=pos.y, z = pos.z + lrfurn.fdir_to_fwd[fdir+1][2] * 2 } local pos3 = { x = pos.x + lrfurn.fdir_to_fwd[fdir+1][1] * 2, y=pos.y, z = pos.z + lrfurn.fdir_to_fwd[fdir+1][2] * 2 }
local node2 = minetest.get_node(pos2) local node2 = minetest.get_node(pos2)
if node2 and node2.name ~= "air" then return false end if node2 and node2.name ~= "air" then
return false
elseif minetest.is_protected(pos2, placer:get_player_name()) then
if not long then
minetest.chat_send_player(placer:get_player_name(), "Someone else owns the spot where other end goes!")
else
minetest.chat_send_player(placer:get_player_name(), "Someone else owns the spot where the middle or far end goes!")
end
return false
end
if long then if long then
local node3 = minetest.get_node(pos3) local node3 = minetest.get_node(pos3)
if node3 and node3.name ~= "air" then return false end if node3 and node3.name ~= "air" then
return false
elseif minetest.is_protected(pos3, placer:get_player_name()) then
minetest.chat_send_player(placer:get_player_name(), "Someone else owns the spot where the other end goes!")
return false
end
end end
return true return true

View File

@ -42,15 +42,18 @@ for i in ipairs(longsofas_list) do
selection_box = longsofa_sbox, selection_box = longsofa_sbox,
node_box = longsofa_cbox, node_box = longsofa_cbox,
on_rotate = screwdriver.disallow, on_rotate = screwdriver.disallow,
on_place = function(itemstack, placer, pointed_thing)
local pos = pointed_thing.above after_place_node = function(pos, placer, itemstack, pointed_thing)
if minetest.is_protected(pos, placer:get_player_name()) then return true end
local fdir = minetest.dir_to_facedir(placer:get_look_dir(), false) local fdir = minetest.dir_to_facedir(placer:get_look_dir(), false)
if lrfurn.check_forward(pos, fdir, true) then if lrfurn.check_forward(pos, fdir, true, placer) then
minetest.set_node(pos, {name = "lrfurn:longsofa_"..colour, param2 = fdir}) minetest.set_node(pos, {name = "lrfurn:longsofa_"..colour, param2 = fdir})
itemstack:take_item() itemstack:take_item()
else else
minetest.chat_send_player(placer:get_player_name(), "No room to place the sofa!") minetest.chat_send_player(placer:get_player_name(), "No room to place the sofa!")
minetest.set_node(pos, { name = "air" })
end end
return itemstack return itemstack
end, end,

View File

@ -42,15 +42,19 @@ for i in ipairs(sofas_list) do
selection_box = sofa_sbox, selection_box = sofa_sbox,
node_box = sofa_cbox, node_box = sofa_cbox,
on_rotate = screwdriver.disallow, on_rotate = screwdriver.disallow,
on_place = function(itemstack, placer, pointed_thing)
local pos = pointed_thing.above after_place_node = function(pos, placer, itemstack, pointed_thing)
if minetest.is_protected(pos, placer:get_player_name()) then return true end
local fdir = minetest.dir_to_facedir(placer:get_look_dir(), false) local fdir = minetest.dir_to_facedir(placer:get_look_dir(), false)
if lrfurn.check_forward(pos, fdir, true) then if lrfurn.check_forward(pos, fdir, false, placer) then
minetest.set_node(pos, {name = "lrfurn:sofa_"..colour, param2 = fdir}) minetest.set_node(pos, {name = "lrfurn:sofa_"..colour, param2 = fdir})
itemstack:take_item() itemstack:take_item()
else else
minetest.chat_send_player(placer:get_player_name(), "No room to place the sofa!") minetest.chat_send_player(placer:get_player_name(), "No room to place the sofa!")
minetest.set_node(pos, { name = "air" })
end end
return itemstack return itemstack
end, end,