From 01d93325270fa14e79a074b32da2d42b16d93327 Mon Sep 17 00:00:00 2001 From: oilboi <47129783+oilboi@users.noreply.github.com> Date: Fri, 26 Jun 2020 04:46:30 -0400 Subject: [PATCH] Fix repeaters --- mods/redstone/inverter.lua | 9 +- mods/redstone/repeater.lua | 173 +++++++------------------------------ 2 files changed, 36 insertions(+), 146 deletions(-) diff --git a/mods/redstone/inverter.lua b/mods/redstone/inverter.lua index 2b1a588..4e5d981 100644 --- a/mods/redstone/inverter.lua +++ b/mods/redstone/inverter.lua @@ -29,6 +29,9 @@ minetest.register_node("redstone:inverter_on", { redstone.collect_info(vector.subtract(pos,dir)) end) end, + after_destruct = function(pos, oldnode) + redstone.collect_info(pos) + end }) minetest.register_node("redstone:inverter_off", { @@ -62,11 +65,9 @@ minetest.register_node("redstone:inverter_off", { after_place_node = function(pos, placer, itemstack, pointed_thing) redstone.collect_info(pos) end, - on_dig = function(pos, node, digger) - minetest.node_dig(pos, node, digger) + after_destruct = function(pos, oldnode) redstone.collect_info(pos) - end, - + end }) minetest.register_lbm({ diff --git a/mods/redstone/repeater.lua b/mods/redstone/repeater.lua index 33e8421..fc196c9 100644 --- a/mods/redstone/repeater.lua +++ b/mods/redstone/repeater.lua @@ -1,96 +1,8 @@ local minetest,vector = minetest,vector -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 +local max_timer = 7 -function repeater_on_timer(pos) - local self_repeater_level = minetest.get_item_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_item_group(output_node.name, "repeater") > 0 then - - - repeater_input(output) - - - elseif minetest.get_item_group(output_node.name, "redstone_dust") > 0 then - minetest.after(0,function(output) - redstone.collect_info(output) - end,output) - elseif minetest.get_item_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_item_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 +for level = 0,max_timer do minetest.register_node("redstone:repeater_off_"..level, { description = "Redstone Repeater", tiles = {"repeater_off.png"}, @@ -108,44 +20,33 @@ minetest.register_node("redstone:repeater_off_"..level, { --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 + {-0.1, -0.5, -0.05-(level*0.05), 0.1, 0.1, 0.15-(level*0.05)}, --input post }, - }, - --make the repeater turn on + }, redstone_activation = function(pos) - repeater_input(pos) - end, - redstone_deactivation = 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) - repeater_on_timer(pos) + minetest.swap_node(pos, {name="redstone:repeater_on_"..level}) + redstone.collect_info(pos) end, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) local newlevel = level + 1 - if newlevel > 2 then + if newlevel > max_timer 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)) + minetest.sound_play("lever", {pos=pos}) end, + + after_destruct = function(pos, oldnode) + redstone.collect_info(pos) + end }) minetest.register_node("redstone:repeater_on_"..level, { @@ -165,44 +66,32 @@ minetest.register_node("redstone:repeater_on_"..level, { --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 + {-0.1, -0.5, -0.05-(level*0.05), 0.1, 0.1, 0.15-(level*0.05)}, --input post }, }, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) local newlevel = level + 1 - if newlevel > 2 then + if newlevel > max_timer 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) + minetest.sound_play("lever", {pos=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) + if not timer:is_started() then + timer:start(level/max_timer) + end end, - after_destruct = function(pos) + on_timer = function(pos, elapsed) + minetest.swap_node(pos, {name="redstone:repeater_off_"..level}) + redstone.collect_info(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)) + redstone.collect_info(pos) end, + after_destruct = function(pos, oldnode) + redstone.collect_info(pos) + end }) end -- 2.44.0