Спавн частиц в форме сферы

Версия Minecraft
1.12.2
API
Forge
183
8
16
Всем здравствуйте. Я решил сделать так, чтобы при нажатии ПКМ моим предметом по блоку, из центра блока в стороны разлетались частицы EnumParticleTypes.FLAME. Как я понял, надо заспавнить частицы в центре блока, а потом каждой задать в каком-нибудь цикле нужное направление. Но вот я вообще не понимаю, как это сделать. (как сделать что-то по нажатию моим предметом на блок я знаю)
 
Решение
В классе WorldClient есть метод makeFireworks, который создаёт взрыв фейерверка. Этот метод вызывает класс ParticleFirework.Starter, в котом есть разные методы создания разных форм из частиц. Например, код создающий шар:
Java:
private void createBall(double speed, int size, int[] colours, int[] fadeColours, boolean trail, boolean twinkleIn)
{
    double d0 = this.posX;
    double d1 = this.posY;
    double d2 = this.posZ;

    for (int i = -size; i <= size; ++i)
    {
        for (int j = -size; j <= size; ++j)
        {
            for (int k = -size; k <= size; ++k)
            {
                double d3 = (double)j + (this.rand.nextDouble() - this.rand.nextDouble()) * 0.5D;
                double d4 = (double)i +...
183
8
16
Попробовал так:
SomeItem.java:
for (int i = 0; i <= 100; i++) {
            world.spawnParticle(EnumParticleTypes.FLAME, ((double)pos.getX()), (double)pos.getY() + 0.5, (double)pos.getZ(), i / 100, 0.1, 0.0);
        }
но получилось что-то странное (в точке 1 спавнится много частиц и они летят строго вверх. также спанится одна частица 2, которая на большой скорости улетает по направлению стрелки 3):
2020-12-03_10.42.29.png
 
183
8
16
Единственный спавн частиц в классе EntityFireworkRocket - это
EntityFireworkRocket.java:
//что-то
if (this.world.isRemote && this.fireworkAge % 2 < 2)
        {
            this.world.spawnParticle(EnumParticleTypes.FIREWORKS_SPARK, this.posX, this.posY - 0.3D, this.posZ, this.rand.nextGaussian() * 0.05D, -this.motionY * 0.5D, this.rand.nextGaussian() * 0.05D);
        }
//что-то
 
1,560
86
204
В классе WorldClient есть метод makeFireworks, который создаёт взрыв фейерверка. Этот метод вызывает класс ParticleFirework.Starter, в котом есть разные методы создания разных форм из частиц. Например, код создающий шар:
Java:
private void createBall(double speed, int size, int[] colours, int[] fadeColours, boolean trail, boolean twinkleIn)
{
    double d0 = this.posX;
    double d1 = this.posY;
    double d2 = this.posZ;

    for (int i = -size; i <= size; ++i)
    {
        for (int j = -size; j <= size; ++j)
        {
            for (int k = -size; k <= size; ++k)
            {
                double d3 = (double)j + (this.rand.nextDouble() - this.rand.nextDouble()) * 0.5D;
                double d4 = (double)i + (this.rand.nextDouble() - this.rand.nextDouble()) * 0.5D;
                double d5 = (double)k + (this.rand.nextDouble() - this.rand.nextDouble()) * 0.5D;
                double d6 = (double)MathHelper.sqrt(d3 * d3 + d4 * d4 + d5 * d5) / speed + this.rand.nextGaussian() * 0.05D;
                this.createParticle(d0, d1, d2, d3 / d6, d4 / d6, d5 / d6, colours, fadeColours, trail, twinkleIn);

                if (i != -size && i != size && j != -size && j != size)
                {
                    k += size * 2 - 1;
                }
            }
        }
    }
}
 
183
8
16
В классе WorldClient есть метод makeFireworks, который создаёт взрыв фейерверка. Этот метод вызывает класс ParticleFirework.Starter, в котом есть разные методы создания разных форм из частиц. Например, код создающий шар:
Это на какую версию майна?
 
183
8
16
делал так:
SomeItem.java:
int j = 90;
        for (int i = 0; i <= 90; i++) {
            world.spawnParticle(EnumParticleTypes.FLAME, ((double)pos.getX() + 0.5), (double)pos.getY() + 0.5, (double)pos.getZ() + 0.5, i / 1000.0, j / 1000.0, 0.0D);
            System.out.println("I = " + i);
            System.out.println("J = " + j);
            j--;
        }
        j = 0;
        for (int i = 90; i >= 0; i--) {
            world.spawnParticle(EnumParticleTypes.FLAME, ((double)pos.getX() + 0.5), (double)pos.getY() + 0.5, (double)pos.getZ() + 0.5, i / 1000.0, j / 1000.0, 0.0D);
            System.out.println("I = " + i);
            System.out.println("J = " + j);
            j--;
        }
        j = -90;
        for (int i = 0; i >= -90; i--) {
            world.spawnParticle(EnumParticleTypes.FLAME, ((double)pos.getX() + 0.5), (double)pos.getY() + 0.5, (double)pos.getZ() + 0.5, i / 1000.0, j / 1000.0, 0.0D);
            System.out.println("I = " + i);
            System.out.println("J = " + j);
            j++;
        }
        j = 0;
        for (int i = -90; i <= 0 ; i++) {
            world.spawnParticle(EnumParticleTypes.FLAME, ((double)pos.getX() + 0.5), (double)pos.getY() + 0.5, (double)pos.getZ() + 0.5, i / 1000.0, j / 1000.0, 0.0D);
            System.out.println("I = " + i);
            System.out.println("J = " + j);
            j++;
        }
        int z = 90;
        for (int i = 0; i <= 90; i++) {
            world.spawnParticle(EnumParticleTypes.FLAME, ((double)pos.getX() + 0.5), (double)pos.getY() + 0.5, (double)pos.getZ() + 0.5, i / 1000.0, 0.0D, z / 1000.0);
            System.out.println("I = " + i);
            System.out.println("Z = " + z);
            z--;
        }
        z = 0;
        for (int i = 90; i >= 0; i--) {
            world.spawnParticle(EnumParticleTypes.FLAME, ((double)pos.getX() + 0.5), (double)pos.getY() + 0.5, (double)pos.getZ() + 0.5, i / 1000.0, 0.0D, z / 1000.0);
            System.out.println("I = " + i);
            System.out.println("Z = " + z);
            z--;
        }
        z = -90;
        for (int i = 0; i >= -90; i--) {
            world.spawnParticle(EnumParticleTypes.FLAME, ((double)pos.getX() + 0.5), (double)pos.getY() + 0.5, (double)pos.getZ() + 0.5, i / 1000.0, 0.0D, z / 1000.0);
            System.out.println("I = " + i);
            System.out.println("Z = " + z);
            z++;
        }
        z = 0;
        for (int i = -90; i <= 0 ; i++) {
            world.spawnParticle(EnumParticleTypes.FLAME, ((double)pos.getX() + 0.5), (double)pos.getY() + 0.5, (double)pos.getZ() + 0.5, i / 1000.0, 0.0D, z / 1000.0);
            System.out.println("I = " + i);
            System.out.println("Z = " + z);
            z++;
        }

Вот настолько костыльный велосипед. Если его фиксить, то я бы уменьшил кол-во частиц. Например в for добавить
SomeItem.java:
for(int i = 0, i <= 90; i++) {
    if ((i % 3) == 0) {
        //и тут уже спавним частицы
    }
}
таким образом уменьшив кол-во частиц в 3 раза. Но это как по мне не очень красиво. Надо всё же сделать сферу в трёх измерениях, а не ромб в двух... Так что жду ваших идей)
 
183
8
16
Немного подкорекировал код, подогнав под свои нужды и нужды форджа:
SomeItem.java:
Random rand = world instanceof World ? ((World)world).rand : new Random();
            double d0 = pos.getX() + 0.5;
            double d1 = pos.getY() + 0.5;
            double d2 = pos.getZ() + 0.5;
            int size = 10;
            double speed = 0.1D;
            for (int i = -size; i <= size; ++i)
            {
                for (int j = -size; j <= size; ++j)
                {
                    for (int k = -size; k <= size; ++k)
                    {
                        double d3 = (double)j + (rand.nextDouble() - rand.nextDouble()) * 0.5D;
                        double d4 = (double)i + (rand.nextDouble() - rand.nextDouble()) * 0.5D;
                        double d5 = (double)k + (rand.nextDouble() - rand.nextDouble()) * 0.5D;
                        double d6 = (double)MathHelper.sqrt(d3 * d3 + d4 * d4 + d5 * d5) / speed + rand.nextGaussian() * 0.05D;
                        // this.createParticle(d0, d1, d2, d3 / d6, d4 / d6, d5 / d6, colours, fadeColours, trail, twinkleIn);
                        world.spawnParticle(EnumParticleTypes.FLAME, d0, d1, d2, d3 / d6, d4 / d6, d5 / d6);
                        if (i != -size && i != size && j != -size && j != size)
                        {
                            k += size * 2 - 1;
                        }
                    }
                }
            }
результат:2020-12-03_17.36.41.png
 
183
8
16
2020-12-03_17.36.41.png
Именно такой результат мне и нужен был! Спасибо, @MaximPixel! Ещё одна просьба, помоги мне найти класс, из которого ты взял этот метод, чтобы мне каждый раз за новой фигурой не создавать новую тему
 
Сверху