3 -- Load support for MT game translation.
4 local S = minetest.get_translator("xpanes")
7 local function is_pane(pos)
8 return minetest.get_item_group(minetest.get_node(pos).name, "pane") > 0
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
17 local connects_to = minetest.registered_nodes[name].connects_to
18 if not connects_to then
21 local list = minetest.find_nodes_in_area(aside, aside, connects_to)
30 local function swap(pos, node, name, param2)
31 if node.name == name and node.param2 == param2 then
35 minetest.swap_node(pos, {name = name, param2 = param2})
38 local function update_pane(pos)
39 if not is_pane(pos) then
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)
48 local any = node.param2
52 c[dir] = connects_dir(pos, name, dir)
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)
67 swap(pos, node, name, 0)
70 swap(pos, node, name, 0)
74 minetest.register_on_placenode(function(pos, node)
75 if minetest.get_item_group(node, "pane") then
79 local dir = minetest.facedir_to_dir(i)
80 update_pane(vector.add(pos, dir))
84 minetest.register_on_dignode(function(pos)
86 local dir = minetest.facedir_to_dir(i)
87 update_pane(vector.add(pos, dir))
92 function xpanes.register_pane(name, def)
94 minetest.register_alias("xpanes:" .. name .. "_" .. i, "xpanes:" .. name .. "_flat")
97 local flatgroups = table.copy(def.groups)
99 minetest.register_node(":xpanes:" .. name .. "_flat", {
100 description = def.description,
101 drawtype = "nodebox",
103 is_ground_content = false,
104 sunlight_propagates = true,
105 inventory_image = def.inventory_image,
106 wield_image = def.wield_image,
107 paramtype2 = "facedir",
117 drop = "xpanes:" .. name .. "_flat",
119 use_texture_alpha = def.use_texture_alpha or false,
122 fixed = {{-1/2, -1/2, -1/32, 1/2, 1/2, 1/32}},
126 fixed = {{-1/2, -1/2, -1/32, 1/2, 1/2, 1/32}},
128 connect_sides = { "left", "right" },
131 local groups = table.copy(def.groups)
133 groups.not_in_creative_inventory = 1
134 minetest.register_node(":xpanes:" .. name, {
135 drawtype = "nodebox",
137 is_ground_content = false,
138 sunlight_propagates = true,
139 description = def.description,
140 tiles = {def.textures[3], def.textures[3], def.textures[1]},
142 drop = "xpanes:" .. name .. "_flat",
144 use_texture_alpha = def.use_texture_alpha or false,
147 fixed = {{-1/32, -1/2, -1/32, 1/32, 1/2, 1/32}},
148 connect_front = {{-1/32, -1/2, -1/2, 1/32, 1/2, -1/32}},
149 connect_left = {{-1/2, -1/2, -1/32, -1/32, 1/2, 1/32}},
150 connect_back = {{-1/32, -1/2, 1/32, 1/32, 1/2, 1/2}},
151 connect_right = {{1/32, -1/2, -1/32, 1/2, 1/2, 1/32}},
153 connects_to = {"group:pane", "group:stone", "group:glass", "group:wood", "group:tree"},
156 minetest.register_craft({
157 output = "xpanes:" .. name .. "_flat 16",
162 xpanes.register_pane("pane", {
163 description = S("Glass Pane"),
164 textures = {"default_glass.png","xpanes_pane_half.png","xpanes_edge.png"},
165 inventory_image = "default_glass.png",
166 wield_image = "default_glass.png",
167 sounds = default.node_sound_glass_defaults(),
168 groups = {snappy=2, cracky=3, oddly_breakable_by_hand=3},
170 {"default:glass", "default:glass", "default:glass"},
171 {"default:glass", "default:glass", "default:glass"}
175 xpanes.register_pane("obsidian_pane", {
176 description = S("Obsidian Glass Pane"),
177 textures = {"default_obsidian_glass.png","xpanes_pane_half.png","xpanes_edge_obsidian.png"},
178 inventory_image = "default_obsidian_glass.png",
179 wield_image = "default_obsidian_glass.png",
180 sounds = default.node_sound_glass_defaults(),
181 groups = {snappy=2, cracky=3},
183 {"default:obsidian_glass", "default:obsidian_glass", "default:obsidian_glass"},
184 {"default:obsidian_glass", "default:obsidian_glass", "default:obsidian_glass"}
188 xpanes.register_pane("bar", {
189 description = S("Steel Bars"),
190 textures = {"xpanes_bar.png","xpanes_bar.png","xpanes_bar_top.png"},
191 inventory_image = "xpanes_bar.png",
192 wield_image = "xpanes_bar.png",
194 sounds = default.node_sound_metal_defaults(),
196 {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
197 {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}
201 minetest.register_lbm({
202 name = "xpanes:gen2",
203 nodenames = {"group:pane"},
204 action = function(pos, node)
207 local dir = minetest.facedir_to_dir(i)
208 update_pane(vector.add(pos, dir))
213 -- Register steel bar doors and trapdoors
215 if minetest.get_modpath("doors") then
217 doors.register("xpanes:door_steel_bar", {
218 tiles = {{name = "xpanes_door_steel_bar.png", backface_culling = true}},
219 description = S("Steel Bar Door"),
220 inventory_image = "xpanes_item_steel_bar.png",
222 groups = {cracky = 1, level = 2},
223 sounds = default.node_sound_metal_defaults(),
224 sound_open = "doors_steel_door_open",
225 sound_close = "doors_steel_door_close",
227 {"xpanes:bar_flat", "xpanes:bar_flat"},
228 {"xpanes:bar_flat", "xpanes:bar_flat"},
229 {"xpanes:bar_flat", "xpanes:bar_flat"},
233 doors.register_trapdoor("xpanes:trapdoor_steel_bar", {
234 description = S("Steel Bar Trapdoor"),
235 inventory_image = "xpanes_trapdoor_steel_bar.png",
236 wield_image = "xpanes_trapdoor_steel_bar.png",
237 tile_front = "xpanes_trapdoor_steel_bar.png",
238 tile_side = "xpanes_trapdoor_steel_bar_side.png",
240 groups = {cracky = 1, level = 2, door = 1},
241 sounds = default.node_sound_metal_defaults(),
242 sound_open = "doors_steel_door_open",
243 sound_close = "doors_steel_door_close",
246 minetest.register_craft({
247 output = "xpanes:trapdoor_steel_bar",
249 {"xpanes:bar_flat", "xpanes:bar_flat"},
250 {"xpanes:bar_flat", "xpanes:bar_flat"},