aboutsummaryrefslogtreecommitdiff
path: root/stairsplus.lua
diff options
context:
space:
mode:
Diffstat (limited to 'stairsplus.lua')
-rw-r--r--stairsplus.lua434
1 files changed, 434 insertions, 0 deletions
diff --git a/stairsplus.lua b/stairsplus.lua
new file mode 100644
index 0000000..82822bf
--- /dev/null
+++ b/stairsplus.lua
@@ -0,0 +1,434 @@
+-- Nodes will be called <modname>:{stair,slab,panel,micro}_<subname>
+
+if minetest.get_modpath("unified_inventory") or not minetest.setting_getbool("creative_mode") then
+ stairsplus_expect_infinite_stacks = false
+else
+ stairsplus_expect_infinite_stacks = true
+end
+
+-- these vales are in order: facedir in degrees = 90, 0, 270, 180, 90
+
+local dirs1 = { 21, 20, 23, 22, 21 }
+local dirs2 = { 15, 8, 17, 6, 15 }
+local dirs3 = { 14, 11, 16, 5, 14 }
+
+stairsplus_players_onwall = {}
+
+minetest.register_chatcommand("st", {
+ params = "",
+ description = "Toggle stairsplus between placing wall/vertical stairs/panels and normal.",
+ func = function(name, param)
+ stairsplus_players_onwall[name] = not stairsplus_players_onwall[name]
+
+ if stairsplus_players_onwall[name] then
+ minetest.chat_send_player(name, "Stairsplus: Placing wall stairs/vertical panels.")
+ else
+ minetest.chat_send_player(name, "Stairsplus: Placing floor/ceiling stairs/panels.")
+ end
+ end
+})
+
+stairsplus_can_it_stack = function(itemstack, placer, pointed_thing)
+ return false
+--[[
+ if pointed_thing.type ~= "node" then
+ return itemstack
+ end
+
+ -- If it's being placed on an another similar one, replace it with
+ -- a full block
+ local slabpos = nil
+ local slabnode = nil
+ local p1 = pointed_thing.above
+ p1 = {x = p1.x, y = p1.y - 1, z = p1.z}
+ local n1 = minetest.env:get_node(p1)
+ if n1.name == modname .. ":slab_" .. subname then
+ slabpos = p1
+ slabnode = n1
+ end
+ if slabpos then
+ -- Remove the slab at slabpos
+ minetest.env:remove_node(slabpos)
+ -- Make a fake stack of a single item and try to place it
+ local fakestack = ItemStack(recipeitem)
+ pointed_thing.above = slabpos
+ fakestack = minetest.item_place(fakestack, placer, pointed_thing)
+ -- If the item was taken from the fake stack, decrement original
+ if not fakestack or fakestack:is_empty() then
+ itemstack:take_item(1)
+ -- Else put old node back
+ else
+ minetest.env:set_node(slabpos, slabnode)
+ end
+ return itemstack
+ end
+
+ if n1.name == modname .. ":slab_" .. subname .. "_quarter" then
+ slabpos = p1
+ slabnode = n1
+ end
+ if slabpos then
+ -- Remove the slab at slabpos
+ minetest.env:remove_node(slabpos)
+ -- Make a fake stack of a single item and try to place it
+ local fakestack = ItemStack(modname .. ":slab_" .. subname .. "_three_quarter")
+ pointed_thing.above = slabpos
+ fakestack = minetest.item_place(fakestack, placer, pointed_thing)
+ -- If the item was taken from the fake stack, decrement original
+ if not fakestack or fakestack:is_empty() then
+ itemstack:take_item(1)
+ -- Else put old node back
+ else
+ minetest.env:set_node(slabpos, slabnode)
+ end
+ return itemstack
+ end
+
+ -- Otherwise place regularly
+ return minetest.item_place(itemstack, placer, pointed_thing)
+
+]]--
+
+end
+
+local function get_nodedef_field(nodename, fieldname)
+ if not minetest.registered_nodes[nodename] then
+ return nil
+ end
+ return minetest.registered_nodes[nodename][fieldname]
+end
+
+function stairsplus_rotate_and_place(itemstack, placer, pointed_thing, onwall)
+
+ local node = minetest.env:get_node(pointed_thing.under)
+
+ if not minetest.registered_nodes[node.name] or not minetest.registered_nodes[node.name].on_rightclick then
+
+ local above = pointed_thing.above
+ local under = pointed_thing.under
+ local top = {x=under.x, y=under.y+1, z=under.z}
+
+ local pitch = placer:get_look_pitch()
+ local node = minetest.env:get_node(above)
+ local fdir = minetest.dir_to_facedir(placer:get_look_dir())
+ local wield_name = itemstack:get_name()
+
+ local slab = string.find(wield_name, "slab")
+ local panel = string.find(wield_name, "panel")
+ local micro = string.find(wield_name, "micro")
+ local iswall = (above.x ~= under.x) or (above.z ~= under.z)
+ local isceiling = (above.x == under.x) and (above.z == under.z) and (pitch > 0)
+
+ if get_nodedef_field(minetest.env:get_node(under).name, "buildable_to") then
+ if slab then fdir = 0 end
+ minetest.env:add_node(under, {name = wield_name, param2 = fdir }) -- place right side up
+ elseif not get_nodedef_field(minetest.env:get_node(above).name, "buildable_to") then
+ return
+ elseif onwall or (iswall and (slab or panel)) then
+ if slab then
+ minetest.env:add_node(above, {name = wield_name, param2 = dirs2[fdir+2] }) -- place with wall slab rotation
+ else
+ minetest.env:add_node(above, {name = wield_name, param2 = dirs3[fdir+2] }) -- place with wall panel/micro rotation
+ end
+ elseif isceiling then
+ local nfdir = dirs1[fdir+2]
+ if slab then nfdir = 22 end
+ minetest.env:add_node(above, {name = wield_name, param2 = nfdir }) -- place upside down variant
+ else
+ if slab then fdir = 0 end
+ minetest.env:add_node(above, {name = wield_name, param2 = fdir }) -- place right side up
+ end
+
+ if not stairsplus_expect_infinite_stacks then
+ itemstack:take_item()
+ return itemstack
+ end
+ else
+ minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer)
+ end
+end
+
+function register_stair_slab_panel_micro(modname, subname, recipeitem, groups, images, description, drop, light)
+ register_stair(modname, subname, recipeitem, groups, images, description, drop, light)
+ register_slab( modname, subname, recipeitem, groups, images, description, drop, light)
+ register_panel(modname, subname, recipeitem, groups, images, description, drop, light)
+ register_micro(modname, subname, recipeitem, groups, images, description, drop, light)
+ register_6dfacedir_conversion(modname, subname)
+end
+
+-- Default stairs/slabs/panels/microblocks
+
+register_stair_slab_panel_micro("moreblocks", "wood", "default:wood",
+ {not_in_creative_inventory=1,snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
+ {"default_wood.png"},
+ "Wooden",
+ "wood",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "stone", "default:stone",
+ {not_in_creative_inventory=1,cracky=3},
+ {"default_stone.png"},
+ "Stone",
+ "cobble",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "cobble", "default:cobble",
+ {not_in_creative_inventory=1,cracky=3},
+ {"default_cobble.png"},
+ "Cobblestone",
+ "cobble",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "mossycobble", "default:mossycobble",
+ {not_in_creative_inventory=1,cracky=3},
+ {"default_mossycobble.png"},
+ "Mossy Cobblestone",
+ "mossycobble",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "brick", "default:brick",
+ {not_in_creative_inventory=1,cracky=3},
+ {"default_brick.png"},
+ "Brick",
+ "brick",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "sandstone", "default:sandstone",
+ {not_in_creative_inventory=1,crumbly=2,cracky=2},
+ {"default_sandstone.png"},
+ "Sandstone",
+ "sandstone",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "steelblock", "default:steelblock",
+ {not_in_creative_inventory=1,cracky=1,level=2},
+ {"default_steel_block.png"},
+ "Steel Block",
+ "steelblock",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "goldblock", "default:goldblock",
+ {not_in_creative_inventory=1,cracky=1},
+ {"default_gold_block.png"},
+ "Gold Block",
+ "goldblock",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "copperblock", "default:copperblock",
+ {not_in_creative_inventory=1,cracky=1,level=2},
+ {"default_copper_block.png"},
+ "Copper Block",
+ "copperblock",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "bronzeblock", "default:bronzeblock",
+ {not_in_creative_inventory=1,cracky=1,level=2},
+ {"default_bronze_block.png"},
+ "Bronze Block",
+ "bronzeblock",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "diamondblock", "default:diamondblock",
+ {not_in_creative_inventory=1,cracky=1,level=3},
+ {"default_diamond_block.png"},
+ "Diamond Block",
+ "diamondblock",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "desert_stone", "default:desert_stone",
+ {not_in_creative_inventory=1,cracky=3},
+ {"default_desert_stone.png"},
+ "Desert Stone",
+ "desert_stone",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "glass", "default:glass",
+ {not_in_creative_inventory=1,snappy=2,cracky=3,oddly_breakable_by_hand=3},
+ {"moreblocks_glass_stairsplus.png"},
+ "Glass",
+ "glass",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "tree", "default:tree",
+ {not_in_creative_inventory=1,tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
+ {"default_tree_top.png", "default_tree_top.png", "default_tree.png"},
+ "Tree",
+ "tree",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "jungletree", "default:jungletree",
+ {not_in_creative_inventory=1,tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
+ {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"},
+ "Jungle Tree",
+ "jungletree",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "obsidian", "default:obsidian",
+ {not_in_creative_inventory=1,cracky=1,level=2},
+ {"default_obsidian.png"},
+ "Obsidian",
+ "obsidian",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "obsidian_glass", "default:obsidian_glass",
+ {not_in_creative_inventory=1,cracky=3,oddly_breakable_by_hand=3},
+ {"moreblocks_obsidian_glass_stairsplus.png"},
+ "Obsidian Glass",
+ "obsidian_glass",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "stonebrick", "default:stonebrick",
+ {not_in_creative_inventory=1,cracky=3},
+ {"default_stone_brick.png"},
+ "Stone Bricks",
+ "stone_bricks",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "desert_stonebrick", "default:desert_stonebrick",
+ {not_in_creative_inventory=1,cracky=3},
+ {"default_desert_stone_brick.png"},
+ "Desert Stone Bricks",
+ "desert_stonebrick",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "sandstonebrick", "default:sandstonebrick",
+ {not_in_creative_inventory=1,cracky=3},
+ {"default_sandstone_brick.png"},
+ "Sandstone Bricks",
+ "sandstonebrick",
+ 0)
+
+-- More Blocks stairs/slabs/panels/microblocks
+
+register_stair_slab_panel_micro("moreblocks", "circle_stone_bricks", "moreblocks:circle_stone_bricks",
+ {not_in_creative_inventory=1,cracky=3},
+ {"moreblocks_circle_stone_bricks.png"},
+ "Circle Stone Bricks",
+ "circle_stone_bricks",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "iron_stone_bricks", "moreblocks:iron_stone_bricks",
+ {not_in_creative_inventory=1,cracky=3},
+ {"moreblocks_iron_stone_bricks.png"},
+ "Iron Stone Bricks",
+ "iron_stone_bricks",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "stone_tile", "moreblocks:stone_tile",
+ {not_in_creative_inventory=1,cracky=3},
+ {"moreblocks_stone_tile.png"},
+ "Stonesquare",
+ "stone_tile",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "split_stone_tile", "moreblocks:split_stone_tile",
+ {not_in_creative_inventory=1,cracky=3},
+ {"moreblocks_split_stone_tile_top.png", "moreblocks_split_stone_tile.png"},
+ "Split Stonesquare",
+ "split_stone_tile",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "jungle_wood", "default:junglewood",
+ {not_in_creative_inventory=1,snappy=1, choppy=2, oddly_breakable_by_hand=2,flammable=3},
+ {"default_junglewood.png"},
+ "Jungle Wood",
+ "jungle_wood",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "plankstone", "moreblocks:plankstone",
+ {not_in_creative_inventory=1,cracky=3},
+ {"moreblocks_plankstone.png", "moreblocks_plankstone.png", "moreblocks_plankstone.png",
+ "moreblocks_plankstone.png", "moreblocks_plankstone.png^[transformR90", "moreblocks_plankstone.png^[transformR90"},
+ "Plankstone",
+ "plankstone",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "coal_checker", "moreblocks:coal_checker",
+ {not_in_creative_inventory=1,cracky=3},
+ {"moreblocks_coal_checker.png", "moreblocks_coal_checker.png", "moreblocks_coal_checker.png",
+ "moreblocks_coal_checker.png", "moreblocks_coal_checker.png^[transformR90", "moreblocks_coal_checker.png^[transformR90"},
+ "Coal Checker",
+ "coal_checker",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "iron_checker", "moreblocks:iron_checker",
+ {not_in_creative_inventory=1,cracky=3},
+ {"moreblocks_iron_checker.png", "moreblocks_iron_checker.png", "moreblocks_iron_checker.png",
+ "moreblocks_iron_checker.png", "moreblocks_iron_checker.png^[transformR90", "moreblocks_iron_checker.png^[transformR90"},
+ "Iron Checker",
+ "iron_checker",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "cactus_checker", "moreblocks:cactus_checker",
+ {not_in_creative_inventory=1,cracky=3},
+ {"moreblocks_cactus_checker.png", "moreblocks_cactus_checker.png", "moreblocks_cactus_checker.png",
+ "moreblocks_cactus_checker.png", "moreblocks_cactus_checker.png^[transformR90", "moreblocks_cactus_checker.png^[transformR90"},
+ "Cactus Checker",
+ "cactus_checker",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "coal_stone", "moreblocks:coal_stone",
+ {not_in_creative_inventory=1,cracky=3},
+ {"moreblocks_coal_stone.png"},
+ "Coal Stone",
+ "coal_stone",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "iron_stone", "moreblocks:iron_stone",
+ {not_in_creative_inventory=1,cracky=3},
+ {"moreblocks_iron_stone.png"},
+ "Iron Stone",
+ "iron_stone",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "glow_glass", "moreblocks:glow_glass",
+ {not_in_creative_inventory=1,snappy=2,cracky=3,oddly_breakable_by_hand=3},
+ {"moreblocks_glow_glass_stairsplus.png"},
+ "Glow Glass",
+ "glow_glass",
+ 11)
+
+register_stair_slab_panel_micro("moreblocks", "super_glow_glass", "moreblocks:super_glow_glass",
+ {not_in_creative_inventory=1,snappy=2, cracky=3, oddly_breakable_by_hand=3},
+ {"moreblocks_super_glow_glass_stairsplus.png"},
+ "Super Glow Glass",
+ "super_glow_glass",
+ 15)
+
+register_stair_slab_panel_micro("moreblocks", "coal_glass", "moreblocks:coal_glass",
+ {not_in_creative_inventory=1,snappy=2, cracky=3, oddly_breakable_by_hand=3},
+ {"moreblocks_coal_glass_stairsplus.png"},
+ "Coal Glass",
+ "coal_glass",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "iron_glass", "moreblocks:iron_glass",
+ {not_in_creative_inventory=1,snappy=2,cracky=3,oddly_breakable_by_hand=3},
+ {"moreblocks_iron_glass_stairsplus.png"},
+ "Iron Glass",
+ "iron_glass",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "wood_tile", "moreblocks:wood_tile",
+ {not_in_creative_inventory=1,snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
+ {"moreblocks_wood_tile.png", "moreblocks_wood_tile.png", "moreblocks_wood_tile.png",
+ "moreblocks_wood_tile.png", "moreblocks_wood_tile.png^[transformR90", "moreblocks_wood_tile.png^[transformR90"},
+ "Wooden Tile",
+ "wood_tile",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "wood_tile_center", "moreblocks:wood_tile_center",
+ {not_in_creative_inventory=1,snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
+ {"moreblocks_wood_tile_center.png", "moreblocks_wood_tile_center.png", "moreblocks_wood_tile_center.png",
+ "moreblocks_wood_tile_center.png", "moreblocks_wood_tile_center.png^[transformR90", "moreblocks_wood_tile_center.png^[transformR90"},
+ "Centered Wooden Tile",
+ "wood_tile_center",
+ 0)
+
+register_stair_slab_panel_micro("moreblocks", "wood_tile_full", "moreblocks:wood_tile_full",
+ {not_in_creative_inventory=1,snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
+ {"moreblocks_wood_tile_full.png", "moreblocks_wood_tile_full.png", "moreblocks_wood_tile_full.png",
+ "moreblocks_wood_tile_full.png", "moreblocks_wood_tile_full.png^[transformR90", "moreblocks_wood_tile_full.png^[transformR90"},
+ "Full Wooden Tile",
+ "wood_tile_full",
+ 0)