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

serafim

Пользователи
  • Публикации

    367
  • Зарегистрирован

  • Посещение

  • Победитель дней

    46

Сообщения, опубликованные пользователем serafim


  1. 8 минут назад, eu_tomat сказал:

    интересно было бы посмотреть, что именно там возвращают robot.forward() и robot.swing(). В случае неудачи обычно возвращается ещё и её причина.

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


  2. 27 минут назад, van2614 сказал:

    Как только он заходит в чанк, где никого нет сразу разворачивается

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

    Выдержка из вики

    Скрытый текст

    Количество активных чанков вокруг игрока в одиночной игре определяется дальностью прорисовки:

    от 25 на минимальной (2 чанка) до 4225 на максимальной (32 чанка).

    В многопользовательском режиме чанки по умолчанию загружаются в радиусе 10 от игрока (21*21 чанк).

    Радиус может быть сконфигурирован от 2 до 16, в зависимости от мощности оборудования и скорости подключения

     


  3. 7 часов назад, van2614 сказал:

    Изменил 10 на 100 на 435 строке. Перестал ложно возвращаться с непреодолимым препятствием. Играю на сервере и думаю, что дело в лагах.

    Я рад что это помогло, и то что ты поделился решением с остальными, но думаю не всё так просто.

    Робот это часть сервера, если сервер лагает (пропускает тики) , то и робот тоже.

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

     

    @van2614 Если не сложно, можешь поменять значение с 10 на 1 и понаблюдать куда именно он там упирается,

    скриншот приветствуется


  4. 4 минуты назад, eu_tomat сказал:

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

    Уф, это прям плюс минус километр, так робот никуда не доедет

    5 минут назад, eu_tomat сказал:

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

    А вот эта идея интересная

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

    Сначала делать замер износа инструмента только в начале и в конце линии, и в случае износа меньше определённого значения (например 20%) проверять износ при каждом движении, да это не так эффективно, но робот точно не застрянет


  5. 21 час назад, eu_tomat сказал:

    робот изнашивает инструмент не при каждом использовании, а с некоторой вероятностью, определённой в файле конфигурации OpenComputers

    вот этот конфиг по умолчанию

    Скрытый текст

    # Степень разрушения предметов при использовании их роботами. Значение
    # 1 означает, что они ломаются с той же скоростью, что и при использовании
    # игроком. 0 означает, что инструменты не ломаются вообще. 
    # Этот параметр влияет только на те инструменты, которые можно сломать.
    itemDamageRate=0.1

    Игрок расходует кирку со значением 1 а вот робот 0,1

    Например прочность железной кирки = 251, игрок сломает 251 блок, а вот робот по замерам может и 500 блоков сломать

    Видимо придётся делать примерный замер на сколько расходуется инструмент за удар, так как делал doob


  6. 4 минуты назад, eu_tomat сказал:

    вызывать robot.durability() следует как можно реже, самостоятельно довычисляя рабочее значение остатка прочности. Это позволит получить выигрыш во времени около 2-3%

    да, вариант неплохой

    5 минут назад, eu_tomat сказал:

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

    Я пока не могу собраться с мыслями как это сделать

    значение прочности вида 0,950 хотел перевести в количество блоков, которое осталось кирке копать

    но вполне возможно это неверный подход


  7. 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 (тут надо тесты)

    в общем это не финальный вариант для расчётов


  8. В итоге пришёл к такому коду, для проверки хватит ли выкопать линию

    Скрытый текст
    
    if r.durability() == nil or 100*r.durability() <= length*3+length then

     

     

    38 минут назад, eu_tomat сказал:

    Для экономии времени на вызовах robot.durability() нет смысла дробить работу на крупные блоки. Запас в 48 блоков приведёт не к увеличению, а снижению скорости копки

    Ну ок, пусть будет как есть

     


  9. Если подумать, то весь объём мне не требуется вычислять, достаточно знать сколько блоков в линии (х),

    и хватит ли инструменту прочности чтоб эту линию выкопать

     

    к примеру:

    x = 16

    durability = 1500

    w_r = x*3/durability+16

    *3 потому что в одной линии 3 ряда блоков

    +16 запас на манёвры, но лучше использовать значение (х) чтоб наверняка докопать

     

    или сделать сравнение if durability > x*3+х then


  10. Проверил все правки, залил обнову, ссылка таже

    Теперь алгоритм копания и движение немного эффективней работает

    Бур в режиме 3х3 баги не вызывает, но движение робота под этот режим копания не заточен, робот будет делать лишние повороты


  11. вроде всё отладил, завтра протестирую, если всё норм выложу

     

    меня беспокоит ещё один момент, можно ещё немного ускорить копание убрав постоянную проверку инструмента

    404 tool()

    в гео-копалке @Doob использован интересный метод, работающий на тёмной магии :D

    Скрытый текст
    
    local W_R = 0 -- скорость износа
    local delta = math.abs(X)+math.abs(Y)+math.abs(Z)+64 -- определить расстояние
    if robot.durability()/W_R < delta then -- если инструмент изношен

     

    надо бы поколдовать на досуге


  12. 36 минут назад, eu_tomat сказал:

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

    тут кстати норм, копание и навигация раздельно работает (так робот не делает лишних поворотов, да и мне так проще)


  13. 12 минуты назад, eu_tomat сказал:

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

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

    в любом случае пока это самый безболезненный вариант

    12 минуты назад, eu_tomat сказал:

    Хорошо было бы предупреждать игрока о высоте, на которой был обнаружен этот "бедрок".

    в принципе можно

    так то он в случае ошибки последние координаты принтит


  14. 4 минуты назад, eu_tomat сказал:

    если речь идёт о синем буре 3x3 из Gravitation Suite, то для него оптимален другой алгоритм копки

    ох уж этот синий бур :D

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

    4 минуты назад, eu_tomat сказал:

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

    робот тягает один запасной инструмент если он есть, так что не страшно


  15. я думаю можно поступить проще, если условие if r.detectDown() and not r.swingDown() then срабатывает,

    проверяем его три раза, и тогда окончательно делаем вывод что это бедрок.

    в случае бура 3х3 оно выполнится только один раз, если внизу бедрок, то все три.


  16. 10 минут назад, eu_tomat сказал:

    что пещеры довольно редки, и почти всегда на пути робота находится блок....использованием detect(), ты обнаружишь, что его применение вредно

    кстати да, в основном карьер заполнен блоками

    для копания видимо нет смысла проверять наличие блока

    а вот двигаясь к сундуку и обратно, робот идёт по пустоте, предпочтительней будет именно двигаться

    6 минут назад, eu_tomat сказал:

    Видимо, надо сначала оптимизировать эту проверку...применять её только в случае, когда робот ушёл в шахту именно с этим видом бура

    Меня так-то и вариант с невозможностью сломать блок под роботом вполне устраивал

    В общем посмотрим


  17. На данный момент определение бедрока сводится к одному условию

    if r.detectDown() and not r.swingDown() then
      status("низ достигнут !")
      bedrock = true
    end

    Если робот видит под собой блок, но не может его сломать, то это бедрок

    Вообще работает безотказно на всём инструменте. как оказалось не на всём:diablo:

    Бур в режиме 3х3 не возвращает информацию, сломал он блок или нет в итоге беда,

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

     

    Тут можно попробовать иной подход, после взмаха смотреть изменился ли инвентарь,

    хотя бы просто ловить событие "inventory_changed"

    В общем можно попробовать


  18. 58 минут назад, van2614 сказал:

    Упирался в стену пещеры. Причём в одну. Хотя пещеры было две

    бур в режиме 3х3 ?

     

    58 минут назад, van2614 сказал:

    Он в очередной раз вернулся с ошибкой. Потом я нажал Y и он почему то развернулся и сломал сундук. Было так

    Вот, это уже лучше, развернулся потому что последний раз при копании карьера смотрел в сторону сундука

    А вот сломать сундук он не должен был, возможно остаточная команда

    Ок, так будет проще найти косяк

     

    Или как вариант перед спуском разворачивается в сторону карьера,

    в общем навигация на доработку, помойму это уже в 4й раз :)


  19. 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

  20. С рельсами пока не понятно

    для теста извоял прогу

    Скрытый текст
    
    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

     

    S8tZ0bh.png  робот спокойно ломает рельсы, попробую поискать шахту

     

    Бур в режиме 3х3 действительно вызывает баг, из за того что робот видит блок под собой, а его уже нет

    исправлю изменив обнаружение бедрока

     

    4 часа назад, van2614 сказал:

    Если натыкается на высокие пещеры.

    По всей видимости нет улучшения парения qFuOlvy.png без него он не сможет двигается над пустотой

    пожалуй добавлю в статус вместо "непреодолимое препятствие" что-то типа "не могу подняться"

    а ещё лучше каким то образом проверять наличие улучшения

     

    4 часа назад, van2614 сказал:

    вернулся на базу, сломал сундук

    тут посложнее, бум искать


  21.  

    2 часа назад, van2614 сказал:

    Если натыкается на шахту ( с рельсами и прочее) часто возвращается на базу с ошибкой не разрушимый блок. Отправляешь обратно- копает дальше.

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

     

    2 часа назад, van2614 сказал:

    если дать бур, который копает 3х3. То через минут 10 возвращается. Мол все выкопано. Так же при копании киркой. Если натыкается на высокие пещеры.

    тут явно подвох с определением бедрока

     

    2 часа назад, van2614 сказал:

    Был баг какой то... вернулся на базу, сломал сундук и пишет нет сундука

     а вот этого он делать не должен, похоже функция goto() шалит

     

    @van2614 спосиб за инфу, попробую отловить баги


  22. В 09.12.2020 в 17:28, ECS сказал:

    Нет его уже давно. API обновились, инсталлеры сдохли

    На просторах github можно найти полную копию MineOS с приложениями, правда им 300 лет, но инфо панель там работает

    Ссылку на репозиторий выкладывать не буду(если только очень надо) поскольку там всё давно устарело.

     

    В 08.12.2020 в 10:30, kolya112 сказал:

    установщик сейчас не работает. Очень хочется использовать, юзал еще в 2018.

    Сделал Fork (воскресить приложение для MineOS обращайтесь к @ECS)

    отвязал от MineOS(по другому никак), также тут нет двойной буферизации,

    выпилил кучу посторонних библиотек, оставив прежний функционал

    Скрытый текст

    i3ws087.png

     

    Чтобы скачать нужна интернет карта 5A4ZDss.png  установка   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 строк или получим пропуски отрисовки заполненные текстом

    Скрытый текст

    54KPUD8.png

     

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