···9494 },
9595 "handlers": [
9696 {
9797- "code": "--[[\n\treceivers channels for each type of machine\n]]\n\nchannel_for_refiner = \"receiver_refiner\" --export: receiver channel for updating refiners\nchannel_for_assembly = \"receiver_assembly\" --export: receiver channel for updating assembly lines\nchannel_for_smelter = \"receiver_smelters\" --export: receiver channel for updating smelters\nchannel_for_chemical = \"receiver_chemical\" --export: receiver channel for updating chemical indutries\nchannel_for_electronics = \"receiver_electronics\" --export: receiver channel for updating electronic industries\nchannel_for_glass = \"receiver_glass\" --export: receiver channel for updating glass furnace\nchannel_for_honeycomb = \"receiver_honeycomb_recycler\" --export: receiver channel for updating honeycomb refiniries\nchannel_for_recycler = \"receiver_honeycomb_recycler\" --export: receiver channel for updating recylers\nchannel_for_metalwork = \"receiver_metalworks\" --export: receiver channel for updating metalworks\nchannel_for_3d_printer = \"receiver_3dprinters\" --export: receiver channel for updating 3d printers\nchannel_for_transfer = \"receiver_transfert\" --export: receiver channel for updating tranfer units\ncontainer_proficiency_lvl = 0 --export: Talent level for Container Proficiency\ncontainer_fill_red_level = 10 --export: The percent fill below gauge will be red\ncontainer_fill_yellow_level = 50 --export: The percent fill below gauge will be yellow\nenableRefinerMonitoring = true --export: enable or disable the Refiners monitoring\nenableAssemblyMonitoring = true --export: enable or disable the Assembly lines monitoring\nenableSmelterMonitoring = true --export: enable or disable the Smelters monitoring\nenableChemicalMonitoring = true --export: enable or disable the Chemical industries monitoring\nenableElectronicsMonitoring = true --export: enable or disable the Electronics Industries monitoring\nenableGlassMonitoring = true --export: enable or disable the Glass Furnace monitoring\nenableHoneycombMonitoring = true --export: enable or disable the Honeycomb Refineries monitoring\nenableRecyclerMonitoring = true --export: enable or disable the Recyclers monitoring\nenableMetalworkMonitoring = true --export: enable or disable the Metalworks monitoring\nenable3DPrinterMonitoring = true --export: enable or disable the 3D Printers monitoring\nenableTransferMonitoring = true --export: enable or disable the transfer units monitoring\nenableContainerMonitoring = true --export: enable or disable the containers and hubs monitoring\nrefreshSpeed = 1 --export: the refresh speed of data in seconds\nelementsByPage = 20 --export: maximum amount of elements displayed on a single page\ndateFormat = \"en\" --export: the country code to format the date\n\n--[[\n\tDO NOT CHANGE THE FOLLOWING\n]]\n\nchannels = {}\nchannels['refiner'] = channel_for_refiner\nchannels['assembly line'] = channel_for_assembly\nchannels['smelter'] = channel_for_smelter\nchannels['chemical industry'] = channel_for_chemical\nchannels['electronics industry'] = channel_for_electronics\nchannels['glass furnace'] = channel_for_glass\nchannels['honeycomb refinery'] = channel_for_honeycomb\nchannels['recycler'] = channel_for_recycler\nchannels['metalwork industry'] = channel_for_metalwork\nchannels['3d printer'] = channel_for_3d_printer\nchannels['transfer unit'] = channel_for_transfer\n\ndatabanks = {}\ncore = nil\nemitter = nil\nfor slot_name, slot in pairs(unit) do\n if\n type(slot) == \"table\"\n and type(slot.export) == \"table\"\n and slot.getElementClass\n then\n if slot.getElementClass():lower() == 'databankunit' then\n table.insert(databanks, slot)\n end\n if slot.getElementClass():lower():find(\"coreunit\") then\n core = slot\n end\n if slot.getElementClass():lower() == 'emitterunit' then\n emitter = slot\n end\n end\nend\nStorage = bankhub:new(databanks)\n\nelementsId = {}\nelements = {}\nelementsTypes = {}\nmachines_count = {}\nmachines_count.total = 0\ncoreOffset = 16\ninitIndex = 1\nif core ~= nil and Storage then\n\telementsIdList = core.getElementIdList()\n --system.print(#elementsIdList)\n unit.setTimer(\"init\",1)\nend\n\nelementsTypes = removeDuplicatesInTable(elementsTypes)\n\nsystem.showScreen(1)\nunit.setTimer(\"refreshData\", refreshSpeed)\nchannel_index = 1\nselected_index = 1\nselected_machine_index = 1\nhud_displayed = true\npage = 1\nmaxPage = 1\nselectedElementsId = {}\nCtrl_pressed = false\nAlt_pressed = false\ncraft_quantity = \"\"\ncraft_quantity_digits = {\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"}\nrefresh_id_list = {}\ncraft_selected_digit = 1\ncommand_1 = \"\"\ncommand_2 = \"\"\ncommand_3 = \"\"\nmarkers = {}\nrefreshActivated = true",
9797+ "code": "--[[\n\treceivers channels for each type of machine\n]]\n\nchannel_for_refiner = \"receiver_refiner\" --export: receiver channel for updating refiners\nchannel_for_assembly = \"receiver_assembly\" --export: receiver channel for updating assembly lines\nchannel_for_smelter = \"receiver_smelters\" --export: receiver channel for updating smelters\nchannel_for_chemical = \"receiver_chemical\" --export: receiver channel for updating chemical indutries\nchannel_for_electronics = \"receiver_electronics\" --export: receiver channel for updating electronic industries\nchannel_for_glass = \"receiver_glass\" --export: receiver channel for updating glass furnace\nchannel_for_honeycomb = \"receiver_honeycomb_recycler\" --export: receiver channel for updating honeycomb refiniries\nchannel_for_recycler = \"receiver_honeycomb_recycler\" --export: receiver channel for updating recylers\nchannel_for_metalwork = \"receiver_metalworks\" --export: receiver channel for updating metalworks\nchannel_for_3d_printer = \"receiver_3dprinters\" --export: receiver channel for updating 3d printers\nchannel_for_transfer = \"receiver_transfert\" --export: receiver channel for updating tranfer units\ncontainer_proficiency_lvl = 0 --export: Talent level for Container Proficiency\ncontainer_fill_red_level = 10 --export: The percent fill below gauge will be red\ncontainer_fill_yellow_level = 50 --export: The percent fill below gauge will be yellow\nenableRefinerMonitoring = true --export: enable or disable the Refiners monitoring\nenableAssemblyMonitoring = true --export: enable or disable the Assembly lines monitoring\nenableSmelterMonitoring = true --export: enable or disable the Smelters monitoring\nenableChemicalMonitoring = true --export: enable or disable the Chemical industries monitoring\nenableElectronicsMonitoring = true --export: enable or disable the Electronics Industries monitoring\nenableGlassMonitoring = true --export: enable or disable the Glass Furnace monitoring\nenableHoneycombMonitoring = true --export: enable or disable the Honeycomb Refineries monitoring\nenableRecyclerMonitoring = true --export: enable or disable the Recyclers monitoring\nenableMetalworkMonitoring = true --export: enable or disable the Metalworks monitoring\nenable3DPrinterMonitoring = true --export: enable or disable the 3D Printers monitoring\nenableTransferMonitoring = true --export: enable or disable the transfer units monitoring\nenableContainerMonitoring = true --export: enable or disable the containers and hubs monitoring\ncontainerMonitoringPrefix = \"MONIT_\" --export: the prefix used to enable container monitoring\nrefreshSpeed = 1 --export: the refresh speed of data in seconds\nelementsByPage = 20 --export: maximum amount of elements displayed on a single page\ndateFormat = \"en\" --export: the country code to format the date\n\n--[[\n\tDO NOT CHANGE THE FOLLOWING\n]]\n\nchannels = {}\nchannels['refiner'] = channel_for_refiner\nchannels['assembly line'] = channel_for_assembly\nchannels['smelter'] = channel_for_smelter\nchannels['chemical industry'] = channel_for_chemical\nchannels['electronics industry'] = channel_for_electronics\nchannels['glass furnace'] = channel_for_glass\nchannels['honeycomb refinery'] = channel_for_honeycomb\nchannels['recycler'] = channel_for_recycler\nchannels['metalwork industry'] = channel_for_metalwork\nchannels['3d printer'] = channel_for_3d_printer\nchannels['transfer unit'] = channel_for_transfer\n\ndatabanks = {}\ncore = nil\nemitter = nil\nfor slot_name, slot in pairs(unit) do\n if\n type(slot) == \"table\"\n and type(slot.export) == \"table\"\n and slot.getElementClass\n then\n if slot.getElementClass():lower() == 'databankunit' then\n table.insert(databanks, slot)\n end\n if slot.getElementClass():lower():find(\"coreunit\") then\n core = slot\n end\n if slot.getElementClass():lower() == 'emitterunit' then\n emitter = slot\n end\n end\nend\nStorage = bankhub:new(databanks)\n\nelementsId = {}\nelements = {}\nelementsTypes = {}\nmachines_count = {}\nmachines_count.total = 0\ncoreOffset = 16\ninitIndex = 1\nif core ~= nil and Storage then\n\telementsIdList = core.getElementIdList()\n --system.print(#elementsIdList)\n unit.setTimer(\"init\",1)\nend\n\nelementsTypes = removeDuplicatesInTable(elementsTypes)\n\nsystem.showScreen(1)\nunit.setTimer(\"refreshData\", refreshSpeed)\nchannel_index = 1\nselected_index = 1\nselected_machine_index = 1\nhud_displayed = true\npage = 1\nmaxPage = 1\nselectedElementsId = {}\nCtrl_pressed = false\nAlt_pressed = false\ncraft_quantity = \"\"\ncraft_quantity_digits = {\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"}\nrefresh_id_list = {}\ncraft_selected_digit = 1\ncommand_1 = \"\"\ncommand_2 = \"\"\ncommand_3 = \"\"\nmarkers = {}\nrefreshActivated = true",
9898 "filter": {
9999 "args": [],
100100 "signature": "start()",
···138138 "key": "3"
139139 },
140140 {
141141- "code": "local year, month, day, hour, minute, second = epochTime()\nlocal dateStr = year .. \"/\" .. month .. \"/\" .. day .. \" \" .. hour .. \":\" .. minute .. \":\" .. second\nif dateFormat:lower() == \"fr\" then\n dateStr = day .. \"/\" .. month .. \"/\" .. year .. \" \" .. hour .. \":\" .. minute .. \":\" .. second\nend\n\nhud_main_css = [[\n <style>\n .hud_container {\n border: 2px solid orange;\n border-radius:10px;\n background-color: rgba(0,0,0,.75);\n padding:10px;\n }\n .hud_help_commands {\n position: absolute;\n top: ]] .. tostring((10/1080)*100) .. [[vh;\n left: ]] .. tostring((50/1920)*100) .. [[vw;\n text-transform: uppercase;\n font-weight: bold;\n }\n .hud_list_container {\n position: absolute;\n top: ]] .. tostring((125/1080)*100) .. [[vh;\n left: ]] .. tostring((50/1920)*100) .. [[vw;\n text-transform: uppercase;\n font-weight: bold;\n }\n .hud_machine_detail {\n position: absolute;\n top: ]] .. tostring((125/1080)*100) .. [[vh;\n right: ]] .. tostring((450/1920)*100) .. [[vw;\n text-transform: uppercase;\n font-weight: bold;\n }\n .hud_machines_container {\n position: absolute;\n top: ]] .. tostring((125/1080)*100) .. [[vh;\n left: ]] .. tostring((300/1920)*100) .. [[vw;\n }\n .elementType {\n margin-top:10px;\n border-radius:5px;\n }\n .elementType.selected {\n border: 2px solid green;\n background-color: rgba(0,200,0,.45);\n }\n tr.selected td, tr.selected th{\n border: 2px solid green;\n background-color: rgba(0,200,0,.1);\n }\n td, th {\n border-bottom:1px solid white;\n padding:5px;\n text-align: center;\n }\n th {\n font-weight: bold;\n }\n .text-success{color: #28a745;}\n .text-danger{color:#dc3545;}\n .text-warning{color:#ffc107;}\n .text-info{color:#17a2b8;}\n .text-primary{color:#007bff;}\n .text-orangered{color:orangered;}\n .bg-success{background-color: #28a745;}\n .bg-danger{background-color:#dc3545;}\n .bg-warning{background-color:#ffc107;}\n .bg-info{background-color:#17a2b8;}\n .bg-primary{background-color:#007bff;}\n </style>\n]]\n\nlocal refreshStatusText = [[<span class=\"text-success\">Disable Data Collection</span>]]\nif refreshActivated == false then\n refreshStatusText = [[<span class=\"text-danger\">Enable Data Collection</span>]]\nend\n\nhud_help_command = [[<div class=\"hud_help_commands hud_container\">\n <table>\n <tr>\n <th colspan=\"2\">\n ]] .. dateStr .. [[\n </th>\n </tr>\n <tr>\n <td>Show/Hide HUD</td>\n <th style=\"text-align:right;\">Alt+7</th>\n </tr>\n <tr>\n \t<td>]] .. refreshStatusText .. [[</td>\n \t<th style=\"text-align:right;\">Alt+8</th>\n </tr>\n </table>\n</div>]]\nif initIndex >= #elementsIdList then\n unit.stopTimer(\"init\")\n hud_elements_type_list = \"\"\n hud_machines = \"\"\n hud_machine_detail = \"\"\n\n if hud_displayed == true then\n selected_type = elementsTypes[selected_index]\n elementsTypes = {}\n elements = {}\n refresh_id_list = {}\n selectedElementsId = {}\n for _,id in pairs(elementsId) do\n elementType = core.getElementTypeById(id)\n local elementName = core.getElementNameById(id):lower()\n if\n (elementType:lower():find(\"container\") and elementName:find(\"monit_\"))\n or (not elementType:lower():find(\"container\"))\n then\n table.insert(elementsTypes, elementType)\n end\n if selected_type == elementType then\n if\n (elementType:lower():find(\"container\") and elementName:find(\"monit_\"))\n or (not elementType:lower():find(\"container\"))\n then\n table.insert(selectedElementsId, id)\n end\n end\n end\n elementsTypes = removeDuplicatesInTable(elementsTypes)\n table.sort(elementsTypes, function(a,b) return a:lower() < b:lower() end)\n maxPage = math.ceil(#selectedElementsId / elementsByPage)\n\n local minOnPage = ((page - 1) * elementsByPage) + 1\n local maxOnPage = page * elementsByPage\n local temp_elements_for_sorting = {}\n for i,id in pairs(selectedElementsId) do\n elementData = {}\n elementData.id = id\n elementData.name = core.getElementNameById(id)\n table.insert(temp_elements_for_sorting, elementData)\n end\n table.sort(temp_elements_for_sorting, function(a,b) return a.name:lower() < b.name:lower() end)\n for i,elementData in pairs(temp_elements_for_sorting) do\n if i >= minOnPage and i <= maxOnPage then\n elementType = core.getElementTypeById(elementData.id)\n if Storage.hasKey(elementData.id) == 1 then\n elementData = MyJson.parse(Storage.getStringValue(elementData.id))\n end\n elementData.type = elementType\n elementData.name = core.getElementNameById(elementData.id)\n elementData.position = core.getElementPositionById(elementData.id)\n table.insert(refresh_id_list, elementData.id)\n table.insert(elements, elementData)\n end\n end\n hud_elements_type_list = [[<div class=\"hud_list_container hud_container\">\n <div style=\"text-align:center;font-weight:bold;border-bottom:1px solid white;\">↑ Ctrl+Arrow Up</div>\n ]]\n for i, elementType in pairs(elementsTypes) do\n hud_elements_type_list = hud_elements_type_list .. [[<div class=\"elementType]]\n if i == selected_index then\n hud_elements_type_list = hud_elements_type_list .. \" selected\"\n end\n local count = 0\n if machines_count[elementType:lower()] ~= nil then count = machines_count[elementType:lower()] end\n hud_elements_type_list = hud_elements_type_list .. [[\">\n <table style=\"width:100%;\">\n <tr>\n <th style=\"text-align:left;border-bottom:none;\">]].. elementType .. [[</th>\n <td style=\"text-align:right;border-bottom:none;\">]] .. count .. [[</td>\n </tr>\n </table>\n </div>\n ]]\n end\n hud_elements_type_list = hud_elements_type_list .. [[<div style=\"margin-top:10px;text-align:center;font-weight:bold;border-top:1px solid white;\">↓ Ctrl+Arrow Down</div></div>]]\n local minOnPage = ((page - 1) * elementsByPage) + 1\n if maxOnPage > #selectedElementsId then maxOnPage = #selectedElementsId end\n hud_machines = [[<div class=\"hud_machines_container hud_container\">\n <div style=\"text-align:center;font-weight:bold;border-bottom:1px solid white;\">↑ Arrow Up</div>\n <table class=\"elements_table\" style=\"width:100%\">\n <tr>\n <th>← Arrow Left</th>\n <th> Page ]] .. page .. [[/]] .. maxPage .. [[ (from ]] .. minOnPage .. [[ to ]] .. maxOnPage .. [[)</th>\n <th>Arrow Right →</th>\n </tr>\n </table>\n <table class=\"elements_table\" style=\"width:100%;\">]]\n if elementsTypes[selected_index]:lower():find(\"container\") then\n hud_machines = hud_machines .. [[\n <tr>\n <th>id</th>\n <th>Item Name</th>\n <th>Container Size</th>\n <th>Item Type</th>\n <th>Unit Mass</th>\n <th>Total Mass</th>\n <th>Amount of Items</th>\n ]]\n if not elementsTypes[selected_index]:lower():find(\"hub\") then\n hud_machines = hud_machines .. [[\n <th>Container Fill</th>\n ]]\n end\n hud_machines = hud_machines .. [[</tr>\n ]]\n for i, element in pairs(elements) do\n local splittedName = strSplit(element.name, \"_\")\n local itemName = splittedName[2]\n local machine_id = \"-\"\n if element.id then machine_id = element.id end\n local container_size = \"hub\"\n local container_empty_mass = getIngredient(\"Container Hub\").mass\n local container_volume = 0\n local contentQuantity = 0\n local ingredient = getIngredient(cleanName(itemName))\n if not element.type:lower():find(\"hub\") then\n local containerMaxHP = core.getElementMaxHitPointsById(element.id)\n if containerMaxHP > 17000 then\n container_size = \"L\"\n container_empty_mass = getIngredient(\"Container L\").mass\n container_volume = 128000 * (container_proficiency_lvl * 0.1) + 128000\n elseif containerMaxHP > 7900 then\n container_size = \"M\"\n container_empty_mass = getIngredient(\"Container M\").mass\n container_volume = 64000 * (container_proficiency_lvl * 0.1) + 64000\n elseif containerMaxHP > 900 then\n container_size = \"S\"\n container_empty_mass = getIngredient(\"Container S\").mass\n container_volume = 8000 * (container_proficiency_lvl * 0.1) + 8000\n else\n container_size = \"XS\"\n container_empty_mass = getIngredient(\"Container XS\").mass\n container_volume = 1000 * (container_proficiency_lvl * 0.1) + 1000\n end\n end\n local totalMass = core.getElementMassById(element.id)\n local contentMassKg = totalMass - container_empty_mass\n local contentMass = contentMassKg\n local contentMassUnit = \"Kg\"\n if contentMass > 1000 then\n contentMass = contentMass/1000\n contentMassUnit = \"T\"\n end\n contentMass = utils.round(contentMass*100)/100\n contentQuantity = contentMassKg / ingredient.mass\n local contentPercent = 0\n if (not element.type:lower():find(\"hub\")) --not a hub\n and (not ingredient.type:lower():find(\"error\")) --not item not found\n then\n contentPercent = math.floor((ingredient.volume * contentQuantity)*100/container_volume)\n end\n hud_machines = hud_machines .. [[<tr]]\n if selected_machine_index == i then\n hud_machines = hud_machines .. [[ class=\"selected\"]]\n end\n hud_machines = hud_machines .. [[>\n <th>]] .. machine_id .. [[</th>\n <th>]] .. itemName .. [[</th>\n <td>]] .. container_size .. [[</td>\n <td>]] .. ingredient.type .. [[</td>\n <td>]] .. ingredient.mass .. [[</td>\n <td>]] .. contentMass .. \" \" .. contentMassUnit .. [[</td>\n <td>]] .. utils.round(contentQuantity*100)/100 .. [[</td>\n ]]\n if not element.type:lower():find(\"hub\") then\n local gauge_color_class = \"bg-success\"\n local text_color_class = \"\"\n if contentPercent < container_fill_red_level then\n gauge_color_class = \"bg-danger\"\n elseif contentPercent < container_fill_yellow_level then\n gauge_color_class = \"bg-warning\"\n text_color_class = \"text-orangered\"\n end\n if ingredient.type:lower():find(\"error\") then\n hud_machines = hud_machines .. [[\n <th style=\"position:relative;width: ]] .. tostring((150/1920)*100) .. [[vw;\">\n -\n </th>\n </tr>\n ]]\n else\n hud_machines = hud_machines .. [[\n <th style=\"position:relative;width: ]] .. tostring((150/1920)*100) .. [[vw;\">\n <div class=\"]] .. gauge_color_class .. [[\" style=\"width:]] .. contentPercent .. [[%;\"> </div>\n <div class=\"]] .. text_color_class .. [[\" style=\"position:absolute;width:100%;top:0;padding-top:5px;font-weight:bold;\">\n ]] .. contentPercent .. [[%\n </div>\n </th>\n </tr>\n ]]\n end\n end\n end\n else\n hud_machines = hud_machines .. [[\n <tr>\n <th>id</th>\n <th>Machine Name</th>\n <th>Cycles From Start</th>\n <th>Efficiency</th>\n <th>Status</th>\n <th>Uptime</th>\n </tr>\n ]]\n for i, element in pairs(elements) do\n local status = \"-\"\n if element.status then status = element.status end\n local status_class = \"\"\n if status:lower():find(\"running\") then status_class = \"text-success\" end\n if status:lower():find(\"stopped\") then status_class = \"text-info\" end\n if status:lower():find(\"jammed\") then status_class = \"text-danger\" end\n if status:lower():find(\"pending\") then status_class = \"text-primary\" end\n status = status:gsub(\"JAMMED_\", \"\"):gsub(\"_\", \" \")\n local cyclesFromStart = \"-\"\n if element.cyclesFromStart then cyclesFromStart = element.cyclesFromStart end\n local efficiency = \"-\"\n if element.efficiency then efficiency = math.floor(element.efficiency*100) end\n local uptime = 0\n if element.uptime then uptime = math.floor(element.uptime) end\n hud_machines = hud_machines .. [[<tr]]\n if selected_machine_index == i then\n hud_machines = hud_machines .. [[ class=\"selected\"]]\n end\n local machine_id = \"-\"\n if element.id then machine_id = element.id end\n hud_machines = hud_machines .. [[>\n <th>]] .. machine_id .. [[</th>\n <th class=\"]] .. status_class .. [[\">]] .. element.name .. [[</th>\n <td>]] .. cyclesFromStart .. [[</td>\n <td>]] .. efficiency .. [[%</td>\n <th class=\"]] .. status_class .. [[\">]] .. status .. [[</th>\n <td class=\"]] .. status_class .. [[\">]] .. SecondsToClockString(uptime) .. [[</td>\n </tr>\n ]]\n end\n end\n hud_machines = hud_machines .. [[</table>\n <table class=\"elements_table\" style=\"width:100%\">\n <tr>\n <th>← Arrow Left</th>\n <th> Page ]] .. page .. [[/]] .. maxPage .. [[ (from ]] .. minOnPage .. [[ to ]] .. maxOnPage .. [[)</th>\n <th>Arrow Right →</th>\n </tr>\n </table>\n <div style=\"text-align:center;font-weight:bold;border-top:1px solid white;\">↓ Arrow Down</div>\n </div>]]\n if #elements > 0 then\n local selected_machine = elements[selected_machine_index]\n --Special Thx to Rutik for his help on how to get the exact the position of the element\n local position = vec3(selected_machine.position)\n local x = position.x - coreOffset\n local y = position.y - coreOffset\n local z = position.z - coreOffset\n local offset1 = 1\n local offset15 = 1.5\n local offset2 = 2\n local offset25 = 2.5\n local offsetFromCenter = 0\n if selected_machine.type:lower():find(\"container\") then\n offset1 = 0\n offset15 = 0\n offset2 = 0\n offset25 = 0\n end\n if selected_machine.type:lower() == \"container\" then\n local containerMaxHP = core.getElementMaxHitPointsById(selected_machine.id)\n if containerMaxHP > 17000 then\n offsetFromCenter = 4\n elseif containerMaxHP > 7900 then\n offsetFromCenter = 2\n elseif containerMaxHP > 900 then\n offsetFromCenter = 1\n else\n offsetFromCenter = 0.5\n end\n end\n if #markers == 0 then\n table.insert(markers, core.spawnArrowSticker(x, y, z, \"down\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z, \"down\"))\n core.rotateSticker(markers[2],0,0,90)\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"north\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"north\"))\n core.rotateSticker(markers[4],90,90,0)\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"south\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"south\"))\n core.rotateSticker(markers[6],90,-90,0)\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"east\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"east\"))\n core.rotateSticker(markers[8],90,0,90)\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"west\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"west\"))\n core.rotateSticker(markers[10],-90,0,90)\n else\n core.moveSticker(markers[1], x, y, z + offset25 + offsetFromCenter)\n core.moveSticker(markers[2], x, y, z + offset25 + offsetFromCenter)\n core.moveSticker(markers[3], x + offset1 + offsetFromCenter, y, z + offset15)\n core.moveSticker(markers[4], x + offset1 + offsetFromCenter, y, z + offset15)\n core.moveSticker(markers[5], x - offset1 - offsetFromCenter, y, z + offset15)\n core.moveSticker(markers[6], x - offset1 - offsetFromCenter, y, z + offset15)\n core.moveSticker(markers[7], x, y - offset2 - offsetFromCenter, z + offset15)\n core.moveSticker(markers[8], x, y - offset2 - offsetFromCenter, z + offset15)\n core.moveSticker(markers[9], x, y + offset2 + offsetFromCenter, z + offset15)\n core.moveSticker(markers[10], x, y + offset2 + offsetFromCenter, z + offset15)\n end\n if not selected_machine.type:lower():find(\"container\") then\n local status = \"-\"\n if selected_machine.status then status = selected_machine.status end\n local status_class = \"\"\n local machines_actions = {}\n if status:lower():find(\"running\") then status_class = \"text-success\" end\n if status:lower():find(\"stopped\") then status_class = \"text-info\" end\n if status:lower():find(\"jammed\") then status_class = \"text-danger\" end\n if status:lower():find(\"pending\") then status_class = \"text-primary\" end\n status = status:gsub(\"JAMMED_\", \"\"):gsub(\"_\", \" \")\n hud_machine_detail = [[<div class=\"hud_machine_detail hud_container\">\n <table>\n <tr>\n <th colspan=\"3\">]] .. selected_machine.name .. [[</th>\n </tr>\n <tr>\n <th class=\"]] .. status_class .. [[\" colspan=\"3\">]] .. status .. [[</th>\n </tr>\n ]]\n if status == \"-\" then\n command_1 = \"\"\n command_2 = \"\"\n command_3 = \"\"\n hud_machine_detail = hud_machine_detail .. [[\n <tr>\n <td>Machine Not Connected</td>\n </tr>\n ]]\n elseif status:lower():find(\"stopped\") then\n command_1 = \"START\"\n command_2 = \"BATCH\"\n command_3 = \"MAINTAIN\"\n hud_machine_detail = hud_machine_detail .. [[\n <tr>\n <th>START</th>\n <th></th>\n <th>ALT+1</th>\n </tr>\n <tr>\n <th style=\"height:65px;\">BATCH</th>\n <th rowspan=\"2\">\n <table>\n <tr>\n <th colspan=\"3\">↑ Alt+Arrow Up</th>\n </tr>\n <tr>\n <th colspan=\"3\">Quantity:</th>\n </tr>\n <tr>\n <th>← Alt+<br>Arrow Left</th>\n <th style=\"font-size:20px;\">\n ]]\n for digit_index,digit in pairs(craft_quantity_digits) do\n if digit_index == (#craft_quantity_digits - craft_selected_digit + 1) then\n hud_machine_detail = hud_machine_detail .. [[<span class=\"text-success\">]]\n end\n hud_machine_detail = hud_machine_detail .. digit\n if digit_index == (#craft_quantity_digits - craft_selected_digit + 1) then\n hud_machine_detail = hud_machine_detail .. [[</span>]]\n end\n end\n hud_machine_detail = hud_machine_detail .. [[\n </th>\n <th>Alt+ →<br>Arrow Right</th>\n </tr>\n <tr>\n <th colspan=\"3\" style=\"border-bottom:none;\">↓ Alt+Arrow Down</th>\n </tr>\n </table>\n </th>\n <th>ALT+2</th>\n </tr>\n <tr>\n <th>MAINTAIN</th>\n <th>ALT+3</th>\n </tr>\n ]]\n else\n command_1 = \"STOP\"\n command_2 = \"SOFT_STOP\"\n command_3 = \"\"\n hud_machine_detail = hud_machine_detail .. [[\n <tr>\n <th>STOP</th>\n <th>ALT+1</th>\n </tr>\n <tr>\n <th>FINISH AND STOP</th>\n <th>ALT+2</th>\n </tr>\n ]]\n\n end\n hud_machine_detail = hud_machine_detail .. [[</table></div>]]\n end\n end\n end\n system.setScreen(hud_main_css .. hud_help_command .. hud_elements_type_list .. hud_machines .. hud_machine_detail)\nelse\n system.setScreen(hud_main_css .. hud_help_command .. [[\n <div class=\"hud_list_container hud_container\">\n \t<table style=\"width:100%\">\n \t\t<tr>\n \t\t\t<th>LOADING ]] .. math.floor(initIndex*100/#elementsIdList) .. [[% ...</th>\n \t\t</tr>\n \t</table>\n </div>\n ]])\nend",
141141+ "code": "local year, month, day, hour, minute, second = epochTime()\nlocal dateStr = year .. \"/\" .. month .. \"/\" .. day .. \" \" .. hour .. \":\" .. minute .. \":\" .. second\nif dateFormat:lower() == \"fr\" then\n dateStr = day .. \"/\" .. month .. \"/\" .. year .. \" \" .. hour .. \":\" .. minute .. \":\" .. second\nend\n\nhud_main_css = [[\n <style>\n .hud_container {\n border: 2px solid orange;\n border-radius:10px;\n background-color: rgba(0,0,0,.75);\n padding:10px;\n }\n .hud_help_commands {\n position: absolute;\n top: ]] .. tostring((10/1080)*100) .. [[vh;\n left: ]] .. tostring((50/1920)*100) .. [[vw;\n text-transform: uppercase;\n font-weight: bold;\n }\n .hud_list_container {\n position: absolute;\n top: ]] .. tostring((125/1080)*100) .. [[vh;\n left: ]] .. tostring((50/1920)*100) .. [[vw;\n text-transform: uppercase;\n font-weight: bold;\n }\n .hud_machine_detail {\n position: absolute;\n top: ]] .. tostring((125/1080)*100) .. [[vh;\n right: ]] .. tostring((450/1920)*100) .. [[vw;\n text-transform: uppercase;\n font-weight: bold;\n }\n .hud_machines_container {\n position: absolute;\n top: ]] .. tostring((125/1080)*100) .. [[vh;\n left: ]] .. tostring((300/1920)*100) .. [[vw;\n }\n .elementType {\n margin-top:10px;\n border-radius:5px;\n }\n .elementType.selected {\n border: 2px solid green;\n background-color: rgba(0,200,0,.45);\n }\n tr.selected td, tr.selected th{\n border: 2px solid green;\n background-color: rgba(0,200,0,.1);\n }\n td, th {\n border-bottom:1px solid white;\n padding:5px;\n text-align: center;\n }\n th {\n font-weight: bold;\n }\n .text-success{color: #28a745;}\n .text-danger{color:#dc3545;}\n .text-warning{color:#ffc107;}\n .text-info{color:#17a2b8;}\n .text-primary{color:#007bff;}\n .text-orangered{color:orangered;}\n .bg-success{background-color: #28a745;}\n .bg-danger{background-color:#dc3545;}\n .bg-warning{background-color:#ffc107;}\n .bg-info{background-color:#17a2b8;}\n .bg-primary{background-color:#007bff;}\n </style>\n]]\n\nlocal refreshStatusText = [[<span class=\"text-success\">Disable Data Collection</span>]]\nif refreshActivated == false then\n refreshStatusText = [[<span class=\"text-danger\">Enable Data Collection</span>]]\nend\n\nhud_help_command = [[<div class=\"hud_help_commands hud_container\">\n <table>\n <tr>\n <th colspan=\"2\">\n ]] .. dateStr .. [[\n </th>\n </tr>\n <tr>\n <td>Show/Hide HUD</td>\n <th style=\"text-align:right;\">Alt+7</th>\n </tr>\n <tr>\n \t<td>]] .. refreshStatusText .. [[</td>\n \t<th style=\"text-align:right;\">Alt+8</th>\n </tr>\n </table>\n</div>]]\nif initIndex >= #elementsIdList then\n unit.stopTimer(\"init\")\n hud_elements_type_list = \"\"\n hud_machines = \"\"\n hud_machine_detail = \"\"\n\n if hud_displayed == true then\n selected_type = elementsTypes[selected_index]\n elementsTypes = {}\n elements = {}\n refresh_id_list = {}\n selectedElementsId = {}\n for _,id in pairs(elementsId) do\n elementType = core.getElementTypeById(id)\n local elementName = core.getElementNameById(id):lower()\n if\n (elementType:lower():find(\"container\") and elementName:find(containerMonitoringPrefix:lower()))\n or (not elementType:lower():find(\"container\"))\n then\n table.insert(elementsTypes, elementType)\n end\n if selected_type == elementType then\n if\n (elementType:lower():find(\"container\") and elementName:find(containerMonitoringPrefix:lower()))\n or (not elementType:lower():find(\"container\"))\n then\n table.insert(selectedElementsId, id)\n end\n end\n end\n elementsTypes = removeDuplicatesInTable(elementsTypes)\n table.sort(elementsTypes, function(a,b) return a:lower() < b:lower() end)\n maxPage = math.ceil(#selectedElementsId / elementsByPage)\n\n local minOnPage = ((page - 1) * elementsByPage) + 1\n local maxOnPage = page * elementsByPage\n local temp_elements_for_sorting = {}\n for i,id in pairs(selectedElementsId) do\n elementData = {}\n elementData.id = id\n elementData.name = core.getElementNameById(id)\n table.insert(temp_elements_for_sorting, elementData)\n end\n table.sort(temp_elements_for_sorting, function(a,b) return a.name:lower() < b.name:lower() end)\n for i,elementData in pairs(temp_elements_for_sorting) do\n if i >= minOnPage and i <= maxOnPage then\n elementType = core.getElementTypeById(elementData.id)\n if Storage.hasKey(elementData.id) == 1 then\n elementData = MyJson.parse(Storage.getStringValue(elementData.id))\n end\n elementData.type = elementType\n elementData.name = core.getElementNameById(elementData.id)\n elementData.position = core.getElementPositionById(elementData.id)\n table.insert(refresh_id_list, elementData.id)\n table.insert(elements, elementData)\n end\n end\n hud_elements_type_list = [[<div class=\"hud_list_container hud_container\">\n <div style=\"text-align:center;font-weight:bold;border-bottom:1px solid white;\">↑ Ctrl+Arrow Up</div>\n ]]\n for i, elementType in pairs(elementsTypes) do\n hud_elements_type_list = hud_elements_type_list .. [[<div class=\"elementType]]\n if i == selected_index then\n hud_elements_type_list = hud_elements_type_list .. \" selected\"\n end\n local count = 0\n if machines_count[elementType:lower()] ~= nil then count = machines_count[elementType:lower()] end\n hud_elements_type_list = hud_elements_type_list .. [[\">\n <table style=\"width:100%;\">\n <tr>\n <th style=\"text-align:left;border-bottom:none;\">]].. elementType .. [[</th>\n <td style=\"text-align:right;border-bottom:none;\">]] .. count .. [[</td>\n </tr>\n </table>\n </div>\n ]]\n end\n hud_elements_type_list = hud_elements_type_list .. [[<div style=\"margin-top:10px;text-align:center;font-weight:bold;border-top:1px solid white;\">↓ Ctrl+Arrow Down</div></div>]]\n local minOnPage = ((page - 1) * elementsByPage) + 1\n if maxOnPage > #selectedElementsId then maxOnPage = #selectedElementsId end\n hud_machines = [[<div class=\"hud_machines_container hud_container\">\n <div style=\"text-align:center;font-weight:bold;border-bottom:1px solid white;\">↑ Arrow Up</div>\n <table class=\"elements_table\" style=\"width:100%\">\n <tr>\n <th>← Arrow Left</th>\n <th> Page ]] .. page .. [[/]] .. maxPage .. [[ (from ]] .. minOnPage .. [[ to ]] .. maxOnPage .. [[)</th>\n <th>Arrow Right →</th>\n </tr>\n </table>\n <table class=\"elements_table\" style=\"width:100%;\">]]\n if elementsTypes[selected_index]:lower():find(\"container\") then\n hud_machines = hud_machines .. [[\n <tr>\n <th>id</th>\n <th>Container Name</th>\n <th>Item Name</th>\n <th>Container Size</th>\n <th>Item Type</th>\n <th>Unit Mass</th>\n <th>Total Mass</th>\n <th>Amount of Items</th>\n ]]\n if not elementsTypes[selected_index]:lower():find(\"hub\") then\n hud_machines = hud_machines .. [[\n <th>Container Fill</th>\n ]]\n end\n hud_machines = hud_machines .. [[</tr>\n ]]\n for i, element in pairs(elements) do\n local splittedName = strSplit(element.name, \"_\")\n local itemName = splittedName[2]\n local machine_id = \"-\"\n if element.id then machine_id = element.id end\n local container_size = \"hub\"\n local container_empty_mass = getIngredient(\"Container Hub\").mass\n local container_volume = 0\n local contentQuantity = 0\n local ingredient = getIngredient(cleanName(itemName))\n if not element.type:lower():find(\"hub\") then\n local containerMaxHP = core.getElementMaxHitPointsById(element.id)\n if containerMaxHP > 17000 then\n container_size = \"L\"\n container_empty_mass = getIngredient(\"Container L\").mass\n container_volume = 128000 * (container_proficiency_lvl * 0.1) + 128000\n elseif containerMaxHP > 7900 then\n container_size = \"M\"\n container_empty_mass = getIngredient(\"Container M\").mass\n container_volume = 64000 * (container_proficiency_lvl * 0.1) + 64000\n elseif containerMaxHP > 900 then\n container_size = \"S\"\n container_empty_mass = getIngredient(\"Container S\").mass\n container_volume = 8000 * (container_proficiency_lvl * 0.1) + 8000\n else\n container_size = \"XS\"\n container_empty_mass = getIngredient(\"Container XS\").mass\n container_volume = 1000 * (container_proficiency_lvl * 0.1) + 1000\n end\n end\n local totalMass = core.getElementMassById(element.id)\n local contentMassKg = totalMass - container_empty_mass\n local contentMass = contentMassKg\n local contentMassUnit = \"Kg\"\n if contentMass > 1000 then\n contentMass = contentMass/1000\n contentMassUnit = \"T\"\n end\n contentMass = utils.round(contentMass*100)/100\n contentQuantity = contentMassKg / ingredient.mass\n local contentPercent = 0\n if (not element.type:lower():find(\"hub\")) --not a hub\n and (not ingredient.type:lower():find(\"error\")) --not item not found\n then\n contentPercent = math.floor((ingredient.volume * contentQuantity)*100/container_volume)\n end\n hud_machines = hud_machines .. [[<tr]]\n if selected_machine_index == i then\n hud_machines = hud_machines .. [[ class=\"selected\"]]\n end\n hud_machines = hud_machines .. [[>\n <th>]] .. machine_id .. [[</th>\n <th>]] .. itemName .. [[</th>\n <th>]] .. ingredient.name .. [[</th>\n <td>]] .. container_size .. [[</td>\n <td>]] .. ingredient.type .. [[</td>\n <td>]] .. ingredient.mass .. [[</td>\n <td>]] .. contentMass .. \" \" .. contentMassUnit .. [[</td>\n <td>]] .. utils.round(contentQuantity*100)/100 .. [[</td>\n ]]\n if not element.type:lower():find(\"hub\") then\n local gauge_color_class = \"bg-success\"\n local text_color_class = \"\"\n if contentPercent < container_fill_red_level then\n gauge_color_class = \"bg-danger\"\n elseif contentPercent < container_fill_yellow_level then\n gauge_color_class = \"bg-warning\"\n text_color_class = \"text-orangered\"\n end\n if ingredient.type:lower():find(\"error\") then\n hud_machines = hud_machines .. [[\n <th style=\"position:relative;width: ]] .. tostring((150/1920)*100) .. [[vw;\">\n -\n </th>\n </tr>\n ]]\n else\n hud_machines = hud_machines .. [[\n <th style=\"position:relative;width: ]] .. tostring((150/1920)*100) .. [[vw;\">\n <div class=\"]] .. gauge_color_class .. [[\" style=\"width:]] .. contentPercent .. [[%;\"> </div>\n <div class=\"]] .. text_color_class .. [[\" style=\"position:absolute;width:100%;top:0;padding-top:5px;font-weight:bold;\">\n ]] .. contentPercent .. [[%\n </div>\n </th>\n </tr>\n ]]\n end\n end\n end\n else\n hud_machines = hud_machines .. [[\n <tr>\n <th>id</th>\n <th>Machine Name</th>\n <th>Cycles From Start</th>\n <th>Efficiency</th>\n <th>Status</th>\n <th>Uptime</th>\n </tr>\n ]]\n for i, element in pairs(elements) do\n local status = \"-\"\n if element.status then status = element.status end\n local status_class = \"\"\n if status:lower():find(\"running\") then status_class = \"text-success\" end\n if status:lower():find(\"stopped\") then status_class = \"text-info\" end\n if status:lower():find(\"jammed\") then status_class = \"text-danger\" end\n if status:lower():find(\"pending\") then status_class = \"text-primary\" end\n status = status:gsub(\"JAMMED_\", \"\"):gsub(\"_\", \" \")\n local cyclesFromStart = \"-\"\n if element.cyclesFromStart then cyclesFromStart = element.cyclesFromStart end\n local efficiency = \"-\"\n if element.efficiency then efficiency = math.floor(element.efficiency*100) end\n local uptime = 0\n if element.uptime then uptime = math.floor(element.uptime) end\n hud_machines = hud_machines .. [[<tr]]\n if selected_machine_index == i then\n hud_machines = hud_machines .. [[ class=\"selected\"]]\n end\n local machine_id = \"-\"\n if element.id then machine_id = element.id end\n hud_machines = hud_machines .. [[>\n <th>]] .. machine_id .. [[</th>\n <th class=\"]] .. status_class .. [[\">]] .. element.name .. [[</th>\n <td>]] .. cyclesFromStart .. [[</td>\n <td>]] .. efficiency .. [[%</td>\n <th class=\"]] .. status_class .. [[\">]] .. status .. [[</th>\n <td class=\"]] .. status_class .. [[\">]] .. SecondsToClockString(uptime) .. [[</td>\n </tr>\n ]]\n end\n end\n hud_machines = hud_machines .. [[</table>\n <table class=\"elements_table\" style=\"width:100%\">\n <tr>\n <th>← Arrow Left</th>\n <th> Page ]] .. page .. [[/]] .. maxPage .. [[ (from ]] .. minOnPage .. [[ to ]] .. maxOnPage .. [[)</th>\n <th>Arrow Right →</th>\n </tr>\n </table>\n <div style=\"text-align:center;font-weight:bold;border-top:1px solid white;\">↓ Arrow Down</div>\n </div>]]\n if #elements > 0 then\n local selected_machine = elements[selected_machine_index]\n --Special Thx to Rutik for his help on how to get the exact the position of the element\n local position = vec3(selected_machine.position)\n local x = position.x - coreOffset\n local y = position.y - coreOffset\n local z = position.z - coreOffset\n local offset1 = 1\n local offset15 = 1.5\n local offset2 = 2\n local offset25 = 2.5\n local offsetFromCenter = 0\n if selected_machine.type:lower():find(\"container\") then\n offset1 = 0\n offset15 = 0\n offset2 = 0\n offset25 = 0\n end\n if selected_machine.type:lower() == \"container\" then\n local containerMaxHP = core.getElementMaxHitPointsById(selected_machine.id)\n if containerMaxHP > 17000 then\n offsetFromCenter = 4\n elseif containerMaxHP > 7900 then\n offsetFromCenter = 2\n elseif containerMaxHP > 900 then\n offsetFromCenter = 1\n else\n offsetFromCenter = 0.5\n end\n end\n if #markers == 0 then\n table.insert(markers, core.spawnArrowSticker(x, y, z, \"down\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z, \"down\"))\n core.rotateSticker(markers[2],0,0,90)\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"north\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"north\"))\n core.rotateSticker(markers[4],90,90,0)\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"south\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"south\"))\n core.rotateSticker(markers[6],90,-90,0)\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"east\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"east\"))\n core.rotateSticker(markers[8],90,0,90)\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"west\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"west\"))\n core.rotateSticker(markers[10],-90,0,90)\n else\n core.moveSticker(markers[1], x, y, z + offset25 + offsetFromCenter)\n core.moveSticker(markers[2], x, y, z + offset25 + offsetFromCenter)\n core.moveSticker(markers[3], x + offset1 + offsetFromCenter, y, z + offset15)\n core.moveSticker(markers[4], x + offset1 + offsetFromCenter, y, z + offset15)\n core.moveSticker(markers[5], x - offset1 - offsetFromCenter, y, z + offset15)\n core.moveSticker(markers[6], x - offset1 - offsetFromCenter, y, z + offset15)\n core.moveSticker(markers[7], x, y - offset2 - offsetFromCenter, z + offset15)\n core.moveSticker(markers[8], x, y - offset2 - offsetFromCenter, z + offset15)\n core.moveSticker(markers[9], x, y + offset2 + offsetFromCenter, z + offset15)\n core.moveSticker(markers[10], x, y + offset2 + offsetFromCenter, z + offset15)\n end\n if not selected_machine.type:lower():find(\"container\") then\n local status = \"-\"\n if selected_machine.status then status = selected_machine.status end\n local status_class = \"\"\n local machines_actions = {}\n if status:lower():find(\"running\") then status_class = \"text-success\" end\n if status:lower():find(\"stopped\") then status_class = \"text-info\" end\n if status:lower():find(\"jammed\") then status_class = \"text-danger\" end\n if status:lower():find(\"pending\") then status_class = \"text-primary\" end\n status = status:gsub(\"JAMMED_\", \"\"):gsub(\"_\", \" \")\n hud_machine_detail = [[<div class=\"hud_machine_detail hud_container\">\n <table>\n <tr>\n <th colspan=\"3\">]] .. selected_machine.name .. [[</th>\n </tr>\n <tr>\n <th class=\"]] .. status_class .. [[\" colspan=\"3\">]] .. status .. [[</th>\n </tr>\n ]]\n if status == \"-\" then\n command_1 = \"\"\n command_2 = \"\"\n command_3 = \"\"\n hud_machine_detail = hud_machine_detail .. [[\n <tr>\n <td>Machine Not Connected</td>\n </tr>\n ]]\n elseif status:lower():find(\"stopped\") then\n command_1 = \"START\"\n command_2 = \"BATCH\"\n command_3 = \"MAINTAIN\"\n hud_machine_detail = hud_machine_detail .. [[\n <tr>\n <th>START</th>\n <th></th>\n <th>ALT+1</th>\n </tr>\n <tr>\n <th style=\"height:65px;\">BATCH</th>\n <th rowspan=\"2\">\n <table>\n <tr>\n <th colspan=\"3\">↑ Alt+Arrow Up</th>\n </tr>\n <tr>\n <th colspan=\"3\">Quantity:</th>\n </tr>\n <tr>\n <th>← Alt+<br>Arrow Left</th>\n <th style=\"font-size:20px;\">\n ]]\n for digit_index,digit in pairs(craft_quantity_digits) do\n if digit_index == (#craft_quantity_digits - craft_selected_digit + 1) then\n hud_machine_detail = hud_machine_detail .. [[<span class=\"text-success\">]]\n end\n hud_machine_detail = hud_machine_detail .. digit\n if digit_index == (#craft_quantity_digits - craft_selected_digit + 1) then\n hud_machine_detail = hud_machine_detail .. [[</span>]]\n end\n end\n hud_machine_detail = hud_machine_detail .. [[\n </th>\n <th>Alt+ →<br>Arrow Right</th>\n </tr>\n <tr>\n <th colspan=\"3\" style=\"border-bottom:none;\">↓ Alt+Arrow Down</th>\n </tr>\n </table>\n </th>\n <th>ALT+2</th>\n </tr>\n <tr>\n <th>MAINTAIN</th>\n <th>ALT+3</th>\n </tr>\n ]]\n else\n command_1 = \"STOP\"\n command_2 = \"SOFT_STOP\"\n command_3 = \"\"\n hud_machine_detail = hud_machine_detail .. [[\n <tr>\n <th>STOP</th>\n <th>ALT+1</th>\n </tr>\n <tr>\n <th>FINISH AND STOP</th>\n <th>ALT+2</th>\n </tr>\n ]]\n\n end\n hud_machine_detail = hud_machine_detail .. [[</table></div>]]\n end\n end\n end\n system.setScreen(hud_main_css .. hud_help_command .. hud_elements_type_list .. hud_machines .. hud_machine_detail)\nelse\n system.setScreen(hud_main_css .. hud_help_command .. [[\n <div class=\"hud_list_container hud_container\">\n \t<table style=\"width:100%\">\n \t\t<tr>\n \t\t\t<th>LOADING ]] .. math.floor(initIndex*100/#elementsIdList) .. [[% ...</th>\n \t\t</tr>\n \t</table>\n </div>\n ]])\nend",
142142 "filter": {
143143 "args": [],
144144 "signature": "update()",
+38-31
Master program/source/system/update.lua
···1414 }
1515 .hud_help_commands {
1616 position: absolute;
1717- top: ]] .. tostring((10 / 1080) * 100) .. [[vh;
1818- left: ]] .. tostring((50 / 1920) * 100) .. [[vw;
1717+ top: ]] .. tostring((10/1080)*100) .. [[vh;
1818+ left: ]] .. tostring((50/1920)*100) .. [[vw;
1919 text-transform: uppercase;
2020 font-weight: bold;
2121 }
2222 .hud_list_container {
2323 position: absolute;
2424- top: ]] .. tostring((125 / 1080) * 100) .. [[vh;
2525- left: ]] .. tostring((50 / 1920) * 100) .. [[vw;
2424+ top: ]] .. tostring((125/1080)*100) .. [[vh;
2525+ left: ]] .. tostring((50/1920)*100) .. [[vw;
2626 text-transform: uppercase;
2727 font-weight: bold;
2828 }
2929 .hud_machine_detail {
3030 position: absolute;
3131- top: ]] .. tostring((125 / 1080) * 100) .. [[vh;
3232- right: ]] .. tostring((450 / 1920) * 100) .. [[vw;
3131+ top: ]] .. tostring((125/1080)*100) .. [[vh;
3232+ right: ]] .. tostring((450/1920)*100) .. [[vw;
3333 text-transform: uppercase;
3434 font-weight: bold;
3535 }
3636 .hud_machines_container {
3737 position: absolute;
3838- top: ]] .. tostring((125 / 1080) * 100) .. [[vh;
3939- left: ]] .. tostring((300 / 1920) * 100) .. [[vw;
3838+ top: ]] .. tostring((125/1080)*100) .. [[vh;
3939+ left: ]] .. tostring((300/1920)*100) .. [[vw;
4040 }
4141 .elementType {
4242 margin-top:10px;
···106106 elements = {}
107107 refresh_id_list = {}
108108 selectedElementsId = {}
109109- for _, id in pairs(elementsId) do
109109+ for _,id in pairs(elementsId) do
110110 elementType = core.getElementTypeById(id)
111111 local elementName = core.getElementNameById(id):lower()
112112- if (elementType:lower():find("container") and elementName:find("monit_"))
113113- or (not elementType:lower():find("container")) then
112112+ if
113113+ (elementType:lower():find("container") and elementName:find(containerMonitoringPrefix:lower()))
114114+ or (not elementType:lower():find("container"))
115115+ then
114116 table.insert(elementsTypes, elementType)
115117 end
116118 if selected_type == elementType then
117117- if (elementType:lower():find("container") and elementName:find("monit_"))
118118- or (not elementType:lower():find("container")) then
119119+ if
120120+ (elementType:lower():find("container") and elementName:find(containerMonitoringPrefix:lower()))
121121+ or (not elementType:lower():find("container"))
122122+ then
119123 table.insert(selectedElementsId, id)
120124 end
121125 end
122126 end
123127 elementsTypes = removeDuplicatesInTable(elementsTypes)
124124- table.sort(elementsTypes, function(a, b) return a:lower() < b:lower() end)
128128+ table.sort(elementsTypes, function(a,b) return a:lower() < b:lower() end)
125129 maxPage = math.ceil(#selectedElementsId / elementsByPage)
126130127131 local minOnPage = ((page - 1) * elementsByPage) + 1
128132 local maxOnPage = page * elementsByPage
129133 local temp_elements_for_sorting = {}
130130- for i, id in pairs(selectedElementsId) do
134134+ for i,id in pairs(selectedElementsId) do
131135 elementData = {}
132136 elementData.id = id
133137 elementData.name = core.getElementNameById(id)
134138 table.insert(temp_elements_for_sorting, elementData)
135139 end
136136- table.sort(temp_elements_for_sorting, function(a, b) return a.name:lower() < b.name:lower() end)
137137- for i, elementData in pairs(temp_elements_for_sorting) do
140140+ table.sort(temp_elements_for_sorting, function(a,b) return a.name:lower() < b.name:lower() end)
141141+ for i,elementData in pairs(temp_elements_for_sorting) do
138142 if i >= minOnPage and i <= maxOnPage then
139143 elementType = core.getElementTypeById(elementData.id)
140144 if Storage.hasKey(elementData.id) == 1 then
···160164 hud_elements_type_list = hud_elements_type_list .. [[">
161165 <table style="width:100%;">
162166 <tr>
163163- <th style="text-align:left;border-bottom:none;">]] .. elementType .. [[</th>
167167+ <th style="text-align:left;border-bottom:none;">]].. elementType .. [[</th>
164168 <td style="text-align:right;border-bottom:none;">]] .. count .. [[</td>
165169 </tr>
166170 </table>
···181185 </table>
182186 <table class="elements_table" style="width:100%;">]]
183187 if elementsTypes[selected_index]:lower():find("container") then
184184- hud_machines = hud_machines .. [[
188188+ hud_machines = hud_machines .. [[
185189 <tr>
186190 <th>id</th>
191191+ <th>Container Name</th>
187192 <th>Item Name</th>
188193 <th>Container Size</th>
189194 <th>Item Type</th>
···251256 hud_machines = hud_machines .. [[>
252257 <th>]] .. machine_id .. [[</th>
253258 <th>]] .. itemName .. [[</th>
259259+ <th>]] .. ingredient.name .. [[</th>
254260 <td>]] .. container_size .. [[</td>
255261 <td>]] .. ingredient.type .. [[</td>
256262 <td>]] .. ingredient.mass .. [[</td>
···262268 local text_color_class = ""
263269 if contentPercent < container_fill_red_level then
264270 gauge_color_class = "bg-danger"
265265- elseif contentPercent < container_fill_yellow_level then
271271+ elseif contentPercent < container_fill_yellow_level then
266272 gauge_color_class = "bg-warning"
267273 text_color_class = "text-orangered"
268274 end
269275 if ingredient.type:lower():find("error") then
270276 hud_machines = hud_machines .. [[
271271- <th style="position:relative;width: ]] .. tostring((150 / 1920) * 100) .. [[vw;">
277277+ <th style="position:relative;width: ]] .. tostring((150/1920)*100) .. [[vw;">
272278 -
273279 </th>
274280 </tr>
275281 ]]
276282 else
277283 hud_machines = hud_machines .. [[
278278- <th style="position:relative;width: ]] .. tostring((150 / 1920) * 100) .. [[vw;">
284284+ <th style="position:relative;width: ]] .. tostring((150/1920)*100) .. [[vw;">
279285 <div class="]] .. gauge_color_class .. [[" style="width:]] .. contentPercent .. [[%;"> </div>
280286 <div class="]] .. text_color_class .. [[" style="position:absolute;width:100%;top:0;padding-top:5px;font-weight:bold;">
281287 ]] .. contentPercent .. [[%
···287293 end
288294 end
289295 else
290290- hud_machines = hud_machines .. [[
296296+ hud_machines = hud_machines .. [[
291297 <tr>
292298 <th>id</th>
293299 <th>Machine Name</th>
···309315 local cyclesFromStart = "-"
310316 if element.cyclesFromStart then cyclesFromStart = element.cyclesFromStart end
311317 local efficiency = "-"
312312- if element.efficiency then efficiency = math.floor(element.efficiency * 100) end
318318+ if element.efficiency then efficiency = math.floor(element.efficiency*100) end
313319 local uptime = 0
314320 if element.uptime then uptime = math.floor(element.uptime) end
315321 hud_machines = hud_machines .. [[<tr]]
···372378 if #markers == 0 then
373379 table.insert(markers, core.spawnArrowSticker(x, y, z, "down"))
374380 table.insert(markers, core.spawnArrowSticker(x, y, z, "down"))
375375- core.rotateSticker(markers[2], 0, 0, 90)
381381+ core.rotateSticker(markers[2],0,0,90)
376382 table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, "north"))
377383 table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, "north"))
378378- core.rotateSticker(markers[4], 90, 90, 0)
384384+ core.rotateSticker(markers[4],90,90,0)
379385 table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, "south"))
380386 table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, "south"))
381381- core.rotateSticker(markers[6], 90, -90, 0)
387387+ core.rotateSticker(markers[6],90,-90,0)
382388 table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, "east"))
383389 table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, "east"))
384384- core.rotateSticker(markers[8], 90, 0, 90)
390390+ core.rotateSticker(markers[8],90,0,90)
385391 table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, "west"))
386392 table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, "west"))
387387- core.rotateSticker(markers[10], -90, 0, 90)
393393+ core.rotateSticker(markers[10],-90,0,90)
388394 else
389395 core.moveSticker(markers[1], x, y, z + offset25 + offsetFromCenter)
390396 core.moveSticker(markers[2], x, y, z + offset25 + offsetFromCenter)
···449455 <th>← Alt+<br>Arrow Left</th>
450456 <th style="font-size:20px;">
451457 ]]
452452- for digit_index, digit in pairs(craft_quantity_digits) do
458458+ for digit_index,digit in pairs(craft_quantity_digits) do
453459 if digit_index == (#craft_quantity_digits - craft_selected_digit + 1) then
454460 hud_machine_detail = hud_machine_detail .. [[<span class="text-success">]]
455461 end
···488494 <th>ALT+2</th>
489495 </tr>
490496 ]]
497497+491498 end
492499 hud_machine_detail = hud_machine_detail .. [[</table></div>]]
493500 end
···499506 <div class="hud_list_container hud_container">
500507 <table style="width:100%">
501508 <tr>
502502- <th>LOADING ]] .. math.floor(initIndex * 100 / #elementsIdList) .. [[% ...</th>
509509+ <th>LOADING ]] .. math.floor(initIndex*100/#elementsIdList) .. [[% ...</th>
503510 </tr>
504511 </table>
505512 </div>
+2-1
Master program/source/unit/start.lua
···2828enable3DPrinterMonitoring = true --export: enable or disable the 3D Printers monitoring
2929enableTransferMonitoring = true --export: enable or disable the transfer units monitoring
3030enableContainerMonitoring = true --export: enable or disable the containers and hubs monitoring
3131+containerMonitoringPrefix = "MONIT_" --export: the prefix used to enable container monitoring
3132refreshSpeed = 1 --export: the refresh speed of data in seconds
3233elementsByPage = 20 --export: maximum amount of elements displayed on a single page
3334dateFormat = "en" --export: the country code to format the date
···7980coreOffset = 16
8081initIndex = 1
8182if core ~= nil and Storage then
8282- elementsIdList = core.getElementIdList()
8383+ elementsIdList = core.getElementIdList()
8384 unit.setTimer("init",1)
8485end
8586