-- 5. FORMSPEC HANDLER minetest.register_on_player_receive_fields(function(player, formname, fields) local name = player:get_player_name() -- --- ADMIN PANEL --- if formname:sub(1, 18) == "smart_light:admin_" then local pos_str = formname:sub(19) local pos = minetest.string_to_pos(pos_str) local meta = minetest.get_meta(pos) local area = meta:get_string("area_id") if fields.chan_list then local evt = minetest.explode_textlist_event(fields.chan_list) if evt.type == "CHG" or evt.type == "DCL" then meta:set_int("selected_chan_idx", evt.index) end end if fields.save_admin and fields.new_area ~= "" then meta:set_string("area_id", fields.new_area) smart_light.registry.areas[fields.new_area] = smart_light.registry.areas[fields.new_area] or { channels = {} } smart_light.save() minetest.show_formspec(name, formname, smart_light.get_admin_fs(fields.new_area)) end if fields.del_chan then local idx = meta:get_int("selected_chan_idx") if idx > 0 then local channels = {} if smart_light.registry.areas[area] then for c_id, _ in pairs(smart_light.registry.areas[area].channels) do table.insert(channels, c_id) end table.sort(channels) end local target = channels[idx] if target then local c_data = smart_light.registry.areas[area].channels[target] -- Lampen Reset for p_str, _ in pairs(c_data.nodes or {}) do local l_pos = minetest.string_to_pos(p_str) local l_node = minetest.get_node(l_pos) local original = smart_light.shadow_to_original[l_node.name] or l_node.name minetest.swap_node(l_pos, {name = original, param2 = l_node.param2}) local l_meta = minetest.get_meta(l_pos) l_meta:set_string("sl_area", "") l_meta:set_string("sl_chan", "") end -- Schalter Reset for s_str, _ in pairs(c_data.switches or {}) do local s_pos = minetest.string_to_pos(s_str) minetest.swap_node(s_pos, {name = "smart_light:switch"}) local s_meta = minetest.get_meta(s_pos) s_meta:set_string("sl_area", "") s_meta:set_string("sl_chan", "") s_meta:set_string("infotext", "") end smart_light.registry.areas[area].channels[target] = nil smart_light.save() meta:set_int("selected_chan_idx", 0) minetest.show_formspec(name, formname, smart_light.get_admin_fs(area)) end end end end -- --- SCHALTER PROGRAMMIERER (REBOOTED) --- if formname:sub(1, 20) == "smart_light:prog_sw_" then local pos_str = formname:sub(21) local pos = minetest.string_to_pos(pos_str) if not pos then return end if fields.save_switch then local area, chan = fields.area_sel, fields.chan_sel if area == "-- Bitte wählen --" or chan == "-- Bitte wählen --" then minetest.chat_send_player(name, "FEHLER: Bitte Area UND Kanal auswählen!") return end local meta = minetest.get_meta(pos) meta:set_string("sl_area", area) meta:set_string("sl_chan", chan) meta:set_string("infotext", "Schalter: " .. area .. ":" .. chan) if smart_light.registry.areas[area] and smart_light.registry.areas[area].channels[chan] then smart_light.registry.areas[area].channels[chan].switches = smart_light.registry.areas[area].channels[chan].switches or {} smart_light.registry.areas[area].channels[chan].switches[pos_str] = true smart_light.save() local level = smart_light.registry.areas[area].channels[chan].last_level or "max" smart_light.update_switch_visuals(area, chan, level) minetest.chat_send_player(name, "Schalter gespeichert!") end return end if fields.area_sel and fields.area_sel ~= "-- Bitte wählen --" then minetest.get_meta(pos):set_string("sl_area", fields.area_sel) minetest.registered_tools["smart_light:programmer"].on_place(player:get_wielded_item(), player, {type="node", under=pos}) end end -- --- LICHT PROGRAMMIERER --- if formname:sub(1, 17) == "smart_light:prog_" and formname:sub(1, 20) ~= "smart_light:prog_sw_" then if fields.save then local pos_str = formname:sub(18) local pos = minetest.string_to_pos(pos_str) local area, chan = fields.area_sel, fields.chan_in if not area or area == "-- Bitte wählen --" or chan == "" then return end minetest.get_meta(pos):set_string("sl_area", area) minetest.get_meta(pos):set_string("sl_chan", chan) local item = player:get_wielded_item() local t_meta = item:get_meta() t_meta:set_string("last_area", area) t_meta:set_string("last_channel", chan) t_meta:set_string("description", "Programmer Area: " .. area .. "\nChannel: " .. chan) player:set_wielded_item(item) smart_light.registry.areas[area] = smart_light.registry.areas[area] or { channels = {} } smart_light.registry.areas[area].channels[chan] = smart_light.registry.areas[area].channels[chan] or { nodes = {}, last_level = "max", brightness = "max" } smart_light.registry.areas[area].channels[chan].nodes[pos_str] = true smart_light.save() minetest.chat_send_player(name, "Licht registriert!") end end -- --- HAUPTMENÜ (PANEL) --- if formname:sub(1, 17) == "smart_light:main_" then local pos_str = formname:sub(18) local pos = minetest.string_to_pos(pos_str) local area = minetest.get_meta(pos):get_string("area_id") if fields.all_off then for c,_ in pairs(smart_light.registry.areas[area].channels) do smart_light.switch_channel(area, c, "off") end minetest.registered_nodes["smart_light:controller"].on_rightclick(pos, nil, player) elseif fields.all_on then for c,_ in pairs(smart_light.registry.areas[area].channels) do smart_light.switch_channel(area, c, "on") end minetest.registered_nodes["smart_light:controller"].on_rightclick(pos, nil, player) else for k, _ in pairs(fields) do local cid = k:match("^chan_(.+)$") if cid then local count = smart_light.get_count(area, cid) local status = smart_light.get_status_text(area, cid) local last_lvl = smart_light.registry.areas[area].channels[cid].last_level or "max" local subfs = "size[4,5.5]label[0.5,0.2;Channel: " .. cid .. "]" .. "label[0.5,0.7;Anzahl Leuchten: " .. count .. "]" .. "label[0.5,1.2;Status: " .. status .. "]" .. "label[0.5,1.7;Dimmlevel: " .. last_lvl .. "]" .. "button[0.5,2.5;1.5,0.8;sub_"..cid.."_on;An]" .. "button[2.2,2.5;1.0,0.8;sub_"..cid.."_up;D+]" .. "button[0.5,3.5;1.5,0.8;sub_"..cid.."_off;Aus]" .. "button[2.2,3.5;1.0,0.8;sub_"..cid.."_down;D-]" .. "button[0.5,4.7;3,0.6;back;Zurück]" minetest.show_formspec(name, "smart_light:sub_" .. pos_str, subfs) return end end end end -- --- SUB-MENÜ --- if formname:sub(1, 16) == "smart_light:sub_" then local pos_str = formname:sub(17) local pos = minetest.string_to_pos(pos_str) local meta = minetest.get_meta(pos) local area = meta:get_string("area_id") if area == "" then area = meta:get_string("sl_area") end for k, _ in pairs(fields) do local cid, action = k:match("^sub_(.+)_([%a%d]+)$") if cid and action then smart_light.switch_channel(area, cid, action) local count = smart_light.get_count(area, cid) local status = smart_light.get_status_text(area, cid) local last_lvl = smart_light.registry.areas[area].channels[cid].last_level or "max" local subfs = "size[4,5.5]label[0.5,0.2;Channel: " .. cid .. "]" .. "label[0.5,0.7;Anzahl Leuchten: " .. count .. "]" .. "label[0.5,1.2;Status: " .. status .. "]" .. "label[0.5,1.7;Dimmlevel: " .. last_lvl .. "]" .. "button[0.5,2.5;1.5,0.8;sub_"..cid.."_on;An]" .. "button[2.2,2.5;1.0,0.8;sub_"..cid.."_up;D+]" .. "button[0.5,3.5;1.5,0.8;sub_"..cid.."_off;Aus]" .. "button[2.2,3.5;1.0,0.8;sub_"..cid.."_down;D-]" .. "button[0.5,4.7;3,0.6;back;Zurück]" minetest.show_formspec(name, formname, subfs) return end end if fields.back or fields.exit then if minetest.get_node(pos).name == "smart_light:controller" then minetest.registered_nodes["smart_light:controller"].on_rightclick(pos, nil, player) else minetest.close_formspec(name, formname) end end end -- --- PANEL SETUP --- if formname:sub(1, 18) == "smart_light:setup_" then if fields.set_area and fields.area_id ~= "" then local pos = minetest.string_to_pos(formname:sub(19)) minetest.get_meta(pos):set_string("area_id", fields.area_id) smart_light.registry.areas[fields.area_id] = smart_light.registry.areas[fields.area_id] or { channels = {} } smart_light.save() end end end)