forked from Mirrorlandia_minetest/digistuff
104 lines
3.4 KiB
Lua
104 lines
3.4 KiB
Lua
local cardreader_rules = {
|
|
{x = 1, y = 0,z = 0,},
|
|
{x = 2, y = 0,z = 0,},
|
|
{x = -1, y = 0,z = 0,},
|
|
{x = -2, y = 0,z = 0,},
|
|
{x = 0, y = 1,z = 0,},
|
|
{x = 0, y = 2,z = 0,},
|
|
{x = 0, y = -1,z = 0,},
|
|
{x = 0, y = -2,z = 0,},
|
|
{x = 0, y = 0,z = 1,},
|
|
{x = 0, y = 0,z = 2,},
|
|
{x = 0, y = 0,z = -1,},
|
|
{x = 0, y = 0,z = -2,},
|
|
}
|
|
|
|
minetest.register_craftitem("digistuff:card",{
|
|
description = "Blank Magnetic Card",
|
|
image = "digistuff_magnetic_card.png",
|
|
stack_max = 1,
|
|
on_use = function(stack,_,pointed)
|
|
local pos = pointed.under
|
|
if not pos then return end
|
|
if minetest.get_node(pos).name ~= "digistuff:card_reader" then return end
|
|
local meta = minetest.get_meta(pos)
|
|
local channel = meta:get_string("channel")
|
|
local stackmeta = stack:get_meta()
|
|
if meta:get_int("writepending") > 0 then
|
|
local data = meta:get_string("writedata")
|
|
meta:set_int("writepending",0)
|
|
meta:set_string("infotext","Ready to Read")
|
|
digiline:receptor_send(pos,cardreader_rules,channel,{event = "write",})
|
|
stackmeta:set_string("data",data)
|
|
stackmeta:set_string("description",string.format("Magnetic Card (%s)",meta:get_string("writedescription")))
|
|
return stack
|
|
else
|
|
local channel = meta:get_string("channel")
|
|
local data = stackmeta:get_string("data")
|
|
digiline:receptor_send(pos,cardreader_rules,channel,{event = "read",data = data,})
|
|
end
|
|
end,
|
|
})
|
|
|
|
minetest.register_node("digistuff:card_reader",{
|
|
description = "Digilines Magnetic Card Reader/Writer",
|
|
groups = {cracky = 3,digiline_receiver = 1,},
|
|
on_construct = function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("formspec","field[channel;Channel;${channel}")
|
|
meta:set_int("writepending",0)
|
|
meta:set_string("infotext","Ready to Read")
|
|
end,
|
|
on_receive_fields = function(pos, formname, fields, sender)
|
|
local name = sender:get_player_name()
|
|
if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
|
|
minetest.record_protection_violation(pos,name)
|
|
return
|
|
end
|
|
local meta = minetest.get_meta(pos)
|
|
if fields.channel then meta:set_string("channel",fields.channel) end
|
|
end,
|
|
_digistuff_channelcopier_fieldname = "channel",
|
|
paramtype = "light",
|
|
paramtype2 = "facedir",
|
|
tiles = {
|
|
"digistuff_cardreader_sides.png",
|
|
"digistuff_cardreader_sides.png",
|
|
"digistuff_cardreader_sides.png",
|
|
"digistuff_cardreader_sides.png",
|
|
"digistuff_cardreader_sides.png",
|
|
"digistuff_cardreader_top.png",
|
|
},
|
|
drawtype = "nodebox",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.08,-0.12,0.4,0.08,0.12,0.5},
|
|
}
|
|
},
|
|
digiline = {
|
|
receptor = {},
|
|
wire = {
|
|
rules = cardreader_rules,
|
|
},
|
|
effector = {
|
|
action = function(pos,node,channel,msg)
|
|
local setchannel = minetest.get_meta(pos):get_string("channel")
|
|
if channel ~= setchannel or type(msg) ~= "table" then return end
|
|
if msg.command == "write" and (type(msg.data) == "string" or type(msg.data) == "number") then
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("infotext","Ready to Write")
|
|
meta:set_int("writepending",1)
|
|
if type(msg.data) ~= "string" then msg.data = tostring(msg.data) end
|
|
meta:set_string("writedata",string.sub(msg.data,1,256))
|
|
if type(msg.description) == "string" then
|
|
meta:set_string("writedescription",string.sub(msg.description,1,64))
|
|
else
|
|
meta:set_string("writedescription","no name")
|
|
end
|
|
end
|
|
end,
|
|
},
|
|
},
|
|
})
|