2020-03-08 02:18:47 +00:00
local S = minetest.get_translator ( " mcl_doors " )
2017-11-18 19:57:41 +00: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 19:57:23 +00:00
---- Trapdoor ----
2017-12-05 13:09:39 +00:00
local on_rotate
if minetest.get_modpath ( " screwdriver " ) then
2019-12-09 18:28:08 +00:00
on_rotate = function ( pos , node , user , mode , param2 )
-- Flip trapdoor vertically
if mode == screwdriver.ROTATE_AXIS then
local minor = node.param2
if node.param2 >= 20 then
minor = node.param2 - 20
if minor == 3 then
minor = 1
elseif minor == 1 then
minor = 3
end
node.param2 = minor
else
if minor == 3 then
minor = 1
elseif minor == 1 then
minor = 3
end
node.param2 = minor
node.param2 = node.param2 + 20
end
minetest.set_node ( pos , node )
return true
end
end
2017-12-05 13:09:39 +00:00
end
2017-06-05 19:57:23 +00:00
function mcl_doors : register_trapdoor ( name , def )
2017-06-05 20:42:12 +00:00
local groups = table.copy ( def.groups )
if groups == nil then
groups = { }
2017-06-05 19:57:23 +00:00
end
2018-01-26 20:11:49 +00:00
groups.mesecon_ignore_opaque_dig = 1
2017-06-05 19:57:23 +00:00
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 20:42:12 +00:00
-- Close
if minetest.get_item_group ( me.name , " trapdoor " ) == 2 then
2017-06-05 19:57:23 +00: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 20:42:12 +00:00
-- Open
2017-06-05 19:57:23 +00: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 20:42:12 +00:00
minetest.set_node ( pos , tmp_node )
2017-06-05 19:57:23 +00: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
2020-03-08 02:18:47 +00:00
local longdesc , usagehelp , tt_help
2017-06-05 19:57:23 +00:00
longdesc = def._doc_items_longdesc
if not longdesc then
if def.only_redstone_can_open then
2020-03-08 02:18:47 +00:00
longdesc = S ( " 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 19:57:23 +00:00
else
2020-03-08 02:18:47 +00:00
longdesc = S ( " 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 19:57:23 +00:00
end
end
usagehelp = def._doc_items_usagehelp
if not usagehelp and not def.only_redstone_can_open then
2020-03-08 02:18:47 +00:00
usagehelp = S ( " To open or close this trapdoor, rightclick it or send a redstone signal to it. " )
end
if not tt_help then
if def.only_redstone_can_open then
tt_help = S ( " Opened or closed by redstone power " )
else
tt_help = S ( " Use to opened or close " )
end
2017-06-05 19:57:23 +00:00
end
2017-06-05 20:42:12 +00:00
-- Closed trapdoor
2017-12-08 12:07:24 +00:00
local tile_front = def.tile_front
local tile_side = def.tile_side
if not tile_side then
tile_side = tile_front
end
local tiles_closed = {
tile_front ,
tile_front .. " ^[transformFY " ,
2017-12-08 12:38:38 +00:00
tile_side , tile_side ,
tile_side , tile_side ,
2017-12-08 12:07:24 +00:00
}
2017-06-05 20:42:12 +00:00
local groups_closed = groups
groups_closed.trapdoor = 1
2019-02-06 10:40:51 +00:00
groups_closed.deco_block = 1
2017-06-05 19:57:23 +00:00
minetest.register_node ( name , {
description = def.description ,
2020-03-08 02:18:47 +00:00
_tt_help = tt_help ,
2017-06-05 19:57:23 +00:00
_doc_items_longdesc = longdesc ,
_doc_items_usagehelp = usagehelp ,
drawtype = " nodebox " ,
2017-12-08 12:07:24 +00:00
tiles = tiles_closed ,
2017-06-05 19:57:23 +00:00
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 20:42:12 +00:00
groups = groups_closed ,
2017-06-05 19:57:23 +00:00
_mcl_hardness = def._mcl_hardness ,
2017-06-05 20:23:39 +00:00
_mcl_blast_resistance = def._mcl_blast_resistance ,
2017-06-05 19:57:23 +00: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
2019-02-01 05:33:07 +00:00
local placer_pos = placer : get_pos ( )
2017-06-05 19:57:23 +00:00
if placer_pos then
param2 = minetest.dir_to_facedir ( vector.subtract ( p1 , placer_pos ) )
end
2017-11-18 19:57:41 +00:00
local fpos = get_fpos ( placer , pointed_thing )
2017-06-05 19:57:23 +00: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 13:09:39 +00:00
on_rotate = on_rotate ,
2017-06-05 19:57:23 +00:00
} )
2017-06-05 20:42:12 +00:00
-- Open trapdoor
local groups_open = table.copy ( groups )
2017-12-08 12:07:24 +00:00
local tiles_open = {
tile_side ,
tile_side .. " ^[transformR180 " ,
tile_side .. " ^[transformR270 " ,
tile_side .. " ^[transformR90 " ,
tile_front .. " ^[transform46 " ,
tile_front .. " ^[transformFY " ,
}
2017-06-05 20:42:12 +00:00
groups_open.trapdoor = 2
2019-02-06 10:40:51 +00:00
groups_open.not_in_creative_inventory = 1
2017-06-05 19:57:23 +00:00
minetest.register_node ( name .. " _open " , {
drawtype = " nodebox " ,
2017-12-08 12:07:24 +00:00
tiles = tiles_open ,
2017-06-05 19:57:23 +00:00
is_ground_content = false ,
paramtype = " light " ,
paramtype2 = " facedir " ,
2017-06-07 01:59:29 +00:00
-- TODO: Implement Minecraft behaviour: Climbable if directly above
-- ladder w/ matching orientation.
-- Current behavour: Always climbable
climbable = true ,
2017-06-05 19:57:23 +00:00
sunlight_propagates = true ,
pointable = true ,
2017-06-05 20:42:12 +00:00
groups = groups_open ,
2017-06-05 19:57:23 +00:00
_mcl_hardness = def._mcl_hardness ,
2017-06-05 19:59:40 +00:00
_mcl_blast_resistance = def._mcl_blast_resistance ,
2017-06-05 19:57:23 +00: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 = {
2018-01-10 01:25:20 +00:00
action_off = ( function ( pos , node )
2017-06-05 19:57:23 +00:00
punch ( pos )
end ) ,
} } ,
2017-12-05 13:09:39 +00:00
on_rotate = on_rotate ,
2017-06-05 19:57:23 +00:00
} )
if minetest.get_modpath ( " doc " ) then
doc.add_entry_alias ( " nodes " , name , " nodes " , name .. " _open " )
end
end