moreblocks/stairsplus.lua

449 lines
14 KiB
Lua

dofile(minetest.get_modpath("moreblocks").."/_config.txt")
-- 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)
if show_stairsplus_creative_inv then
groups.not_in_creative_inventory = 0
else
groups.not_in_creative_inventory = 1
end
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",
{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",
{cracky=3},
{"default_stone.png"},
"Stone",
"cobble",
0)
register_stair_slab_panel_micro("moreblocks", "cobble", "default:cobble",
{cracky=3},
{"default_cobble.png"},
"Cobblestone",
"cobble",
0)
register_stair_slab_panel_micro("moreblocks", "mossycobble", "default:mossycobble",
{cracky=3},
{"default_mossycobble.png"},
"Mossy Cobblestone",
"mossycobble",
0)
register_stair_slab_panel_micro("moreblocks", "brick", "default:brick",
{cracky=3},
{"default_brick.png"},
"Brick",
"brick",
0)
register_stair_slab_panel_micro("moreblocks", "sandstone", "default:sandstone",
{crumbly=2,cracky=2},
{"default_sandstone.png"},
"Sandstone",
"sandstone",
0)
register_stair_slab_panel_micro("moreblocks", "steelblock", "default:steelblock",
{cracky=1,level=2},
{"default_steel_block.png"},
"Steel Block",
"steelblock",
0)
register_stair_slab_panel_micro("moreblocks", "goldblock", "default:goldblock",
{cracky=1},
{"default_gold_block.png"},
"Gold Block",
"goldblock",
0)
register_stair_slab_panel_micro("moreblocks", "copperblock", "default:copperblock",
{cracky=1,level=2},
{"default_copper_block.png"},
"Copper Block",
"copperblock",
0)
register_stair_slab_panel_micro("moreblocks", "bronzeblock", "default:bronzeblock",
{cracky=1,level=2},
{"default_bronze_block.png"},
"Bronze Block",
"bronzeblock",
0)
register_stair_slab_panel_micro("moreblocks", "diamondblock", "default:diamondblock",
{cracky=1,level=3},
{"default_diamond_block.png"},
"Diamond Block",
"diamondblock",
0)
register_stair_slab_panel_micro("moreblocks", "desert_stone", "default:desert_stone",
{cracky=3},
{"default_desert_stone.png"},
"Desert Stone",
"desert_stone",
0)
register_stair_slab_panel_micro("moreblocks", "glass", "default:glass",
{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",
{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",
{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",
{cracky=1,level=2},
{"default_obsidian.png"},
"Obsidian",
"obsidian",
0)
register_stair_slab_panel_micro("moreblocks", "obsidian_glass", "default:obsidian_glass",
{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",
{cracky=3},
{"default_stone_brick.png"},
"Stone Bricks",
"stone_bricks",
0)
register_stair_slab_panel_micro("moreblocks", "desert_stonebrick", "default:desert_stonebrick",
{cracky=3},
{"default_desert_stone_brick.png"},
"Desert Stone Bricks",
"desert_stonebrick",
0)
register_stair_slab_panel_micro("moreblocks", "sandstonebrick", "default:sandstonebrick",
{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",
{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",
{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",
{cracky=3},
{"moreblocks_stone_tile.png"},
"Stonesquare",
"stone_tile",
0)
register_stair_slab_panel_micro("moreblocks", "split_stone_tile", "moreblocks:split_stone_tile",
{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", -- Compatibility
{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", "junglewood", "default:junglewood",
{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",
{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",
{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",
{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",
{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",
{cracky=3},
{"moreblocks_coal_stone.png"},
"Coal Stone",
"coal_stone",
0)
register_stair_slab_panel_micro("moreblocks", "iron_stone", "moreblocks:iron_stone",
{cracky=3},
{"moreblocks_iron_stone.png"},
"Iron Stone",
"iron_stone",
0)
register_stair_slab_panel_micro("moreblocks", "glow_glass", "moreblocks:glow_glass",
{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",
{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",
{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",
{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",
{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",
{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",
{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)