Skip to content

Commit 80d1361

Browse files
author
Jeija
committedNov 22, 2014
Fix bug in mesecon.find_receptor that caused false turnoffs and rewrite lever +
switch
1 parent a550323 commit 80d1361

File tree

5 files changed

+62
-71
lines changed

5 files changed

+62
-71
lines changed
 

Diff for: ‎mesecons/internal.lua

+3-2
Original file line numberDiff line numberDiff line change
@@ -486,9 +486,10 @@ function mesecon.find_receptor_on(pos, link)
486486

487487
local links = mesecon.rules_link_rule_all_inverted(f.pos, r)
488488
for _, l in ipairs(links) do
489-
if not checked[f.pos.x .. f.pos.y .. f.pos.z] then
489+
local checkedstring = np.x..np.y..np.z..l.x..l.y..l.z
490+
if not checked[checkedstring] then
490491
table.insert(frontiers, {pos = np, link = l})
491-
checked[f.pos.x .. f.pos.y .. f.pos.z] = true
492+
checked[checkedstring] = true
492493
end
493494
end
494495
end

Diff for: ‎mesecons/util.lua

+18-2
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ function mesecon.cmpAny(t1, t2)
195195
end
196196

197197
-- does not overwrite values; number keys (ipairs) are appended, not overwritten
198-
mesecon.mergetable = function(source, dest)
198+
function mesecon.mergetable(source, dest)
199199
local rval = mesecon.tablecopy(dest)
200200

201201
for k, v in pairs(source) do
@@ -208,12 +208,28 @@ mesecon.mergetable = function(source, dest)
208208
return rval
209209
end
210210

211-
mesecon.register_node = function(name, spec_common, spec_off, spec_on)
211+
function mesecon.register_node(name, spec_common, spec_off, spec_on)
212212
spec_common.drop = spec_common.drop or name .. "_off"
213+
spec_common.__mesecon_basename = name
214+
spec_on.__mesecon_state = "on"
215+
spec_off.__mesecon_state = "off"
213216

214217
spec_on = mesecon.mergetable(spec_common, spec_on);
215218
spec_off = mesecon.mergetable(spec_common, spec_off);
216219

217220
minetest.register_node(name .. "_on", spec_on)
218221
minetest.register_node(name .. "_off", spec_off)
219222
end
223+
224+
-- swap onstate and offstate nodes, returns new state
225+
function mesecon.flipstate(pos, node)
226+
local nodedef = minetest.registered_nodes[node.name]
227+
local newstate
228+
if (nodedef.__mesecon_state == "on") then newstate = "off" end
229+
if (nodedef.__mesecon_state == "off") then newstate = "on" end
230+
231+
minetest.swap_node(pos, {name = nodedef.__mesecon_basename .. "_" .. newstate,
232+
param2 = node.param2})
233+
234+
return newstate
235+
end

Diff for: ‎mesecons_extrawires/vertical.lua

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ local vertical_updatepos = function (pos)
6161
else -- no vertical wire above, no vertical wire below: use bottom
6262
minetest.add_node(pos, {name = basename .. "bottom_" .. namestate})
6363
end
64+
mesecon.update_autoconnect(pos)
6465
end
6566
end
6667

Diff for: ‎mesecons_switch/init.lua

+17-24
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,28 @@
11
-- MESECON_SWITCH
22

3-
minetest.register_node("mesecons_switch:mesecon_switch_off", {
4-
tiles = {"jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_off.png"},
3+
mesecon.register_node("mesecons_switch:mesecon_switch", {
54
paramtype2="facedir",
65
groups = {dig_immediate=2},
76
description="Switch",
87
sounds = default.node_sound_stone_defaults(),
9-
mesecons = {receptor = {
10-
state = mesecon.state.off
11-
}},
12-
on_punch = function(pos, node)
13-
minetest.swap_node(pos, {name = "mesecons_switch:mesecon_switch_on", param2 = node.param2})
14-
mesecon:receptor_on(pos)
15-
minetest.sound_play("mesecons_switch", {pos=pos})
16-
end
17-
})
18-
19-
minetest.register_node("mesecons_switch:mesecon_switch_on", {
20-
tiles = {"jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_on.png"},
21-
paramtype2="facedir",
22-
groups = {dig_immediate=2,not_in_creative_inventory=1},
23-
drop="mesecons_switch:mesecon_switch_off 1",
24-
sounds = default.node_sound_stone_defaults(),
25-
mesecons = {receptor = {
26-
state = mesecon.state.on
27-
}},
28-
on_punch = function(pos, node)
29-
minetest.swap_node(pos, {name = "mesecons_switch:mesecon_switch_off", param2 = node.param2})
30-
mesecon:receptor_off(pos)
8+
on_punch = function (pos, node)
9+
if(mesecon.flipstate(pos, node) == "on") then
10+
mesecon.receptor_on(pos)
11+
else
12+
mesecon.receptor_off(pos)
13+
end
3114
minetest.sound_play("mesecons_switch", {pos=pos})
3215
end
16+
},{
17+
tiles = { "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png",
18+
"jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png",
19+
"jeija_mesecon_switch_side.png", "jeija_mesecon_switch_off.png"},
20+
mesecons = {receptor = { state = mesecon.state.off }}
21+
},{
22+
tiles = { "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png",
23+
"jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png",
24+
"jeija_mesecon_switch_side.png", "jeija_mesecon_switch_on.png"},
25+
mesecons = {receptor = { state = mesecon.state.on }}
3326
})
3427

3528
minetest.register_craft({

Diff for: ‎mesecons_walllever/init.lua

+23-43
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,9 @@
11
-- WALL LEVER
22
-- Basically a switch that can be attached to a wall
33
-- Powers the block 2 nodes behind (using a receiver)
4-
minetest.register_node("mesecons_walllever:wall_lever_off", {
4+
mesecon.register_node("mesecons_walllever:wall_lever", {
5+
description="Lever",
56
drawtype = "nodebox",
6-
tiles = {
7-
"jeija_wall_lever_tb.png",
8-
"jeija_wall_lever_bottom.png",
9-
"jeija_wall_lever_sides.png",
10-
"jeija_wall_lever_sides.png",
11-
"jeija_wall_lever_back.png",
12-
"jeija_wall_lever_off.png",
13-
},
147
inventory_image = "jeija_wall_lever_off.png",
158
wield_image = "jeija_wall_lever_off.png",
169
paramtype = "light",
@@ -21,29 +14,34 @@ minetest.register_node("mesecons_walllever:wall_lever_off", {
2114
type = "fixed",
2215
fixed = { -8/16, -8/16, 3/16, 8/16, 8/16, 8/16 },
2316
},
17+
sounds = default.node_sound_wood_defaults(),
18+
on_punch = function (pos, node)
19+
if(mesecon.flipstate(pos, node) == "on") then
20+
mesecon.receptor_on(pos, mesecon.rules.buttonlike_get(node))
21+
else
22+
mesecon.receptor_off(pos, mesecon.rules.buttonlike_get(node))
23+
end
24+
minetest.sound_play("mesecons_lever", {pos=pos})
25+
end
26+
},{
27+
tiles = { "jeija_wall_lever_tb.png", "jeija_wall_lever_bottom.png",
28+
"jeija_wall_lever_sides.png", "jeija_wall_lever_sides.png",
29+
"jeija_wall_lever_back.png", "jeija_wall_lever_off.png",
30+
},
2431
node_box = {
2532
type = "fixed",
2633
fixed = {{ -6/16, -6/16, 6/16, 6/16, 6/16, 8/16 }, -- the base "slab"
2734
{ -5/16, -3/16, 5/16, 5/16, 3/16, 6/16 }, -- the lighted ring area
28-
{ -4/16, -2/16, 4/16, 4/16, 2/16, 5/16 }, -- the raised bit that the lever "sits" on
35+
{ -4/16, -2/16, 4/16, 4/16, 2/16, 5/16 }, -- the raised bit
2936
{ -2/16, -1/16, 3/16, 2/16, 1/16, 4/16 }, -- the lever "hinge"
3037
{ -1/16, -8/16, 4/16, 1/16, 0, 6/16 }} -- the lever itself.
3138
},
32-
groups = {dig_immediate=2, mesecon_needs_receiver = 1},
33-
description="Lever",
34-
on_punch = function (pos, node)
35-
minetest.swap_node(pos, {name = "mesecons_walllever:wall_lever_on", param2 = node.param2})
36-
mesecon.receptor_on(pos, mesecon.rules.buttonlike_get(node))
37-
minetest.sound_play("mesecons_lever", {pos=pos})
38-
end,
39-
sounds = default.node_sound_wood_defaults(),
4039
mesecons = {receptor = {
4140
rules = mesecon.rules.buttonlike_get,
4241
state = mesecon.state.off
43-
}}
44-
})
45-
minetest.register_node("mesecons_walllever:wall_lever_on", {
46-
drawtype = "nodebox",
42+
}},
43+
groups = {dig_immediate = 2, mesecon_needs_receiver = 1}
44+
},{
4745
tiles = {
4846
"jeija_wall_lever_top.png",
4947
"jeija_wall_lever_tb.png",
@@ -52,37 +50,19 @@ minetest.register_node("mesecons_walllever:wall_lever_on", {
5250
"jeija_wall_lever_back.png",
5351
"jeija_wall_lever_on.png",
5452
},
55-
inventory_image = "jeija_wall_lever_on.png",
56-
paramtype = "light",
57-
paramtype2 = "facedir",
58-
sunlight_propagates = true,
59-
walkable = false,
60-
light_source = LIGHT_MAX-7,
61-
selection_box = {
62-
type = "fixed",
63-
fixed = { -8/16, -8/16, 3/16, 8/16, 8/16, 8/16 },
64-
},
6553
node_box = {
6654
type = "fixed",
6755
fixed = {{ -6/16, -6/16, 6/16, 6/16, 6/16, 8/16 }, -- the base "slab"
6856
{ -5/16, -3/16, 5/16, 5/16, 3/16, 6/16 }, -- the lighted ring area
69-
{ -4/16, -2/16, 4/16, 4/16, 2/16, 5/16 }, -- the raised bit that the lever "sits" on
57+
{ -4/16, -2/16, 4/16, 4/16, 2/16, 5/16 }, -- the raised bit
7058
{ -2/16, -1/16, 3/16, 2/16, 1/16, 4/16 }, -- the lever "hinge"
7159
{ -1/16, 0, 4/16, 1/16, 8/16, 6/16 }} -- the lever itself.
7260
},
73-
groups = {dig_immediate = 2, not_in_creative_inventory = 1, mesecon_needs_receiver = 1},
74-
drop = "mesecons_walllever:wall_lever_off 1",
75-
description="Lever",
76-
on_punch = function (pos, node)
77-
minetest.swap_node(pos, {name = "mesecons_walllever:wall_lever_off", param2 = node.param2})
78-
mesecon.receptor_off(pos, mesecon.rules.buttonlike_get(node))
79-
minetest.sound_play("mesecons_lever", {pos=pos})
80-
end,
81-
sounds = default.node_sound_wood_defaults(),
8261
mesecons = {receptor = {
8362
rules = mesecon.rules.buttonlike_get,
8463
state = mesecon.state.on
85-
}}
64+
}},
65+
groups = {dig_immediate = 2, mesecon_needs_receiver = 1, not_in_creative_inventory = 1}
8666
})
8767

8868
minetest.register_craft({

0 commit comments

Comments
 (0)
Please sign in to comment.