Лидеры
Популярный контент
Показан контент с высокой репутацией 19.10.2019 во всех областях
-
5 балловНе фигачь строку по одному символу. Используй string.find, чтобы найти позицию последовательности смены цвета. Паттерн — "%[0x(%x%x%x%x%x%x)]". Вернёт позицию начала, конца и цвет. local unicode = require("unicode") local s = "test[0x123456]testtest[0x654321]spameggs" local pattern = "%[0x(%x%x%x%x%x%x)]" local begin = 1 local x, y = 1, 1 while true do local b, e, color = s:find(pattern, begin) local precedingString = s:sub(begin, b and (b - 1)) if precedingString then gpu.set(x, y, precedingString) x = x + unicode.wlen(precedingString) end if not color then break end gpu.setForeground(tonumber(color, 16)) begin = e + 1 end
-
2 баллаПредлагаю изменить сортировку по умолчанию в разделе вопросов не по рейтингу ответов, а по времени их создания. Сегодня оказалось, не один я страдаю от этого:
-
1 баллВ последних версиях OpenComputers обрастает всякими загадочными вещами. Игроки, которые только только освоились с предыдущей версией вдруг понимают, что надо изучать все заново. "А пошло оно все!" - думают игроки, и уходят на версию 1.3.6, или переучиваются на ComputerCraft, который проще, и не требует непонятного. А одна из самых загадочных - неведомый EEPROM. Это такая мелкая хрень, без которой не работает ни один компьютер, или даже робот. Хорошо еще, что есть стандартный EEPROM который называется Lua BIOS. Он легко крафтится и заставляет работать компьютеры как и раньше. Но найдем задачку посложнее, где Lua BIOS не поможет. Попробуем собрать микроконтроллер, который будет управлять входными дверями. 1. План Представим, как оно должно работать. Слева от двери (если входить) - микроконтроллер. Ради понтов, возьмем Микроконтроллер 2-ого уровня и поставим в него беспроводную сетевую плату. Кроме того добавим красную плату, чтобы управлять дверью. 1. Если контроллер принимает сигнал "open" - он открывает дверь. 2. Если примет сигнал "close" - он закрывает дверь. 3. Если примет посторонний сигнал - взрывает динамит. Дабы сокровища не достались хакерам. Для управления задействуем любой комп, у которого тоже будет беспроводная плата (или точка доступа). 2. Крафтим контроллер С этим проблем не возникнет. Потому, что я играю в креативе :P . Открываем NEI и берем нужные детали. В последний слот положим пока пустой EEPROM. Потом поставим на него прошивку, а пока - не важно. Нажимаем кнопку "Старт" и достаем готовый блок. 3. Готовим прошивку Теперь, когда все готово, мы построили сокровищницу и скрафтили контроллер - осталось самое главное. Программирование EEPROM'а отличается от программирования обычной программы. Потому, что обычно, наши программы выполняются в OpenOS, которая заботливо загружает нужные библиотеки, предоставляет всякие удобные фичи и прочее. Тем не менее писать мы будем именно в OpenOS. Запустим компьютер, напишем edit bios и введем следующие строки: red = component.proxy(component.list("redstone")()) while true do red.setOutput(5, 0) computer.pullSignal(1) red.setOutput(5, 15) computer.pullSignal(1) end Дело в том, что большая часть библиотек, которые мы использовали - это библиотеки OpenOS. А значит мы не можем ими пользоваться в BIOS. Однако кое-что нам доступно. Это библиотеки computer и component, и соответственно все установленные в целевом агрегате (микроконтроллер) компоненты. Более чем достаточно для наших задач. Вышеприведенный код делает следующее: * ищет компонент с названием "redstone" и возвращает его прокси * в вечном цикле посылает нулевой редстоун-импульс направо (side = 5), т.е. гасит сигнал * ждет секунду (на самом деле - ожидает эвентов, то есть сигналов) * посылает редстоун сигнал с силой 15 направо * опять ждет секунду Преследуем двоякую цель: во-первых проверить, что EEPROM вообще работает так про него написано на Вики. Кто его знает? А во-вторых: убедиться, что сторона 5 это именно та сторона, где дверь. А не какая-нибудь другая. Нажмем Ctrl+S, чтобы сохраниться и Ctrl+W, чтобы закрыть редактор. Вставим пустой EEPROM (еще один) в слот нашего компьютера, вместо лежащего там Lua BIOS. И напишем в консоль такую команду: flash -q bios MCBios Программа flash предназначена для прошивки чипов. Флаг -q говорит ей, чтобы не задавала лишних вопросов, затем идет имя файла с нашим кодом (bios) и метка, которую программа шлепнет на чип (MCBios). Все. Доставайте. Lua BIOS на место класть не обязательно, ибо этот слот нам еще потребуется. (Но не забудьте его вернуть, если будете перезагружать компьютер) Чтобы заменить пустой EEPROM в контроллере на наш MCBios, надо положить контроллер и MCBios на верстак. При этом пустой чип вылетит, а новый встанет на его место. Поставим контроллер на пол и протестируем. После клика ПКМ на контроллере - замигала правая лампа. Значит все работает как нужно. 4. Теперь - серьезно Извлеките чип с MCBios обратно (так же как и вставляли, только наоборот). Или приготовьте новый пустой чип. Главное - не запутайтесь в них. Пишем клиент для контроллера. У меня он выглядит примерно так: red = component.proxy(component.list("redstone")()) modem = component.proxy(component.list('modem')()) modem.open(27) red.setOutput(5, 0) red.setOutput(2, 0) -- no explosions yet =) while true do name, _, sender, _, _, message = computer.pullSignal(2) if name == 'modem_message' then if message == 'open' then red.setOutput(5, 15) elseif message == 'close' then red.setOutput(5, 0) else -- hacker tries to get in? red.setOutput(2, 15) -- fire in the hole!!! end end end modem.close() Все согласно плану. Прошиваем чип, вставляем в контроллер, а контроллер ставим слева от дверей. Сзади к контроллеру осторожно прилаживаем запал. ПКМ! Теперь открываем новый файл на компьютере: edit send И пишем в него такой код: local com = require('component') local modem = com.modem local args = {...} modem.broadcast(27, args[1]) print("Message '"..args[1].."' sent!") Сохраняем, и закрываем. Это будет программка для тестирования контроллера. 5. Тест! Пишем в консоль send open. Дверь открылась! Пишем send close. Дверь закрылась! Пишем send opeh Упс! Опечатка. О_О
-
1 баллОбе вики не обновляются. Если хочешь что-то более-менее серьёзное делать, то читай код. В server/component, common/component находятся scala-файлы. Все методы, помеченные через @Callback, доступны из Lua-кода. Ещё стоит заглянуть в server/machine/Machine.scala, где есть методы компонента computer, integration, где лежат драйверы для разных штук из разных модов (в т. ч. OpenComputers) лежат, и в machine.lua, который запускается при старте компьютера, готовит песочницу и запускает в ней BIOS. Если что-то неясно, то задавай вопросы. Тут, в ирке, в дискорде — где угодно. (Когда @Asior спрашивает что-то по OpenComputers, то я обычно как раз прочитываю код и отвечаю.) Конечно, экспериментальное изучение тоже не запрещено, если не лень тыкать методы компонента (components -l robot, напоминаю). И учи английский. С гугл-переводчиком ты код не прочтёшь.
-
1 баллВсем ку, благодоря бессоной ночи изучение api opencomputers написал прогу для контроля за роботом через планшет. Благодаря возможно изменения разрешения удалось свернуть окно для обзора за роботом, сделать это можно по кнопке "R". Для работы этого приложения на компьютер или планшет нужно установить видеокарту карту 2 уровня или выше (из-за изменения разрешения) , и вайфай карту. На робота только вайфай карту. Из функционала доступно: Все функции движения Все swing() Все use() И моя любимая команда для робота вида : os.execute(msg)где msg это то что вы вписали при вызове отправки шела: Протокол передачи написан настолько по индусски и небезопастно, что для работы вам достаточно просто запустить эти программы на роботе и планшете. Вашего робота могут просто упереть этой же программой XD. Если вы одобрите эту программу, то я допилю её. Код для планшета: --tab local component = require("component") local term = require("term") local event = require("event") local m = component.modem --component.gpu.setResolution(1,1) term.clear() print("--------------------------------------------------------------") print("|Движение: Вперёд= ↑; Назад = ↓; Вниз = ctrl; Вверх = shift; |") print("|Поворот: Влево = ←; Вправо →; Выход из программы = '0' |") print("|Shell = 'O' - передать аргумент shell робота; |") print("|Левый клик: Вперёд = space; Вверх = 'E'; Вниз = 'D' |") print("|Правый клик: Вперёд = enter; Вверх = 'W'; Вниз = 'S' |") print("|Сворачивание окна планшета для слежения за роботом = 'R' |") print("|By http://vk.com/dencraft23 for http://computercraft.ru/ |") print("--------------------------------------------------------------") m.open(23) sr = 1 while true do _,_,key1,key2 = event.pull("key_down") z = key2 print(z) if (z==19) then if (sr==1) then term.clear() component.gpu.setResolution(2,2) sr = 0 else component.gpu.setResolution(80,25) print("--------------------------------------------------------------") print("|Движение: Вперёд= ↑; Назад = ↓; Вниз = ctrl; Вверх = shift; |") print("|Поворот: Влево = ←; Вправо →; Выход из программы = '0' |") print("|Shell = 'O' - передать аргумент shell робота; |") print("|Левый клик: Вперёд = space; Вверх = 'E'; Вниз = 'D' |") print("|Правый клик: Вперёд = enter; Вверх = 'W'; Вниз = 'S' |") print("|Сворачивание окна планшета для слежения за роботом = 'R' |") print("|By http://vk.com/dencraft23 for http://computercraft.ru/ |") print("--------------------------------------------------------------") sr = 1 end end if (z==200) then m.broadcast(66, "f") end if (z==208) then m.broadcast(66, "b") end if (z==203) then m.broadcast(66, "l") end if (z==205) then m.broadcast(66, "r") end if (z==42) then m.broadcast(66, "u") end if (z==29) then m.broadcast(66, "d") end if (z==57) then m.broadcast(66, "swing") end if (z==28) then m.broadcast(66, "use") end if (z==17) then m.broadcast(66, "useup") end if (z==31) then m.broadcast(66, "usedown") end if (z==18) then m.broadcast(66, "swingup") end if (z==32) then m.broadcast(66, "swingdown") end if (z==11) then m.broadcast(66,"exit") shell.execute("sh") end if (z==24) then m.broadcast(66,"shell") os.sleep(1) print("shell:") shellr = io.read() m.broadcast(66,shellr) end end end Код для робота: --robot term = require("term") r = require("robot") local component = require("component") local event = require("event") local m = component.modem term.clear() m.open(66) while true do local _, _, _, _, _, msg = event.pull("modem_message") z = tostring(msg) if (z=="f") then r.forward() end if (z=="b") then r.back() end if (z=="l") then r.turnLeft() end if (z=="r") then r.turnRight() end if (z=="u") then r.up() end if (z=="d") then r.down() end if (z=="swing") then r.swing() end if (z=="useup") then r.useUp() end if (z=="usedown") then r.useDown() end if (z=="swingup") then r.swingUp() end if (z=="swingdown") then r.swingDown() end if (z=="use") then r.use() end if (z=="exit") then shell.execute("sh") end if (z=="shell") then local _, _, _, _, _, msg = event.pull("modem_message") os.execute(msg) end end
Эта таблица лидеров рассчитана в Москва/GMT+03:00
