forked from Mirrorlandia_minetest/digistuff
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.
This commit is contained in:
parent
b16d25c828
commit
a38debb592
BIN
textures/digistuff_advts_front.png
Normal file
BIN
textures/digistuff_advts_front.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.7 KiB |
@ -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 = {
|
||||
|
Loading…
Reference in New Issue
Block a user