X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=mods%2Fredstone%2Frepeater.lua;h=566a07230303188f7ac19951f21d8c8992e95658;hb=05de43075e68e7e70dc5a3192937b64c88c8473d;hp=0d7f186d079825d2f78d09b3e8054a292d75c09c;hpb=662a97b00de29dc96d00bfe4bba8802cfb588057;p=Crafter.git diff --git a/mods/redstone/repeater.lua b/mods/redstone/repeater.lua index 0d7f186..566a072 100644 --- a/mods/redstone/repeater.lua +++ b/mods/redstone/repeater.lua @@ -1,14 +1,26 @@ local minetest,vector = minetest,vector local max_timer = 7 - for level = 0,max_timer 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", + + + + +--[[ + ██████╗ ███╗ ██╗ +██╔═══██╗████╗ ██║ +██║ ██║██╔██╗ ██║ +██║ ██║██║╚██╗██║ +╚██████╔╝██║ ╚████║ + ╚═════╝ ╚═╝ ╚═══╝ +]]-- + +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, @@ -22,38 +34,120 @@ minetest.register_node("redstone:repeater_off_"..level, { {-0.1, -0.5, 0.2, 0.1, 0.1, 0.4}, --output post {-0.1, -0.5, -0.05-(level*0.05), 0.1, 0.1, 0.15-(level*0.05)}, --input post }, - }, - redstone_activation = function(pos) - local timer = minetest.get_node_timer(pos) - if not timer:is_started() then - timer:start(level/max_timer) - end - end, - - on_timer = function(pos, elapsed) - local param2 = minetest.get_node(pos).param2 - minetest.swap_node(pos, {name="redstone:repeater_on_"..level,param2=param2}) - redstone.collect_info(pos) - end, + }, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) local newlevel = level + 1 if newlevel > max_timer then newlevel = 0 end - minetest.swap_node(pos,{name="redstone:repeater_off_"..newlevel,param2=node.param2}) + local param2 = minetest.get_node(pos).param2 + local dir = minetest.facedir_to_dir(param2) + + minetest.swap_node(pos,{name="redstone:repeater_on_"..newlevel,param2=param2}) minetest.sound_play("lever", {pos=pos}) + redstone.inject(pos,{ + name = "redstone:repeater_on_"..newlevel, + torch = 9, + torch_directional = true, + directional_activator = true, + input = vector.subtract(pos,dir), + output = vector.add(pos,dir), + dir = dir + }) + end, + + on_timer = function(pos, elapsed) + local param2 = minetest.get_node(pos).param2 + minetest.swap_node(pos, {name="redstone:repeater_off_"..level,param2=param2}) + local dir = minetest.facedir_to_dir(param2) + redstone.inject(pos,{ + name = "redstone:repeater_off_"..level, + directional_activator = true, + input = vector.subtract(pos,dir), + dir = dir + }) + + redstone.update(pos) end, after_destruct = function(pos, oldnode) - redstone.collect_info(pos) + redstone.inject(pos,nil) + redstone.update(pos) + end, + + after_place_node = function(pos) + local dir = minetest.facedir_to_dir(minetest.get_node(pos).param2) + redstone.inject(pos,{ + name = "redstone:repeater_on_"..level, + torch = 9, + torch_directional = true, + directional_activator = true, + input = vector.subtract(pos,dir), + output = vector.add(pos,dir), + dir = dir + }) + redstone.update(pos) end }) -minetest.register_node("redstone:repeater_on_"..level, { +redstone.register_activator({ + name = "redstone:repeater_on_"..level, + deactivate = function(pos) + local timer = minetest.get_node_timer(pos) + if not timer:is_started() then + timer:start(level/max_timer) + end + end +}) + + +minetest.register_lbm({ + name = "redstone:startup_activator_on_"..level, + nodenames = {"redstone:repeater_on_"..level}, + run_at_every_load = true, + action = function(pos) + local dir = minetest.facedir_to_dir(minetest.get_node(pos).param2) + redstone.inject(pos,{ + name = "redstone:repeater_on_"..level, + torch = 9, + torch_directional = true, + directional_activator = true, + input = vector.subtract(pos,dir), + output = vector.add(pos,dir), + dir = dir + }) + --redstone needs to warm up + minetest.after(0,function() + redstone.update(pos) + end) + end, +}) + + + + + + + + + + +--[[ + ██████╗ ███████╗███████╗ +██╔═══██╗██╔════╝██╔════╝ +██║ ██║█████╗ █████╗ +██║ ██║██╔══╝ ██╔══╝ +╚██████╔╝██║ ██║ + ╚═════╝ ╚═╝ ╚═╝ +]]-- + + + +minetest.register_node("redstone:repeater_off_"..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}, + 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 = "facedir", @@ -69,28 +163,94 @@ minetest.register_node("redstone:repeater_on_"..level, { {-0.1, -0.5, 0.2, 0.1, 0.1, 0.4}, --output post {-0.1, -0.5, -0.05-(level*0.05), 0.1, 0.1, 0.15-(level*0.05)}, --input post }, - }, + }, + redstone_activation = function(pos) + local timer = minetest.get_node_timer(pos) + if not timer:is_started() then + timer:start(level/max_timer) + end + end, + + on_timer = function(pos, elapsed) + local param2 = minetest.get_node(pos).param2 + minetest.swap_node(pos, {name="redstone:repeater_on_"..level,param2=param2}) + + local dir = minetest.facedir_to_dir(param2) + redstone.inject(pos,{ + name = "redstone:repeater_on_"..level, + torch = 9, + torch_directional = true, + directional_activator = true, + input = vector.subtract(pos,dir), + output = vector.add(pos,dir), + dir = dir + }) + redstone.update(pos) + end, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) local newlevel = level + 1 if newlevel > max_timer then newlevel = 0 end - minetest.swap_node(pos,{name="redstone:repeater_on_"..newlevel,param2=node.param2}) + local param2 = minetest.get_node(pos).param2 + local dir = minetest.facedir_to_dir(param2) + minetest.swap_node(pos,{name="redstone:repeater_off_"..newlevel,param2=param2}) + redstone.inject(pos,{ + name = "redstone:repeater_off_"..newlevel, + directional_activator = true, + input = vector.subtract(pos,dir), + dir = dir + }) minetest.sound_play("lever", {pos=pos}) end, - redstone_deactivation = function(pos) + + after_destruct = function(pos, oldnode) + redstone.inject(pos,nil) + redstone.update(pos) + end, + + after_place_node = function(pos) + local dir = minetest.facedir_to_dir(minetest.get_node(pos).param2) + redstone.inject(pos,{ + name = "redstone:repeater_off_"..level, + directional_activator = true, + input = vector.subtract(pos,dir), + dir = dir + }) + redstone.update(pos) + end +}) + + +redstone.register_activator({ + name = "redstone:repeater_off_"..level, + activate = function(pos) local timer = minetest.get_node_timer(pos) if not timer:is_started() then timer:start(level/max_timer) end - end, - on_timer = function(pos, elapsed) - local param2 = minetest.get_node(pos).param2 - minetest.swap_node(pos, {name="redstone:repeater_off_"..level,param2=param2}) - redstone.collect_info(pos) - end, - after_destruct = function(pos, oldnode) - redstone.collect_info(pos) end }) + + +minetest.register_lbm({ + name = "redstone:startup_activator_off_"..level, + nodenames = {"redstone:repeater_off_"..level}, + run_at_every_load = true, + action = function(pos) + local dir = minetest.facedir_to_dir(minetest.get_node(pos).param2) + redstone.inject(pos,{ + name = "redstone:repeater_off_"..level, + directional_activator = true, + input = vector.subtract(pos,dir), + dir = dir + }) + --redstone needs a second to warm up + minetest.after(0,function() + redstone.update(pos) + end) + end, +}) + end