ОГРОМНЫЙ ВЗРЫВ

Статус
В этой теме нельзя размещать новые ответы.
Версия Minecraft
1.12.1
API
Forge

sk9zist :l

Исправился
981
18
158
Здравствуй! Требуется создать большой взрыв createExplosion, чтобы близлежайшие блоки не были разрушены. Так как это можно сделать? Было сделано вот так, но оно не работало (много тем было перечитано):
Java:
((EntityPlayerMP)playerIn).connection.sendPacket(new SPacketExplosion(explosion.getPosition().x, explosion.getPosition().y, explosion.getPosition().z, 14.0F, explosion.getAffectedBlockPositions(), (Vec3d)explosion.getPosition()));

По-моему тогда был краш. Но я думаю что это изначально неправильный выбор. Ещё был создан свой метод спавна сферы как у взрыва и была попытка скопировать метод взрыва (типа doExplosionA, doExplosionB()) но оно тоже не сработало.

Буду признателен, если поможете.
 
Последнее редактирование:
Почему бы просто не заспавнить частицы взрыва вместе со звуком?
Я как раз таки это сейчас и пытаюсь провернуть) Но делаю какую-то дичь, агравэйн скажет тоже самое.
 
Не знаю, зачем держать в курсе о проблеме весь форум. Ведь тестировать никто не запрещает. Пиши, только если ты попробовал всё, прогуглил весь интернет и у тебя нет больше решений.
много тем было перечитано
Не все значит. Раз Два Три
 
Последнее редактирование:
Java:
public void createExplosion(World worldIn, int size, Entity target)
    {
        worldIn.playSound((EntityPlayer)null, target.posX, target.posY, target.posZ, SoundEvents.ENTITY_GENERIC_EXPLODE, SoundCategory.BLOCKS, 4.0F, (1.0F + (worldIn.rand.nextFloat() - worldIn.rand.nextFloat()) * 0.2F) * 0.7F);

        if (size >= 2.0F)
        {
            worldIn.spawnParticle(EnumParticleTypes.EXPLOSION_HUGE, target.posX, target.posY, target.posZ, 1.0D, 0.0D, 0.0D);
        }
        else
        {
            worldIn.spawnParticle(EnumParticleTypes.EXPLOSION_LARGE, target.posX, target.posY, target.posZ, 1.0D, 0.0D, 0.0D);
        }
       
        Explosion explosion = new Explosion(worldIn, target, target.posX, target.posY, target.posZ, 6, false, true);
       
        int pX = (int) target.posX;
        int pY = (int) target.posY;
        int pZ = (int) target.posZ;
        int radii = size;
        for (int x = -radii; x < radii; x++)
          for (int y = -radii; y < radii; y++)
            for (int z = -radii; z < radii; z++) {
              int tx = x+pX;
              int ty = y+pY;
              int tz = z+pZ;
              if(new BlockPos(tx, ty, tz).distanceSqToCenter(pX, pY, pZ)<radii) {
                  explosion.getAffectedBlockPositions().add(new BlockPos(tx, ty, tz));
              }
        }
        explosion.doExplosionB(true);
    }
Данный код делает частицы взрыва :)(y)

А под спойлером вы найдёте первую версию, я делал по совету @CKATEPTb, просто спавня партиклы без всяких методов взрыва:
код рабочий, не волнуйтесь:
public void createExplose(World worldIn, int size, Entity target)
    {
        int pX = (int) target.posX;
        int pY = (int) target.posY;
        int pZ = (int) target.posZ;
        int radii = size;
        for (int x = -radii; x < radii; x++)
          for (int y = -radii; y < radii; y++)
            for (int z = -radii; z < radii; z++) {
              int tx = x+pX;
              int ty = y+pY;
              int tz = z+pZ;
              if(new BlockPos(tx, ty, tz).distanceSqToCenter(pX, pY, pZ)<radii) {
                  double d0 = (double)((float)new BlockPos(tx, ty, tz).getX() + worldIn.rand.nextFloat());
                  double d1 = (double)((float)new BlockPos(tx, ty, tz).getY() + worldIn.rand.nextFloat());
                  double d2 = (double)((float)new BlockPos(tx, ty, tz).getZ() + worldIn.rand.nextFloat());
                  double d3 = d0 - pX;
                  double d4 = d1 - pY;
                  double d5 = d2 - pZ;
                  double d6 = (double)MathHelper.sqrt(d3 * d3 + d4 * d4 + d5 * d5);
                  d3 = d3 / d6;
                  d4 = d4 / d6;
                  d5 = d5 / d6;
                  double d7 = 0.5D / (d6 / (double)4 + 0.1D);
                  d7 = d7 * (double)(worldIn.rand.nextFloat() * worldIn.rand.nextFloat() + 0.3F);
                  d3 = d3 * d7;
                  d4 = d4 * d7;
                  d5 = d5 * d7;
                  worldIn.spawnParticle(EnumParticleTypes.EXPLOSION_NORMAL, (d0 + pX) / 2.0D, (d1 + pY) / 2.0D, (d2 + pZ) / 2.0D, d3, d4, d5);
                  worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0, d1, d2, d3, d4, d5);
              }
        }
    }
 
Довёл до совершенства:
Java:
public void createExplosion(@Nullable Entity target, World worldIn, int size)
{
    Explosion explosion = new Explosion(worldIn, target, target.posX, target.posY, target.posZ, 6, false, true);
  
    int pX = (int) target.posX;
    int pY = (int) target.posY-1;
    int pZ = (int) target.posZ;
    int radii = size;
    for (int x = -radii; x < radii; x++)
      for (int y = -radii; y < radii; y++)
        for (int z = -radii; z < radii; z++) {
          int tx = x+pX;
          int ty = y+pY;
          int tz = z+pZ;
          if(new BlockPos(tx, ty, tz).distanceSqToCenter(pX, pY, pZ)<radii)
          {
              if(worldIn.getBlockState(new BlockPos(tx, ty, tz)).getMaterial() == Material.AIR)
              {
                  set.add(new BlockPos(tx, ty, tz));
              }
          }
    }
    explosion.getAffectedBlockPositions().addAll(set);
    explosion.doExplosionB(true);
}
Спасибо всем, в том числе @tox1cozZ, думаю это много кому пригодиться!)
 
Последнее редактирование модератором:
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху