HeroBrine1st
-
Публикации
134 -
Зарегистрирован
-
Посещение
-
Победитель дней
21
Сообщения, опубликованные пользователем HeroBrine1st
-
-
При чем тут контроллер, если это метод робота?Я проверял, не работает.
-
Так как неверный индекс слота возвращает ошибку, то есть способ получить размер инвентаря робота и без контроллера. Достаточно обработать ошибку (предполагается, что хотя бы один апгрейд инвентаря есть по определению и этот момент мы не проверяем):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-й строчке, а для чайников еще и отдельное приложение предлагается скачать с сайта для редактирования.
Ты бы, наверно, да и не только ты, на стуле на околоземную орбиту улетел тотчас же

Если бы прожку сделали, я б скачал, отредачил. За методтполучения размера инвентаря без контроллера спасибо.
-
Не понял, почему нельзя использовать robot.inventorySize(), а в общем, программа простая, даже удивительно, как она может что-то копать.Можно сделать еще проще, засунуть все в EEPROM, но все-таки эффективность сомнительная, обычный карьер намного лучше.
Потому что на сервере, на котором я играю, запрещен контроллер инвентаря, и я решил сделать прожку без него, ибо аналоги требуют контроллер инвентаря
-
Хорошо, что проги пишутся. Я так прошерстил этот топик немного, есть непонятки.
Какой костыльный костыль зафигачил. Почему нельзя перезаписать переменную с таблицей этих действий? Так же гораздо проще.
Корпус третьего уровня нужен, да. Процессор? Там второго или даже первого уровня хватит.
Ещё есть кнопка сверху для списков. Нумерованный и с маркерами. Не нужно выдумывать шедевры. Какой-то шрифт интересный тоже.
Наконец, не понял, в чём заключается продвинутость майнера. Непродвинутый от Тоторика (рекурсивник который) как-то выглядит поинтереснее. Но, надеюсь, в целом программа заявленной цели - копать дыру - соответствует, поэтому в код лезть не буду.
Я не имею доступа к переменной, поэтому спасает только ребут. А выкладывать прогу на гитхаб, знаете ли, плагиатом называется.
А шрифт и отсутствие списков из-за того, что я сначала написал в группу вк, а оттуда потом скопировал и вставил сюда
А, да. Его продвинутость - не сбиваемость. Есть защита от дурака, поэтому он настолько продвинутый. И он походу не ломает зарядник, я это не тестил, но предусмотрел.
Насчет процессора - на моей конфигурации там сложность 31/32, все из-за инвентарей и батареек.
-
Делал для себя - сделал почти эталон).
Робот копает шахту НЕ по прямой, часто делает круги (ибо рандом), но не тупит. Поворот каждые 10 блоков, настраивается. Как только робот обнаруживает, что последний слот занят (а поскольку размер инвентаря можно узнать только через контроллер инвентаря, вам надо самим его указать, это все в переменной, почему в переменной - объясню позже), он возвращается на базу (есть защита от дурака - робота с пути не сломить) и выгружает все в сундук под ним, потом ждет полной зарядки и перезагружается. Перезагрузка для освобождения переменной записи движений робота, поэтому надо ставить программу в авторан, по этой же причине все параметры программы в переменных.
Когда ставите робота, сундук ставьте под робота, сбоку зарядное устройство (желательно справа, меньше шанс что робот сломает зарядник, хотя я это тоже предусмотрел), зарядник запитываете редстоуном и энергией.Установка:1. Устанавливаете программную навигацию для робота - pastebin get -f Hb32aQeR /lib/robot.lua (http://computercraft.ru/topic/1129-programmnaia-navigatciia-dlia-robota/)2. Устанавливаете саму программу - pastebin get -f PZGzqbdk /autorun.lua3.Заходите в код, ищете 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
-
-
Предложу более усовершенствованный способ возвращения назад. Очень полезен для автономных роботов-шахтеров, ибо робот возвращается передом и ломает блоки перед собой.
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() -
Господа люди умные, подскажите смертному простому косяк его
в зачатке программы при нажатии на кнопки изменяется переменная 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)Сначала измени текст на самом элементе, а потом перерисовывай. когда ты меняешь начальную переменную, ты меняешь только ее значение, у других переменных значение не меняется.
-
У меня, кстати, есть нерабочий антивирус, но логически он работать должен.
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. и это должно работать.
-
Предлагаю сделать в биосе закачивание всего нужного в /tmp и загрузку с него. я кстати уже потихоньку начинаю этим заниматься
-
когда-то вроде бы был флаг в конфигфайле на очистку /tmp/
при мягкой перезагрузке
-
Так можно русские буквы вообще не обрабатывать - нету русских букс синтаксисе lua.
"Вот это относится к синтаксису". строки ведь относятся к синтаксису, а что внутри них может вызвать ошибку string.find.
-
Еще я видел в plan9k computer.setArchitecture("Lua 5.3") или подобное. не факт что сработает, но поройся в исходниках plan9k
Это так, если надо программно.
-
1
-
-
Читай правила.
3.1.10 Запрещено создавать дубли тем.
Если вы случайно создали дубль темы – воспользуйтесь кнопкой "Жалоба" под сообщением и попросите удалить лишнюю тему.
А вот за это спасибо, я думал что темы не удаляются
-

Похоже ему лень элементарно изучить луа, да и вообщем учится.
Я пока не видел людей которые начинали изучать с конца и доходили до начала.
Вот тому доказательство.
Нужно использовать полный url, https://yandex.ru/
request вторым аргументов возвращает ошибку что ya.ru invalid address.

у меня такая методика изучения языков,поэтому учебники не годятся. Сначала синтаксис, потом самая базовая функция, потом обширный проект и через него я начинаю учить язык полностью, возникает много вопросов и главное - практика
И в какой раз говорю, что бы я не делал оно возвращает nil. Сверху мне наконец ответили, поэтому вопрос закрыт
И поскольку мой перфекционист страдает, подскажу, нет слова вообщем, есть только "в общем"
-
response метод возвращает nil и на гитхабе, и на яндексе, и в гугле, везде просто.
код наипростейший - local a = b.request("ya.ru")
local c = a.response(), b - component.internet
длины чанков получаются прекрасно через string.len, а общая длина до загрузки никак
-
Ну конечно. В чудном английском языке слово называется response.
в любом случае оно возвращает вместо таблицы пустую таблицу {}. пробовал даже с гитхаба скачать, который 100% возвращает content-length, но нет.
-
Можно, но содержимое заголовка формируется сервером, и если он не захочет, то 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. код вроде у тебя скопировал. как буква поменялась - понятия не имею, я скопировал метод и перенес в переменную ведь
-
Можно, но содержимое заголовка формируется сервером, и если он не захочет, то 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 -
Можно, но содержимое заголовка формируется сервером, и если он не захочет, то 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 - время?
-
По идее, для того, чтобы узнать размер загружаемого файла, надо смотреть значение хидера Content-Length в HTTP запросе.
Как это сделать?
Думаю, можно воспользоваться методом response():number, string, table на объекте HTTP-запроса. Он как раз должен вернуть таблицу хидеров в конце.
то есть responce.number() возвратил эти три значения, и что мне делать с таблицей то?
-
А по байту-то скачивать зачем? Интернет слишком быстрый?
но ведь если скачивать по чанкам, то скачивается пустой текст вида "", и только потом по чанкам весь текст
-
Короче мне надо сделать скачку файлов как в любом загрузчике для виндовса - итоговый размер файла, название и сколько осталось до конца скачивания. костыли через internet.connect не работают.
можно узнать скорость интернета через скачивание файла весом в 1024 байт, но нельзя узнать размер файла.
А я прямо горю желанием сделать диспетчер загрузок, ведь мой браузер как-то видит размер файла до закачки
-
...
зато ОЗУ не тратится) serilization в озу много весит
-
Неординарное решение.Команда date +%s возвращает обычное unix время компа с 1973. Просто в майнкрафте минута за час. Вот оно и насчитало уже до 1990 года. Можно аптайм сервера посчитать.Главное чтобы автор не пофиксил lastModified('filename') до чтения времени майнкрафт. Вообще его бы попросить командочку сделать возвращать время машины, а не игровое время.и не пофиксит. эта функция является C функцией машины. проще говоря, время lastModified берет не с потолка, а читает через C библиотеку время создания файла и отправляет в lua

Продвинутый робот-шахтер по мотивам астрономического шахтера из GalactiCraft 3
в Роботы
Опубликовано:
Возможно на сервере, на котором я играю и тестирую эту прожку, это не работает. Главное - робот копает неограниченное расстояние (из-за кругов по уже вырытым туннелям), а значит ресурсы станут практически бесконечными