Перейти к публикации
Форум - ComputerCraft
  • записей
    10
  • комментарий
    51
  • просмотр
    23 011

Рыбалка #1 Оптимизация постройки

eu_tomat

1 380 просмотров

Здравствуй, брат автоматизатор!

Сегодня я расскажу тебе, как можно оптимизировать постройку рыбной фермы Asior'а. Если ты слишком слаб для чтения длинных текстов, ни в коем случае не открывай спойлер – для тебя есть несколько скриншотов с их кратким описанием. Но если ты хочешь узнать, как можно достичь такого результата, тебя ждет много текста с картинками, а в качестве бонуса — схема постройки сверхкомпактной масштабируемой фермы.

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

Сразу предупреждаю, что я не буду сильно вдаваться в объяснение механики игры, мода OpenComputers, или языка Lua. Всё это ты можешь узнать в блоке «Полезные ссылки» на главной странице проекта. Я скажу больше – без пользования этими ссылками, я бы даже этот текст не смог написать. Скажу еще больше – я дилетант и в MineCraft, и в Lua, и в OpenComputers. Но это не помешает мне оптимизировать схемы, постройки, алгоритмы и коды некоторых игроков.


Три важных совета
1) Прежде, чем что-то оптимизировать, следует понять, как это что-то работает. Иначе результат, вероятнее всего, тебя не порадует. Как научиться понимать что-либо, это вопрос, который мы решаем всю жизнь. Но к счастью большинство механизмов в Майнкрафте устроено весьма просто, как и весь мир Майнкрафта. Читай вики, там ты узнаешь о свойствах блоков. Зная свойства блоков, ты научишься понимать работу простых механизмов, а наработав навык, сможешь понять и более сложные.
2) Экспериментируй – Майнкрафт не накажет тебя за это. Так ты сможешь лучше понять работу механизма и найти новое, иногда лучшее решение. Задавай себе вопросы: можно ли решить эту задачу иначе, и что будет, если поменять что-то здесь или там.
3) Если ты, как и я, не очень силен в понимании механики игры, не делай больших перестроек, исследуй малые изменения, чтобы не запутаться и не прийти к ложным выводам. Помни: как бы ни была плоха изначальная схема, автор тоже работал над ней и старался учесть нюансы, о которых тебе не поведал. Не все же пишут длинные тексты.

А теперь мы с тобой, задавая себе вопросы, подумаем и поэкспериментируем вместе.

Для начала построим оригинальный вариант фермы.
В нем самое муторное – правильно установить воронки, чтобы дроп из всех воронок попадал в сундук. Но сегодня тему воронок я обойду стороной, немного касаясь ее ближе к концу. Еще для того, чтобы вписаться в допустимый объем вложений, мне пришлось, жертвуя наглядностью, вдвое уменьшить количество скриншотов, а остальные сжать, насколько возможно. Поэтому будь внимателен: при переходе от картинки к картинке может быть выполнено несколько промежуточных действий. Для экспериментов я взял Creatix'а, чтобы не отвлекаться на сборку и питание робота.
blogentry-13296-0-67615200-1453837628_thumb.png

Вникаем в работу датчика
Думаю, ты уже оценил работу схемы Asior'a, но чтобы понять ее изнутри, придется потрудиться еще немного. Обязательно понаблюдай за процессом со стороны. Спроси себя: что является наиболее важным в этой схеме? Без чего она не будет работать. Без блока воды вообще ничего не выловишь, без робота можно рыбачить лишь своими руками, но без датчика робот превратится в беспомощную железку, и даже самая умная программа ему мало поможет. С блоком воды все понятно, роботом и программой потом займемся, а вот, как работает датчик...

Останавливай робота, сам бери в руки удочку и закидывай ее в бассейн фермы. Сначала ты услышишь характерный «чпок» при забросе, а через пару секунд щелчок одной из нитей датчика, и вместе с ним увидишь включение редстоуна и смещение вниз крючков, держащих нити датчика. Не услышал щелчок, и не горит редстоун? Попробуй забросить в другое место бассейна.

Теперь дождись клёва. Ты услышишь «бултых» поплавка и два щелчка датчика. Редстоун тоже подмигнёт. Теперь вытаскивай удочку. Опять щелкнет датчик и редстоун погаснет.

Теперь подумай, как пользуясь лишь сигналом редстоуна с датчика, робот сможет определить, когда удочка заброшена, а когда нет, и как определить момент клевка. В отличие от тебя робот даже поплавка своей удочки не видит, не говоря уже о подплывающей рыбе. Можешь еще так «порыбачить» какое-то время, и всё станет понятным.

Понял работу датчика? Теперь проверь, как он реагирует на рыбалку роботом. Думаешь, ты уже видел и знаешь? Точно лишь Asior знает, а мы сейчас тоже узнаем его секрет. Включаем робота, кладем в его руки удочку, и пишем в консоли команды. Можешь весь текст целиком скопировать, робот разберется:

luar=require('robot')r.use()

Слышим «чпок» забрасываемой удочки, но щелчка датчика не слышно, и редстоун не загорается. Что-то пошло не так. На всякий случай повторяем несколько раз и убеждаемся, что схема должным образом не работает. Открываем программу Asior'а, ищем слово use, и находим его в трех местах, но в единственном варианте r.use(0, true, 1). Ага, понятно: робот «приседает», закидывает удочку вперед и слегка вниз, а еще зачем-то использует ее одну секунду. Копируем эту команду в консоль нашего робота, и с ее помощью выполняем несколько забросов, сначала несколько секунд выжидая до срабатывания датчика, и той же командой вытягиваем удочку. Работает!


Сейчас мы оптимизируем постройку, но я все равно не могу удержаться и не проверить возникший вопрос – зачем указывать время использования удочки, и влияет ли оно на работу, а так же играет ли роль «приседание» робота. Несколько раз запускаем r.use(0), и убеждаемся, что все работает, судя по реакции датчиков: на слух их время срабатывания приблизительно то же, что и до упрощения команды.

Теперь попробуем забросить удочку и дождаться клевка. По свечению редстоуна видно, что при клевке датчик срабатывает, сигнал на короткое время прерывается. Можно просто постоять и понаблюдать за процессом. Если удочка заброшена, на нее рано или поздно клюнет рыба, и так и будет периодически клевать, пока робот не вытянет удочку из воды, или ты не заберешь ее.

Отлично. Проведя опыт, мы в общем поняли, как работает датчик. При забросе сигнал появляется с некоторой задержкой, ненадолго прерывается при клевке, а при вытаскивании удочки исчезает тоже с какой-то задержкой. Судя по всему, поплавок касается одной или нескольких нитей датчика, от чего тот начинает выдавать сигнал. При уходе поплавка под воду, он перестает касаться нитей, и сигнал пропадает.
Это основа работы всего механизма фермы.

Опыт с расположением робота над датчиком
Поняв, как работает датчик, начнём эксперименты с его конструкцией. Можно ли ее уменьшить? Например, я вижу, что дальняя от робота нить датчика редко дает сигнал. Но все же иногда дает. Может быть, убрать ее? Не приведет ли это к ухудшению надежности схемы? А может, вместе с дальней убрать и вторую нить тоже? А может, и ближайшую передвинуть еще ближе к роботу? Вот бы оставить только одну нить!
Но для начала следует проверить, будет ли ближайшая нить вообще срабатывать. Не зря же Asior ее не использовал.
Добавляем еще одну нить в датчик:
blogentry-13296-0-40571000-1453837630_thumb.png
Копируем в консоль робота код:

for i=1, 10 do r.use(0); os.sleep(3); r.use(0); os.sleep(3); end

Пауза в три секунды тоже позаимствована из программы Asior'а. Вероятно, он ее не с потолка взял, поэтому сейчас мы тоже не будем сильно вдумываться, а оптимизируем ее позже. Сразу после запуска кода идем смотреть на срабатывание нитей в датчике и видим, что ближайшая нить не срабатывает. Неудивительно, что Asior от нее отказался. Но это разумно в его схеме, а о других он нам ничего не сказал, поэтому проведем эксперимент.


Сдвинем робота на шаг вперед, чтобы он попробовал закидывать удочку вниз. Выполняем r.forward()
Убираем из руки робота удочку, и опять вкладываем, чтобы убедиться в том, что поплавок не находится в воде. Выполняем код:

for s=0, 5 do print(s); pcall(r.useDown,s); os.sleep(6); pcall(r.useDown,s); os.sleep(6); end

Здесь мы используем функцию pcall для защищенного вызова r.useDown. Она позволяет нам перебрать все возможные стороны робота, не прерывая цикл ошибкой, и не заботясь при этом о проверке условий. Отличная штука для отладки, и полезная, но опасная для программ.


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

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

Вывод из этого опыта: заброс удочки сверху бесперспективен для автоматической рыбалки с таким видом датчика.

Опыт с расположением робота на уровне воды
Ломаем воронку, что находилась под роботом, а робота уводим на ее место:

r.back(); r.down(); r.down()

blogentry-13296-0-36600400-1453837632_thumb.png
Проверим срабатывание датчика, забрасывая удочку вперед:

for s=0, 5 do print(s); pcall(r.use,s); os.sleep(6); pcall(r.use,s); os.sleep(6); end

Слышим срабатывание датчика на сторонах с номерами {0,3}. Вики говорит, что это «вниз» и «вперед». Отлично, подобная реакция и ожидалась.
Попробуем забросить удочку просто вперед: r.use(); os.sleep(3); r.use(); os.sleep(3);
Нет, датчик не срабатывает. Запомним это на будущее, и проверим какие нити срабатывают при забросе вперед. Запускаем код, а сами выходим из консоли и наблюдаем за ниточками:

for i=1, 10 do r.use(0); os.sleep(3); r.use(0); os.sleep(3); end

И убеждаемся, что срабатывает только ближайшая к роботу нить. Это означает две радостные новости: во-первых, достаточно лишь одной нити в датчике, а во-вторых, крючок не будет застревать в ближайших твердых блоках, какими бы они ни были, т. к. крючок застревает в ближайшем блоке воды, а по сути, готов ловить рыбу. Правильные направления для заброса: вперед или чуть вниз.


Опыт с расположением робота под водой
Ломаем блок под роботом, а затем отправляем его под воду и под первую нить командами:

r.down(); r.forward();

Чтобы не мешала льющаяся вода, можно временно поставить любой блок, например, стекло. Теперь робот находится под водой и под первой, нами добавленной нитью.
blogentry-13296-0-58928700-1453837633_thumb.png
Проверяем срабатывание датчиков при забросах вверх:

for s=0, 5 do print(s); pcall(r.useUp,s); os.sleep(6); pcall(r.useUp,s); os.sleep(6); end

и слышим, что датчик срабатывает при броске в любую сторону кроме нулевой, то есть нижней. Оно и неудивительно: бросать вверх и при этом слегка вниз робот попросту отказался, но ошибку от нас скрыл pcall. Но самое интересное, мы услышали, что при забросе удочки датчик срабатывает заметно быстрее, чем у нас получалось ранее.
Ради интереса проверим заброс без указания стороны:

r.useUp(); os.sleep(3); r.useUp(); os.sleep(3);

Вау! Работает!
А какая нить при этом срабатывает? Ну, конечно же, та, которая находится над роботом. Проверим это, поставив на выполнение код:

for i=1, 10 do r.useUp(); os.sleep(3); r.useUp(); os.sleep(3); end

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


Вывод: размещение робота под водой позволяет датчику срабатывать чуть быстрее других вариантов. Кроме того, направление заброса в useUp() можно вообще не указывать. Достаточно одной нити датчика.

Убираем явно лишнее и немного нужного
Теперь мы знаем, что для успешного срабатывания датчика достаточно одной нити, находящейся почти вплотную к роботу. Поэтому можно сломать ставшую ненужной часть конструкции, укоротив ее длину с семи до четырех блоков. Для наблюдения за процессом рыбалки хорошо бы заменить блоки на прозрачные, где это возможно. Кроме прочего избавимся от воронок. В последующих экспериментах они не смогут выполнять свою функцию, а насколько они нужны, разберемся позже. Просто запомним этот момент. Скорее всего, Asior не зря их использовал. Сундуки тоже пока уберем, их положение будет зависеть от положения робота, а его-то мы сейчас и попробуем найти. И вообще, оставим лишь только блоки, поддерживающие датчик и воду.
blogentry-13296-0-38746000-1453837635_thumb.png
Теперь возникает вопрос. Т.к. при забросе удочки крючок не проходит дальше ближайшего от робота блока воды, то, возможно, другие блоки воды совсем не нужны? Забьем камнем нижний блок и 4 блока по бокам:
blogentry-13296-0-19725400-1453837637_thumb.png
Проверим работу датчика:

r.use(0); os.sleep(3); r.use(0); os.sleep(3);

Вот это поворот! Датчик перестал срабатывать. Совсем. Дело оказалось в датчике. Если непосредственно под крюками использовать прозрачные блоки, они не мешают работе датчика. Кроме того, датчик сохраняет работоспособность при использовании только одного непрозрачного блока. В любом случае ясно, что блоки воды по бокам на срабатывание датчика не влияют. Проверим, будет ли в такой схеме датчик реагировать на клевок:

r.use(0); os.sleep(80); r.use(0); os.sleep(3);

Паузу в 80 секунд я тоже взял из программы Asior'а. Если мы не дождались клевка, повторим еще раз. При этом будет слышен характерный «бултых» поплавка, и два щелчка, издаваемые датчиком. Работает!
Теперь избавиться он нижнего блока воды, заменив его стеклом, и повторим проверку, выполнив предыдущий набор инструкций:

r.use(0); os.sleep(80); r.use(0); os.sleep(3);

Клюёт!


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

Восстановление рабочих блоков
Схема №1
Что в этой схеме можно еще минимизировать? Мы уже имеем один блок воды и одну нить. Остальные блоки либо поддерживают нить датчика, либо не дают разлиться воде. Есть еще несколько лишних блоков, но весь процесс удаления я не показал для экономии на скриншотах. Теперь пора выходить на рабочие варианты схемы: куда-то поставить сундук, дотянуть от датчика к роботу сигнал и, возможно, куда-то воткнуть воронку.
Первым вопросом будет: а откуда вообще можно снять сигнал датчика? А в идеале — нельзя ли переместить робота под один из крючков и снимать сигнал непосредственно с него? Тогда для робота будут соседними одновременно и крючок и блок воды и сундук. Не знаю, является ли робот прозрачным блоком, но ранее мы выяснили, что это тоже не будет препятствием. Перемещаем робота под крюк, а под него сразу ставим сундук. Помним, что робот может работать с сундуком впереди него, сверху или снизу.
blogentry-13296-0-07351300-1453837661_thumb.png
Проверяем:

luar=require('robot')c=require('component')rs=c.redstone

Читаем сигнал над роботом и видим нолик:

print( rs.getInput(1) )

Выполняем код:

r.use(0); print( rs.getInput(1) ); os.sleep(3); print( rs.getInput(1) ) ; r.use(0); print( rs.getInput(1) ); os.sleep(3); print( rs.getInput(1) )

И видим циферки: 0, 15, 15, 0. Что они означают? Сразу после заброса удочки датчик выдает нулевой сигнал. Через три секунды 15 (максимальный), сразу после вытаскивания удочки датчик продолжает выдавать сигнал 15, а через три секунды выдает ноль. Размеры задержек, повторюсь, взяты из программы Asior'а. Насколько они хороши, разберемся позже. Главное, что они приемлемы для наших экспериментов.


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

Теперь наводим красоту и удобство, восстановив камень под висящими блоками, и заменив стекло на более тонкие и не мешающие проходу забор и таблички.
blogentry-13296-0-04147900-1453837663_thumb.png

Схема №2
Теперь хорошо бы осуществить доставку сигнала к роботу при нижнем лове, когда он забрасывает удочку снизу вверх. Вариант может оказаться перспективным. Перемещаем робота вниз под воду и прокладываем редстоун:
blogentry-13296-0-68081400-1453837664_thumb.png
Можно ли сделать лучшую схему, не знаю, я не большой знаток редстоун-схем. Почитал вики, и нашел минимальный, как мне кажется, способ. Недостаток этой конструкции в том, что придется оставить висящий в воздухе блок слева. Редстоун можно дотянуть иначе, без висящего блока, но будет потеряна легкость и наглядность конструкции.
Проверяем работу датчика:

luar=require('robot')c=require('component')rs=c.redstoner.useUp(); print( rs.getInput(2) ); os.sleep(3); print( rs.getInput(2) ) ; r.useUp(); print( rs.getInput(2) ); os.sleep(3); print( rs.getInput(2) )

И видим циферки: 0, 14, 14, 0. Почти то же самое, что и выше, но сигнал ослаб на единицу, что совершенно не помешает нам. Схему можно улучшить, используя провода из RedLogic. Например, так:
blogentry-13296-0-65112200-1453837665_thumb.png
Но блок воды как-то криво стал стоять, поэтому я заменил табличку на красный провод и с правой стороны тоже:
Вот, теперь полный финиш, только без зарядника и воронки.


Идеальная схема
Какая из двух найденных схем лучше? Прямого ответа на этот вопрос не существует. Можно определить идеальную схему лишь для жестко заданных условий. При определенных требованиях мои схемы тоже можно улучшить. Например, вместо провода, который я добавил для симметрии, можно использовать табличку для снижения нагрузки на сервер. А с этой точки зрения хорошо бы избавиться вообще от любого мигающего в процессе работы редстоуна и перейти на схему №1. Если ты рыболов-спортсмен, то схема нижнего лова может позволить тебе рыбачить чуть быстрее. А если ты строишь карьеру рыбного магната, то схема №1 позволит тебе сильно сэкономить на ее масштабировании. Почему именно она, ты сможешь понять самостоятельно, а пример масштабирования я покажу чуть позже.

Недостающие элементы постройки
Зарядник легко вписывается в обе схемы, места для него достаточно, и даже эстетика почти не страдает от его установки.
Отдельный сундук для удочек вообще не нужен, их можно брать из того же сундука, в который складывается дроп, но для этого программу придется слегка подправить. Тут следует помнить, что робот без контроллера инвентаря неспособен менять удочку, поэтому и сундук ему не нужен. А робот с контроллером способен не только заменить сломанную удочку, но и выбрать ее из сундука среди других предметов.
Нужна ли воронка в моей схеме, ты и сам разберешься. Становись вплотную к блоку воды, дай роботу удочку и запускай программу. Все, что выпадет мимо, окажется в твоем инвентаре. Но я уверен: ничего кроме шариков опыта ты не поймаешь.
Чтобы лучше понять роль воронок, следует провести ряд экспериментов с немного измененной оригинальной схемой. Если тебя интересуют выводы, то в схеме Asior'а воронки под стеной вообще не работают и вероятнее всего являются атавизмом его прошлых схем. Воронка на стене под роботом довольно часто что-то ловит, но немного изменив схему, от нее тоже можно безболезненно избавиться. И даже нужно, т. к. в данной схеме сброшенный роботом дроп долго висит над воронкой, удерживаемый горящим редстоуном.
Если тебя интересует тема воронок, можешь задать мне вопрос. Возможно, я напишу о них в следующем посте. Набросок текста имеется, но интерес к воронкам я потерял, т. к. уже нашел постройку лучше исходной, и воронки оказались не востребованы.

Рыбный завод
Попробуем решить предельную задачу: разместить максимальное количество ферм в некотором объеме.
Наши текущие фермы умещаются в объеме 3x5x3, причем при взгляде сверху они имеют вид креста. Такие конструкции часто размещают в шахматном или подобном ему порядке, но главным недостатком такого размещения будет сложный обход роботов для сбора дропа. Вряд ли ты будешь обходишь их сам, но и роботу-носильщику тоже придется задать сложный маршрут. Поищем другие варианты. Например, просто поставим фермы вплотную друг к другу.
blogentry-13296-0-16987800-1453837669_thumb.png
При взгляде сверху очень заметно повторение смежных блоков. Два блока, держащие крючки, можно заменить одним. А от забора между фермами можно вообще избавиться.
blogentry-13296-0-90475400-1453837672_thumb.pngblogentry-13296-0-13157400-1453837679_thumb.png
Мы немного уменьшили площадь, занимаемую фермой, при этом увеличив ее производительность в два раза. И даже сэкономили на зарядниках, подпитывая одним сразу два робота. Зарядники можно включить сигналом уже имеющейся редстоун-платы в роботе. Пол под роботами уберем для прохода робота-носильщика. Сундуки в этой схеме не нужны, как и большинство компонент роботов. Останется лишь процессор, планка памяти, EEPROM, редстоун- и сетевая карта, да один апргейд инвентаря. Даже контроллер инвентаря не потребуется.
Можно ли здесь применить схему подводного лова? Сложно, т. к. редстоун соседних блоков замыкается, и сигнал отдельных мини-ферм становится общим. Но можно использовать цветные провода из RedLogic, они не соединяются друг с другом и не смешивают сигнал. Как это сделать, ты и сам разберешься.
Дальнейшее расширение фермы и надстройка второго этажа тоже не вызывает сложностей.
Конечно, для полноценного завода обязателен робот-носильщик и желателен центральный компьютер. Без мощной системы хранения тоже не обойтись.

Результат: мы нашли легко масштабируемую и при этом даже более дешевую схему с минимальным размером ячейки 1x4x3.


Итог
В результате оптимизации получились две очень компактные и при этом красивые схемы, умещающиеся в объеме 3x5x3. Обе они радуют глаз, сохраняют место для прохода и строятся гораздо быстрее схем Asior'а. По моим тестам работают они не хуже исходных, а схема с нижним размещением робота теоретически может работать даже чуть быстрее, но для этого надо немного подправить задержку. Программу придется править в любом случае, т. к. изменилась сторона приема роботом сигнала и сброса дропа. Получение удочек из сундука следует выполнять контроллером инвентаря.
[Схема №1]blogentry-13296-0-04147900-1453837663_thumb.png
[Схема №2]blogentry-13296-0-65112200-1453837665_thumb.png
Отличия построек незначительны.
В первом не требуется тянуть редстоун, а робот может использовать для зарядки солнечную панель.
Второй вариант может оказаться более быстрым, но для проверки этого придется переписать код, отвечающий за работу с датчиком. В остальном – одни недостатки: робот от солнечной панели не работает, редстоун дотягивается, но некрасиво, или же требуются провода RedLogic. И для компактного масштабирования потребуются цветные провода того же RedLogic. Кусок красного провода на правом столбе использован для симметрии блока воды, его можно заменить табличкой или стеклом.
Место для зарядника имеется в обеих схемах, даже эстетика не сильно пострадает от его установки.

Бонус
Стать рыбным магнатом теперь стало проще. С незначительной доработкой схема легко масштабируется во всех измерениях, позволяя исключить смежные блоки и за счет этого в идеале получить ячейку с размером 1x4x3. Сколько их можно скрыть в одном чанке под землей, можешь сам посчитать. Но будь осторожен, брат: OKA следит за тобой и является органом, способным превратить твой приват в радиоактивный пепел.

А теперь тесты!
Устанавливай программу Asior'а, затем в зависимости от выбранной схемы настраивай в программе сторону, с которой расположен сигнал редстоуна, а также сундук для дропа. И получение удочек из того же сундука тоже придется написать. Главное, что интересовало в тестах меня: как часто происходят сбои заброса удочки, как часто вытягивается пустой крючок, и каков диапазон времени ожидания. Для этого придется добавить в программу соответствующие счетчики. Они помогут выявить неправильную работу либо программы, либо общей схемы. Может, крючок удочки за что-то цепляется. Может, дроп не доходит до инвентаря робота. Может, времени ожидания недостаточно.
Что именно нужно изменить в программе, пока не скажу, и так уже много текста, но ты ж программист, брат! Может, и Asior что напишет, он шустрее меня.

Не прощаюсь. Напоследок перефразирую Asior'а:
Грызи знания, брат. В них сила.

  • Like 1


1 комментарий


Рекомендованные комментарии

Интересненько, а я и не знал, что блоки стекла у датчика считаются как пустота. Хорошая статья. Придется маленько подправить программу, чтоб народ не перелопачивал весь код, а поменял только пару значений, но это позже немного.

Поделиться комментарием


Ссылка на комментарий

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
×