diff options
author | cheapie <no-email-for-you@example.com> | 2021-02-21 18:46:55 -0600 |
---|---|---|
committer | cheapie <no-email-for-you@example.com> | 2021-02-21 18:46:55 -0600 |
commit | a38debb5924a7febcbe33617afbfda4722c0611e (patch) | |
tree | 660e318b8c529102fee0ea9a17f88283c691053f | |
parent | b16d25c8280c4316b95c6b2bbb73bdd49a65b7c3 (diff) | |
download | digistuff-a38debb5924a7febcbe33617afbfda4722c0611e.tar digistuff-a38debb5924a7febcbe33617afbfda4722c0611e.tar.gz digistuff-a38debb5924a7febcbe33617afbfda4722c0611e.tar.bz2 digistuff-a38debb5924a7febcbe33617afbfda4722c0611e.tar.xz digistuff-a38debb5924a7febcbe33617afbfda4722c0611e.zip |
Add advanced touchscreen
Basically just lets you provide any formspec you want, which should resolve all of the "but the touchscreen can't do XYZ" issues :)
I don't believe this to be a security problem as arbitrary formspecs should do nothing unless you actually right-click the node (and you can always just... not), and if the client does crash in response to a bad formspec then this is probably a client bug anyway.
-rw-r--r-- | textures/digistuff_advts_front.png | bin | 0 -> 9900 bytes | |||
-rw-r--r-- | touchscreen.lua | 62 |
2 files changed, 53 insertions, 9 deletions
diff --git a/textures/digistuff_advts_front.png b/textures/digistuff_advts_front.png Binary files differnew file mode 100644 index 0000000..89dc343 --- /dev/null +++ b/textures/digistuff_advts_front.png diff --git a/touchscreen.lua b/touchscreen.lua index e3255f2..d288996 100644 --- a/touchscreen.lua +++ b/touchscreen.lua @@ -8,6 +8,8 @@ digistuff.update_ts_formspec = function (pos) if meta:get_int("init") == 0 then fs = fs.."field[3.75,3;3,1;channel;Channel;]".. "button_exit[4,3.75;2,1;save;Save]" + elseif minetest.get_node(pos).name == "digistuff:advtouchscreen" then + fs = fs.."label[0,0;No data received yet]" else local data = minetest.deserialize(meta:get_string("data")) or {} for _,field in pairs(data) do @@ -252,19 +254,23 @@ digistuff.ts_on_digiline_receive = function (pos, node, channel, msg) local meta = minetest.get_meta(pos) local setchan = meta:get_string("channel") if channel ~= setchan then return end - if type(msg) ~= "table" then return end - local data = minetest.deserialize(meta:get_string("data")) or {} - if msg.command then - data = digistuff.process_command(meta,data,msg) + if node.name == "digistuff:advtouchscreen" then + if type(msg) == "string" then meta:set_string("formspec",msg) end else - for _,i in ipairs(msg) do - if type(i) == "table" and i.command then - data = digistuff.process_command(meta,data,i) or data + if type(msg) ~= "table" then return end + local data = minetest.deserialize(meta:get_string("data")) or {} + if msg.command then + data = digistuff.process_command(meta,data,msg) + else + for _,i in ipairs(msg) do + if type(i) == "table" and i.command then + data = digistuff.process_command(meta,data,i) or data + end end end + meta:set_string("data",minetest.serialize(data)) + digistuff.update_ts_formspec(pos) end - meta:set_string("data",minetest.serialize(data)) - digistuff.update_ts_formspec(pos) end minetest.register_node("digistuff:touchscreen", { @@ -305,6 +311,44 @@ minetest.register_node("digistuff:touchscreen", { }, }) +minetest.register_node("digistuff:advtouchscreen", { + description = "Advanced Digilines Touchscreen", + groups = {cracky=3}, + on_construct = function(pos) + digistuff.update_ts_formspec(pos,true) + end, + drawtype = "nodebox", + tiles = { + "digistuff_panel_back.png", + "digistuff_panel_back.png", + "digistuff_panel_back.png", + "digistuff_panel_back.png", + "digistuff_panel_back.png", + "digistuff_advts_front.png" + }, + paramtype = "light", + paramtype2 = "facedir", + node_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, 0.4, 0.5, 0.5, 0.5 } + } + }, + _digistuff_channelcopier_fieldname = "channel", + _digistuff_channelcopier_onset = function(pos) + minetest.get_meta(pos):set_int("init",1) + digistuff.update_ts_formspec(pos) + end, + on_receive_fields = digistuff.ts_on_receive_fields, + digiline = + { + receptor = {}, + effector = { + action = digistuff.ts_on_digiline_receive + }, + }, +}) + minetest.register_craft({ output = "digistuff:touchscreen", recipe = { |