]> git.lizzy.rs Git - Crafter.git/blobdiff - mods/redstone/repeater.lua
Update everything
[Crafter.git] / mods / redstone / repeater.lua
index 4c4d75214d129cbef647430e7727d4b1c17e8118..39dc4847000067a1c3af87ff3d8a9a9cf2cff02f 100644 (file)
-minetest.register_node("redstone:repeater", {
-    description = "Crafting Table",
-    tiles = {"stone.png"},
-    groups = {stone = 1, hard = 1, pickaxe = 1, hand = 4,attached_node = 1},
+
+repeater_set_buffer = function(pos,level)
+       local meta = minetest.get_meta(pos)
+       meta:set_int("buffer_level",level)
+end
+repeater_get_buffer = function(pos)
+       local meta = minetest.get_meta(pos)
+       return(meta:get_int("buffer_level"))
+end
+
+repeater_set_input = function(pos,level)
+       local meta = minetest.get_meta(pos)
+       meta:set_int("repeater_input",level)
+end
+repeater_get_input = function(pos)
+       local meta = minetest.get_meta(pos)
+       return(meta:get_int("repeater_input"))
+end
+
+repeater_pass_new_power = function(pos,level)
+       local meta = minetest.get_meta(pos)
+       meta:set_int("new_power",level)
+end
+repeater_get_new_power = function(pos)
+       local meta = minetest.get_meta(pos)
+       return(meta:get_int("new_power"))
+end
+
+function repeater_on_timer(pos)
+       local self_repeater_level = minetest.get_node_group(minetest.get_node(pos).name, "repeater_level")
+       local param2 = minetest.get_node(pos).param2
+       local power = get_powered_state_directional(pos)
+       local buffer = repeater_get_buffer(pos)
+       local input = repeater_get_input(pos)
+       
+       
+       if buffer > 0 then
+               minetest.swap_node(pos,{name="redstone:repeater_on_"..self_repeater_level,param2=param2})
+       else
+               minetest.swap_node(pos,{name="redstone:repeater_off_"..self_repeater_level,param2=param2})
+       end
+       
+       --try to get to equalized power state
+       if buffer ~= power then
+               local timer = minetest.get_node_timer(pos)
+               timer:start(self_repeater_level/2)
+       end
+       
+       
+       --pass on power to next node
+       local output = minetest.facedir_to_dir(param2)
+       output = vector.add(pos,output)
+       local output_node = minetest.get_node(output)
+       if minetest.get_node_group(output_node.name, "repeater") > 0 then
+       
+       
+               repeater_input(output)
+               
+               
+       elseif minetest.get_node_group(output_node.name, "redstone_dust") > 0 then
+               minetest.after(0,function(output)
+                       redstone.collect_info(output)
+               end,output)
+       elseif minetest.get_node_group(output_node.name, "redstone_activation") > 0 then
+               minetest.after(0,function(output)
+                       redstone.collect_info(output)
+               end,output)
+       end
+       
+       repeater_set_buffer(pos,0)
+end
+
+function repeater_input(pos)
+       local self_repeater_level = minetest.get_node_group(minetest.get_node(pos).name, "repeater_level")
+       local param2 = minetest.get_node(pos).param2
+       local power = get_powered_state_directional(pos)
+       
+       local buffer = repeater_get_buffer(pos)
+       
+       if buffer == 0 then
+               repeater_set_buffer(pos,power)
+       end
+       
+       repeater_set_input(pos,power)
+               
+       local timer = minetest.get_node_timer(pos)
+       timer:start(self_repeater_level/2)
+       
+       set_old_power(pos,power)
+end
+
+for level = 0,2 do
+minetest.register_node("redstone:repeater_off_"..level, {
+    description = "Redstone Repeater",
+    tiles = {"repeater_off.png"},
+    groups = {stone = 1, hard = 1, pickaxe = 1, hand = 4,attached_node = 1,repeater_off=1,repeater=1,redstone_activation_directional=1,repeater_level=level},
     sounds = main.stoneSound(),
     paramtype = "light",
-       paramtype2 = "wallmounted",
+       paramtype2 = "facedir",
        sunlight_propagates = true,
        walkable = false,
        drawtype= "nodebox",
-       drop="redstone:button_off",
+       drop="redstone:repeater_off_0",
        node_box = {
                type = "fixed",
                fixed = {
-                               --left front bottom right back top
-                               {-0.25, -0.5,  -0.15, 0.25,  -0.3, 0.15},
+                               --left  front  bottom right back top
+                               {-0.5, -0.5,  -0.5, 0.5,  -0.3, 0.5}, --base
+                               {-0.1, -0.5,  0.2, 0.1,  0.1, 0.4}, --output post
+                               {-0.1, -0.5,  -0.05-(level*0.15)--[[]], 0.1,  0.1, 0.15-(level*0.15)--[[]]}, --input post
                        },
                },
-    on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
-               minetest.sound_play("lever", {pos=pos})
-               minetest.set_node(pos, {name="redstone:button_on",param2=node.param2})
-               local dir = minetest.facedir_to_dir(node.param2)
-               local c_pos = table.copy(pos)
-               local pos = vector.add(dir,pos)
-               local name = minetest.get_node(pos).name
-               local def = minetest.registered_nodes[name]
-               
-               if def.drawtype == "normal" and string.match(name, "main:") then
-                       name = "redstone:"..string.gsub(name, "main:", "")
-                       minetest.set_node(pos,{name=name})
-                       redstone.collect_info(pos)
-                       local timer = minetest.get_node_timer(c_pos)
-                       timer:start(1)
+       --make the repeater turn on
+       redstone_activation = function(pos)
+               repeater_input(pos)
+       end,
+       redstone_deactivation = function(pos)
+       end,
+       
+       
+       on_timer = function(pos, elapsed)
+               repeater_on_timer(pos)
+       end,
+       on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
+               local newlevel = level + 1
+               if newlevel > 2 then
+                       newlevel = 0
+               end
+               minetest.swap_node(pos,{name="redstone:repeater_off_"..newlevel,param2=node.param2})
+               minetest.sound_play("lever", {pos=pos,pitch=1-(newlevel*0.1)})
+       end,
+       redstone_update = function(pos)
+       end,
+       on_construct = function(pos)
+       end,
+       after_destruct  = function(pos)
+       end,
+       after_place_node = function(pos, placer, itemstack, pointed_thing)
+               local timer = minetest.get_node_timer(pos)
+               timer:start(level/2)
+       end,
+       on_dig = function(pos, node, digger)
+               local param2 = minetest.get_node(pos).param2
+               minetest.node_dig(pos, node, digger)
+               local dir = minetest.facedir_to_dir(param2)
+               redstone.collect_info(vector.add(pos,dir))
+       end,
+})
+
+minetest.register_node("redstone:repeater_on_"..level, {
+    description = "Redstone Repeater",
+    tiles = {"repeater_on.png"},
+    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=9,repeater_level=level},
+    sounds = main.stoneSound(),
+    paramtype = "light",
+       paramtype2 = "facedir",
+       sunlight_propagates = true,
+       walkable = false,
+       drawtype= "nodebox",
+       drop="redstone:repeater_off_0",
+       node_box = {
+               type = "fixed",
+               fixed = {
+                               --left  front  bottom right back top
+                               {-0.5, -0.5,  -0.5, 0.5,  -0.3, 0.5}, --base
+                               {-0.1, -0.5,  0.2, 0.1,  0.1, 0.4}, --output post
+                               {-0.1, -0.5,  -0.05-(level*0.15)--[[]], 0.1,  0.1, 0.15-(level*0.15)--[[]]}, --input post
+                       },
+               },
+       on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
+               local newlevel = level + 1
+               if newlevel > 2 then
+                       newlevel = 0
                end
+               minetest.swap_node(pos,{name="redstone:repeater_on_"..newlevel,param2=node.param2})
+               minetest.sound_play("lever", {pos=pos,pitch=1-(newlevel*0.1)})
+       end,
+       redstone_activation = function(pos)
+       end,
+       redstone_deactivation = function(pos)
+               repeater_input(pos)
+       end,
+       on_timer = function(pos, elapsed)
+               repeater_on_timer(pos)
+       end,
+       on_dig = function(pos, node, digger)
+               --repeater_on_timer(pos,level)
+               minetest.node_dig(pos, node, digger)
+       end,
+       redstone_update = function(pos)
+       end,
+       after_place_node = function(pos, placer, itemstack, pointed_thing)
+               local timer = minetest.get_node_timer(pos)
+               timer:start(level/2)
+       end,
+       on_construct = function(pos)
+       end,
+       after_destruct = function(pos)
+       end,
+       on_dig = function(pos, node, digger)
+               local param2 = minetest.get_node(pos).param2
+               minetest.node_dig(pos, node, digger)
+               local dir = minetest.facedir_to_dir(param2)
+               redstone.collect_info(vector.add(pos,dir))
        end,
-       on_destruct = on_button_destroy,
 })
+end