]> git.lizzy.rs Git - Crafter.git/blob - mods/redstone/comparator.lua
Update everything
[Crafter.git] / mods / redstone / comparator.lua
1 local function comparator_logic(pos)
2         
3         local old_power = get_powered_state_directional(pos)
4         
5         local param2 = minetest.get_node(pos).param2
6         local dir = minetest.facedir_to_dir(param2)
7         local get_group = minetest.get_node_group
8         
9         --get inputs and outputs
10         local input_pos_straight = vector.subtract(pos,dir)
11         
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)
15         
16         local output_pos = vector.add(pos,dir)
17         local output = false
18         
19         local comparator_level = get_group(minetest.get_node(pos).name, "comparator")
20         
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")
23         
24         --this prefers right to left--
25         
26         local output_node = minetest.get_node(output_pos).name
27         local input_node_straight = minetest.get_node(input_pos_straight).name
28         
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")
31         
32         local compare_level = 0
33         if right_level > compare_level then
34                 compare_level = right_level
35         end
36         if left_level > compare_level then
37                 compare_level = left_level
38         end     
39         local new_output_level = 0
40         
41         if input_level > compare_level then
42                 new_output_level = 9
43         elseif input_level <= compare_level then
44                 new_output_level = 0
45         end
46         
47         --charge
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)
53                 end
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)
59                 end
60         end
61         
62         set_old_power(pos,old_power)
63 end
64
65
66 for i = 0,9 do
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(),
72                 paramtype = "light",
73                 paramtype2 = "facedir",
74                 sunlight_propagates = true,
75                 walkable = false,
76                 drawtype= "nodebox",
77                 drop="redstone:comparator_0",
78                 node_box = {
79                         type = "fixed",
80                         fixed = {
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
86                                 },
87                         },
88                 redstone_activation = function(pos)
89                         comparator_logic(pos)
90                 end,
91                 redstone_deactivation = function(pos)
92                         comparator_logic(pos)
93                 end,
94                 redstone_update = function(pos)
95                         comparator_logic(pos)
96                 end,
97                 on_construct = function(pos)
98                 end,
99                 after_place_node = function(pos, placer, itemstack, pointed_thing)
100                         redstone.collect_info(pos)
101                 end,
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))
107                 end,
108                 after_destruct = function(pos)
109                 end,
110         })
111 end
112
113