[1.7.10] Самодельный взрыв

Здравствуйте.
Первичная задумка - сделать взрыв без звука (или с кастомным звуком).
Посмотрев, что делает метод World.createExplosion, докопался до класса Explosion.java, где нашел методы doExplosionA() и doExplosionB. Первый помечает блоки, которые должны уничтожиться. Второй убирает эти блоки, спаунит частицы и проигрывает звук взрыва.
Написал код:
Код:
    private void makeMyExplosion(World world, EntityPlayer entity, double posX, double posY, double posZ, boolean destroyBlocks){
        Explosion explosion = new Explosion(world,entity,posX,posY,posZ,5.0f);
        if (net.minecraftforge.event.ForgeEventFactory.onExplosionStart(world, explosion)) return;
        if (destroyBlocks) {
            explosion.doExplosionA();
            Iterator iterator = explosion.affectedBlockPositions.iterator();
            while (iterator.hasNext()) {
                ChunkPosition chunkPosition = (ChunkPosition) iterator.next();
                int x = chunkPosition.chunkPosX;
                int y = chunkPosition.chunkPosY;
                int z = chunkPosition.chunkPosZ;
                world.setBlockToAir(x, y, z);
                world.markBlockForUpdate(x, y, z);
            }
        }
//        explosion.doExplosionB(true);
        boolean spawnParticles = true;
        if (spawnParticles) {
            if (explosion.explosionSize >= 2.0F) {
                world.spawnParticle("hugeexplosion", posX, posY, posZ, 1.0D, 0.0D, 0.0D);
            } else {
                world.spawnParticle("largeexplode", posX, posY, posZ, 1.0D, 0.0D, 0.0D);
            }
        }
    }
Потом в айтеме вызываю его:
Код:
    @Override
    public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
        if (!world.isRemote) {
                makeMyExplosion(world,player,player.posX,player.posY,player.posZ, true); // координаты взял для примера
        }
    }
Проблема: не спаунятся партиклы. Знаю, что их надо спаунить только на клиенте. Но ведь метод doExplosionB вызывается на сервере и партиклы видно.
Как решать?
 
world.spawnParticle - хитрожопый метод, который работает на обеих сторонах, на клиенте он спавнит, а на сервере отправляет пакет спавна клиентам.
 
Dragon2488 написал(а):
world.spawnParticle - хитрожопый метод, который работает на обеих сторонах, на клиенте он спавнит, а на сервере отправляет пакет спавна клиентам.
Почему тогда в моём случае не отправляет? Я же его вызываю.
Код:
    @Override
    public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
        if (!world.isRemote) {
           world.spawnParticle("hugeexplosion", player.posX,player.posY,player.posZ, 1.0D, 0.0D, 0.0D);
        }
        return stack;
    }
Даже так не работает.
 
А я не вижу, чтобы ты слал пакеты.
У меня так:
Код:
public static Explosion createCustomExplosion(World world, Entity exploder, double x, double y, double z, float explosionSize, float dropChance, boolean isFlaming, boolean isSmoking){
        CustomExplosion explosion = new CustomExplosion(world, exploder, x, y, z, explosionSize, dropChance);
        explosion.isFlaming = isFlaming;
        explosion.isSmoking = isSmoking;
        explosion.doExplosionA();
        explosion.doExplosionB(false);
        if(!isSmoking){
            explosion.affectedBlockPositions.clear();
        }
        Iterator iterator = world.playerEntities.iterator();
        while(iterator.hasNext()){
            EntityPlayer player = (EntityPlayer)iterator.next();
            if(player.getDistanceSq(x, y, z) < 4096.0D){
                ((EntityPlayerMP)player).playerNetServerHandler.sendPacket(new S27PacketExplosion(x, y, z, explosionSize, explosion.affectedBlockPositions, (Vec3)explosion.func_77277_b().get(player)));
            }
        }
        return explosion;
    }
 
Agravaine написал(а):
я так пробовал.
пишет - there is no default constructor available in net.minecraft.world.Explosion
всё, понял. У наследованного класса в конструкторе надо super() вызывать. Но, всё-равно, переменная worldObj недоступна. Пришлось пакеты отсылать. Только отсылает он их с большими задержками.
 
Извините, что не в своей теме пишу, но вопрос подходит по смыслу.
Хочу добавить блоку возможность взрываться, однако метод createExplosion работает только с Entity.
А если у меня TileEntity, как с этим поступать?

Код:
this.worldObj.createExplosion(???, (double)this.xCoord, (double)this.yCoord, (double)this.zCoord, 4.0F, true);
 
Назад
Сверху