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