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-09-12 05:37:03 +02:00
local pplate_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 =- 1 , y =- 1 , z = 0 } ,
{ x = 1 , y =- 1 , z = 0 } ,
{ x = 0 , y =- 1 , z =- 1 } ,
{ x = 0 , y =- 1 , z = 1 } ,
{ x = 0 , y =- 1 , z = 0 } ,
{ x = 0 , y =- 2 , z = 0 } ,
{ x = 0 , y = 1 , z = 0 } ,
}
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 " } )
2017-09-12 05:37:03 +02:00
mesecon.receptor_off ( pos , pplate_rules )
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
local objpos = obj : getpos ( )
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 " } )
2017-09-12 05:37:03 +02:00
mesecon.receptor_on ( pos , pplate_rules )
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-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-09-11 18:38:49 +02:00
if not longdesc then
longdesc = " A pressure plate is a redstone component which supplies its surrounding blocks with redstone power while someone or something rests on top of it. "
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 ,
pressureplate_basename = basename ,
2017-09-11 18:29:10 +02:00
pressureplate_activated_by = activated_by ,
2017-02-22 16:22:28 +01:00
_mcl_blast_resistance = 2.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
2017-09-12 05:37:03 +02:00
mesecons = { receptor = { state = mesecon.state . off , rules = pplate_rules } } ,
2017-09-11 18:38:49 +02:00
_doc_items_longdesc = longdesc ,
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 ,
2017-09-12 05:37:03 +02:00
mesecons = { receptor = { state = mesecon.state . on , rules = pplate_rules } } ,
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-07-31 00:12:21 +02:00
mesecon.register_pressure_plate (
" mesecons_pressureplates:pressure_plate_wood " ,
2015-06-29 19:55:56 +02:00
" Wooden Pressure Plate " ,
2017-07-31 00:12:21 +02:00
{ " default_wood.png " } ,
{ " default_wood.png " } ,
2015-06-29 19:55:56 +02:00
" default_wood.png " ,
2017-07-31 00:12:21 +02:00
nil ,
2017-01-17 17:41:04 +01:00
{ { " group:wood " , " group:wood " } } ,
2017-02-27 17:29:07 +01:00
mcl_sounds.node_sound_wood_defaults ( ) ,
2017-09-11 18:38:49 +02:00
{ axey = 1 , material_wood = 1 } ,
nil ,
" 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. " )
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 " ,
2015-06-29 19:55:56 +02:00
" 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-09-11 18:29:10 +02:00
{ pickaxey = 1 , material_stone = 1 } ,
2017-09-11 18:38:49 +02:00
{ player = true , mob = true } ,
" 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
minetest.register_craft ( {
type = " fuel " ,
recipe = " mesecons_pressureplates:pressure_plate_wood_off " ,
burntime = 15
} )
2017-03-21 04:27:50 +01:00