2019-03-08 01:07:41 +01:00
local S = minetest.get_translator ( " mesecons_pressureplates " )
2017-07-31 00:12:21 +02:00
local PRESSURE_PLATE_INTERVAL = 0.04
2015-06-29 19:55:56 +02:00
local pp_box_off = {
type = " fixed " ,
fixed = { - 7 / 16 , - 8 / 16 , - 7 / 16 , 7 / 16 , - 7 / 16 , 7 / 16 } ,
}
local pp_box_on = {
type = " fixed " ,
fixed = { - 7 / 16 , - 8 / 16 , - 7 / 16 , 7 / 16 , - 7.5 / 16 , 7 / 16 } ,
}
2017-07-31 00:12:21 +02:00
local function pp_on_timer ( pos , elapsed )
local node = minetest.get_node ( pos )
local basename = minetest.registered_nodes [ node.name ] . pressureplate_basename
2017-09-11 18:29:10 +02:00
local activated_by = minetest.registered_nodes [ node.name ] . pressureplate_activated_by
2015-06-29 19:55:56 +02:00
-- This is a workaround for a strange bug that occurs when the server is started
-- For some reason the first time on_timer is called, the pos is wrong
2017-07-31 00:12:21 +02:00
if not basename then return end
2015-06-29 19:55:56 +02:00
2017-09-11 18:29:10 +02:00
if activated_by == nil then
activated_by = { any = true }
end
local obj_does_activate = function ( obj , activated_by )
if activated_by.any then
return true
elseif activated_by.mob and obj : get_luaentity ( ) and obj : get_luaentity ( ) . _cmi_is_mob == true then
return true
elseif activated_by.player and obj : is_player ( ) then
return true
else
return false
end
end
2017-07-31 00:12:21 +02:00
2017-09-11 18:29:10 +02:00
local objs = minetest.get_objects_inside_radius ( pos , 1 )
if node.name == basename .. " _on " then
local disable
if # objs == 0 then
disable = true
elseif not activated_by.any then
disable = true
for k , obj in pairs ( objs ) do
if obj_does_activate ( obj , activated_by ) then
disable = false
break
end
end
end
if disable then
minetest.set_node ( pos , { name = basename .. " _off " } )
2018-01-12 01:37:32 +01:00
mesecon.receptor_off ( pos , mesecon.rules . pplate )
2017-09-11 18:29:10 +02:00
end
2017-07-31 00:12:21 +02:00
elseif node.name == basename .. " _off " then
2015-06-29 19:55:56 +02:00
for k , obj in pairs ( objs ) do
2019-02-01 06:33:07 +01:00
local objpos = obj : get_pos ( )
2017-09-11 18:29:10 +02:00
if obj_does_activate ( obj , activated_by ) then
if objpos.y > pos.y - 1 and objpos.y < pos.y then
minetest.set_node ( pos , { name = basename .. " _on " } )
2018-01-12 01:37:32 +01:00
mesecon.receptor_on ( pos , mesecon.rules . pplate )
2017-09-11 18:29:10 +02:00
break
end
2015-06-29 19:55:56 +02:00
end
end
end
return true
end
-- Register a Pressure Plate
2017-07-31 00:12:21 +02:00
-- basename: base name of the pressure plate
2015-06-29 19:55:56 +02:00
-- description: description displayed in the player's inventory
2017-07-31 00:12:21 +02:00
-- textures_off:textures of the pressure plate when inactive
-- textures_on: textures of the pressure plate when active
-- image_w: wield image of the pressure plate
-- image_i: inventory image of the pressure plate
2015-06-29 19:55:56 +02:00
-- recipe: crafting recipe of the pressure plate
2017-02-27 17:29:07 +01:00
-- sounds: sound table (like in minetest.register_node)
-- plusgroups: group memberships (attached_node=1 and not_in_creative_inventory=1 are already used)
2017-09-11 18:29:10 +02:00
-- activated_by: optinal table with elements denoting by which entities this pressure plate is triggered
-- Possible table fields:
-- * player=true: Player
-- * mob=true: Mob
-- By default, is triggered by all entities
2017-09-11 18:38:49 +02:00
-- longdesc: Customized long description for the in-game help (if omitted, a dummy text is used)
2015-06-29 19:55:56 +02:00
2017-09-11 18:38:49 +02:00
function mesecon . register_pressure_plate ( basename , description , textures_off , textures_on , image_w , image_i , recipe , sounds , plusgroups , activated_by , longdesc )
2017-02-27 17:29:07 +01:00
local groups_off = table.copy ( plusgroups )
groups_off.attached_node = 1
2017-03-29 22:58:31 +02:00
groups_off.dig_by_piston = 1
2017-11-22 22:42:00 +01:00
groups_off.pressure_plate = 1
2017-08-29 23:27:20 +02:00
local groups_on = table.copy ( groups_off )
2017-07-31 00:12:21 +02:00
groups_on.not_in_creative_inventory = 1
2017-11-22 22:42:00 +01:00
groups_on.pressure_plate = 2
2017-09-11 18:38:49 +02:00
if not longdesc then
2019-03-08 01:07:41 +01:00
longdesc = S ( " A pressure plate is a redstone component which supplies its surrounding blocks with redstone power while someone or something rests on top of it. " )
2017-09-11 18:38:49 +02:00
end
2020-02-19 04:54:17 +01:00
local tt = S ( " Provides redstone power when pushed " )
if not activated_by then
2020-03-12 01:35:11 +01:00
tt = tt .. " \n " .. S ( " Pushable by players, mobs and objects " )
2020-02-19 04:54:17 +01:00
elseif activated_by.mob and activated_by.player then
2020-03-12 01:35:11 +01:00
tt = tt .. " \n " .. S ( " Pushable by players and mobs " )
2020-02-19 04:54:17 +01:00
elseif activated_by.mob then
2020-03-12 01:35:11 +01:00
tt = tt .. " \n " .. S ( " Pushable by mobs " )
2020-02-19 04:54:17 +01:00
elseif activated_by.player then
2020-03-12 01:35:11 +01:00
tt = tt .. " \n " .. S ( " Pushable by players " )
2020-02-19 04:54:17 +01:00
end
2017-02-27 17:29:07 +01:00
2017-07-31 00:12:21 +02:00
mesecon.register_node ( basename , {
2015-06-29 19:55:56 +02:00
drawtype = " nodebox " ,
2017-07-31 00:12:21 +02:00
inventory_image = image_i ,
wield_image = image_w ,
2015-06-29 19:55:56 +02:00
paramtype = " light " ,
2017-09-11 18:40:34 +02:00
walkable = false ,
2015-06-29 19:55:56 +02:00
description = description ,
on_timer = pp_on_timer ,
on_construct = function ( pos )
2017-01-11 18:21:46 +01:00
minetest.get_node_timer ( pos ) : start ( PRESSURE_PLATE_INTERVAL )
2015-06-29 19:55:56 +02:00
end ,
2017-07-31 00:12:21 +02:00
sounds = sounds ,
2018-01-31 19:36:27 +01:00
is_ground_content = false ,
2017-07-31 00:12:21 +02:00
pressureplate_basename = basename ,
2017-09-11 18:29:10 +02:00
pressureplate_activated_by = activated_by ,
2020-04-17 21:40:13 +02:00
_mcl_blast_resistance = 0.5 ,
2017-02-27 17:29:07 +01:00
_mcl_hardness = 0.5 ,
2017-07-31 00:12:21 +02:00
} , {
node_box = pp_box_off ,
selection_box = pp_box_off ,
groups = groups_off ,
tiles = textures_off ,
2017-02-27 17:29:07 +01:00
2018-01-12 01:37:32 +01:00
mesecons = { receptor = { state = mesecon.state . off , rules = mesecon.rules . pplate } } ,
2017-09-11 18:38:49 +02:00
_doc_items_longdesc = longdesc ,
2020-02-19 04:54:17 +01:00
_tt_help = tt ,
2017-07-31 00:12:21 +02:00
} , {
2015-06-29 19:55:56 +02:00
node_box = pp_box_on ,
2017-07-31 00:12:21 +02:00
selection_box = pp_box_on ,
2017-02-27 17:29:07 +01:00
groups = groups_on ,
2017-07-31 00:12:21 +02:00
tiles = textures_on ,
2019-12-09 22:32:40 +01:00
description = " " ,
2017-07-31 00:12:21 +02:00
2018-01-12 01:37:32 +01:00
mesecons = { receptor = { state = mesecon.state . on , rules = mesecon.rules . pplate } } ,
2017-09-11 18:38:49 +02:00
_doc_items_create_entry = false ,
2015-06-29 19:55:56 +02:00
} )
minetest.register_craft ( {
2017-07-31 00:12:21 +02:00
output = basename .. " _off " ,
2015-06-29 19:55:56 +02:00
recipe = recipe ,
} )
2017-03-21 04:27:50 +01:00
if minetest.get_modpath ( " doc " ) then
2017-07-31 00:12:21 +02:00
doc.add_entry_alias ( " nodes " , basename .. " _off " , " nodes " , basename .. " _on " )
2017-03-21 04:27:50 +01:00
end
2015-06-29 19:55:56 +02:00
end
2017-11-22 22:08:09 +01:00
local woods = {
2019-03-08 01:07:41 +01:00
{ " wood " , " mcl_core:wood " , " default_wood.png " , S ( " Oak Pressure Plate " ) } ,
{ " acaciawood " , " mcl_core:acaciawood " , " default_acacia_wood.png " , S ( " Acacia Pressure Plate " ) } ,
{ " birchwood " , " mcl_core:birchwood " , " mcl_core_planks_birch.png " , S ( " Birch Pressure Plate " ) } ,
{ " darkwood " , " mcl_core:darkwood " , " mcl_core_planks_big_oak.png " , S ( " Dark Oak Pressure Plate " ) } ,
{ " sprucewood " , " mcl_core:sprucewood " , " mcl_core_planks_spruce.png " , S ( " Spruce Pressure Plate " ) } ,
{ " junglewood " , " mcl_core:junglewood " , " default_junglewood.png " , S ( " Jungle Pressure Plate " ) } ,
2017-11-22 22:08:09 +01:00
}
2017-09-11 18:38:49 +02:00
2017-11-22 22:08:09 +01:00
for w = 1 , # woods do
mesecon.register_pressure_plate (
" mesecons_pressureplates:pressure_plate_ " .. woods [ w ] [ 1 ] ,
woods [ w ] [ 4 ] ,
{ woods [ w ] [ 3 ] } ,
{ woods [ w ] [ 3 ] } ,
woods [ w ] [ 3 ] ,
nil ,
{ { woods [ w ] [ 2 ] , woods [ w ] [ 2 ] } } ,
mcl_sounds.node_sound_wood_defaults ( ) ,
2017-11-22 22:42:00 +01:00
{ axey = 1 , material_wood = 1 } ,
2017-11-22 22:08:09 +01:00
nil ,
2019-03-08 01:07:41 +01:00
S ( " A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object ( including dropped items , players and mobs ) rests on top of it . " ))
2017-09-11 18:38:49 +02:00
2017-11-22 22:08:09 +01:00
minetest.register_craft ( {
type = " fuel " ,
recipe = " mesecons_pressureplates:pressure_plate_ " .. woods [ w ] [ 1 ] .. " _off " ,
burntime = 15
} )
end
2015-06-29 19:55:56 +02:00
2017-07-31 00:12:21 +02:00
mesecon.register_pressure_plate (
" mesecons_pressureplates:pressure_plate_stone " ,
2019-03-08 01:07:41 +01:00
S ( " Stone Pressure Plate " ) ,
2017-07-31 00:12:21 +02:00
{ " default_stone.png " } ,
{ " default_stone.png " } ,
2015-06-29 19:55:56 +02:00
" default_stone.png " ,
2017-07-31 00:12:21 +02:00
nil ,
2017-01-31 23:32:56 +01:00
{ { " mcl_core:stone " , " mcl_core:stone " } } ,
2017-02-27 17:29:07 +01:00
mcl_sounds.node_sound_stone_defaults ( ) ,
2017-11-22 22:42:00 +01:00
{ pickaxey = 1 , material_stone = 1 } ,
2017-09-11 18:38:49 +02:00
{ player = true , mob = true } ,
2019-03-08 01:07:41 +01:00
S ( " A stone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else. " ) )
2017-01-10 06:43:07 +01:00
2017-03-21 04:27:50 +01:00