serafim
-
Публикации
367 -
Зарегистрирован
-
Посещение
-
Победитель дней
46
Сообщения, опубликованные пользователем serafim
-
-
27 минут назад, van2614 сказал:Как только он заходит в чанк, где никого нет сразу разворачивается
Похоже что сервер грузит меньше чанков чем хотелось бы, отсюда и застревания
Скрытый текстКоличество активных чанков вокруг игрока в одиночной игре определяется дальностью прорисовки:
от 25 на минимальной (2 чанка) до 4225 на максимальной (32 чанка).
В многопользовательском режиме чанки по умолчанию загружаются в радиусе 10 от игрока (21*21 чанк).
Радиус может быть сконфигурирован от 2 до 16, в зависимости от мощности оборудования и скорости подключения
-
7 часов назад, van2614 сказал:Изменил 10 на 100 на 435 строке. Перестал ложно возвращаться с непреодолимым препятствием. Играю на сервере и думаю, что дело в лагах.
Я рад что это помогло, и то что ты поделился решением с остальными, но думаю не всё так просто.
Робот это часть сервера, если сервер лагает (пропускает тики) , то и робот тоже.
То что робот выполняется на сервере можно заметить дав ему чанк-лоадер, робот будет работать и без присутствия игрока.
@van2614 Если не сложно, можешь поменять значение с 10 на 1 и понаблюдать куда именно он там упирается,
скриншот приветствуется
-
4 минуты назад, eu_tomat сказал:робот железной киркой может добыть не 251 блок, а в среднем 2510 блоков
Уф, это прям плюс минус километр, так робот никуда не доедет
5 минут назад, eu_tomat сказал:Но на практике, я думаю, это не играет особой роли. Когда прочность инструмента высока, расхождение в единицу прочности не будет фатальным. А по мере износа инструмента точность определения остаточной прочности будет увеличиваться.
А вот эта идея интересная
Вместо очень примерных замеров, можно сделать "режим паника"
Сначала делать замер износа инструмента только в начале и в конце линии, и в случае износа меньше определённого значения (например 20%) проверять износ при каждом движении, да это не так эффективно, но робот точно не застрянет
-
21 час назад, eu_tomat сказал:робот изнашивает инструмент не при каждом использовании, а с некоторой вероятностью, определённой в файле конфигурации OpenComputers
вот этот конфиг по умолчанию
Скрытый текст# Степень разрушения предметов при использовании их роботами. Значение
# 1 означает, что они ломаются с той же скоростью, что и при использовании
# игроком. 0 означает, что инструменты не ломаются вообще.
# Этот параметр влияет только на те инструменты, которые можно сломать.
itemDamageRate=0.1Игрок расходует кирку со значением 1 а вот робот 0,1
Например прочность железной кирки = 251, игрок сломает 251 блок, а вот робот по замерам может и 500 блоков сломать
Видимо придётся делать примерный замер на сколько расходуется инструмент за удар, так как делал doob
-
4 минуты назад, eu_tomat сказал:вызывать robot.durability() следует как можно реже, самостоятельно довычисляя рабочее значение остатка прочности. Это позволит получить выигрыш во времени около 2-3%
да, вариант неплохой
5 минут назад, eu_tomat сказал:Остаток прочности, выраженный в гарантированном количестве оставшихся использований, можно напрямую сравнивать с объёмом работы
Я пока не могу собраться с мыслями как это сделать
значение прочности вида 0,950 хотел перевести в количество блоков, которое осталось кирке копать
но вполне возможно это неверный подход
-
23 минуты назад, eu_tomat сказал:Как будет? Пусть скорость снижается, но упростится код?
пока без изменений, с частой проверкой прочности
if r.durability() == nil or r.durability() <= 0.03 then
А вообще протестирую, какой вариант лучше будет, но судя по расчётам то без изменений
23 минуты назад, eu_tomat сказал:почему константа 100 захардкожена? Разве она не должна зависеть от используемого инструмента?
if r.durability() == nil or 100*r.durability() <= length*3+length then
robot.durability() возвращает дробное значение от 1 до 0 в виде 0,950 , 100 - это округление к 95 (возможно надо до 1000)
length*3 длина линии Х в три ряда
+length запас прочности на манёвры, в принципе можно поставить 16 (тут надо тесты)
в общем это не финальный вариант для расчётов
-
попробуй это pastebin run vhg5uu1b download
-
В итоге пришёл к такому коду, для проверки хватит ли выкопать линию
Скрытый текстif r.durability() == nil or 100*r.durability() <= length*3+length then
38 минут назад, eu_tomat сказал:Для экономии времени на вызовах robot.durability() нет смысла дробить работу на крупные блоки. Запас в 48 блоков приведёт не к увеличению, а снижению скорости копки
Ну ок, пусть будет как есть
-
Если подумать, то весь объём мне не требуется вычислять, достаточно знать сколько блоков в линии (х),
и хватит ли инструменту прочности чтоб эту линию выкопать
к примеру:
x = 16
durability = 1500
w_r = x*3/durability+16
*3 потому что в одной линии 3 ряда блоков
+16 запас на манёвры, но лучше использовать значение (х) чтоб наверняка докопать
или сделать сравнение if durability > x*3+х then
-
сервер на стадии теста, играть не получится
и да, странно но ланчер не доступен
-
Проверил все правки, залил обнову, ссылка таже
Теперь алгоритм копания и движение немного эффективней работает
Бур в режиме 3х3 баги не вызывает, но движение робота под этот режим копания не заточен, робот будет делать лишние повороты
-
вроде всё отладил, завтра протестирую, если всё норм выложу
меня беспокоит ещё один момент, можно ещё немного ускорить копание убрав постоянную проверку инструмента
404 tool()
в гео-копалке @Doob использован интересный метод, работающий на тёмной магии
Скрытый текстlocal W_R = 0 -- скорость износа local delta = math.abs(X)+math.abs(Y)+math.abs(Z)+64 -- определить расстояние if robot.durability()/W_R < delta then -- если инструмент изношен
надо бы поколдовать на досуге
-
36 минут назад, eu_tomat сказал:Да, адаптивность полезна. Тут вопрос лишь в том, готов ли разработчик усложнять алгоритм ради коротких эпизодов перемещения к сундуку
тут кстати норм, копание и навигация раздельно работает (так робот не делает лишних поворотов, да и мне так проще)
-
12 минуты назад, eu_tomat сказал:Можно и так. Но тут свои сложности. Помню, у нас на серверах роботу было запрещено бить игрока. В этом случае такая проверка посчитает игрока за бедрок.
обнаружение только снизу, и только на стартовых координатах, и вообще нечего под роботом лазать.
в любом случае пока это самый безболезненный вариант
12 минуты назад, eu_tomat сказал:Хорошо было бы предупреждать игрока о высоте, на которой был обнаружен этот "бедрок".
в принципе можно
так то он в случае ошибки последние координаты принтит
-
4 минуты назад, eu_tomat сказал:если речь идёт о синем буре 3x3 из Gravitation Suite, то для него оптимален другой алгоритм копки
ох уж этот синий бур
но да, алгоритм копки именно под него ускорит скорость в разы, поидеи даже быстрее вайры будет копать
4 минуты назад, eu_tomat сказал:синий бур в роботе разряжается довольно быстро, и перемещения к сундуку становятся не такими и редкими.
робот тягает один запасной инструмент если он есть, так что не страшно
-
я думаю можно поступить проще, если условие if r.detectDown() and not r.swingDown() then срабатывает,
проверяем его три раза, и тогда окончательно делаем вывод что это бедрок.
в случае бура 3х3 оно выполнится только один раз, если внизу бедрок, то все три.
-
10 минут назад, eu_tomat сказал:что пещеры довольно редки, и почти всегда на пути робота находится блок....использованием detect(), ты обнаружишь, что его применение вредно
кстати да, в основном карьер заполнен блоками
для копания видимо нет смысла проверять наличие блока
а вот двигаясь к сундуку и обратно, робот идёт по пустоте, предпочтительней будет именно двигаться
6 минут назад, eu_tomat сказал:Видимо, надо сначала оптимизировать эту проверку...применять её только в случае, когда робот ушёл в шахту именно с этим видом бура
Меня так-то и вариант с невозможностью сломать блок под роботом вполне устраивал
В общем посмотрим
-
На данный момент определение бедрока сводится к одному условию
if r.detectDown() and not r.swingDown() then status("низ достигнут !") bedrock = true end
Если робот видит под собой блок, но не может его сломать, то это бедрок
Вообще работает безотказно на всём инструменте. как оказалось не на всём
Бур в режиме 3х3 не возвращает информацию, сломал он блок или нет в итоге беда,
робот считает что он уже возле бедрока, и это последний слой который нужно выкопать
Тут можно попробовать иной подход, после взмаха смотреть изменился ли инвентарь,
хотя бы просто ловить событие "inventory_changed"
В общем можно попробовать
-
58 минут назад, van2614 сказал:Упирался в стену пещеры. Причём в одну. Хотя пещеры было две
бур в режиме 3х3 ?
58 минут назад, van2614 сказал:Он в очередной раз вернулся с ошибкой. Потом я нажал Y и он почему то развернулся и сломал сундук. Было так
Вот, это уже лучше, развернулся потому что последний раз при копании карьера смотрел в сторону сундука
А вот сломать сундук он не должен был, возможно остаточная команда
Ок, так будет проще найти косяк
Или как вариант перед спуском разворачивается в сторону карьера,
в общем навигация на доработку, помойму это уже в 4й раз
-
1 час назад, eu_tomat сказал:Ты пришёл к этому решению интуитивно, или подсмотрел его в других программах?
подобная конструкция используется ещё с computercraft с черепашек
1 час назад, eu_tomat сказал:как мыслят программисты, применяющие такое решение. А их, похоже, большинство.
это из серии работает, не лезь
но это не значит что не нужно искать более оптимальный вариант
1 час назад, eu_tomat сказал:Идея поменять порядок операций движения робота и рубки блока кажется тебе контринтуитивной?
1 если робот не может идти вперёд ( значит что-то ему мешает (блок,моб,игрок) ) - атакуй
2 если робот не может атаковать или разрушить блок (значит перед роботом пусто) - идём вперёд
В первом случае робот будет максимально быстро идти, пока во что-то не упрётся, затем атакует и пойдёт дальше
Во втором случае робот будет махать киркой а затем идти, не важно есть там что-то или нет
Возможно верным решением будет смотреть если перед роботом что-то, а затем пробывать идти
чтото типа этого, а ещё лучше вывести функцию
while true do if r.detect() then r.swing() elseif r.forward() then xPos = xPos - 1 break end end
-
1
-
-
С рельсами пока не понятно
для теста извоял прогу
Скрытый текстlocal r = require("robot") local com = require("component") local gpu = com.gpu local place = 0 local broke = 0 os.execute("cls") while r.durability() do gpu.set(20,1,"поставил "..place) gpu.set(20,2,"сломал "..broke) if r.place() then place = place + 1 end if r.swing() then broke = broke + 1 end end
робот спокойно ломает рельсы, попробую поискать шахту
Бур в режиме 3х3 действительно вызывает баг, из за того что робот видит блок под собой, а его уже нет
исправлю изменив обнаружение бедрока
4 часа назад, van2614 сказал:Если натыкается на высокие пещеры.
По всей видимости нет улучшения парения
без него он не сможет двигается над пустотой
пожалуй добавлю в статус вместо "непреодолимое препятствие" что-то типа "не могу подняться"
а ещё лучше каким то образом проверять наличие улучшения
4 часа назад, van2614 сказал:вернулся на базу, сломал сундук
тут посложнее, бум искать
-
2 часа назад, van2614 сказал:Если натыкается на шахту ( с рельсами и прочее) часто возвращается на базу с ошибкой не разрушимый блок. Отправляешь обратно- копает дальше.
рельсы кстати в отладки не участвовали, возможно с ними есть подвох
2 часа назад, van2614 сказал:если дать бур, который копает 3х3. То через минут 10 возвращается. Мол все выкопано. Так же при копании киркой. Если натыкается на высокие пещеры.
тут явно подвох с определением бедрока
2 часа назад, van2614 сказал:Был баг какой то... вернулся на базу, сломал сундук и пишет нет сундука
а вот этого он делать не должен, похоже функция goto() шалит
@van2614 спосиб за инфу, попробую отловить баги
-
В 09.12.2020 в 17:28, ECS сказал:Нет его уже давно. API обновились, инсталлеры сдохли
На просторах github можно найти полную копию MineOS с приложениями, правда им 300 лет, но инфо панель там работает
Ссылку на репозиторий выкладывать не буду(если только очень надо) поскольку там всё давно устарело.
В 08.12.2020 в 10:30, kolya112 сказал:установщик сейчас не работает. Очень хочется использовать, юзал еще в 2018.
Сделал Fork (воскресить приложение для MineOS обращайтесь к @ECS)
отвязал от MineOS(по другому никак), также тут нет двойной буферизации,
выпилил кучу посторонних библиотек, оставив прежний функционал
Скрытый текст
Чтобы скачать нужна интернет карта
установка pastebin run 9fYvnz1L download
В папке Pages будут страницы для настройки в виде текстовых документов
запускать набрав info
добавлен пример отрисовки случайно-сгенерированной картинки test_image
Скрытый текстlocal image = require("image") local gpu = require("component").gpu os.execute("cls") --создаём картинку из случайных символов local img = image.create(10, 10, nil, nil, nil, nil, true) image.save("1.pic",img) --отрисовываем созданую картинку local picture = image.load("1.pic") image.draw(1, 2, picture) gpu.setBackground(0x000000) gpu.setForeground(0xFFFFFF)
создавать картинки с помощью этой проги https://github.com/IgorTimofeev/OCIFImageConverter/releases/tag/1.0.0
Чтобы добавить картинку, в папке Pages, в текстовых страницах пишем <image>1.pic</image>
Тег <image>Путь к картинке</image>
Также в текст добавляем пустые строки, столько, сколько занимает картинка,
например 1.pic занимает 10 строк или получим пропуски отрисовки заполненные текстом
Скрытый текст
-
Только что, eu_tomat сказал:это какой-то трудновоспроизводимый глюк? Это проверялось в сигнле или на сервере?
по видимому глюк
в сингле

quarry карьер
в Роботы
Опубликовано:
В принципе можно добавить в код, но не знаю насколько полезна будит эта инфа