]> git.lizzy.rs Git - Crafter.git/blob - mods/redstone/repeater.lua
Fix repeater circuits not continuing properly
[Crafter.git] / mods / redstone / repeater.lua
1 local minetest,vector = minetest,vector
2
3 local max_timer = 7
4 for level = 0,max_timer do
5
6
7
8
9 --[[
10  ██████╗ ███╗   ██╗
11 ██╔═══██╗████╗  ██║
12 ██║   ██║██╔██╗ ██║
13 ██║   ██║██║╚██╗██║
14 ╚██████╔╝██║ ╚████║
15  ╚═════╝ ╚═╝  ╚═══╝
16 ]]--
17
18 minetest.register_node("redstone:repeater_on_"..level, {
19         description = "Redstone Repeater",
20         tiles = {"repeater_on.png"},
21         groups = {stone = 1, hard = 1, pickaxe = 1, hand = 4,attached_node = 1,redstone_activation_directional=1,repeater_on=1,repeater=1,torch_directional=1,redstone_power=16,repeater_level=level},
22         sounds = main.stoneSound(),
23         paramtype = "light",
24         paramtype2 = "facedir",
25         sunlight_propagates = true,
26         walkable = false,
27         drawtype= "nodebox",
28         drop="redstone:repeater_off_0",
29         node_box = {
30                 type = "fixed",
31                 fixed = {
32                                 --left  front  bottom right back top
33                                 {-0.5, -0.5,  -0.5, 0.5,  -0.3, 0.5}, --base
34                                 {-0.1, -0.5,  0.2, 0.1,  0.1, 0.4}, --output post
35                                 {-0.1, -0.5,  -0.05-(level*0.05), 0.1,  0.1, 0.15-(level*0.05)}, --input post
36                         },
37                 },
38
39         on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
40                 local newlevel = level + 1
41                 if newlevel > max_timer then
42                         newlevel = 0
43                 end
44                 local param2 = minetest.get_node(pos).param2
45                 local dir = minetest.facedir_to_dir(param2)
46
47                 minetest.swap_node(pos,{name="redstone:repeater_on_"..newlevel,param2=param2})
48                 minetest.sound_play("lever", {pos=pos})
49                 redstone.inject(pos,{
50                         name = "redstone:repeater_on_"..newlevel,
51                         torch  = 16,
52                         torch_directional = true,
53                         directional_activator = true,
54                         input  = vector.subtract(pos,dir),
55                         output = vector.add(pos,dir),
56                         dir = dir
57                 })
58         end,
59         
60         on_timer = function(pos, elapsed)
61                 local param2 = minetest.get_node(pos).param2
62                 minetest.swap_node(pos, {name="redstone:repeater_off_"..level,param2=param2})
63                 local dir = minetest.facedir_to_dir(param2)
64                 redstone.inject(pos,{
65                         name = "redstone:repeater_off_"..level,
66                         directional_activator = true,
67                         input  = vector.subtract(pos,dir),
68                         output = vector.add(pos,dir),
69                         dir = dir
70                 })
71                 minetest.after(0,function()
72                         redstone.update(pos)
73                         redstone.update(vector.add(pos,dir))
74                 end)
75         end,
76
77         after_destruct = function(pos, oldnode)
78                 redstone.inject(pos,nil)
79                 redstone.update(pos)
80         end,
81
82         after_place_node = function(pos)
83                 local dir = minetest.facedir_to_dir(minetest.get_node(pos).param2)
84                 redstone.inject(pos,{
85                         name = "redstone:repeater_on_"..level,
86                         torch  = 16,
87                         torch_directional = true,
88                         directional_activator = true,
89                         input  = vector.subtract(pos,dir),
90                         output = vector.add(pos,dir),
91                         dir = dir
92                 })
93                 redstone.update(pos)
94         end
95 })
96
97 redstone.register_activator({
98         name = "redstone:repeater_on_"..level,
99         deactivate = function(pos)
100                 local timer = minetest.get_node_timer(pos)
101                 if not timer:is_started() then
102                         timer:start(level/max_timer)
103                 end
104         end
105 })
106
107
108 minetest.register_lbm({
109         name = "redstone:startup_activator_on_"..level,
110         nodenames = {"redstone:repeater_on_"..level},
111         run_at_every_load = true,
112         action = function(pos)
113                 local dir = minetest.facedir_to_dir(minetest.get_node(pos).param2)
114                 redstone.inject(pos,{
115                         name = "redstone:repeater_on_"..level,
116                         torch  = 16,
117                         torch_directional = true,
118                         directional_activator = true,
119                         input  = vector.subtract(pos,dir),
120                         output = vector.add(pos,dir),
121                         dir = dir
122                 })
123                 redstone.update(pos)
124         end,
125 })
126
127
128
129
130
131
132
133
134
135
136 --[[
137  ██████╗ ███████╗███████╗
138 ██╔═══██╗██╔════╝██╔════╝
139 ██║   ██║█████╗  █████╗  
140 ██║   ██║██╔══╝  ██╔══╝  
141 ╚██████╔╝██║     ██║     
142  ╚═════╝ ╚═╝     ╚═╝     
143 ]]--
144
145
146
147 minetest.register_node("redstone:repeater_off_"..level, {
148     description = "Redstone Repeater",
149     tiles = {"repeater_off.png"},
150     groups = {stone = 1, hard = 1, pickaxe = 1, hand = 4,attached_node = 1,repeater_off=1,repeater=1,redstone_activation_directional=1,repeater_level=level},
151     sounds = main.stoneSound(),
152     paramtype = "light",
153         paramtype2 = "facedir",
154         sunlight_propagates = true,
155         walkable = false,
156         drawtype= "nodebox",
157         drop="redstone:repeater_off_0",
158         node_box = {
159                 type = "fixed",
160                 fixed = {
161                                 --left  front  bottom right back top
162                                 {-0.5, -0.5,  -0.5, 0.5,  -0.3, 0.5}, --base
163                                 {-0.1, -0.5,  0.2, 0.1,  0.1, 0.4}, --output post
164                                 {-0.1, -0.5,  -0.05-(level*0.05), 0.1,  0.1, 0.15-(level*0.05)}, --input post
165                         },
166                 },      
167
168         on_timer = function(pos, elapsed)
169                 local param2 = minetest.get_node(pos).param2
170                 minetest.swap_node(pos, {name="redstone:repeater_on_"..level,param2=param2})
171
172                 local dir = minetest.facedir_to_dir(param2)
173                 redstone.inject(pos,{
174                         name = "redstone:repeater_on_"..level,
175                         torch  = 16,
176                         torch_directional = true,
177                         directional_activator = true,
178                         input  = vector.subtract(pos,dir),
179                         output = vector.add(pos,dir),
180                         dir = dir
181                 })
182                 minetest.after(0,function()
183                         redstone.update(pos)
184                         redstone.update(vector.add(pos,dir))
185                 end)
186         end,
187
188         on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
189                 local newlevel = level + 1
190                 if newlevel > max_timer then
191                         newlevel = 0
192                 end
193                 local param2 = minetest.get_node(pos).param2
194                 local dir = minetest.facedir_to_dir(param2)
195                 minetest.swap_node(pos,{name="redstone:repeater_off_"..newlevel,param2=param2})
196                 redstone.inject(pos,{
197                         name = "redstone:repeater_off_"..newlevel,
198                         directional_activator = true,
199                         input  = vector.subtract(pos,dir),
200                         output = vector.add(pos,dir),
201                         dir = dir
202                 })
203                 minetest.sound_play("lever", {pos=pos})
204         end,
205
206         after_destruct = function(pos, oldnode)
207                 redstone.inject(pos,nil)
208                 redstone.update(pos)
209         end,
210
211         after_place_node = function(pos)
212                 local dir = minetest.facedir_to_dir(minetest.get_node(pos).param2)
213                 redstone.inject(pos,{
214                         name = "redstone:repeater_off_"..level,
215                         directional_activator = true,
216                         input  = vector.subtract(pos,dir),
217                         output = vector.add(pos,dir),
218                         dir = dir
219                 })
220                 redstone.update(pos)
221         end
222 })
223
224
225 redstone.register_activator({
226         name = "redstone:repeater_off_"..level,
227         activate = function(pos)
228                 local timer = minetest.get_node_timer(pos)
229                 if not timer:is_started() then
230                         timer:start(level/max_timer)
231                 end
232         end
233 })
234
235
236 minetest.register_lbm({
237         name = "redstone:startup_activator_off_"..level,
238         nodenames = {"redstone:repeater_off_"..level},
239         run_at_every_load = true,
240         action = function(pos)
241                 local dir = minetest.facedir_to_dir(minetest.get_node(pos).param2)
242                 redstone.inject(pos,{
243                         name = "redstone:repeater_off_"..level,
244                         directional_activator = true,
245                         input  = vector.subtract(pos,dir),
246                         dir = dir
247                 })
248         end,
249 })
250
251 end