@@ -303,18 +303,38 @@ end
303
303
304
304
-- Conductors
305
305
306
- function mesecon :is_conductor_on (nodename )
306
+ function mesecon :is_conductor_on (nodename , rulename )
307
307
local conductor = mesecon :get_conductor (nodename )
308
- if conductor and conductor .state == mesecon .state .on then
309
- return true
308
+ if conductor then
309
+ if conductor .state then
310
+ return conductor .state == mesecon .state .on
311
+ end
312
+ if conductor .states then
313
+ if not rulename then
314
+ return mesecon :getstate (nodename , conductor .states ) ~= 1
315
+ end
316
+ local bit = mesecon :rule2bit (rulename , mesecon :conductor_get_rules (minetest .registered_nodes [nodename ]))
317
+ local binstate = mesecon :getbinstate (nodename , conductor .states )
318
+ return mesecon :get_bit (binstate , bit )
319
+ end
310
320
end
311
321
return false
312
322
end
313
323
314
- function mesecon :is_conductor_off (nodename )
324
+ function mesecon :is_conductor_off (nodename , rulename )
315
325
local conductor = mesecon :get_conductor (nodename )
316
- if conductor and conductor .state == mesecon .state .off then
317
- return true
326
+ if conductor then
327
+ if conductor .state then
328
+ return conductor .state == mesecon .state .off
329
+ end
330
+ if conductor .states then
331
+ if not rulename then
332
+ return mesecon :getstate (nodename , conductor .states ) == 1
333
+ end
334
+ local bit = mesecon :rule2bit (rulename , mesecon :conductor_get_rules (minetest .registered_nodes [nodename ]))
335
+ local binstate = mesecon :getbinstate (nodename , conductor .states )
336
+ return not mesecon :get_bit (binstate , bit )
337
+ end
318
338
end
319
339
return false
320
340
end
@@ -327,20 +347,36 @@ function mesecon:is_conductor(nodename)
327
347
return false
328
348
end
329
349
330
- function mesecon :get_conductor_on (offstate )
350
+ function mesecon :get_conductor_on (offstate , rulename )
331
351
local conductor = mesecon :get_conductor (offstate )
332
352
if conductor then
333
- return conductor .onstate
353
+ if conductor .onstate then
354
+ return conductor .onstate
355
+ end
356
+ if conductor .states then
357
+ local bit = mesecon :rule2bit (rulename , mesecon :conductor_get_rules (minetest .registered_nodes [offstate ]))
358
+ local binstate = mesecon :getbinstate (offstate , conductor .states )
359
+ binstate = mesecon :set_bit (binstate , bit , " 1" )
360
+ return conductor .states [tonumber (binstate ,2 )+ 1 ]
361
+ end
334
362
end
335
- return false
363
+ return offstate
336
364
end
337
365
338
- function mesecon :get_conductor_off (onstate )
366
+ function mesecon :get_conductor_off (onstate , rulename )
339
367
local conductor = mesecon :get_conductor (onstate )
340
368
if conductor then
341
- return conductor .offstate
369
+ if conductor .offstate then
370
+ return conductor .offstate
371
+ end
372
+ if conductor .states then
373
+ local bit = mesecon :rule2bit (rulename , mesecon :conductor_get_rules (minetest .registered_nodes [onstate ]))
374
+ local binstate = mesecon :getbinstate (onstate , conductor .states )
375
+ binstate = mesecon :set_bit (binstate , bit , " 0" )
376
+ return conductor .states [tonumber (binstate ,2 )+ 1 ]
377
+ end
342
378
end
343
- return false
379
+ return onstate
344
380
end
345
381
346
382
function mesecon :conductor_get_rules (node )
@@ -358,17 +394,17 @@ end
358
394
359
395
-- some more general high-level stuff
360
396
361
- function mesecon :is_power_on (pos )
397
+ function mesecon :is_power_on (pos , rulename )
362
398
local node = minetest .env :get_node (pos )
363
- if mesecon :is_conductor_on (node .name ) or mesecon :is_receptor_on (node .name ) then
399
+ if mesecon :is_conductor_on (node .name , rulename ) or mesecon :is_receptor_on (node .name ) then
364
400
return true
365
401
end
366
402
return false
367
403
end
368
404
369
- function mesecon :is_power_off (pos )
405
+ function mesecon :is_power_off (pos , rulename )
370
406
local node = minetest .env :get_node (pos )
371
- if mesecon :is_conductor_off (node .name ) or mesecon :is_receptor_off (node .name ) then
407
+ if mesecon :is_conductor_off (node .name , rulename ) or mesecon :is_receptor_off (node .name ) then
372
408
return true
373
409
end
374
410
return false
@@ -377,11 +413,21 @@ end
377
413
function mesecon :turnon (pos , rulename )
378
414
local node = minetest .env :get_node (pos )
379
415
380
- if mesecon :is_conductor_off (node .name ) then
416
+ if mesecon :is_conductor_off (node .name , rulename ) then
381
417
local rules = mesecon :conductor_get_rules (node )
382
- minetest .env :add_node (pos , {name = mesecon :get_conductor_on (node .name ), param2 = node .param2 })
383
418
384
- for _ , rule in ipairs (rules ) do
419
+ if not rulename then
420
+ for _ , rule in ipairs (mesecon :flattenrules (rules )) do
421
+ if mesecon :connected_to_receptor (pos , rule ) then
422
+ mesecon :turnon (pos , rule )
423
+ end
424
+ end
425
+ return
426
+ end
427
+
428
+ minetest .env :add_node (pos , {name = mesecon :get_conductor_on (node .name , rulename ), param2 = node .param2 })
429
+
430
+ for _ , rule in ipairs (mesecon :rule2meta (rulename , rules )) do
385
431
local np = mesecon :addPosRule (pos , rule )
386
432
local link , rulename = mesecon :rules_link (pos , np )
387
433
@@ -400,11 +446,21 @@ end
400
446
function mesecon :turnoff (pos , rulename )
401
447
local node = minetest .env :get_node (pos )
402
448
403
- if mesecon :is_conductor_on (node .name ) then
449
+ if mesecon :is_conductor_on (node .name , rulename ) then
404
450
local rules = mesecon :conductor_get_rules (node )
405
- minetest .env :add_node (pos , {name = mesecon :get_conductor_off (node .name ), param2 = node .param2 })
451
+ --[[
452
+ if not rulename then
453
+ for _, rule in ipairs(mesecon:flattenrules(rules)) do
454
+ if mesecon:is_powered(pos, rule) then
455
+ mesecon:turnoff(pos, rule)
456
+ end
457
+ end
458
+ return
459
+ end
460
+ --]]
461
+ minetest .env :add_node (pos , {name = mesecon :get_conductor_off (node .name , rulename ), param2 = node .param2 })
406
462
407
- for _ , rule in ipairs (rules ) do
463
+ for _ , rule in ipairs (mesecon : rule2meta ( rulename , rules ) ) do
408
464
local np = mesecon :addPosRule (pos , rule )
409
465
local link , rulename = mesecon :rules_link (pos , np )
410
466
@@ -422,17 +478,17 @@ function mesecon:turnoff(pos, rulename)
422
478
end
423
479
424
480
425
- function mesecon :connected_to_receptor (pos )
481
+ function mesecon :connected_to_receptor (pos , rulename )
426
482
local node = minetest .env :get_node (pos )
427
483
428
484
-- Check if conductors around are connected
429
485
local rules = mesecon :get_any_inputrules (node )
430
486
if not rules then return false end
431
487
432
- for _ , rule in ipairs (rules ) do
488
+ for _ , rule in ipairs (mesecon : rule2meta ( rulename , rules ) ) do
433
489
local np = mesecon :addPosRule (pos , rule )
434
490
if mesecon :rules_link (np , pos ) then
435
- if mesecon :find_receptor_on (np , {}) then
491
+ if mesecon :find_receptor_on (np , {}, mesecon : invertRule ( rule ) ) then
436
492
return true
437
493
end
438
494
end
@@ -441,7 +497,7 @@ function mesecon:connected_to_receptor(pos)
441
497
return false
442
498
end
443
499
444
- function mesecon :find_receptor_on (pos , checked )
500
+ function mesecon :find_receptor_on (pos , checked , rulename )
445
501
-- find out if node has already been checked (to prevent from endless loop)
446
502
for _ , cp in ipairs (checked ) do
447
503
if mesecon :cmpPos (cp , pos ) then
@@ -459,10 +515,10 @@ function mesecon:find_receptor_on(pos, checked)
459
515
460
516
if mesecon :is_conductor (node .name ) then
461
517
local rules = mesecon :conductor_get_rules (node )
462
- for _ , rule in ipairs (rules ) do
518
+ for _ , rule in ipairs (mesecon : rule2meta ( rulename , rules ) ) do
463
519
local np = mesecon :addPosRule (pos , rule )
464
520
if mesecon :rules_link (np , pos ) then
465
- if mesecon :find_receptor_on (np , checked ) then
521
+ if mesecon :find_receptor_on (np , checked , mesecon : invertRule ( rule ) ) then
466
522
return true
467
523
end
468
524
end
@@ -481,10 +537,10 @@ function mesecon:rules_link(output, input, dug_outputrules) --output/input are p
481
537
return
482
538
end
483
539
484
- for _ , outputrule in ipairs (outputrules ) do
540
+ for _ , outputrule in ipairs (mesecon : flattenrules ( outputrules ) ) do
485
541
-- Check if output sends to input
486
542
if mesecon :cmpPos (mesecon :addPosRule (output , outputrule ), input ) then
487
- for _ , inputrule in ipairs (inputrules ) do
543
+ for _ , inputrule in ipairs (mesecon : flattenrules ( inputrules ) ) do
488
544
-- Check if input accepts from output
489
545
if mesecon :cmpPos (mesecon :addPosRule (input , inputrule ), output ) then
490
546
return true , inputrule
@@ -499,16 +555,26 @@ function mesecon:rules_link_anydir(pos1, pos2)
499
555
return mesecon :rules_link (pos1 , pos2 ) or mesecon :rules_link (pos2 , pos1 )
500
556
end
501
557
502
- function mesecon :is_powered (pos )
558
+ function mesecon :is_powered (pos , rule )
503
559
local node = minetest .env :get_node (pos )
504
560
local rules = mesecon :get_any_inputrules (node )
505
561
if not rules then return false end
506
562
507
- for _ , rule in ipairs (rules ) do
563
+ if not rule then
564
+ for _ , rule in ipairs (mesecon :flattenrules (rules )) do
565
+ local np = mesecon :addPosRule (pos , rule )
566
+ local nn = minetest .env :get_node (np )
567
+
568
+ if (mesecon :is_conductor_on (nn .name , mesecon :invertRule (rule )) or mesecon :is_receptor_on (nn .name ))
569
+ and mesecon :rules_link (np , pos ) then
570
+ return true
571
+ end
572
+ end
573
+ else
508
574
local np = mesecon :addPosRule (pos , rule )
509
575
local nn = minetest .env :get_node (np )
510
576
511
- if (mesecon :is_conductor_on (nn .name ) or mesecon :is_receptor_on (nn .name ))
577
+ if (mesecon :is_conductor_on (nn .name , mesecon : invertRule ( rule ) ) or mesecon :is_receptor_on (nn .name ))
512
578
and mesecon :rules_link (np , pos ) then
513
579
return true
514
580
end