2015-06-29 19:55:56 +02:00
-- WALL BUTTON
2019-03-16 02:00:48 +01:00
-- A button that when pressed emits power for a short moment and then turns off again
2021-05-29 16:12:33 +02:00
local S = minetest.get_translator ( minetest.get_current_modname ( ) )
2015-06-29 19:55:56 +02:00
2020-12-07 04:59:10 +01:00
local button_sounds = { } -- remember button push sounds
2018-01-13 04:08:40 +01:00
local button_get_output_rules = mesecon.rules . wallmounted_get
2017-03-28 01:52:09 +02:00
2017-03-28 01:22:01 +02: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 19:55:56 +02:00
2018-05-08 18:22:08 +02:00
-- Push the button
2021-05-25 12:52:25 +02:00
function mesecon . push_button ( pos , node )
2018-05-08 18:22:08 +02:00
-- No-op if button is already pushed
if mesecon.is_receptor_on ( node ) then
return
end
local def = minetest.registered_nodes [ node.name ]
minetest.set_node ( pos , { name = " mesecons_button:button_ " .. def._mcl_button_basename .. " _on " , param2 = node.param2 } )
mesecon.receptor_on ( pos , button_get_output_rules ( node ) )
2020-12-07 04:59:10 +01:00
local sfx = button_sounds [ node.name ]
if sfx then
minetest.sound_play ( sfx , { pos = pos } , true )
end
2018-05-08 18:22:08 +02:00
local timer = minetest.get_node_timer ( pos )
timer : start ( def._mcl_button_timer )
end
2021-05-29 16:12:33 +02:00
local function on_button_place ( itemstack , placer , pointed_thing )
2017-05-27 18:09:11 +02:00
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 13:02:53 +02:00
if not def then return end
2017-05-27 18:09:11 +02: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 18:18:54 +02: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 18:09:11 +02: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 18:28:30 +02:00
local itemstack , success = minetest.item_place_node ( itemstack , placer , pointed_thing )
2017-05-27 18:09:11 +02:00
if success then
if idef.sounds and idef.sounds . place then
2020-04-07 00:55:45 +02:00
minetest.sound_play ( idef.sounds . place , { pos = above , gain = 1 } , true )
2017-05-27 18:09:11 +02:00
end
end
return itemstack
end
2019-03-16 02:00:48 +01:00
local buttonuse = S ( " Use the button to push it. " )
2015-06-29 19:55:56 +02:00
2021-05-29 16:12:33 +02:00
function mesecon . register_button ( basename , description , texture , recipeitem , sounds , plusgroups , button_timer , push_by_arrow , longdesc , button_sound )
2017-11-22 22:41:43 +01:00
local groups_off = table.copy ( plusgroups )
groups_off.attached_node = 1
groups_off.dig_by_water = 1
groups_off.destroy_by_lava_flow = 1
groups_off.dig_by_piston = 1
2023-06-04 02:20:50 +02:00
groups_off.dig_immediate_piston = 1
2017-11-22 22:41:43 +01:00
groups_off.button = 1 -- button (off)
2017-11-22 22:24:05 +01:00
local groups_on = table.copy ( groups_off )
groups_on.not_in_creative_inventory = 1
2017-11-22 22:41:43 +01:00
groups_on.button = 2 -- button (on)
2017-11-22 22:24:05 +01:00
2020-12-07 04:59:10 +01:00
if not button_sound then
button_sound = " mesecons_button_push "
end
button_sounds [ " mesecons_button:button_ " .. basename .. " _off " ] = button_sound
2023-06-17 18:01:45 +02:00
if not longdesc then
if groups_off.material_wood ~= 0 then
longdesc = S ( " 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. Wooden buttons may also be pushed by arrows. " )
else
2023-11-25 02:08:06 +01:00
longdesc = S ( " A button is a redstone component which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for @1 seconds. " , button_timer )
2023-06-17 18:01:45 +02:00
end
end
2018-05-08 13:46:39 +02:00
if push_by_arrow then
groups_off.button_push_by_arrow = 1
groups_on.button_push_by_arrow = 1
end
2020-02-19 04:54:17 +01:00
local tt = S ( " Provides redstone power when pushed " )
tt = tt .. " \n " .. S ( " Push duration: @1s " , string.format ( " %.1f " , button_timer ) )
if push_by_arrow then
tt = tt .. " \n " .. S ( " Pushable by arrow " )
end
2022-12-14 05:32:54 +01:00
minetest.register_node ( " :mesecons_button:button_ " .. basename .. " _off " , {
2017-11-22 22:24:05 +01:00
drawtype = " nodebox " ,
tiles = { texture } ,
wield_image = " mesecons_button_wield_mask.png^ " .. texture .. " ^mesecons_button_wield_mask.png^[makealpha:255,126,126 " ,
-- FIXME: Use proper 3D inventory image
inventory_image = " mesecons_button_wield_mask.png^ " .. texture .. " ^mesecons_button_wield_mask.png^[makealpha:255,126,126 " ,
wield_scale = { x = 1 , y = 1 , z = 1 } ,
paramtype = " light " ,
paramtype2 = " wallmounted " ,
is_ground_content = false ,
walkable = false ,
sunlight_propagates = true ,
node_box = boxes_off ,
groups = groups_off ,
description = description ,
2020-02-19 04:54:17 +01:00
_tt_help = tt ,
2017-11-22 22:24:05 +01:00
_doc_items_longdesc = longdesc ,
_doc_items_usagehelp = buttonuse ,
on_place = on_button_place ,
node_placement_prediction = " " ,
2021-05-29 16:12:33 +02:00
on_rightclick = function ( pos , node )
2018-05-08 18:22:08 +02:00
mesecon.push_button ( pos , node )
2017-11-22 22:24:05 +01:00
end ,
sounds = sounds ,
mesecons = { receptor = {
state = mesecon.state . off ,
rules = button_get_output_rules ,
} } ,
2018-05-08 18:22:08 +02:00
_mcl_button_basename = basename ,
_mcl_button_timer = button_timer ,
2024-10-20 19:36:11 +02:00
_vl_projectile = {
on_collide = function ( projectile , pos , node , node_def )
pos = vector.round ( pos )
-- Push the button! Push, push, push the button!
if node_def.groups . button_push_by_arrow == 1 then
minetest.log ( " hit " .. dump ( {
pos = pos ,
node = node ,
} ) )
mesecon.push_button ( pos , node )
end
end
} ,
2018-05-08 18:22:08 +02:00
2020-04-17 21:40:13 +02:00
_mcl_blast_resistance = 0.5 ,
2017-11-22 22:24:05 +01:00
_mcl_hardness = 0.5 ,
} )
2022-12-14 05:32:54 +01:00
minetest.register_node ( " :mesecons_button:button_ " .. basename .. " _on " , {
2017-11-22 22:24:05 +01:00
drawtype = " nodebox " ,
tiles = { texture } ,
wield_image = " mesecons_button_wield_mask.png^ " .. texture .. " ^mesecons_button_wield_mask.png^[makealpha:255,126,126 " ,
wield_scale = { x = 1 , y = 1 , z = 0.5 } ,
paramtype = " light " ,
paramtype2 = " wallmounted " ,
is_ground_content = false ,
walkable = false ,
sunlight_propagates = true ,
node_box = boxes_on ,
groups = groups_on ,
2021-05-29 16:12:33 +02:00
drop = " mesecons_button:button_ " .. basename .. " _off " ,
2017-11-22 22:24:05 +01:00
_doc_items_create_entry = false ,
node_placement_prediction = " " ,
sounds = sounds ,
mesecons = { receptor = {
state = mesecon.state . on ,
rules = button_get_output_rules
} } ,
2018-05-08 18:22:08 +02:00
_mcl_button_basename = basename ,
_mcl_button_timer = button_timer ,
2018-05-08 00:48:07 +02:00
on_timer = function ( pos , elapsed )
local node = minetest.get_node ( pos )
if node.name == " mesecons_button:button_ " .. basename .. " _on " then --has not been dug
2018-05-08 13:46:39 +02:00
-- Is button pushable by arrow?
if push_by_arrow then
-- If there's an arrow stuck in the button, keep it pressed and check
-- it again later.
local objs = minetest.get_objects_inside_radius ( pos , 1 )
for o = 1 , # objs do
local entity = objs [ o ] : get_luaentity ( )
if entity and entity.name == " mcl_bows:arrow_entity " then
local timer = minetest.get_node_timer ( pos )
timer : start ( button_timer )
return
end
end
end
-- Normal operation: Un-press the button
2018-05-08 00:48:07 +02:00
minetest.set_node ( pos , { name = " mesecons_button:button_ " .. basename .. " _off " , param2 = node.param2 } )
2020-12-07 04:59:10 +01:00
minetest.sound_play ( button_sound , { pos = pos , pitch = 0.9 } , true )
2018-05-08 00:48:07 +02:00
mesecon.receptor_off ( pos , button_get_output_rules ( node ) )
end
end ,
2018-05-08 18:22:08 +02:00
2020-04-17 21:40:13 +02:00
_mcl_blast_resistance = 0.5 ,
2017-11-22 22:24:05 +01:00
_mcl_hardness = 0.5 ,
} )
minetest.register_craft ( {
output = " mesecons_button:button_ " .. basename .. " _off " ,
recipe = { { recipeitem } } ,
} )
2023-07-02 17:08:44 +02:00
if minetest.get_modpath ( " mesecons_mvps " ) then
mesecon.register_mvps_unsticky ( " mesecons_button:button_ " .. basename .. " _off " )
mesecon.register_mvps_unsticky ( " mesecons_button:button_ " .. basename .. " _on " )
end
2017-11-22 22:24:05 +01:00
end
2015-06-29 19:55:56 +02:00
2017-11-22 22:24:05 +01:00
mesecon.register_button (
" stone " ,
2019-03-16 02:00:48 +01:00
S ( " Stone Button " ) ,
2017-11-22 22:24:05 +01:00
" default_stone.png " ,
" mcl_core:stone " ,
mcl_sounds.node_sound_stone_defaults ( ) ,
{ material_stone = 1 , handy = 1 , pickaxey = 1 } ,
1 ,
2018-05-08 13:46:39 +02:00
false ,
2020-12-07 04:59:10 +01:00
S ( " 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. " ) ,
" mesecons_button_push " )
2017-11-22 22:24:05 +01:00
2023-03-27 02:07:48 +02:00
mesecon.register_button (
" polished_blackstone " ,
S ( " Polished Blackstone Button " ) ,
" mcl_blackstone_polished.png " ,
" mcl_blackstone:blackstone_polished " ,
mcl_sounds.node_sound_stone_defaults ( ) ,
{ material_stone = 1 , handy = 1 , pickaxey = 1 } ,
1 ,
false ,
S ( " A polished blackstone button is a redstone component made out of polished blackstone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second. " ) ,
" mesecons_button_push " )
2017-11-22 22:41:43 +01:00
local woods = {
2019-03-16 02:00:48 +01:00
{ " wood " , " mcl_core:wood " , " default_wood.png " , S ( " Oak Button " ) } ,
{ " acaciawood " , " mcl_core:acaciawood " , " default_acacia_wood.png " , S ( " Acacia Button " ) } ,
{ " birchwood " , " mcl_core:birchwood " , " mcl_core_planks_birch.png " , S ( " Birch Button " ) } ,
{ " darkwood " , " mcl_core:darkwood " , " mcl_core_planks_big_oak.png " , S ( " Dark Oak Button " ) } ,
{ " sprucewood " , " mcl_core:sprucewood " , " mcl_core_planks_spruce.png " , S ( " Spruce Button " ) } ,
{ " junglewood " , " mcl_core:junglewood " , " default_junglewood.png " , S ( " Jungle Button " ) } ,
2022-11-27 03:28:07 +01:00
2022-11-27 04:34:04 +01:00
{ " mangrove_wood " , " mcl_mangrove:mangrove_wood " , " mcl_mangrove_planks.png " , S ( " Mangrove Button " ) } ,
2023-02-15 17:23:08 +01:00
{ " crimson_hyphae_wood " , " mcl_crimson:crimson_hyphae_wood " , " mcl_crimson_crimson_hyphae_wood.png " , S ( " Crimson Button " ) } ,
2023-02-08 11:10:42 +01:00
{ " warped_hyphae_wood " , " mcl_crimson:warped_hyphae_wood " , " mcl_crimson_warped_hyphae_wood.png " , S ( " Warped Button " ) } ,
2017-11-22 22:41:43 +01:00
}
for w = 1 , # woods do
mesecon.register_button (
woods [ w ] [ 1 ] ,
woods [ w ] [ 4 ] ,
woods [ w ] [ 3 ] ,
woods [ w ] [ 2 ] ,
mcl_sounds.node_sound_wood_defaults ( ) ,
{ material_wood = 1 , handy = 1 , axey = 1 } ,
1.5 ,
2018-05-08 13:46:39 +02:00
true ,
2023-06-17 18:01:45 +02:00
nil ,
2020-12-07 04:59:10 +01:00
" mesecons_button_push_wood " )
2017-11-22 22:41:43 +01:00
minetest.register_craft ( {
type = " fuel " ,
recipe = " mesecons_button:button_ " .. woods [ w ] [ 1 ] .. " _off " ,
burntime = 5 ,
} )
end
2017-01-10 06:43:07 +01:00
2017-03-21 04:27:50 +01: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