From c1d4228cebda32c0b0d72c51e5554529b84e8543 Mon Sep 17 00:00:00 2001 From: Jeija Date: Thu, 26 Jan 2012 16:22:04 +0100 Subject: Updated to new Minetest version (22.01.2012) --- .minetest/usermods/jeija/wireless.lua | 327 ++++++++++++++++++++++++++++++++++ 1 file changed, 327 insertions(+) create mode 100644 .minetest/usermods/jeija/wireless.lua (limited to '.minetest/usermods/jeija/wireless.lua') diff --git a/.minetest/usermods/jeija/wireless.lua b/.minetest/usermods/jeija/wireless.lua new file mode 100644 index 0000000..3344d47 --- /dev/null +++ b/.minetest/usermods/jeija/wireless.lua @@ -0,0 +1,327 @@ +-- IC +minetest.register_craftitem("jeija:ic", { + image = "jeija_ic.png", + on_place_on_ground = minetest.craftitem_place_item, +}) + +minetest.register_craft({ + output = 'craft "jeija:ic" 2', + recipe = { + {'craft "jeija:silicon"', 'craft "jeija:silicon"', 'node "jeija:mesecon_off"'}, + {'craft "jeija:silicon"', 'craft "jeija:silicon"', 'node "jeija:mesecon_off"'}, + {'node "jeija:mesecon_off"', 'node "jeija:mesecon_off"', ''}, + } +}) + +--COMMON WIRELESS FUNCTIONS + +function mesecon:read_wlre_from_file() + print "[MESEcons] Reading Mesecon Data..." + mesecon_file=io.open(minetest.get_modpath("jeija").."/mesecon_data", "r") + if mesecon_file==nil then return end + local row=mesecon_file:read() + local i=1 + while row~=nil do + mesecon.wireless_receivers[i]={} + mesecon.wireless_receivers[i].pos={} + mesecon.wireless_receivers[i].pos.x=tonumber(mesecon_file:read()) + mesecon.wireless_receivers[i].pos.y=tonumber(mesecon_file:read()) + mesecon.wireless_receivers[i].pos.z=tonumber(mesecon_file:read()) + mesecon.wireless_receivers[i].channel=mesecon_file:read() + mesecon.wireless_receivers[i].requested_state=tonumber(mesecon_file:read()) + mesecon.wireless_receivers[i].inverting=tonumber(mesecon_file:read()) + i=i+1 + row=mesecon_file:read() + end + mesecon_file:close() + print "[MESEcons] Finished Reading Mesecon Data..." +end + + +function mesecon:register_wireless_receiver(pos, inverting) + local i = 1 + repeat + if mesecon.wireless_receivers[i]==nil then break end + i=i+1 + until false + + + local node_under_pos={} + node_under_pos.x=pos.x + node_under_pos.y=pos.y + node_under_pos.z=pos.z + + node_under_pos.y=node_under_pos.y-1 + local node_under=minetest.env:get_node(node_under_pos) + mesecon.wireless_receivers[i]={} + mesecon.wireless_receivers[i].pos={} + mesecon.wireless_receivers[i].pos.x=pos.x + mesecon.wireless_receivers[i].pos.y=pos.y + mesecon.wireless_receivers[i].pos.z=pos.z + mesecon.wireless_receivers[i].channel=node_under.name + mesecon.wireless_receivers[i].requested_state=0 + mesecon.wireless_receivers[i].inverting=inverting +end + +function mesecon:remove_wireless_receiver(pos) + local i = 1 + while mesecon.wireless_receivers[i]~=nil do + if mesecon.wireless_receivers[i].pos.x==pos.x and + mesecon.wireless_receivers[i].pos.y==pos.y and + mesecon.wireless_receivers[i].pos.z==pos.z then + mesecon.wireless_receivers[i]=nil + break + end + i=i+1 + end +end + +function mesecon:set_wlre_channel(pos, channel) + --local i = 1 + --while mesecon.wireless_receivers[i]~=nil do + -- if tonumber(mesecon.wireless_receivers[i].pos.x)==tonumber(pos.x) and + -- tonumber(mesecon.wireless_receivers[i].pos.y)==tonumber(pos.y) and + -- tonumber(mesecon.wireless_receivers[i].pos.z)==tonumber(pos.z) then + -- mesecon.wireless_receivers[i].channel=channel + -- break + -- end + -- i=i+1 + --end + local wlre=mesecon:get_wlre(pos) + if wlre~=nil then + wlre.channel=channel + end +end + +function mesecon:get_wlre(pos) + local i=1 + while mesecon.wireless_receivers[i]~=nil do + if mesecon.wireless_receivers[i].pos.x==pos.x and + mesecon.wireless_receivers[i].pos.y==pos.y and + mesecon.wireless_receivers[i].pos.z==pos.z then + return mesecon.wireless_receivers[i] + end + i=i+1 + end +end + +minetest.register_on_placenode(function(pos, newnode, placer) + pos.y=pos.y+1 + if minetest.env:get_node(pos).name == "jeija:wireless_receiver_off" or + minetest.env:get_node(pos).name == "jeija:wireless_receiver_on" or + minetest.env:get_node(pos).name == "jeija:wireless_inverter_off" or + minetest.env:get_node(pos).name == "jeija:wireless_inverter_on" then + mesecon:set_wlre_channel(pos, newnode.name) + end +end) + +minetest.register_on_dignode( + function(pos, oldnode, digger) + local channel + pos.y=pos.y+1 + if minetest.env:get_node(pos).name == "jeija:wireless_receiver_on" or + minetest.env:get_node(pos).name == "jeija:wireless_receiver_off" or + minetest.env:get_node(pos).name == "jeija:wireless_inverter_on" or + minetest.env:get_node(pos).name == "jeija:wireless_inverter_off" then + mesecon:set_wlre_channel(pos, "air") + end + end +) + +minetest.register_abm( + {nodenames = {"jeija:wireless_receiver_on", "jeija:wireless_receiver_off", + "jeija:wireless_inverter_on", "jeija:wireless_inverter_off"}, + interval = 1.0, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local wlre=mesecon:get_wlre(pos) + if (wlre==nil) then return end + + if node.name=="jeija:wireless_receiver_on" and wlre.requested_state==0 then + minetest.env:add_node(pos, {name="jeija:wireless_receiver_off"}) + mesecon:receptor_off(pos) + end + if node.name=="jeija:wireless_receiver_off" and wlre.requested_state==1 then + minetest.env:add_node(pos, {name="jeija:wireless_receiver_on"}) + mesecon:receptor_on(pos) + end + if node.name=="jeija:wireless_inverter_off" and wlre.requested_state==0 and wlre.inverting==1 then + minetest.env:add_node(pos, {name="jeija:wireless_inverter_on"}) + mesecon:receptor_on(pos) + end + if node.name=="jeija:wireless_inverter_on" and wlre.requested_state==1 and wlre.inverting==1 then + minetest.env:add_node(pos, {name="jeija:wireless_inverter_off"}) + mesecon:receptor_off(pos) + end + end, +}) + +--WIRELESS RECEIVER + +minetest.register_node("jeija:wireless_receiver_off", { + tile_images = {"jeija_wireless_receiver_tb_off.png", "jeija_wireless_receiver_tb_off.png", "jeija_wireless_receiver_off.png", "jeija_wireless_receiver_off.png", "jeija_wireless_receiver_off.png", "jeija_wireless_receiver_off.png"}, + inventory_image = minetest.inventorycube("jeija_wireless_receiver_off.png"), + material = minetest.digprop_constanttime(0.8), +}) + +minetest.register_node("jeija:wireless_receiver_on", { + tile_images = {"jeija_wireless_receiver_tb_on.png", "jeija_wireless_receiver_tb_on.png", "jeija_wireless_receiver_on.png", "jeija_wireless_receiver_on.png", "jeija_wireless_receiver_on.png", "jeija_wireless_receiver_on.png"}, + inventory_image = minetest.inventorycube("jeija_wireless_receiver_on.png"), + material = minetest.digprop_constanttime(0.8), + dug_item = 'node "jeija:wireless_receiver_off" 1' +}) + +minetest.register_craft({ + output = 'node "jeija:wireless_receiver_off" 2', + recipe = { + {'', 'node "jeija:mesecon_off"', ''}, + {'', 'node "jeija:mesecon_off"', ''}, + {'', 'craft "jeija:ic"', ''}, + } +}) + +minetest.register_on_placenode(function(pos, newnode, placer) + if newnode.name == "jeija:wireless_receiver_off" then + mesecon:register_wireless_receiver(pos, 0) + end +end) + +minetest.register_on_dignode( + function(pos, oldnode, digger) + if oldnode.name == "jeija:wireless_receiver_on" then + mesecon:remove_wireless_receiver(pos) + mesecon:receptor_off(pos) + end + if oldnode.name == "jeija:wireless_receiver_off" then + mesecon:remove_wireless_receiver(pos) + end + end +) + +minetest.register_abm( -- SAVE WIRELESS RECEIVERS TO FILE + {nodenames = {"jeija:wireless_receiver_off", "jeija:wireless_receiver_on", "jeija:wireless_inverter_on", "jeija:wireless_inverter_off"}, + interval = 10, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local mesecon_file = io.open(minetest.get_modpath("jeija").."/mesecon_data", "w") + local i=1 + while mesecon.wireless_receivers[i]~=nil do + mesecon_file:write("NEXT\n") + mesecon_file:write(mesecon.wireless_receivers[i].pos.x.."\n") + mesecon_file:write(mesecon.wireless_receivers[i].pos.y.."\n") + mesecon_file:write(mesecon.wireless_receivers[i].pos.z.."\n") + mesecon_file:write(mesecon.wireless_receivers[i].channel.."\n") + mesecon_file:write(mesecon.wireless_receivers[i].requested_state.."\n") + mesecon_file:write(mesecon.wireless_receivers[i].inverting.."\n") + i=i+1 + end + mesecon_file:close() + end, +}) + +mesecon:add_receptor_node("jeija:wireless_receiver_on") +mesecon:add_receptor_node_off("jeija:wireless_receiver_off") + +-- WIRELESS INVERTER OFF/ON BELONGS TO THE OUTPUT STATE (ON=INPUT OFF) + +minetest.register_node("jeija:wireless_inverter_off", { + tile_images = {"jeija_wireless_inverter_tb.png", "jeija_wireless_inverter_tb.png", "jeija_wireless_inverter_off.png", "jeija_wireless_inverter_off.png", "jeija_wireless_inverter_off.png", "jeija_wireless_inverter_off.png"}, + inventory_image = minetest.inventorycube("jeija_wireless_inverter_off.png"), + material = minetest.digprop_constanttime(0.8), + dug_item = 'node "jeija:wireless_inverter_on" 1' +}) + +minetest.register_node("jeija:wireless_inverter_on", { + tile_images = {"jeija_wireless_inverter_tb.png", "jeija_wireless_inverter_tb.png", "jeija_wireless_inverter_on.png", "jeija_wireless_inverter_on.png", "jeija_wireless_inverter_on.png", "jeija_wireless_inverter_on.png"}, + inventory_image = minetest.inventorycube("jeija_wireless_inverter_on.png"), + material = minetest.digprop_constanttime(0.8), +}) + +minetest.register_craft({ + output = 'node "jeija:wireless_inverter_off" 2', + recipe = { + {'', 'craft "default:steel_ingot"', ''}, + {'craft "jeija:ic"', 'node "jeija:mesecon_off"', 'craft "jeija:ic"'}, + {'', 'node "jeija:mesecon_off"', ''}, + } +}) + +minetest.register_on_placenode(function(pos, newnode, placer) + if newnode.name == "jeija:wireless_inverter_on" then + mesecon:register_wireless_receiver(pos, 1) + mesecon:receptor_on(pos) + end +end) + +minetest.register_on_dignode( + function(pos, oldnode, digger) + if oldnode.name == "jeija:wireless_inverter_on" then + mesecon:remove_wireless_receiver(pos) + mesecon:receptor_off(pos) + end + if oldnode.name == "jeija:wireless_inverter_off" then + mesecon:remove_wireless_receiver(pos) + end + end +) + +mesecon:add_receptor_node("jeija:wireless_inverter_on") +mesecon:add_receptor_node_off("jeija:wireless_inverter_off") + +-- WIRELESS TRANSMITTER + +function mesecon:wireless_transmit(channel, senderstate) + local i = 1 + while mesecon.wireless_receivers[i]~=nil do + if mesecon.wireless_receivers[i].channel==channel then + if senderstate==1 then + mesecon.wireless_receivers[i].requested_state=1 + elseif senderstate==0 then + mesecon.wireless_receivers[i].requested_state=0 + end + end + i=i+1 + end +end + +minetest.register_node("jeija:wireless_transmitter_on", { + tile_images = {"jeija_wireless_transmitter_tb.png", "jeija_wireless_transmitter_tb.png", "jeija_wireless_transmitter_on.png", "jeija_wireless_transmitter_on.png", "jeija_wireless_transmitter_on.png", "jeija_wireless_transmitter_on.png"}, + inventory_image = minetest.inventorycube("jeija_wireless_transmitter_on.png"), + material = minetest.digprop_constanttime(0.8), + dug_item = 'node "jeija:wireless_transmitter_off" 1', +}) + +minetest.register_node("jeija:wireless_transmitter_off", { + tile_images = {"jeija_wireless_transmitter_tb.png", "jeija_wireless_transmitter_tb.png", "jeija_wireless_transmitter_off.png", "jeija_wireless_transmitter_off.png", "jeija_wireless_transmitter_off.png", "jeija_wireless_transmitter_off.png"}, + inventory_image = minetest.inventorycube("jeija_wireless_transmitter_off.png"), + material = minetest.digprop_constanttime(0.8), +}) + +minetest.register_craft({ + output = 'node "jeija:wireless_transmitter_off" 2', + recipe = { + {'craft "default:steel_ingot"', 'node "jeija:mesecon_off"', 'craft "default:steel_ingot"'}, + {'', 'node "jeija:mesecon_off"', ''}, + {'', 'craft "jeija:ic"', ''}, + } +}) + +mesecon:register_on_signal_on(function(pos, node) + if node.name=="jeija:wireless_transmitter_off" then + minetest.env:add_node(pos, {name="jeija:wireless_transmitter_on"}) + local node_under_pos=pos + node_under_pos.y=node_under_pos.y-1 + local node_under=minetest.env:get_node(node_under_pos) + mesecon:wireless_transmit(node_under.name, 1) + end +end) + +mesecon:register_on_signal_off(function(pos, node) + if node.name=="jeija:wireless_transmitter_on" then + minetest.env:add_node(pos, {name="jeija:wireless_transmitter_off"}) + local node_under_pos=pos + node_under_pos.y=node_under_pos.y-1 + local node_under=minetest.env:get_node(node_under_pos) + mesecon:wireless_transmit(node_under.name, 0) + end +end) -- cgit v1.2.3