chanmagomed
-
Публикации
11 -
Зарегистрирован
-
Посещение
-
Победитель дней
2
Сообщения, опубликованные пользователем chanmagomed
-
-
Поддержка на этом форуме лучше чем у платных поддержек разного софта))
Большое спасибо, это правда хороший ответ, который помимо рыбы даёт ещё и удочку.
-
6
-
-
Добрый день, Я пишу выдавальщик предметов с огромного кол-ва слотов, сейчас программа работает медлеено и я ищу способы для ускорения работы с транспозерами и таблицами
сейчас у меня 4 транспозера с четырьмя сундуками на каждом.
В каждом сундуке по 117 слотов и в общем 1872 ячейки в системе.
при запуске программы, после выполнения поиска и после выдачи предмета выполняется этот код:
function chest.getStorageItems() local tpTable = {} local thisItems = {} local allItems = {} for k in component.list("transposer") do table.insert(tpTable,k) end for index, tp in pairs(tpTable) do for i=0,5,1 do if (component.invoke(tp, "getInventoryName", i)) and (i~=5) then thisItems = component.invoke(tp, "getAllStacks", i).getAll() for o,thisItm in pairs(thisItems) do if (thisItm.name~="minecraft:air") then local this = false for g,allItm in pairs(allItems) do if ((this==false) and (allItm.name == thisItm.name) and (allItm.label == thisItm.label)) then this = true allItm.count = allItm.count+thisItm.size end end if this == false then table.insert(allItems, {name = thisItm.name, count = thisItm.size, label = thisItm.label}) end end end end end end return allItems end
Сверху идёт провод, а выдача происходит на север.
Каждый раз проверять сундуки надо потому что поставка предметов идёт не через систему и во время работы программы нужный предмет может появиться.
Это обновление сейчас занимает 2-3 секунды, можно ли как-то ускорить этот процесс?
-
большое спасибо, почему я юзал такую сложную конструкцию сейчас и не вспомню, наверно что-то планировал на будущее.
Теперь всё работает
-
Долго тыкать не пришлось, может я не то читаю, но проверил типы - там нумберы, а в ошибке написано, что я даю таблицу.
заменил на "точно цифры", нет, всё равно говорит что таблица.
на всякий случай скину последнюю версию, там именно при нажадии на кнопку с предметом вылетает это.
https://disk.yandex.ru/d/P1Rv6OMftY-ZSQ - файлики
https://imgur.com/qHyWC8m - скрин
-
-
-
Изменил блоки кода в вопросе, в "Chests.lua" функция function chest.issueItem(itm) без itm написана была
+ закомментировал строчку, которая ломает всё и вынес выдачу на кнопку "выдать" вверху слева, так выдача идёт. Но по кнопке с итемом по прежнему та же ошибка
У меня стоит транспозер, который подключен через провод, по бокам и снизу стоят сундуки, выдача идёт наверх.
Программу начал делать через пкм>создать программу прямо на рабочем столе.
Потом редачил Созданный main.lua.
Со странички с библиотекой GUI грабил, либо делал как там, единственная моя самодеятельность - объявление кнопок через цикл (вроде)
Чтобы увидеть ошибку надо раскоментировать 89 строчку в main.lua
-
Здравствуйте, собираю прогу для выдачи предметов из нескольких сундуков.
Дошёл до самого конца, в принципе она уже и предмет сможет выдать через костыль, но я хочу чтобы она это делала по нажатию одной кнопки.
пишу под mineOS.
Первая прога под его гуи апи, поэтому грешу на сборщик кнопок. но как это реализовать по другому не знаю.
собсна - main.lua
local component=require("component") local chests = require("chests") local cr=component.redstone local ct=component.transposer local GUI = require("GUI") local system = require("System") local items = chests.getStorageItems() local slots={} ---- Выдача предметов ----Копирование таблицы в новый экземпляр function table.copy(t) local u = { } for k, v in pairs(t) do u[k] = v end return setmetatable(u, getmetatable(t)) end ----подготовка списка предметов для вывода function getScreenItems(name) local screenItems = {} if name == "" then for o,_ in pairs(items) do if o<=80 then table.insert(screenItems, items[o]) --print(screenItems[#screenItems].label) end end else for itm,_ in pairs(items) do fnd = string.find(unicode.lower(items[itm].label),unicode.lower(name)) if fnd~=nill then table.insert(screenItems, items[itm]) end end end return screenItems end screenItems = getScreenItems("") ---- --------------------------------------------------------------------------------- -- Add a new window to MineOS workspace local workspace, window, menu = system.addWindow(GUI.filledWindow(1, 1, 160, 50, 0xE1E1E1,addTitlePanel)) --window:maximize() -- раскрыть на весь экран -- Get localization table dependent of current system language local localization = system.getCurrentScriptLocalization() -- собираю гуи local layout = window:addChild(GUI.layout(1, 1, window.width, window.height, 1, 3)) layout:setRowHeight(1,GUI.SIZE_POLICY_RELATIVE,0.08) layout:setRowHeight(2,GUI.SIZE_POLICY_RELATIVE,0.8) --layout.showGrid = true local layout1 = layout:setPosition(1, 2, layout:addChild(GUI.layout(1, 1, layout.width, layout.height*0.8, 4, 1))) --поисковая строка finder = layout:setPosition(1,3,layout:addChild(GUI.input(2, 2, 30, 3, 0xEEEEEE, 0x555555, 0x999999, 0xFFFFFF, 0x2D2D2D, "", "Item name"))) finder.historyEnabled = true finder.onInputFinished = function() screenItems = getScreenItems(finder.text) drawbtn(screenItems) workspace:draw() end ------------------------------- --layout1.showGrid = true layout1:setColumnWidth(1,GUI.SIZE_POLICY_RELATIVE,0.25) layout1:setColumnWidth(2,GUI.SIZE_POLICY_RELATIVE,0.25) layout1:setColumnWidth(3,GUI.SIZE_POLICY_RELATIVE,0.25) layout1:setColumnWidth(4,GUI.SIZE_POLICY_RELATIVE,0.25) -- Сборщик кнопок function drawbtn(screenItems) layout1:removeChildren() for i=1,20,1 do for o = 1,4,1 do id=(o-1)*20+i if #screenItems>=id then btn = layout1:setPosition(o, 1, layout1:addChild(GUI.button(0, 0, (layout.width/4)-2, 1, 0xEEEEEE, 0x000000, 0xAAAAAA, 0x0, screenItems[id].label))) btn.id = id else end end end for o,_ in pairs(layout1.children) do layout1.children[o].onTouch = function() --GUI.alert(screenItems[o].name) slots=chests.issueItem(screenItems[o]) --ct.transferItem(slots[1], 1, _, slots[2])-- ошибка при трансфере end end end drawbtn(screenItems) -- Customize MineOS menu for this application by your will local contextMenu = menu:addContextMenuItem("File") contextMenu:addItem("New") contextMenu:addSeparator() contextMenu:addItem("Open") contextMenu:addItem("Save", true) contextMenu:addItem("Save as") contextMenu:addSeparator() contextMenu:addItem("Close").onTouch = function() window:remove() end -- You can also add items without context menu menu:addItem("выдать").onTouch = function() --GUI.alert("It works!") ct.transferItem(slots[1], 1, _, slots[2]) end -- Create callback function with resizing rules when window changes its' size window.onResize = function(newWidth, newHeight) window.backgroundPanel.width, window.backgroundPanel.height = newWidth, newHeight layout.width, layout.height = newWidth, newHeight layout1.width, layout1.height = newWidth, newHeight*0.8 end --------------------------------------------------------------------------------- -- Draw changes on screen after customizing your window workspace:draw() --GUI.alert(component.transposer.getAllStacks(2).getAll()[1]) cr.setOutput(2,0) --print(items[1].label) --ct.transferItem(2, 1, _, 1, 1)
библиотечка chests.lua
local chest = {} local component=require("component") local ct=component.transposer function chest.getStorageItems() local allItems = {} local thisItems = {} for i=0,5,1 do if ((ct.getInventoryName(i)) and (i~=1)) then local thisItems = ct.getAllStacks(i).getAll() for o,_ in pairs(thisItems) do if (thisItems[o].name~="minecraft:air") then local thisIt = false for g,_ in pairs(allItems) do if ((thisIt==false) and (allItems[g].name == thisItems[o].name) and (allItems[g].label == thisItems[o].label)) then thisIt = true allItems[g].count = allItems[g].count+thisItems[o].size end end if thisIt == false then table.insert(allItems, {name = thisItems[o].name, count = thisItems[o].size, label = thisItems[o].label}) end end end end end return allItems end function chest.issueItem(itm) local suka = {0,0} local thisIt = false for i=0,5,1 do if ((thisIt==false)and(ct.getInventoryName(i)) and (i~=1)) then local thisItems = ct.getAllStacks(i).getAll() for o,_ in pairs(thisItems) do if (thisItems[o].name~="minecraft:air") then if (thisIt==false) and (thisItems[o].name == itm.name) and (thisItems[o].label == itm.label) then suka = {i,o} thisIt=true end end end end end thisItems={} return suka end return chest
ошибка, наверно это недостаток памяти, хз
-
Вау, большое спасибо, настолько полный и развёрнутый ответ, что я даже опешил немного).
Эмулятор поставлю обязательно
-
Решил изучить луа с нуля, по старинке, без этих ваших новомодных ютьюбов. Скачал книжку по луа 5.2, поставил на майнкрафт опенкомпьютер, сижу, учусь.
Задачка после первой же главы "Упражнение 1.5. Напишите простой скрипт, который печатает свое имя, не зная его заранее." - не вызвала никаких проблем... по крайней мере, пока я не начал её решать.
Пишу в print(arg[0]) - по идее тут должно храниться имя скрипта >> выдаёт ошибку, мол arg - нилл валуе.
Полез гуглить и всё такое - нашёл подтверждение моих первоначальных мыслей, надо юзать arg. Но в муйнткрумпфте это не работает.
Есть ли замена этому в OC?


MineOS
в Операционные системы
Опубликовано:
Здравствуйте товарищи, я смог поставить минеос, не знаю что конкретно помогло, но вот что я сделал:
Скачал с сайта java.com последнюю версию java 8, в настройках лаунчера поставил её
в аргументы java вписал
Ну и напоследок шлифанул впном
Вот эта команда сработала
Если что она написана на странице гита миноси.
Теперь что ваще стало, утверждать не берусь, просто пересказываю что нарыл:
Гит выпустил какие-то новые сертификаты защиты, закрыл старые. Старые версии жавы не знают новые сертификаты, новая версия должна знать, но у меня после перестановки новой жавы не получилось скачать ось.
Аргументы жавы (написаны выше) полностью отключают проверку любых сертификатов, далая ваш майнкамф дыркой для всех нехороших людей, но если хотите один разок скачать минось, то можно и рискнуть(или нет?).
Опять же, пробовал отдельно эти аргументы и ничего не вышло, заработало только после подключения впн. Впн отдельно тоже не помог.
Странная крч хрень, может просто команду другую на гите написали, а я подумал что что-то починил)
Отпишите плз кто попробует эти способы, чо там да как.