4 -- name: The name of the door
5 -- def: a table with the folowing fields:
9 -- tiles_bottom: the tiles of the bottom part of the door {front, side}
10 -- tiles_top: the tiles of the bottom part of the door {front, side}
11 -- If the following fields are not defined the default values are used
14 -- selection_box_bottom
16 -- only_placer_can_open: if true only the player who placed the door can
18 function doors:register_door(name, def)
19 def.groups.not_in_creative_inventory = 1
21 local box = {{-0.5, -0.5, -0.5, 0.5, 0.5, -0.5+1.5/16}}
23 if not def.node_box_bottom then
24 def.node_box_bottom = box
26 if not def.node_box_top then
27 def.node_box_top = box
29 if not def.selection_box_bottom then
30 def.selection_box_bottom= box
32 if not def.selection_box_top then
33 def.selection_box_top = box
36 minetest.register_craftitem(name, {
37 description = def.description,
38 inventory_image = def.inventory_image,
40 on_place = function(itemstack, placer, pointed_thing)
41 if not pointed_thing.type == "node" then
45 local ptu = pointed_thing.under
46 local nu = minetest.env:get_node(ptu)
47 if minetest.registered_nodes[nu.name].on_rightclick then
48 return minetest.registered_nodes[nu.name].on_rightclick(ptu, nu, placer, itemstack)
51 local pt = pointed_thing.above
52 local pt2 = {x=pt.x, y=pt.y, z=pt.z}
55 not minetest.registered_nodes[minetest.env:get_node(pt).name].buildable_to or
56 not minetest.registered_nodes[minetest.env:get_node(pt2).name].buildable_to or
58 not placer:is_player()
63 local p2 = minetest.dir_to_facedir(placer:get_look_dir())
64 local pt3 = {x=pt.x, y=pt.y, z=pt.z}
74 if not string.find(minetest.env:get_node(pt3).name, name.."_b_") then
75 minetest.env:set_node(pt, {name=name.."_b_1", param2=p2})
76 minetest.env:set_node(pt2, {name=name.."_t_1", param2=p2})
78 minetest.env:set_node(pt, {name=name.."_b_2", param2=p2})
79 minetest.env:set_node(pt2, {name=name.."_t_2", param2=p2})
82 if def.only_placer_can_open then
83 local pn = placer:get_player_name()
84 local meta = minetest.env:get_meta(pt)
85 meta:set_string("doors_owner", pn)
86 meta:set_string("infotext", "Owned by "..pn)
87 meta = minetest.env:get_meta(pt2)
88 meta:set_string("doors_owner", pn)
89 meta:set_string("infotext", "Owned by "..pn)
92 if not minetest.setting_getbool("creative_mode") then
99 local tt = def.tiles_top
100 local tb = def.tiles_bottom
102 local function after_dig_node(pos, name)
103 if minetest.env:get_node(pos).name == name then
104 minetest.env:remove_node(pos)
108 local function on_rightclick(pos, dir, check_name, replace, replace_dir, params)
110 if not minetest.env:get_node(pos).name == check_name then
113 local p2 = minetest.env:get_node(pos).param2
116 local meta = minetest.env:get_meta(pos):to_table()
117 minetest.env:set_node(pos, {name=replace_dir, param2=p2})
118 minetest.env:get_meta(pos):from_table(meta)
121 meta = minetest.env:get_meta(pos):to_table()
122 minetest.env:set_node(pos, {name=replace, param2=p2})
123 minetest.env:get_meta(pos):from_table(meta)
126 local function check_player_priv(pos, player)
127 if not def.only_placer_can_open then
130 local meta = minetest.env:get_meta(pos)
131 local pn = player:get_player_name()
132 return meta:get_string("doors_owner") == pn
135 minetest.register_node(name.."_b_1", {
136 tiles = {tb[2], tb[2], tb[2], tb[2], tb[1], tb[1].."^[transformfx"},
138 paramtype2 = "facedir",
140 drawtype = "nodebox",
143 fixed = def.node_box_bottom
147 fixed = def.selection_box_bottom
151 after_dig_node = function(pos, oldnode, oldmetadata, digger)
153 after_dig_node(pos, name.."_t_1")
156 on_rightclick = function(pos, node, clicker)
157 if check_player_priv(pos, clicker) then
158 on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0})
162 can_dig = check_player_priv,
165 minetest.register_node(name.."_t_1", {
166 tiles = {tt[2], tt[2], tt[2], tt[2], tt[1], tt[1].."^[transformfx"},
168 paramtype2 = "facedir",
170 drawtype = "nodebox",
173 fixed = def.node_box_top
177 fixed = def.selection_box_top
181 after_dig_node = function(pos, oldnode, oldmetadata, digger)
183 after_dig_node(pos, name.."_b_1")
186 on_rightclick = function(pos, node, clicker)
187 if check_player_priv(pos, clicker) then
188 on_rightclick(pos, -1, name.."_b_1", name.."_t_2", name.."_b_2", {1,2,3,0})
192 can_dig = check_player_priv,
195 minetest.register_node(name.."_b_2", {
196 tiles = {tb[2], tb[2], tb[2], tb[2], tb[1].."^[transformfx", tb[1]},
198 paramtype2 = "facedir",
200 drawtype = "nodebox",
203 fixed = def.node_box_bottom
207 fixed = def.selection_box_bottom
211 after_dig_node = function(pos, oldnode, oldmetadata, digger)
213 after_dig_node(pos, name.."_t_2")
216 on_rightclick = function(pos, node, clicker)
217 if check_player_priv(pos, clicker) then
218 on_rightclick(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2})
222 can_dig = check_player_priv,
225 minetest.register_node(name.."_t_2", {
226 tiles = {tt[2], tt[2], tt[2], tt[2], tt[1].."^[transformfx", tt[1]},
228 paramtype2 = "facedir",
230 drawtype = "nodebox",
233 fixed = def.node_box_top
237 fixed = def.selection_box_top
241 after_dig_node = function(pos, oldnode, oldmetadata, digger)
243 after_dig_node(pos, name.."_b_2")
246 on_rightclick = function(pos, node, clicker)
247 if check_player_priv(pos, clicker) then
248 on_rightclick(pos, -1, name.."_b_2", name.."_t_1", name.."_b_1", {3,0,1,2})
252 can_dig = check_player_priv,
257 doors:register_door("doors:door_wood", {
258 description = "Wooden Door",
259 inventory_image = "door_wood.png",
260 groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2,door=1},
261 tiles_bottom = {"door_wood_b.png", "door_brown.png"},
262 tiles_top = {"door_wood_a.png", "door_brown.png"},
265 minetest.register_craft({
266 output = "doors:door_wood",
268 {"group:wood", "group:wood"},
269 {"group:wood", "group:wood"},
270 {"group:wood", "group:wood"}
274 doors:register_door("doors:door_steel", {
275 description = "Steel Door",
276 inventory_image = "door_steel.png",
277 groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2,door=1},
278 tiles_bottom = {"door_steel_b.png", "door_grey.png"},
279 tiles_top = {"door_steel_a.png", "door_grey.png"},
280 only_placer_can_open = true,
283 minetest.register_craft({
284 output = "doors:door_steel",
286 {"default:steel_ingot", "default:steel_ingot"},
287 {"default:steel_ingot", "default:steel_ingot"},
288 {"default:steel_ingot", "default:steel_ingot"}
292 minetest.register_alias("doors:door_wood_a_c", "doors:door_wood_t_1")
293 minetest.register_alias("doors:door_wood_a_o", "doors:door_wood_t_1")
294 minetest.register_alias("doors:door_wood_b_c", "doors:door_wood_b_1")
295 minetest.register_alias("doors:door_wood_b_o", "doors:door_wood_b_1")