Update stairs mod from Minetest Game 0.4.16

New features:
- fine pointing
- Upside-down stairs
- Slabs are no longer placed at the side
This commit is contained in:
Wuzzy 2017-06-05 14:50:34 +02:00
parent f9c95650ef
commit a9969e675e
2 changed files with 60 additions and 39 deletions

View file

@ -6,6 +6,31 @@
stairs = {} stairs = {}
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. -- Register stairs.
-- Node will be called stairs:stair_<subname> -- Node will be called stairs:stair_<subname>
@ -43,30 +68,7 @@ function stairs.register_stair(subname, recipeitem, groups, images, description,
return itemstack return itemstack
end end
local p0 = pointed_thing.under return rotate_and_place(itemstack, placer, pointed_thing)
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, end,
_mcl_hardness = hardness, _mcl_hardness = hardness,
}) })
@ -132,6 +134,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
local under = minetest.get_node(pointed_thing.under) local under = minetest.get_node(pointed_thing.under)
local wield_item = itemstack:get_name() local wield_item = itemstack:get_name()
local creative_enabled = minetest.setting_getbool("creative_mode")
if under and wield_item == under.name then if under and wield_item == under.name then
-- place slab using under node orientation -- place slab using under node orientation
@ -141,7 +144,9 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
local p2 = under.param2 local p2 = under.param2
-- combine two slabs if possible -- 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 if not recipeitem then
return itemstack return itemstack
end end
@ -161,7 +166,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
newnode = recipeitem newnode = recipeitem
end end
minetest.set_node(pointed_thing.under, {name = newnode, param2 = p2}) minetest.set_node(pointed_thing.under, {name = newnode, param2 = p2})
if not minetest.setting_getbool("creative_mode") then if not creative_enabled then
itemstack:take_item() itemstack:take_item()
end end
return itemstack return itemstack
@ -177,21 +182,12 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
-- else attempt to place node with proper param2 -- else attempt to place node with proper param2
minetest.item_place_node(ItemStack(wield_item), placer, pointed_thing, p2) minetest.item_place_node(ItemStack(wield_item), placer, pointed_thing, p2)
if not minetest.setting_getbool("creative_mode") then if not creative_enabled then
itemstack:take_item() itemstack:take_item()
end end
return itemstack return itemstack
else else
-- place slab using look direction of player return rotate_and_place(itemstack, placer, pointed_thing)
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)
end end
end, end,
_mcl_hardness = hardness, _mcl_hardness = hardness,
@ -226,6 +222,29 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
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. -- Stair/slab registration function.
-- Nodes will be called stairs:{stair,slab}_<subname> -- Nodes will be called stairs:{stair,slab}_<subname>

View file

@ -55,7 +55,8 @@ usemtl None
s off s off
f 13/11/3 14/12/3 15/13/3 f 13/11/3 14/12/3 15/13/3
f 15/13/3 18/14/3 17/15/3 f 15/13/3 18/14/3 17/15/3
f 14/12/3 16/16/3 18/14/3 f 14/12/3 16/16/3 15/13/3
f 16/16/3 18/14/3 15/13/3
o stairs_left o stairs_left
v 0.500000 0.000000 0.000000 v 0.500000 0.000000 0.000000
v 0.500000 -0.500000 -0.500000 v 0.500000 -0.500000 -0.500000
@ -75,7 +76,8 @@ usemtl None
s off s off
f 19/17/4 20/18/4 21/19/4 f 19/17/4 20/18/4 21/19/4
f 19/17/4 23/20/4 24/21/4 f 19/17/4 23/20/4 24/21/4
f 20/18/4 24/21/4 22/22/4 f 20/18/4 19/17/4 22/22/4
f 19/17/4 24/21/4 22/22/4
o stairs_back o stairs_back
v -0.500000 -0.500000 0.500000 v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 0.500000 v 0.500000 -0.500000 0.500000