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

Вся активность

Этот поток обновляется автоматически     

  1. Ранее
  2. Кто-то в дискорде ссылку кидал, уже есть сервер, моды в процессе допиливания.
  3. меня заинтересовало, можно ли запустить вашу систему на виртуальном машине. например на 86Box? Или только на реальном железе или в Маине?
  4. Листал я тут Reddit и увидел пост в сабреддите feedthebeast с надписью "Nothing wrong here. Move along" с скрином opencomputers в биоме lush caves. Сначала даже не поняв подумал "неужели тот самый форк портировали на версию 1.17 (именно тогда добавили этот биом)", но почитав комментарии я понял что походу это порт на 1.20.4, правда только тизер. Что вы думаете по этому поводу? Вот оригинальный пост: https://www.reddit.com/r/feedthebeast/s/CpUb7f1O0y
  5. Командный компьютер (в творческом режиме достаётся) умеет, да. Как именно, надо смотреть в нём самом или гайдах.
  6. Здравствуйте! Можно ли как нибудь активировать команды майнкрафт, через консоль computer craft? к примеру playsound *** master ~~~ 1000
  7. Уже давно в майнкрафте существует задача: создать библиотеку или программу, которая могла бы отрисовать произвольную картинку. Это нужно в самых разных сценариях: чтобы написать веб-браузер (или, например, приложение-клиент соцсети), показать на здании свой логотип, или для журнального столика в отеле. ——— Что же мешает в OpenComputers просто считать данные картинки и её отрисовать? Разнообразие форматов и настроек. На многих сайтах можно одновременно найти PNG, WebP и JPEG; последние два формата подразумевают сжатие с возможными потерями и в этом отношении очень настраиваются. Соответственно, программе надо с десяток разных модулей/путей кода, чтобы декодировать что угодно — или придётся зависеть от какого-нибудь внешнего конвертера изображений. Разрешение мониторов OC не соответствует размерам стандартных картинок. У мониторов третьего уровня 160x50 знакомест (которые разбиваются на два квадратика в высоту) и всего 256 цветов в палитре. Декодирование целой картинки через виртуальную машину Lua подтормаживает (а без декодирования не получится её даже уменьшить), особенно когда приходится делать паузы для сборщика мусора. Постоянная замена цветов и отрисовка по одному пикселю тормозит уже за счёт ограничений видеокарты в моде. Пункту 4 можно противодействовать с помощью DoubleBuffering от @ECS, пункт 2 требует какого-то алгоритма уменьшения картинки (если же она слишком мала, то мы можем покрутить разрешение монитора). Что же касается первого и третьего... сразу напрашивается идея создать внешнюю библиотеку, которая всем этим бы занималась. На ум приходят несколько вариантов, на чём её можно написать и как интегрировать: Rust (как более безопасный и потенциально быстрый язык) скомпилировать в .dll/.so и подключить к OC, примерно как нативный вариант Lua; Того же подключить из machine.lua; На Scala (тот же язык, на котором написан OpenComputers) сделать патч к самому OpenComputers; ... Уже известно, что первый вариант вызывает мучения (https://computercraft.ru/blogs/entry/666-profiliruem-programmy-pod-oc/) и отсутствие персистентности у компьютеров. Пользователи, очевидно, будут очень рады тому, что программы надо писать из расчёта «всё будет выключаться в произвольные моменты». Поэтому сейчас рассмотрим, как пойти по третьему пути; для простоты компиляции возьмём испытуемым Ocelot Desktop, понимая, что он не очень сильно отличается от OpenComputers. Оказывается, у нас уже есть пример компонента, работающего с данными -- “data card”; основной файл этой карточки можно найти на https://gitlab.com/cc-ru/ocelot/ocelot-brain/-/blob/master/src/main/scala/totoro/ocelot/brain/entity/DataCard.scala. Пример ... object DataCard { val SecureRandomInstance: ThreadLocal[SecureRandom] = new ThreadLocal[SecureRandom]() { override def initialValue: SecureRandom = SecureRandom.getInstance("SHA1PRNG") } class Tier1 extends DataCard { ... override def tier: Tier = Tier.One @Callback(direct = true, limit = 32, doc = """function(data:string):string -- Applies base64 encoding to the data.""") def encode64(context: Context, args: Arguments): Array[AnyRef] = { result(Base64.encodeBase64(check(context, args))) } ... Сразу замечаем, что функции, экспортируемые для использования в Lua, собраны в одном классе и отмечены декоратором @Callback; кроме того, в структуре указываются ещё характеристики компонента (название, «поставщик», уровень и тому подобное). Программируем сами?.. Подумаем теперь над интерфейсом нашей карточки: decode(массив байт) —> обёртка над картинкой (таблица? объект Scala?) обёртка —> ширина, высота обёртка —> получить цвет конкретного пикселя. Раз у нас поддерживается любой формат изображений, то здесь будут четыре канала — R, G, B, A; возможно, методы для первичной обработки изображения? Например, масштабирование. В принципе, этого достаточно, чтобы начать программировать, но попробуем сделать по-другому: попросим нейросеть написать код за нас. В рассуждениях можно будет увидеть, как DeepSeek сомневается, добавлять ли собственно декодирование PNG и других форматов или сделать лишь какой-то сырой, и в итоге он останавливается на втором варианте: Не вполне понятно, в каком именно порядке отдаются цветовые каналы, но это похоже на правду... для какого-то сырого формата, где Lua хватило бы простого выбора байт из строки. Что ж, не будем сдаваться, запросим декодирование популярных форматов. К сожалению, там модель начинает путаться в порядке каналов и в точных импортах, но всё же выдаёт осмысленный код: package totoro.ocelot.brain.entity // Core image processing import com.sksamuel.scrimage.ImmutableImage import com.sksamuel.scrimage.nio.ImageSource import com.sksamuel.scrimage.metadata.ImageMetadata import com.sksamuel.scrimage.implicits._ // For Scala syntactic sugar :cite[2] // Format-specific readers (explicit safe imports) import com.sksamuel.scrimage.webp.WebpWriter import com.sksamuel.scrimage.formats.{GifWriter, JpegWriter, PngWriter} // Error handling import scala.util.{Try, Success, Failure} import totoro.ocelot.brain.entity.machine.{AbstractValue, Arguments, Callback, Context} class ImageDecoder extends /* ... existing entity setup ... */ { @Callback(direct = true, doc = """function(data:string):userdata -- Decodes common formats (PNG/WebP/JPEG/GIF) or raw RGBA""") def decode(context: Context, args: Arguments): Array[AnyRef] = { val data = args.checkByteArray(0) // 1. Attempt standard format decoding via Scrimage :cite[1]:cite[3] Try(ImmutableImage.loader().fromBytes(data)) match { case Success(scrimageImg) => // Convert Scrimage image to raw RGBA format for consistency val rgba = scrimageImg.bytes(PngWriter.NoCompression).take(8) ++ // Store metadata scrimageImg.argbFlatMap(p => Array( ((p >> 16) & 0xFF).toByte, // R ((p >> 8) & 0xFF).toByte, // G (p & 0xFF).toByte, // B ((p >> 24) & 0xFF).toByte // A )) result(new ImageUserdata(scrimageImg.width, scrimageImg.height, rgba)) case Failure(_) => // 2. Fallback to raw format if standard decoding fails if (data.length < 8) throw new IllegalArgumentException("Invalid header") val width = java.nio.ByteBuffer.wrap(data.slice(0, 4)).getInt val height = java.nio.ByteBuffer.wrap(data.slice(4, 8)).getInt if (8 + width*height*4 > data.length) throw new IllegalArgumentException("Invalid pixel data") result(new ImageUserdata(width, height, data.slice(8, data.length))) } } } Программируем сами, да Вооружимся компилятором (для Scala это sbt) и допишем код до нормального состояния. Дадим сначала карточке весёлое название и имя вендора: class ImageCard extends Entity with Environment with DeviceInfo with Tiered { override val node: Node = Network.newNode(this, Visibility.Neighbors) .withComponent("imagine", Visibility.Neighbors) .create() private final lazy val deviceInfo = Map( DeviceAttribute.Class -> DeviceClass.Processor, DeviceAttribute.Description -> "Image decoder card", DeviceAttribute.Vendor -> "ProgramCrafter Individual Enterprises", DeviceAttribute.Product -> "PCI-E Byte-to-Byte Visual-Only Decoder" ) override def getDeviceInfo: Map[String, String] = deviceInfo override def tier: Tier = Tier.Two ... И потом напишем её единственный метод. ... @Callback(direct = false, doc = """function(data:string):userdata -- Decodes an image in common format (PNG/WebP/JPEG/GIF)""") def decode(context: Context, args: Arguments): Array[AnyRef] = { val data = args.checkByteArray(0) val scrimageImg = ImmutableImage.loader().fromBytes(data) result(new ImageUserdata(scrimageImg)) } } class ImageUserdata(var pixels: ImmutableImage) extends AbstractValue { def this() = this(ImmutableImage.create(8, 8)) // For deserialization @Callback(direct = true, doc = "function():number -- Get image width") def getWidth(context: Context, args: Arguments): Array[AnyRef] = result(pixels.width) @Callback(direct = true, doc = "function():number -- Get image height") def getHeight(context: Context, args: Arguments): Array[AnyRef] = result(pixels.height) @Callback(direct = true, limit = 1000000, doc = "function(x:number, y:number):number -- Get ARGB value at specified coordinates, 1-based") def getARGB(context: Context, args: Arguments): Array[AnyRef] = { val x = args.checkInteger(0) - 1 val y = args.checkInteger(1) - 1 if (x < 0 || x >= pixels.width || y < 0 || y >= pixels.height) throw new IllegalArgumentException("coordinates out of bounds") val p = pixels.pixel(x, y) result(p.alpha(), p.red(), p.green(), p.blue()) } @Callback(direct = false, doc = "function(target_width:number, target_height:number):number -- Get a new image scaled appropriately to fit within specified bounds") def fit(context: Context, args: Arguments): Array[AnyRef] = {...} // Serialization private final val PixelTag = "ScrImage" override def load(nbt: NBTTagCompound, workspace: Workspace): Unit = { super.load(nbt, workspace) pixels = ImmutableImage.loader().fromBytes(nbt.getByteArray(PixelTag)) } override def save(nbt: NBTTagCompound): Unit = { super.save(nbt) nbt.setByteArray(PixelTag, pixels.bytes(PngWriter.MaxCompression)) } } Когда всё написанное скомпилируется, обёртка изображения будет поддерживать персистентность, масштабирование, получение размеров и конкретных пикселей картинки. Остаётся пока один нерешённый вопрос: а как этот код будет вызываться? Кормим Оцелота На самом деле добавить новую карточку не очень сложно, достаточно: нарисовать иконку 16x16, поместить в ocelot-desktop/sprites/items прогнать ocelot-desktop/spritepack и положить новый атлас текстур на место старого добавить новую иконку в Icons.scala (в объекте Items) добавить код ImageCard в репозиторий создать подкласс ImageCardItem with CardItem и соответствующую ему Factory зарегать завод в Items.scala Изменения можно посмотреть на https://gitlab.com/ProgramCrafter/ocelot-desktop/-/compare/develop...ac0acb33. Тестируем Окажется ужасно, если наша карточка не будет работать. Поставим её в компьютер и запустим вот такой скрипт: local com = require 'component' local unc = require 'unicode' local img = com.imagine local gpu = com.gpu local function set_halfpixel(x, y, back, fore) local bg, fg = gpu.getBackground(), gpu.getForeground() if bg == fore then gpu.setForeground(back) gpu.set(x, y, unc.char(0x2584)) else if bg ~= back then gpu.setBackground(back) end if fg ~= fore then gpu.setForeground(fore) end gpu.set(x, y, unc.char(0x2580)) end end local filename = (...) or '/home/775251537.0.jpg' local file = io.open(filename, 'rb') local buf = file:read('*a') file:close() local image = assert(img.decode(buf)) local w, h = gpu.getResolution() local image_fit = image.fit(w, (h - 1) * 2) local pts_w, pts_h = image_fit.getWidth(), image_fit.getHeight() io.read() for x = 1, pts_w do for y = 1, pts_h, 2 do local _, r1, g1, b1 = image_fit.getARGB(x, y) local _, r2, g2, b2 = 0,0,0,0 if y + 1 <= pts_h then _,r2,g2,b2 = image_fit.getARGB(x, y + 1) end local top = r1*65536 + g1*256 + b1 local bot = r2*65536 + g2*256 + b2 set_halfpixel(x, (y + 1) // 2, bot, top) end end require'term'.setCursor(1, h) И получим изображение дивана-танка. Требуемые улучшения Проверить, что за библиотека ScrImage, действительно ли она безопаснее или удобнее остальных. (Кажется, что удобнее, ведь она в отличие от javax ImageIO поддерживает WebP.) Сделать так, чтобы открытые картинки потребляли память, потому что сейчас ничто не мешает коду открыть сотню раз по мегабайту. Без этого на сервере такой патч запускать нельзя. Добавить, если не обойдётся вычислительно дорого, фильтры и повороты в интерфейс карточки.
  8. В чём смысл этой программы? Никаких SSH в OpenOS не имеется, часовой пояс никем не используется, а «ограничение компьютеров» вообще непонятно на что влиять может. Программа даже не интерактивна, просто забивает один и тот же файл захардкоженными значениями. Причём неоптимальным образом для этой цели! Четыре раза один и тот же файл читать, десериализовывать, модифицировать содержимое, сериализовывать и записывать, когда достаточно одного? Программу можно втрое сократить, не потеряв функциональность и даже улучшив производительность.
  9. Этот программа создана для изменения конфигурации OpenOS У программы есть несколько параметров типо: изменение часового пояса, настроить ограничение компьютеров, включение/выключение SSH, после изменения параметров: на папке конфигурации создаётся файл openos.cfg это позволит установочному диску OpenOS установить без значения по умолчанию. Запустить программу можно по команде: pastebin run h4bDtuwr Запуск программы требует интернет-карта этот программа рекомендуется запустить через установочную диск OpenOS
  10. Полгагаешь, кто-то из людей способен что-то разглядеть на этом скриншоте?
  11. Что за кривая меню? Покажи скриншот.
  12. @_ethernalsteve Это разработка neofetch но есть одно проблема что в операционной системе RedOS если открыть программу openfetch вылетит и снова будет какая-то кривая меню RedOS. исправьте ошибку или вы сделаете версию для RedOS
  13. Создаём файл autorun.lua в / на дискете или желаемом диске: require('filesystem').mount(..., '/home/storage') Об этом и других методах, таких как изменение названия диска, можно найти тут.
  14. Для планшета MineOS, вроде, слишком требователен.
  15. Как сказал бы классик, не по интересу интересно, а по сути интересно.
  16. Интересное предприятие. Неоднозначное, но интересное по сути. Впрочем, не буду говорить за всех читателей форума. P.S.: Возможно, актуально могли бы добавлять описание на английском к уже существующему, чтобы упростить части посетителей форума понятие ваших сообщений.
  17. just use your native speech on this forum P.S: Я думаю, это может быть к новому OPPM.
  18. Как автоматически при запуске системы монтировать дискету по адресу в /home/storage?
  19. У меня такой произошло идея: я установил mineOS на другой компьютер. и я установленного диска переносил в планшет Первый Гайд: Собрать планшет в сборщике необходимо компоненты: 1 - Корпус планшета (можно взять креатив) 2 - Интернет-карта 3 - Клавиатура (поместится в 1 слот) 4 - Оперативный память 3-2 уровня 5 - eeprom (нужно чтобы прошито MineOS EFI) 6 - память (нужно чтобы установлен MineOS) 7 - добавить 8 ёмкостей Второй Гайд: вы должны собрать компьютер и ввести install и потом pastebin run PDE3eVsL Третий Гайд: вы должны поставить mineOS если до конца установился переносите в сборщике память и всё можно запустить операционную систему mineOS
  20. Другой цвета. Нежные больше цвет добавляет, до жути на фоне тьмы ввысь белым бил фонтан
  21. Привет! Можешь, пожалуйста, сделать так, что бы цвета постоянно изменялись?
  22. Поставил чистую ось для теста, не смог воспроизвести проблему. Искренне сожалею о столь фрустрирующем экспириенсе, хе-хе. Мб в оцелоте твикнута скорость эмуляции, влияющая на тайминг двойного клика, мб кастомизирован масштаб интерфейса, из-за чего едет координатная сетка, а мб это действительно я где-то накосячил. Как знать, как знать... История вывода ограничена 100 строками. Рискну предположить, что ты заюзал for i = 1, 100 print(i), из-за чего оригинальная команда попросту стёрлась, превысив лимит? Размер холста до желаемого можно поменять через инструмент Select, выделив нужную зону и нажав кнопку "Crop", т.к. мне показалось это более удобным, нежели ввод цифр. А вылет при расширении пофиксил, спасибо <3 Никак, системы вкладок никогда и не было по причине "память". Вообще можно было бы сделать сохранение вьюпорта и позиции курсора для каждого открытого файла, чтобы стейт восстанавливался при переключении между ними - тогда и вкладки особо не понадобятся. Но проект мёртв, поэтому увы и ах Я и терминал-то подумываю снести к чертям, т.к. добавлял его из-за бесконечного воя на гитхабе, мол, "а-а-а, верните мой print(), я копаюсь в грязи и не хочу тыркать енти ваши кнопочки". Это UI-only ось, заточенная под приложухи, кнопочки, слайдеры и инпуты. Если нужен терминал - думаю, стоит воспользоваться терминальной осью. Плюс не вижу разумных причин, по которым tonumber(io.readLine()) удобнее tonumber(input.value). Дело привычки скорее А она есть. Вероятно, ты создал файл без расширения, и система попросту не знает, что с ним делать по аналогии с десктопной осью
  23. Цветной оболочка помогает генерировать другие цвета Установить: pastebin run mnw3QAd2 Чёрно-белый оболочка Установить: pastebin run GC10Vqp9
  24. Вопрос закрыт - в сейчас лет узнал, что шифт+пкм с процессором в руке меняет архитектуру Lua, на которой он будет работать Заработал на Lua 5.2. Дело было в ошибке совместимости с флакс гейтами, которую уже пару лет как не исправляют и вряд-ли исправят. Связался с разработчиком скрипта, он внесёт поправку в инструкцию по установке и настройке скрипта. Спасибо всем кто помогал.
  1. Загрузить больше активности
×
×
  • Создать...