Move all common mods back to minetest_game
[oweals/minetest_game.git] / mods / doors / init.lua
1 doors = {}
2
3 -- Registers a door
4 --  name: The name of the door
5 --  def: a table with the folowing fields:
6 --    description
7 --    inventory_image
8 --    groups
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
12 --    node_box_bottom
13 --    node_box_top
14 --    selection_box_bottom
15 --    selection_box_top
16 --    only_placer_can_open: if true only the player who placed the door can
17 --                          open it
18 function doors:register_door(name, def)
19         def.groups.not_in_creative_inventory = 1
20         
21         local box = {{-0.5, -0.5, -0.5,   0.5, 0.5, -0.5+1.5/16}}
22         
23         if not def.node_box_bottom then
24                 def.node_box_bottom = box
25         end
26         if not def.node_box_top then
27                 def.node_box_top = box
28         end
29         if not def.selection_box_bottom then
30                 def.selection_box_bottom= box
31         end
32         if not def.selection_box_top then
33                 def.selection_box_top = box
34         end
35         
36         minetest.register_craftitem(name, {
37                 description = def.description,
38                 inventory_image = def.inventory_image,
39                 
40                 on_place = function(itemstack, placer, pointed_thing)
41                         if not pointed_thing.type == "node" then
42                                 return itemstack
43                         end
44                         
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)
49                         end
50                         
51                         local pt = pointed_thing.above
52                         local pt2 = {x=pt.x, y=pt.y, z=pt.z}
53                         pt2.y = pt2.y+1
54                         if
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
57                                 not placer or
58                                 not placer:is_player()
59                         then
60                                 return itemstack
61                         end
62                         
63                         local p2 = minetest.dir_to_facedir(placer:get_look_dir())
64                         local pt3 = {x=pt.x, y=pt.y, z=pt.z}
65                         if p2 == 0 then
66                                 pt3.x = pt3.x-1
67                         elseif p2 == 1 then
68                                 pt3.z = pt3.z+1
69                         elseif p2 == 2 then
70                                 pt3.x = pt3.x+1
71                         elseif p2 == 3 then
72                                 pt3.z = pt3.z-1
73                         end
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})
77                         else
78                                 minetest.env:set_node(pt, {name=name.."_b_2", param2=p2})
79                                 minetest.env:set_node(pt2, {name=name.."_t_2", param2=p2})
80                         end
81                         
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)
90                         end
91                         
92                         if not minetest.setting_getbool("creative_mode") then
93                                 itemstack:take_item()
94                         end
95                         return itemstack
96                 end,
97         })
98         
99         local tt = def.tiles_top
100         local tb = def.tiles_bottom
101         
102         local function after_dig_node(pos, name)
103                 if minetest.env:get_node(pos).name == name then
104                         minetest.env:remove_node(pos)
105                 end
106         end
107         
108         local function on_rightclick(pos, dir, check_name, replace, replace_dir, params)
109                 pos.y = pos.y+dir
110                 if not minetest.env:get_node(pos).name == check_name then
111                         return
112                 end
113                 local p2 = minetest.env:get_node(pos).param2
114                 p2 = params[p2+1]
115                 
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)
119                 
120                 pos.y = pos.y-dir
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)
124         end
125         
126         local function check_player_priv(pos, player)
127                 if not def.only_placer_can_open then
128                         return true
129                 end
130                 local meta = minetest.env:get_meta(pos)
131                 local pn = player:get_player_name()
132                 return meta:get_string("doors_owner") == pn
133         end
134         
135         minetest.register_node(name.."_b_1", {
136                 tiles = {tb[2], tb[2], tb[2], tb[2], tb[1], tb[1].."^[transformfx"},
137                 paramtype = "light",
138                 paramtype2 = "facedir",
139                 drop = name,
140                 drawtype = "nodebox",
141                 node_box = {
142                         type = "fixed",
143                         fixed = def.node_box_bottom
144                 },
145                 selection_box = {
146                         type = "fixed",
147                         fixed = def.selection_box_bottom
148                 },
149                 groups = def.groups,
150                 
151                 after_dig_node = function(pos, oldnode, oldmetadata, digger)
152                         pos.y = pos.y+1
153                         after_dig_node(pos, name.."_t_1")
154                 end,
155                 
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})
159                         end
160                 end,
161                 
162                 can_dig = check_player_priv,
163         })
164         
165         minetest.register_node(name.."_t_1", {
166                 tiles = {tt[2], tt[2], tt[2], tt[2], tt[1], tt[1].."^[transformfx"},
167                 paramtype = "light",
168                 paramtype2 = "facedir",
169                 drop = name,
170                 drawtype = "nodebox",
171                 node_box = {
172                         type = "fixed",
173                         fixed = def.node_box_top
174                 },
175                 selection_box = {
176                         type = "fixed",
177                         fixed = def.selection_box_top
178                 },
179                 groups = def.groups,
180                 
181                 after_dig_node = function(pos, oldnode, oldmetadata, digger)
182                         pos.y = pos.y-1
183                         after_dig_node(pos, name.."_b_1")
184                 end,
185                 
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})
189                         end
190                 end,
191                 
192                 can_dig = check_player_priv,
193         })
194         
195         minetest.register_node(name.."_b_2", {
196                 tiles = {tb[2], tb[2], tb[2], tb[2], tb[1].."^[transformfx", tb[1]},
197                 paramtype = "light",
198                 paramtype2 = "facedir",
199                 drop = name,
200                 drawtype = "nodebox",
201                 node_box = {
202                         type = "fixed",
203                         fixed = def.node_box_bottom
204                 },
205                 selection_box = {
206                         type = "fixed",
207                         fixed = def.selection_box_bottom
208                 },
209                 groups = def.groups,
210                 
211                 after_dig_node = function(pos, oldnode, oldmetadata, digger)
212                         pos.y = pos.y+1
213                         after_dig_node(pos, name.."_t_2")
214                 end,
215                 
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})
219                         end
220                 end,
221                 
222                 can_dig = check_player_priv,
223         })
224         
225         minetest.register_node(name.."_t_2", {
226                 tiles = {tt[2], tt[2], tt[2], tt[2], tt[1].."^[transformfx", tt[1]},
227                 paramtype = "light",
228                 paramtype2 = "facedir",
229                 drop = name,
230                 drawtype = "nodebox",
231                 node_box = {
232                         type = "fixed",
233                         fixed = def.node_box_top
234                 },
235                 selection_box = {
236                         type = "fixed",
237                         fixed = def.selection_box_top
238                 },
239                 groups = def.groups,
240                 
241                 after_dig_node = function(pos, oldnode, oldmetadata, digger)
242                         pos.y = pos.y-1
243                         after_dig_node(pos, name.."_b_2")
244                 end,
245                 
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})
249                         end
250                 end,
251                 
252                 can_dig = check_player_priv,
253         })
254         
255 end
256
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"},
263 })
264
265 minetest.register_craft({
266         output = "doors:door_wood",
267         recipe = {
268                 {"group:wood", "group:wood"},
269                 {"group:wood", "group:wood"},
270                 {"group:wood", "group:wood"}
271         }
272 })
273
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,
281 })
282
283 minetest.register_craft({
284         output = "doors:door_steel",
285         recipe = {
286                 {"default:steel_ingot", "default:steel_ingot"},
287                 {"default:steel_ingot", "default:steel_ingot"},
288                 {"default:steel_ingot", "default:steel_ingot"}
289         }
290 })
291
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")