From 79ca0b2ab948664087522954a10ff2c0f7993ae6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 18 Nov 2017 20:57:41 +0100 Subject: [PATCH] Workaround for crash if place stair/slab/trapdoor inside a buildable_to node --- mods/ITEMS/mcl_doors/api_trapdoors.lua | 21 ++++++++++++++++++--- mods/ITEMS/mcl_stairs/api.lua | 23 +++++++++++++++++++---- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_doors/api_trapdoors.lua b/mods/ITEMS/mcl_doors/api_trapdoors.lua index 8053be8e..c8fbe4b9 100644 --- a/mods/ITEMS/mcl_doors/api_trapdoors.lua +++ b/mods/ITEMS/mcl_doors/api_trapdoors.lua @@ -1,3 +1,20 @@ +-- Wrapper around mintest.pointed_thing_to_face_pos. +local function get_fpos(placer, pointed_thing) + local fpos + -- Workaround: minetest.pointed_thing_to_face_pos crashes in MT 0.4.16 if + -- pointed_thing.under and pointed_thing.above are equal + -- FIXME: Remove this when MT got fixed. + if not vector.equals(pointed_thing.under, pointed_thing.above) then + -- The happy case: Everything is normal + local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) + fpos = finepos.y % 1 + else + -- Fallback if both above and under are equal + fpos = 0 + end + return fpos +end + ---- Trapdoor ---- function mcl_doors:register_trapdoor(name, def) @@ -91,9 +108,7 @@ function mcl_doors:register_trapdoor(name, def) 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 - + local fpos = get_fpos(placer, pointed_thing) local origname = itemstack:get_name() if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) diff --git a/mods/ITEMS/mcl_stairs/api.lua b/mods/ITEMS/mcl_stairs/api.lua index 77a0e225..82c2d7c3 100644 --- a/mods/ITEMS/mcl_stairs/api.lua +++ b/mods/ITEMS/mcl_stairs/api.lua @@ -1,3 +1,20 @@ +-- Wrapper around mintest.pointed_thing_to_face_pos. +local function get_fpos(placer, pointed_thing) + local fpos + -- Workaround: minetest.pointed_thing_to_face_pos crashes in MT 0.4.16 if + -- pointed_thing.under and pointed_thing.above are equal + -- FIXME: Remove this when MT got fixed. + if not vector.equals(pointed_thing.under, pointed_thing.above) then + -- The happy case: Everything is normal + local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) + fpos = finepos.y % 1 + else + -- Fallback if both above and under are equal + fpos = 0 + end + return fpos +end + local function place_slab_normal(itemstack, placer, pointed_thing) -- Use pointed node's on_rightclick function first, if present local node = minetest.get_node(pointed_thing.under) @@ -12,8 +29,7 @@ local function place_slab_normal(itemstack, placer, pointed_thing) local placer_pos = placer:getpos() - local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) - local fpos = finepos.y % 1 + local fpos = get_fpos(placer, pointed_thing) local place = ItemStack(itemstack) local origname = itemstack:get_name() @@ -44,8 +60,7 @@ local function place_stair(itemstack, placer, pointed_thing) 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 + local fpos = get_pos(placer, pointed_thing) if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) or (fpos < -0.5 and fpos > -0.999999999) then