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.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.get_node(pt).name].buildable_to or
56 not minetest.registered_nodes[minetest.get_node(pt2).name].buildable_to or
58 not placer:is_player()
63 if minetest.is_protected(pt, placer:get_player_name()) or
64 minetest.is_protected(pt2, placer:get_player_name()) then
65 minetest.record_protection_violation(pt, placer:get_player_name())
69 local p2 = minetest.dir_to_facedir(placer:get_look_dir())
70 local pt3 = {x=pt.x, y=pt.y, z=pt.z}
80 if not string.find(minetest.get_node(pt3).name, name.."_b_") then
81 minetest.set_node(pt, {name=name.."_b_1", param2=p2})
82 minetest.set_node(pt2, {name=name.."_t_1", param2=p2})
84 minetest.set_node(pt, {name=name.."_b_2", param2=p2})
85 minetest.set_node(pt2, {name=name.."_t_2", param2=p2})
88 if def.only_placer_can_open then
89 local pn = placer:get_player_name()
90 local meta = minetest.get_meta(pt)
91 meta:set_string("doors_owner", pn)
92 meta:set_string("infotext", "Owned by "..pn)
93 meta = minetest.get_meta(pt2)
94 meta:set_string("doors_owner", pn)
95 meta:set_string("infotext", "Owned by "..pn)
98 if not minetest.setting_getbool("creative_mode") then
105 local tt = def.tiles_top
106 local tb = def.tiles_bottom
108 local function after_dig_node(pos, name)
109 if minetest.get_node(pos).name == name then
110 minetest.remove_node(pos)
114 local function on_rightclick(pos, dir, check_name, replace, replace_dir, params)
116 if not minetest.get_node(pos).name == check_name then
119 local p2 = minetest.get_node(pos).param2
122 minetest.swap_node(pos, {name=replace_dir, param2=p2})
125 minetest.swap_node(pos, {name=replace, param2=p2})
128 local function check_player_priv(pos, player)
129 if not def.only_placer_can_open then
132 local meta = minetest.get_meta(pos)
133 local pn = player:get_player_name()
134 return meta:get_string("doors_owner") == pn
137 minetest.register_node(name.."_b_1", {
138 tiles = {tb[2], tb[2], tb[2], tb[2], tb[1], tb[1].."^[transformfx"},
140 paramtype2 = "facedir",
142 drawtype = "nodebox",
145 fixed = def.node_box_bottom
149 fixed = def.selection_box_bottom
153 after_dig_node = function(pos, oldnode, oldmetadata, digger)
155 after_dig_node(pos, name.."_t_1")
158 on_rightclick = function(pos, node, clicker)
159 if check_player_priv(pos, clicker) then
160 on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0})
164 can_dig = check_player_priv,
167 minetest.register_node(name.."_t_1", {
168 tiles = {tt[2], tt[2], tt[2], tt[2], tt[1], tt[1].."^[transformfx"},
170 paramtype2 = "facedir",
172 drawtype = "nodebox",
175 fixed = def.node_box_top
179 fixed = def.selection_box_top
183 after_dig_node = function(pos, oldnode, oldmetadata, digger)
185 after_dig_node(pos, name.."_b_1")
188 on_rightclick = function(pos, node, clicker)
189 if check_player_priv(pos, clicker) then
190 on_rightclick(pos, -1, name.."_b_1", name.."_t_2", name.."_b_2", {1,2,3,0})
194 can_dig = check_player_priv,
197 minetest.register_node(name.."_b_2", {
198 tiles = {tb[2], tb[2], tb[2], tb[2], tb[1].."^[transformfx", tb[1]},
200 paramtype2 = "facedir",
202 drawtype = "nodebox",
205 fixed = def.node_box_bottom
209 fixed = def.selection_box_bottom
213 after_dig_node = function(pos, oldnode, oldmetadata, digger)
215 after_dig_node(pos, name.."_t_2")
218 on_rightclick = function(pos, node, clicker)
219 if check_player_priv(pos, clicker) then
220 on_rightclick(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2})
224 can_dig = check_player_priv,
227 minetest.register_node(name.."_t_2", {
228 tiles = {tt[2], tt[2], tt[2], tt[2], tt[1].."^[transformfx", tt[1]},
230 paramtype2 = "facedir",
232 drawtype = "nodebox",
235 fixed = def.node_box_top
239 fixed = def.selection_box_top
243 after_dig_node = function(pos, oldnode, oldmetadata, digger)
245 after_dig_node(pos, name.."_b_2")
248 on_rightclick = function(pos, node, clicker)
249 if check_player_priv(pos, clicker) then
250 on_rightclick(pos, -1, name.."_b_2", name.."_t_1", name.."_b_1", {3,0,1,2})
254 can_dig = check_player_priv,
259 doors:register_door("doors:door_wood", {
260 description = "Wooden Door",
261 inventory_image = "door_wood.png",
262 groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2,door=1},
263 tiles_bottom = {"door_wood_b.png", "door_brown.png"},
264 tiles_top = {"door_wood_a.png", "door_brown.png"},
267 minetest.register_craft({
268 output = "doors:door_wood",
270 {"group:wood", "group:wood"},
271 {"group:wood", "group:wood"},
272 {"group:wood", "group:wood"}
276 doors:register_door("doors:door_steel", {
277 description = "Steel Door",
278 inventory_image = "door_steel.png",
279 groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2,door=1},
280 tiles_bottom = {"door_steel_b.png", "door_grey.png"},
281 tiles_top = {"door_steel_a.png", "door_grey.png"},
282 only_placer_can_open = true,
285 minetest.register_craft({
286 output = "doors:door_steel",
288 {"default:steel_ingot", "default:steel_ingot"},
289 {"default:steel_ingot", "default:steel_ingot"},
290 {"default:steel_ingot", "default:steel_ingot"}
294 minetest.register_alias("doors:door_wood_a_c", "doors:door_wood_t_1")
295 minetest.register_alias("doors:door_wood_a_o", "doors:door_wood_t_1")
296 minetest.register_alias("doors:door_wood_b_c", "doors:door_wood_b_1")
297 minetest.register_alias("doors:door_wood_b_o", "doors:door_wood_b_1")