Внезапно, с первого раза рабочий код выдал.
Он даже зачем-то нашёл мою тему про ёлочку, в качестве "примеров сообщества".
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 у вас вообще запустился, обязательно зайдите в Настройки -› Прочие:
● Автозапуск -› Доверенные зоны (запускаться будут только проекторы в зонах, где вы владелец или прописаны)
● Частиц в проекторе -› 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, на которой написан клиент игры, чтобы она понимала контекст применения, и не пыталась использовать новые функции, которых там нет.
Достижения
Биржа 




Поиск
Твинки
Друзья
Администрация