]> git.lizzy.rs Git - Crafter.git/blob - mods/redstone/repeater.lua
0d3df2dbd7f0591eb26ec6d65522749dc46c4154
[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                 redstone.update(pos)
72                 redstone.update(vector.add(pos,dir))
73         end,
74
75         after_destruct = function(pos, oldnode)
76                 redstone.inject(pos,nil)
77                 redstone.update(pos)
78         end,
79
80         after_place_node = function(pos)
81                 local dir = minetest.facedir_to_dir(minetest.get_node(pos).param2)
82                 redstone.inject(pos,{
83                         name = "redstone:repeater_on_"..level,
84                         torch  = 16,
85                         torch_directional = true,
86                         directional_activator = true,
87                         input  = vector.subtract(pos,dir),
88                         output = vector.add(pos,dir),
89                         dir = dir
90                 })
91                 redstone.update(pos)
92         end
93 })
94
95 redstone.register_activator({
96         name = "redstone:repeater_on_"..level,
97         deactivate = function(pos)
98                 local timer = minetest.get_node_timer(pos)
99                 if not timer:is_started() then
100                         timer:start(level/max_timer)
101                 end
102         end
103 })
104
105
106 minetest.register_lbm({
107         name = "redstone:startup_activator_on_"..level,
108         nodenames = {"redstone:repeater_on_"..level},
109         run_at_every_load = true,
110         action = function(pos)
111                 local dir = minetest.facedir_to_dir(minetest.get_node(pos).param2)
112                 redstone.inject(pos,{
113                         name = "redstone:repeater_on_"..level,
114                         torch  = 16,
115                         torch_directional = true,
116                         directional_activator = true,
117                         input  = vector.subtract(pos,dir),
118                         output = vector.add(pos,dir),
119                         dir = dir
120                 })
121                 redstone.update(pos)
122         end,
123 })
124
125
126
127
128
129
130
131
132
133
134 --[[
135  ██████╗ ███████╗███████╗
136 ██╔═══██╗██╔════╝██╔════╝
137 ██║   ██║█████╗  █████╗  
138 ██║   ██║██╔══╝  ██╔══╝  
139 ╚██████╔╝██║     ██║     
140  ╚═════╝ ╚═╝     ╚═╝     
141 ]]--
142
143
144
145 minetest.register_node("redstone:repeater_off_"..level, {
146     description = "Redstone Repeater",
147     tiles = {"repeater_off.png"},
148     groups = {stone = 1, hard = 1, pickaxe = 1, hand = 4,attached_node = 1,repeater_off=1,repeater=1,redstone_activation_directional=1,repeater_level=level},
149     sounds = main.stoneSound(),
150     paramtype = "light",
151         paramtype2 = "facedir",
152         sunlight_propagates = true,
153         walkable = false,
154         drawtype= "nodebox",
155         drop="redstone:repeater_off_0",
156         node_box = {
157                 type = "fixed",
158                 fixed = {
159                                 --left  front  bottom right back top
160                                 {-0.5, -0.5,  -0.5, 0.5,  -0.3, 0.5}, --base
161                                 {-0.1, -0.5,  0.2, 0.1,  0.1, 0.4}, --output post
162                                 {-0.1, -0.5,  -0.05-(level*0.05), 0.1,  0.1, 0.15-(level*0.05)}, --input post
163                         },
164                 },      
165
166         on_timer = function(pos, elapsed)
167                 local param2 = minetest.get_node(pos).param2
168                 minetest.swap_node(pos, {name="redstone:repeater_on_"..level,param2=param2})
169
170                 local dir = minetest.facedir_to_dir(param2)
171                 redstone.inject(pos,{
172                         name = "redstone:repeater_on_"..level,
173                         torch  = 16,
174                         torch_directional = true,
175                         directional_activator = true,
176                         input  = vector.subtract(pos,dir),
177                         output = vector.add(pos,dir),
178                         dir = dir
179                 })
180                 redstone.update(pos)
181                 redstone.update(vector.add(pos,dir))
182         end,
183
184         on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
185                 local newlevel = level + 1
186                 if newlevel > max_timer then
187                         newlevel = 0
188                 end
189                 local param2 = minetest.get_node(pos).param2
190                 local dir = minetest.facedir_to_dir(param2)
191                 minetest.swap_node(pos,{name="redstone:repeater_off_"..newlevel,param2=param2})
192                 redstone.inject(pos,{
193                         name = "redstone:repeater_off_"..newlevel,
194                         directional_activator = true,
195                         input  = vector.subtract(pos,dir),
196                         output = vector.add(pos,dir),
197                         dir = dir
198                 })
199                 minetest.sound_play("lever", {pos=pos})
200         end,
201
202         after_destruct = function(pos, oldnode)
203                 redstone.inject(pos,nil)
204                 redstone.update(pos)
205         end,
206
207         after_place_node = function(pos)
208                 local dir = minetest.facedir_to_dir(minetest.get_node(pos).param2)
209                 redstone.inject(pos,{
210                         name = "redstone:repeater_off_"..level,
211                         directional_activator = true,
212                         input  = vector.subtract(pos,dir),
213                         output = vector.add(pos,dir),
214                         dir = dir
215                 })
216                 redstone.update(pos)
217         end
218 })
219
220
221 redstone.register_activator({
222         name = "redstone:repeater_off_"..level,
223         activate = function(pos)
224                 local timer = minetest.get_node_timer(pos)
225                 if not timer:is_started() then
226                         timer:start(level/max_timer)
227                 end
228         end
229 })
230
231
232 minetest.register_lbm({
233         name = "redstone:startup_activator_off_"..level,
234         nodenames = {"redstone:repeater_off_"..level},
235         run_at_every_load = true,
236         action = function(pos)
237                 local dir = minetest.facedir_to_dir(minetest.get_node(pos).param2)
238                 redstone.inject(pos,{
239                         name = "redstone:repeater_off_"..level,
240                         directional_activator = true,
241                         input  = vector.subtract(pos,dir),
242                         dir = dir
243                 })
244         end,
245 })
246
247 end