HomerGAdams Posted April 23, 2021 Share Posted April 23, 2021 Hi all, i am trying to find out how the function getItemsList() is working. I test a container M linked with a programming board and a screen. My code is something like this: monitor.activate(); monitor.clear(); cont = {} cont["Content:"] = cont1.getItemsList(); --cont1 is the container object name content_encode = json.encode(cont); system.print(content_decode); monitor.addText(5,5,5,content_encode); When running this script i get: "Content:""" but the container is not empty. I also tested with getItemsList(itemName) f.ex. and others. Same result. When using functions like cont["Free Mass:"] = cont1.getMaxVolume() - cont1.getItemsVolume() which is working as it should. The script is running in "UNIT" with a "Start" -Filter Is the function not working ? Link to comment Share on other sites More sharing options...
NQ-Deckard Posted April 27, 2021 Share Posted April 27, 2021 Hello HomerGAdams! There are actually 3 steps to the process of retrieving and processing the container information The container content is not loaded by default, first you will need to request the content through: container.acquireStorage() This is limited to 10 calls every 5 minutes, if you go over that it will trigger a cooldown. This call is not immediate and takes a (short) time to arrive. Once that data arrives and is available to use an event is triggered on the container slot called storageAcquired() You can simply set a filter on the container unit and it will be triggered everytime container.acquireStorage() has successfully returned results. Inside storageAcquired() you will now likely want to use jsonString = container.getItemsList() or alternatively deconstruct the JSON data directly: itemList = json.decode(container.getItemsList()) The item list will then be a numbered table containing the item slots in the container, and each entry will have the follow fields available to it:name, quantity, unitVolume, unitMass, type, class If you want a practical example to look at you can copy the following and use "Paste Lua Configuration from Clipboard" onto a programming board. {"slots":{"0":{"name":"container","type":{"events":[],"methods":[]}},"1":{"name":"screen","type":{"events":[],"methods":[]}},"2":{"name":"slot3","type":{"events":[],"methods":[]}},"3":{"name":"slot4","type":{"events":[],"methods":[]}},"4":{"name":"slot5","type":{"events":[],"methods":[]}},"5":{"name":"slot6","type":{"events":[],"methods":[]}},"6":{"name":"slot7","type":{"events":[],"methods":[]}},"7":{"name":"slot8","type":{"events":[],"methods":[]}},"8":{"name":"slot9","type":{"events":[],"methods":[]}},"9":{"name":"slot10","type":{"events":[],"methods":[]}},"-1":{"name":"unit","type":{"events":[],"methods":[]}},"-2":{"name":"system","type":{"events":[],"methods":[]}},"-3":{"name":"library","type":{"events":[],"methods":[]}}},"handlers":[{"code":"-- Event was fired so we now have the container content.\nitems = json.decode(container.getItemsList())\n\n-- Lets make an HTML table to display all the data.\nlocal html = [[\n<div class=\"bootstrap\" width=\"1vw\" height=\"1vh\">\n\t<table>\n\t\t<tr>\n\t\t\t<th>name</th>\n\t\t\t<th>quantity</th>\n\t\t\t<th>unitVolume</th>\n\t\t\t<th>unitMass</th>\n\t\t\t<th>type</th>\n\t\t\t<th>class</th>\n\t\t</tr>\n]] \n\n-- iterate over the container data and add the items to the table\nfor entry,itemData in ipairs(items) do\n html = html..[[\n\t\t<tr>\n\t\t\t<td>]]..itemData[\"name\"]..[[</td>\n\t\t\t<td>]]..itemData[\"quantity\"]..[[</td>\n\t\t\t<td>]]..itemData[\"unitVolume\"]..[[</td>\n\t\t\t<td>]]..itemData[\"unitMass\"]..[[</td>\n\t\t\t<td>]]..itemData[\"type\"]..[[</td>\n\t\t\t<td>]]..itemData[\"class\"]..[[</td>\n\t\t</tr>\n ]]\nend\n\n-- End the table\nhtml = html..[[\n\t</table>\n</div>\n]]\n\n-- Write to the screen\nscreen.setHTML(html)","filter":{"args":[],"signature":"storageAcquired()","slotKey":"0"},"key":"0"},{"code":"-- When the board starts up let the player know the data is being retrieved (This could be quick or slow)\nscreen.setHTML([[<div class=\"bootstrap\" style=\"font-size:5vw; \">Retrieving container data</div>]])\n\n-- Lets prepare an empty table for the data to go into\n-- This prevents other functions from receiving null until the data is retrieved.\nitems = {} \n\n-- Start a request for the container data \n-- this will trigger an event in the container slot when completed\n-- We can only do this 10 times per 5 minutes, or a cooldown will be triggered.\ncontainer.acquireStorage()","filter":{"args":[],"signature":"start()","slotKey":"-1"},"key":"1"}],"methods":[],"events":[]} I hope this helps answer your question, if not please do let me know NQ-Deckard PsychoSlaughter, RussNash37, CoyoteNZ and 1 other 4 Link to comment Share on other sites More sharing options...
HomerGAdams Posted April 28, 2021 Author Share Posted April 28, 2021 Good morning Deckard. Yes i already found out, after reading 100 times getItemsList(), trying to find out how to json.decode and finaly found the acquired function ^^ Now i am geting information from the container and i guess i need to format it with html ? I have no idea of html, i stoped programming 20 years ago with C, when DOS was my OS ;) But this all is no witchwork, if you know the functions you can use. Just html i need to learn now. The code i used was nearly the same as you wrote: For the first run i get a null (nil) returned, the second (after 5 seconds timer) i get the informations. What about the json.encode function ? I will check out the test code soon, hopefully to clearly understand how it works. Is there a LUA Tutorial for DU functions, events and stuff like that ? Btw. the description of getItemsList() shows itemName, instead of name. Maybe you wrote wrong, or the description is wrong. I guess i am able to point directly to one of these fields ? Cheers for your help Deckard Homer Link to comment Share on other sites More sharing options...
NQ-Deckard Posted April 28, 2021 Share Posted April 28, 2021 Ah! That's for pointing that out. You can find a number of player made tutorials for Lua and such on the tutorials section of the website: https://www.dualuniverse.game/tutorials/lua-guide-to-doors As for json.encode() / json.decode(), they simply turn data objects in Lua into a text string and back. For example: -- This is a simple table in lua luaTable = { itemOne = 123, itemTwo = 456, itemThree = 789 } -- this converts that table into a text string jsonTable = json.encode(luaTable) -- this will print that text to the console system.print(jsonTable) -- Console output should be something like: {"itemOne": 123, "itemTwo": 456, "itemThree": 789} -- this will turn that text back into a useable table secondLuaTable = json.encode(jsonTable) HomerGAdams 1 Link to comment Share on other sites More sharing options...
HomerGAdams Posted April 28, 2021 Author Share Posted April 28, 2021 Thank you so much, Deckard. This helps alot. Now i can create a whole new 3D game inside a game...erm ah, more like an Arcade game like PacMan ? Homer NQ-Deckard 1 Link to comment Share on other sites More sharing options...
Godsilla187 Posted July 13, 2022 Share Posted July 13, 2022 (edited) Edit: figured out Edited July 20, 2022 by Godsilla187 Link to comment Share on other sites More sharing options...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now