123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527 |
- -- Minetest 0.4 mod: stairs
- -- See README.txt for licensing and other information.
- -- Global namespace for functions
- stairs = {}
- -- Register aliases for new pine node names
- minetest.register_alias("stairs:stair_pinewood", "stairs:stair_pine_wood")
- minetest.register_alias("stairs:slab_pinewood", "stairs:slab_pine_wood")
- -- Get setting for replace ABM
- local replace = minetest.setting_getbool("enable_stairs_replace_abm")
- -- Register stairs.
- -- Node will be called stairs:stair_<subname>
- function stairs.register_stair(subname, recipeitem, groups, images, description, sounds)
- groups.stair = 1
- minetest.register_node(":stairs:stair_" .. subname, {
- description = description,
- drawtype = "mesh",
- mesh = "stairs_stair.obj",
- tiles = images,
- paramtype = "light",
- paramtype2 = "facedir",
- is_ground_content = false,
- groups = groups,
- sounds = sounds,
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
- {-0.5, 0, 0, 0.5, 0.5, 0.5},
- },
- },
- collision_box = {
- type = "fixed",
- fixed = {
- {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
- {-0.5, 0, 0, 0.5, 0.5, 0.5},
- },
- },
- on_place = function(itemstack, placer, pointed_thing)
- if pointed_thing.type ~= "node" then
- return itemstack
- end
- local p0 = pointed_thing.under
- local p1 = pointed_thing.above
- local param2 = 0
- local placer_pos = placer:getpos()
- if placer_pos then
- local dir = {
- x = p1.x - placer_pos.x,
- y = p1.y - placer_pos.y,
- z = p1.z - placer_pos.z
- }
- param2 = minetest.dir_to_facedir(dir)
- end
- if p0.y - 1 == p1.y then
- param2 = param2 + 20
- if param2 == 21 then
- param2 = 23
- elseif param2 == 23 then
- param2 = 21
- end
- end
- return minetest.item_place(itemstack, placer, pointed_thing, param2)
- end,
- })
- -- for replace ABM
- if replace then
- minetest.register_node(":stairs:stair_" .. subname .. "upside_down", {
- replace_name = "stairs:stair_" .. subname,
- groups = {slabs_replace = 1},
- })
- end
- if recipeitem then
- minetest.register_craft({
- output = 'stairs:stair_' .. subname .. ' 8',
- recipe = {
- {recipeitem, "", ""},
- {recipeitem, recipeitem, ""},
- {recipeitem, recipeitem, recipeitem},
- },
- })
- -- Flipped recipe for the silly minecrafters
- minetest.register_craft({
- output = 'stairs:stair_' .. subname .. ' 8',
- recipe = {
- {"", "", recipeitem},
- {"", recipeitem, recipeitem},
- {recipeitem, recipeitem, recipeitem},
- },
- })
- end
- end
- -- Register slabs.
- -- Node will be called stairs:slab_<subname>
- function stairs.register_slab(subname, recipeitem, groups, images, description, sounds)
- groups.slab = 1
- minetest.register_node(":stairs:slab_" .. subname, {
- description = description,
- drawtype = "nodebox",
- tiles = images,
- paramtype = "light",
- paramtype2 = "facedir",
- is_ground_content = false,
- groups = groups,
- sounds = sounds,
- node_box = {
- type = "fixed",
- fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
- },
- on_place = function(itemstack, placer, pointed_thing)
- 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 p0 = pointed_thing.under
- local p1 = pointed_thing.above
- local n0 = minetest.get_node(p0)
- local n1 = minetest.get_node(p1)
- local param2 = 0
- local n0_is_upside_down = (n0.name == "stairs:slab_" .. subname and
- n0.param2 >= 20)
- if n0.name == "stairs:slab_" .. subname and not n0_is_upside_down and
- p0.y + 1 == p1.y then
- slabpos = p0
- slabnode = n0
- elseif n1.name == "stairs:slab_" .. subname then
- slabpos = p1
- slabnode = n1
- end
- if slabpos then
- -- Remove the slab at slabpos
- minetest.remove_node(slabpos)
- -- Make a fake stack of a single item and try to place it
- local fakestack = ItemStack(recipeitem)
- fakestack:set_count(itemstack:get_count())
- pointed_thing.above = slabpos
- local success
- fakestack, success = minetest.item_place(fakestack, placer,
- pointed_thing)
- -- If the item was taken from the fake stack, decrement original
- if success then
- itemstack:set_count(fakestack:get_count())
- -- Else put old node back
- else
- minetest.set_node(slabpos, slabnode)
- end
- return itemstack
- end
-
- -- Upside down slabs
- if p0.y - 1 == p1.y then
- -- Turn into full block if pointing at a existing slab
- if n0_is_upside_down then
- -- Remove the slab at the position of the slab
- minetest.remove_node(p0)
- -- Make a fake stack of a single item and try to place it
- local fakestack = ItemStack(recipeitem)
- fakestack:set_count(itemstack:get_count())
- pointed_thing.above = p0
- local success
- fakestack, success = minetest.item_place(fakestack, placer,
- pointed_thing)
- -- If the item was taken from the fake stack, decrement original
- if success then
- itemstack:set_count(fakestack:get_count())
- -- Else put old node back
- else
- minetest.set_node(p0, n0)
- end
- return itemstack
- end
- -- Place upside down slab
- param2 = 20
- end
- -- If pointing at the side of a upside down slab
- if n0_is_upside_down and p0.y + 1 ~= p1.y then
- param2 = 20
- end
- return minetest.item_place(itemstack, placer, pointed_thing, param2)
- end,
- })
- -- for replace ABM
- if replace then
- minetest.register_node(":stairs:slab_" .. subname .. "upside_down", {
- replace_name = "stairs:slab_".. subname,
- groups = {slabs_replace = 1},
- })
- end
- if recipeitem then
- minetest.register_craft({
- output = 'stairs:slab_' .. subname .. ' 6',
- recipe = {
- {recipeitem, recipeitem, recipeitem},
- },
- })
- end
- end
- -- Optionally replace old "upside_down" nodes with new param2 versions.
- -- Disabled by default.
- if replace then
- minetest.register_abm({
- label = "Slab replace",
- nodenames = {"group:slabs_replace"},
- interval = 16,
- chance = 1,
- action = function(pos, node)
- node.name = minetest.registered_nodes[node.name].replace_name
- node.param2 = node.param2 + 20
- if node.param2 == 21 then
- node.param2 = 23
- elseif node.param2 == 23 then
- node.param2 = 21
- end
- minetest.set_node(pos, node)
- end,
- })
- end
- -- Stair/slab registration function.
- -- Nodes will be called stairs:{stair,slab}_<subname>
- function stairs.register_stair_and_slab(subname, recipeitem,
- groups, images, desc_stair, desc_slab, sounds)
- stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds)
- stairs.register_slab(subname, recipeitem, groups, images, desc_slab, sounds)
- end
- -- Register default stairs and slabs
- stairs.register_stair_and_slab(
- "wood",
- "default:wood",
- {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
- {"default_wood.png"},
- "Wooden Stair",
- "Wooden Slab",
- default.node_sound_wood_defaults()
- )
- stairs.register_stair_and_slab(
- "junglewood",
- "default:junglewood",
- {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
- {"default_junglewood.png"},
- "Jungle Wood Stair",
- "Jungle Wood Slab",
- default.node_sound_wood_defaults()
- )
- stairs.register_stair_and_slab(
- "pine_wood",
- "default:pine_wood",
- {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
- {"default_pine_wood.png"},
- "Pine Wood Stair",
- "Pine Wood Slab",
- default.node_sound_wood_defaults()
- )
- stairs.register_stair_and_slab(
- "acacia_wood",
- "default:acacia_wood",
- {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
- {"default_acacia_wood.png"},
- "Acacia Wood Stair",
- "Acacia Wood Slab",
- default.node_sound_wood_defaults()
- )
- stairs.register_stair_and_slab(
- "aspen_wood",
- "default:aspen_wood",
- {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
- {"default_aspen_wood.png"},
- "Aspen Wood Stair",
- "Aspen Wood Slab",
- default.node_sound_wood_defaults()
- )
- stairs.register_stair_and_slab(
- "stone",
- "default:stone",
- {cracky = 3},
- {"default_stone.png"},
- "Stone Stair",
- "Stone Slab",
- default.node_sound_stone_defaults()
- )
- stairs.register_stair_and_slab(
- "cobble",
- "default:cobble",
- {cracky = 3},
- {"default_cobble.png"},
- "Cobblestone Stair",
- "Cobblestone Slab",
- default.node_sound_stone_defaults()
- )
- stairs.register_stair_and_slab(
- "mossycobble",
- nil,
- {cracky = 3},
- {"default_mossycobble.png"},
- "Mossy Cobblestone Stair",
- "Mossy Cobblestone Slab",
- default.node_sound_stone_defaults()
- )
- stairs.register_stair_and_slab(
- "stonebrick",
- "default:stonebrick",
- {cracky = 2},
- {"default_stone_brick.png"},
- "Stone Brick Stair",
- "Stone Brick Slab",
- default.node_sound_stone_defaults()
- )
- stairs.register_stair_and_slab(
- "stone_block",
- "default:stone_block",
- {cracky = 2},
- {"default_stone_block.png"},
- "Stone Block Stair",
- "Stone Block Slab",
- default.node_sound_stone_defaults()
- )
- stairs.register_stair_and_slab(
- "desert_stone",
- "default:desert_stone",
- {cracky = 3},
- {"default_desert_stone.png"},
- "Desert Stone Stair",
- "Desert Stone Slab",
- default.node_sound_stone_defaults()
- )
- stairs.register_stair_and_slab(
- "desert_cobble",
- "default:desert_cobble",
- {cracky = 3},
- {"default_desert_cobble.png"},
- "Desert Cobblestone Stair",
- "Desert Cobblestone Slab",
- default.node_sound_stone_defaults()
- )
- stairs.register_stair_and_slab(
- "desert_stonebrick",
- "default:desert_stonebrick",
- {cracky = 2},
- {"default_desert_stone_brick.png"},
- "Desert Stone Brick Stair",
- "Desert Stone Brick Slab",
- default.node_sound_stone_defaults()
- )
- stairs.register_stair_and_slab(
- "desert_stone_block",
- "default:desert_stone_block",
- {cracky = 2},
- {"default_desert_stone_block.png"},
- "Desert Stone Block Stair",
- "Desert Stone Block Slab",
- default.node_sound_stone_defaults()
- )
- stairs.register_stair_and_slab(
- "sandstone",
- "default:sandstone",
- {crumbly = 1, cracky = 3},
- {"default_sandstone.png"},
- "Sandstone Stair",
- "Sandstone Slab",
- default.node_sound_stone_defaults()
- )
- stairs.register_stair_and_slab(
- "sandstonebrick",
- "default:sandstonebrick",
- {cracky = 2},
- {"default_sandstone_brick.png"},
- "Sandstone Brick Stair",
- "Sandstone Brick Slab",
- default.node_sound_stone_defaults()
- )
- stairs.register_stair_and_slab(
- "sandstone_block",
- "default:sandstone_block",
- {cracky = 2},
- {"default_sandstone_block.png"},
- "Sandstone Block Stair",
- "Sandstone Block Slab",
- default.node_sound_stone_defaults()
- )
- stairs.register_stair_and_slab(
- "obsidian",
- "default:obsidian",
- {cracky = 1, level = 2},
- {"default_obsidian.png"},
- "Obsidian Stair",
- "Obsidian Slab",
- default.node_sound_stone_defaults()
- )
- stairs.register_stair_and_slab(
- "obsidianbrick",
- "default:obsidianbrick",
- {cracky = 1, level = 2},
- {"default_obsidian_brick.png"},
- "Obsidian Brick Stair",
- "Obsidian Brick Slab",
- default.node_sound_stone_defaults()
- )
- stairs.register_stair_and_slab(
- "obsidian_block",
- "default:obsidian_block",
- {cracky = 1, level = 2},
- {"default_obsidian_block.png"},
- "Obsidian Block Stair",
- "Obsidian Block Slab",
- default.node_sound_stone_defaults()
- )
- stairs.register_stair_and_slab(
- "brick",
- "default:brick",
- {cracky = 3},
- {"default_brick.png"},
- "Brick Stair",
- "Brick Slab",
- default.node_sound_stone_defaults()
- )
- stairs.register_stair_and_slab(
- "straw",
- "farming:straw",
- {snappy = 3, flammable = 4},
- {"farming_straw.png"},
- "Straw Stair",
- "Straw Slab",
- default.node_sound_leaves_defaults()
- )
- stairs.register_stair_and_slab(
- "steelblock",
- "default:steelblock",
- {cracky = 1, level = 2},
- {"default_steel_block.png"},
- "Steel Block Stair",
- "Steel Block Slab",
- default.node_sound_stone_defaults()
- )
- stairs.register_stair_and_slab(
- "copperblock",
- "default:copperblock",
- {cracky = 1, level = 2},
- {"default_copper_block.png"},
- "Copper Block Stair",
- "Copper Block Slab",
- default.node_sound_stone_defaults()
- )
- stairs.register_stair_and_slab(
- "bronzeblock",
- "default:bronzeblock",
- {cracky = 1, level = 2},
- {"default_bronze_block.png"},
- "Bronze Block Stair",
- "Bronze Block Slab",
- default.node_sound_stone_defaults()
- )
- stairs.register_stair_and_slab(
- "goldblock",
- "default:goldblock",
- {cracky = 1},
- {"default_gold_block.png"},
- "Gold Block Stair",
- "Gold Block Slab",
- default.node_sound_stone_defaults()
- )
|