Перейти к содержимому
  • 0
chanmagomed

Выдавальщик предметов через транспозер на mineOS

Вопрос

Здравствуйте, собираю прогу для выдачи предметов из нескольких сундуков.

Дошёл до самого конца, в принципе она уже и предмет сможет выдать через костыль, но я хочу чтобы она это делала по нажатию одной кнопки.

пишу под 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

ошибка, наверно это недостаток памяти, хз

 

изображение_2022-06-09_153822925.png

Изменено пользователем chanmagomed

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

Запустил сырцы, ошибка другая, и проблема в отсутствующих локализационных файлах софта (они вообще задумывались или это копипаста с доки?)

 

А почему ошибка другая - это интересный вопрос, т.к., судя по всему, у тебя неверно сработал парсер стектрейса, и система пытается отобразить ошибочную строку файла "(...tail calls...) /Users/hanmag/Desktop/..", которого, конечно же, не существует. Почему это произошло - фиг знает, надо чекать оригинальный стектрейс, чтобы пофиксить парсер. А как чекать - тоже фиг знает, т.к. у меня и стектрейс другой. Wtf крч

 

image.thumb.png.9fd8463072fc2a822b6ee1b5a566710f.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Изменил блоки кода в вопросе, в "Chests.lua" функция function chest.issueItem(itm) без itm написана была

 + закомментировал строчку, которая ломает всё и вынес выдачу на кнопку "выдать" вверху слева, так выдача идёт. Но по кнопке с итемом по прежнему та же ошибка

У меня стоит транспозер, который подключен через провод, по бокам и снизу стоят сундуки, выдача идёт наверх.

Программу начал делать через пкм>создать программу прямо на рабочем столе. 

Потом редачил Созданный main.lua.

Со странички с библиотекой GUI грабил, либо делал как там, единственная моя самодеятельность - объявление кнопок через цикл (вроде)

Чтобы увидеть ошибку надо раскоментировать  89 строчку в main.lua

Изменено пользователем chanmagomed

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
46 минут назад, chanmagomed сказал:

Вот файлики сами, может так лучше будет

О, другое дело, благодарю. Проблему анализа ошибок в либе System нашел и исправил, можно обновиться. А что касается кнопки - транспозеру подавался nil: 

 

image.thumb.png.f34fec2427d9eb14dc878078fbc12699.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Огого, спасибо! появилась ошибка. Почему-то он при вызове из кнопки передаёт таблицу. Теперь можно поэксперементировать)

Нилл передавал потому что перед этим на итем нажать нужно было, ну это ладно, щас уже можно палкой потыкать, посмотреть что там происходит.

Спасибо)429089259__2022-06-09_184454883.thumb.png.6e3dda44a1ae4305655ee149017a2a12.png

Изменено пользователем chanmagomed

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Долго тыкать не пришлось, может я не то читаю, но проверил типы - там нумберы, а в ошибке написано, что я даю таблицу.

заменил на "точно цифры", нет, всё равно говорит что таблица.

на всякий случай скину последнюю версию, там именно при нажадии на кнопку с предметом вылетает это.

https://disk.yandex.ru/d/P1Rv6OMftY-ZSQ - файлики

https://imgur.com/qHyWC8m - скрин 
 

Изменено пользователем chanmagomed

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1) В 85 строке ты заюзал конструкцию discard variable, однако в луа _ является валидным именем для переменных. Следовательно, в каждой итерации цикла в _ записывается ссылка на таблицу дочернего элемента из layout1:

 

image.png.3b7b8e6395183bc77f5b15a624533626.png

 

2) Однако в 90 строке ты прокидываешь якобы "пустую" переменную в метод transferItem, которая на самом деле не пуста: 

 

image.png.0e533575703f373cfd21f2429a553349.png

 

3) Все это выливается в ошибку транспозера, ожидающего число 3 аргументом, а получающего таблицу виджета гуйки:

 

image.png.b64a474af2f884e03ec53e6e138f6c7b.png

 

Вообще я не особо вкурил, зачем нужно скармливать transferItem "никакую" переменную, но чо имею - то имею, судить не могу. А для итерации по дочерним элементам можно заюзать следующее:

for index, child in pairs(layout.children) do
  child.onTouch = function()
    ...
  end
end

for i = 1, #layout.children do
  layout.children[i].onTouch = function()
    ...
  end
end

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

большое спасибо, почему я юзал такую сложную конструкцию сейчас и не вспомню, наверно что-то планировал на будущее. 

Теперь всё работает

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...