High Level Peripherals
Это форк мода Tom's Peripherals с небольшими дополнениями и исправлениями
- Загрузчики
- NeoForge
- Скачиваний на Modrinth
- 344
- Подписчиков на Modrinth
- 1
- версии
- 3
- Обновлён
- 2 июля 20262 июл.
- Опубликован
- в 2026
Коротко о моде
Нужен и в игре, и на сервере
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/.y0..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_touch | side, x, y, soft | Любая кнопка, привязанная к «использовать» (по умолчанию правый клик). soft всегда false. |
tm_monitor_mouse | side, x, y, button, action | Нажатие/отпускание кнопки мыши. |
tm_monitor_scroll | side, x, y, dir | dir — 1 (вверх) или -1 (вниз). |
tm_monitor_drag | side, 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()
end11. 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 на сервере?
Нужен и в игре, и на сервере