2017-11-18 20:57:41 +01:00
-- 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
2017-06-05 21:57:23 +02:00
---- Trapdoor ----
2017-12-05 14:09:39 +01:00
local on_rotate
if minetest.get_modpath ( " screwdriver " ) then
on_rotate = screwdriver.rotate_simple
end
2017-06-05 21:57:23 +02:00
function mcl_doors : register_trapdoor ( name , def )
2017-06-05 22:42:12 +02:00
local groups = table.copy ( def.groups )
if groups == nil then
groups = { }
2017-06-05 21:57:23 +02:00
end
if not def.sound_open then
def.sound_open = " doors_door_open "
end
if not def.sound_close then
def.sound_close = " doors_door_close "
end
local function punch ( pos )
local me = minetest.get_node ( pos )
local tmp_node
2017-06-05 22:42:12 +02:00
-- Close
if minetest.get_item_group ( me.name , " trapdoor " ) == 2 then
2017-06-05 21:57:23 +02:00
minetest.sound_play ( def.sound_close , { pos = pos , gain = 0.3 , max_hear_distance = 16 } )
tmp_node = { name = name , param1 = me.param1 , param2 = me.param2 }
2017-06-05 22:42:12 +02:00
-- Open
2017-06-05 21:57:23 +02:00
else
minetest.sound_play ( def.sound_open , { pos = pos , gain = 0.3 , max_hear_distance = 16 } )
tmp_node = { name = name .. " _open " , param1 = me.param1 , param2 = me.param2 }
end
2017-06-05 22:42:12 +02:00
minetest.set_node ( pos , tmp_node )
2017-06-05 21:57:23 +02:00
end
local on_rightclick
if not def.only_redstone_can_open then
on_rightclick = function ( pos , node , clicker )
punch ( pos )
end
end
-- Default help texts
local longdesc , usagehelp
longdesc = def._doc_items_longdesc
if not longdesc then
if def.only_redstone_can_open then
2017-06-13 14:51:00 +02:00
longdesc = " Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can only be opened or closed by redstone power. "
2017-06-05 21:57:23 +02:00
else
2017-06-13 14:51:00 +02:00
longdesc = " Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can be opened or closed by hand or redstone power. "
2017-06-05 21:57:23 +02:00
end
end
usagehelp = def._doc_items_usagehelp
if not usagehelp and not def.only_redstone_can_open then
2017-06-05 22:06:42 +02:00
usagehelp = " To open or close this trapdoor, rightclick it or send a redstone signal to it. "
2017-06-05 21:57:23 +02:00
end
2017-06-05 22:42:12 +02:00
-- Closed trapdoor
local groups_closed = groups
groups_closed.trapdoor = 1
2017-06-05 21:57:23 +02:00
minetest.register_node ( name , {
description = def.description ,
_doc_items_longdesc = longdesc ,
_doc_items_usagehelp = usagehelp ,
drawtype = " nodebox " ,
tiles = def.tiles ,
inventory_image = def.inventory_image ,
wield_image = def.wield_image ,
is_ground_content = false ,
paramtype = " light " ,
stack_max = 64 ,
paramtype2 = " facedir " ,
sunlight_propagates = true ,
2017-06-05 22:42:12 +02:00
groups = groups_closed ,
2017-06-05 21:57:23 +02:00
_mcl_hardness = def._mcl_hardness ,
2017-06-05 22:23:39 +02:00
_mcl_blast_resistance = def._mcl_blast_resistance ,
2017-06-05 21:57:23 +02:00
sounds = def.sounds ,
node_box = {
type = " fixed " ,
fixed = {
{ - 8 / 16 , - 8 / 16 , - 8 / 16 , 8 / 16 , - 5 / 16 , 8 / 16 } , } ,
} ,
mesecons = { effector = {
action_on = ( function ( pos , node )
punch ( pos )
end ) ,
} } ,
on_place = function ( 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
2017-11-18 20:57:41 +01:00
local fpos = get_fpos ( placer , pointed_thing )
2017-06-05 21:57:23 +02:00
local origname = itemstack : get_name ( )
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 ,
on_rightclick = on_rightclick ,
2017-12-05 14:09:39 +01:00
on_rotate = on_rotate ,
2017-06-05 21:57:23 +02:00
} )
2017-06-05 22:42:12 +02:00
-- Open trapdoor
local groups_open = table.copy ( groups )
groups_open.trapdoor = 2
2017-06-05 21:57:23 +02:00
minetest.register_node ( name .. " _open " , {
drawtype = " nodebox " ,
tiles = def.tiles ,
is_ground_content = false ,
paramtype = " light " ,
paramtype2 = " facedir " ,
2017-06-07 03:59:29 +02:00
-- TODO: Implement Minecraft behaviour: Climbable if directly above
-- ladder w/ matching orientation.
-- Current behavour: Always climbable
climbable = true ,
2017-06-05 21:57:23 +02:00
sunlight_propagates = true ,
pointable = true ,
2017-06-05 22:42:12 +02:00
groups = groups_open ,
2017-06-05 21:57:23 +02:00
_mcl_hardness = def._mcl_hardness ,
2017-06-05 21:59:40 +02:00
_mcl_blast_resistance = def._mcl_blast_resistance ,
2017-06-05 21:57:23 +02:00
sounds = def.sounds ,
drop = name ,
node_box = {
type = " fixed " ,
fixed = { - 0.5 , - 0.5 , 5 / 16 , 0.5 , 0.5 , 0.5 }
} ,
on_rightclick = on_rightclick ,
mesecons = { effector = {
action_on = ( function ( pos , node )
punch ( pos )
end ) ,
} } ,
2017-12-05 14:09:39 +01:00
on_rotate = on_rotate ,
2017-06-05 21:57:23 +02:00
} )
if minetest.get_modpath ( " doc " ) then
doc.add_entry_alias ( " nodes " , name , " nodes " , name .. " _open " )
end
end