BarBoss 89 Опубликовано: 10 декабря, 2015 (изменено) Итак, надумал опубликовать программульку, работающую с транспозером и двумя сундуками. Один рабочий, а второй - буфер, куда будет складываться лишнее и извлекаться недостающее.Задача - поддерживать содержимое рабочего сундука в заранее заданном состоянии.Для начала разложим в рабочем сундуке наше барахло в нужном порядке. Количество не важно.Запускаем -- controlchest save - будет создан файл, с записью о образцовом содержимом сундука.Программа в цикле проверяет содержимое рабочего сундука, сравнивает с образцовым и перемещает предметы в/из буферного сундука, чтоб восстановить порядок, который мы нарушаем извлекая что-то или добавляя в сундук. Второе применение для этой программы - управление реактором для неинженеров. Инвентарь максимального реактора соответствует железному сундуку. Делаем файл (руками или сканом железного сундука с расположенными нужным образом деталями), запускаем и вуаля. Компоненты в реакторе будут установлены соответственно и бонусом получаем автоматическую замену стержней. Единственный нюанс - нужно изменить программу так, чтоб она помещала компоненты поштучно. Я не проверял, что будет, если транспозер попытается вкинуть в реактор сразу стак стержней. Обязательно нужно правильно инициировать переменые first и second - они описывают положение сундуков относительно транспозера! -- поддерживает содержимое сундука согласно списку -- Ставим сундук, вплотную к нему транспозер и к транспозеру ещё сундук. -- Транспозер подключаем к компьютеру -- один из сундуков будет рабочим и в нём будет поддерживаться порядок, сохранённый в файле /rule_chest.ini -- лишний инвентарь будет перемещаться в другой сундук или напротив, пополняться из него (если есть нужное) -- первым делом нужно настроить переменые first и second - они описывают положение сундуков относительно транспондера. -- Теперь необходимо разложить в рабочем сундуке ваше барахло в нужном порядке. Количество не важно. -- запускаем -- controlchest save -- будет создан файл с описанием где что должно лежать в сундуке. Кстати, его можно поправить вручную. -- всё очень медленно. local component = require("component") local t = component.transposer local sides = require("sides") -- здесь настроить положение сундуков относитенльно транспондера. local first = sides.east -- рабочий сундук local second = sides.west -- буфер local filename = "/rule_chest.ini" pr = {} -- таблица - правило расположения барахла в сундуке. ps = {} -- таблица - содержимое буферного сундука -- сохранение и чтение таблицы из файла ---------------------------------- -- Сохранение массива в файл function tablesave(filename) local f,err = io.open(filename,"w") if not f then return nil,err end for key, value in pairs(pr) do f:write(value,'\n') end f:close() return true end -- Чтение таблицы из файла в массив function tableread(filename) local x = 1 local f,err = io.open(filename,"r") if not f then print("Не удалось прочитать файл правила.") print("Выполните controlchest save для его создания") os.exit() -- return nil,err end for line in io.lines(filename) do pr[x]=line x = x+1 end f:close() end -- -------------------------------------------------------------------------- function saverule() print("Сохраняем") for x=1, t.getInventorySize(first) do if t.getStackInSlot(first,x) then pr[x]= t.getStackInSlot(first,x).label else pr[x]="" end end for key, value in pairs(pr) do print(key, value) end tablesave(filename) end function getname(side,slot) -- отдаёт название итема или подменяет nil пустой строкой if t.getStackInSlot(side,slot) then return t.getStackInSlot(side,slot).label else return "" end end function indexsecond() print("Индексируем второй сундук") for x=1, t.getInventorySize(second) do if t.getStackInSlot(second,x) then ps[x]= t.getStackInSlot(second,x).label else ps[x]="" end end end function finditem(label) -- ищет указанный итем в буферном сундуке local tmp = 0 -- print("Find "..label) for slot = 1, #ps do if ps[slot] == label then -- сравниваем с искомым if getname(second,slot) == label then -- если реально присутствует в сундуке tmp = slot break end end end if tmp == 0 then print("Облом "..label.." не найден") end return tmp end local a = {...} if a[1]=="save" then saverule() end tableread(filename) print(" --------- Загружено правило: --------------") for key, value in pairs(pr) do print(key, value) end print(" --------- Поехали! --------------") repeat local tname, fslot for x = 1 , #pr do if x == 1 then indexsecond() end tname = getname(first,x) -- print("Process slot ",x, pr[x], tname) if (pr[x] == "") or ((pr[x] ~= tname) and (tname ~= "")) then -- если слот не соответствует шаблону или должен быть пуст if t.getSlotStackSize(first,x) > 0 then t.transferItem(first, second , 64 , x) print("Очистка слота "..x) end else if (t.getSlotStackSize(first,x) < t.getSlotMaxStackSize(first,x)) or t.getSlotStackSize(first,x) == 0 then -- если меньше стака - пополняем -- print("Пополняем ",x) fslot = finditem(pr[x]) -- ищем итем во 2м сундуке if fslot > 0 then -- если нашли t.transferItem(second, first , 64 , fslot, x) end end end end until false Изменено 11 декабря, 2015 пользователем BarBoss 5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
BarBoss Автор темы 89 Опубликовано: 11 декабря, 2015 Выловил ошибку в функции finditem() - исправил. (t.getStackInSlot() может отдавать nil, на котором спотыкается if ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 746 Опубликовано: 11 декабря, 2015 Как все сложно.. Пробовал хоть реактор так запускать? И поставь слипы, а то оно очень часто к сундукам обращается. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
BarBoss Автор темы 89 Опубликовано: 11 декабря, 2015 Как все сложно.. Пробовал хоть реактор так запускать? И поставь слипы, а то оно очень часто к сундукам обращается Реактор работает. В реакторную версию можно и слипов насыпать, хуже не будет. А для обслуги сундука - и без того довольно медленно всё, увы. Вот если бы какой-то сигнал получать при открытии сундука, чтоб программа не молотила впустую... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 746 Опубликовано: 11 декабря, 2015 Сундук-ловушка? 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах