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 20:21:46 +03: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 ]
2017-06-29 14:02:53 +03:00
if not def then return end
2017-05-27 19:09:11 +03:00
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 ( )
2017-05-27 19:28:30 +03:00
local itemstack , success = minetest.item_place_node ( itemstack , placer , pointed_thing )
2017-05-27 19:09:11 +03:00
if success then
if idef.sounds and idef.sounds . place then
2017-05-27 19:28:30 +03:00
--minetest.sound_play(idef.sounds.place, {pos=above, gain=1})
2017-05-27 19:09:11 +03:00
end
end
return itemstack
end
2017-05-27 19:28:30 +03:00
local buttonuse = " Rightclick the button to push it. "
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 18:58:32 +03: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 18:58:32 +03: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-05 00:36:51 +03: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-05-27 19:28:30 +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. It can only be placed on solid opaque full cubes (like cobblestone). " ,
2017-03-11 05:38:08 +03:00
_doc_items_usagehelp = buttonuse ,
2017-05-27 19:09:11 +03:00
on_place = on_button_place ,
2017-05-27 19:28:30 +03:00
node_placement_prediction = " " ,
2017-02-05 19:57:33 +03: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 20:46:23 +03: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 18:22:28 +03:00
} } ,
_mcl_blast_resistance = 2.5 ,
2017-02-27 03:52:24 +03: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 18:58:32 +03: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 18:58:32 +03: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-05 00:36:51 +03: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 21:53:53 +03:00
_doc_items_create_entry = false ,
2017-05-27 19:28:30 +03:00
node_placement_prediction = " " ,
2017-02-11 20:46:23 +03: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 18:22:28 +03:00
} } ,
_mcl_blast_resistance = 2.5 ,
2017-02-27 03:52:24 +03: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 18:58:32 +03: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 18:58:32 +03: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-05 00:36:51 +03: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 02:27:26 +03:00
description = " Wooden Button " ,
2017-05-27 19:28:30 +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. It can only be placed on solid opaque full cubes (like cobblestone). " ,
2017-03-11 05:38:08 +03:00
_doc_items_usagehelp = buttonuse ,
2017-05-27 19:09:11 +03:00
on_place = on_button_place ,
2017-05-27 19:28:30 +03:00
node_placement_prediction = " " ,
2017-01-12 02:30:28 +03: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 20:46:23 +03: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 18:22:28 +03:00
} } ,
_mcl_blast_resistance = 2.5 ,
2017-02-27 03:52:24 +03: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 18:58:32 +03: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 18:58:32 +03: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-05 00:36:51 +03: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 02:27:26 +03:00
description = " Wooden Button " ,
2017-03-02 21:53:53 +03:00
_doc_items_create_entry = false ,
2017-05-27 19:28:30 +03:00
node_placement_prediction = " " ,
2017-02-11 20:46:23 +03: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 18:22:28 +03:00
} } ,
_mcl_blast_resistance = 2.5 ,
2017-02-27 03:52:24 +03: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 01:32:56 +03: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 08:43:07 +03:00
minetest.register_craft ( {
type = " fuel " ,
recipe = ' mesecons_button:button_wood_off ' ,
burntime = 5 ,
} )
2017-03-21 06:27:50 +03: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