2012-03-05 19:21:26 +01:00
-- |\ /| ____ ____ ____ _____ ____ _____
-- | \ / | | | | | | | |\ | |
-- | \/ | |___ ____ |___ | | | | \ | |____
-- | | | | | | | | | \ | |
-- | | |___ ____| |___ |____ |____| | \| ____|
-- by Jeija and Minerd247
--
--
--
-- This mod adds mesecons[=minecraft redstone] and different receptors/effectors to minetest.
--
-- See the documentation on the forum for additional information, especially about crafting
--
--Quick Developer documentation for the mesecon API
--=================================================
--
--RECEPTORS
--
--A receptor is a node that emits power, e.g. a solar panel, a switch or a power plant.
--Usually you create two blocks per receptor that have to be switched when switching the on/off state:
-- # An off-state node (e.g. mesecons:mesecon_switch_off"
-- # An on-state node (e.g. mesecons:mesecon_switch_on"
--The on-state and off-state nodes should be registered in the mesecon api,
--so that the Mesecon circuit can be recalculated. This can be done using
--
--mesecon:add_receptor_node(nodename) -- for on-state node
--mesecon:add_receptor_node_off(nodename) -- for off-state node
--example: mesecon:add_receptor_node("mesecons:mesecon_switch_on")
--
--Turning receptors on and off
--Usually the receptor has to turn on and off. For this, you have to
-- # Remove the node and replace it with the node in the other state (e.g. replace on by off)
-- # Send the event to the mesecon circuit by using the api functions
-- mesecon:receptor_on (pos, rules) } These functions take the position of your receptor
-- mesecon:receptor_off(pos, rules) } as their parameter.
--
--You can specify the rules using the rules parameter. If you don't want special rules, just leave it out
2012-03-29 11:53:11 +02:00
--e.g. if you want to use the "pressureplate" rules, you use this command:
--mesecon:receptor_on (pos, mesecon:get_rules("pressureplate"))
--The rules can be manipulated by several rotate functions:
--rules=mesecon:rotate_rules_right/left/up/down(rules)
--
2012-03-05 19:21:26 +01:00
--
--!! If a receptor node is removed, the circuit should be recalculated. This means you have to
2012-06-05 04:20:04 +02:00
--send an mesecon:receptor_off signal to the api when the node is dug, using the
--after_dig_node node property.
2012-03-05 19:21:26 +01:00
--
--EFFECTORS
--
--A receptor is a node that uses power and transfers the signal to a mechanical, optical whatever
--event. e.g. the meselamp, the movestone or the removestone.
--
--There are two callback functions for receptors.
-- # function mesecon:register_on_signal_on (action)
-- # function mesecon:register_on_signal_off(action)
--
--These functions will be called for each block next to a mesecon conductor.
--
--Example: The removestone
--The removestone only uses one callback: The mesecon:register_on_signal_on function
--
--mesecon:register_on_signal_on(function(pos, node) -- As the action prameter you have to use a function
-- if node.name=="mesecons:removestone" then -- Check if it really is removestone. If you wouldn't use this, every node next to mesecons would be removed
-- minetest.env:remove_node(pos) -- The action: The removestone is removed
-- end -- end of if
--end) -- end of the function, )=end of the parameters of mesecon:register_on_signal_on
2012-04-22 07:55:57 +02:00
--
--CONDUCTORS: (new feature!! yay)
--You can specify your custom conductors using
--# mesecon:register_conductor(onstate, offstate)
-- onstate=the conductor's nodename when it is turned on
-- offstate=the conductor's nodename when it is turned off
--
--As you can see, conductors need an offstate and an onstate node, just like receptors
--mesecons:mesecon_on / mesecons:mesecon_off are the default conductors
--Other conductors connect to other conductors. It's always "the same energy"
--! As there is no special drawtype, conductors don't connect to others visually,
--but it works in fact.
--
--The function # mesecon:register_conductor(onstate, offstate) is the only thing you need to do,
--the mod does everything else for you (turn the conductor on and off...)
2012-03-05 19:21:26 +01:00
-- INCLUDE SETTINGS
dofile ( minetest.get_modpath ( " mesecons " ) .. " /settings.lua " )
-- PUBLIC VARIABLES
mesecon = { } -- contains all functions and all global variables
mesecon.actions_on = { } -- Saves registered function callbacks for mesecon on
mesecon.actions_off = { } -- Saves registered function callbacks for mesecon off
2012-03-29 22:11:17 +02:00
mesecon.actions_change = { } -- Saves registered function callbacks for mesecon change
2012-03-29 11:35:23 +02:00
mesecon.pwr_srcs = { }
mesecon.pwr_srcs_off = { }
mesecon.rules = { }
2012-04-22 07:48:45 +02:00
mesecon.conductors = { }
--Internal API
dofile ( minetest.get_modpath ( " mesecons " ) .. " /internal_api.lua " ) ;
2012-03-05 19:21:26 +01:00
-- MESECONS
minetest.register_node ( " mesecons:mesecon_off " , {
drawtype = " raillike " ,
tile_images = { " jeija_mesecon_off.png " , " jeija_mesecon_curved_off.png " , " jeija_mesecon_t_junction_off.png " , " jeija_mesecon_crossing_off.png " } ,
inventory_image = " jeija_mesecon_off.png " ,
wield_image = " jeija_mesecon_off.png " ,
paramtype = " light " ,
is_ground_content = true ,
walkable = false ,
selection_box = {
type = " fixed " ,
2012-06-20 19:26:07 +02:00
fixed = { - 0.5 , - 0.5 , - 0.5 , 0.5 , - 0.45 , 0.5 } ,
2012-03-05 19:21:26 +01:00
} ,
2012-04-24 23:28:14 +02:00
groups = { dig_immediate = 3 } ,
2012-03-05 19:21:26 +01:00
description = " Mesecons " ,
} )
minetest.register_node ( " mesecons:mesecon_on " , {
drawtype = " raillike " ,
tile_images = { " jeija_mesecon_on.png " , " jeija_mesecon_curved_on.png " , " jeija_mesecon_t_junction_on.png " , " jeija_mesecon_crossing_on.png " } ,
paramtype = " light " ,
is_ground_content = true ,
walkable = false ,
selection_box = {
type = " fixed " ,
2012-06-20 19:26:07 +02:00
fixed = { - 0.5 , - 0.5 , - 0.5 , 0.5 , - 0.45 , 0.5 } ,
2012-03-05 19:21:26 +01:00
} ,
2012-08-01 11:58:19 +02:00
groups = { dig_immediate = 3 , not_in_creaive_inventory = 1 } ,
2012-03-05 19:21:26 +01:00
drop = ' "mesecons:mesecon_off" 1 ' ,
light_source = LIGHT_MAX - 11 ,
} )
minetest.register_craft ( {
output = ' "mesecons:mesecon_off" 16 ' ,
recipe = {
{ ' "default:mese" ' } ,
}
} )
-- API API API API API API API API API API API API API API API API API API
2012-03-29 21:06:48 +02:00
function mesecon : add_receptor_node ( nodename , rules , get_rules ) --rules table is optional; if rules depend on param2 pass (nodename, nil, function get_rules)
2012-03-05 19:21:26 +01:00
local i = 1
repeat
if mesecon.pwr_srcs [ i ] == nil then break end
2012-03-29 21:06:48 +02:00
i = i + 1
2012-03-05 19:21:26 +01:00
until false
2012-03-29 21:06:48 +02:00
if get_rules == nil and rules == nil then
rules = mesecon : get_rules ( " default " )
end
mesecon.pwr_srcs [ i ] = { }
mesecon.pwr_srcs [ i ] . name = nodename
mesecon.pwr_srcs [ i ] . rules = rules
mesecon.pwr_srcs [ i ] . get_rules = get_rules
2012-03-05 19:21:26 +01:00
end
2012-03-29 21:06:48 +02:00
function mesecon : add_receptor_node_off ( nodename , rules , get_rules )
2012-03-05 19:21:26 +01:00
local i = 1
repeat
if mesecon.pwr_srcs_off [ i ] == nil then break end
2012-03-29 21:06:48 +02:00
i = i + 1
2012-03-05 19:21:26 +01:00
until false
2012-03-29 21:06:48 +02:00
if get_rules == nil and rules == nil then
rules = mesecon : get_rules ( " default " )
end
mesecon.pwr_srcs_off [ i ] = { }
mesecon.pwr_srcs_off [ i ] . name = nodename
mesecon.pwr_srcs_off [ i ] . rules = rules
mesecon.pwr_srcs_off [ i ] . get_rules = get_rules
2012-03-05 19:21:26 +01:00
end
function mesecon : receptor_on ( pos , rules )
mesecon : turnon ( pos , 0 , 0 , 0 , true , rules )
end
function mesecon : receptor_off ( pos , rules )
mesecon : turnoff ( pos , 0 , 0 , 0 , true , rules )
end
function mesecon : register_on_signal_on ( action )
local i = 1
repeat
i = i + 1
if mesecon.actions_on [ i ] == nil then break end
until false
mesecon.actions_on [ i ] = action
end
function mesecon : register_on_signal_off ( action )
local i = 1
repeat
i = i + 1
if mesecon.actions_off [ i ] == nil then break end
until false
mesecon.actions_off [ i ] = action
end
2012-03-29 22:11:17 +02:00
function mesecon : register_on_signal_change ( action )
local i = 1
repeat
i = i + 1
if mesecon.actions_change [ i ] == nil then break end
until false
mesecon.actions_change [ i ] = action
end
2012-08-10 18:58:21 +02:00
function mesecon : register_conductor ( onstate , offstate )
local i = 0
while mesecon.conductors [ i ] ~= nil do
i = i + 1
end
mesecon.conductors [ i ] = { }
mesecon.conductors [ i ] . on = onstate
mesecon.conductors [ i ] . off = offstate
end
2012-03-29 11:35:23 +02:00
mesecon : add_rules ( " default " ,
{ { x = 0 , y = 0 , z =- 1 } ,
{ x = 1 , y = 0 , z = 0 } ,
{ x =- 1 , y = 0 , z = 0 } ,
{ x = 0 , y = 0 , z = 1 } ,
{ x = 1 , y = 1 , z = 0 } ,
{ x = 1 , y =- 1 , z = 0 } ,
{ 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 =- 1 } ,
{ x = 0 , y =- 1 , z =- 1 } } )
2012-04-22 07:48:45 +02:00
print ( " [MESEcons] Main mod Loaded! " )
2012-03-05 19:21:26 +01:00
2012-08-10 18:58:21 +02:00
mesecon : register_conductor ( " mesecons:mesecon_on " , " mesecons:mesecon_off " )