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

Поиск по сайту

Результаты поиска по тегам 'Lua'.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип публикаций


Блоги

  • Робот Байт
  • Fingercomp's Playground
  • 1Ridav' - блог
  • Totoro Cookies
  • Блог cyber01
  • IncluderWorld
  • KelLiN' - блог
  • Крутой блог
  • eutomatic blog
  • Programist135 Soft
  • Сайт в сети OpenNet
  • PieLand
  • Очумелые ручки
  • Блог недоблоггера
  • В мире Майнкрафт
  • LaineBlog
  • Квантовый блог
  • Блог qwertyMAN'а
  • some blog name
  • Дача Игоря

Форумы

  • Программирование
    • Программы
    • База знаний
    • Разработчикам
    • Вопросы
  • Игровой раздел
    • Игровые серверы
    • Моды и плагины
    • Жалобы
    • Ивенты и конкурсы
    • Файлы
  • Общение
    • Задать вопрос
    • Обратная связь
    • Беседка
    • Шкатулка
  • Технический раздел
    • Архив

Группы продуктов

Нет результатов для отображения.


Искать результаты в...

Искать результаты, которые...


Дата создания

  • Начать

    Конец


Последнее обновление

  • Начать

    Конец


Фильтр по количеству...

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

  • Начать

    Конец


Группа


AIM


MSN


Сайт


ICQ


Yahoo


Jabber


Skype


ВКонтакте


Gtalk


Facebook


Twitter


Город


Интересы

Найдено 166 результатов

  1. Я видел статью про ООП (Объектно-Ориентированного Программирования), написанную на этом форуме, и вот, что могу сказать, он может быть немного непонятен новичкам в Lua. Я всегда пользовался другим способом создания "классов". Сначала следует разобраться со значениями. Класс - это набор методов (в нашем случае функций), процедур и переменных которые дальше будут наследоваться объектом или другим классом. Объектами называют сущности, обладающие набором свойств и операций над ними. Объект - это производное класса. В Lua классов как таковых нет, но если пофантазировать, то можно представить функцию как класс, а объект как таблицу. Создание простого псевдо-класса Наследование Экономия оперативной памяти Только читаемые свойства Вывод. Этот способ реализации ООП в Lua будет работать и в OC и в СС. "Классы" очень похожи на классы из других языков программирования. В моём варианте нет двоеточия, которое приносит странную возможность обработки одного объекта методом другого. Использовать ООП в игре можно для удобной разметки интерфейса в вашей программе (например для создания кнопок), и для экономии системных ресурсов в вашем компьютере внутри компьютера.
  2. Помню @@1Ridav разрабатывал мост для связи игры и ПК, чтобы можно было получать уведомления от роботов и компьютеров. Чуть посидев (а как вы помните я Lua не знаю) получилось вот это: https://pastebin.com/rZC8BZMs Что позволяет? Вы можете или запускать эту "штуку" просто с аргументом или вырезать те 2 строчки, которые принимают аргументы и просто включить этот код в код вашей программы и получать уведомления в телеграмм. Назвал я эту штуку TGInformer. Что нужно для работы? Со стороны Telegram: Добавить вот этого бота: https://t.me/ShowJsonBot, написать ему и в секции from найти id и записать его Добавить бота https://t.me/OC_InformerBot и написать ему любое сообщение. Со стороны OpenComputers: Компьютер с сетевой картой Загрузить код информера и открыть его для редактирования. Вверху в поле chatid впишите ID, который получили пунктами выше. Выполните tginformer test В результате в телеграм должно прийти test, а в игре код ответа: ОК Теперь осталось вписать это в свою программу и робот будет присылать уведомления типа я покакаль я выкопал ту большую яму P.S. Спасибо @@Alex за правки
  3. Fingercomp

    Про скобочки

    Продолжу рассказывать про знаки препинания. В этом посте — 3 разных истории про пару круглых скобок. 1. Вызовы функций Если функция вызывается с одним аргументом — строковым или табличным литералом, то скобочки необязательны. local function identity(x) return x end print(identity "test" == "test") print(table.unpack(identity {"test"}) == "test") Это чисто синтаксическая фишка, которая никак не влияет на исполнение кода. Очень удобно, чтобы вызвать функцию и передать ей таблицу с опциями. local logger = getLogger { name = "main", level = "info", output = {stdout}, } Если несколько литералов так разместить подряд, получится ряд последовательных вызовов: myFunc "hello" "world" {"how do you do"} -- myFunc("hello")("world")({"how do you do"}) Используя эту фичу, можно воплотить всякие норкоманские вещи. Как вам вот такой форматтер с интерполяцией? local myVar = 42 print(format "myVar = " {myVar} ", and I'm running " {_VERSION}) --> myVar = 42, and I'm running Lua 5.3 2. Ещё про литералы У всех строк есть метатаблица, у которой __index = string. Это значит, что можно вместо string.gsub(str, ...) писать str.gsub(str, ...), или str:gsub(...). Очень удобно, особенно последнее. Но вот просто так заменить str литералом нельзя. "test":gsub(...) — синтаксически неправильный код. Выручат скобки вокруг литерала: ("test"):gsub(...). Постоянно этим пользуюсь. Та же ситуация, если мы хотим проиндексировать табличный литерал: {foo = "bar"}.foo выдаст ошибку. Лечится аналогично: ({foo = "bar}).foo. Кроме индексации, скобочки нужны при вызове: вместо function() return 42 end() нужно писать (function() return 42 end)(). Наконец, есть ещё литералы численные: 42, например. В обычной Lua оборачивать их в скобки смысла, пожалуй, и не имеет, но с небольшим шаманством опять потребуются скобочки: debug.setmetatable(0, {__call = function(self) print(self) end}); (42)() --> 42 Правда, в OpenComputers отключён debug.setmetatable. 3. Функции с множественным выхлопом В Lua функция может вернуть несколько значений: local function test() return 1, 2, 3 end print(test()) --> 1 2 3 Однако бывает, что нужно достать только одно значение, а про остальные забыть. Для этого нужно обернуть в скобки вызов функции, вот так: print((test())) --> 1 Скобочки возьмут только первое значение и отбросят остальные. С помощью функции select можно выбрать и другое по счёту: local function identity(...) return ... end print((select(3, identity(10, 9, 8, 7, 6, 5, 4, 3, 2, 1)))) --> 8
  4. Предисловие Я думал на новый сервер запилить прогу — мост между чатом сервера и IRC. У меня уже были такие программки: я насчитал минимум 6 различных версий мостов — каждая была немного переделанным клиентом IRC, который на дискете встроенной есть. Понять, в чём разница, даже с вимдиффом было сложно. Потому я плюнул и решил запилить полноценную ирколибу с красивой апишкой. Как это выглядит Вот полный код бота — моста. Сто двадцать шесть строчек. Прокомментирую некоторые из них. ① Подключаем либу и для укорачивания имён ещё вытаскиваем events, в которых хранятся все ивенты и priority. ② Создаем клиент с помощью билдера. ③ Через :connection задаём настройки соединения. Самое важное — адрес иркосервера. Порт обязателен. ④ Ирколиба знает меру в флуде. Опасаться, что бота выкосит флуд-фильтром, можно гораздо меньше. Это опционально, конечно. ⑤ Задаём ник бота, юзернейм и реалнейм. Юзернейм виден в хосте (nickname!username@domain.name), а реалнейм пишется в /whois. ⑥ Ирколиба умеет авторизовываться на сервере. Тоже опционально. ⑦ Эта группа выделена для ботоводческих настроек. Но пока там единственная опция — в какие каналы автоматически заходить. ⑧ Здесь задаются настройки исполнения. Опция threaded, по дефолту включённая, запустит бота в отдельном треде. Опция reconnect, также включённая по умолчанию, заставит бота переподключиться к серверу, если отвалится от него. Опция catchErrors перехватит ошибки в пользовательких листнерах; она отключена по умолчанию, чтобы не смущать. ⑨ Бот генерит ивенты для каждого сообщения. Так мы задаём обработчик для ивента. К слову, вместо функции здесь может быть корутина. ⑩ Есть и другие события. Например, irc.events.client.connected означает, что клиент соединился с сервером. А irc.events.client.authenticated говорит, что теперь можно слать сообщения. ⑪ Когда мы закончили конфигурировать бота, собираем через :build(). Если вместо него вызвать :buildAndRun(), бот тут же ещё и запустится. ⑫ Для удобства создадим ещё один тред, где будем работать с чатбоксом и ждать ^C. ⑬ Запускаем бота. Затем ждём завершения любого из двух потоков. ⑭ Когда это произошло, мы выключаем клиент, если он ещё подключен: тот выйдет с сообщением "Quitting." ⑮ Наконец, принудительно останавливаем потоки. На всякий случай. Красота ведь. Репозиторий Репа либы — на нашем гитлабе. Там же есть примеры использования и документация с описанием всего. Наконец, версия 1.0.0 лежит на хеле. Из-за баги в OC хпм крашиться может (фиксить лень), но можно попробовать скачать: $ hpm install libirc
  5. Нужен код, который будет объединять несколько файлов и папок в один файл и обратно.
  6. Некоторое время назад я публиковал программку - интернет-мост Stem. Он очень простой в использовании, но к сожалению пока не лишен некоторых глюков. А кроме того, у него есть недокументированные возможности. Предлагаю сейчас поиграться с одной такой тайной фичей. Это будет интересно тем, кто немного знаком с HTML/CSS/JavaScript. В чём суть? Всё просто. У Stem есть веб-клиент. То есть если вы зайдете по адресу https://stem.fomalhaut.me (например), вы увидите окно, которое пригласит вас ввести ID канала и початиться прямо с сайта. После ввода ID канала, вас перекинет на страничку с "чатом", где вы сможете посылать сообщения вашему компьютеру/роботу в майнкрафте. Адрес этой странички будет выглядеть примерно так: https://stem.fomalhaut.me/channel?id=test Где test это ID вашего канала. Когда робот будет вам отвечать, это будет видно в логе. Примерно так: А теперь - тайная фича. Находясь на страничке канала, как на скриншоте, вы можете приписать к адресу дополнительный флаг: &render=true. Полный адрес станет выглядеть примерно так: https://stem.fomalhaut.me/channel?id=test&render=true И начиная с этого момента, все входящие сообщения от компьютера в OpenComputers будут не отрисовываться в лог, а попадать в JS функцию eval(...). Что это значит? Те кто имел дело с JS уже наверное поняли все последствия. Но я поясню. Это значит, что компьютер OpenComputers может прислать сообщение с JS кодом, и сайт Stem этот код выполнит. А это значит, что вы можете творить на сайте вообще всё что угодно. Вы можете удалить интерфейс, показать вместо него новый, скачать что-то с инета, запустить игрушку... да хоть майнить крипту. Поиграем Ничего вредоносного мы делать конечно сейчас не будем. Вместо этого, традиционно, попробуем сделать так, что сайт Stem превратится в сайт для управления светом в нашем доме в Майнкрафте. Шаг первый. Подготовим дом. Тут всё просто - стандартный компьютер, с интернет картой, от него кабель к I/O блоку, а на блоке - подопытная лампа. На компьютер ставим Stem. Например, ставим HPM такой командой, pastebin run vf6upeAN И потом пишем: hpm install stem Нажимаем Enter и готово. Шаг второй. Нам нужен сайт. Усложнять не будем, и наш революционный дизайн будет выглядеть так: Что нам нужно сделать, чтобы сайт Stem превратился в то что нам надо? Методом тыка, через консоль браузера определяем, что достаточно выполнить такой код: document.body.innerHTML = " <style>button:active { background: #fac700; }</style> <button onclick=\"sendMessage(\'toggle\')\">Toggle Light</button> "; document.body.style.alignItems = "center"; Первой строкой мы просто заменяем всё содержимое тега <body> на то что нам надо. Я добавил еще немного косметики в виде стиля для кнопки. Вторая строка - тоже косметика, я просто поправил стиль на теге <body> чтобы кнопочка была посередине. Один важный ньюанс - на кнопке повешено свойство onclick с кодом sendMessage("toggle"). Таким образом, когда пользователь тыкнет по кнопке, мы отправим сообщение обратно в OpenComputers. Функцию sendMessage нам дает веб-клиент Stem. Ей можно безвозмездно пользоваться в своих целях. Шаг третий. Соединяем это все вместе. Теперь надо набросать программку для нашего компьютера в Майнкрафте, чтобы он выслал подготовленную JS-"бомбу" по нашему сигналу. Эники, беники... выходит что-то такое: local event = require('event') local stem = require('stem') local side = require('sides') local com = require('component') local redstone = com.isAvailable('redstone') and com.redstone or nil local channel = "test" local layout = [===[ document.body.innerHTML = "\ <style>button:active { background: #fac700; }</style>\ <button onclick=\"sendMessage(\'toggle\')\">Toggle Light</button>\ "; document.body.style.alignItems = "center"; ]===] local lampSide = side.top local lampTurnedOn = false print("Connecting to the #" .. channel .. " STEM channel...") local server = stem.connect('stem.fomalhaut.me') server:subscribe(channel) print("Done.") print("Press [q] to quit.") while true do local name, a, b = event.pull() if name == "stem_message" then local message = b if message == "connect" then print("Someone wants to connect - sending the layout...") server:send(channel, layout) elseif message == "toggle" then if redstone ~= nil then if not lampTurnedOn then redstone.setOutput(lampSide, 16) lampTurnedOn = true else redstone.setOutput(lampSide, 0) lampTurnedOn = false end end end elseif name == "key_down" then local char = b if char == 113 then break end end end server:disconnect() Я думаю тут большая часть очевидна и понятна. Мы подключаемся к серверу Stem, подписываемся на нужный канал и внимательно слушаем входящие сообщения. Когда пользователь присылает сообщение connect, мы отправляем ему подготовленный код, который мирно лежит в переменной layout. Этот код прилетит к пользователю, и, если пользователь смотрит страницу с включенной опцией render=true, код сработает и перерисует страницу. Если опция будет отключена - он просто увидит код в логе, как простое сообщение. Шаг четвертый. Тестируем. Откроем наш канал по ссылке: https://stem.fomalhaut.me/channel?id=test&render=true Появится пустой лог. Запустим программу в OpenComputers. Она отрисует наше приветствие, что-то вроде: Сonnecting to the #test STEM channel... Done. Press [q] to quit. Теперь пишем на сайте команду connect. Если мы все сделали правильно, и Stem не заглючил, интерфейс сайта исчез, и вместо него появилась наша кнопка. Нажимаем её. Вуаля! Дома зажегся свет. Постскриптум Это конечно же недокументированная хакерская фича, которую можно считать альфа-версией. Кроме того в Stem сейчас есть неуловимый баг, из за которого сообщения иногда не доходят. Не пугайтесь. Если кто-нибудь предоставит мне сценарий (прямо по шагам), при котором 100% срабатывает баг - буду очень рад и пофиксить его будет легче. С помощью описанной фишки можно придумать много хрени. Я показал самое простое что пришло в голову. Уверен, ваша фантазия будет покруче моей ) Пишите баг-репорты или пожелания по фиче, да и просто комменты в эту тему, либо мне в любой канал связи, где я онлайн.
  7. ; — это код, который делает приблизительно ничего. Не абсолютно: об этом статья. Когда я писал crateriform (видяшки в гайде про корутины этим набором прог зарендерены), я отталкивался от Lua-парсера на Lua от @LeshaInc (спасибо ему ещё раз): Lua-часть принимала исходный файл с кодом, парсила его на AST и генерировала по нему обратно код. С костылями. Для рендера нужен был "сценарий" — файл, в котором указаны, какие символы изменились и на какое значение, помимо прочего. Генерируемые костыли как раз этим занимались: они оборачивались вокруг выражений и писали в файл высчитанное значение. Чтобы показать кадр с "n = 10", как на гифке, и следующий за ним, сценарий такой: 5,16 5,16 expr 10 Здесь через пробел: позиция начала в исходном коде, позиция конца, опкод (expr) и значение выражения. Так как генерируемый код делает то же, что и исходный, но ещё рисует сценарий, а выражения могут быть засунуты где угодно и раскрываться сразу в несколько значений, я создаю лямбду (анонимную функцию) и тут же её вызываю. Вот как выглядит часть сгенерированного кода, который занимается строкой выше: highlight({5, 16}, {5, 16}, (function(...) local values = table.pack(...) return function() return table.unpack(values, 1, values.n) end end)((n)), 'expr') Выглядит очень сложно (для сложности есть причины), но сейчас интересует только это: (function(...) <...> end)(...) Эта конструкция присутствует как третий аргумент к highlight. Программисты на JS с этим шаблоном должны быть знакомы: создаётся лямбда и тут же вызывается с некими аргументами. В месте, где синтаксис позволяет указывать только выражение — в списке аргументов вызова в нашем случае, — таким образом размещаем стейтменты. На всякий случай скажу, что стейтмент — любая цельная конструкция, кроме выражений. Если вы берёте часть кода, которая отдельно, вырванная из кода, не выдаёт синтаксическую ошибку (например, цикл for или local x = 3), и её нельзя поместить после x = , это стейтмент. А теперь суть. (function(x) print(x^2) end)(2) (function(y) print(y + 2) end)(2) Этот код задумывался так, чтобы он два раза принтнул четвёрку. Запускаем: $ lua5.3 semicolon.lua 4.0 lua5.3: semicolon.lua:1: attempt to call a nil value stack traceback: semicolon.lua:1: in main chunk [C]: in ? ..? Lua игнорирует пробельные символы. Код вроде такого: func(3) (4)(5) ...эквивалентен такому: func(3)(4)(5) В примере с ошибкой вызывается первая лямбда, возвращающая nil, который мы затем пытаемся вызвать с аргументом — второй лямбдой. Поэтому получаем "attempt to call a nil value". Чиним с помощью ;: (function(x) print(x^2) --> 4.0 end)(2) ; (function(y) print(y + 2) --> 4 end)(2) Кстати, чтобы ещё с толку сбить: комментарий вместо ; ошибку не исправит. Ещё один ошибочный пример: local pi = math.pi (function(r) print(2 * pi * r) end)(3) Как чинить, вы уже знаете. Отдельно упомяну точку с запятой после return. return обязан быть последним стейтментом в блоке. А ; — это стейтмент. Почему тогда можно делать так? local function f(x) return x^2; end print(f(2)) --> 4.0 Ответ: потому что ; — это опциональная часть return, а не отдельный стейтмент. Если же залипает клавиша и получается вот так: local function f(x) return x^2;; end print(f(2)) ...то будет синтаксическая ошибка. Вторая точка с запятой — теперь отдельный стейтмент, которых после return быть не должно. Поэтому с уважением относитесь к этому стейтменту. Точка с запятой делает приблизительно ничего, но с умом.
  8. GPS это куча оборудования, трата энергии и времени, но иногда может понадобится там, где нет встроенного акселерометра, как у робота. Попробуем разобраться, как настроить и построить сеть спутников, по которым можно вычислить свои координаты. Где-то была готовая программа, но я ее не нашел, поэтому восстановил основной функционал, по примеру КомпутерКрафта. Для начала нужен компьютер с установленной OpenOS. Скачиваем для него программатор хостов: pastebin get ZD8GysNP /bin/fgps.lua Эта программа позволяет устанавливать прошивку для спутников-микроконтроллеров, которые будут рассылать свои координаты по запросу. Далее, соберем несколько микроконтроллеров с беспроводными картами, при необходимости обеспечим их энергией. Теперь надо установить прошивку для первой партии: узнаем координаты, где будет стоять очередной хост вставляем EEPROM в компьютер запускаем программатор, с указанием координат через пробел (например: fgps 1652 64 -152) Прошитые карточки вставляем в микроконтроллеры (в сетке крафта) и расставляем в соответствии с координатами, указанными при прошивке. Самое главное - не перепутать координаты. Если навести курсор на микроконтроллер и зажать LSHIFT, то будет виден лейбл биоса, который является подсказкой для его позиции. Когда первая партия размещена и активированна, остальные хосты можно прошивать без указания координат - они определят позицию сразу при включении (если они будут в радиусе действия четырех рабочих хостов) Но лучше, конечно, чтобы каждый хост знал свои точные координаты. Ибо в случае небольшой ошибки в начале постройки, по мере расширения сети, погрешность будет увеличиваться, т. к. поправка будет производится по неверно вычисленным координатам хостов. Теперь проверим работу системы в деле. Возьмем, например, планшет с беспроводным модемом. Скачаем библиотеку GPS: pastebin get Dja9ZceV /lib/gps.lua Запустим консоль Lua. Загрузим библиотеку: local gps = require('gps') И попробуем получить координаты: gps.locate(true) (параметр DEBUG передаваемый в функцию работает как и в ComputerCraft - выводит все вспомогательные сообщения) Каждый хост, при старте устанавливает wake-up сообщение и включается только чтобы ответить на запрос координат. Такой подход экономит огромное количество энергии и позволяет добиться полной автономности хостов - встроенной солнечной панели вполне хватает для работы. Для стабильной работы надо будет добавить data-карту и реализовать протокол управления спутниками по прошитому открытому ключу, чтобы удобно было прошивать новые координаты при перемещении хоста на новое место.
  9. Всем привет. Мы тут пишем эмулятор OpenComputers, и в процессе его нужно тестировать. Поэтому будет очень здорово, если кто-нибудь напишет утилиту-бенчмарк. Утилита должна выглядеть как программка для OpenOS, на Lua. В идеале её надо загрузить в Hel, чтобы было быстрее устанавливать. Для чего именно она нужна? Делать бенчмарк компьютера в Minecraft смысла особо нет - там и так понятно насколько будет производительной твоя "сборка". Но это имеет смысл делать в эмуляторе - потому что эмулятор может глючить, лагать, багать, и жрать оперативную память. (Например, сегодня мы запустили в Ocelot Online демку, которая очень быстро рендерила текст на экране, и в результате, у @Fingercomp браузер сожрал 5 гигабайт оперативной памяти, засвопился и вырубил на час весь компьютер.) Что именно она должна тестировать? Утечки оперативной памяти, производительность рендера и лаги эмулятора. Для этого можно например запустить интенсивный рендер на экране какого-нибудь цветастого мусора. Или любой другой вариант. Засечь время и потом сверить "внутриигровые" часы с настоящими, чтобы определить, не лагало ли оно. (Параллельно тесту можно будет уже вручную смотреть диспетчер задач - не жрет ли браузер или десктопный эмулятор ресурсы больше положенного.) Правильную работу компонентов. То есть проверить, соединяет ли интернет карта с интернетом, посылает ли сетевые сообщения модем, и так далее. Всю инфу надо потом красиво вывести на экран. Можно в графическом виде, можно в командной строке. Награда? Большое спасибо от всей души. Короче, если кто-то будет искать идею "что бы написать" - бенчмарк для эмулятора это вариант. Он нам пригодится.
  10. Кто нибудь знает, есть ли интерпретатор вне майнкрафта для lua OpenComputers дабы более удобно проверять и дебажить код ибо в самом майнкрафте это крайне не удобно делать.
  11. Fingercomp

    Прокачка стектрейса

    Эта беспрецедентно короткая запись имеет начало своих ног в запросе @Laine_prikol, как-то спросивший в нашей ирке, можно ли стэктрейс сделать не таким тупым. Меня это заинтересовало, и спустя часик выросла очень короткая программка, которая рисует вот такие стэктрейсы: # 0: C field function yield(...) (defined in [C]) # 1: Lua local function f(f=function: 0x559402b83590, a=42, b=24, vararg test, nil):109 (defined in trace.lua at L108) # 2: Lua local function outer(f=function: 0x5594040b2230, g=function: 0x559402b83590, a=42, b=24, <... (1 arg)>):105 (defined in trace.lua at L103) # 3: Lua function <anon>():113 (defined in trace.lua at L102) Заметили что-то необычное? Наконец-то пишется, какие аргументы имеются у функции, потому что это куда информативнее беглому взгляду, чем описание расположения и строки. Код лежит на гисте: https://gist.github.com/Fingercomp/a688d221356cb371d940b947d0ca90a8. Использованы функции debug.getinfo и debug.getlocal. Аргументы должны писаться даже внутри OC, но уже без значений.
  12. @Krutoy когда-то писал про IDE для Lua, но с тех пор, я надеюсь, всё достаточно преобразилось, чтобы снова подошло время задать следующий вопрос: «Какие есть окружения разработки для Lua?» Желательно интегрированные. Иными словами: редактор кода полноценный (само собою); автодополнение (уже никуда без этого); дебаггер; поддержка множества окружений Lua (так, чтобы можно было и OpenOS встроить); неубогий вид; линтер, автоформаттер; статический анализатор кода; инструменты рефакторинга; сборка, запуск, деплой; конфигурируемость и удобность. Неплохими примочками была бы ещё поддержка C, C++ на уровне, но здесь, впрочем, можно и CLion/Eclipse поставить. Если есть опыт использования, интересно было бы услышать его тоже. Например: vim — из списка только 2 пункта есть: первый и последний. Творить лютую жесть можно (для однотипного изменения есть и реплейс по регексу полноценный, и макросы, которыми я довольно часто пользуюсь), к тому же, он легковесный и шустрый очень. Но без остальных пунктов как-то печально писать код.
  13. Зачастую на серверах с техносборками ставится базовая коллекция модов: IndustrialCraft BuildCraft OpenComputers Благодаря моду билдкрафта в мире генерируются озера нефти, особенно огромные они в море. Если у вас хватит терпения его выкачать и переработать в дизельное топливо, то наверняка появится вопрос, куда это топливо девать кроме как как в двигатели внутреннего сгорания. В моде IndustrialCraft есть очень интересный генератор со сложным крафтом - полужидкостный генератор. Его особенность в том, что он может вырабатывать из топлива 32 eu/t, но есть большая проблема, передавать в провода он может только 20 eu/t. Данная проблема проявляется только на сервере, в одиночке все нормально. Возможно это разработчики что-то напутали, или так задумано, или чьи-то кривые ручки не туда тыкнули в настройках сервера, однако с 1 ведра топлива можно легко получить 128000 eu. Если запустить его в автоматическом режиме, то он начнет работать импульсами - зарядка внутреннего буфера, отключение, передача 20 eu в провода, включение, зарядка внутреннего буфера ... и т.д Но при этом топливо будет расходоваться не полностью, а с огромными потерями. По 5 мл на запуск, что не есть хорошо. Поэтому буфер всегда должен быть свободен. А постоянно мониторить и вовремя сливать энергию может обычный компьютер из мода OpenComputers. Итак, представляю вашему вниманию автоматический контроллер полужидкостных генераторов на ОС. Я разделил программу для генераторов на 3 уровня. Везде используются разные программы, но они работают на одном и том же принципе. Выбирайте то, что вам больше по душе и вперед строить! Генератор высокого класса Делается чисто на декор и понты Для тех, у кого туго с ресурсами, предлагаю генератор среднего класса. Он не настолько красивый, графония вообще не имеет, но главное, что он довольно низок по потреблению памяти, а так-же скорость обработки данных в разы шустрее. Из минусов - он нессиметричный, хотя это уже дело вкуса каждого. При желании можете налепить батареек и будет вам симметрия. Ну и последний тип генератора - бюджетный на микроконтроллере. От остальных он отличается крайне дешевыми компонентами, хотя со сборкой придется повозиться. Вот такие интересные получились контроллеры полужидкостных реакторов. Качайте нефть скорее, её не так много во всем мире ...
  14. Как вы уже видели, программа бесполезная. Просто поставьте комп с видеокартой 2 уровня, большой монитор 2 уровня где нибудь на улице, и установите на него OpenOS. Вы можете редактировать текст, изменяя данные в таблице (она в коде, не зря меня Монстрик учил). Ну что, разбираем. http://pastebin.com/PwhkZTb0
  15. Дело было вечером, делать было нечего... И тут я случайно зажал горячую клавишу калькулятора, и меня осенило! А ведь калькулятора то для ОС никто не писал еще! Так появилась идея создания этого калькулятора. Что можно про него сказать? Базовый калькулятор который умеет выполнять стандартные математические операции. Требования к ОС: Видеокарта 2 уровня и выше Монитор 2 уровня и выше Компьютер/сервер любого уровня с установленной OpenOS Управление самое простое - мышкой. При создании программы была взята статья Псевдографические интерфейсы в OpenComputers и на основе кода из неё был создан калькулятор. Установка: version 0.2 pastebin -get PaVaRGcd Calculator.lua version 0.3 pastebin -get ZjCTrj5a Calculator.lua P.S. Выражаю благодарность @Doob за статью. Если найдете какие-то баги, недочеты, или возникнут идеи по улучшению, я всех с радостью выслушаю.
  16. Всем здрасти. Скрины: Клиент 1: Клиент 2: Лог сервера: Реализовано: Выдача IP Передача данных по выданым IP Регистрация/удаление доменов Получение IP адреса по домену То что хочется реализовать: Улучшить защиту, возможно сделать шифрование -Улучшить способ передачи данных между внутриигровыми IP Сделать библиотеку для пользовательских программ(С++, Java, Python, итп) для управления\получения данных OC через сервер, а так же поддержку Arduino(Можно будет выводить значения на экран подключеный к Arduino) Добавить поддержку децентрализации если в сети более 1 сервера(Можно будет делать межсерверные DNS-запросы) (Продолжение следует) Плюсы: Можно соединять OC компьютеры стоящие на разных MC серверах Быстрая работа сервера Минусы: Нужна оптимизация и поиск багов Плохая защита Исходники GitHub: https://github.com/TheConnBit/OpenComputersDHCP-DNS P.S. Там же объяснение всех команд, итп Исходники для ленивых (обновлено): Сервер (Запускать через консоль java -jar и лучше в отдельной папке): DHCP-DNS-Server.jar Клиентская библиотека: ddns.lua На скрине показано: подключение к серверу, выдача IP, регистрация домена, запрос IP домена, передача данных, получение, удаление домена, отключение Вообщем, сильно не пинайте за код. Если кто возьмется искать\найдёт баги или будут предложения что улучшить\добавить, пишите мне сюда или на почту bithovalsky@gmail.com Сначало была идея только DHCP сервера, но потом я накнулся на статью Programmist135: http://computercraft.ru/topic/1853-dns/ и реализовал DNS. Последние изменения: - - v1.1 Исправлены названия функций Исправлен перевод Функция Resolve теперь возвращает IP Пофикшены отключения сервером клиентов из за таймаута Echo запроса Список доменов теперь указывается в файле config.properties Изменён способ отправки сообщений по IP, появились порты --Bit
  17. С новым годом, обитатели computercraft.ru! Сегодня, вашему вниманию я представляю игру "Атака бактерий мутантов v0.2". Предыстория: На космическом корабле проводились опыты, по выращиванию бактерий в агрессивной среде. Но случилась авария и космический корабль постигла страшная участь разгерметизации. И лишь сильнейшие бактерии, на кусочке стекла, остались одни в космосе. Смогут ли они адаптироваться? Смогут ли эволюционировать? Смогут ли выжить в этой агрессивной среде? Решать вам! Концепция: Игра разделена на этапы. На данный момент доступно только 2 этапа. 1 этап - мы управляем синий бактерией которая путём реактивного движения должна набрать нужную массу поглощая других бактерий. (в космосе, потом в воде на планете) 2 этап - бактерии научились ходить (действия происходят на планете, на суши) 3 этап - бактерии напали на местных жителей планеты и управляют их сознанием. Могут ПКМ переселяться из тела в тело. Нужно переселяться от меньшего противника к большему, пока те не перестреляли друг друга. В это время происходит гражданская война и инопланетяне друг друга убивают из бластеров стреляющих антивеществом. 4 этап - планета захвачена, нужно управляя телом инопланетянина участвовать в гражданской войне за звание лидера планеты. 5 этап - отбить атаку других инопланетян. Можно кататься в танке. Можно отдавать приказы и управлять союзниками. В прочем, планы на будущее могут сильно меняться. Вполне возможно что эволюция бактерий будет происходить по другому пути чем задумана сейчас. Проблема недостатка художников может совсем свести все планы на нуль. Начиная с 3 этапа нужно рисовать спрайты персонажей, а это не все могут. Что есть в игре: Реалистичная физика 2 режима игры (будет больше) Несколько тестовых уровней, чтобы проверить работоспособность игры (но можно добавить сколько угодно) Параллакс скроллинг планет на фоне Разноцветные, реалистичные звёзды на фоне Логотип и его анимация Миникарта Режим разработчика Менюшки Рабочие настройки (правда не сохранятся при перезапуске) Лёгкое добавление уровней и изменение их свойств Тестовая консоль Антивещество Зум Горячие клавиши во время игры: i - режим разработчика, включаются всякие индикаторы полезные для тестов m - отключаемая миникарта e - переход на следующий уровень, если набрана нужная масса ` - включить тестовую консоль (используется для выявления багов) Управление: Колесо мыши - зум ЛКМ в первом режиме игры даёт выброс массы (реактивное перемещение) Скрины: Видео обзор: (Видео затянутое. Для просмотра геймплея проматывайте до второй части, 1 минуты) Установка: Распаковываем архив и играем. Ссылка на архив: https://yadi.sk/d/1GBAgr71moH2s От разработчиков: Разработку ведут 2 человека: qwertyMAN и electronic_steve + один художник, предоставивший нам изображения планет. Игра позиционирует себя как клон игр Osmos, Spore и Tasty Planet. Написана на lua, с использованием движка love2d. В игре присутствуют заготовки на будущее: Индикатор прогресса в режиме разработчика, свойство наличия ИИ, которое пока не используется в клетках.
  18. В луа можно обрезать строку? Например мне нужно читать сообщения из чата с помощью чат-бокса, искать в сообщении плохие слова и выдавать куда-то уже сообщения без плохих слов. В библиотеке string ничего не нашёл((
  19. Можно ли в чистой Lua (ну или той которая используется в OC) сделать так чтобы две функции выполнялись ДЕЙСТВИТЕЛЬНО одновременно?
  20. Всем привет! В этой теме я расскажу моей программе ---Удалённом рабочем столе на сети OpenNet и моде OpenComputers. Первым делом расскажу как ей пользоваться. Ввод данных: Всё очень просто=) Жмёте на кнопку на клавиатуре, и её нажатие эмитируется на удалённом компьютере. Для обновления экрана --- F5 Для выхода из программы на удалённом компьютере --- F2 Для выхода из программы на локальном компьютере ---F1 Ну....Вроде всё по управлению=) Запуск,настройка и подключение: Подготовка к запуску удалённого терминала: Установить библиотеку thread: local computer = require("computer") computer.SingleThread = computer.pullSignal local thread = {} local mainThread local timeouts local function MultiThread( _timeout ) if coroutine.running()==mainThread then local mintime = _timeout or math.huge local co=next(timeouts) while co do if coroutine.status( co ) == "dead" then timeouts[co],co=nil,next(timeouts,co) else if timeouts[co] < mintime then mintime=timeouts[co] end co=next(timeouts,co) end end if not next(timeouts) then computer.pullSignal=computer.SingleThread computer.pushSignal("AllThreadsDead") end local event={computer.SingleThread(mintime)} local ok, param for co in pairs(timeouts) do ok, param = coroutine.resume( co, table.unpack(event) ) if not ok then timeouts={} error( param ) else timeouts[co] = param or math.huge end end return table.unpack(event) else return coroutine.yield( _timeout ) end end function thread.init() mainThread=coroutine.running() timeouts={} end function thread.create(f,...) computer.pullSignal=MultiThread local co=coroutine.create(f) timeouts[co]=math.huge local ok, param = coroutine.resume( co, ... ) if not ok then timeouts={} error( param ) else timeouts[co] = param or '' end return co end function thread.kill(co) timeouts[co]=nil end function thread.killAll() timeouts={} computer.pullSignal=computer.SingleThread end function thread.waitForAll() repeat until MultiThread()=="AllThreadsDead" end ------------------------------------------------------------------------------- return thread (Только на сервер,на клиенте она не нужна) Установить OpenNet и находится в зоне его покрытия. Установить на сервер его часть: local event= require("event") local thread= require("thread") local opennet= require("opennet") local computer= require("computer") local gpu= require("component").gpu local unicode= require("unicode") local keyboard= require("component").keyboard.address local IP, dis2serv = opennet.getIP() print("Local IP: "..IP) args={...} if args[1]==nil then print("Использование: openviewerS <opennet_ip>") os.exit() end --[[ _, result, reason = opennet.sendrec(args[1], "connecting...") if result==false then print(reason); os.exit() end if args[1]==IP then print("Невозможно инициализировать удалённый доступ со своим устройством.") os.exit() end ]]-- initial=args[1] local function getScreen() screen="" for y=1, 25 do for x=1, 80 do symbol = gpu.get(x, y) screen=screen..symbol end end return screen end local function sendScreen() opennet.send(initial, getScreen()) end function runShell() os.execute("sh") end function reInitial() thread.killAll() thread.init() thread.create(runShell) thread.create(EmulateSignal) thread.waitForAll() end event.listen("Screen", sendScreen) event.listen("Exit", reInitial) function EmulateSignal() while true do opennetIP, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 = opennet.receive() if opennetIP==initial then computer.pushSignal(arg1, keyboard, tonumber(arg3), tonumber(arg4), arg5) end end end thread.init() thread.create(runShell) thread.create(EmulateSignal) thread.waitForAll() Установить на клиент клиентскую часть: local opennet= require("opennet") local term= require("term") local unicode= require("unicode") local event= require("event") args={...} if args[1]==nil then print("Использование: openviewerC <opennet_ip>") os.exit() end initial=args[1] function getScreen() repeat ip, screenRaw=opennet.receive() until ip==initial for sym=1, #screenRaw-160 do io.write(unicode.sub(screenRaw, sym, sym)) end end term.clear() opennet.send(initial, "Screen") getScreen() while true do arg1, arg2, arg3, arg4, arg5 = event.pull() if arg1=="key_down" and arg3==0 and arg4==63 then term.clear() opennet.send(initial, "Screen") getScreen() elseif arg1=="key_down" and arg3==0 and arg4==59 then os.exit() elseif arg1=="key_down" and arg3==0 and arg4==60 then opennet.send(initial, "Exit") else opennet.send(initial, arg1, arg2, arg3, arg4, arg5) end end Для запуска программы надо написать на сервере: openviewerS <IP Адрес клиента> ВНИМАНИЕ!!! Надо ввести именно IP, а не DNS; Единственное поддерживаемое разрешение - 80x25 На клиенте же пишем: openviewerC <IP Адрес сервера> Вот и всё=) Надеюсь,эта программа вам будет полезна ! Неплохо было-бы попасть в вайт-лист
  21. Сделал кнопку через библиотеку forms.lua. Врубаю прогу, всё появляется, но программа почему-то не продолжает свою работу, а выключается сразу после отрисовки всех компонентов. addButton делал по инструкции
  22. Я предлагаю запилить экспериментальный проект. Кодовое название - "Цитадель". Кавайная заставочка - сверху. Суть вкратце такова. Необходимо полностью развиться в Minecraft, с нуля, используя ТОЛЬКО роботов и дронов из OpenComputers. Делать что либо руками запрещается. (Если кто-то читает мою группу в ВК, там мелькал пост одного чувака, который снимает серию летсплеев с похожей идеей.) Для проекта берём сервер в сингле (например). Ставим несложную сборку - например Minecraft 1.12 + OpenComputers 1.7 + какой-нибудь тех. мод с хорошей OC-интеграцией, например - Mekanism. Далее генерим мир. Игрок будет обитать на спавне - в стартовой базе. У него в наличии будет: * закрытый ангар, в котором он живёт (выходить из него игроку нельзя), * вечный источник энергии, * компьютер третьего тира с беспроводной картой и интернет-платой, * пять доков с роботами (док - это ячейка с зарядником и люком наружу, где стоит робот), * пять доков с дронами, * небольшой запас провизии на первое время. Конфигурация дронов и роботов - тир три, с вайфай-картами и чанклодерами. На компы и роботов установлена OpenOS последней версии. Дроны прошиты нет-флашем. Основные задачи проекта: * наладить поставку провизии игроку * наладить добычу и хранение важных ресурсов * развернуть репликацию роботов и дронов Условие поражения: * потеряны все роботы и не выполнены основные задачи Сюжетный обоснуй: Игрок не совсем удачно десантировался с орбиты. У него мало ресурсов, но сохранился рабочий комплект робототехники и ядерный энергогенератор с ресурсом в тысячу лет бесперебойной работы. Атмосфера планеты непригодна для жизни человека. Что думаете по поводу идеи? Какие моды должны войти в состав сборки? Какие технические препятствия видите? Какие поправки стоит внести в стартовые условия? Какие действия по вашему стоит предпринять игроку первым делом?
  23. Программка написанная на love2D рисует фракталы, ставя новую точку проходя определённое расстояние от предыдущей точки до случайно выбранной вершины предварительно нарисованной фигуры. Подробнее в этом видео. Как использовать: Запускаем, ставим мышью несколько точек, выбираем расстояние, которое будет проходить точка (начальная ставится случайно), пробел - пошагово, А - автоматически рисуем. Ну там в окошке есть инфо по управлению. По умолчанию расстояние 1/2, идеально для треугольника, для фигур с большим количеством точек лучше уменьшить. В общем играйтесь кому интересно, скачать скомпилированный вариант можно с гугл диска.
  24. Сколько вы можете придумать способов напечатать фразу "Hello World!" десять раз, при помощи Луа? Мой вклад в копилку: 1) Рекурсией function hello(times) if times > 0 then print "Hello World!"; hello(times-1) end end hello(10) 2) Заменой local source = " " local hello = source:gsub(" ", "Hello World!\n") print(hello)
×
×
  • Создать...