7293dce34fbfc192cade8f403d0e74e172e56252
[oweals/minetest_game.git] / mods / xpanes / init.lua
1 -- xpanes/init.lua
2
3 -- Load support for MT game translation.
4 local S = minetest.get_translator("xpanes")
5
6
7 local function is_pane(pos)
8         return minetest.get_item_group(minetest.get_node(pos).name, "pane") > 0
9 end
10
11 local function connects_dir(pos, name, dir)
12         local aside = vector.add(pos, minetest.facedir_to_dir(dir))
13         if is_pane(aside) then
14                 return true
15         end
16
17         local connects_to = minetest.registered_nodes[name].connects_to
18         if not connects_to then
19                 return false
20         end
21         local list = minetest.find_nodes_in_area(aside, aside, connects_to)
22
23         if #list > 0 then
24                 return true
25         end
26
27         return false
28 end
29
30 local function swap(pos, node, name, param2)
31         if node.name == name and node.param2 == param2 then
32                 return
33         end
34
35         minetest.swap_node(pos, {name = name, param2 = param2})
36 end
37
38 local function update_pane(pos)
39         if not is_pane(pos) then
40                 return
41         end
42         local node = minetest.get_node(pos)
43         local name = node.name
44         if name:sub(-5) == "_flat" then
45                 name = name:sub(1, -6)
46         end
47
48         local any = node.param2
49         local c = {}
50         local count = 0
51         for dir = 0, 3 do
52                 c[dir] = connects_dir(pos, name, dir)
53                 if c[dir] then
54                         any = dir
55                         count = count + 1
56                 end
57         end
58
59         if count == 0 then
60                 swap(pos, node, name .. "_flat", any)
61         elseif count == 1 then
62                 swap(pos, node, name .. "_flat", (any + 1) % 4)
63         elseif count == 2 then
64                 if (c[0] and c[2]) or (c[1] and c[3]) then
65                         swap(pos, node, name .. "_flat", (any + 1) % 4)
66                 else
67                         swap(pos, node, name, 0)
68                 end
69         else
70                 swap(pos, node, name, 0)
71         end
72 end
73
74 minetest.register_on_placenode(function(pos, node)
75         if minetest.get_item_group(node, "pane") then
76                 update_pane(pos)
77         end
78         for i = 0, 3 do
79                 local dir = minetest.facedir_to_dir(i)
80                 update_pane(vector.add(pos, dir))
81         end
82 end)
83
84 minetest.register_on_dignode(function(pos)
85         for i = 0, 3 do
86                 local dir = minetest.facedir_to_dir(i)
87                 update_pane(vector.add(pos, dir))
88         end
89 end)
90
91 xpanes = {}
92 function xpanes.register_pane(name, def)
93         for i = 1, 15 do
94                 minetest.register_alias("xpanes:" .. name .. "_" .. i, "xpanes:" .. name .. "_flat")
95         end
96
97         local flatgroups = table.copy(def.groups)
98         flatgroups.pane = 1
99         minetest.register_node(":xpanes:" .. name .. "_flat", {
100                 description = def.description,
101                 drawtype = "nodebox",
102                 paramtype = "light",
103                 is_ground_content = false,
104                 sunlight_propagates = true,
105                 inventory_image = def.inventory_image,
106                 wield_image = def.wield_image,
107                 paramtype2 = "facedir",
108                 tiles = {
109                                 def.textures[3],
110                                 def.textures[3],
111                                 def.textures[3],
112                                 def.textures[3],
113                                 def.textures[1],
114                                 def.textures[1]
115                 },
116                 groups = flatgroups,
117                 drop = "xpanes:" .. name .. "_flat",
118                 sounds = def.sounds,
119                 use_texture_alpha = def.use_texture_alpha or false,
120                 node_box = {
121                         type = "fixed",
122                         fixed = {{-1/2, -1/2, -1/32, 1/2, 1/2, 1/32}},
123                 },
124                 selection_box = {
125                         type = "fixed",
126                         fixed = {{-1/2, -1/2, -1/32, 1/2, 1/2, 1/32}},
127                 },
128                 connect_sides = { "left", "right" },
129         })
130
131         local groups = table.copy(def.groups)
132         groups.pane = 1
133         groups.not_in_creative_inventory = 1
134         minetest.register_node(":xpanes:" .. name, {
135                 drawtype = "nodebox",
136                 paramtype = "light",
137                 is_ground_content = false,
138                 sunlight_propagates = true,
139                 description = def.description,
140                 tiles = {
141                         def.textures[3],
142                         def.textures[3],
143                         def.textures[1]
144                 },
145                 groups = groups,
146                 drop = "xpanes:" .. name .. "_flat",
147                 sounds = def.sounds,
148                 use_texture_alpha = def.use_texture_alpha or false,
149                 node_box = {
150                         type = "connected",
151                         fixed = {{-1/32, -1/2, -1/32, 1/32, 1/2, 1/32}},
152                         connect_front = {{-1/32, -1/2, -1/2, 1/32, 1/2, -1/32}},
153                         connect_left = {{-1/2, -1/2, -1/32, -1/32, 1/2, 1/32}},
154                         connect_back = {{-1/32, -1/2, 1/32, 1/32, 1/2, 1/2}},
155                         connect_right = {{1/32, -1/2, -1/32, 1/2, 1/2, 1/32}},
156                 },
157                 connects_to = {"group:pane", "group:stone", "group:glass", "group:wood", "group:tree"},
158         })
159
160         minetest.register_craft({
161                 output = "xpanes:" .. name .. "_flat 16",
162                 recipe = def.recipe
163         })
164 end
165
166 xpanes.register_pane("pane", {
167         description = S("Glass Pane"),
168         textures = {"default_glass.png", "", "xpanes_edge.png"},
169         inventory_image = "default_glass.png",
170         wield_image = "default_glass.png",
171         sounds = default.node_sound_glass_defaults(),
172         groups = {snappy=2, cracky=3, oddly_breakable_by_hand=3},
173         recipe = {
174                 {"default:glass", "default:glass", "default:glass"},
175                 {"default:glass", "default:glass", "default:glass"}
176         }
177 })
178
179 xpanes.register_pane("obsidian_pane", {
180         description = S("Obsidian Glass Pane"),
181         textures = {"default_obsidian_glass.png", "", "xpanes_edge_obsidian.png"},
182         inventory_image = "default_obsidian_glass.png",
183         wield_image = "default_obsidian_glass.png",
184         sounds = default.node_sound_glass_defaults(),
185         groups = {snappy=2, cracky=3},
186         recipe = {
187                 {"default:obsidian_glass", "default:obsidian_glass", "default:obsidian_glass"},
188                 {"default:obsidian_glass", "default:obsidian_glass", "default:obsidian_glass"}
189         }
190 })
191
192 xpanes.register_pane("bar", {
193         description = S("Steel Bars"),
194         textures = {"xpanes_bar.png", "", "xpanes_bar_top.png"},
195         inventory_image = "xpanes_bar.png",
196         wield_image = "xpanes_bar.png",
197         groups = {cracky=2},
198         sounds = default.node_sound_metal_defaults(),
199         recipe = {
200                 {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
201                 {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}
202         }
203 })
204
205 minetest.register_lbm({
206         name = "xpanes:gen2",
207         nodenames = {"group:pane"},
208         action = function(pos, node)
209                 update_pane(pos)
210                 for i = 0, 3 do
211                         local dir = minetest.facedir_to_dir(i)
212                         update_pane(vector.add(pos, dir))
213                 end
214         end
215 })
216
217 -- Register steel bar doors and trapdoors
218
219 if minetest.get_modpath("doors") then
220
221         doors.register("xpanes:door_steel_bar", {
222                 tiles = {{name = "xpanes_door_steel_bar.png", backface_culling = true}},
223                 description = S("Steel Bar Door"),
224                 inventory_image = "xpanes_item_steel_bar.png",
225                 protected = true,
226                 groups = {cracky = 1, level = 2},
227                 sounds = default.node_sound_metal_defaults(),
228                 sound_open = "xpanes_steel_bar_door_open",
229                 sound_close = "xpanes_steel_bar_door_close",
230                 recipe = {
231                         {"xpanes:bar_flat", "xpanes:bar_flat"},
232                         {"xpanes:bar_flat", "xpanes:bar_flat"},
233                         {"xpanes:bar_flat", "xpanes:bar_flat"},
234                 },
235         })
236
237         doors.register_trapdoor("xpanes:trapdoor_steel_bar", {
238                 description = S("Steel Bar Trapdoor"),
239                 inventory_image = "xpanes_trapdoor_steel_bar.png",
240                 wield_image = "xpanes_trapdoor_steel_bar.png",
241                 tile_front = "xpanes_trapdoor_steel_bar.png",
242                 tile_side = "xpanes_trapdoor_steel_bar_side.png",
243                 protected = true,
244                 groups = {cracky = 1, level = 2, door = 1},
245                 sounds = default.node_sound_metal_defaults(),
246                 sound_open = "xpanes_steel_bar_door_open",
247                 sound_close = "xpanes_steel_bar_door_close",
248         })
249
250         minetest.register_craft({
251                 output = "xpanes:trapdoor_steel_bar",
252                 recipe = {
253                         {"xpanes:bar_flat", "xpanes:bar_flat"},
254                         {"xpanes:bar_flat", "xpanes:bar_flat"},
255                 }
256         })
257 end