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

HeroBrine1st

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

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

  • Посещение

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

    21

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


  1. В десятках программ используется этот метод. С чего б ему не работать?

    Возможно на сервере, на котором я играю и тестирую эту прожку, это не работает. Главное - робот копает неограниченное расстояние (из-за кругов по уже вырытым туннелям), а значит ресурсы станут практически бесконечными


  2. Так как неверный индекс слота возвращает ошибку, то есть способ получить размер инвентаря робота и без контроллера. Достаточно обработать ошибку (предполагается, что хотя бы один апгрейд инвентаря есть по определению и этот момент мы не проверяем):

    local robot = require("robot")
    local invSize = 16
    
    for i = 32, 128, 16 do
      stat, _ = pcall(robot.select, i)
      if not stat then 
        invSize = i - 16
        robot.select(1) 
        break
      end
    end
    
    print(invSize)

     

    И так как любая программа, это, как правило, диалог человека с компуктером, то "частоту зигзагов" черепашки лучше и проще, наверное, спросить у пользователя, а именно при старте программы перед копкой ямки. Представь себе ситуацию, что разрабы из Близзард или Юбисофт говорят тебе, что мол если хотите поиграть за расу гномов или берсерков с сектоидами, "лезете в код" и меняете  такой-то и такой-то параметр на 5067-й и 8965-й строчке, а для чайников еще и отдельное приложение предлагается скачать с сайта для редактирования.

    Ты бы, наверно, да и не только ты, на стуле на околоземную орбиту улетел тотчас же :)

     

    Если бы прожку сделали, я б скачал, отредачил. За методтполучения размера инвентаря без контроллера спасибо.


  3. Не понял, почему нельзя использовать robot.inventorySize(), а в общем, программа простая, даже удивительно, как она может что-то копать.

    Можно сделать еще проще, засунуть все в EEPROM, но все-таки эффективность сомнительная, обычный карьер намного лучше.

     

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


  4. Хорошо, что проги пишутся. Я так прошерстил этот топик немного, есть непонятки.

     

     

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

     

     

    Корпус третьего уровня нужен, да. Процессор? Там второго или даже первого уровня хватит.

     

    Ещё есть кнопка сверху для списков. Нумерованный и с маркерами. Не нужно выдумывать шедевры. Какой-то шрифт интересный тоже.

     

    Наконец, не понял, в чём заключается продвинутость майнера. Непродвинутый от Тоторика (рекурсивник который) как-то выглядит поинтереснее. Но, надеюсь, в целом программа заявленной цели - копать дыру - соответствует, поэтому в код лезть не буду.

     

     

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

    А шрифт и отсутствие списков из-за того, что я сначала написал в группу вк, а оттуда потом скопировал и вставил сюда

     

    А, да. Его продвинутость - не сбиваемость. Есть защита от дурака, поэтому он настолько продвинутый. И он походу не ломает зарядник, я это не тестил, но предусмотрел.

    Насчет процессора - на моей конфигурации там сложность 31/32, все из-за инвентарей и батареек.


  5. Делал для себя - сделал почти эталон).

     

    Робот копает шахту НЕ по прямой, часто делает круги (ибо рандом), но не тупит. Поворот каждые 10 блоков, настраивается. Как только робот обнаруживает, что последний слот занят (а поскольку размер инвентаря можно узнать только через контроллер инвентаря, вам надо самим его указать, это все в переменной, почему в переменной - объясню позже), он возвращается на базу (есть защита от дурака - робота с пути не сломить) и выгружает все в сундук под ним, потом ждет полной зарядки и перезагружается. Перезагрузка для освобождения переменной записи движений робота, поэтому надо ставить программу в авторан, по этой же причине все параметры программы в переменных.

     
    Когда ставите робота, сундук ставьте под робота, сбоку зарядное устройство (желательно справа, меньше шанс что робот сломает зарядник, хотя я это тоже предусмотрел), зарядник запитываете редстоуном и энергией.
     
    Установка:
    1. Устанавливаете программную навигацию для робота - pastebin get -f Hb32aQeR /lib/robot.lua (http://computercraft.ru/topic/1129-programmnaia-navigatciia-dlia-robota/)
    2. Устанавливаете саму программу - pastebin get -f PZGzqbdk /autorun.lua 
    3.Заходите в код, ищете 2 переменные - OTMI и inventorySize. Первая переменная отвечает за поворот каждые n блоков. Вместо n подставляется значение этой переменной. Не рекомендую ставить больше 25. По умолчанию 10. inventorySize отвечает за количество слотов в инвентаре. Если вам лень считать, берете количество улучшений инвентаря и умножаете их число на 16, полученное значение подставляете в переменную inventorySize.
    3.1. Для чайников в lua:
    Переменные OTMI и inventorySize находятся на 14й и 15й строке.
    Если вы снова не поняли, куда подставлять, подставляйте числа вместо чисел, которые стояли до вашей настройки
    4. Перезагружаете (кирку обязательно, хотя лучше молот из тинкера из какого нибудь прочного материала, например бедрокия (бедрокий из магических модов))
    5. Робот начинает копать.
     
    Что скажу по конфигурации:
     
    1. Чанклоадер ОБЯЗАТЕЛЬНО
    2.  Для установки чанклоадера нужен процессор 3го уровня, так что ставьте его
    3. ОЗУ на свое усмотрение, рекомендую 3го уровня
    4. как минимум 2 улучшения инвентаря
    5. батареек как можно больше
     
    Если отловите баг, напишите в комментарии.
    • Нравится 1

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

    local robot = require('robot')
    
    robot.setPath(true)
    
    --ваш код
    
    local path = robot.getPath()
     
    local invert = {
      ['F'] = 'forward',
      ['B'] = 'back',
      ['L'] = 'right',
      ['R'] = 'left',
      ['U'] = 'down',
      ['D'] = 'up'
    }
    
    robot.turnAround()
    
    for i = #path, 1, -1 do
    	robot.swing(3)
      os.execute('go '..invert[string.sub(path, i, i)])
    end
    
    robot.turnAround()
    

  7. Господа люди умные, подскажите смертному простому косяк его

    в зачатке программы при нажатии на кнопки изменяется переменная en

    эту переменную выводит Label1

    дабы выводил он верно, к каждой кнопке дополнительно вывесил Label1:redraw()

    но... все еще выводит 0

    где же тут косяк ? не заметил очевидную опечатку или не так понял синтаксис методов ?

     

    Осторожно! Крайняя упоротость!

     

     

    require("component").gpu.setResolution(60,50)
    forms=require("forms")
    forms.ignoreAll()
    
    Form1=forms.addForm()
    Form1.color=12566463
    Form1.border=1
    
    en = 0
    
    function Button1onClick(self, user)
     en = en - 1000000
     Label1:redraw()
    end
    
    Button1=Form1:addButton(13,12,"-1M",Button1onClick)
    Button1.color=7217965
    
    function Button2onClick(self, user)
     en = en - 100000
     Label1:redraw()
    end
    
    Button2=Form1:addButton(13,14,"-100К",Button2onClick)
    Button2.color=7217965
    
    function Button3onClick(self, user)
     en = en - 10000
     Label1:redraw()
    end
    
    Button3=Form1:addButton(13,16,"-10К",Button3onClick)
    Button3.color=7217965
    
    Label1=Form1:addLabel(24,14,en)
    Label1.centered=true
    Label1.color=984582
    Label1.autoSize=false
    Label1.fontColor=12779488
    Label1.W=10
    
    function Button4onClick(self, user)
     en = en + 1000000
     Label1:redraw()
    end
    
    Button4=Form1:addButton(35,12,"+1М",Button4onClick)
    Button4.color=8101979
    
    function Button5onClick(self, user)
     en = en + 100000
     Label1:redraw()
    end
    
    Button5=Form1:addButton(35,14,"+100к",Button5onClick)
    Button5.color=8101979
    
    function Button6onClick(self, user)
     en = en + 10000
     Label1:redraw()
    end
    
    Button6=Form1:addButton(35,16,"+10К",Button6onClick)
    Button6.color=8101979
    
    Label2=Form1:addLabel(10,9,"Выберите количество покупаемой энергии")
    Label2.color=10395294
    Label2.fontColor=0
    Label2.W=38
    Label2.border=4
    
    Button7=Form1:addButton(24,19,"Оплатить")
    Button7.fontColor=0
    Button7.color=14329120
    
    Label3=Form1:addLabel(10,24,"Проведите смарт-картой по считывателю")
    Label3.color=10395294
    Label3.fontColor=0
    Label3.W=37
    
    Label4=Form1:addLabel(26,26,"<<<<<<")
    Label4.color=10395294
    Label4.fontColor=0
    Label4.W=6
    
    Label5=Form1:addLabel(14,33,"Количество энергии в хранилище:")
    Label5.color=10395294
    Label5.fontColor=0
    Label5.W=31
    
    Label6=Form1:addLabel(24,36,"Label6")
    Label6.centered=true
    Label6.color=8060927
    Label6.autoSize=false
    Label6.fontColor=0
    Label6.W=10
    Label6.alignRight=true
    
    forms.run(Form1)
    

     

     

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


  8. У меня, кстати, есть нерабочий антивирус, но логически он работать должен.

    UPD: я когда-то всю его мощь подменил на вот этот код.. но я все= выложу

    local component = require("component")
    local computer = require("computer")
    local event = require("event")
    local ecs = require("ECSAPI")
    local w, h = component.gpu.getResolution()
    _G.accessEEPROM = false
    function startMonitoringEEPROM()
    	local eepromSet = package.loaded.component.eeprom.set
    	package.loaded.component.eeprom.set = function(string)
    		if not _G.accessEEPROM then
    			local oldPixels = ecs.rememberOldPixels(1,1,w,h)
    			ecs.error("EEPROM Flash aborted: permission denied")
    			ecs.drawOldPixels(oldPixels)
    			return false
    		end
    		return eepromSet(string)
    	end
    end
    function onComponentAvailableEEPROM(componentType)
    	if componentType == "eeprom" then
    		startMonitoringEEPROM()
    	end
    end
    event.listen("init",function()
    event.listen("component_available",onComponentAvailableEEPROM)
    startMonitoringEEPROM()
    end)
    

    Но алгоритм был такой:

     

    1. Прослушивание сигнала init

    2. запуск мониторинга компонентов

    3. при вызове eeprom.set подменить функцию load и либу component,затем вызвать в corountine код

    4. если подмененные функции находят участки кода,совпадающие с невирусным биосом (fs.open("/init.lua"), load(code,"=init") и подобное), создают ошибку No viruses, которая перехватывается corountine и возвращает false, "No viruses".

    5. если ошибка есть, прошить eeprom, иначе создать ошибку "Access denied: virus detected"

    Но алгоритм можноь улучшить на 4м этапе. при обнаружении участка кода, который не относится к вирусу и спокойно пытается запустить openos, создать сигнал "antivirus",*code*,"No viruses" и через corountine.running() и corountine.yeld(...,"No viruses") остановить выполнение кода. в итоге мы получаем антивирус, который проверяет код eeprom на вирусы.

     

    хотя если бы нам выдали функцию debug.setHook, антивирус был бы лучше - крюки прослушивали бы строки, которые вызывает программа, и если обнаруживают while true do или подобное, просто прерывают программу и создают ошибку Access denied: virus detected. и это должно работать.


  9. Читай правила.

    3.1.10 Запрещено создавать дубли тем.

    Если вы случайно создали дубль темы – воспользуйтесь кнопкой "Жалоба" под сообщением и попросите удалить лишнюю тему.

    А вот за это спасибо, я думал что темы не удаляются


  10. giphy.gif

     

    Похоже ему лень элементарно изучить луа, да и вообщем учится.

    Я пока не видел людей которые начинали изучать с конца и доходили до начала.

    Вот тому доказательство.

    Нужно использовать полный url, https://yandex.ru/

    request вторым аргументов возвращает ошибку что ya.ru invalid address.

     

     

    9f7ba23195904f4cb83f3511ac9045ea.png

     

    у меня такая методика изучения языков,поэтому учебники не годятся. Сначала синтаксис, потом самая базовая функция, потом обширный проект и через него я начинаю учить язык полностью, возникает много вопросов и главное - практика

     

    И в какой раз говорю, что бы я не делал оно возвращает nil. Сверху мне наконец ответили, поэтому вопрос закрыт

     

    И поскольку мой перфекционист страдает, подскажу, нет слова вообщем, есть только "в общем"


  11. response метод возвращает nil и на гитхабе, и на яндексе, и в гугле, везде просто.

     

    код наипростейший - local a = b.request("ya.ru")

    local c = a.response(), b - component.internet

     

    длины чанков получаются прекрасно через string.len, а общая длина до загрузки никак


  12. Ну конечно. В чудном английском языке слово называется response.

    в любом случае оно возвращает вместо таблицы пустую таблицу {}. пробовал даже с гитхаба скачать, который 100% возвращает content-length, но нет.


  13. Можно, но содержимое заголовка формируется сервером, и если он не захочет, то Content-Length не выдаст даже под пытками.

     

    Вот пример кода:

    com = require("component")
    net = com.internet
    
    req = net.request("https://ya.ru")
    print( ({req.response()})[3]['Content-Length'][1] )
    repeat s=req.read() if s then print( #s ) end until not s
    Выдаст общую длину, а потом длины чанков. Сумма длин чанков должна совпасть с длиной в заголовке.

    Но, например в заголовках ответа на запрос к "http://google.com"Content-Length отсутствует.

     

    И как это мешает?

     

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

     

    Не знаю, почему принимаются пустые чанки, но они влияют только на количество чанков, а в остальном никак не мешают. Считать количество чанков нет никакого смысла. Для оценки времени до окончания загрузки имеют значение только длины чанков, но...

     

    Мой тоже видит. Но не всегда. Если сервер не захочет, то и браузер будет в неведении до самого конца загрузки.

     

    ошибку нашел. response а не responce. код вроде у тебя скопировал. как буква поменялась - понятия не имею, я скопировал метод и перенес в переменную ведь


  14. Можно, но содержимое заголовка формируется сервером, и если он не захочет, то Content-Length не выдаст даже под пытками.

     

    Вот пример кода:

    com = require("component")
    net = com.internet
    
    req = net.request("https://ya.ru")
    print( ({req.response()})[3]['Content-Length'][1] )
    repeat s=req.read() if s then print( #s ) end until not s
    Выдаст общую длину, а потом длины чанков. Сумма длин чанков должна совпасть с длиной в заголовке.

    Но, например в заголовках ответа на запрос к "http://google.com"Content-Length отсутствует.

     

    И как это мешает?

     

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

     

    Не знаю, почему принимаются пустые чанки, но они влияют только на количество чанков, а в остальном никак не мешают. Считать количество чанков нет никакого смысла. Для оценки времени до окончания загрузки имеют значение только длины чанков, но...

     

    Мой тоже видит. Но не всегда. Если сервер не захочет, то и браузер будет в неведении до самого конца загрузки.

     

    пишет ошибку, что не может вызвать метод responce т.к. он nil. менять url пробовал, не помогает.

    com = require("component")
    net = com.internet
     
    req = net.request("https://pp.userapi.com/c638822/v638822414/2d563/6UNAy7oum-w.jpg") --первая встречная картинка, если че не реклама)
    print(req)
    responce = {req.responce()} 
    print(require("serialization").serialize(responce))
    os.sleep(1)
    repeat s=req.read() if s then print( #s ) end until not s
    

  15. Можно, но содержимое заголовка формируется сервером, и если он не захочет, то Content-Length не выдаст даже под пытками.

     

    Вот пример кода:

    com = require("component")
    net = com.internet
    
    req = net.request("https://ya.ru")
    print( ({req.response()})[3]['Content-Length'][1] )
    repeat s=req.read() if s then print( #s ) end until not s
    Выдаст общую длину, а потом длины чанков. Сумма длин чанков должна совпасть с длиной в заголовке.

    Но, например в заголовках ответа на запрос к "http://google.com"Content-Length отсутствует.

     

    И как это мешает?

     

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

     

    Не знаю, почему принимаются пустые чанки, но они влияют только на количество чанков, а в остальном никак не мешают. Считать количество чанков нет никакого смысла. Для оценки времени до окончания загрузки имеют значение только длины чанков, но...

     

    Мой тоже видит. Но не всегда. Если сервер не захочет, то и браузер будет в неведении до самого конца загрузки.

     

    то есть я должен вычитать длину чанков из общей длины чанков, и как эта длина закончится, то файл скачан, верно? и из-за пустых чанков мой браузер может ожидать столько времени до начала скачки что ли?

     

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

     

    Т.е. по формуле U = S/T, где U - скорость, S - длина чанка, а T - время?


  16. По идее, для того, чтобы узнать размер загружаемого файла, надо смотреть значение хидера Content-Length в HTTP запросе.

    Как это сделать?

    Думаю, можно воспользоваться методом response():number, string, table на объекте HTTP-запроса. Он как раз должен вернуть таблицу хидеров в конце.

    то есть responce.number() возвратил эти три значения, и что мне делать с таблицей то?


  17. Короче мне надо сделать скачку файлов как в любом загрузчике для виндовса - итоговый размер файла, название и сколько осталось до конца скачивания. костыли через internet.connect не работают.

     

    можно узнать скорость интернета через скачивание файла весом в 1024 байт, но нельзя узнать размер файла.

     

    А я прямо горю желанием сделать диспетчер загрузок, ведь мой браузер как-то видит размер файла до закачки

     

     


  18.  

    Неординарное решение.
    Команда date +%s возвращает обычное unix время компа с 1973. Просто в майнкрафте минута за час. Вот оно и насчитало уже до 1990 года. Можно аптайм сервера посчитать.

     

    Главное чтобы автор не пофиксил lastModified('filename') до чтения времени майнкрафт. Вообще его бы попросить командочку сделать возвращать время машины, а не игровое время.

     

    и не пофиксит. эта функция является C функцией машины. проще говоря, время lastModified берет не с потолка, а читает через C библиотеку время создания файла и отправляет в lua

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