Перейти к публикации
Форум - ComputerCraft

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

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

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

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

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


Блоги

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

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

Категории и разделы

  • Программирование
    • База знаний
    • Библиотеки
    • Робототехника
    • Сетевые технологии
    • Игры
    • Операционные системы
    • Графика
    • Инфраструктура
    • Программы новичков
    • За пределами Minecraft
    • Всякое-Разное
    • Чулан
    • Стол заказов
    • Конкурсы
  • Игровой раздел
    • Игровые сервера
    • Предложения игроков по улучшению игрового процесса
    • Моды и плагины
    • Гайды, обзоры по модам
    • Жалобы на игроков
    • Заявки на разбан
    • Ивенты
  • Общение
    • Ответы на частые вопросы
    • Вопрос-ответ
    • Вопросник по Lua и модам Opencomputers и ComputerCraft
    • Беседка для программистов
    • Беседка-флудилка
    • Шкатулка
  • Технический раздел
    • Новости проекта
    • Предложения по улучшению работы форума и игровых серверов
    • Проблемы в работе игрового сервера, клиента, форума и их решение
    • Дубль аккаунты
    • Обратная связь
    • Архив
  • Новости Независимое государство
  • Беседка Независимое государство

Категории

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

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


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

Искать результаты, содержащие...


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

  • Начать

    Конец


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

  • Начать

    Конец


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

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

  • Начать

    Конец


Группа


AIM


MSN


Сайт


ICQ


Yahoo


Jabber


Skype


Gtalk


Facebook


Twitter


Город


Интересы

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

  1. Я написал две небольшие программы, одна из которых передаёт эвенты нажатий кнопок клавиатуры. Вторая же, наоборот принимает. Вот они: https://pastebin.com/S9iwvvSn https://pastebin.com/qTPHTByk Настройки всего две: port = 23 Порт для связи двух компьютеров. stelsMode = false Невидимый режим. Есть только на принимающем демоне. Полезен когда на компе вашего друга стоит эта прога в автозапуске и ему срочно потребовался комп и его сетевая карта по отдельности. В этот момент программа может написать (если стоит false): "ЧО С СЕТЕВОЙ КАРТОЙ?! Я ЧОТО НЕ ПОНЯЛ ВЕРНИ ОБРАТНО" "У тебя нету сетевой карты. Демон не сможет принимать сообщения!" и спалит контору. Ну, на этом все. Надеюсь Вы не будете бросать в меня тапками и помидорами. Все-же это мой первый пост.
  2. Автокрафт на роботе. Программа не имет GUI. Всё управление осуществляется через командную строку. Для работы вам потребуется робот и сундук. Сундук должен стоять перед роботом. Робот должен иметь следующие улучшения: Улучшение «Контроллер инвентаря» Улучшение «Инвентарь» Улучшение «Создание» Улучшение «База данных (1-ый уровень)» Процессор уровня 2 и выше. Необходимый объём памяти и жёсткого диска зависит от количества предметов в сундуке и сложности рецепта. При тестировании использовался робот со следующими характеристиками: см. скриншот. Базу данных программа сохраняет в текущем каталоге. Поэтому для работы программы нужно создать отдельный каталог. Недостатки. Предварительный подсчёт достаточности ресурсов для выполнения сложного крафта не выполняется. Планируется исправить в будущих версиях. Инструкция с картинками. Man Скачать Версия 0.10.8 Старая версия
  3. Здрассьте, господа, у нас тут превесёлая вещь случилась: спустя полгода разработки (причём круглым числом; 28 мая стартанули) у нас отрелизился репозиторий! Обозвали мы его Hel. В репозитории мы собрали и воплотили в жизнь все хорошие идеи и концепции, которые обсуждались здесь, чтобы получился максимально кавайный способ дистрибуции пакетов. Пользоваться репозиторием не сложнее, чем ставить программы с Pastebin. Для этого нужно знать только название пакета. Одна команда: $ hpm install <нужный пакет> И вуаля! Он уже установлен в нужную папку, все нужные библиотеки загружены и распиханы по системе. Можно запускать и работать. Но по сравнению с OPPM или Pastebin, hel несравненно удобнее. Он легковесный. Простой. Не требует регистрации. И СМС. Чем мы гордимся, безусловно. Установка программ производится с помощью одного легкого клиента (как у Pastebin), но в то же самое время, вам не нужно волноваться о библиотеках или версиях программы. Вы всегда можете найти и установить самую свежую версию (и даже не самую свежую), зная только название пакета (как в OPPM). Кстати, раз уж мы заговорили про OPPM. У нас клиент получился настолько охренительным, что вы можете теперь выкинуть oppm в помойку, наконец-то! В стандартный комплект поставки включён oppm-модуль с кэшированием (иными словами, вам не нужно будет ждать пару минут, пока пробрутфорсятся репозитории, сразу всё качается). Всё быстро, чётко, ясно. Юзается оно так: $ hpm oppm:install <имя пакета> Об остальных фичах читайте уже в мануале hpm, там всё есть.
  4. И было это в стародавние темные времена. Когда Программисты были слабы как дети, Инженеры сильны в растеневодстве и умели работать с реакторами, но Воины были сильнее всех. И появился страшный воин, что сметал всех на своем пути, который жил ради одной великой цели - Священной Цитадели! Страшные были времена, когда все в ужасе шарахались от каждой тени, боясь, что там прячется их погибель. И начали игроки строить бункеры и крепости, чтобы хоть как-то защитить свои жизни. Сложнее всего было Программистам, они не могли ни вырастить себе еды, ни запустить реактор, чтобы обеспечить себя энергией. И тогда однажды, темной ночью, в огромном бункере был построен огромный реактор, который получил название "Сердце Стива". Как гласят предания и древние свитки, данный реактор был построен сумашедшим профессором игроком @@electronic_steve. Согласно чертежам "Сердце Стива" это огромный геотермальный реактор, который питается разным хламом и вырабатывает немерянные гигаваты энергии... Сегодня я раскрою завесу тайны и раскажу вам о том, как построить огромный геотермальный реактор, который будет стабильно вырабатывать 440 eu/t Особенность данного реактора - он вообще не требует урана для своей работы. В качестве топлива используется разный хлам, от булыжника до листьев. Взорвать данный реактор не выйдет ни при каких обстоятельствах. И, что самое интересное, данный реактор без программирования не запустить. Внимание! Данный реактор не рекомендуется к постройке на серверах, в связи с тем, что при его работе довольно сильно нагружается сервер, возможны лаги, резкая просадка фпс и прочие неприятности, вплоть до регенерации региона где стоит данная установка. Данную схему разрешается использовать для проверки своего уровня знания в программировании (а запустить его ох как непросто), а также топовым игрокам, которым уже реально нечем заняться. Официально заявляю, что данная постройка была разработана не мной, а игроком @@electronic_steve, я лишь немного доработал конструкцию и выкладываю сюда. Ну что-же приступим к подготовке строительства реактора. Для начала проверим наличие модов, необходимое для постройки реактора: OpenComputers - мод добавляющий компьютеры и прикладное оборудование для него IndustrialCraft / Mekanism - технический мод, из него будем брать геотермальные генераторы GanysNether - из него возьмем только вулканическую печь Все есть? Тогда готовим МНОГО ресурсов, а именно: IC2/Mex геотермальный генератор - 22 шт IC2/Mex провода высоковольтные ~ 64 шт GanysNether вулканическая печка - 4 шт ОС провода ~ 48 шт ОС транспозеры - 7 шт ОС компьютер Т2 - 1 шт ОС монитор Т2 - 1 шт ОС клавиатура - 1 шт ОС преобразователь энергии - 1 шт По желанию: ОС робот - 1 шт ОС батареи ~ 5 шт ОС зарядка - 1 шт Готовы? Тогда начинаем размечать территорию. Размеры реактора составляют 9х9х6. Заранее предупреждаю, высоту я на 1 блок слегка увеличил, чтобы можно было хоть как-то подлезть под реактор. Дальше все просто, расставляем ОС провода по центру, а так-же поднимаем их вверх на 3 метра. По центру ставим транспозер. Транспозер окружаем по кругу вулканическими печками. Этот транспозер у нас будет распределять мусор по вулканическим печам. Навешиваем, как в продолжение вулканической печи, еще 4 транспозера - они будут выкачивать лаву из вулканических печей и передавать на генераторы. Собственно, на установленные транспозеры лепим генераторы, если у них есть точки выхода энергии, то ими наружу. Получится такой вот ежик с 16 генераторами, но на этом реактор еще не построен. Снизу выбираем любую вулканическую печь и навешиваем на неё транспозер с генераторами. Тоже самое делаем зеркально с другой стороны. Таким образом вы должны навесить 6 генераторов. ВНИМАНИЕ! Вешать генераторы только снизу! Между генераторами заталкиваем 2 ОС батарейки, они нам нужны для автономной работы генератора, пока он будет в отключке. Сверху, в свободные выемки между генераторами запихиваем батарейки, их там 3 штуки влезет. Устанавливаем сундук, в который будет идти всякий хлам, робота и собственно компьютер. Я рекомендую комплектацию оборудования как на скрине, но если есть желание, можете добавить что-то еще. Теперь вооружаемся проводами и лесами, начинаем опутывать весь наш реактор проводами. Собственно не мне вас учить, как правильно и компактно проложить провода, но если кто не понял глядите на картинку, что снизу или на первую. Ну и финальный этап - запуск компьютера для проверки работы транспозеров. Запрашиваем систему о наличии транспозеров, должно отобразиться 7 штук. Собственно на этом постройка великого реактора на транспозерах завершена, теперь можно со спокойной совестью начинать запускать его. Алгоритм работы реактора прост: 1. Транспозер распределитель берет мусор из сундука сверху и по очереди раздает его в 4 вулканических печи 2. Вулканическая печь перерабатывают мусор в лаву 3. Боковые и нижние транспозеры забирают лаву из вулканической печи и распределяют её по генераторам 4. Генераторы преобразуют лаву в энергию и выбрасывают её на провода и так по кругу. При помощи робота можно автоматизировать процесс крафта разного хлама, что лучше всего крафтить увы незнаю, во времена когда данный реактор появился, его питали каменными пулями, так как они крафтились сразу по 32 штуки с 1 булыжника. Сейчас - все на ваш выбор. Реактор успешно был построен, теперь остается только написать ПО для него и можно спокойно генерировать энергии не опасаясь, что он рванет, закончится уран или еще что-то. А на этом я с вами прощаюсь. Поведал вам столь необычную схему @@Asior, от всей души благодарю проект http://computercraft.ru а также людей, что принимали участие в постройке "Сердце Стива", всячески подсказывали, объясняли, рассказывали и т.д.: @@Fingercomp, @@electronic_steve @@qwertyMAN @@Asummonster Ну и конечно же админа @@Alex, за то, что забыл отключить крафт вулканической печки. Всем удачи, надеюсь вы сможете запустить данный реактор без каких-либо проблем, а я пойду выкину ненужный теперь радий и наконец то медведя запущу, погреться у теплого реактора... P.S. Надеюсь все, кто заметил отсылки к себе, во вступительном слове данной статьи не будут держать на меня зла, надо же было как-то привлечь внимание целевой аудитории. P.S.S. Да программы нет, моя цель была только показать какую дичь раньше строили, а запускать это, уже вам.
  5. Привет всем! Я новичок в OpenComputers поэтому почитав вики я решил накодить свою 1ую простенькую прогу. Программу назвал MineInfo Данная программа признана для того чтобы выводить информацию о компьютере. На самом деле эта программа не нуждается в обьяснениях. Все очень понятно эта программа работает на local computer = require("computer") Первая строчка - Время работы (в секундах) Вторая строчка - Максимум энергии которая может хранить сеть (к которой подключен компьютер) Третья строчка - Всего памяти в компьютере Четвертая строчка - Свободная память в компьютере Как же установить эту программу Особенно эта команда подойдет для новичков которые не знают как качать проги с пастебина))) ВНИМАНИЕ! В компе должна быть интернет карта!!! Вот команда: pastebin get -f XTRtYUab /bin/info Потом просто пишем info и получаем информацию о системе) Примечание: Если вы хотите поменять команду info на другую переходим в директорию bin и пишем mv -f info {здесь пишем нужную команду}
  6. Тут принимаются идеи, баги, помощь. Будут новости. github: https://github.com/Avaja/OpenTechnology
  7. Totoro

    3D-Принтер

    Трехмерная печать в Minecraft (инструкции для самых маленьких) Начиная с версии 1.5.4, в OpenComputers появляется интересный девайс - трехмерный принтер. Он дает возможность печатать декоративные блоки любой формы и цвета. Причем не только статичные блоки, но и двери/люки, кнопки и рычаги! Давайте рассмотрим, для чего он может пригодиться, и как именно с ним работать. 1. Цель Как и в предыдущих гайдах, первым делом поставим себе цель. Мы будем создавать стенную плитку со сквозным орнаментом, в виде морды крипера. Я не буду приводить в этом гайде рецепты предметов, так как их легко найти в NEI, или в статьях на gamepedia. 2. Обзор принтера 3D-принтер - это периферическое устройство, которое должно быть подключено к работающему компьютеру. Оно представляет собой блок, с двумя внутренними слотами: Верхний слот предназначен для специальной печатной массы (изготовляется из редстоуна, гравия, древесного угля и воды). Принтер вмещает два стека печатной массы (256 000 ед). Нижний слот занимает картридж с красителями. Объем внутреннего хранилища - два картриджа краски (100 000 ед). По команде от компьютера, принтер берет немного печатной массы и краски и "распечатывает" в крайний правый слот запрограммированную модель. На модель из этого гайда, состоящую из 21 фигуры, принтер потратил 424 единицы массы и 314 единиц краски. 3. Отпечатанный блок Модель для печати задается в виде списка "фигур" - параллелепипедов. Каждая фигура отмечена координатами противоположных углов. Она имеет свою текстуру, цвет оттенка (если необходимо) а также состояние (true/false). Максимальное количество фигур в модели - 24, по умолчанию. Координаты блока тремя числами (X, Y, Z) в пределах от 0 до 16. Блок может переключать свое состояние, когда игрок кликает по нему правой кнопкой мыши, или на блок подается сигнал редстоуна. По умолчанию блок имеет форму, заданную блоками с состоянием false, и сменяет ее на форму из блоков с состоянием true, при активации. Кроме того блок имеет несколько дополнительных общих флагов, которые определяют его название, описание и некоторые другие параметры. 4. Программирование принтера Есть два способа распечатать свою модель. Через компонент принтера и прямое управление, либо при помощи стардартной программки print3d от Сангара. 4.1 Компонент принтера Подключение принтера ничем не отличается от подключения любого другого устройства: local com = require('component')local printer = com.printer3d Компонент предоставляет набор функций для управления: reset() - сброс настроек и остановка печати setLabel(value:string) - задаем название будущего блока getLabel():string - получаем текущее название setTooltip(value:string) - задаем описание блока getTooltip():string - получаем описание setRedstoneEmitter(value:boolean) - определяет, излучает ли блок сигнал редстоуна в активированном состоянии isRedstoneEmitter():boolean - возвращает true, если блок излучает сигнал в активном состоянии setButtonMode(value:boolean) - определяем поведение блока при активации. Если true, то блок автоматически возвращается в неактивное состояние через несколько секунд после активации (как кнопка) isButtonMode():boolean - возвращает true, если блок находится в режиме "кнопки" addShape(minX:number, minY:number, minZ:number, maxX:number, maxY:number, maxZ:number, texture:string[, state:boolean=false][,tint:number]) - добавляет новую "фигуру" к форме блока. Фигура задана координатами. texture - название текстуры, state - для какого состояния фигура предназначена, tint - цвет оттенка фигуры getShapeCount():number - возвращает количество фигур в модели getMaxShapeCount():number - возвращает максимально возможное количество фигур commit([count:number]) - посылает принтеру текущую конфигурацию и начинает печать (count - количество копий, если не задано - равно 1) status(): string, number or boolean - возвращает состояние принтера - "buzy" и процент готовности, или "idle" и готовность предмета (true/false). 4.2 Программа print3d Код программы не включен в мод по умолчанию, поэтому его надо скачать из интернета. Последнюю версию можно найти на ГитХабе автора: https://github.com/OpenPrograms/Sangar-Programs/blob/master/print3d.lua Либо скачать с Pastebin: http://pastebin.com/b5rD8KcY (поставьте интернет-плату, и наберите в консоли компьютера команду pastebin get b5rD8KcY print3d) Эта программа по сути, читает параметры модели из текстового файла и передает принтеру. Формат вызова программы: print3d FILE [count] Где FILE - название файла с моделью, а необязательный параметр count - количество копий модели. Модели имеют простой формат - все параметры записываются в таблицу, по аналогии с Луа. Вот образец файла с моделью. { -- Это - название модели. Т.е. название будущего блока, которое будет видно -- в инвентаре и подсказке Waila. Название по умолчанию - "3D Print" label = "Example Model", -- Это описание предмета, такое, как будет видно в инвентаре. Если не задано, -- предмет не будет иметь описания tooltip = "Это демонстрационная модель, показывающая все возможности", emitRedstone = false, --[[ Если этот параметр равен false, блок работает как дверь, сменяя свое состояние при сигнале редстоуна. Если параметр равен true, блок работает как кнопка или рычаг - излучая сигнал при смене состояния. При этом блок не реагирует на сторонний сигнал. По умолчанию параметр равен false. ]] buttonMode = false, --[[ Если этот параметр равен false, модель работает как дверь или рычаг - то есть остается в том состоянии, в которое установлен игроком. Если параметр равен true, модель автоматически возвращается в неактивное состояние через несколько секунд после активации. По умолчанию параметр равен false. ]] -- Это список фигур модели, которые определяют, как она выглядит. -- Модель должна содержать как минимум одну фигуру (параллелепипед) -- в неактивном состоянии. -- Фигуры не могут быть "плоскими" т.е. не иметь объема. -- Каждая фигура задана шестью числами: minX, minY, minZ, maxX, maxY, maxZ. -- (Координаты двух противоположных углов.) -- Если смотреть спереди, ось X направлена вправо, ось Y - вверх и ось Z - вглубь. -- Дополнительно, каждая фигура длолжна обладать текстурой. Для того чтобы -- определить название текстуры, вы можете воспользоваться Определителем Текстуры -- (Texture Picker), кликнув им по нужному блоку. -- -- Модель имеет два состояния - неактивное (false, состояние по-умолчанию) -- и активное (true, состояние после активации блока). shapes = { -- Фигура идет от точки <0, 0, 0> (левый нижний угол) до <8, 8, 8> (середина), -- и имеет текстуру блока лазурита. { 0, 0, 0, 8, 8, 8, texture = "lapis_block" }, -- Фигура идет из точки <8, 8, 8> (середина) в <16, 16, 16> (правый верхний угол), -- и закрашена текстурой дубовой листвы. Фигура принадлежит активному состоянию -- модели и имеет светло-зеленый оттенок. { 8, 8, 8, 16, 16, 16, texture = "leaves_oak", state = true, tint = 0x48B518 } }} Т.е. описание модели просто содержит перечень всех тех параметров, которые задаются при помощи компонента, и список фигур из которых модель состоит. Набор тестовых моделей для изучения, можно найти здесь: https://github.com/OpenPrograms/Sangar-Programs/tree/master/models 5. Проектирование модели Разобьем мысленно рисунок запланированной модели на параллелепипеды. Она будет представлять собой тонкую плитку посередине блока, наподобие стекла или решетки. Руководствуясь сеткой координат и образцом выше, составим описание модели для текстового файла: { label = "Плитка 'Морда крипера'", emitRedstone = true, buttonMode = false, tooltip = "Секретный рычаг в виде головы крипера" shapes={ {0,14,7, 16,16,9, texture="quartz_block_side", tint=0x8eb200}, {0,2,7, 2,14,9, texture="quartz_block_side", tint=0x8eb200}, {6,10,7, 10,14,9, texture="quartz_block_side", tint=0x8eb200}, {14,2,7, 16,14,9, texture="quartz_block_side", tint=0x8eb200}, {2,2,7, 4,10,9, texture="quartz_block_side", tint=0x8eb200}, {4,8,7, 6,10,9, texture="quartz_block_side", tint=0x8eb200}, {10,8,7, 12,10,9, texture="quartz_block_side", tint=0x8eb200}, {12,2,7, 14,10,9, texture="quartz_block_side", tint=0x8eb200}, {6,2,7, 10,4,9, texture="quartz_block_side", tint=0x8eb200}, {0,0,7, 16,2,9, texture="quartz_block_side", tint=0x8eb200}, {0,14,7, 16,16,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {0,2,7, 2,14,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {6,10,7, 10,14,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {14,2,7, 16,14,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {2,2,7, 4,10,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {4,8,7, 6,10,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {10,8,7, 12,10,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {12,2,7, 14,10,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {6,2,7, 10,4,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {0,0,7, 16,2,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {2,2,8, 14,14,9, texture="quartz_block_side", tint=0xe0301e, state=true}}} Итак, наша плитка имеет двойной набор фигур - для двух состояний, окрашенных в текстуру кварца с зеленым оттенком. Кнопка будет работать как рычаг, испуская сигнал в активном состоянии. Откройте файл командой open creeper. Скопируйте код плитки выше и вставьте в файл кнопкой [insert]. Затем сохраните ([Ctrl]+) и покиньте редактор ([Ctrl]+[W]). 6. Печать Все готово, принтер заправлен, модель спроектирована. Отправляем ее на печать! print3d creeper 7. Итоги Enjoy!
  8. Я предлагаю запилить экспериментальный проект. Кодовое название - "Цитадель". Кавайная заставочка - сверху. Суть вкратце такова. Необходимо полностью развиться в Minecraft, с нуля, используя ТОЛЬКО роботов и дронов из OpenComputers. Делать что либо руками запрещается. (Если кто-то читает мою группу в ВК, там мелькал пост одного чувака, который снимает серию летсплеев с похожей идеей.) Для проекта берём сервер в сингле (например). Ставим несложную сборку - например Minecraft 1.12 + OpenComputers 1.7 + какой-нибудь тех. мод с хорошей OC-интеграцией, например - Mekanism. Далее генерим мир. Игрок будет обитать на спавне - в стартовой базе. У него в наличии будет: * закрытый ангар, в котором он живёт (выходить из него игроку нельзя), * вечный источник энергии, * компьютер третьего тира с беспроводной картой и интернет-платой, * пять доков с роботами (док - это ячейка с зарядником и люком наружу, где стоит робот), * пять доков с дронами, * небольшой запас провизии на первое время. Конфигурация дронов и роботов - тир три, с вайфай-картами и чанклодерами. На компы и роботов установлена OpenOS последней версии. Дроны прошиты нет-флашем. Основные задачи проекта: * наладить поставку провизии игроку * наладить добычу и хранение важных ресурсов * развернуть репликацию роботов и дронов Условие поражения: * потеряны все роботы и не выполнены основные задачи Сюжетный обоснуй: Игрок не совсем удачно десантировался с орбиты. У него мало ресурсов, но сохранился рабочий комплект робототехники и ядерный энергогенератор с ресурсом в тысячу лет бесперебойной работы. Атмосфера планеты непригодна для жизни человека. Что думаете по поводу идеи? Какие моды должны войти в состав сборки? Какие технические препятствия видите? Какие поправки стоит внести в стартовые условия? Какие действия по вашему стоит предпринять игроку первым делом?
  9. На днях в чате прозвучал вопрос, как убрать чёрные полосы по краям экрана. На форуме есть замечательная библиотека от @ECS, которая хорошо решает поставленную задачу: http://computercraft.ru/topic/1130-avtomaticheskii-mssahtab-monitora-izbavliaemsia/ Но есть два нюанса: 1) Код библиотеки явно избыточен. 2) При чтении кода библиотеки создаётся впечатление, что она работает на неведомой магии тёмных сил, что демотивирует новичков, изучающих OpenComputers. Я намерен восполнить данный недостаток. Прочтение этого гайда поможет любому желающему написать кусочек кода под нужды конкретной программы, не подтягивая библиотечный код. Благодарю @Totoro за предоставленную информацию: 1) Текстура блока имеет размер 16 px, а ширина рамки монитора – 2 px; 2) Высота символа на экране в два раза больше его ширины. Данной информации достаточно для получения всех необходимых формул. Приступим: Первый шаг: получить соотношение сторон экрана, выраженное в символах В мире Майнкрафта текстура блока имеет размер в 16 пикселей. На рамку с каждой стороны тратится по 2 пикселя независимо от размера монитора. Очевидно, что размер монитора в пикселях кратен 16 и пропорционален количеству использованных блоков, а размер полезной части экрана всегда меньше размера монитора на 4 пикселя как по вертикали, так и по горизонтали. Поэтому разрешение нескольких мониторов, выставленных в ряд, всегда составит 16*n-4 пикселей по соответствующей координатной оси. Это подтверждает и формула от @ECS, реализованная в функции calculateAspect(screens), но имеющая более сложный вид. Я предлагаю и вовсе отказаться от отдельной функции, т. к. в текущих условиях это будет напрасной тратой ресурсов. Немного поясняющего кода: -- размер монитора в блоках sw,sh = component.screen.getAspectRatio() -- размер экрана монитора с учётом затрат на рамку: sw_ = sw*16-4 sh_ = sh*16-4 -- соотношение сторон экрана, выраженное в пикселях текстуры блока sa = sw_/sh_ -- соотношение сторон экрана, выраженное в символах sa = 2*sw_/sh_ -- оно же без промежуточных присваиваний: sa = 2*(sw*16-4)/(sh*16-4) -- оно же после упрощения формулы и сокращения количества операций sa = (sw*2-0.5)/(sh-0.25) Второй шаг: скорректировать разрешение графической карты под соотношение сторон экрана Теперь требуется получить максимально доступное разрешение GPU и соответствующее ему соотношение сторон: -- максимально возможное разрешение графической карты в символах gw, gh = gpu.maxResolution() -- соотношение сторон при максимальном разрешении в символах ga = gw/gh -- формулы, полученные из предыдущей, и которые пригодятся чуть позже gw = gh*ga gh = gw/ga Для определения дальнейших действий следует вспомнить о физическом смысле соотношения сторон. Исходя из приведённых выше формул, sa и ga можно назвать коэффициентами горизонтальности. Сравнивая их, можно определить, что по горизонтали более вытянуто разрешение либо видеокарты, либо монитора. Понятно, что если монитор имеет больший коэффициент горизонтальности, то для приведения к нему коэффициента горизонтальности видеокарты следует уменьшить её разрешение по вертикали. В ином случае следует уменьшать разрешение GPU по горизонтали: -- код в понятной форме, использованы формулы из предыдущего фрагмента if sa>ga then -- недостаточная горизонтальность GPU ga=sa -- привести горизонтальность в соответствии с экраном gh = gw/ga -- за счёт уменьшения высоты else -- избыточная горизонтальность GPU ga=sa -- привести горизонтальность в соответствии с экраном gw = gh*ga -- за счёт уменьшения ширины end -- код после сокращения лишних операций if sa > gw/gh then gh = gw/sa else gw = gh*sa end Третий шаг: скорректировать разрешение графической карты под нужны программы Вычисленное на предыдущем шаге разрешение может оказаться дробным, и перед использованием его следует округлить. Возможно, что перед этим разрешение должно быть приведено к желаемому масштабу, как это сделано в библиотеке @ECS. Эта часть, скорее всего, не требует пояснений, и готовый код будет, например, таким: -- код для автоматической подстройки разрешения графической карты под размер монитора -- почти не оставляет чёрных полос по краям экрана -- полное исключение полос возможно только при отсутствии округления разрешения local component = require"component" local gpu, screen = component.gpu, component.screen function set_proportional_resolution( scale ) -- коррекция допустимых пределов масштаба if not scale or scale > 1 then scale = 1 elseif scale < 0.1 then scale = 0.1 end -- соотношение сторон монитора в символах: local sw,sh = screen.getAspectRatio() local sa = (sw*2-0.5)/(sh-0.25) -- запрос и коррекция максимального разрешения GPU local gw, gh = gpu.maxResolution() if sa > gw/gh then gh = gw/sa else gw = gh*sa end -- установка нового разрешения GPU с учётом заданного масштаба gpu.setResolution( math.floor(gw*scale), math.floor(gh*scale) ) end -- тест работоспособности на нескольких вариантах масштаба -- в процессе можно видеть, что на некоторых масштабах чёрные полосы имеют больший размер, чем на других local w,h local unicode = require"unicode" for i=0.1, 1, 0.1 do set_proportional_resolution(i) w,h = gpu.getResolution() gpu.fill(1,1,w,h, unicode.char(0x2592)) os.sleep(2) endПриведённый код можно сократить ещё сильнее, например, избавившись от масштабирования, которое может отвлекать читателя от подгонки соотношения сторон. Полное исключение чёрных полос При выполнении этого кода можно видеть, что чёрные полосы не исчезают полностью, и на одних масштабах проявляются сильнее, чем на других. Предположим, требуется полностью избавиться от чёрных полос. Можно было бы написать код и для этого случая, но эта задача не всегда решаема. Кроме того, количество решений сильно ограничено, и не любой интерфейс можно будет подогнать под найденные решения. Пример №1: Монитор максимального допустимого размера 8x6; GPU Tier3 обеспечивает максимальное разрешение 160x50. Условное разрешение монитора в целых символах: sw = 8*8-2 = 62 sh = 6*4-1 = 23 Допустимые разрешения GPU, которые обеспечат отсутствие полос: 62x23 и 124x46. Пример №2: Монитор 6x5; GPU Tier1 обеспечивает максимальное разрешение 50x16. Условное разрешение монитора в целых символах: sw = 6*8-2 = 46 sh = 5*4-1 = 19 Нет разрешений GPU, обеспечивающих полное отсутствие полос. Пример №3: Монитор 5x5; GPU Tier1 обеспечивает максимальное разрешение 50x16. Условное разрешение монитора в целых символах: sw = 5*8-2 = 38 sh = 5*4-1 = 19 Разрешения GPU 50x16 недостаточно для размещения поля символов 38x19. Но если присмотреться внимательно, и вспомнить, что нам важно соотношение, то поле символов можно сократить до 2x1, избавившись от общего делителя 19. В этом случае допустимых разрешений GPU предостаточно, начиная от 2x1 и заканчивая 32x16. Во всех этих случаях пустых чёрных полос на мониторе не будет. Автоматизация этих вычислений вряд ли целесообразна. Скорее всего, имеет смысл примерно прикинуть необходимое разрешение для конкретного интерфейса, выбрать желаемый размер экрана, графическую плату, и выполнив приведённые выше вычисления, уже окончательно определить рабочее разрешение и затем подогнать интерфейс под него. Вот, и вся магия. То, что выглядит сложным, не всегда является таковым на самом деле.
  10. Привет всем механикам-технологам, и просто мимопроходящим. В этой небольшой статье я расскажу вам обо всех возможностях такого замечательного мода OpenTechnology. OpenTechnology является аддоном к всеми любимому моду OpenComputers. Автор мода известен как NEO. Тут Ссылка вы можете ознакомиться с его блогом, где он выкладывал обновления своего мода, делился мыслями и т.д. Данный аддон добавляет в игру некоторые новые структуры, предметы и блоки, которые сделают вашу игру более комфортной и расширят возможности роботов. Заранее предупреждаю, дистанция, сила атаки и расход энергии могут быть изменены в конфигурации мода. В этом обзоре я использую базовые настройки, которые идут с модом. Итак, коль упомянул роботов, начнем пожалуй с них. Довольно часто роботы сбегают от игроков и потом начинаются мученические поиски беглеца. Но OpenTechnology может вам помочь в поисках беглецов при помощи "Сканера роботов" :/. Он сканирует пространство радиусом в 40 метров и выводит в чат координаты беглеца. Выглядит это чудо продвинутых технологий, как собственно сканер, экран, маленькая клавиатура и полоса уровня заряда. Заряжается он в любом энергохранилище, если такового нету, можно затолкать в зарядник и он там зарядится. Тесла Апгрейд - оружие массового поражение для робота. Наносит сильный электрический разряд (10 урона) всем мобам окружающих робота в радиусе 10 метров. Урон распределяется равномерно между всеми мобами. После каждого разряда катушка уходит в долгий цикл перезарядки. Будьте бдительны, расход энергии на вспышку очень высок. Технический уровень апгрейда Т3. Поддерживает следующие методы: tesla --название апгрейда attack() --атакует всех сущностей равномерно распределяя между ними урон. После вспышки перегревается checkOverHeated() --возвращает состояние катушки перегрелась или нет getMaxRadius() --возвращает максимальный радиус атаки. getDamage() --возвращает силу урона. Он распределяется равномерно, пример: допустим наш урон 20, --если при атаке в зоне поражения находяться 5 сущностей, каждый получит 4 урона. getCoolingTicks()--возращает количество тиков требуемое для охлаждения катушки. Радар Апгрейд и Антенна радара :/ - приборы позволяющие узнать точное местоположение мобов, игроков, лежащих на земле предметов в радиусе 15 метров. Интересен тем, что возвращает много точной информации о каждом, кто попал в зону сканирования. Но расход энергии к сожалению нереально велик. Устанавливаются как на робота, так и как внешнее оборудование для компьютера. Технический уровень апгрейда Т1. Радар поддерживает следующие методы: radar --название апгрейда getPlayers() --возвращает таблицу со списком игроков что попали в зону скана. --Радиус сканирования можно задать, без значений сканирует на максимальную дистанцию getMobs() --возвращает таблицу со списком мобов, что попали в зону скана getItems() --возвращает таблицу со списком предметов которые лежат на земле, что попали в зону скана getEntities() -- полное сканирование. Возвращает таблицу всех существ (предметы тоже) содержимое таблицы: {{armor = <уровень брони>, distance = <дистанция от сканера до существа>, health = <уровень здоровья>, maxhealth = <максимальный уровень здоровья>, name = <имя существа>, x = <координата по x>,y = <координата по y>,z = <координата по z>}...n = <количество существ>} Реактор Апгрейд - генерирует энергию за счет распада урановых стержней. Принцип работы тот же, что и у базового улучшения "Генератор", только в виде топлива используются одинарные урановые стержни. Зато энергии вырабатывает нереально много и довольно продолжительное время. Затолкать сдвоенные и счетверенные урановые стержни не представляется пока возможности, похоже размеры реактора не позволяют разместить их в нем. Технический уровень апгрейда Т3. Реактор поддерживает следующие методы: reactor --название апгрейда activate() --запустить реактор deactivate() --заглушить реактор insert() --переместить из активного слота стержень в реактор count() --возвращает остаток времени работы уранового стержня. В тиках. На этом улучшения для роботов заканчиваются, но вот предметы мода еще нет. Контроллер АДД, Часть Антенны, Ячейка Антенны - это фрагменты огроменной вышки, которая позволяет передавать данные на огромное расстояние (2 км). Антенну строить довольно дорого, но если вы желаете дистанционно управлять роботами на большом расстоянии, это выбор для вас. К сожалению расход энергии на передачу данных довольно большой, а так-же невозможно открыть несколько каналов, но дистанцию можно еще сильнее увеличить, если задрать антенну еще выше. Для её постройки требуется соорудить следующую структуру: 1 блок Контроллера АДД, 14 блоков Частей Антенны, 1 блок Ячейки Антенны lde --название антенны События: ld_message --Агрументы - адрес отправителя, дистанция, сообщение :/ Антенна поддерживает следующие методы: getMaxDistance() --Возвращает максимальную дистанцию передачи данных getDistance() --Возвращает установленное расстояние отправки данных getRealDistance() --Возвращает реальное расстояние отправки данных. Оно рассчитывается так: Установленное Расстояние * (LDAControllerY + 16) / 256. Чем выше антенна - тем больше приближение к установленному расстоянию передачи getChannel() --Возвращает текущий канал передачи open(channel:int) --Открывает канал, очень долго, поэтому лучше не переключать часто setDistance(distance:int) --Устанавливает максимальное расстояние для передачи maxPacketSize() --Возвращает максимальный размер пакета broadcast(data:string) --Рассылает сообщение по каналу, услышат сообщение все кто к нему подключен :/ send(address:string, data:string) --Отправляет сообщение конкретному адресату. Оба должны работать на одном канале :/ Мировой интерфейс - креативный блок, который позволяет получать полную информацию по игроку, его показатели жизни, текущее местоположение, содержимое инвентаря и прочее. Фактически это урезанный командный блок, который помогает всячески отслеживать информацию по игрокам. Поддерживает следующие методы: world_interface --название компонента getOnlinePlayers() --выводит таблицу со списком игроков онланй getSpawnLocation(<Имя игрока>, <номер мира>) --выводит координаты точки воскрешения указанного игрока в указанном мире getActiveEffects(<Имя игрока>) --выводит таблицу наложенных на игрока эффектов, а также продолжительность действия и его цифровой код (Id) getPlayerHealth(<Имя игрока>) --выводит уровень текущего и максимального здоровья игрока getPlayerFoodStats(<Имя игрока>) --выводит показания запасов еды. Если используется какой-то мод, который добавляет сытости, то его параметры тоже выводятся в отдельную переменную getPlayerPosition(<Имя игрока>) --выводит поцицию игрока относительно глобальных координат в виде x,y,z,n где n-номер мира. getStackInSlot(<Имя игрока>, <номер ячейки инвентаря>) --выводит информацию по предмету что лежит в указанной ячейке инвентаря игрока destroyStackInSlot(<Имя игрока>, <номер ячейки инвентаря>) --уничтожает предмет находящийся в указанном слоте инвентаря игрока isFlying(<Имя игрока>) --проверяет летит игрок или нет. Возвращает true если летит или false иначе kill(<Имя игрока>) --убивает игрока :/ heal(<Имя игрока>, <ед исцеления>) --моментально вылечивает игрока на указанное количество единиц kick(<Имя игрока>, <Причина>) --отключает игрока от сервера по указанной причине Контроллер мощности - прибор предназначенный для прераспределения энергии между энергобуферами или проводами. Внешне выглядит как энергобуфер, имеет 5 сторон приема энергии и 1 сторону для вывода её. Имеет внутренний интерфейс в виде двух полос с энергией и цифровым обозначением. Принцип действия: принимает в первый буфер любое количество энергии, затем при помощи компьютера перемещает указанную часть энергии во второй буфер и благополучно выводит её из себя через порт вывода. Фактически это управляемый компьютером трансформатор. Взаимодействует только с модом IC2. Имеет довольно интересную особенность, энергия из выходного буфера перетекает в энергобуфер моментально, несмотря на все ограничения по уровням пропуска энергии, тоесть 1000 eu/t перемещается в базовый деревянный энергобуфер не со скоростью 32 eu/t, а моментально, как ни странно, но взрыва не следует. Поддерживает следующие методы: energy_controller --название компонента getInputBufferCapacity() --возвращает текущий уровень энергии входного буфера getOutputBufferCapacity --возвращает вместимость входного буфера getEnergyInputBuffer() --возвращает текущий уровень энергии выходного буфера getEnergyOutputBuffer --возвращает вместимость выходного буфера transform(<количество единиц энергии>) --перемещает указанное количество энергии из первого буфера во второй. Pid :/ - нажимная плита для взаимодействия компьютера с инвентарем игрока. Для взаимодейсвия с ней, надо встать на неё. Поддерживает следующие методы: pid --название компонента pullStackInSlot(<сторона где сундук>, <номер слота из инвентаря игрока>, <номер слота сундука>, <количество перемещаемых предметов>) --перемещает предмет из инвентаря игрока в сундук :/ pushStackInSlot(<сторона где сундук>, <<номер слота сундука>, <номер слота из инвентаря игрока>, <количество перемещаемых предметов>) --перемещает предмет из сундука в инвентарь игрока :/ getStackInSlot(<номер слота из инвентаря игрока>) --возвращает таблицу с информацией о содержимом слота из инвентаря игрока Связыватель инвентаря :/ - прибор который связывает инвентарь игрока с компьютером, то есть через него можно программно работать с инвентарем активировавшего его игрока. Работает независимо от местоположения игрока. Удобная штука для быстрой замены комплекта инструментов или например для быстрого очищения инвентаря от всякого хлама. Поддерживает следующие методы: pib --название компонента getTargetName() --возвращает ник привязанного игрока isConnected() --возвращает true/false если игрок доступен для работы, короче онлайн checkBinding() --проверяет привязку к игроку. Возвращает true/false pullStackInSlot(<сторона где сундук>, <номер слота из инвентаря игрока>, <номер слота сундука>, <количество перемещаемых предметов>) --перемещает предмет из инвентаря игрока в сундук :/ pushStackInSlot(<сторона где сундук>, <<номер слота сундука>, <номер слота из инвентаря игрока>, <количество перемещаемых предметов>) --перемещает предмет из сундука в инвентарь игрока :/ getStackInSlot(<номер слота из инвентаря игрока>) --возвращает таблицу с информацией о содержимом слота из инвентаря игрока :/ Чатбокс - прибор позволяющий отправлять и получать сообщения из игрового чата. Имеет ограничение по радиусу действия и не может отправлять личные сообщения. chatbox --название компонента События: chat_message --Агрументы - адрес чатбокса, Ник игрока, сообщение chat_command --Возращает данные те же что chat_message. Однако вызывается только в том случае, если первый символ в сообщении был #. Кроме того, такие сообщения не видны в чате (только в чатбоксах). Поддерживает следующие методы: getRadius() --возвращает установленный радиус передачи сообщения getMaxRadius() --возвращает максимальный радиус передачи сообщения setRadius(<дистанция>) --устанавливает радиус в котором будут видны сообщения say(<Текст>) --выводит в чат сообщение Креативный чатбокс - креативный прибор позволяющий отправлять и получать сообщения из игрового чата. Не имеет ограничения по радиусу действия, умеет отправлять личные сообщения. admin_chatbox --название компонента События: chat_message --Аргументы: адрес компонента, id измерения, playerPosX, playerPosY, playerPosZ, дистанция до игрока, имя игрока, сообщение. chat_command --Возращает данные те же что chat_message. Однако вызывается только в том случае, если первый символ в сообщении был #. Кроме того, такие сообщения не видны в чате (только в чатбоксах). Поддерживает следующие методы: say(message: string) --Отправляет всем игрокам сообщение message. tell(name: string, message: string) --Отправляет сообщение message игроку с ником name. Есть еще парочка блоков, но увы они отключены внутри мода, поэтому посмотреть на них не удастся. Кому интересно, это телепорт - который умеет отправлять не только существ, но и блоки(тех же роботов), большой конденсатор - просто батарейка с запредельной емкостью, она используется как накопитель энергии для телепорта. На момент написания статьи мод имеет версию OpenTechnology-0.6.17. Не все описанные блоки работают, не буду перечислять все проблемы этого мода, просто на каждой неработающей детали или функции поставлю знак ":/", надеюсь автор мода прочитает эту статью и постарается починить все, что неработает. Собственно программируйте, разрабатывайте новые интересные схемы и думаю мод OpenComputers вместе с аддоном OpenTechnology вам в этом очень помогут. А с вами был Asior и до скорых встреч на проекте Computercraft.ru
  11. Представляю вам свою первую более-менее серьезную программу для openComputers. Ее единственная функция - проиграть указанный музыкальный файл. Файл формата nbs, это трекерная музыка с майнкрафтовской спецификой (т.е. написана для музыкальных блоков) Для создания и редактирования файлов в этом формате используется программа Minecraft Note Block Studio, ссылка на тему на майнкрафтфоруме: http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-tools/1260747-minecraft-note-block-studio Там же можно найти уже готовые музыкальные треки. Большую часть их программа сможет воспроизвести, проблемы будут с треками, содержащими нестандартные музыкальные инструменты и использующие диапазон шире двух октав. Но даже их можно проиграть, предварительно поправив в редакторе, он делает это автоматически. Ссылка на программу: http://pastebin.com/yrtLYBhz Использование очень простое, параметр всего один - относительный путь до файла (с расширением).Да, и помимо собственно компьютера вам понадобятся железные музыкальные блоки из Computronics, подключенные к нему. Штук восемь, можно больше или меньше, если их будет меньше, чем того требует трек, программа помрет, если больше - запас, как говорится, карман не тянет. В планах упаковать программу в библиотечку, сделав возможность включать плеер из других программ. Например, для саундтрека в играх. Еще хотелось бы решить проблему со сбивающимся ритмом, если подскажете способ создавать задержки точнее, чем через pullSignal и os.sleep, буду очень благодарен. Видео работы:
  12. Предлагаю добавить keypad из opensecurity в вайтлист wg, +копнуть в сторону плагинов на кастомные флаги и позволить игрокам разрешать использование устройств из opencomputers в своём привате
  13. Доброго времени суток все, кто меня помнит и не помнит, а тем кто не знал и еще и забыл вообще печеньку. Как всегда, в своем репертуаре, я захожу, выкладываю какую-то идею и ухожу с видом будто это не я. Не могу сказать, что это не такой же случай, но сейчас не об этом. Возможно, на первый взгляд, идея может показаться слишком сложной, но, возможно, оно того стоит. Думаю, на проекте есть хорошие программисты на Java, C и, тем более, Lua. Предлагаю написать мод, который заполнит невидимую пропасть между IC2(или нет) и OC, которую, возможно, и не заметно. Мод, который добавит в игру собираемую из брони IC2 и компонентов OC броню, не отличающуюся или даже лучше по свойствам от IC и имеющую всвозможности роботов из OC, а именно(прошу представить это в голове, возможно дополнение): Включение, отключение и регулировка возможностей брони программним путем налету; Возможность программного управления персонажем не против воли игрока; Возможность считывать и передавать через компоненты OC данные об игроке (вайфай карта, обем данными между частями брони); Возможность использования дополнительного инвентаря, если установлен соответственный компонент ОС; Жидкостное хранилище при установленном соответствующем компоненте ОС; Возможность соединить очки OCGlasses с броней и управление с костюма. И это не все. Дальше - больше! Это только поверхностные возможности брони "из Crysis". Спасибо за внимание! Очень надеюсь на отклик.
  14. jammer312

    GPS

    Недавно столкнулся с тем, что апгрейд навигации, предоставляемый модом, достаточно убог, при этом он занимает компонент-слот и относительно затратен для крафта. Был удивлен тем, что еще никто не запилил систему геопозиционирования (gps), собственно, написал ее сам. Заранее скажу, что, очевидно, ее можно улучшить, в том числе перенести работу контроллера на один из реле, но первая попытка по написанию системы, состоящей лишь из микроконтроллеров, была неудачной, возможно, из-за малого уровня компонентов, которые вмещают микроконтроллеры, но скорее всего из-за того, что я криво что-то написал (вполне вероятно, если учесть отсутствие вывода ошибок и нормального дебага). Вполне вероятно, что текущую версию можно перенести на контроллер (с минимальными модификациями для избавления от необходимости в операционной системе), и все заработает, но мне это не нужно и лень. Использование клиентом: Требуется беспроводная плата. Клиент(то, что хочет получить свои координаты через gps) броадкастит одно сообщение с содержанием "gps_request" на порт 312 (можно поменять, менять надо в коде реле), через некоторое время, если сообщение достигло всех 4 реле, он получает в ответ сообщение на порт 312 (опять же, можно поменять, на этот раз в коде контроллера), содержание сообщения: строка "gps_response", число x, число y, число z; где x,y,z - координаты клиента, x и y по горизонтали, z - высота. Использование сервером: Сервер состоит из компьютера-контроллера с установленной OpenOS и четырех микроконтроллеров, которые я буду называть (и уже называл) "реле". Реле должны иметь беспроводную и сетевую платы, а также процессор и память (я грузил 2 планки 1 уровня, но даже одной должно хватить). Помимо этого в них должен быть биос с программой(2 ссылка), соответствующей определенному реле. Программа должна быть отредактирована под соответствующее реле (4 переменных в начале, координаты, где (по крайней мере в моей системе) y полагается горизонтальной осью, и идентификационная строка реле, которая должна быть уникальна для конкретной системы (иначе не будет работать)). Предпочтительно на каждом реле по разу запустить wakesetter (программа, третья ссылка). Каждый реле должен быть подсоединен к компьютеру-контроллеру кабелем, помимо этого все 4 реле должны быть некомпланарны (расположены так, чтобы нельзя было провести одну плоскость через все 4 реле) . Компьютер-контроллер должен иметь помимо базовых составляющих, необходимых для работы, беспроводную и сетевую платы. Для запуска системы нужно лишь запустить программу gps_controller (1 ссылка), которая разбудит реле в сети с ней и начнет выполнять свою функцию. Программа является блокирующей, т.е. не позволяет пользоваться компьютером, на котором установлена, пока сама работает. Программа будет выводить print'ом пойманные сигналы от реле, выводить им же координаты, когда сигналов достаточно (когда все 4 реле поймали запрос); уведомлять о таймауте зафейлившихся запросов (когда запрос достиг не всех реле, программа выжидает 2 секунды, чтобы удостовериться в том, что сигналов от остальных реле на его счет она не получит, и удаляет его из таблицы обработки). Ну и, естественно, отвечать на запросы координат. Принцип работы: Когда реле получает запрос от клиента, оно передает свои координаты, идентификатор и расстояние до клиента контроллеру. Контроллер, набрав 4 таких различных (от реле с разными идентификаторами) запроса, вычисляет координаты клиента и отсылает их ему. Подробнее о вычислении: известны 4 точки и расстояние от пятой точки до каждой из них. Тогда мы можем построить по сфере на каждой точке с радиусом, соответствующим расстоянию до пятой, причем эти 4 сферы пересекутся, и пересекутся только в этой точке. Пересечение очевидно, ибо все они проходят через эту точку. Единственность пересечения гарантируется некомпланарностью центров(в трехмерном пространстве), доказывать ее мне лень, примите как факт. Запишем гмт пересечения сфер системой уравнений (каждое вида (X-xi)^2+(Y-yi)^2+(Z-zi)^2 = Ri^2, где Ri - i-тое расстояние, xi,yi,zi - координаты i-той точки, X,Y, Z - координаты искомой(-ых) точки(-ек)), получим 4 уравнения в системе, вычтем из первого, из второго третье, из третьего четвертое, получим систему линейных уравнений на 3 уравнения, при условии некомпланарности точек и верных входных данных она совместна и имеет единственное решение, находим его через метод Крамера. Задача решена. Код: контроллер: http://pastebin.com/QD44ZWBv реле: http://pastebin.com/eAzPst2s прога, которую желательно по разу запустить (записать на биос чип, вставить в микроконтроллер и включить его) на каждом из реле, она позволяет контроллеру их включать через сообщение на модем ("gps awake"): http://pastebin.com/XijvUbB9 Скрины: Как может выглядеть сервер: Скрин того, что он выводит во время работы: Скрин клиента (планшет) с простым кодом для проверки: Следует заметить, что планшет на самом деле на блок выше, чем координата игрока, также следует еще раз для себя заметить, что координаты идут в порядке плоскость-высота, а не как в майне. Сверху код проверщика, чуть ниже зафейленная попытка, ибо сервер gps был вырублен, чуть ниже успешная попытка уже при включенном серве.
  15. Пришло время для моей собственной первой темы. Когда-то я наткнулся на возможность менять цвет индикатора у роботов и чуть погодя, реализовал отображение заряда робота с помощью изменения этого самого индикатора. Сейчас всего 4 градации Синий для заряженного больше чем на 75%, сине-зеленый для заряженного больше чем наполовину, оранжевый для заряда больше 25% и тускло-красный для заряда меньше 25% Распространяется через hpm, он же hel package manager любезно предоставленный Totoro доступный вот в этой теме. Для установки нужно установить hpm с помощью pastebin run vf6upeANи затем hpm install bluesдля установки файла blues.lua в /etc/rc.d/blues.lua, после чего нужно выполнить регистрацию нового rc модуля командой rc blues enableИ перезагрузить робота. Вот так примерно выглядит робот с индикацией, которая обновляется раз в пять секунд и позволяет с первого взгляда определить робота, у которого низкий заряд. Дополнительные ссылки: Пакет на hel.fomalhaut.me Код на gitlab.com
  16. Вот часть из моего кода к примеру: a = "привет" function Message(msg, nick) if msg == a then print ("Ты молодец") end end while true do local _, _, nick, msg = event.pull("chat_message") if msg ~= nil and nick ~= nil then Message(msg, nick) end end Если в чат человек введет слово "привет" напишет на экран "Ты молодец", но если человек напишет "Привет" или "ПрИвЕт" то тогда не сработает. И вот у меня такой вопрос можно это как то исправить?
  17. Эта кoпалка не требует для рабoты лишних деталей, т. к. кoд запиcываетcя на EEPROM. При cбoрке рoбoта, вмеcтo ЖД, мoнитoра и клавиатуры мoжнo дoбавить чтo-тo дейcтвительнo нужнoе, например раcширение инвентаря или аккумулятoра. Требoвания: Инвентарь (чем бoльше - тем лучше) Кoнтрoллер инвентаря. Геocканер. Инcтрумент, врoде алмазнoгo или иридиевoгo бура. Хoвер-апгрейд (еcли неoбхoдимo) При cбoрке мoжнo дoбавить: Апгрейд-верcтак. (пoзвoляет экoнoмить меcтo) Чанклoадер. Генератoр. (при наличии чанклoадера реже будет неoбхoдимocть ездить к заряднику) Беcпрoвoдную cетевую карту. (пoзвoлит рoбoту oтправлять cтатуcные cooбщения) Пример минимальнoй и пoчти макcимальнoй cбoрки (при желании, мoжнo дoбавить раcширения) Иcпoльзoвать oчень прocтo: В кoмпьютер c интернет-платoй вcтавить EEPROM. Запуcтить кoманду pastebin get eFkAZP0u b && edit b && flash b -q && rm b Пo желанию, редактирoвать параметры - первые переменные этo кoличеcтвo нoд, минимальная плoтнocть, макcимальная плoтнocть, выcoта (неoбхoдимo указывать для мирoв, в кoтoрых нет бедрoка), пoрт, cпиcoк oтхoдoв. Сoхранить/закрыть файл. Дocтать EEPROM из кoмпьютера и вcтавить в рoбoта. Выдвинутьcя на меcтo дoбычи. Пocтавить рoбoта. Дать рoбoту бур. Пocтавить вoзле негo кoнтейнер и включенный зарядник. Включить рoбoта и ждать завершения рабoты. Функциoнал: Рoбoт cканирует квадраты x8 блoкoв пo гoризoнтали, пocтепеннo oпуcкаяcь вниз. Дoбывает блoки из заданнoгo диапазoна плoтнocтей. Дoйдя дo бедрoка, рoбoт пoднимаетcя на cтартoвую выcoту и перехoдит к cледующей кoлoнне. При низкoм урoвне заряда аккумулятoра, пытаетcя заправить генератoр (еcли имеетcя), в прoтивнoм cлучае или при низкoм урoвне заряда инcтрумента, oтправляетcя на cтартoвую пoзицию, к заряднику. Так же, при запoлнении инвентаря, cбраcывает муcoр, при наличии верcтака упакoвывает реcурcы в блoки и еcли меcта вcе-равнo малo, тo cледует к кoнтейнеру, cбраcывает лут и вoзвращаетcя к рабoте. Еcли имеетcя чанклoадер, тo при начале рабoты oн включаетcя, а при завершении выключаетcя. Еcли имеетcя беcпрoвoднoй мoдем, тo рoбoт пocылает cтатуcные cooбщения: 0 - неразрушимый блок (скорее всего - приват) 1 - контейнер заполнен 2 - контейнер отсутствует 3 - зарядка инструмента 4 - заправка генератора 5 - конец работы
  18. Всем здрасьте Суть вопроса: раньше, например, на версии 1.7.10 майна geolyzer мог возвращать функцией analyze() в таблице значение metadata на версии 1.12.2 этого не происходит. В таком случае это у меня конфиг так прописан, что не происходит возвращения этой переменной? хотя в конфиге такой настройки не находил это мод теперь так работает, что не возвращает metadata блока? другой вариант? Кто сталкивался - отзовитесь, значение этой переменной нужно, например, для работы с Forestry, потому, как блоки Forestry именуются, к примеру name="forestry:resources". Раньше по metadata можно было точно узнать, что за блок, сейчас, соответственно, нет. Раньше - версия 1.7.10, теперь - версия 1.12.2
  19. Делать было нечего, накатал маленькую программу (74 строки) которая позволяет сделать мост между игровым и IRC чатом. Прям как на этом сервере в #cc.ru-server1. Установка: pastebin get MJ5XYu7H ircb.lua (Требуется: чатбокс, интернет плата) Настройка: Находится в коде на 3 строке: NAME = 'IRC' -- Тэг перед сообщением в чатбоксе SERVER = 'irc.esper.net:6667' -- IRC сервер CHANNEL = '#ripirc' -- Канал nick = 'Rippez' -- Ник в IRC (Кавычки не удалять)
  20. Автором идеи является 1Ridav. Как-то давным давно, в Мамбле, он предложил создать на основе геосканера карту сервера для спавна. Чтобы игроки могли побродить по уменьшенной копии сервера, и поглазеть на ландшафт/постройки. Суть такова: Берется большой зал (спавн или отдельная постройка, не суть), с темным полом (чтобы голограмму было хорошо видно). Под полом располагается сетка проекторов, компьютер и геосканер. Программа сканирует сервер (загруженные чанки) и формирует на основе этих данных карту высот. Карта режется на прямоугольные фрагменты и выводится на проекторы. На скриншоте сверху, я сделал тестовый рендер для одного проектора. За основу взят мой мир-полигон для программ. Предлагаю довести программу до ума, и как вариант сделать где-нибудь такую карту на IT 1.7.10. Возле спавна, чтобы те, кто заходит на сервер, могли побродить и посмотреть. Что надо обдумать: 1) Как красить? Проекторы имеют три цвета. Я думаю один будет - синий. Им надо покрасить все плоскости на высоте y=64 - уровень моря. Оставшиеся два цвета надо как-то распределить по террайну, чтобы вид карты не вызывал эпилептических припадков. =) 2) Делать ли пустоты по высоте? На скриншоте сверху я сделал простую карту высот. Т.е. она состоит как бы из столбиков разной высоты. Можно сделать ее более сложной, отобразив пустоты. 3) Сжимать ли масштаб? Сервер имеет размеры примерно 4000 на 4000. Проектор - 48 на 48. Т.е. чтобы отобразить всю карту в полный размер понадобится около 7056 проекторов и зал аналогичной площади. Надо либо отобразить на карте фрагмент мира, разумного размера, либо уменьшить масштаб карты, усреднив карту высот.
  21. Половина наших кейсов в настоящий момент имеют вид, так как мне их лень набивать: item.case5.json { "sound" : "Cases:middle_case", "message" : "§a${player} §6открыл §b${case_name} §6и получил §a${item_name} - ${item_count} шт.", "items" : { "minecraft:sand" : {"name" : "Песок", "min" : 1, "max" : 10, "fortune" : 0.7}, "minecraft:dirt" : {"name" : "Земля","min" : 1,"max" : 10, "fortune" : 0.3}, "minecraft:diamond" : {"name" : "Алмаз","min" : 1, "max" : 10, "fortune" : 0.05}, "IC2:itemToolMiningLaser:27" : {"name" : "Лазер", "min" : 1, "max" : 1, "fortune" : 0.05} } } Синхрофазотронная установка: любой комПуктер, 6 транспозеров, 6 алм сундуков (по дефолту) НО не обязательно. Прога должна сама получить все транспозеры. Их может быть три или вообще один, если админ балансит/меняет только один кейс, например, моды поменялись и нет больше харвеста и кейса повара и типа того. В общем, сколько комп нашел транспозеров, столько данных и получил. ТЗ: Админ накидывает из НЕИ в сундуки красивые предметы по тематике кейсов, и топчик и бомжерес и средненький, всякие ихорчики, солярочки и прочее в сундучки, запускает прогу и получает в папке /home/cases_2018_03_11_21_43_55 столько файлов, сколько сундуков. Кто не понял, папка с датой и временем, чтобы я мог откайтиться и посмотреть что-то ранее. Файлы в указанной папке формируются с именем case_i.dat, где i - итератор таблицы транспозеров. Не важно, какой транспозер будет первым или третьим. Админ поймет сам, что это за кейс. Потом админ заваривает чашечку кофе, раскуривает трубку и садится и просто меняет шанскики и мин. макс. кол-во быстренько и закидывает на сервак это все хозяйство, и ребутает с консоли кейсы. Вуаля - кейсы гивают эпический и разнообразный рес мага, инженера, прогера и прочее, а не песок. Никаких гуишек, кнопок, шмопок не нужно. Прога выполнилась и закрылась, получив дамп сундуков. Что нужно получить и сформировать в файле case_i.dat: "minecraft:sand" : {"name" : "Песок", "min" : 1, "max" : 1, "fortune" : 0.5}, "minecraft:gold_ingot" : {"name" : "Золотой слиток","min" : 1,"max" : 1, "fortune" : 0.5}, "minecraft:diamond" : {"name" : "Алмаз","min" : 1, "max" : 1, "fortune" : 0.5}, "IC2:itemToolMiningLaser:27" : {"name" : "Лазер", "min" : 1, "max" : 1, "fortune" : 0.5}, ... "IC2:itemFoamSprayer" : {"name" : "Распылитель", "min" : 1, "max" : 1, "fortune" : 0.5}, "IC2:itemwcarbonrotor" : {"name" : "Карбоновый ротор", "min" : 1, "max" : 1, "fortune" : 0.5} шансы 0.5 и кол-во 1 - 1 проставить автоматически. Админ это редачить сам будет. Варьировать не нужно. Призы за топовую прогу, которая выполняет ВСЕ требования: солярки, медальки, ветряки, ОС комплектующие, креативные модификаторы тинкера несколько, или возможно даже и броньку топовую какую-то. Поглядим. Утешительные призы также будут, если программ вдруг будет не одна. Надеюсь, что кейсы не только мне нужны и кто-то включится в работу Программка детская так то.
  22. Большие растровые шрифты хорошо подходят для рекламных вывесок — бегающего текста. До появление этой библиотеки не было удобного способа использовать их в OpenComputers. Но теперь есть. pastebin get Mz7Ps5jQ /usr/lib/ocbf.lua Библиотека максимально прозрачна и сама по себе отрисовкой не занимается. Для отрисовки удобно использовать библиотеку Braille Bicycle от товарища @Totoro. Все шрифты хранятся по пути /usr/share/fonts в таком виде: /usr/share/fonts ├── IBM Plex Serif │ ├── Bold Italic.ocbf │ ├── Bold.ocbf │ ├── Italic.ocbf │ └── Regular.ocbf ├── Prosto One │ └── Regular.ocbf └── Roboto ├── Bold Italic.ocbf ├── Bold.ocbf ├── Italic.ocbf └── Regular.ocbf Для конвертирования новых шрифтов можно воспользоваться утилитой на языке Python: ocbf.py. Для ее работы необходимо установить библиотеки PIL, bitarray и tqdm (Python3). OCBF содержит в себе всего две функции: ocbf.load(family: string, style: string) — находит шрифт по указанному семейству и стилем, парсит его и возвращает объект шрифта. Если первый аргумент — это путь, то поиск производится не будет; вместо этого шрифт будет загружен из указанного файла (обязательно с расширением ocbf) ocbf.search(family: string, style: string) — находит шрифт и возвращает путь до него. Все функции ищут шрифт в директориях, указанных в переменной ocbf.path = "/usr/share/fonts:/home/.fonts:.". Из кода видно, что поиск осуществлятся в /usr/share/fonts, /home/.fonts и в текущей директории. Объект шрифта предоставляет следующие методы: font:drawChar(set: function, size: number, char: string, x: number, y: number) — отрисовывает один символ размером size используя шрифт по координатам (x; y). Функция set принимает три аргумента: координаты точки и значение 1 — точка заполнена и 0 — точка пуста. font:draw(set: function, size: number, str: string, x: number, y: number) — работает так же, как и font:drawChar, но отрисовывает сразу все символы. font:width(size: number, str: string — возвращает ширину строки с заданным размерам в точках. Помимо вышеперечисленных методов также есть свойства font.family, font.style и font.sizes. Все функции принимают аргумент size. Это высота шрифта в точках. Поскольку используя растровые шрифты невозможно обеспечить поддержку сразу всех размеров, size для разных шрифтов имеет разные допустимые значения. Для каждого размера в шрифте дублируются символы. Предоставляю также набор шрифтов Roboto — Regular Roboto — Bold Roboto — Italic Roboto — Bold Italic IBM Plex Serif — Regular IBM Plex Serif — Bold IBM Plex Serif — Italic IBM Plex Serif — Bold Italic Prosto One — Regular Все шрифты кроме Prosto One представлены в размерах 16 и 32 точек, Prosto One — 32 и 64. Имеется поддержка латиницы и кириллицы. Также стоит отметить, что для работы библиотеки необходим Lua 5.3 — используется string.unpack, побитовые операции, UTF-8. Для отрисовки текста на изображении в начале поста использовался следующий код: local ocbf = require("ocbf") local braille = require("braille") local matrix = braille.matrix(320, 200) local font1 = ocbf.load("Prosto One", "Regular") local font2 = ocbf.load("Roboto", "Bold") local font3 = ocbf.load("Roboto", "Regular") local function set(x, y, v) braille.set(matrix, x, y, v) end font1:draw(set, 64, "OCBF", 4, 1) font2:draw(set, 32, "Растровые шрифты", 4, 65) font2:draw(set, 32, "для OpenComputers", 4, 98) font3:draw(set, 32, "от LeshaInc", 4, 168) braille.render(matrix, 1, 1)
  23. Часто необходимо писать программы для серверов. Это могут быть сервера для чатов, или файловые облака или что то еще, но всегда приходится писать велосипеды. Подумав об этом я решил написать программу для сервера. Программа работает просто. Подгружает модули из папки проекта, а потом начинает слушать все event'ы и обрабатывать. Представляю вам саму программу: Servercore v0.2.1 Исходный код: http://pastebin.com/NASX9sX0 Использование: Создаем папку проекта Создаем в этой папке файл .servercore Запускаем servercore указывая первым аргументом папку которую мы создали. Если не указывать аргумент то servercore запустится в рабочей директории. Наслаждаемся рабочим сервером, который пока ничего не делает. Любые файлы (кроме .servercore) которые находятся в папке проекта будут загружены как модули. Если модуль содержит ошибку наш сервер не полетит, а просто выведет тест ошибки на экран. При создании модулей можно использовать специальные функции, которые находятся в _G.sc. Описание этих функций: sc.info(info_type:string, message:string) - выводит информацию со временем и раскрашивает как на скринах. Принимает тип информации и само сообщение. Типов информации всего 4: ok,err,warn и info. sc.getTime() - возвращает время в формате unix timestamp. sc.on(event_name:string,handler:function) - добавляет слушателя на сигнал. Циклом слушаются все сигналы а потом запускают функцию обработчик для того сигнала который пришел. Пример простейшего модуля: sc.on("touch",function (e) sc.info("info","you touched!")end) Изменения в версии: Патч 1: убрана обязательная поддержка модемов. Старые версии: Произведение «Servercore» созданное автором по имени LeshaInc, публикуется на условиях лицензии Creative Commons «Attribution-NonCommercial-NoDerivatives» («Атрибуция — Некоммерческое использование — Без производных произведений») 4.0 Всемирная. PS: Название проги звучит как поджанр метала)))
  24. Итак сегодня я наконец сделал свою "мега-крутую" программу. Это так сказать "криптовалюта" только без того самого крипта, блокчейна и всякие другие вещи которые есть в реальных криптовалютах. Но, все принципы майнинга здесь есть - вы жрете электричество и мощности своего компьютера чтобы заработать монетку работает это крайне примитивно, НО РАБОТАЕТ! Так как всё-таки это бета версия. То тут всё ещё есть баги и код написан не очень хорошо, в дальнейшем это будет всё фикситься и т.д. Работа программы: В моей программе клиент/сервер в клиентской стороне - 3 программы и серверный код на PHP который будет на каком-нибудь веб-хостинге. Итак разбор скриптов: Сервер: Клиент: Скриншоты: Установка и авторы Загрузка: wget https://raw.githubusercontent.com/LaineZ/OCCoins/master/Client/installer.lua Установка: installer.lua Авторы: kikito - автор библиотеки md5.lua ECS - автор библиотеки windows.lua Laine_prikol - автор программы и серверных скриптов Репо на гитхабе ------- ЛОВИТЕ БАГИ И ГЛЮКИ -------
×