Вверх ↑
Ответов: 136
Mafia
Консильери
#1: 2026-08-27 22:02:35 ЛС | профиль | цитата
Захотелось сделать что-нибудь для MCGL9, но с использованием ChatGPT. (VPN нужен, регистрация не нужна)
Внезапно, с первого раза рабочий код выдал.
Он даже зачем-то нашёл мою тему про ёлочку, в качестве "примеров сообщества".

Лог чата и код программы

kriponeko :
Напиши код для фейерверка из вокселей. Оно исполняется на старом NashornЭто программа, с помощью которой JS код для MCGL9 запускается в Java, на которой написан клиент игры.
Вот инструкция по функциям: https://forum.minecraft-galaxy.ru/wiki/1141

ChatGPT :
Да. По документации MCGL9 у тебя есть display.voxel(x, y, z, color), а возвращаемый объект можно потом двигать через cursorX/Y/Z и менять color. update(time) получает время в миллисекундах, поэтому для старого Nashorn удобно сделать всю анимацию через него, без setTimeout/Promise.

Ниже вариант именно воксельного фейерверка: ракета летит вверх, затем взрывается шаром из цветных частиц, частицы разлетаются и постепенно опускаются. Используются только старые конструкции JS/Nashorn.
function init() {
d = display
c = color

// Цвета
COLORS = [
c.rgb(255, 40, 40), // красный
c.rgb(40, 120, 255), // синий
c.rgb(255, 220, 40), // жёлтый
c.rgb(40, 255, 100), // зелёный
c.rgb(255, 50, 220), // розовый
c.rgb(40, 255, 255), // голубой
c.rgb(255, 255, 255) // белый
]

// Центр проектора
CX = 7.5
CZ = 7.5

// Настройки
PARTICLES = 120
ROCKET_TIME = 900
EXPLOSION_TIME = 2600

fireworks = []

// Первый запуск
createFirework(0)

lastSpawn = 0
}


// Создать новый фейерверк
function createFirework(time) {

fw = {
state: 0, // 0 = ракета, 1 = взрыв
startTime: time,
x: CX + (Math.random() - 0.5) * 8,
z: CZ + (Math.random() - 0.5) * 5,
startY: 0,
targetY: 18 + Math.random() * 9,
rocket: null,
particles: []
}

// Воксель ракеты
fw.rocket = d.voxel(
fw.x,
fw.startY,
fw.z,
c.rgb(255, 255, 255)
)

fw.rocket.scale = 1

fireworks.push(fw)
}


// Взрыв
function explode(fw, time) {

fw.state = 1
fw.explodeTime = time

// Убираем ракету
fw.rocket.remove()
fw.rocket = null

for (i = 0; i < PARTICLES; i++) {

// Случайное направление
theta = Math.random() * Math.PI * 2
phi = Math.acos(2 * Math.random() - 1)

// Скорость частицы
speed = 3.0 + Math.random() * 4.0

vx = Math.sin(phi) * Math.cos(theta) * speed
vy = Math.cos(phi) * speed
vz = Math.sin(phi) * Math.sin(theta) * speed

p = {
voxel: d.voxel(
fw.x,
fw.targetY,
fw.z,
COLORS[Math.floor(Math.random() * COLORS.length)]
),

x: fw.x,
y: fw.targetY,
z: fw.z,

vx: vx,
vy: vy,
vz: vz,

life: 0,
maxLife: EXPLOSION_TIME * (0.7 + Math.random() * 0.5)
}

p.voxel.scale = 0.8 + Math.random() * 0.5

fw.particles.push(p)
}
}


// Обновление
function update(time) {

// Создаём следующий фейерверк
if (time - lastSpawn > 800) {
createFirework(time)
lastSpawn = time
}


for (f = fireworks.length - 1; f >= 0; f--) {

fw = fireworks[f]


// ==========================================
// РАКЕТА
// ==========================================

if (fw.state == 0) {

t = time - fw.startTime

progress = t / ROCKET_TIME

if (progress >= 1) {

// Долетела — взрываем
fw.targetY = fw.targetY
explode(fw, time)

} else {

// Плавный подъём
y = fw.startY +
(fw.targetY - fw.startY) *
progress

fw.rocket.cursorX = fw.x
fw.rocket.cursorY = y
fw.rocket.cursorZ = fw.z

// Немного меняем цвет ракеты
if (Math.random() < 0.1) {
fw.rocket.color =
COLORS[Math.floor(Math.random() * COLORS.length)]
}
}

continue
}


// ==========================================
// ВЗРЫВ
// ==========================================

alive = false

for (p = 0; p < fw.particles.length; p++) {

particle = fw.particles[p]

particle.life += 50

if (particle.life >= particle.maxLife) {

particle.voxel.remove()
continue
}

alive = true

// Время в секундах
dt = 0.05

// Физика
particle.vy -= 3.0 * dt

particle.x += particle.vx * dt
particle.y += particle.vy * dt
particle.z += particle.vz * dt

// Небольшое торможение
particle.vx *= 0.985
particle.vy *= 0.985
particle.vz *= 0.985


// Позиция
particle.voxel.cursorX = particle.x
particle.voxel.cursorY = particle.y
particle.voxel.cursorZ = particle.z


// Мерцание
if (Math.random() < 0.08) {
particle.voxel.color =
COLORS[Math.floor(Math.random() * COLORS.length)]
}


// Постепенно уменьшаем частицу
lifePercent =
particle.life / particle.maxLife

particle.voxel.scale =
1.0 - lifePercent * 0.7
}


// Когда все частицы умерли — удаляем фейерверк
if (!alive) {
fireworks.splice(f, 1)
}
}
}
Что можно быстро подкрутить
● PARTICLES = 120 — количество вокселей в одном взрыве.
● ROCKET_TIME = 900 — насколько быстро ракета поднимается.
● EXPLOSION_TIME = 2600 — продолжительность взрыва.
● targetY = 18 + Math.random() * 9 — высота взрыва.
● speed = 3.0 + Math.random() * 4.0 — размер взрыва.
● lastSpawn › 800 — интервал между фейерверками.
Я специально использовал color.rgb(...), а не шестнадцатеричные значения: в старых версиях Java/Nashorn у MCGL9 встречалась ошибка преобразования больших RGB-чисел в Integer; в примерах сообщества color.rgb() как раз использовался как совместимый вариант.

Если хочешь прям совсем красивый вариант, можно сделать следующий код с несколькими типами взрыва: шар, кольцо, сердце, звезда и двойной взрыв, причём каждый запуск будет случайно выбирать форму.

Как работать с MCGL9

Чтобы MCGL9 у вас вообще запустился, обязательно зайдите в Настройки -› Прочие:
Автозапуск -› Доверенные зоны (запускаться будут только проекторы в зонах, где вы владелец или прописаны)
Частиц в проекторе -› 5000

Если поставить Автозапуск -› Везде, то будут запускаться проекторы во всех зонах, и вы можете вылететь, просто двигаясь по миру, потому что у кого-то в проекторе запущен слишком тяжёлый код.

Если такое случилось, или вы сами запустили такой код, и не можете теперь войти - просто поставьте Автозапуск -› Нигде в меню выбора планет, ещё до высадки.

MCGL9 работает на стороне клиента, т.е. именно у вас на компьютере, и на сервере при этом не происходит ничего. Чтобы другие могли видеть, что у вас запущено - оно должно быть запущено у них, т.е. им надо сделать указанные выше настройки. Отображение при этом будет у каждого своё, без синхронизации.

Для запуска кода, скопируйте его из темы, в игре откройте блокнот, вставьте в него код (нажмите Ctrl+V), сохраните (справа снизу), возьмите в руку MCGL9, нажмите F для его открытия, вставьте блокнот в MCGL9, вставьте MCGL9 в проектор.

Чтобы во время тестов не вынимать MCGL9 и блокнот из проектора при каждой правке, создайте в каталоге %APPDATA%\MCGL\MinecraftLauncher2\repository\mclient\plugins файл test.js, а в блокнот вставьте код sys.use('@test'). Тогда после редактирования и сохранения файла test.js, достаточно будет нажать пкм по проектору, чтобы перезапустить его уже с новым кодом. Но такой способ запуска будет отображаться только вам, поскольку файл с кодом у вас на компьютере. Для показа другим, в блокнот должен быть записан сам код программы.

У проектора есть лицевая сторона в горизонтальной плоскости, которая при установке смотрит на вас. Нулевые координаты находятся в левом дальнем вокселетрёхмерный пиксель прямо над проектором. Кубическая зона, в пределах которой доступно отображение: по 2 куба влево и вправо, 1 за проектор, 3 перед проектором, по 2 вверх и вниз. Сторона одного куба равна 16 единицам координат. Воксель обычного размера равен 1 единице координат.

У блокнота есть ограничение по количеству символов. Если код не помещается, можно попробовать сжать его в любом минификаторе JS кода, но в некоторых код при этом может сломаться. При использовании jscompress.com (нужен VPN) обычно работает.

Для работы с кодом, лучше включить игру кнопкой "Запуск с консолью". Она будет за окном игры, для её показа переключитесь на лаунчер. Если код не работает, в ней среди прочего будет отображаться ошибка кода, в случае наличия таковой. Чтобы было понятнее, какой текст относится именно к ней, можно нажать на проектор правой кнопкой, для перезапуска кода, и повторного отображения ошибки.

При ошибке Cannot convert 4290465319 to java.lang.Integer, надо указать клиенту свою версию JAVA
● Если не уверены, какая у вас стоит JAVA, загрузите новую
● В лаунчере выберите нужный аккаунт, настройка сохраняется для каждого отдельно
Изменить профиль (карандашик) -› Дополнительные настройки (вкладки сверху) -› Указать путь до java
● Перейдите в место установки java, обычно C:/Program Files/Java
● Выберите там каталог с JRE (не JDK) версией повыше, если их несколько
● Далее каталог bin, и найдите java.exe
● Кнопка ОК в окне настройки профиля, чтобы сохранить (справа снизу)

Что есть готового

Новогодняя Ёлочка
Снежинки, дождь, глиттер, торнадо
Конвертер из редактора и файлов игры
Движок Assasin'а
Змейка admin'а (в примерах)
Сообщество OCTOPUS'а
Сообщество apl'а

Всё конечно довольно старое, обращайте внимание на даты.

В начале моих кодов есть числовые настройки, их можно менять. Так например торнадо, во многом сделан из ёлочки)

Попробуйте сделать что-то своё, сами или с нейронкой. Главное дайте ей ссылку на wiki про MCGL9, и не забудьте сказать про старый NashornЭто программа, с помощью которой JS код для MCGL9 запускается в Java, на которой написан клиент игры, чтобы она понимала контекст применения, и не пыталась использовать новые функции, которых там нет.
карма: -1
1
Голосовали:Trall911