serafim
-
Публикации
367 -
Зарегистрирован
-
Посещение
-
Победитель дней
46
Сообщения, опубликованные пользователем serafim
-
-
Только что, eu_tomat сказал:А при каких условиях оно генерируется кроме, собственно, нажатия кнопок?
не известно, но кнопок никто не нажимает, но событие происходит
-
1 час назад, eu_tomat сказал:очень странно, что событие inventory_changed вообще генерируется при установке блока.
Событие "key_down" также временами срабатывает без нажатия кнопок, приходится дополнительно его проверять.
-
обнова:
компоненты которые не были использованы при выставлении схемы,
будут перенесены в начало инвентаря для удобного изъятия
-
quarry
Для тех, кто спешит https://pastebin.com/1m7k9F01 или pastebin get 1m7k9F01 q
Основное преимущество этой копалки - минимум телодвижений со стороны игрока. Всё что нужно это поставить робота,
дать ему кирку и нажать q
По умолчанию робот выкопает карьер 16/16 до бедрока.
Можно указать произвольные размеры ширины (x) и длинны (y) не кратной 3 или 2, робот с координат не собьётся например q 31 17
Можно поставить сундук сзади робота, положить туда бур, уголь, робот в таком случае будет приносить руду в этот сундук,
брать из него уголь для заправки, складывать разряженный инструмент и брать заряженный.
Можно поставить робота на поверхности, а копать он будет глубоко под землей принося руду на поверхность,
для этого нужно указать на сколько блоков ему опустится в низ
например q 20 16 40 - - 20 (ширина) 16 (длинна) 40 (опустится в низ на 40 блоков)
- минимальные требования:
корпус второго уровня (золотой) + процессор второго уровня
улучшение инвентарь (лучше 2 или 3)
контроллер инвентаря
улучшение парение
генератор
контейнер для апгрейда, если хотите использовать чанклоадер
- пример сборки:
Скрытый текст
- основной алгоритм:
Копает змейкой квадрат проходя три слоя блоков за один подход,
пока не выкопает весь объём до бэдрока или не упрётся в не разрушаемый блок,
при этом вернётся к старту и сообщит о проблеме, также предложит продолжить копать с последней позиции.
Заправляется выкопанным углём из инвентаря и сундука на старте,
если энергии не хватает, а уголь в генераторе есть, то возвращается к сундуку и заряжается.
При наличии зарядчика на старте, робот ожидает полной зарядки батареи, не смотря на количество угля в генераторе.
Сортирует выкопанный лут согласно чёрного списка, мусор выкидывает а инвентарь уплотняет.
Умеет работать с электроинструментом, если он разрядился то сначала берёт запасной в инвентаре,
а затем в сундуке на стартовой позиции, разряженный складывает в сундук.
Если на старте слева от робота стоит зарядчик для электроинструмента, то робот будет его заряжать, включая запасной инструмент
Скрытый текст
Если хотите, вместо обычного сундука можно поставить ender chest и у себя на базе сделать зарядчик для электроинструмента
на другом роботе, с помощью этой программы https://pastebin.com/mtKbYn42 или pastebin get mtKbYn42 c
- список мусора можно настроить под ваши требования на строке 35
Скрытый текст--список мусора local scrap = { "cobblestone", --булыжник "dirt", --земля "gravel", --гравий "flint", --кремень "sand", --песок "sandstone" --песчаник }
требуются только названия блоков, получить их можно тем же роботом с улучшением контроллер инвентаря,
и этой программы https://pastebin.com/au9etcfF или pastebin get au9etcfF i
-
Если добавить в робота улучшение опыт
то у него будет огромный запас энергии.
робот прокаченный на 10 уровней, имеет заряд батареи 70500 против 20500 по умолчанию.
робот прокачивается сам когда копает, но если хотите вы сами можете его прокачать, скармливая ему зачарованный лут.
прокачать его можно с помощью этой программы https://pastebin.com/ZKFw0Lst или pastebin get ZKFw0Lst e
не знаете где взять много зачарованного лута,
робот рыболов вам в помощь https://pastebin.com/RPLWqKTZ или pastebin get RPLWqKTZ r
- краткая статистика с разными инструментами:
- размер карьера 16/16, высота 70, уровней 22 по 3 слоя блоков, примерно 768 блоков на уровень.
Скрытый тексткаменная кирка, расход 2.9 кирки на уровень
12.50 два слоя земли + один слой блоков травы
15.10 два слоя камня + один слой блоков травы
13.20 три слоя камня + гравий
14.10 три слоя камня + гравий + уголь + медь
13.30 три слоя камня + медь + олово + железо
выкопает примерно за 4 часа 30 минут, израсходовав примерно 63.8 кирки
железная кирка, расход 1.5 кирки на уровень
14.30 два слоя земли + один слой блоков травы
14.00 один слой блоков травы + один слоя земли + один слой камня
10.30 три слоя камня + гравий + уголь + блоки земли
10.30 три слоя камня + гравий + медь + олово + железо
09.10 три слоя камня + медь + олово
выкопает примерно за 3 часа 50 минут, израсходовав примерно 33 кирки
алмазная кирка, расход 1 кирка на 4 уровня
14.10 два слоя земли + один слой блоков травы
13.20 один слой блоков травы + один слоя земли + один слой камня
07.40 три слоя камня + гравий
07.50 три слоя камня + уголь + медь
08.50 три слоя камня + гравий + медь + олово
выкопает примерно за 2 часа 40 минут, израсходовав примерно 5.5 кирки
алмазная кирка + зачарование на эфективность 4 и прочность 3, расход 1 кирка на 17 уровеней
14.40 два слоя земли + один слой блоков травы + песок
10.20 один слой блоков травы + два слоя камня
05.40 три слоя камня + уголь + медь
04.30 три слоя камня + уголь + медь + олово
05.10 три слоя камня + медь + олово + железо
выкопает примерно за 1 час 50 минут, израсходовав примерно 1.3 кирки
бур industrialcraft без алмазного наконечника, расходует однин заряда в 30k eu/t за 8 уровеней
05.10 два слоя земли + один слой блоков травы
06.20 один слой блоков травы + один слоя земли + один слой камня
07.50 три слоя камня + гравий
07.50 три слоя камня + уголь + медь + олово
07.50 три слоя камня + уголь + железо
выкопает примерно за 2 час 45 минут, израсходовав примерно 2.75 заряженных буров
бур industrialcraft с алмазным наконечником, расходует однин заряда в 30k eu/t за 5 уровеней
05.00 два слоя земли + один слой блоков травы
05.30 один слой блоков травы + два слоя камня + гравий
07.10 три слоя камня + медь
05.50 три слоя камня + олово + железо
05.50 три слоя камня + медь + уголь
выкопает примерно за 2 часа 00 минут, израсходовав примерно 4.4 заряженных буров
иридиевый бур industrialcraft, расходует однин заряда в 300k eu/t за 5 уровеней
05.00 два слоя земли + один слой блоков травы
05.10 один слой блоков травы + два слоя камня
05.10 три слоя камня + медь + олово
05.10 три слоя камня + уголь + медь + олово
05.10 три слоя камня + уголь + олово
выкопает примерно за 1 час 50 минут, израсходовав примерно 4.4 заряженных буров
улучшенный алмазный бур graviation suite, расходует однин заряда в 45k eu/t за 4 уровня
05.10 два слоя земли + один слой блоков травы
05.00 один слой блоков травы + два слоя камня + уголь
05.30 три слоя камня + железо
05.10 три слоя камня + гравий + медь + олово + земля
05.00 три слоя камня + медь + железо
выкопает примерно за 1 час 50 минут, израсходовав примерно 5.5 заряженных буров
улучшенный алмазный бур graviation suite + зачарование на эфективность 4, расходует однин заряда в 45k eu/t за 4 уровня
04.40 два слоя земли + один слой блоков травы
05.00 один слой блоков травы + два слоя камня
05.20 три слоя камня травы + уголь
05.10 три слоя камня + гравий + медь + олово + железо
05.10 три слоя камня + гравий + уголь
выкопает примерно за 1 час 50 минут, израсходовав примерно 5.5 заряженных буров
ваджра industrialcraft, расходует однин заряда в 3M eu/t за 13 уровней
04.40 два слоя земли + один слой блоков травы
05.00 один слой блоков травы + два слоя камня
05.10 три слоя камня + гравий
05.10 три слоя камня + медь + железо
04.50 три слоя камня + гравий + земля + олово
выкопает примерно за 1 час 50 минут, израсходовав примерно 1.7 заряженных ваджриспытательный полигон:
Скрытый текст
Программа доработана для нормальной работы на лагающем сервере
p.s. отладка велась весьма продолжительное время, все возможные баги были отловлены,
но только массовое использование исключит их полностью, так что пишите, не стесняйтесь.
скриншоты приветствуются
- На основе этого карьера было создано несколько модификаций под различные условия
Скрытый текстКарьер для не ломаемой кирки (без проверки прочности инструмента)
Например для кирки из мода Tinkers' Construct улучшенной с помощью Ball of Moss
Поскольку кирка не ломается, то и нет смысла проверять её прочность
Также инструмент из этого мода вызывает ошибки при проверки прочности, так что решаем сразу две задачи
https://pastebin.com/V16CNBz3 или pastebin get V16CNBz3 t
Скрытый текстКарьер для собирания подземных пчёл из мода Extra Bees с помощью сачка из мода Forestry
Улики не ломаются ни чем кроме сачка, и определяются как бедрок, поэтому был написан данный мод
https://pastebin.com/J0ZM8LbZ или pastebin get J0ZM8LbZ b
Скрытый текстКарьер для "синего" бура из мода GraviSuite в режиме 3х3 (большие дыры)
Бур в режиме 3х3 эффективно копает с отступом по 3 линии, также требует целую гору иной логики,
зато копает с огромной скоростью (можем соревноваться с карьером Buildcraft)
https://pastebin.com/D0PbHYZc или pastebin get D0PbHYZc g
Программа принимает 2 атрибута например g 3 9
3 размер карьера от 1 до 5 (в данном случае 36/36)
9 опустится в низ на 9 блоков (желательно копать под отрытым небом)
Желательно использовать три улучшения инвентаря
так как инвентарь очень быстро забивается блоками
Скрытый текстКарьер без замены инструмента + пчёлы из Extra Bees
https://pastebin.com/jgdzfdZe или pastebin get jgdzfdZe x
Скрытый текстdiamond digger он же копатель алмазов создан на базе карьера
Копает бесконечный туннель 1х3 змейкой ряд за рядом, предназначен для добычи алмазов по горизонту
Связан с вашей базой эндер-сундуком (берёт из него инструмент и уголь, а руду складывает)
Чанк лоадер крайне желателен, так что больше подходит для одиночной игры
оптимальная высота копания = 12 (так как на 11 лава)
https://pastebin.com/qAeXekby или pastebin get qAeXekby d
- Если сундук в привате, то у робота нет прав работать с инвентарём сундука и зарядчика инструмента
Скрытый текстДобавить робота в приват
/rg addmember имя_региона -n ваш_ник.robot
Пример для региона myhome и игрока с ником steve
/rg addmember myhome -n steve.robot
Есть плагины привата запрещающие работу контроллера инвентаря,
в таком случае придётся добавить весь мод OpenComputers в приват
/rg addmember {reg_name} -n [opencomputers]
Но тогда вас могут заграферить любым другим роботом, аккуратней
-
16
-
14 минуты назад, eu_tomat сказал:Под этим предлогом можно было бы удалить многие темы нашего форума
может и так, тогда предлагаю отправить данную тему в корзину
там можно будет её смотреть, но нельзя редактировать
либо добавить на сайт новую ветку лагодромы рядом с корзиной, закрытую от редакции
-
Начнём пожалуй с самого начала, для оптимизации программы разберём предложенный код поэтапно
Скрытый текстlocal sides = require "sides" local robot = require "robot" local component = require "component" local active_slot = 1 size=robot.inventorySize() local function Text() os.execute("cls") print("РОБОТ РАБОТАЕТ!! Создатель - GooodGame") print("Доработал-atomzerg") end Text() while true do robot.select(active_slot) if robot.count(active_slot) == 0 then active_slot = active_slot + 1 end if robot.select(active_slot) ==size then active_slot = 1 end if robot.place() == false then active_slot = active_slot + 1 end if active_slot == size then active_slot = 1 end robot.place() end
1 local sides = require "sides"
библиотека sides на 1й строке - этот интерфейс предоставляет таблицу названий, для работы со сторонами блоков
в формате: Низ (bottom): 0 , Верх (top): 1 , Тыл (back): 2 , Перед (front): 3 , Право (right): 4 , Лево (left): 5
пример для работы с контроллером красного камня:
1 local component = require("component") 2 local sides = require("sides") 3 local rs = component.redstone 4 rs.setOutput(sides.left,15)
здесь использован rs.setOutput(sides.left,15) на 4й строке (включить сигнал с лева, с силой сигнала 15),
без библиотеки sides пришлось бы указать сторону в формате rs.setOutput(5,15)
- Вот только в коде эта библиотека не используется, вызывать её не требуется
3 local component = require "component"
библиотека component на 3й строке - этот интерфейс используется для доступа и взаимодействия компьютера с компонентами
тот же пример для работы с контроллером красного камня:
1 local component = require("component") 2 local rs = component.redstone
для того чтоб взаимодействовать с контроллером красного камня необходимо его назначить компонентом
2 local rs = component.redstone
- Вот только ни какие взаимодействия с компонентами в коде не происходят, вызывать её не требуется
5 size=robot.inventorySize()
глобальная переменная size на 5й строке вызывается один раз при запуске программы
и принимает значение последнего слота в инвентаре робота,
который при одном улучшении инвентаря равен 16 ячейкам
- желательно назначать переменные локально
5 local size = robot.inventorySize()
- чтобы она не вносила изменения в другие программы за пределами данного кода
6 local function Text() 7 os.execute("cls") 8 print("РОБОТ РАБОТАЕТ!! Создатель - GooodGame") 9 print("Доработал-atomzerg") 10 end 12 Text()
- функция Text() вызывается только один раз на строке 12, её можно упростить
7 os.execute("cls") 8 print("РОБОТ РАБОТАЕТ!! Создатель - GooodGame") 9 print("Доработал-atomzerg")
- также вопрос а требуется ли она вообще, достаточно указать что за программа сейчас работает
print("работает установщик блоков")
теперь касательно основного тела программы:
16 robot.select(active_slot) 17 if robot.count(active_slot) == 0 then 18 active_slot = active_slot + 1 end 19 if robot.select(active_slot) ==size then 20 active_slot = 1 end 21 if robot.place() == false then active_slot = active_slot + 1 end 22 if active_slot == size then active_slot = 1 end 23 robot.place()
- текущий алгоритм работы:
строка 16 выбирается активный слот инвентаря робота из переменной active_slot , при первом запуске она равна 1
строка 17 проверяется значение слота (в данном случае 1) и если он пустой то
строка 18 к глобальной переменной active_slot плюсуется 1
строка 19 если выбран последний слот инвентаря робота то
строка 20 переменная active_slot меняет значение на 1
строка 21 если робот не смог поставить блок то к активному слоту плюсуется 1
строка 22 если переменная active_slot равна последнему слоту робота то переменная active_slot меняет значение на 1
строка 23 робот ставит блок без проверок успешно или нет
- Вывод: в текущем алгоритме творится каша
использован не оптимальный метод выбора заполненного слота назначая переменную active_slot
если робот не может поставить блок то назначается следующий слот инвентаря независимо от того если там руда или нет,
причиной не возможности поставить блок может быть из за того что блок ещё не сломали, или другой робот установщик
поставил его раньше, в итоге будет постоянно перебирается инвентарь тратя время в пустую
отдельно хотелось бы обратить внимание на форматирование кода, читать его затруднительно
общепринято использовать для lua два пробела, да это не обязательно но сильно улучшает восприятия написанного кода
второе - это как написаны логические элементы, тут не выделены начало и конец а также выполняемые условия
каждое условие проверяется отдельно, хотя логичное было бы остановится на том которое соответствует требованию
вот так должен был выглядеть код при соблюдении общепринятых норм
while true do robot.select(active_slot) if robot.count(active_slot) == 0 then active_slot = active_slot + 1 elseif robot.select(active_slot) == size then active_slot = 1 elseif robot.place() == false then active_slot = active_slot + 1 elseif active_slot == size then active_slot = 1 end robot.place() end
- Использовать кучу условий и метод счётчика для выбора заполненного слота в инвентаре робота не эффективно
правильнее применить цикл перебора инвентаря пропуская пустые слоты
и при нахождении полного слота выбрать его, остановив дальнейший перебор
for slot = 1, inv do if r.count(slot) > 0 then r.select(slot) break end end
вместо кучи условий с переменной active_slot можно использовать только одно условие, (если выбранный слот пуст)
if r.count() == 0 then
также если инвентарь робота пустой, то не логично перебирать его до посинения,
правильнее остановить поиск, пока в инвентаре не появится новые блоки,
и при добавлении новых блоков, сразу его выбрать
if slot == inv then local e, slot = event.pull("inventory_changed") r.select(slot) end
проверять поставил ли робот блок нет необходимости
if robot.place() == false then
особенно если использованы несколько установщиков блоков, программа будет простаивать
r.place()
Собственно готовый код занимает всего 21 строку, осталось его только собрать до кучи
Но я этого делать не буду, и вот почему:
Эта программа при лагающем сервере вызывает рассинхрон при быстрой смене блока,
устанавливая и разрушая его сервер выдаёт финты типа моментального разрушения или дюпа
Подобные действия не способствуют популезации мода OpenComputers
Рекомендую проголосовать за удалении этой темы как потенциально нежелательной
-
1
-
1
-
17 часов назад, eu_tomat сказал:мы можем совместно работать над новым вариантом ... В этом случае мы с тобой сможем раскрыть тему оптимизации последовательно, пост за постом.
идея интересная
-
22 минуты назад, eu_tomat сказал:Каков смысл общего блока для совместной работы двух роботов, если у каждого есть свой инструмент для рубки?
это тайна покрытая мраком, а вообще
надежда на рассинхрон вычислений сервера с клиентом позволяющий моментально сносить блоки22 минуты назад, eu_tomat сказал:Какой способ хорош? Мой с тремя установщиками и одним рубщиком?
Твой, но увы тут ПО писать особо не о чем
-
9 минут назад, eu_tomat сказал:А в чём заключается преимущество именно такой схемы параллельной работы?
Идея в том чтоб не заморачиваться с ПО, роботы сами будут ставить или рубить руду в зависимости от того кто раньше успеет
9 минут назад, eu_tomat сказал:три робота устанавливали руду в один общий блок, а четвёртый рубил руду в этом блоке.
Такой способ тоже хорош и экономный в плане инструмента и зарядчика
9 минут назад, eu_tomat сказал:что даёт этот трюк с общим блоком в схеме на двух независимых роботах, когда каждый из них рубит своим инструментом?
Тут прироста увы нет, в основном влияет только время установки блока
-
16 минут назад, RaX сказал:А где можно скачать эту библиотеку?
ссылка на первой странице https://computercraft.ru/topic/1016-lyogkaya-biblioteka-gui/?do=findComment&comment=13883
-
Синхронизировать двух роботов на одну задачу оказалось не так просто как думалось,
перепробовал пол сотни вариантов пока получилось хоть что-то не сильно лагучее
Два робота совместно ставят и рубят один и тот же блок получая ускорение
Скрытый текст
вид сзади
Скрытый текст
собственно ссылка на это недоразумене https://pastebin.com/FvGE1qYa
При использовании бура или инструмента который можно зарядить, то зарядники ставить обязательно, так как из за ограничений привата пришлось выпилить проверку с помощью контроллера инвентаря на то что зарядник присутствует, в итоге робот бур просто выкинет.
Руду закидывать в сундук над роботом, лут получим снизу как только робот переработает пачку руды
Можно использовать от одного до четырёх роботов по кругу (насчёт насколько это будет быстрей, х.з.)
Рекомендую использовать двух роботов
-
обнова: избавился от рекурсии, удалил дублированные проверки
-
форматирование немного съезжает, поправил по 2 пробела
Скрытый текст--CycleBlockBreaker for EEPROM --Original OpenOS version by Asior (Asioron) --Expanded EEPROM version by Bs()Dd --[[Minimum requirements: *Robot - 1 tier In robot: *CPU - 1 tier *1x Memory - 1 tier *Inventory Upgrade *EEPROM with flash this code *Mining tool *Computer with OpenOS for flashing EEPROM Place the chest on top and put blocks there Place the chest at the bottom, there will be loot from blocks ]] r = component.proxy(component.list("robot")()) c = component.proxy(component.list("inventory_controller")()) inv = r.inventorySize() speaker = false --Set true for using speaker when something is gone wrong lowcharge = 0.005 --Set there number maximal working charge in durability() format --Needs Inventory Controller autocharge = false --Set there number of turns right to charger (for charging tools) chargesleep = 15 --Set there number of sleep duration while tool is charging function turnNcharge() for i = 1, autocharge do r.turn(true) end c.equip() r.drop(3, 1) local ws = computer.uptime() + chargesleep repeat computer.pullSignal(ws - computer.uptime()) until computer.uptime() >= ws r.suck(3, 1) c.equip() for i = 1, autocharge do r.turn(false) end end while true do local rep = r.suck(1, 64) if rep then for i = 1, rep do while not r.place(3) do if speaker then computer.beep(1100, 0.5) else computer.pullSignal(0) end end while not r.swing(3) do if speaker then computer.beep(1000, 0.5) else computer.pullSignal(0) end end if r.durability() then while r.durability() < lowcharge do if autocharge then turnNcharge() else if speaker then for i = 1, 10 do computer.beep(700, 0.5) end else local ws = computer.uptime() + 5 --Wating 5 sec, then trying to drop blocks again repeat computer.pullSignal(ws - computer.uptime()) until computer.uptime() >= ws end end end end end for i = 1, inv do if r.count(i) > 0 then r.select(i) while not r.drop(0, 64) or r.count(i) > 0 do if speaker then for i = 1, 10 do computer.beep(700, 0.5) end else local ws = computer.uptime() + 5 --Wating 5 sec, then trying to drop blocks again repeat computer.pullSignal(ws - computer.uptime()) until computer.uptime() >= ws end end end end else if speaker then for i = 1, 10 do computer.beep(500, 0.5) end else local ws = computer.uptime() + 5 --Wating 5 sec, then trying to get blocks again repeat computer.pullSignal(ws - computer.uptime()) until computer.uptime() >= ws end end end
а так вроде норм
-
Использование робота для установки схемы в реактор:
- Поставьте робота лицом к реактору IC2 типа "звёздочка" (реактор в центре + 6 реакторных камер вокруг)
- Положите в инвентарь роботу компоненты реактора предполагаемой схемы:
Скрытый текст
- Список что требуется и чего не хватает будет указан на экране робота
Скрытый текст
- Введите имя программы и укажите схему из предложенных на экране (360,420,1056,1308 eu/t)
также можно запустить программу передав атрибуты, например r 1308
версия для IC2 1.7.10 https://pastebin.com/xWhYcrgM или pastebin get xWhYcrgM r
версия для IC2 1.12.2 https://pastebin.com/LYDve4ai или pastebin get LYDve4ai r
- Во время выполнения программы разрешено произвольно добавлять и убирать компоненты в инвентаре робота
-
Во время выполнения программы запрещено заменять компоненты в инвентаре робота, а также самому добавлять их в реактор
-
2
-
18 часов назад, eu_tomat сказал:дописать короткую инструкцию, как игроку обращаться с этой программой
в принципе можно
18 часов назад, demongts1998 сказал:есть схемки для реакторов получше
предложи варианты
-
обнова https://pastebin.com/xWhYcrgM
Скрытый текст
добавил динамический список недостающих компонентов в инвентаре робота
перевёл прогу на gpu так как в консоли творилась каша
выход из проги кнопкой ctrl
-
2
-
-
обновил, теперь выводит список необходимых компонентов для выбранной схемы
Скрытый текст
-
10 минут назад, eu_tomat сказал:сообщать игроку список недостающих компонентов ещё до начала заполнения реактора
можно, тем более что список известен
-
3 часа назад, eu_tomat сказал:Или на сервере какие-то особенности приватов не позволяют так обращаться с внешними инвентарями?
мене тоже смущает этот вопрос, очень часто робот в привате имеет ограничения и robot.drop() предпочтительней
7 минут назад, eu_tomat сказал:Да, так сильно проще ... игрок будет получать уведомление о недостающих компонентах позже, но зато все уведомления сразу
такой способ действительно более удобный, но может не работать под защитой привата
-
1 час назад, serafim сказал:событие изменения инвентаря сейчас работает условно, надобы его разобрать что и когда оно выдаёт
изваял обработчик событий
Скрытый текстlocal event = require("event") while true do local e = {event.pull("inventory_changed")} for i = 1, #e do if e[i] then print(i..": "..e[i]) else print(i..": nil") end end print(" ") end
событие inventory_changed возвращает только 2 параметра
1: inventory_changed -- событие изменения инвентаря 2: 7 -- номер слота
обновил прогу на
... local e, slot = event.pull("inventory_changed") if slot and r.count(slot) > 0 then ...
теперь событие inventory_changed отрабатывает адекватно
-
частично обновил по рекомендации, теперь реактор заполняет за 32 секунды
-
2 часа назад, eu_tomat сказал:отказавшись от выполнения getStackInInternalSlot(slot) для заведомо пустых ячеек. Наличие предмета в слоте помогает определить функция robot.count(slot), и работает она очень быстро
изначально поиск был по имени через string.find() в итоге от него отказался, так пользователю проще будет понят что за компонент в шаблоне от него хотят. Насчёт что через robot.count(slot) быстрее, как то не замечал, ок учту
2 часа назад, eu_tomat сказал:robot.inventorySize() вызывается больше одного раза
ок, вынесу в начало
2 часа назад, eu_tomat сказал:При поступлении сигнала inventory_changed программа заново сканирует инвентарь
событие изменения инвентаря сейчас работает условно, надобы его разобрать что и когда оно выдаёт
перед повторный сканированием прога ждёт 5 секунд, за этот промежуток могут добавится ещё компоненты и в другие слоты, поэтому повторно делаем скан всего инвентаря
2 часа назад, eu_tomat сказал:При обнаружении отсутствующего компонента в инвентаре робота необязательно тратить время только лишь на ожидание его появления поэтому вместо robot.drop() можно использовать component.inventory_controller.dropIntoSlot(side,slot,count), помещая предмет строго в нужный слот.
да так ещё лучше, может сделаю
2 часа назад, eu_tomat сказал:Если использовать dropIntoSlot допустимо, то заранее сканировать инвентарь робота имеет смысл только для того, чтобы сообщить об отсутствующих игроку компонентах
такой метод в корне меняет логику проги, и да так удобней
2 часа назад, eu_tomat сказал:Обнаружение изменения инвентаря сейчас реализовано проверкой на 0 значения robot.count(slot). Это работает только для случая извлечения предмета из слота. Но игрок может произвести замену предмета. В этом случае программа рискует поместить в реактор не тот компонент.
в таком случае придётся повторно запрашивать имя компонента тратя кучу времени
2 часа назад, eu_tomat сказал:Зачем функция set сделана рекурсивной? В чём удобство именно рекурсивной функции?
чтоб цикл для выставления схемы в реактор не выполнялся пока в реактор не попадёт нужный компонент
также нужно передавать ряд параметров функции set (имя компонента, наличие компонента в инвентаре, также если инвентарь пуст то цикл в функции set не выполняется приходится ожидать пока компоненты добавят)
возможно можно избавится от рекурсии, но пока реализовал так как мне казалось проще
-
обновил
теперь если прога не найдёт компонент в инвентаре с прошлого скана, заново обновит скан
если компоненты добавятся в процессе работы, то прога сначала выложит те что уже были в скане, а затем попытается найти недостающие
время кстати не изменилось 33-34 сек при 54 компонентах в инвентаре робота
-
2 минуты назад, eu_tomat сказал:если игрок извлекает предметы из инвентаря робота в процессе загрузки компонентов в реактор, то правильность работы программы не гарантируется.
можно проверять перед отправкой в реактор если ли компонент в инвентаре от предыдущего скана
обнова
теперь прога принимает атрибуты, вводить так: название проги пробел схема test 1320
при недостающем компоненте теперь пишет его название на русском

Доработка программы для переработки руды
в Новые заказы
Опубликовано:
Происходит это при работе карьера, но не всегда.
В ранних версиях использовал код такого вида:
Робот возвращался к старту, и по событию key_down должен был продолжить копать,
но в итоге он приезжал и сразу ехал обратно