X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=mods%2Fredstone%2Frepeater.lua;h=39dc4847000067a1c3af87ff3d8a9a9cf2cff02f;hb=8d2457c75d7f560be534159cec29091121b18ad8;hp=4c4d75214d129cbef647430e7727d4b1c17e8118;hpb=9ca299b1b64b54382736fe9a4acd70152871a8fc;p=Crafter.git diff --git a/mods/redstone/repeater.lua b/mods/redstone/repeater.lua index 4c4d752..39dc484 100644 --- a/mods/redstone/repeater.lua +++ b/mods/redstone/repeater.lua @@ -1,37 +1,207 @@ -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