diff --git a/mods/xpanes/README.txt b/mods/xpanes/README.txt new file mode 100644 index 00000000..021f8f80 --- /dev/null +++ b/mods/xpanes/README.txt @@ -0,0 +1,13 @@ +Minetest 0.4.x mod: xpanes +========================== + +License: +-------- +Copyright (C) xyz +modified by BlockMen (iron bars) + +This program is free software. It comes without any warranty, to +the extent permitted by applicable law. You can redistribute it +and/or modify it under the terms of the Do What The Fuck You Want +To Public License, Version 2, as published by Sam Hocevar. See +http://sam.zoy.org/wtfpl/COPYING for more details. diff --git a/mods/xpanes/depends.txt b/mods/xpanes/depends.txt new file mode 100644 index 00000000..331d858c --- /dev/null +++ b/mods/xpanes/depends.txt @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/mods/xpanes/init.lua b/mods/xpanes/init.lua new file mode 100644 index 00000000..92d9bfce --- /dev/null +++ b/mods/xpanes/init.lua @@ -0,0 +1,173 @@ +local function rshift(x, by) + return math.floor(x / 2 ^ by) +end + +local directions = { + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}, +} + +local function update_pane(pos,name) + if minetest.get_node(pos).name:find("xpanes:"..name) == nil then + return + end + local sum = 0 + for i = 1, 4 do + local node = minetest.get_node({x = pos.x + directions[i].x, y = pos.y + directions[i].y, z = pos.z + directions[i].z}) + local pane_num = minetest.registered_nodes[node.name].groups.pane or 0 + if (minetest.registered_nodes[node.name].walkable ~= false and minetest.registered_nodes[node.name].drawtype ~= "nodebox") or pane_num > 0 then + sum = sum + 2 ^ (i - 1) + end + end + if sum == 0 then + sum = 15 + end + minetest.set_node(pos, {name = "xpanes:"..name.."_"..sum}) +end + +local function update_nearby(pos,n) + if n == nil then n = minetest.get_node(pos) end + if not n or not n.name then return end + local name = string.sub(n.name,8,10) + if name ~= "bar" then name = "pane" end + for i = 1,4 do + update_pane({x = pos.x + directions[i].x, y = pos.y + directions[i].y, z = pos.z + directions[i].z}, name) + end +end + +local half_blocks = { + {0, -0.5, -1/32, 0.5, 0.5, 1/32}, + {-1/32, -0.5, 0, 1/32, 0.5, 0.5}, + {-0.5, -0.5, -1/32, 0, 0.5, 1/32}, + {-1/32, -0.5, -0.5, 1/32, 0.5, 0} +} + +local full_blocks = { + {-0.5, -0.5, -1/32, 0.5, 0.5, 1/32}, + {-1/32, -0.5, -0.5, 1/32, 0.5, 0.5} +} + +local sb_half_blocks = { + {0, -0.5, -0.06, 0.5, 0.5, 0.06}, + {-0.06, -0.5, 0, 0.06, 0.5, 0.5}, + {-0.5, -0.5, -0.06, 0, 0.5, 0.06}, + {-0.06, -0.5, -0.5, 0.06, 0.5, 0} +} + +local sb_full_blocks = { + {-0.5, -0.5, -0.06, 0.5, 0.5, 0.06}, + {-0.06, -0.5, -0.5, 0.06, 0.5, 0.5} +} +--register panes and bars +local function register_panes(name, def) +for i = 1, 15 do + local need = {} + local cnt = 0 + for j = 1, 4 do + if rshift(i, j - 1) % 2 == 1 then + need[j] = true + cnt = cnt + 1 + end + end + local take = {} + local take2 = {} + if need[1] == true and need[3] == true then + need[1] = nil + need[3] = nil + table.insert(take, full_blocks[1]) + table.insert(take2, sb_full_blocks[1]) + end + if need[2] == true and need[4] == true then + need[2] = nil + need[4] = nil + table.insert(take, full_blocks[2]) + table.insert(take2, sb_full_blocks[2]) + end + for k in pairs(need) do + table.insert(take, half_blocks[k]) + table.insert(take2, sb_half_blocks[k]) + end + local texture = def.textures[1] + if cnt == 1 then + texture = def.textures[1].."^"..def.textures[2] + end + minetest.register_node("xpanes:"..name.."_"..i, { + drawtype = "nodebox", + tiles = {def.textures[3], def.textures[3], texture}, + paramtype = "light", + groups = def.groups, + drop = "xpanes:"..name, + sounds = def.sounds, + node_box = { + type = "fixed", + fixed = take + }, + selection_box = { + type = "fixed", + fixed = take2 + } + }) +end + +minetest.register_node("xpanes:"..name, def) + +minetest.register_craft({ + output = "xpanes:"..name.." 16", + recipe = def.recipe +}) +end + +minetest.register_on_placenode(update_nearby) +minetest.register_on_dignode(update_nearby) + +register_panes("pane", { + description = "Glass Pane", + tiles = {"xpanes_space.png"}, + drawtype = "airlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + air_equivalent = true, + textures = {"default_glass.png","xpanes_pane_half.png","xpanes_white.png"}, + inventory_image = "default_glass.png", + wield_image = "default_glass.png", + sounds = default.node_sound_glass_defaults(), + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,pane=1}, + on_construct = function(pos) + update_pane(pos, "pane") + end, + recipe = { + {'default:glass', 'default:glass', 'default:glass'}, + {'default:glass', 'default:glass', 'default:glass'} + } +}) + +register_panes("bar", { + description = "Iron bar", + tiles = {"xpanes_space.png"}, + drawtype = "airlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + air_equivalent = true, + textures = {"xpanes_bar.png","xpanes_bar.png","xpanes_space.png"}, + inventory_image = "xpanes_bar.png", + wield_image = "xpanes_bar.png", + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,pane=1}, + sounds = default.node_sound_stone_defaults(), + on_construct = function(pos) + update_pane(pos, "bar") + end, + recipe = { + {'default:steel_ingot', 'default:glass', 'default:glass'}, + {'default:glass', 'default:glass', 'default:glass'} + } +}) diff --git a/mods/xpanes/textures/xpanes_bar.png b/mods/xpanes/textures/xpanes_bar.png new file mode 100644 index 00000000..a8becd74 Binary files /dev/null and b/mods/xpanes/textures/xpanes_bar.png differ diff --git a/mods/xpanes/textures/xpanes_grey.png b/mods/xpanes/textures/xpanes_grey.png new file mode 100644 index 00000000..566d4f86 Binary files /dev/null and b/mods/xpanes/textures/xpanes_grey.png differ diff --git a/mods/xpanes/textures/xpanes_pane_half.png b/mods/xpanes/textures/xpanes_pane_half.png new file mode 100644 index 00000000..30d240ca Binary files /dev/null and b/mods/xpanes/textures/xpanes_pane_half.png differ diff --git a/mods/xpanes/textures/xpanes_space.png b/mods/xpanes/textures/xpanes_space.png new file mode 100644 index 00000000..c2e87522 Binary files /dev/null and b/mods/xpanes/textures/xpanes_space.png differ diff --git a/mods/xpanes/textures/xpanes_white.png b/mods/xpanes/textures/xpanes_white.png new file mode 100644 index 00000000..5c6256c1 Binary files /dev/null and b/mods/xpanes/textures/xpanes_white.png differ