Totoro
-
Публикации
1 950 -
Зарегистрирован
-
Посещение
-
Победитель дней
289
Сообщения, опубликованные пользователем Totoro
-
-
А вообще, чисто так, для прикола, можно и запилить песочницу.
Есть идеи как она должна работать?
-
Интересные ссылки:
Colors API
Paintutils APIИсходник простенькой кнопочки:
--Кнопку лучше всего использовать при помощи АПИ parallel local function draw(x, y, text, color) paintutils.drawLine(x, y, (string.len(text)+x+1), y, color) term.setCursorPos(x+1, y) write(text) end function button(x, y, text, nColor, pColor) draw(x, y, text, nColor) while true do local event, p1, p2, p3 = os.pullEvent("mouse_click") if ((p2 >= x and p2 <= (x+string.len(text)+1) and (p3 == y))) then draw(x, y, text, pColor) sleep(0.1) end end end -
-
-
-
-
-
Можно так же прописать в файл startup, для автозапуска хостаshell.run("gps", "host", x, y, z)Находим наши координатыx, y, z = gps.locate(5) print(x, y, z)
-
Из-за включения фрапса начала подлагивать игра, так что не удивляйтесь, что вместо нужной цифры иногда выходила какая то другая. Без фрапса все работает нормально
Использовал 1 компьютер. Саму программу написал за 15 минут. Размер проги всего 14 строк
num1 = {119, 68, 61, 109, 78, 107, 123, 69, 127, 111} num2 = {15232, 8704, 7808, 13952, 9984, 13696, 15744, 8832, 16256, 14208} while true do time = textutils.formatTime(os.time(), true) len = string.len(time) if len == 4 then h1 = 0 else h1 = string.sub(time, 1, 1) end h2 = string.sub(time, len-3, len-3) m1 = string.sub(time, len-1, len-1) m2 = string.sub(time, len, len) rs.setBundledOutput("back", num1[h1+1]+num2[h2+1]) rs.setBundledOutput("bottom", num1[m1+1]+num2[m2+1]) sleep(0.1) end -
Компьютер:
rednet.open("top") while true do event, key = os.pullEvent() print("key = ", key) rednet.send(2, tostring(key)) endЧерепашка:
rednet.open("right") while true do sender, command = rednet.receive() if command == "17" then turtle.forward() elseif command == "31" then turtle.back() elseif command == "30" then turtle.turnLeft() elseif command == "32" then turtle.turnRight() elseif command == "42" then turtle.down() elseif command == "57" then turtle.up() elseif command == "18" then turtle.dig() elseif command == "16" then turtle.place() end end -
pword = "123" core = "9" local function clear() term.clear() term.setCursorPos(1, 1) end local function pulse(side, freeze) rs.setOutput(side, true) sleep(freeze) rs.setOutput(side, false) end function os.pullEvent() local event, p1, p2, p3, p4, p5 = os.pullEventRaw() if event == "terminate" then write("Nice try :D") end return event, p1, p2, p3, p4, p5 end while true do clear() write("Lock system\nPassword: ") input = read("*") if input == pword then pulse("left", 3) elseif input == core then break end end -
Material Design как раз используется в полимере
Удобная вещь. Есть готовый набор компонентов на все случаи жизни, и более менее выглядит нормально.
Чем-то на Bootstrap похоже.
Хотя я вот сейчас другой проект делаю, и думаю попробовать с нуля собрать дизайн. В своём стиле.
Посмотрим, получится или нет.
-
Компьютер-пешка:
side = {"top", "right", "bottom", "left"} host = 1 rednet.open("back") local function bin(s) if rs.getInput(s) then return 1 end return 0 end while true do sender, msg = rednet.receive() if sender == host then concat = "" for i = 1, #side do concat = concat .. bin(side[i]) end rednet.send(sender, concat) end endСервер-опросчик:
id = {0, 3, 4} rednet.open("back") local function bin(element) if element == "1" then return "true" end return "false" end local function format(str) local form = "" for i = 1, string.len(str) do form = form .. "#" .. i .. " - " .. bin(string.sub(str, i, i)) .. "\n" end return form end while true do sender, msg = rednet.receive() if msg == "batstat" then concat = "" for i = 1, #id do rednet.send(id[i], "") thisId, thisIdAnswer = rednet.receive(5) concat = concat .. thisIdAnswer end rednet.send(sender, format(concat)) end end -
-
-
Lib
function write2file(path, array) f = fs.open(path, "w") for i = 1, #array do f.writeLine(array[i]) end f.close() end function readFromFile(path) f = fs.open(path, "r") local array = {} local i = 1 local temp while true do temp = f.readLine() if not temp then break end array[i] = temp i = i + 1 end f.close() return array end function array2String(array, d) string = "" for i = 1, #array do string = string .. array[i] .. d end return string endSend
local args = {...} os.loadAPI("lib") array = lib.readFromFile(args[1]) string = lib.array2String(array, "\n") rednet.open("top") rednet.send(tonumber(args[2]), string)Receive
os.loadAPI("lib") rednet.open("top") id, msg = rednet.receive() print(msg) array = {} array[1] = msg lib.write2file("test", array) -
tArgs = {...} local FFormat = ".arch" local nFile, nDir, size = 0, 0 if #tArgs < 3 then print("Usage:" .."\nTo zip folder and its files and subfolders use" .."\narchive zip... " .."\nIn you able to set folders that will be skipped, for example \"rom\" " .."\n\nTo unzip zipped archive to selected folder use" .."\narchive unzip" .."\n\nThis app is useful with pastebin.\nProgrammed by 1Ridav") end local function fopen(path, mode) local f = fs.open(path, mode) if not f then print("ERROR: Could not open "..path.." with mode \""..mode.."\"") exit() end return f end local function skip(df) for i = 3, #tArgs do if tArgs[i] == fs.getName(df) then return true end end return false end local function zip(file) print("zipping: ".. file) local f = fopen(file, "r") local z = textutils.serialize(f.readAll()) f.close() return z end local function ZIP(path) local list = fs.list(path) local array = {} local t, name, d = 0, "", 0 for i = 2, #list * 2, 2 do t = i/2 local tpath = path.."/"..list[t] if fs.isDir(tpath) then if not skip(tpath) then name = "D:"..list[t] array[i] = ZIP(tpath) nDir = nDir + 1 end else name = "F:"..list[t] array[i] = zip(tpath) nFile = nFile + 1 end array[i - 1] = name end return textutils.serialize(array) end local function unzip(text, path) print("unzipping: "..path) local f = fopen(path, "w") f.write(textutils.unserialize(text)) f.close() end local function UNZIP(text, path) local array = textutils.unserialize(text) local unz, dp local d = 0 for i = 2, #array, 2 do if string.sub(array[i-1], 1, 1) == "D" then dp = string.sub(array[i-1], 3, #array[i-1]) fs.makeDir(path.."/"..dp) UNZIP(array[i], path.."/"..dp) nDir = nDir + 1 elseif string.sub(array[i-1], 1, 1) == "F" then local p = string.sub(array[i-1], 3, #array[i-1]) unzip(array[i], path.."/"..p) nFile = nFile + 1 end end end local function result() print("\nDone" ,"\n size: " ,size, " B " ,math.floor(size/1024), " KB" ,"\n Files: ", nFile ,"\n Folders: ", nDir ) end if tArgs[1] == "zip" then if fs.exists(tArgs[2]) and fs.isDir(tArgs[2]) then local zipped = ZIP(shell.resolve(tArgs[2])) local f = fs.open(tArgs[3]..FFormat, "w") f.write(zipped) f.close() zipped = nil size = fs.getSize(tArgs[3]..FFormat) result() end elseif tArgs[1] == "unzip" then local f = fopen(tArgs[2], "r") if not fs.exists(tArgs[3]) then fs.makeDir(tArgs[3]) end UNZIP(f.readAll(), tArgs[3]) size = fs.getSize(tArgs[2]) result() end -
-
Перенос статьи
Эта тема была перенесена из блока "Статьи". Автор оригинала: SDV.
Что Мы знаем о сервисах для хранения фрагментов кода? Наверное ничего.А какое количество данных сервисов? Наверное их можно по пальцам пересчитать.На данном форуме большой популярностью пользуется сервис Pastebin, но есть еще несколько интересных сервисов о которых я сейчас хочу рассказать.Многие наверняка о них слышали, а возможно и использовали.

Pastebin — веб-приложение, появившееся в 2002 году, которое позволяет загружать отрывки текста, обычно фрагменты исходного кода, для возможности просмотра окружающими.
Используется многими программистами для публикации кода всем желающим.
На данный момент поддерживает большой список синтаксиса кода. Язык Lua не исключение.
Плюсы:
1. Удобная форма публикации, как с сайта, так и с opencomputers-устройств
2. Система конфиденциальности файлов (наличие приватного и публичного доступа к файлу)
3. Удобная система передачи файлов благодаря QR-коду (нет необходимости вводить id файла)
4. Функция публикации фрагмента кода на своем сайте (через frame или JS-виджет)
Минусы:
1. Отсутствие русского языка в интерфейсе сайта. Не критично (все интуитивно понятно)

GitHub Gist — дополнение к сервису GitHub, которое позволяет загружать, публиковать и делиться фрагментами кода между участниками GitHub и не только.
В наличии имеет форму для выбора предварительного синтаксиса кода, а также кнопки выбора конфиденциальности кода.
Плюсы:
1. Все фрагменты кода автоматически прикрепляются к аккаунту GitHub
2. Система комментирования и функция форка (ответвление)
3. Система контроля версиями (изменениями) в коде
4. Система работы как с Git (через Git, SSH, Subversion)
5. Функция публикации фрагмента кода на своем сайте (через JS-виджет)
Минусы:
1. Отсутствие русского языка в интерфейсе сайта
2. Отсутствие lua-программы в opencomputers, позволяющая скачивать код
3. Слишком длинные сгенерированные хеш-URL для кода

ideone.com — сервис для публикации фрагментов исходного кода.
Главное отличии от всех существующих сервисов для хранения фрагментов кода - функция компилирования (интерпретирования) введенного кода в форму.
Плюсы:
1. Наличие функции компилирования (интерпретирования) кода (можно прям на сайте увидеть результат выполнения программы)
2. Частичная русификация интерфейса сайта
3. Выбор времени компиляции (5 или 15 секунд)
4. Наличие формы ввода данных (stdin)
5. Функция публикации фрагмента кода на своем сайте (через JS-виджет)
6. Функция форка (ответвление)
7. Кнопка создание собственного шаблона (паттерна) для использования его как заготовки для дальнейших фрагментов кода программ
Минусы:
1. Отсутствие lua-программы в opencomputers, позволяющая скачивать код
2. Отсутствие системы передачи файлов через QR-код
3. Отсутствие возможности указания собственных названий для опубликованных фрагментов кода

hastebin — веб-приложение с базовым функционалом pastebin, но в хакерском стиле. Просто вставьте текст и нажмите «Сохранить».
Необязательно даже запускать браузер, потому что из Linux или OS X можно отправить текст на сервер командой из консоли (URL скопируется в буфер обмена).
Плюсы:
1. Минималистичный дизайн приложения
2. Интуитивно понятный интефейс
3. Хранение кода в течении 30 дней с момента последнего просмотра
4. Наличие RAW-режима
Минусы:
1. Отсутствие lua-программы в opencomputers, позволяющая скачивать код
2. Отсутствие системы передачи файлов через QR-код
3. Отсутствие возможности указания собственных названий для опубликованных фрагментов кода
4. Отсутствие возможности самостоятельного удаления фрагмента кода из базы (только автоматически через 30 дней с момента последнего просмотра)
Итак, Мы рассмотрели 4 самых популярных сервиса для хранения фрагментов кода.
Выбирать Вам, что именно использовать, но помните - иногда лучшее не то что популярно
На этом я закончу обзор.
С уважением к Вам, TuxShot-
1
-
-
Перенос статьи
Эта тема была перенесена из блока "Статьи". Автор оригинала: Krutoy.

Как известно, чем лучше инструмент, тем выше скорость работы.
Я программирую на Lua больше года, и перепробовал множество инструментов.
В этой статье я покажу, какие есть инструменты для успешного программирования на Lua для двух модов Minecraft'а: ComputerCraft и OpenComputers.
1. Внутриигровой редактор


Умеет уйму недостатков и неудобен в работе, за то всегда под рукой.
Для ComputerCraft есть программа "LuaIDE", которая входит в состав операционки OneOS (второй скрин)
Для OpenComputers пока редакторов кроме стандартного нет.
Пара советов для редактора OC:- Для быстрого поиска существующего файла в консоли введите первые символы и жмите TAB, например edit i [TAB] --> edit /init.lua
- Для удаления всей строки нажмите CTRL+DELETE
2. Текстовые редакторы



Их несколько:-
Notepad++
Стандарт скриптовика. Прост и легок в обращении. Плюсы - малый размер, куча плагинов и расширений. Лучшее средство для начинающего программиста Lua. -
Sublime Text
Более продвинутый инструмент. Плюсы - расширенный интерфейс, выбор из разнообразных тем, поддержка плагинов, включая подсветку ошибок при написании кода.
Сам пользуюсь этим редактором на компе, расширив плагинами Corona Editor, Lua Love, Sublime Linter - lua -
SciTE, Atom
Для хипстеров. По функционалу такие же как выше.
Для удобной работы с компьютерными модами есть несколько приемов:
- Через папку сохранения в одиночной игре:
В Windows это папка, примерно C:\Users\UserName\AppData\Roaming\.MC\ServerName\saves\Computers\opencomputers\address-address-add-addrs
Сохраненные файлы в папке жесткого диска игрового компьютера будут тут же там обновляться.
Не забудьте изменить в конфиге \config\OpenComputers.cfg значение bufferChanges на false:
- Через Pastebin:- Пишете код в редакторе
- Вставляете его на Pastebin
- Вписываете код для запуска в игре (заменив XXXXXX на код пасты):
- pastebin get XXXXXX name
- Через облачное хранилище с прямыми ссылками:
- Сохраняйте и работайте с файлами прямо в папке облачного хранилища, с возможностью доступа по прямым ссылкам.
Например, в дропбоксе это папка Public (в новых аккаунтах ее нет) - Загружайте обновленные файлы на ОС компьютер через интернет-плату программой wget, получив прямую ссылку на файл, например:
wget -f https://dl.dropboxusercontent.com/u/12345678/file.lua
- Для удобства вы можете написать короткую программу, которая при нажатии клавиши, например F5, будет выполнять такую загрузку автоматически
3. IDE

IDE - Интегрированная среда разработки. Это мощное средство редактирования и отладки кода. Сильно упрощает работу с большими проектами, но более сложен в освоении.
Основное преимущество IDE - отладка кода посредством точек останова и отображения значений переменных при работе программы.
Рассмотрим по отдельности:-
ZeroBrane Studio
Суперлегкая (у меня занимает 17мб оперативки) и быстрая кроссплатформенная IDE. Визуальные темы, мониторинг переменных, выделение локальных и глобальных переменных, проверка на неиспользуемые переменные и прочие ништяки. -
Lua Development Tools
Преимуществ от ZeroBrane практически нет, скорее минусы в роде отсутствие темной темы и требовательности к оперативке. -
Cloud 9
Облачное браузерное IDE.
По стандарту отсутствует отладка. Ее нужно устанавливать в проект самостоятельно.
Плюс - вам не нужно ничего устанавливать на компьютер. Но самое приятное, что к каждому файлу в этой IDE можно обратиться по постоянной прямой ссылке, что крайне упрощает заливку файла в игру. Так же, вы можете раздавать ссылку на проект другим и совместно редактировать код.
Сам я использую Sublime для быстрого редактирования файлов, LDT для больших проектов на стадии написания кода, Cloud9 для совместных проектов с другими программистами, и для отладки текущих проектов в игре.
О ZeroBrane Studio узнал совсем недавно, поэтому планирую перейти на нее в ближайшее время, что и другим советую. -
Перенос статьи
Эта тема была перенесена из блока "Статьи". Автор оригинала: Semoro.
В этом видео я и Сябро рассказываем про настройку файловой системы диска для работы-
1
-
-
Перенос статьи
Эта тема была перенесена из блока "Статьи". Автор оригинала: Semoro.
В этом видео я и Сябро рассказываем о компонентах мода Open Computers
-
Перенос статьи
Эта тема была перенесена из блока "Статьи". Автор оригинала: fenixrus.
Здравствуйте с вами Fenixrus и я начинаю серию гайдов по API мода OpenComputers.
Начнем мы с Component API.
Вообщем смотрим, изучаем, пробуем, комментируем!
https://www.youtube.com/watch?v=hStnB3hCpFs -
Перенос статьи
Эта тема была перенесена из блока "Статьи". Автор оригинала: ShuraGamer.
Сначала выскажу огромное спасибо @Totoro, @Alex, @Fingercomp, @LeshaInc за их программы, благодаря которым более-менее смог разобраться в очках.
Небольшая предыстория(кому неинтересно, основной текст ниже): Началось все с дверного замка Тоторо, в котором использовались неведомые мне до этого очки для вывода информации под названием Terminal Glasses. Мне захотелось побольше узнать о них, но увы-ни в каких, даже англоязычных источниках подробного гайда я не нашел. Спросил на форуме, может кто знает? Кибер предложил написать гайд самому, на халяву вайт получить. Тут-то , немного покопавшись в документации,я и осознал весь размер подложенной мне свинки... Я, наивная душа, подумал, а, фигня, тут же только вывод данных! OpenPeripheral оказался отдельным модом, и писать гайд только по одной его части не имеет особого смысла. Так что придется разбираться полностью. А пока что-держите первую часть гайда по моду OpenPeripheral - Terminal Glasses!
Приятного ознакомления!
Итак, начнем мы с физической части нашей парочки - Terminal Glasses и Terminal Glasses Bridge. В дальнейшем я буду называть их "очки" и "мост" для простоты.
Методы API одинаковы как в ОС, так и в СС Начнем с принципа работы очков. Он достачно прост: информация передается с компьютера на мост, а с моста уже на очки(прим. Можно подключить несколько очков). Если честно, я хз, как данные передаются на очки, видимо тут квантовая зависимость поиграла...
Итак, мы ставим мост рядом с компьютером. Далее мы подключаем очки к мосту, просто райткликнув ими по блоку. Готово! Все подготовления завершены, можем начинать программировать!
Сначала подключаем мост к компу:OC -- com = require('component') bridge = com.openperipheral_bridge CC -- bridge = peripheral.wrap(сторона подключения к компьютеру)Или
bridge=peripheral.wrap("bridge")Теперь мы разбираемся с API:
brige.addBox([X-координата], [Y-координата] , [Размер по вертикали] , [Размер по горизонтали], [Хексадецимальный код*], [Прозрачность**]) -- добавляет прямоугольник по заданным параметрам.
*Хексадецимальный код - цветовой код, подробнее - гугл.
Малая таблица цветов:- Черный #000000
- Белый #FFFFFF
- Красный #FF0000
- Зеленый #00FF00
- Синий #0000FF
- Желтый #FFFF00
- Морская волна #00FFFF
- Розовый #00FF00
Подробная таблица цветовых кодов:Тык!
Цвета подаются в программу в виде 0xКОД, например 0x000000
**Прозрачность: 1 - полностью видимый; 0 - еле заметный(Дробные числа работают)
bridge.addText([X-координата], [Y-координата] , [Строка] , [Хексадецимальный код]) - выводит строку в нужных координатах.
bridge.clear() - сбрасывает все данные в мосте.
Итак, вы все еще помните принцип передачи данных? Так вот, сами собой данные в очках не появятся, мы должны вручную "отправлять" картинку с моста на очки(При отправлении данных с моста на очки вся предыдущая информация сбрасывается) В этом нам поможет bridge.sync().
Для ясности мы напишем небольшую программку, которая показывала бы нам точное время(Напишем ее на OC):--TIMEONGLASSES-- com = require('component') bridge = com.openperipheral_bridge function addbox() bridge.addBox(1,1,80,10,0xFFFFFF,0.2) end function addtime() datetime = os.date("!*t",os.time()) time ="TIME"..datetime.hour..":"..datetime.min bridge.addText(5,2,time,0xFF0000) end --MAIN-- while true do bridge.clear() addbox() addtime() bridge.sync() os.sleep(0.1) endИтак, господа, разберем по полочкам вышенаписанную программу
Функция addbox() создает почти прозрачный прямоугольник слева сверху на экране
Функция addtime() выводит текущее время, кому интересна строчка: datetime = os.date("!*t",os.time()), прошу по ссылке:
Тык!
Далее мы смотрим на главный цикл. Разберем его построчно
while true do и end - бесконечный цикл
bridge.clear() - очищаем мост для новой информации
addbox(),addtime() - добавляем табличку со временем
bridge.sync() - отсылаем табличку на очки
os.sleep(0.1) - ждем десятую секунды
Всем спасибо за внимание, надеюсь, помидоры будут не сильно тухлыми :/
P.S. BB-зло!-
1

[1Ridav] ComputerCraft. Урок 12 Мониторы
в Гайды по модам
Опубликовано:
Интересные ссылки:
Term API
Textutils API
Peripheral API