1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
|
-- |\ /| ____ ____ ____ _____ ____ _____
-- | \ / | | | | | | | |\ | |
-- | \/ | |___ ____ |___ | | | | \ | |____
-- | | | | | | | | | \ | |
-- | | |___ ____| |___ |____ |____| | \| ____|
-- 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
--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)
--
--
--!! If a receptor node is removed, the circuit should be recalculated. This means you have to
--send an mesecon:receptor_off signal to the api when the node is dug, using the
--after_dig_node node property.
--
--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
--
--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...)
-- 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
mesecon.actions_change={} -- Saves registered function callbacks for mesecon change
mesecon.pwr_srcs={}
mesecon.pwr_srcs_off={}
mesecon.rules={}
mesecon.conductors={}
--Internal API
dofile(minetest.get_modpath("mesecons").."/internal_api.lua");
-- 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",
fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
},
groups = {dig_immediate=3},
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",
fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
},
groups = {dig_immediate=3},
drop = '"mesecons:mesecon_off" 1',
light_source = LIGHT_MAX-11,
})
minetest.register_craft({
output = '"mesecons:mesecon_off" 16',
recipe = {
{'"default:mese"'},
}
})
mesecon:register_conductor("mesecons:mesecon_on", "mesecons:mesecon_off")
-- API API API API API API API API API API API API API API API API API API
function mesecon:add_receptor_node(nodename, rules, get_rules) --rules table is optional; if rules depend on param2 pass (nodename, nil, function get_rules)
local i=1
repeat
if mesecon.pwr_srcs[i]==nil then break end
i=i+1
until false
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
end
function mesecon:add_receptor_node_off(nodename, rules, get_rules)
local i=1
repeat
if mesecon.pwr_srcs_off[i]==nil then break end
i=i+1
until false
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
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
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
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}})
print("[MESEcons] Main mod Loaded!")
--minetest.register_on_newplayer(function(player)
--local i=1
--while mesecon.wireless_receivers[i]~=nil do
-- pos=mesecon.wireless_receivers[i].pos
-- request=mesecon.wireless_receivers[i].requested_state
-- inverting=mesecon.wireless_receivers[i].inverting
-- if request==inverting then
-- mesecon:receptor_off(pos)
-- end
-- if request~=inverting then
-- mesecon:receptor_on(pos)
-- end
--end
--end)
|