1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
minetest.register_node("celevator:digilines_io",{
description = "Elevator Digilines Input/Output",
tiles = {
"celevator_digilinesio_top.png",
"celevator_cabinet_sides.png",
},
groups = {
dig_immediate = 2,
},
paramtype = "light",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-0.5,-0.5,-0.5,0.5,-0.47,0.5},
{-0.438,-0.47,-0.438,0.438,-0.42,0.438},
},
},
digilines = {
receptor = {},
effector = {
action = function(pos,_,channel,msg)
if msg == "GET" then msg = {command = "GET"} end
if type(msg) ~= "table" or type(msg.command) ~= "string" then return end
local meta = minetest.get_meta(pos)
local setchannel = meta:get_string("channel")
if setchannel ~= channel then return end
local carid = meta:get_int("carid")
if carid == 0 then return end
local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
if not carinfo.controllerpos then return end
if not celevator.controller.iscontroller(carinfo.controllerpos) then return end
msg.command = string.lower(msg.command)
if msg.command == "get" then
local mem = minetest.deserialize(minetest.get_meta(carinfo.controllerpos):get_string("mem"))
if not mem then return end
local ret = {
carstate = mem.carstate,
doorstate = mem.doorstate,
carcalls = mem.carcalls,
upcalls = mem.upcalls,
swingupcalls = mem.swingupcalls,
groupupcalls = mem.groupupcalls,
downcalls = mem.dncalls,
swingdowncalls = mem.swingdncalls,
groupdowncalls = mem.groupdncalls,
fireserviceled = mem.fs1led,
switches = {
stop = mem.controllerstopsw,
machineroominspection = mem.controllerinspectsw,
cartopinspection = mem.cartopinspectsw,
capture = mem.capturesw,
test = mem.testsw,
fireservice1 = mem.fs1switch,
fireservice2 = mem.fs2sw,
indpedendent = mem.indsw,
light = mem.lightsw,
fan = mem.fansw,
},
parameters = mem.params,
drivestatus = mem.drive.status,
direction = mem.direction,
}
digilines.receptor_send(pos,digilines.rules.default,channel,ret)
elseif msg.command == "carcall" and type(msg.floor) == "number" then
celevator.controller.run(carinfo.controllerpos,{
type = "remotemsg",
channel = "carcall",
msg = msg.floor,
})
elseif msg.command == "upcall" and type(msg.floor) == "number" then
celevator.controller.run(carinfo.controllerpos,{
type = "remotemsg",
channel = "upcall",
msg = msg.floor,
})
elseif msg.command == "downcall" and type(msg.floor) == "number" then
celevator.controller.run(carinfo.controllerpos,{
type = "remotemsg",
channel = "dncall",
msg = msg.floor,
})
elseif msg.command == "swingupcall" and type(msg.floor) == "number" then
celevator.controller.run(carinfo.controllerpos,{
type = "remotemsg",
channel = "swingupcall",
msg = msg.floor,
})
elseif msg.command == "swingdowncall" and type(msg.floor) == "number" then
celevator.controller.run(carinfo.controllerpos,{
type = "remotemsg",
channel = "swingdncall",
msg = msg.floor,
})
end
end,
},
},
after_place_node = function(pos)
local meta = minetest.get_meta(pos)
local fs = "formspec_version[7]size[8,4.5]"
fs = fs.."field[0.5,0.5;3,1;channel;Channel;${channel}]"
fs = fs.."field[4.5,0.5;3,1;carid;Car ID;${carid}]"
fs = fs.."button_exit[2.5,2;3,1;save;Save]"
meta:set_string("formspec",fs)
end,
on_receive_fields = function(pos,_,fields,player)
local meta = minetest.get_meta(pos)
if not fields.save then return end
local name = player:get_player_name()
if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
if player:is_player() then
minetest.record_protection_violation(pos,name)
end
return
end
if not tonumber(fields.carid) then return end
meta:set_int("carid",fields.carid)
local carid = tonumber(fields.carid)
local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
if not carinfo.controllerpos then return end
if not celevator.controller.iscontroller(carinfo.controllerpos) then return end
if minetest.is_protected(carinfo.controllerpos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
if player:is_player() then
minetest.chat_send_player(name,"Can't connect to a controller you don't have access to.")
minetest.record_protection_violation(carinfo.controllerpos,name)
end
return
end
meta:set_string("channel",fields.channel)
local infotext = "Car: "..carid
meta:set_string("infotext",infotext)
end,
})
|