1 local function comparator_logic(pos)
3 local old_power = get_powered_state_directional(pos)
5 local param2 = minetest.get_node(pos).param2
6 local dir = minetest.facedir_to_dir(param2)
7 local get_group = minetest.get_node_group
9 --get inputs and outputs
10 local input_pos_straight = vector.subtract(pos,dir)
12 --if you're reading this, this is an easy way to get 90 degrees from a direction (math.pi would be 180 degrees which you can simply -1 multiply the direction instead)
13 local input_pos_right = vector.add(minetest.yaw_to_dir(minetest.dir_to_yaw(dir)-(math.pi/2)),pos)
14 local input_pos_left = vector.add(minetest.yaw_to_dir(minetest.dir_to_yaw(dir)+(math.pi/2)),pos)
16 local output_pos = vector.add(pos,dir)
19 local comparator_level = get_group(minetest.get_node(pos).name, "comparator")
21 local input_level = get_group(minetest.get_node(input_pos_straight).name, "redstone_power")
22 local output_level = get_group(minetest.get_node(output_pos).name, "redstone_power")
24 --this prefers right to left--
26 local output_node = minetest.get_node(output_pos).name
27 local input_node_straight = minetest.get_node(input_pos_straight).name
29 local left_level = get_group(minetest.get_node(input_pos_left).name, "redstone_power")
30 local right_level = get_group(minetest.get_node(input_pos_right).name, "redstone_power")
32 local compare_level = 0
33 if right_level > compare_level then
34 compare_level = right_level
36 if left_level > compare_level then
37 compare_level = left_level
39 local new_output_level = 0
41 if input_level > compare_level then
43 elseif input_level <= compare_level then
48 if input_level > 0 then--and output_level ~= new_output_level-1 then
49 if comparator_level ~= new_output_level then
50 --print("comparator on")
51 minetest.swap_node(pos, {name="redstone:comparator_"..new_output_level,param2=param2})
52 redstone.collect_info(output_pos)
54 elseif output_level ~= new_output_level-1 then
55 if comparator_level ~= new_output_level then
56 --print("comparator off")
57 minetest.swap_node(pos, {name="redstone:comparator_"..new_output_level,param2=param2})
58 redstone.collect_info(output_pos)
62 set_old_power(pos,old_power)
67 minetest.register_node("redstone:comparator_"..i, {
68 description = "Redstone Comparator",
69 tiles = {"repeater_on.png"},
70 groups = {stone = 1, hard = 1, pickaxe = 1, hand = 4,attached_node = 1,redstone_activation_directional=1,torch_directional=1,redstone_power=i,comparator=i},
71 sounds = main.stoneSound(),
73 paramtype2 = "facedir",
74 sunlight_propagates = true,
77 drop="redstone:comparator_0",
81 --left front bottom right back top
82 {-0.5, -0.5, -0.5, 0.5, -0.3, 0.5}, --base
83 {-0.1, -0.5, 0.2, 0.1, 0.1, 0.4}, --output post
84 {-0.4, -0.5, -0.35, -0.2, 0.1, -0.15}, --input post
85 {0.4, -0.5, -0.35, 0.2, 0.1, -0.15}, --input post
88 redstone_activation = function(pos)
91 redstone_deactivation = function(pos)
94 redstone_update = function(pos)
97 on_construct = function(pos)
99 after_place_node = function(pos, placer, itemstack, pointed_thing)
100 redstone.collect_info(pos)
102 on_dig = function(pos, node, digger)
103 local param2 = minetest.get_node(pos).param2
104 minetest.node_dig(pos, node, digger)
105 local dir = minetest.facedir_to_dir(param2)
106 redstone.collect_info(vector.add(pos,dir))
108 after_destruct = function(pos)