Browse Source

Add glasspanes and ironbars

BlockMen 10 years ago
parent
commit
7d63db1703

+ 13 - 0
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.

+ 1 - 0
mods/xpanes/depends.txt

@@ -0,0 +1 @@
+default

+ 173 - 0
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'}
+	}
+})

BIN
mods/xpanes/textures/xpanes_bar.png


BIN
mods/xpanes/textures/xpanes_grey.png


BIN
mods/xpanes/textures/xpanes_pane_half.png


BIN
mods/xpanes/textures/xpanes_space.png


BIN
mods/xpanes/textures/xpanes_white.png