From ed55f8f793520e546534e1cf5152324d739e8c9e Mon Sep 17 00:00:00 2001 From: Novatux Date: Thu, 1 Aug 2013 16:29:07 +0200 Subject: [PATCH] Add wireless emitters/receivers. --- mods/digilines_craftrecipes/init.lua | 2 +- mods/mesecons_wireless/depends.txt | 2 + mods/mesecons_wireless/init.lua | 182 ++++++++++++++++++ .../textures/mesecons_wireless_emitter.png | Bin 0 -> 244 bytes .../textures/mesecons_wireless_receiver.png | Bin 0 -> 240 bytes .../mesecons_wireless_receiver_on.png | Bin 0 -> 241 bytes 6 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 mods/mesecons_wireless/depends.txt create mode 100644 mods/mesecons_wireless/init.lua create mode 100644 mods/mesecons_wireless/textures/mesecons_wireless_emitter.png create mode 100644 mods/mesecons_wireless/textures/mesecons_wireless_receiver.png create mode 100644 mods/mesecons_wireless/textures/mesecons_wireless_receiver_on.png diff --git a/mods/digilines_craftrecipes/init.lua b/mods/digilines_craftrecipes/init.lua index 4ce70c2..7f35909 100644 --- a/mods/digilines_craftrecipes/init.lua +++ b/mods/digilines_craftrecipes/init.lua @@ -1,5 +1,5 @@ minetest.register_craft({ - output = 'digilines:wire_std_00000000', + output = 'digilines:wire_std_00000000 4', recipe = { {'technic:rubber', 'mesecons:mesecon', 'technic:rubber'}, {'mesecons:mesecon', 'technic:rubber', 'mesecons:mesecon'}, diff --git a/mods/mesecons_wireless/depends.txt b/mods/mesecons_wireless/depends.txt new file mode 100644 index 0000000..d92a438 --- /dev/null +++ b/mods/mesecons_wireless/depends.txt @@ -0,0 +1,2 @@ +mesecons + diff --git a/mods/mesecons_wireless/init.lua b/mods/mesecons_wireless/init.lua new file mode 100644 index 0000000..f63cd36 --- /dev/null +++ b/mods/mesecons_wireless/init.lua @@ -0,0 +1,182 @@ + +local wireless_filename=minetest.get_worldpath() .. "/wireless" + +local function read_file() + local f = io.open(wireless_filename, "r") + if f==nil then return {} end + local t = f:read("*all") + f:close() + if t=="" or t==nil then return {} end + return minetest.deserialize(t) +end + +local function write_file(tbl) + local f = io.open(wireless_filename, "w") + f:write(minetest.serialize(tbl)) + f:close() +end + +local function add_wireless_receiver(pos,channel) + local tbl=read_file() + for _,val in ipairs(tbl) do + if val.x==pos.x and val.y==pos.y and val.z==pos.z then + return + end + end + table.insert(tbl,{x=pos.x,y=pos.y,z=pos.z,channel=channel}) + write_file(tbl) +end + +local function remove_wireless_receiver(pos) + local tbl=read_file() + local newtbl={} + for _,val in ipairs(tbl) do + if val.x~=pos.x or val.y~=pos.y or val.z~=pos.z then + table.insert(newtbl,val) + end + end + write_file(newtbl) +end + +local function get_wireless_receivers(channel) + local tbl=read_file() + local newtbl={} + local changed=false + for _,val in ipairs(tbl) do + local node = minetest.env:get_node(val) + local meta = minetest.env:get_meta(val) + if node.name~="ignore" and val.channel~=meta:get_string("channel") then + val.channel=meta:get_string("channel") + changed=true + end + if val.channel==channel and node.name~="ignore" then + table.insert(newtbl,val) + end + end + if changed then write_file(tbl) end + return newtbl +end + +minetest.register_node("mesecons_wireless:emitter", { + description = "Wireless emitter", + paramtype = "light", + drawtype = "normal", + tiles = {"mesecons_wireless_emitter.png"}, + walkable = true, + on_construct = function(pos) + local meta = minetest.env:get_meta(pos) + meta:set_string("channel","") + meta:set_string("formspec","size[9,1;]field[0,0.5;9,1;channel;Channel:;${channel}]") + end, + on_receive_fields = function(pos,formname,fields,sender) + local meta = minetest.env:get_meta(pos) + meta:set_string("channel",fields.channel) + end, + groups = {dig_immediate=2}, + sounds = default.node_sound_stone_defaults(), + mesecons = + { + effector = + { + action_on = function(pos) + local meta = minetest.env:get_meta(pos) + local channel = meta:get_string("channel") + local w = get_wireless_receivers(channel) + for _,i in ipairs(w) do + mesecon:receptor_on(i) + mesecon:swap_node(i, "mesecons_wireless:receiver_on") + end + end, + action_off = function(pos) + local meta = minetest.env:get_meta(pos) + local channel = meta:get_string("channel") + local w = get_wireless_receivers(channel) + for _,i in ipairs(w) do + mesecon:receptor_off(i) + mesecon:swap_node(i, "mesecons_wireless:receiver") + end + end, + } + } +}) + +minetest.register_node("mesecons_wireless:receiver", { + description = "Wireless receiver", + paramtype = "light", + drawtype = "normal", + tiles = {"mesecons_wireless_receiver.png"}, + walkable = true, + on_construct = function(pos) + local meta = minetest.env:get_meta(pos) + meta:set_string("channel","") + meta:set_string("formspec","size[9,1;]field[0,0.5;9,1;channel;Channel:;${channel}]") + add_wireless_receiver(pos,"") + end, + on_receive_fields = function(pos,formname,fields,sender) + local meta = minetest.env:get_meta(pos) + meta:set_string("channel",fields.channel) + remove_wireless_receiver(pos) + add_wireless_receiver(pos,fields.channel) + end, + on_destruct = function(pos) + remove_wireless_receiver(pos) + end, + groups = {dig_immediate=2}, + sounds = default.node_sound_stone_defaults(), + mesecons = + { + receptor = + { + state = "off", + }, + } +}) + +minetest.register_node("mesecons_wireless:receiver_on", { + description = "Wireless receiver on (you hacker you)", + paramtype = "light", + drawtype = "normal", + tiles = {"mesecons_wireless_receiver_on.png"}, + walkable = true, + on_construct = function(pos) + local meta = minetest.env:get_meta(pos) + meta:set_string("channel","") + meta:set_string("formspec","size[9,1;]field[0,0.5;9,1;channel;Channel:;${channel}]") + add_wireless_receiver(pos,"") + end, + on_receive_fields = function(pos,formname,fields,sender) + local meta = minetest.env:get_meta(pos) + meta:set_string("channel",fields.channel) + remove_wireless_receiver(pos) + add_wireless_receiver(pos,fields.channel) + end, + on_destruct = function(pos) + remove_wireless_receiver(pos) + end, + groups = {dig_immediate=2, not_in_creative_inventory=1}, + drop = "mesecons_wireless:receiver", + sounds = default.node_sound_stone_defaults(), + mesecons = + { + receptor = + { + state = "on", + }, + } +}) + +minetest.register_craft({ + output = 'mesecons_wireless:emitter', + recipe = { + {'mesecons:torch'}, + {'default:mese'}, + } +}) + +minetest.register_craft({ + output = 'mesecons_wireless:receiver', + recipe = { + {'default:mese'}, + {'mesecons:torch'}, + } +}) diff --git a/mods/mesecons_wireless/textures/mesecons_wireless_emitter.png b/mods/mesecons_wireless/textures/mesecons_wireless_emitter.png new file mode 100644 index 0000000000000000000000000000000000000000..435ea2b76bf9c50bd43441fa7890be6ee1fe41f9 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#E}JmFnTAB}H6x&qWQl7;iF1B#Zfaf$gL6@8Vo7R>LV0FMhJw4NZ$Nk>pEyua zo~Mgrh{pNknjat3m^B+(8ygd!W|dml+la*4&(h(RTYBPAL9S0hV9I0z-A3u-EjdDA zwkK9eN=QgtwCPprJ$7_aqe4QGg5ZUC<|v26HfiBa8fh~W+D%&ywy3jgJjO3vcXdWp i#DzKC_8%t-7cwy2a;|nhc7+XSGlQqApUXO@geCyk!Agk$ literal 0 HcmV?d00001 diff --git a/mods/mesecons_wireless/textures/mesecons_wireless_receiver.png b/mods/mesecons_wireless/textures/mesecons_wireless_receiver.png new file mode 100644 index 0000000000000000000000000000000000000000..5222d6382b63fcf3505e587abbefc18fd7a24957 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#E}JmF8S|El`b9t?$r9Iy66gHf+|;}h2Ir#G#FEq$h4Rdj35w-Ho7oe-B7gEs;;zvHGucwLi2}C5t2aa;@p-s>}PX!WR=(_ zymAaad*Hxhs e8OJW#MKE4D?_6!cay{XE z)7O>#E}JmFnfN;H-~2!!$r9Iy66gHf+|;}h2Ir#G#FEq$h4Rdj35w-Ho7oeRnT4D7cU#b7;^ZsyZJ+>2uXkWyDsHIo8(M3KU{V3 zZ^KGz(-QVAoww0rrHh1sMlIT9%1)Pc}HrVti-DhZVzopr0I9Z1{r~^~ literal 0 HcmV?d00001