Как добавить частицы на 1 сторону блока?

Версия Minecraft
1.7.10

jopi

Попрошайка
1,421
30
260
Как добавить частицы на 1 сторону блока? Или где найти сурс руды красного камня если его по сути нету в папке с src.
 
Решение
Ну вообщем
Java:
if (this.field_150187_a)
{
this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_);
}
Это проверка на то, работает ли печь. Если да, то вызывается метод ниже. Тебе эта if проверка не нужна, так как ты будешь вызывать этот метод по onBlockActivated.

Попробуй поиграться с разными значениями d1-d3. Посмотри, что будет.
Все не так.

Есть 2 блока руды Redstone, которые определяются булеаном при реге. Тот что с true, будет спаунить частицы.
Java:
 public BlockRedstoneOre(boolean p_i45420_1_)
{
        super(Material.rock);

        if (p_i45420_1_)
        {
            this.setTickRandomly(true);
        }

        this.field_150187_a = p_i45420_1_;
}

В Методах onBlockClicked, onEntityWalking...

CMTV

Основатель
Администратор
1,304
4
601
Да тут вроде никаких func нет. (код из печки). Все понятно. Только комменты добавить и все.
Java:
EnumFacing enumfacing = (EnumFacing)stateIn.getValue(FACING);
double d0 = (double)pos.getX() + 0.5D;
double d1 = (double)pos.getY() + rand.nextDouble() * 6.0D / 16.0D;
double d2 = (double)pos.getZ() + 0.5D;
double d3 = 0.52D;
double d4 = rand.nextDouble() * 0.6D - 0.3D;

if (rand.nextDouble() < 0.1D)
{
    worldIn.playSound((double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, SoundEvents.BLOCK_FURNACE_FIRE_CRACKLE, SoundCategory.BLOCKS, 1.0F, 1.0F, false);
}

switch (enumfacing)
{
    case WEST:
        worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 - 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D);
        worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 - 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D);
        break;
    case EAST:
        worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D);
        worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D);
        break;
    case NORTH:
        worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 - 0.52D, 0.0D, 0.0D, 0.0D);
        worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + d4, d1, d2 - 0.52D, 0.0D, 0.0D, 0.0D);
        break;
    case SOUTH:
        worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 + 0.52D, 0.0D, 0.0D, 0.0D);
        worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + d4, d1, d2 + 0.52D, 0.0D, 0.0D, 0.0D);
}

А. Стоп. У меня же 1.12+. Ну может в 1.7.10 и есть func...

Кстати, по желанию можешь сделать, чтобы частицы и звук появлялись только при клике на блок c маслом в руке и оставались на пару секунд, а не все время. Так реалистичней будет.
 
Последнее редактирование:

jopi

Попрошайка
1,421
30
260
Да тут вроде никаких func нет. (код из печки). Все понятно. Только комменты добавить и все.
Java:
EnumFacing enumfacing = (EnumFacing)stateIn.getValue(FACING);
double d0 = (double)pos.getX() + 0.5D;
double d1 = (double)pos.getY() + rand.nextDouble() * 6.0D / 16.0D;
double d2 = (double)pos.getZ() + 0.5D;
double d3 = 0.52D;
double d4 = rand.nextDouble() * 0.6D - 0.3D;

if (rand.nextDouble() < 0.1D)
{
    worldIn.playSound((double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, SoundEvents.BLOCK_FURNACE_FIRE_CRACKLE, SoundCategory.BLOCKS, 1.0F, 1.0F, false);
}

switch (enumfacing)
{
    case WEST:
        worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 - 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D);
        worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 - 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D);
        break;
    case EAST:
        worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D);
        worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D);
        break;
    case NORTH:
        worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 - 0.52D, 0.0D, 0.0D, 0.0D);
        worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + d4, d1, d2 - 0.52D, 0.0D, 0.0D, 0.0D);
        break;
    case SOUTH:
        worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 + 0.52D, 0.0D, 0.0D, 0.0D);
        worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + d4, d1, d2 + 0.52D, 0.0D, 0.0D, 0.0D);
}

А. Стоп. У меня же 1.12+. Ну может в 1.7.10 и есть func...

Кстати, по желанию можешь сделать, чтобы частицы и звук появлялись только при клике на блок c маслом в руке и оставались на пару секунд, а не все время. Так реалистичней будет.

У меня вообще капец...

Java:
@SideOnly(Side.CLIENT)
public void randomDisplayTick(World p_149734_1_, int p_149734_2_, int p_149734_3_, int p_149734_4_, Random p_149734_5_)
{
    if (this.field_150187_a)
    {
        this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_);
    }
}
private void func_150186_m(World p_150186_1_, int p_150186_2_, int p_150186_3_, int p_150186_4_)
{
    Random random = p_150186_1_.rand; //Вроде-бы спавн рандомных частиц.
    double d0 = 0.0625D; //Тут уже сам не знаю так-что могу писать бред.

    for (int l = 0; l < 6; ++l)
    {
        double d1 = (double)((float)p_150186_2_ + random.nextFloat()); //Рандомный флоат. Скорее всего это
        double d2 = (double)((float)p_150186_3_ + random.nextFloat()); //Положение частиц. Рандомное.
        double d3 = (double)((float)p_150186_4_ + random.nextFloat());
        
        if (l == 0 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_, p_150186_4_ + 1).isOpaqueCube())
        {
            d3 = (double)(p_150186_4_ + 1) + d0;
        }
        if (l == 1 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_ - 1, p_150186_4_).isOpaqueCube())//Ниже смотри
        { //там места не хватило. Крч. l == 1 это сторона нашего блока как в текстуре. 1 - top т.е. вверх блока.
            d2 = (double)(p_150186_3_ + 0) - d0;
        }
        
        if (d1 < (double)p_150186_2_ || d1 > (double)(p_150186_2_ + 1) || d2 < 0.0D || d2 > (double)(p_150186_3_ + 1) || d3 < (double)p_150186_4_ || d3 > (double)(p_150186_4_ + 1))
        {
            p_150186_1_.spawnParticle("flame", d1, d2, d3, 0.0D, 0.0D, 0.0D); //Спавн частиц огня "flame".
            p_150186_1_.spawnParticle("smoke", d1, d2, d3, 0.0D, 0.0D, 0.0D); //Спавн частиц дыма "smoke".

        }
    }
}
}
И дальше ещё есть
 

CMTV

Основатель
Администратор
1,304
4
601
Ну вообщем
Java:
if (this.field_150187_a)
{
this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_);
}
Это проверка на то, работает ли печь. Если да, то вызывается метод ниже. Тебе эта if проверка не нужна, так как ты будешь вызывать этот метод по onBlockActivated.

Попробуй поиграться с разными значениями d1-d3. Посмотри, что будет.
 

jopi

Попрошайка
1,421
30
260
Ну вообщем
Java:
if (this.field_150187_a)
{
this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_);
}
Это проверка на то, работает ли печь. Если да, то вызывается метод ниже. Тебе эта if проверка не нужна, так как ты будешь вызывать этот метод по onBlockActivated.

Попробуй поиграться с разными значениями d1-d3. Посмотри, что будет.
Окей, просто мало частиц было я натыкался в коде. Это редстоун руда код. Крч копаюсь и найти сторону Top не могу xD
 
1,057
50
234
Ну вообщем
Java:
if (this.field_150187_a)
{
this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_);
}
Это проверка на то, работает ли печь. Если да, то вызывается метод ниже. Тебе эта if проверка не нужна, так как ты будешь вызывать этот метод по onBlockActivated.

Попробуй поиграться с разными значениями d1-d3. Посмотри, что будет.
Все не так.

Есть 2 блока руды Redstone, которые определяются булеаном при реге. Тот что с true, будет спаунить частицы.
Java:
 public BlockRedstoneOre(boolean p_i45420_1_)
{
        super(Material.rock);

        if (p_i45420_1_)
        {
            this.setTickRandomly(true);
        }

        this.field_150187_a = p_i45420_1_;
}

В Методах onBlockClicked, onEntityWalking, onBlockActivated
вызывается спавн частиц и замена блока (ставится блок со светом)
Java:
private void func_150185_e(World p_150185_1_, int p_150185_2_, int p_150185_3_, int p_150185_4_)
    {
        this.func_150186_m(p_150185_1_, p_150185_2_, p_150185_3_, p_150185_4_);

        if (this == Blocks.redstone_ore)
        {
            p_150185_1_.setBlock(p_150185_2_, p_150185_3_, p_150185_4_, Blocks.lit_redstone_ore);
        }
    }

В рандом тиках так-же спавнятся частицы
Java:
@SideOnly(Side.CLIENT)
    public void randomDisplayTick(World p_149734_1_, int p_149734_2_, int p_149734_3_, int p_149734_4_, Random p_149734_5_)
    {
        if (this.field_150187_a)
        {
            this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_);
        }
    }

Ну и сам метод спавна частиц, который вроде определяет Side блока и задает координаты для частиц
Java:
private void func_150186_m(World p_150186_1_, int p_150186_2_, int p_150186_3_, int p_150186_4_)
    {
        Random random = p_150186_1_.rand;
        double d0 = 0.0625D;

        for (int l = 0; l < 6; ++l)
        {
            double d1 = (double)((float)p_150186_2_ + random.nextFloat());
            double d2 = (double)((float)p_150186_3_ + random.nextFloat());
            double d3 = (double)((float)p_150186_4_ + random.nextFloat());

            if (l == 0 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_ + 1, p_150186_4_).isOpaqueCube())
            {
                d2 = (double)(p_150186_3_ + 1) + d0;
            }

            if (l == 1 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_ - 1, p_150186_4_).isOpaqueCube())
            {
                d2 = (double)(p_150186_3_ + 0) - d0;
            }

            if (l == 2 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_, p_150186_4_ + 1).isOpaqueCube())
            {
                d3 = (double)(p_150186_4_ + 1) + d0;
            }

            if (l == 3 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_, p_150186_4_ - 1).isOpaqueCube())
            {
                d3 = (double)(p_150186_4_ + 0) - d0;
            }

            if (l == 4 && !p_150186_1_.getBlock(p_150186_2_ + 1, p_150186_3_, p_150186_4_).isOpaqueCube())
            {
                d1 = (double)(p_150186_2_ + 1) + d0;
            }

            if (l == 5 && !p_150186_1_.getBlock(p_150186_2_ - 1, p_150186_3_, p_150186_4_).isOpaqueCube())
            {
                d1 = (double)(p_150186_2_ + 0) - d0;
            }

            if (d1 < (double)p_150186_2_ || d1 > (double)(p_150186_2_ + 1) || d2 < 0.0D || d2 > (double)(p_150186_3_ + 1) || d3 < (double)p_150186_4_ || d3 > (double)(p_150186_4_ + 1))
            {
                p_150186_1_.spawnParticle("reddust", d1, d2, d3, 0.0D, 0.0D, 0.0D);
            }
        }
    }
 

jopi

Попрошайка
1,421
30
260
Все не так.

Есть 2 блока руды Redstone, которые определяются булеаном при реге. Тот что с true, будет спаунить частицы.
Java:
 public BlockRedstoneOre(boolean p_i45420_1_)
{
        super(Material.rock);

        if (p_i45420_1_)
        {
            this.setTickRandomly(true);
        }

        this.field_150187_a = p_i45420_1_;
}

В Методах onBlockClicked, onEntityWalking, onBlockActivated
вызывается спавн частиц и замена блока (ставится блок со светом)
Java:
private void func_150185_e(World p_150185_1_, int p_150185_2_, int p_150185_3_, int p_150185_4_)
    {
        this.func_150186_m(p_150185_1_, p_150185_2_, p_150185_3_, p_150185_4_);

        if (this == Blocks.redstone_ore)
        {
            p_150185_1_.setBlock(p_150185_2_, p_150185_3_, p_150185_4_, Blocks.lit_redstone_ore);
        }
    }

В рандом тиках так-же спавнятся частицы
Java:
@SideOnly(Side.CLIENT)
    public void randomDisplayTick(World p_149734_1_, int p_149734_2_, int p_149734_3_, int p_149734_4_, Random p_149734_5_)
    {
        if (this.field_150187_a)
        {
            this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_);
        }
    }

Ну и сам метод спавна частиц, который вроде определяет Side блока и задает координаты для частиц
Java:
private void func_150186_m(World p_150186_1_, int p_150186_2_, int p_150186_3_, int p_150186_4_)
    {
        Random random = p_150186_1_.rand;
        double d0 = 0.0625D;

        for (int l = 0; l < 6; ++l)
        {
            double d1 = (double)((float)p_150186_2_ + random.nextFloat());
            double d2 = (double)((float)p_150186_3_ + random.nextFloat());
            double d3 = (double)((float)p_150186_4_ + random.nextFloat());

            if (l == 0 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_ + 1, p_150186_4_).isOpaqueCube())
            {
                d2 = (double)(p_150186_3_ + 1) + d0;
            }

            if (l == 1 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_ - 1, p_150186_4_).isOpaqueCube())
            {
                d2 = (double)(p_150186_3_ + 0) - d0;
            }

            if (l == 2 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_, p_150186_4_ + 1).isOpaqueCube())
            {
                d3 = (double)(p_150186_4_ + 1) + d0;
            }

            if (l == 3 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_, p_150186_4_ - 1).isOpaqueCube())
            {
                d3 = (double)(p_150186_4_ + 0) - d0;
            }

            if (l == 4 && !p_150186_1_.getBlock(p_150186_2_ + 1, p_150186_3_, p_150186_4_).isOpaqueCube())
            {
                d1 = (double)(p_150186_2_ + 1) + d0;
            }

            if (l == 5 && !p_150186_1_.getBlock(p_150186_2_ - 1, p_150186_3_, p_150186_4_).isOpaqueCube())
            {
                d1 = (double)(p_150186_2_ + 0) - d0;
            }

            if (d1 < (double)p_150186_2_ || d1 > (double)(p_150186_2_ + 1) || d2 < 0.0D || d2 > (double)(p_150186_3_ + 1) || d3 < (double)p_150186_4_ || d3 > (double)(p_150186_4_ + 1))
            {
                p_150186_1_.spawnParticle("reddust", d1, d2, d3, 0.0D, 0.0D, 0.0D);
            }
        }
    }
Ну да всё так вроде только в spawnParticle указан flame а не reddust. Стороны ща указываю что-бы только на стороне 1{Top} были партикли.
 

jopi

Попрошайка
1,421
30
260
Float'ом лучше раскидывать, а то будут частицы в радиусе 2-3 блоков =D
Просто при спауне указываешь x=0.5, z=0.5, y=1 и у тебя будут партиклы сверху посередине. Можешь раскидать их малёх используя java.util.Random#nextInt(bound), а кол-во увеличить циклом for
У меня всё пока зашибись только вот как сделать что-бы всё это само было а не по клику xD
У меня так-то само не получается, голову ломаю. В коде печки нифига найти и понять не могу
 
1,417
44
594
У меня всё пока зашибись только вот как сделать что-бы всё это само было а не по клику xD
У меня так-то само не получается, голову ломаю. В коде печки нифига найти и понять не могу
Тебе надо, что бы все время он испускал партиклы?
 

jopi

Попрошайка
1,421
30
260
Java:
this.setTickRandomly(true); // Прописывается в public BlockYOUBLOCK()

Java:
@SideOnly(Side.CLIENT)
public void randomDisplayTick(World p_149734_1_, int p_149734_2_, int p_149734_3_, int p_149734_4_, Random p_149734_5_)
{
this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_); //Метод спауна частиц
}
Это у меня есть но испускает только по клику потому-что есть

Java:
public void onBlockClicked(World p_149699_1_, int p_149699_2_, int p_149699_3_, int p_149699_4_, EntityPlayer p_149699_5_)
{
    this.func_150186_m(p_149699_1_, p_149699_2_, p_149699_3_, p_149699_4_);
    this.func_150186_m(p_149699_1_, p_149699_2_, p_149699_3_, p_149699_4_);
}
 

jopi

Попрошайка
1,421
30
260
Java:
this.setTickRandomly(true); // Прописывается в public BlockYOUBLOCK()

Java:
@SideOnly(Side.CLIENT)
public void randomDisplayTick(World p_149734_1_, int p_149734_2_, int p_149734_3_, int p_149734_4_, Random p_149734_5_)
{
this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_); //Метод спауна частиц
}
Java:
//Вот как это хламьё так настроить что-бы в onBlockActivated работало?
//this. там нельзя с func прописать...

package fxg.hotoilplus;

import java.util.Random;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;

public class Oven1 extends Block {
    
    private boolean field_150187_a;
    private static final String __OBFID = "CL_00000294";

    public Oven1(boolean p_i45420_1_)
    {
        super(Material.rock); //Материал блока
        this.setBlockName("Oven1"); //Имя блока
        this.setCreativeTab(CreativeTabs.tabBlock); //Предмет будет отоброжатся во вкладке Блоки
        this.setBlockTextureName("fxg:oven"); //Текстура. Чуть ниже про разные стороны.
        this.setHardness(4F); //Твёрдость 4F
        this.setResistance(4F); //Защита от взрывов и т.д. 4F
        
        if (p_i45420_1_)
        {
            this.setTickRandomly(true);
        }

        this.field_150187_a = p_i45420_1_;
    }
public IIcon[] icons = new IIcon[6]; //Добавляет разностороннюю текстуру блока посредством циферных значении :?
@Override
public void registerBlockIcons(IIconRegister reg) { //Регистрирует иконки
    for (int i = 0; i < 6; i ++) { //Интерьер для дома. Шутка. Означает что все стороны будут различатся цифрами.
        this.icons[i] = reg.registerIcon(this.textureName + "_" + i); //тут понятно должно быть.
        //textureName - название вашей текстуры + _ + i(+_+ циферное значение) Итог. Должно быть 6 текстур
        //oven_0.png oven_1.png oven_2.png и т.д.
     }
}
    public IIcon getIcon(int side, int meta) { //Тут он берёт иконки и делает i(число) стороной.
        return this.icons[side];
    }
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int var6, float var7, float var8, float var9){
      
        if(!world.isRemote){ //Вызов мира

            ItemStack currentStack = player.getCurrentEquippedItem(); //Вызов какая вещь в руке
            if(currentStack != null && currentStack.getItem().equals(Game.OilBL)){ //если это бутылка масла то...
                player.inventory.setInventorySlotContents(player.inventory.currentItem, new ItemStack(Game.OilBlockHot)); //ЗАМЕНИТЬ currentItem
                //На вещь которая у вас в руке когда вы жмякали ПКМ по блоку на OilBlockHot(Блок масла).
                return true;
            }
        }
        return false;
    }
public int tickRate(World p_149738_1_)
{
    return 30;
}
public void onBlockClicked(World p_149699_1_, int p_149699_2_, int p_149699_3_, int p_149699_4_, EntityPlayer p_149699_5_)
{
    this.func_150186_m(p_149699_1_, p_149699_2_, p_149699_3_, p_149699_4_);
    this.func_150186_m(p_149699_1_, p_149699_2_, p_149699_3_, p_149699_4_);
    super.onBlockClicked(p_149699_1_, p_149699_2_, p_149699_3_, p_149699_4_, p_149699_5_);
}
@SideOnly(Side.CLIENT)
public void randomDisplayTick(World p_149734_1_, int p_149734_2_, int p_149734_3_, int p_149734_4_, Random p_149734_5_)
{
    if (this.field_150187_a)
    {
        this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_);
    }
}
private void func_150186_m(World p_150186_1_, int p_150186_2_, int p_150186_3_, int p_150186_4_)
{
    Random random = p_150186_1_.rand;
    double d0 = 0.0625D; //Высота партиклей над блоком

    for (int l = 0; l < 6; ++l)
    {
        double d1 = (double)((float)p_150186_2_ + random.nextFloat());
        double d2 = (double)((float)p_150186_3_ + random.nextFloat());
        double d3 = (double)((float)p_150186_4_ + random.nextFloat());

        if (l == 0 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_ + 1, p_150186_4_).isOpaqueCube()) //Сторона на которой
        {                                                                                       //Спавнятся партикли.
            d2 = (double)(p_150186_3_ + 1) + d0;
        }

        if (l == 1 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_ - 1, p_150186_4_).isOpaqueCube())
        {
            d2 = (double)(p_150186_3_ + 0) - d0;
        }
        if (d1 < (double)p_150186_2_ || d1 > (double)(p_150186_2_ + 1) || d2 < 0.0D || d2 > (double)(p_150186_3_ + 1) || d3 < (double)p_150186_4_ || d3 > (double)(p_150186_4_ + 1))
        {
            p_150186_1_.spawnParticle("flame", d1, d2, d3, 0.0D, 0.0D, 0.0D); //Спавн частиц огня "flame".
            p_150186_1_.spawnParticle("smoke", d1, d2, d3, 0.0D, 0.0D, 0.0D); //Спавн частиц дыма "smoke".
        }
    }
 }
}
 
Сверху