-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