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

High Level Peripherals

Это форк мода Tom's Peripherals с небольшими дополнениями и исправлениями

NeoForge
Загрузчики
NeoForge
Скачиваний на Modrinth
344
Подписчиков на Modrinth
1
версии
3
Обновлён
2 июля 20262 июл.
Опубликован
в 2026

Коротко о моде

Работает на NeoForge
Для Minecraft 1.21.1
Нужен и в игре, и на сервере
Последняя версия — 1.4.3 от 2 июля 2026
Лицензия MIT — бесплатно
Где нужен
В игреобязателенНа сервереобязателен

Нужен и в игре, и на сервере

Версии игры1.21.1
Описание переведено автоматическиПоказать оригинал (EN)

High Level Peripherals

Периферия-монитор для CC:Tweaked, которая действительно тянет то, что вы хотите построить. Форк Tom's Peripherals, переработанный, чтобы стать куда удобнее, стабильнее и полнее — больше экраны, настоящие шейдеры с рендерингом на GPU, полноценный ввод мышью/касанием и более чистый API, который не мешает вам работать.

✨ Возможности

🖥️ Большие чёткие мониторы

Собирайте массивы до 32x32 блоков (админ может поднять до 64x64), с разрешением до 4096x4096 на блок. Рисуйте с помощью полного 2D API — заливка фигур, градиенты, текст с кастомными шрифтами, загрузка изображений, двойная буферизация — всё работает на стороне сервера и автоматически синхронизируется с каждым клиентом.

⚡ Настоящие GPU-шейдеры, а не математика на Lua

Напишите небольшой шейдер в стиле GLSL один раз — и он рендерится вживую на видеокарте каждого зрителя, на его собственном фреймрейте, полностью независимо от тика сервера. Больше никакого Lua-реймарчинга по пикселям, который душит игру — шейдерный движок делает это без единой строчки Lua на пиксель. Включает первоклассные примитивы для трассировки лучей (пересечение сферы/плоскости/бокса), чтобы вам не приходилось вручную писать математику лучей с нуля.

gpu.compileShader([[
  color = vec3(uv.x, uv.y, sin(time));
]])

Вот и всё — оно уже рендерится.

🖱️ Полноценный ввод мышью

Клик, правый клик, перетаскивание и прокрутка прямо по экрану монитора, с точными до пикселя координатами, которые передаются прямо в ваш скрипт. Учитывает настройки управления игрока — никаких захардкоженных предположений о клавишах. Идеально для создания настоящих интерактивных интерфейсов, а не просто статичных дисплеев.

🎮 3D-рендеринг в immediate-режиме

API в стиле OpenGL 1 (glBegin/glVertex/glTranslate/glRotate/освещение) для построения настоящих 3D-сцен на мониторе без написания шейдера — отлично подходит для моделей, схем или простых игр.

🔆 Управление яркостью

Масштабируйте яркость вывода монитора в нитах — от тусклых фоновых дисплеев до слепяще ярких. Применяется и к нарисованным пикселям, и к живым шейдерам.

🧠 Простор для больших проектов

Щедрый лимит VRAM по умолчанию (~2 ГиБ на экран), общий для фреймбуферов, изображений и текстур шейдеров, с настраиваемыми на сервере лимитами для более крупных построек.

Зачем этот форк?

Tom's Peripherals дал мониторы и периферию GPU, но быстро упёрся в реальные потолки — низкие лимиты разрешения, отсутствие рендеринга шейдеров, отсутствие ввода мышью и несколько давних багов с мультиблоками и синхронизацией. High Level Peripherals сохраняет тот же знакомый API peripheral.find("tm_monitor"), который вы уже знаете, и выталкивает каждый из этих потолков наружу — так что ваши постройки перестают ограничиваться периферией и начинают ограничиваться вашим воображением.

С чего начать

local gpu = peripheral.find("tm_monitor")
gpu.fill(0x000000)
gpu.drawText(10, 10, "Hello, HLPS!", 0xFFFFFF)

Полный справочник по API ниже.

Документация

Справочник по Lua API tm_monitor

Полный справочник по периферии-монитору: 2D-рисование, текст, изображения, 3D API в immediate-режиме, ввод мышью/прокруткой и шейдерный движок.

1. Лимиты

ЛимитЗначение
Размер сеткиДо 32x32 блоков по умолчанию (maxScreenSize, 1-64). Превышение → каждый вызов выбрасывает ошибку.
gpu.setSize(n)64–4096 пикс/ось, по умолчанию 1024.
gpu.setGpuResolution(w, h)64–4096 пикс/ось, или (0,0) для авто.
Бюджет VRAM~2 ГиБ по умолчанию (maxVRAMSize), общий для фреймбуфера/изображений/буферов/текстур.

2. Формат цвета

Упакованные инты 0xRRGGBB, либо (r,g,b[,a]) по 0-255 каждый.

  • Альфа 0 или 255 → непрозрачный.
  • Альфа 1..254 → наложение source-over: out = (src*a + dst*(255-a)) / 255.
  • getPixel/getpx возвращают 0xRRGGBB (альфа отбрасывается).

3. Размеры

ВызовЭффект
gpu.setSize(n)Разрешение на блок, по одной оси. Общий холст — (blocksWide*n) x (blocksTall*n).
gpu.getSize()→ width, height, cols, rows, blockSize.
gpu.getResolution()→ width, height.
gpu.refreshSize()Принудительно пересканирует сеточную раскладку массива.
gpu.debugTiling()→ string с дампом текущего состояния тайлинга на стороне сервера, для диагностики неправильно выглядящего массива.

Держите setSize низким (64-256), если рисуете попиксельно на Lua — используйте шейдерный движок (раздел 8) для всего процедурного.

4. Базовое 2D-рисование

Все координаты начинаются с 1.

ВызовПримечания
gpu.fill([color])Заливает холст. По умолчанию чёрный.
gpu.clear([color])Синоним fill.
gpu.setPixel(x, y, color)Запись за границами игнорируется.
gpu.getPixel(x, y)→ int, 0 если за границами.
gpu.filledRectangle(x, y, w, h, [color])Выбрасывает ошибку при выходе за границы.
gpu.rectangle(x, y, w, h, [color])Только контур.
gpu.line(x1, y1, x2, y2, [color])Брезенхэм.
gpu.lineS(x1, y1, x2, y2, [color])Альтернативный алгоритм.
gpu.circle(cx, cy, r, [color])Контур.
gpu.fillCircle(cx, cy, r, [color])Залитый.
gpu.triangle(x1,y1, x2,y2, x3,y3, [color])Контур.
gpu.fillTriangle(x1,y1, x2,y2, x3,y3, [color])Залитый.
gpu.gradientRectangle(x, y, w, h, c1, c2, [vertical])Линейная интерполяция между двумя цветами.
gpu.copy(srcX, srcY, w, h, dstX, dstY)Безопасно при перекрытии. Ограничено 64M пикс.
gpu.scroll(dx, dy, [fillColor])Сдвигает холст; открывшаяся область заливается. Тот же лимит.
gpu.drawBuffer(x, y, w, scale, ...pixels)Пиксели построчно как vararg-числа, не таблица.

5. Двойная буферизация

gpu.setDoubleBuffered(true)
-- ... вызовы рисования ...
gpu.flush()   -- отображает + синхронизирует

gpu.sync() отправляет фреймбуфер напрямую (с внутренним троттлингом) — обычно не нужен вне сценариев двойной буферизации/шейдеров.

6. Текст

ВызовПримечания
gpu.drawText(x, y, text, [fg=-1], [bg=-1], [size=1], [pad=1])-1 пропускает этот слой.
gpu.drawTextSmart(x, y, text, [fg], [bg], [forceUnicode=false], [size=1], [pad=1])Автовыбор ASCII/unicode шрифтов (ASCII рисуется в 2x размере).
gpu.getTextLength(text, [size=1], [pad=1])→ ширина в пикселях.
gpu.getFont()→ name, editable.
gpu.setFont(name)Ничего не делает, если шрифта нет.
gpu.drawChar(x, y, charIndex, [fg], [bg], [size=1])Рисует один глиф, индекс с 1.

| gpu.addNewChar(char, width, ...16 numbers) | → int. Шрифт должен быть редактируемым. | | gpu.delChar(char) / gpu.freeChars() / gpu.clearChars() | Управление глифами. | | gpu.setFontDefaultCharID(id) / gpu.getFontDefaultCharID() | Запасной глиф. |

7. Изображения и буферы

ВызовВозвращает
gpu.newImage(w, h)Пустой LuaImage.
gpu.imageFromBuffer(w, ...pixels)LuaImage из сырых пиксельных данных.
gpu.decodeImage(bufferRef) / gpu.decodeImage(...bytes)Декодирует PNG и т.п.
gpu.newBuffer([initialCapacity=32])Расширяемый LuaByteBuffer.
gpu.drawImage(x, y, image)Рисует с обрезкой по холсту.

Всё сразу занимает VRAM (w*h*4 байт) и выбрасывает ошибку при превышении лимита.

8. Шейдерный движок

Напишите небольшую GLSL-подобную программу один раз; она выполняется попиксельно на реальном GPU, без участия Lua.

gpu.compileShader([[
  float sdSphere(vec3 p, float r) { return length(p) - r; }
  uniform float speed;
  color = vec3(uv.x, uv.y, sin(time * speed));
]])
gpu.setUniform("speed", 2.0)

Здесь нет main — код после определений функций выполняется сверху вниз; color — это выходной пиксель. gpu.clearShader() возвращает к обычной 2D-отрисовке.

  • gpu.isGpuMode() → true, пока шейдер активен.
  • gpu.setUniform(name, value) / gpu.setUniform3(name, x, y, z) — обновление на лету, без перекомпиляции.
  • gpu.setGpuResolution(w, h) — разрешение, в котором рендерит шейдер (независимо от setSize). Согласуйте с формой cols:rows вашего массива или не вызывайте. У активного шейдера нет постоянной связи с компьютером, который его запустил — он останавливается только если последний подключённый компьютер отключается, или вы вызываете gpu.clearShader(). texture() пока не ускорен на GPU — шейдер с выборкой текстуры компилируется нормально, но не будет рендериться автоматически. Управляйте им сами:
gpu.compileShader(src)
gpu.uploadTexture(0, w, h, pixels)
while true do
  gpu.runShader(os.clock())
  gpu.sync()
  sleep(0)
end
Язык шейдеров
  • Два типа: float, vec3.
  • Предопределённые: color (пишите сюда), uv (.x/.y 0..1, .y=0 сверху), res, time.
  • uniform <float|vec3> name;
  • Функции: <float|vec3> name(params) { ...; return expr; }. Без рекурсии. Должны идти перед любым другим оператором верхнего уровня, включая объявления uniform.
  • Управляющие конструкции: if/else, for (init; cond; update) {}, break;, return expr;.
  • Операторы: + - * /, унарные - !, сравнения, && ||, свизл .x .y .z. vec3 * float работает; float * vec3 — нет.
  • Встроенные: vec3(f,f,f), sin cos tan sqrt abs floor fract exp pow mod min max step clamp mix smoothstep length dot cross normalize reflect, texture(slot, u, v).
  • Встроенные для трассировки лучей (возвращают ближайшее положительное расстояние попадания или -1.0 при промахе): intersectSphere(ro, rd, center, radius), intersectPlane(ro, rd, planeY), intersectBox(ro, rd, center, halfSize).

9. Память

ВызовВозвращает
gpu.getUsedMemory()Байты, используемые сейчас.
gpu.getMaxMemory()Бюджет VRAM для этой периферии.

10. Ввод мыши и прокрутки

Срабатывает только при взгляде на лицевую сторону экрана без открытого GUI. Приседание не влияет. Ввод с клавиатуры здесь не захватывается — это отдельная периферия клавиатуры.

СобытиеАргументыТриггер
tm_monitor_touchside, x, y, softЛюбая кнопка, привязанная к «использовать» (по умолчанию правый клик). soft всегда false.
tm_monitor_mouseside, x, y, button, actionНажатие/отпускание кнопки мыши.
tm_monitor_scrollside, x, y, dirdir — 1 (вверх) или -1 (вниз).
tm_monitor_dragside, x, y, buttonКурсор переместился за этот тик при зажатой кнопке. Раз за клиентский тик.

x, y — абсолютные координаты экрана (с 1) по всему массиву.

while true do
  local ev, side, x, y, button, action = os.pullEvent("tm_monitor_mouse")
  gpu.setPixel(x, y, 0xFF0000)
  gpu.sync()
end

11. API немедленного режима 3D

gpu3d = gpu.createWindow3D(...)
gpu3d.glFrustum(70, 0.1, 100)
gpu3d.glLoadIdentity()
gpu3d.glTranslate(0, 0, -5)
gpu3d.glDirLight(0, -1, 0)
gpu3d.glBegin(4)   -- треугольники
gpu3d.glColor(0xFF0000)
gpu3d.glVertex(-1, -1, 0)
gpu3d.glVertex( 1, -1, 0)
gpu3d.glVertex( 0,  1, 0)
gpu3d.glEnd()
gpu3d.render()
gpu3d.sync()
ВызовПримечания
glFrustum(fov, near, far)Перспективная проекция.
glDirLight(x, y, z)Направленный свет.
glLoadIdentity() / glPushMatrix() / glPopMatrix()Стек модельных матриц.
glTranslate / glScale / glRotate(angleDeg, x,y,z)
glBegin([mode=4]) / glEnd()Начать/закончить примитив.
glVertex(x,y,z)Добавляет вершину с текущим цветом/UV.
glTexCoord(u,v)UV для следующей вершины.
glColor(color)Упакованное int или (r,g,b[,a]).
glEnable(3553) / glDisable(3553)Поддерживается только GL_TEXTURE_2D.
glGenTextures() / glDeleteTextures / glBindTexture / glTexImageУправление текстурами.
getConstants()Таблица GL-констант имя→значение.
render()Отсекает, освещает, обрезает, проецирует, сортирует, выводит с последнего clear().
clear()Очищает холст + треугольники + сбрасывает матрицу/буфер глубины.

12. Производительность

Вся отрисовка — серверная Java, всегда — одиночная игра, LAN или выделенный сервер. Передача пикселей клиенту — единственная реальная нагрузка на клиент, выполняется через массовое копирование памяти. Попіксельная отрисовка на Lua (реймарчинг, плазма и т.п.) задушит клиент — используйте шейдерный движок, который работает на GPU без Lua на пиксель.

13. Яркость (ниты)

gpu.setBrightness(200)   -- 2x от обычного
print(gpu.getBrightness())

ниты / 100 масштабирует итоговый вывод пикселей — 100 по умолчанию (1.0x). Применяется и к CPU-отрисовке, и к GPU-шейдерам. Значения, превышающие 255, обрезаются, а не заворачиваются. Диапазон настраивается на сервере (minBrightnessNits/maxBrightnessNits, по умолчанию 10–400).

Частые вопросы

Как установить High Level Peripherals?

Установите NeoForge под свою версию Minecraft, скачайте High Level Peripherals под ту же версию и загрузчик, положите файл в папку mods и запустите игру с профилем загрузчика.

Для каких версий Minecraft есть High Level Peripherals?

У High Level Peripherals есть сборки для Minecraft 1.21.1.

Нужен ли High Level Peripherals на сервере?

Нужен и в игре, и на сервере

Лицензия и источник
MIT Licenseможно свободно использовать и распространять с указанием автора
Оригинал — Modrinth↗Файлы — без изменений, проверены по SHA-512Это ваш мод? Правообладателям

Сайт использует cookie: необходимые — для входа и темы, а также счётчики посещений Яндекс Метрика и LiveInternet — по ним мы видим, как пользуются сайтом. Рекламных cookie у нас нет. Подробнее