forked from mtcontrib/locks
Compare commits
12 Commits
Author | SHA1 | Date |
---|---|---|
bri cassa | f36403bcf9 | |
Sokomine | e789726fdf | |
blaboing | 48103101ba | |
Sys Quatre | 79b8186ed8 | |
Sys Quatre | f0e4b2012e | |
Sys Quatre | 4d3a7e51df | |
Sys Quatre | bd6909326c | |
Sys Quatre | ca94c8d43e | |
Sys Quatre | 63a2a54be2 | |
Sokomine | ed0db28add | |
Sokomine | c79e8fe19e | |
Sokomine | bfce8b29eb |
|
@ -1,2 +1,3 @@
|
|||
default
|
||||
pipeworks?
|
||||
basic_materials?
|
||||
|
|
38
init.lua
38
init.lua
|
@ -46,7 +46,7 @@ minetest.register_privilege("diglocks", { description = "allows to open/use and
|
|||
|
||||
|
||||
locks.config_button = [[
|
||||
image_button[%d,%d;1,1;locks_lock16.png;locks_config;Config
|
||||
image_button[%s,%s;1,1;locks_lock16.png;locks_config;Config
|
||||
Locks]
|
||||
tooltip[locks_config;Configure the players or set the password to grant access to other players.]
|
||||
]]
|
||||
|
@ -56,7 +56,7 @@ function locks.get_config_button(x,y)
|
|||
end
|
||||
|
||||
locks.authorize_button = [[
|
||||
image_button[%d,%d;1,1;locks_key16.png;locks_authorize;Autho-
|
||||
image_button[%s,%s;1,1;locks_key16.png;locks_authorize;Autho-
|
||||
rize]
|
||||
tooltip[locks_authorize;Opens a password prompt to grant you access to this object.]
|
||||
]]
|
||||
|
@ -181,6 +181,7 @@ function locks:lock_init( pos, default_formspec )
|
|||
meta:set_string("allowed_users","");
|
||||
-- objects can be unlocked by passwords as well (if it is set)
|
||||
meta:set_string("password","");
|
||||
meta:mark_as_private("password")
|
||||
-- the last player who entered the right password (to save space this is not a list)
|
||||
meta:set_string("pw_user","");
|
||||
-- this formspec is presented on right-click for every user
|
||||
|
@ -228,6 +229,7 @@ function locks:set_lockdata( pos, data )
|
|||
meta:set_string("owner", (data.owner or ""));
|
||||
meta:set_string("allowed_users",(data.allowed_users or ""));
|
||||
meta:set_string("password", (data.password or ""));
|
||||
meta:mark_as_private("password")
|
||||
meta:set_string("pw_user", (data.pw_user or ""));
|
||||
meta:set_string("formspec", (data.formspec or ""));
|
||||
end
|
||||
|
@ -598,6 +600,7 @@ function locks:lock_handle_input( pos, formname, fields, player )
|
|||
|
||||
|
||||
meta:set_string( "password", help[2]);
|
||||
meta:mark_as_private("password")
|
||||
-- reset the list of users who typed the right password
|
||||
meta:set_string("pw_users","");
|
||||
|
||||
|
@ -747,22 +750,25 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|||
return false;
|
||||
end)
|
||||
|
||||
-- craftitem; that can be used to craft shared locked objects
|
||||
minetest.register_craftitem("locks:lock", {
|
||||
description = "Lock to lock and share objects",
|
||||
image = "locks_lock16.png",
|
||||
});
|
||||
if minetest.get_modpath("basic_materials") then
|
||||
minetest.register_alias("locks:lock", "basic_materials:padlock")
|
||||
else
|
||||
-- craftitem; that can be used to craft shared locked objects
|
||||
minetest.register_craftitem("locks:lock", {
|
||||
description = "Lock to lock and share objects",
|
||||
image = "locks_lock16.png",
|
||||
});
|
||||
|
||||
|
||||
minetest.register_craft({
|
||||
output = "locks:lock 2",
|
||||
recipe = {
|
||||
{'default:steel_ingot', 'default:steel_ingot','default:steel_ingot'},
|
||||
{'default:steel_ingot', '', 'default:steel_ingot'},
|
||||
{'', 'default:steel_ingot',''},
|
||||
}
|
||||
});
|
||||
|
||||
minetest.register_craft({
|
||||
output = "locks:lock 2",
|
||||
recipe = {
|
||||
{'default:steel_ingot', 'default:steel_ingot','default:steel_ingot'},
|
||||
{'default:steel_ingot', '', 'default:steel_ingot'},
|
||||
{'', 'default:steel_ingot',''},
|
||||
}
|
||||
});
|
||||
end
|
||||
|
||||
-- a key allowes to open your own shared locked objects
|
||||
minetest.register_craftitem("locks:key", {
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
name = locks
|
||||
description = This Mod for Minetest adds objects that can be locked and shared.
|
||||
depends=default
|
||||
optional_depends = pipeworks,basic_materials
|
|
@ -140,7 +140,7 @@ minetest.register_node("locks:shared_locked_chest", {
|
|||
minetest.register_craft({
|
||||
output = 'locks:shared_locked_chest',
|
||||
recipe = {
|
||||
{ 'default:chest', 'locks:lock', '' },
|
||||
{ 'locks:lock', 'default:chest', minetest.get_modpath("basic_materials") and 'basic_materials:ic' or ''},
|
||||
},
|
||||
})
|
||||
|
||||
|
|
|
@ -428,7 +428,7 @@ minetest.register_abm({
|
|||
minetest.register_craft({
|
||||
output = 'locks:shared_locked_furnace',
|
||||
recipe = {
|
||||
{ 'default:furnace', 'locks:lock', '' },
|
||||
{ 'locks:lock', 'default:furnace', minetest.get_modpath("basic_materials") and 'basic_materials:ic' or ''},
|
||||
},
|
||||
})
|
||||
|
||||
|
|
|
@ -71,7 +71,7 @@ minetest.register_node("locks:shared_locked_sign_wall", {
|
|||
minetest.register_craft({
|
||||
output = 'locks:shared_locked_sign_wall',
|
||||
recipe = {
|
||||
{ 'default:sign_wall', 'locks:lock', '' },
|
||||
{ 'locks:lock', 'default:sign_wall', minetest.get_modpath("basic_materials") and 'basic_materials:ic' or ''},
|
||||
},
|
||||
})
|
||||
|
||||
|
|
|
@ -6,217 +6,210 @@
|
|||
|
||||
local door_bottom = {-0.5, -0.5, -0.5, 0.5, 0.5, -0.4}
|
||||
local door_top = {
|
||||
{-0.5, -0.5, -0.5, -0.3, 0.5, -0.4},
|
||||
{0.3, -0.5, -0.5, 0.5, 0.5, -0.4},
|
||||
{-0.3, 0.3, -0.5, 0.3, 0.5, -0.4},
|
||||
{-0.3, -0.5, -0.5, 0.3, -0.4, -0.4},
|
||||
{-0.05, -0.4, -0.5, 0.05, 0.3, -0.4},
|
||||
{-0.3, -0.1, -0.5, -0.05, 0, -0.4},
|
||||
{0.05, -0.1, -0.5, 0.3, 0, -0.4}
|
||||
{-0.5, -0.5, -0.5, -0.3, 0.5, -0.4},
|
||||
{0.3, -0.5, -0.5, 0.5, 0.5, -0.4},
|
||||
{-0.3, 0.3, -0.5, 0.3, 0.5, -0.4},
|
||||
{-0.3, -0.5, -0.5, 0.3, -0.4, -0.4},
|
||||
{-0.05, -0.4, -0.5, 0.05, 0.3, -0.4},
|
||||
{-0.3, -0.1, -0.5, -0.05, 0, -0.4},
|
||||
{0.05, -0.1, -0.5, 0.3, 0, -0.4}
|
||||
}
|
||||
|
||||
local is_top = function(name)
|
||||
return name:sub(12, 12) == "t"
|
||||
return name:sub(12, 12) == "t"
|
||||
end
|
||||
|
||||
|
||||
local xdoors2_transform = function(pos, node, puncher)
|
||||
|
||||
if( not( locks:lock_allow_use( pos, puncher ))) then
|
||||
minetest.chat_send_player( puncher:get_player_name(), "This door is locked. It can only be opened by its owner or people with a key that fits.");
|
||||
return;
|
||||
end
|
||||
if is_top(node.name) then
|
||||
pos = {x = pos.x, y = pos.y - 1, z = pos.z}
|
||||
end
|
||||
|
||||
if is_top(node.name) then
|
||||
pos = {x = pos.x, y = pos.y - 1, z = pos.z}
|
||||
end
|
||||
local t = 3 - node.name:sub(-1)
|
||||
local p2 = 0
|
||||
if t == 2 then
|
||||
p2 = (node.param2 + 1) % 4
|
||||
minetest.sound_play("doors_door_open", { pos = pos, gain = 0.3, max_hear_distance = 10})
|
||||
else
|
||||
p2 = (node.param2 + 3) % 4
|
||||
minetest.sound_play("doors_door_close", { pos = pos, gain = 0.3, max_hear_distance = 10})
|
||||
end
|
||||
if( not( locks:lock_allow_use( pos, puncher ))) then
|
||||
minetest.chat_send_player( puncher:get_player_name(), "This door is locked. It can only be opened by its owner or people with a key that fits.")
|
||||
return
|
||||
end
|
||||
|
||||
local t = 3 - node.name:sub(-1)
|
||||
local p2 = 0
|
||||
if t == 2 then
|
||||
p2 = (node.param2 + 1) % 4
|
||||
minetest.sound_play("doors_door_open", { pos = pos, gain = 0.3, max_hear_distance = 10})
|
||||
else
|
||||
p2 = (node.param2 + 3) % 4
|
||||
minetest.sound_play("doors_door_close", { pos = pos, gain = 0.3, max_hear_distance = 10})
|
||||
end
|
||||
|
||||
local olddata = locks:get_lockdata( pos );
|
||||
minetest.add_node(pos, {name = "locks:door_bottom_"..t, param2 = p2})
|
||||
minetest.add_node({x = pos.x, y = pos.y + 1, z = pos.z}, {name = "locks:door_top_"..t, param2 = p2})
|
||||
|
||||
-- remember who owns the door, what passwords are set etc.
|
||||
locks:set_lockdata( pos, olddata );
|
||||
locks:set_lockdata( {x = pos.x, y = pos.y + 1, z = pos.z}, olddata );
|
||||
-- No need to remember who owns the door, what passwords are set etc.
|
||||
-- because minetest.swap_node() keeps metadata at pos
|
||||
minetest.swap_node(pos, {name = "locks:door_bottom_"..t, param2 = p2})
|
||||
minetest.swap_node({x = pos.x, y = pos.y + 1, z = pos.z}, {name = "locks:door_top_"..t, param2 = p2})
|
||||
end
|
||||
|
||||
|
||||
local xdoors2_destruct = function(pos, oldnode)
|
||||
if is_top(oldnode.name) then
|
||||
pos = {x = pos.x, y = pos.y - 1, z = pos.z}
|
||||
end
|
||||
minetest.remove_node(pos)
|
||||
minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z})
|
||||
if is_top(oldnode.name) then
|
||||
pos = {x = pos.x, y = pos.y - 1, z = pos.z}
|
||||
end
|
||||
minetest.remove_node(pos)
|
||||
minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z})
|
||||
end
|
||||
|
||||
for i = 1, 2 do
|
||||
minetest.register_node("locks:door_top_"..i, {
|
||||
tiles = {"xdoors2_side.png", "xdoors2_side.png", "xdoors2_top.png", "xdoors2_bottom.png", "xdoors2_top_"..(3 - i)..".png", "xdoors2_top_"..i..".png"},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
drawtype = "nodebox",
|
||||
drop = "locks:door",
|
||||
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = door_top
|
||||
},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = door_bottom
|
||||
},
|
||||
on_punch = xdoors2_transform,
|
||||
after_dig_node = xdoors2_destruct,
|
||||
minetest.register_node("locks:door_top_"..i, {
|
||||
tiles = {"xdoors2_side.png", "xdoors2_side.png", "xdoors2_top.png", "xdoors2_bottom.png", "xdoors2_top_"..(3 - i)..".png", "xdoors2_top_"..i..".png"},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
drawtype = "nodebox",
|
||||
drop = "locks:door",
|
||||
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = door_top
|
||||
},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = door_bottom
|
||||
},
|
||||
on_punch = xdoors2_transform,
|
||||
after_dig_node = xdoors2_destruct,
|
||||
|
||||
on_construct = function(pos)
|
||||
locks:lock_init( pos,
|
||||
"size[8,2]"..
|
||||
locks.uniform_background..
|
||||
"button_exit[6.3,1.2;1.7,1;locks_sent_input;Proceed]" );
|
||||
end,
|
||||
on_construct = function(pos)
|
||||
locks:lock_init( pos,
|
||||
"size[8,2]"..locks.uniform_background..
|
||||
"button_exit[6.3,1.2;1.7,1;locks_sent_input;Proceed]" )
|
||||
end,
|
||||
|
||||
on_receive_fields = function(pos, formname, fields, sender)
|
||||
locks:lock_handle_input( pos, formname, fields, sender );
|
||||
end,
|
||||
on_receive_fields = function(pos, formname, fields, sender)
|
||||
locks:lock_handle_input( {x=pos.x, y=pos.y-1, z=pos.z}, formname, fields, sender )
|
||||
end,
|
||||
|
||||
can_dig = function(pos,player)
|
||||
return locks:lock_allow_dig( pos, player );
|
||||
end
|
||||
})
|
||||
minetest.register_node("locks:door_bottom_"..i, {
|
||||
tiles = {"xdoors2_side.png", "xdoors2_side.png", "xdoors2_top.png", "xdoors2_bottom.png", "locks_xdoors2_bottom_"..(3 - i)..".png", "locks_xdoors2_bottom_"..i..".png"},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
drawtype = "nodebox",
|
||||
drop = "locks:door",
|
||||
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = door_bottom
|
||||
},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = door_bottom
|
||||
},
|
||||
on_punch = xdoors2_transform,
|
||||
after_dig_node = xdoors2_destruct,
|
||||
can_dig = function(pos,player)
|
||||
return locks:lock_allow_dig( {x=pos.x, y=pos.y-1, z=pos.z}, player )
|
||||
end
|
||||
})
|
||||
minetest.register_node("locks:door_bottom_"..i, {
|
||||
tiles = {"xdoors2_side.png", "xdoors2_side.png", "xdoors2_top.png", "xdoors2_bottom.png", "locks_xdoors2_bottom_"..(3 - i)..".png", "locks_xdoors2_bottom_"..i..".png"},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
drawtype = "nodebox",
|
||||
drop = "locks:door",
|
||||
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = door_bottom
|
||||
},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = door_bottom
|
||||
},
|
||||
on_punch = xdoors2_transform,
|
||||
after_dig_node = xdoors2_destruct,
|
||||
|
||||
on_construct = function(pos)
|
||||
locks:lock_init( pos,
|
||||
"size[8,2]"..
|
||||
locks.uniform_background..
|
||||
"button_exit[6.3,1.2;1.7,1;locks_sent_input;Proceed]" );
|
||||
end,
|
||||
on_construct = function(pos)
|
||||
locks:lock_init( pos,
|
||||
"size[8,2]"..locks.uniform_background..
|
||||
"button_exit[6.3,1.2;1.7,1;locks_sent_input;Proceed]" )
|
||||
end,
|
||||
|
||||
on_receive_fields = function(pos, formname, fields, sender)
|
||||
locks:lock_handle_input( pos, formname, fields, sender );
|
||||
end,
|
||||
on_receive_fields = function(pos, formname, fields, sender)
|
||||
locks:lock_handle_input( pos, formname, fields, sender )
|
||||
end,
|
||||
|
||||
can_dig = function(pos,player)
|
||||
return locks:lock_allow_dig( pos, player );
|
||||
end
|
||||
})
|
||||
can_dig = function(pos,player)
|
||||
return locks:lock_allow_dig( pos, player )
|
||||
end
|
||||
})
|
||||
end
|
||||
|
||||
local delta = {
|
||||
{x = -1, z = 0},
|
||||
{x = 0, z = 1},
|
||||
{x = 1, z = 0},
|
||||
{x = 0, z = -1}
|
||||
{x = -1, z = 0},
|
||||
{x = 0, z = 1},
|
||||
{x = 1, z = 0},
|
||||
{x = 0, z = -1}
|
||||
}
|
||||
|
||||
minetest.register_node("locks:door", {
|
||||
description = "Shared locked Wooden Door",
|
||||
node_placement_prediction = "",
|
||||
inventory_image = 'locks_xdoors2_door.png',
|
||||
wield_image = 'xdoors2_door.png',
|
||||
stack_max = 1,
|
||||
sunlight_propogates = true,
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
local above = pointed_thing.above
|
||||
local above1 = {x = above.x, y = above.y + 1, z = above.z};
|
||||
if (minetest.is_protected(above, placer:get_player_name())
|
||||
or minetest.is_protected(above1, placer:get_player_name())) then
|
||||
minetest.chat_send_player(placer:get_player_name(), "This area is protected!")
|
||||
return itemstack
|
||||
else
|
||||
-- there should be 2 empty nodes
|
||||
if minetest.get_node(above1).name ~= "air" then
|
||||
return itemstack
|
||||
end
|
||||
|
||||
local fdir = 0
|
||||
local placer_pos = placer:getpos()
|
||||
if placer_pos then
|
||||
dir = {
|
||||
x = above.x - placer_pos.x,
|
||||
y = above.y - placer_pos.y,
|
||||
z = above.z - placer_pos.z
|
||||
}
|
||||
fdir = minetest.dir_to_facedir(dir)
|
||||
end
|
||||
description = "Shared locked Wooden Door",
|
||||
node_placement_prediction = "",
|
||||
inventory_image = 'locks_xdoors2_door.png',
|
||||
wield_image = 'locks_xdoors2_door.png',
|
||||
stack_max = 1,
|
||||
sunlight_propogates = true,
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
local pname = placer:get_player_name()
|
||||
local above = pointed_thing.above
|
||||
local above1 = {x = above.x, y = above.y + 1, z = above.z}
|
||||
if (minetest.is_protected(above, pname)
|
||||
or minetest.is_protected(above1, pname)) then
|
||||
minetest.chat_send_player(pname, "This area is protected!")
|
||||
return itemstack
|
||||
else
|
||||
-- there should be 2 empty nodes
|
||||
if minetest.get_node(above1).name ~= "air" then
|
||||
return itemstack
|
||||
end
|
||||
|
||||
local fdir = 0
|
||||
local placer_pos = placer:get_pos()
|
||||
if placer_pos then
|
||||
fdir = minetest.dir_to_facedir({
|
||||
x = above.x - placer_pos.x,
|
||||
y = above.y - placer_pos.y,
|
||||
z = above.z - placer_pos.z
|
||||
})
|
||||
end
|
||||
|
||||
local t = 1
|
||||
local another_door = minetest.get_node({x = above.x + delta[fdir + 1].x, y = above.y, z = above.z + delta[fdir + 1].z})
|
||||
if (another_door.name:sub(-1) == "1" and another_door.param2 == fdir)
|
||||
or (another_door.name:sub(-1) == "2" and another_door.param2 == (fdir + 1) % 4) then
|
||||
t = 2
|
||||
end
|
||||
local t = 1
|
||||
local another_door = minetest.get_node({x = above.x + delta[fdir + 1].x, y = above.y, z = above.z + delta[fdir + 1].z})
|
||||
if (another_door.name:sub(-1) == "1" and another_door.param2 == fdir)
|
||||
or (another_door.name:sub(-1) == "2" and another_door.param2 == (fdir + 1) % 4) then
|
||||
t = 2
|
||||
end
|
||||
|
||||
minetest.add_node(above, {name = "locks:door_bottom_"..t, param2 = fdir})
|
||||
minetest.add_node({x = above.x, y = above.y + 1, z = above.z}, {name = "locks:door_top_"..t, param2 = fdir})
|
||||
minetest.add_node(above, {name = "locks:door_bottom_"..t, param2 = fdir})
|
||||
minetest.add_node(above1, {name = "locks:door_top_"..t, param2 = fdir})
|
||||
|
||||
-- store who owns the door; the other data can be default for now
|
||||
locks:lock_set_owner( above, placer:get_player_name() or "", "Shared locked door");
|
||||
locks:lock_set_owner( {x = above.x, y = above.y + 1, z = above.z}, placer:get_player_name() or "", "Shared locked door");
|
||||
-- store who owns the door; the other data can be default for now
|
||||
locks:lock_set_owner( above, pname or "", "Shared locked door")
|
||||
locks:lock_set_owner( above1, pname or "", "Shared locked door")
|
||||
|
||||
return ItemStack("")
|
||||
return ItemStack("")
|
||||
end
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
|
||||
local ing = minetest.get_modpath("basic_materials") and 'basic_materials:ic' or ''
|
||||
-- if xdoors2 is installed
|
||||
if( minetest.get_modpath("xdoors2") ~= nil ) then
|
||||
minetest.register_craft({
|
||||
output = 'locks:door',
|
||||
recipe = {
|
||||
{ 'xdoors2:door', 'locks:lock', '' },
|
||||
},
|
||||
});
|
||||
|
||||
-- if the normal doors are installed
|
||||
else if( minetest.get_modpath("doors") ~= nil ) then
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'locks:door',
|
||||
recipe = {
|
||||
{ 'doors:door_wood', 'locks:lock', '' },
|
||||
},
|
||||
output = 'locks:door',
|
||||
recipe = {
|
||||
{ 'locks: lock', 'xdoors2:door', ing},
|
||||
},
|
||||
})
|
||||
|
||||
-- fallback if no doors can be found
|
||||
-- if the normal doors are installed
|
||||
elseif( minetest.get_modpath("doors") ~= nil ) then
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'locks:door',
|
||||
recipe = {
|
||||
{ 'locks:lock', 'doors:door_wood', ing},
|
||||
},
|
||||
})
|
||||
|
||||
-- fallback if no doors can be found
|
||||
else
|
||||
minetest.register_craft({
|
||||
output = 'locks:door',
|
||||
recipe = {
|
||||
{ 'default:wood', 'default:wood', '' },
|
||||
{ 'default:wood', 'default:wood', 'locks:lock' },
|
||||
{ 'default:wood', 'default:wood', '' },
|
||||
},
|
||||
});
|
||||
minetest.register_craft({
|
||||
output = 'locks:door',
|
||||
recipe = {
|
||||
{ 'default:wood', 'default:wood', '' },
|
||||
{ 'default:wood', 'default:wood', 'locks:lock' },
|
||||
{ 'default:wood', 'default:wood', ing },
|
||||
},
|
||||
})
|
||||
end
|
||||
end -- of previous else
|
||||
|
||||
|
||||
|
||||
print( "[Mod] locks: loading locks:door");
|
||||
print( "[Mod] locks: loading locks:door")
|
||||
|
|
Loading…
Reference in New Issue