summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcheapie <no-email-for-you@example.com>2021-02-21 18:46:55 -0600
committercheapie <no-email-for-you@example.com>2021-02-21 18:46:55 -0600
commita38debb5924a7febcbe33617afbfda4722c0611e (patch)
tree660e318b8c529102fee0ea9a17f88283c691053f
parentb16d25c8280c4316b95c6b2bbb73bdd49a65b7c3 (diff)
downloaddigistuff-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.pngbin0 -> 9900 bytes
-rw-r--r--touchscreen.lua62
2 files changed, 53 insertions, 9 deletions
diff --git a/textures/digistuff_advts_front.png b/textures/digistuff_advts_front.png
new file mode 100644
index 0000000..89dc343
--- /dev/null
+++ b/textures/digistuff_advts_front.png
Binary files differ
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 = {