2015-06-29 20:55:56 +03:00
-- WALL BUTTON
-- A button that when pressed emits power for 1 second
-- and then turns off again
2017-03-28 02:52:09 +03:00
-- FIXME: Power lower/upper nodes as well
local button_get_output_rules = function ( node )
local rules = {
{ x = - 1 , y = 0 , z = 0 } ,
{ x = 1 , y = 0 , z = 0 } ,
{ x = 0 , y = 0 , z = - 1 } ,
{ x = 0 , y = 0 , z = 1 } ,
{ x = 0 , y = - 1 , z = 0 } ,
}
if minetest.wallmounted_to_dir ( node.param2 ) . y == 1 then
table.insert ( rules , { x = 0 , y = 1 , z = 1 } )
end
return rules
end
2015-06-29 20:55:56 +03:00
mesecon.button_turnoff = function ( pos )
2017-01-11 19:21:46 +02:00
local node = minetest.get_node ( pos )
2015-06-29 20:55:56 +03:00
if node.name == " mesecons_button:button_stone_on " then --has not been dug
mesecon : swap_node ( pos , " mesecons_button:button_stone_off " )
minetest.sound_play ( " mesecons_button_pop " , { pos = pos } )
2017-03-28 02:52:09 +03:00
mesecon : receptor_off ( pos , button_get_output_rules ( node ) )
2015-06-29 20:55:56 +03:00
elseif node.name == " mesecons_button:button_wood_on " then --has not been dug
mesecon : swap_node ( pos , " mesecons_button:button_wood_off " )
minetest.sound_play ( " mesecons_button_pop " , { pos = pos } )
2017-03-28 02:52:09 +03:00
mesecon : receptor_off ( pos , button_get_output_rules ( node ) )
2015-06-29 20:55:56 +03:00
end
end
2017-03-28 02:22:01 +03:00
local boxes_off = {
type = " wallmounted " ,
wall_side = { - 8 / 16 , - 2 / 16 , - 4 / 16 , - 6 / 16 , 2 / 16 , 4 / 16 } ,
wall_bottom = { - 4 / 16 , - 8 / 16 , - 2 / 16 , 4 / 16 , - 6 / 16 , 2 / 16 } ,
wall_top = { - 4 / 16 , 6 / 16 , - 2 / 16 , 4 / 16 , 8 / 16 , 2 / 16 } ,
}
local boxes_on = {
type = " wallmounted " ,
wall_side = { - 8 / 16 , - 2 / 16 , - 4 / 16 , - 7 / 16 , 2 / 16 , 4 / 16 } ,
wall_bottom = { - 4 / 16 , - 8 / 16 , - 2 / 16 , 4 / 16 , - 7 / 16 , 2 / 16 } ,
wall_top = { - 4 / 16 , 7 / 16 , - 2 / 16 , 4 / 16 , 8 / 16 , 2 / 16 } ,
}
2015-06-29 20:55:56 +03:00
2017-05-27 19:09:11 +03:00
local on_button_place = function ( itemstack , placer , pointed_thing )
if pointed_thing.type ~= " node " then
-- no interaction possible with entities
return itemstack
end
local under = pointed_thing.under
local node = minetest.get_node ( under )
local def = minetest.registered_nodes [ node.name ]
local groups = def.groups
-- Check special rightclick action of pointed node
if def and def.on_rightclick then
if not placer : get_player_control ( ) . sneak then
return def.on_rightclick ( under , node , placer , itemstack ,
pointed_thing ) or itemstack , false
end
end
2017-05-27 19:18:54 +03:00
-- If the pointed node is buildable, let's look at the node *behind* that node
if def.buildable_to then
local dir = vector.subtract ( pointed_thing.above , pointed_thing.under )
local actual = vector.subtract ( under , dir )
local actualnode = minetest.get_node ( actual )
def = minetest.registered_nodes [ actualnode.name ]
groups = def.groups
end
2017-05-27 19:09:11 +03:00
-- Only allow placement on full-cube solid opaque nodes
if ( not groups ) or ( not groups.solid ) or ( not groups.opaque ) or ( def.node_box and def.node_box . type ~= " regular " ) then
return itemstack
end
local above = pointed_thing.above
local idef = itemstack : get_definition ( )
local success = minetest.item_place_node ( itemstack , placer , pointed_thing )
if success then
if idef.sounds and idef.sounds . place then
minetest.sound_play ( idef.sounds . place , { pos = above , gain = 1 } )
end
end
return itemstack
end
2017-05-27 19:21:57 +03:00
local buttonuse = " Rightclick the button to push it. Buttons can only be placed on solid opaque full cubes (like cobblestone). "
2015-06-29 20:55:56 +03:00
minetest.register_node ( " mesecons_button:button_stone_off " , {
drawtype = " nodebox " ,
tiles = { " default_stone.png " } ,
2017-03-02 17:58:32 +02:00
wield_image = " default_stone.png^[mask:mesecons_button_wield_mask.png " ,
2017-03-28 02:31:58 +03:00
-- FIXME: Use proper 3D inventory image
inventory_image = " default_stone.png^[mask:mesecons_button_wield_mask.png " ,
2017-03-02 17:58:32 +02:00
wield_scale = { x = 1 , y = 1 , z = 1 } ,
2015-06-29 20:55:56 +03:00
paramtype = " light " ,
2017-03-28 02:22:01 +03:00
paramtype2 = " wallmounted " ,
2017-01-04 23:36:51 +02:00
is_ground_content = false ,
2015-06-29 20:55:56 +03:00
walkable = false ,
sunlight_propagates = true ,
2017-03-28 02:22:01 +03:00
node_box = boxes_off ,
2017-05-20 05:11:14 +03:00
groups = { handy = 1 , pickaxey = 1 , attached_node = 1 , dig_by_water = 1 , destroy_by_lava_flow = 1 , dig_by_piston = 1 } ,
2015-06-29 20:55:56 +03:00
description = " Stone Button " ,
2017-03-28 02:28:52 +03:00
_doc_items_longdesc = " A stone button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second. " ,
2017-03-11 04:38:08 +02:00
_doc_items_usagehelp = buttonuse ,
2017-05-27 19:09:11 +03:00
on_place = on_button_place ,
2017-02-05 18:57:33 +02:00
on_rightclick = function ( pos , node )
2015-06-29 20:55:56 +03:00
mesecon : swap_node ( pos , " mesecons_button:button_stone_on " )
2017-03-28 02:52:09 +03:00
mesecon : receptor_on ( pos , button_get_output_rules ( node ) )
2015-06-29 20:55:56 +03:00
minetest.sound_play ( " mesecons_button_push " , { pos = pos } )
minetest.after ( 1 , mesecon.button_turnoff , pos )
end ,
2017-02-11 19:46:23 +02:00
sounds = mcl_sounds.node_sound_stone_defaults ( ) ,
2015-06-29 20:55:56 +03:00
mesecons = { receptor = {
state = mesecon.state . off ,
2017-03-28 02:52:09 +03:00
rules = button_get_output_rules ,
2017-02-22 17:22:28 +02:00
} } ,
_mcl_blast_resistance = 2.5 ,
2017-02-27 02:52:24 +02:00
_mcl_hardness = 0.5 ,
2015-06-29 20:55:56 +03:00
} )
minetest.register_node ( " mesecons_button:button_stone_on " , {
drawtype = " nodebox " ,
tiles = { " default_stone.png " } ,
2017-03-02 17:58:32 +02:00
wield_image = " default_stone.png^[mask:mesecons_button_wield_mask.png " ,
2017-03-28 02:31:58 +03:00
inventory_image = " default_stone.png^[mask:mesecons_button_wield_mask.png " ,
2017-03-02 17:58:32 +02:00
wield_scale = { x = 1 , y = 1 , z = 0.5 } ,
2015-06-29 20:55:56 +03:00
paramtype = " light " ,
2017-03-28 02:22:01 +03:00
paramtype2 = " wallmounted " ,
2017-01-04 23:36:51 +02:00
is_ground_content = false ,
2015-06-29 20:55:56 +03:00
walkable = false ,
sunlight_propagates = true ,
2017-03-28 02:22:01 +03:00
node_box = boxes_on ,
2017-05-20 05:11:14 +03:00
groups = { handy = 1 , pickaxey = 1 , not_in_creative_inventory = 1 , attached_node = 1 , dig_by_water = 1 , destroy_by_lava_flow = 1 , dig_by_piston = 1 } ,
2015-06-29 20:55:56 +03:00
drop = ' mesecons_button:button_stone_off ' ,
description = " Stone Button " ,
2017-03-02 20:53:53 +02:00
_doc_items_create_entry = false ,
2017-02-11 19:46:23 +02:00
sounds = mcl_sounds.node_sound_stone_defaults ( ) ,
2015-06-29 20:55:56 +03:00
mesecons = { receptor = {
state = mesecon.state . on ,
2017-03-28 02:52:09 +03:00
rules = button_get_output_rules
2017-02-22 17:22:28 +02:00
} } ,
_mcl_blast_resistance = 2.5 ,
2017-02-27 02:52:24 +02:00
_mcl_hardness = 0.5 ,
2015-06-29 20:55:56 +03:00
} )
minetest.register_node ( " mesecons_button:button_wood_off " , {
drawtype = " nodebox " ,
tiles = { " default_wood.png " } ,
2017-03-02 17:58:32 +02:00
wield_image = " default_wood.png^[mask:mesecons_button_wield_mask.png " ,
2017-03-28 02:31:58 +03:00
inventory_image = " default_wood.png^[mask:mesecons_button_wield_mask.png " ,
2017-03-02 17:58:32 +02:00
wield_scale = { x = 1 , y = 1 , z = 1 } ,
2015-06-29 20:55:56 +03:00
paramtype = " light " ,
2017-03-28 02:22:01 +03:00
paramtype2 = " wallmounted " ,
2017-01-04 23:36:51 +02:00
is_ground_content = false ,
2015-06-29 20:55:56 +03:00
walkable = false ,
sunlight_propagates = true ,
2017-03-28 02:22:01 +03:00
node_box = boxes_off ,
2017-05-20 05:11:14 +03:00
groups = { handy = 1 , axey = 1 , attached_node = 1 , dig_by_water = 1 , destroy_by_lava_flow = 1 , dig_by_piston = 1 } ,
2017-01-12 01:27:26 +02:00
description = " Wooden Button " ,
2017-03-28 02:28:52 +03:00
_doc_items_longdesc = " A wooden button is a redstone component made out of wood which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1.5 seconds. " ,
2017-03-11 04:38:08 +02:00
_doc_items_usagehelp = buttonuse ,
2017-05-27 19:09:11 +03:00
on_place = on_button_place ,
2017-01-12 01:30:28 +02:00
on_rightclick = function ( pos , node )
2015-06-29 20:55:56 +03:00
mesecon : swap_node ( pos , " mesecons_button:button_wood_on " )
2017-03-28 02:52:09 +03:00
mesecon : receptor_on ( pos , button_get_output_rules ( node ) )
2015-06-29 20:55:56 +03:00
minetest.sound_play ( " mesecons_button_push " , { pos = pos } )
2017-03-28 02:28:52 +03:00
minetest.after ( 1.5 , mesecon.button_turnoff , pos )
2015-06-29 20:55:56 +03:00
end ,
2017-02-11 19:46:23 +02:00
sounds = mcl_sounds.node_sound_wood_defaults ( ) ,
2015-06-29 20:55:56 +03:00
mesecons = { receptor = {
state = mesecon.state . off ,
2017-03-28 02:52:09 +03:00
rules = button_get_output_rules ,
2017-02-22 17:22:28 +02:00
} } ,
_mcl_blast_resistance = 2.5 ,
2017-02-27 02:52:24 +02:00
_mcl_hardness = 0.5 ,
2015-06-29 20:55:56 +03:00
} )
minetest.register_node ( " mesecons_button:button_wood_on " , {
drawtype = " nodebox " ,
tiles = { " default_wood.png " } ,
2017-03-02 17:58:32 +02:00
wield_image = " default_wood.png^[mask:mesecons_button_wield_mask.png " ,
2017-03-28 02:31:58 +03:00
inventory_image = " default_wood.png^[mask:mesecons_button_wield_mask.png " ,
2017-03-02 17:58:32 +02:00
wield_scale = { x = 1 , y = 1 , z = 0.5 } ,
2015-06-29 20:55:56 +03:00
paramtype = " light " ,
2017-03-28 02:22:01 +03:00
paramtype2 = " wallmounted " ,
2017-01-04 23:36:51 +02:00
is_ground_content = false ,
2015-06-29 20:55:56 +03:00
walkable = false ,
sunlight_propagates = true ,
2017-03-28 02:22:01 +03:00
node_box = boxes_on ,
2017-05-20 05:11:14 +03:00
groups = { handy = 1 , axey = 1 , not_in_creative_inventory = 1 , attached_node = 1 , dig_by_water = 1 , destroy_by_lava_flow = 1 , dig_by_piston = 1 } ,
2015-06-29 20:55:56 +03:00
drop = ' mesecons_button:button_wood_off ' ,
2017-01-12 01:27:26 +02:00
description = " Wooden Button " ,
2017-03-02 20:53:53 +02:00
_doc_items_create_entry = false ,
2017-02-11 19:46:23 +02:00
sounds = mcl_sounds.node_sound_wood_defaults ( ) ,
2015-06-29 20:55:56 +03:00
mesecons = { receptor = {
state = mesecon.state . on ,
2017-03-28 02:52:09 +03:00
rules = button_get_output_rules ,
2017-02-22 17:22:28 +02:00
} } ,
_mcl_blast_resistance = 2.5 ,
2017-02-27 02:52:24 +02:00
_mcl_hardness = 0.5 ,
2015-06-29 20:55:56 +03:00
} )
minetest.register_craft ( {
output = ' mesecons_button:button_stone_off ' ,
recipe = {
2017-02-01 00:32:56 +02:00
{ ' mcl_core:stone ' } ,
2015-06-29 20:55:56 +03:00
}
} )
minetest.register_craft ( {
output = ' mesecons_button:button_wood_off ' ,
recipe = {
{ ' group:wood ' } ,
}
} )
2017-01-10 07:43:07 +02:00
minetest.register_craft ( {
type = " fuel " ,
recipe = ' mesecons_button:button_wood_off ' ,
burntime = 5 ,
} )
2017-03-21 05:27:50 +02:00
-- Add entry aliases for the Help
if minetest.get_modpath ( " doc " ) then
doc.add_entry_alias ( " nodes " , " mesecons_button:button_wood_off " , " nodes " , " mesecons_button:button_wood_on " )
doc.add_entry_alias ( " nodes " , " mesecons_button:button_stone_off " , " nodes " , " mesecons_button:button_stone_on " )
end