Stairs: Allow crafting slabs and stairs into full blocks again
[oweals/minetest_game.git] / mods / stairs / init.lua
index 1379c8c0cb45d63c5961b75a71c9c5681972da3e..7c6d382398601b9e548aed8cb46e0e1217405de8 100644 (file)
@@ -15,8 +15,32 @@ minetest.register_alias("stairs:slab_pinewood", "stairs:slab_pine_wood")
 
 -- Get setting for replace ABM
 
-local replace = minetest.setting_getbool("enable_stairs_replace_abm")
+local replace = minetest.settings:get_bool("enable_stairs_replace_abm")
 
+local function rotate_and_place(itemstack, placer, pointed_thing)
+       local p0 = pointed_thing.under
+       local p1 = pointed_thing.above
+       local param2 = 0
+
+       local placer_pos = placer:getpos()
+       if placer_pos then
+               param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos))
+       end
+
+       local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing)
+       local fpos = finepos.y % 1
+
+       if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5)
+                       or (fpos < -0.5 and fpos > -0.999999999) 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
 
 -- Register stairs.
 -- Node will be called stairs:stair_<subname>
@@ -52,30 +76,7 @@ function stairs.register_stair(subname, recipeitem, groups, images, description,
                                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)
+                       return rotate_and_place(itemstack, placer, pointed_thing)
                end,
        })
 
@@ -107,6 +108,15 @@ function stairs.register_stair(subname, recipeitem, groups, images, description,
                        },
                })
 
+               -- Use stairs to craft full blocks again (1:1)
+               minetest.register_craft({
+                       output = recipeitem .. ' 3',
+                       recipe = {
+                               {'stairs:stair_' .. subname, 'stairs:stair_' .. subname},
+                               {'stairs:stair_' .. subname, 'stairs:stair_' .. subname},
+                       },
+               })
+
                -- Fuel
                local baseburntime = minetest.get_craft_result({
                        method = "fuel",
@@ -126,8 +136,6 @@ end
 
 -- Slab facedir to placement 6d matching table
 local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4}
--- Slab facedir when placing initial slab against other surface
-local slab_trans_dir_place = {[0] = 0, 20, 12, 16, 4, 8}
 
 -- Register slabs.
 -- Node will be called stairs:slab_<subname>
@@ -153,7 +161,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
                        local creative_enabled = (creative and creative.is_enabled_for
                                        and creative.is_enabled_for(placer:get_player_name()))
 
-                       if under and wield_item == under.name then
+                       if under and under.name:find("stairs:slab_") then
                                -- place slab using under node orientation
                                local dir = minetest.dir_to_facedir(vector.subtract(
                                        pointed_thing.above, pointed_thing.under), true)
@@ -161,7 +169,9 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
                                local p2 = under.param2
 
                                -- combine two slabs if possible
-                               if slab_trans_dir[math.floor(p2 / 4)] == dir then
+                               if slab_trans_dir[math.floor(p2 / 4)] == dir
+                                               and wield_item == under.name then
+
                                        if not recipeitem then
                                                return itemstack
                                        end
@@ -194,16 +204,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
                                end
                                return itemstack
                        else
-                               -- place slab using look direction of player
-                               local dir = minetest.dir_to_wallmounted(vector.subtract(
-                                       pointed_thing.above, pointed_thing.under), true)
-
-                               local rot = slab_trans_dir_place[dir]
-                               if rot == 0 or rot == 20 then
-                                       rot = rot + minetest.dir_to_facedir(placer:get_look_dir())
-                               end
-
-                               return minetest.item_place(itemstack, placer, pointed_thing, rot)
+                               return rotate_and_place(itemstack, placer, pointed_thing)
                        end
                end,
        })
@@ -224,6 +225,15 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
                        },
                })
 
+               -- Use 2 slabs to craft a full block again (1:1)
+               minetest.register_craft({
+                       output = recipeitem,
+                       recipe = {
+                               {'stairs:slab_' .. subname},
+                               {'stairs:slab_' .. subname},
+                       },
+               })
+
                -- Fuel
                local baseburntime = minetest.get_craft_result({
                        method = "fuel",
@@ -595,3 +605,27 @@ stairs.register_stair_and_slab(
        "Gold Block Slab",
        default.node_sound_metal_defaults()
 )
+
+stairs.register_stair_and_slab(
+       "ice",
+       "default:ice",
+       {cracky = 3, puts_out_fire = 1, cools_lava = 1},
+       {"default_ice.png"},
+       "Ice Stair",
+       "Ice Slab",
+       default.node_sound_glass_defaults()
+)
+
+stairs.register_stair_and_slab(
+       "snowblock",
+       "default:snowblock",
+       {crumbly = 3, puts_out_fire = 1, cools_lava = 1, snowy = 1},
+       {"default_snow.png"},
+       "Snow Block Stair",
+       "Snow Block Slab",
+       default.node_sound_dirt_defaults({
+               footstep = {name = "default_snow_footstep", gain = 0.15},
+               dug = {name = "default_snow_footstep", gain = 0.2},
+               dig = {name = "default_snow_footstep", gain = 0.2}
+       })
+)