Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Сломать блок в радиусе

JustBlender

Старожил
Девелопер
Пользователь
Баллы
123
Имя в Minecraft
JustBlender
Всем привет, при создании плагина, мне понадобилось создать оружие и чтобы оно стреляло яйца (готово!), но мне надо, чтобы при ProjectileHitEvent, когда яйцо разобьется, в радиусе 3 блоков сломать все (тобишь сломать все эти блоки). Проблема состоит в том, что я не могу сделать определенный радиус.
 
Тут с Array, незнаю, попробуем. (Хотя врятли)
Ну тогда попробуй так:
PHP:
int radius = 5;
for (int x = -centerX; x < centerX; x++)
for (int y = -centerY; x < centerY; y++)
for (int z = -centerZ; x < centerZ; z++)
Block blocks = world.getBlockAt(x,y,z);
blocks.breakNaturallity();
//Ну или...
blocks.setType(Material.AIR);
P.S. Работоспособность не гарантирую.
 
Ну тогда попробуй так:
PHP:
int radius = 5;
for (int x = -centerX; x < centerX; x++)
for (int y = -centerY; x < centerY; y++)
for (int z = -centerZ; x < centerZ; z++)
Block blocks = world.getBlockAt(x,y,z);
blocks.breakNaturallity();
//Ну или...
blocks.setType(Material.AIR);
P.S. Работоспособность не гарантирую.
Хм... Эклипс выдает ошибку.
Код:
                    if(e.getEntityType() == EntityType.EGG){
                        BlockIterator iterator = new BlockIterator(e.getEntity().getWorld(), e.getEntity().getLocation().toVector(), e.getEntity().getVelocity().normalize(), 0.0D, 4);
                        Block hitBlock = null;
                        while (iterator.hasNext()) {
                            hitBlock = iterator.next();
                           
                            if (hitBlock.getTypeId() != 0) {
                            break;
                            }
                            }
                            if (hitBlock.getType() == Material.TNT) {
                                hitBlock.getWorld().playEffect(hitBlock.getLocation(), Effect.STEP_SOUND, hitBlock.getTypeId());
                                hitBlock.getWorld().createExplosion(e.getEntity().getLocation().getX(), e.getEntity().getLocation().getY(),e.getEntity().getLocation().getZ(), 3F, false, true);
                                Location en2 = e.getEntity().getLocation();
                                PlayEffect.play(VisualEffect.EXPLOSION, en2, "offset:0.5 num:20");
                            }else
                                hitBlock.getWorld().playEffect(hitBlock.getLocation(), Effect.STEP_SOUND, hitBlock.getTypeId());
                                hitBlock.setType(Material.AIR); //здесь мне надо добавить радиус.
                                Location en = e.getEntity().getLocation();
                                PlayEffect.play(VisualEffect.SPELL, en, "num:60 offset:0.3");
                                PlayEffect.play(VisualEffect.EXPLOSION, en, "offset:0.2 num:10");
                                PlayEffect.play(VisualEffect.SOUND, en, "type:ANVIL_LAND volume:1 pitch:1");
 
Хм... Эклипс выдает ошибку.
Код:
                    if(e.getEntityType() == EntityType.EGG){
                        BlockIterator iterator = new BlockIterator(e.getEntity().getWorld(), e.getEntity().getLocation().toVector(), e.getEntity().getVelocity().normalize(), 0.0D, 4);
                        Block hitBlock = null;
                        while (iterator.hasNext()) {
                            hitBlock = iterator.next();
                         
                            if (hitBlock.getTypeId() != 0) {
                            break;
                            }
                            }
                            if (hitBlock.getType() == Material.TNT) {
                                hitBlock.getWorld().playEffect(hitBlock.getLocation(), Effect.STEP_SOUND, hitBlock.getTypeId());
                                hitBlock.getWorld().createExplosion(e.getEntity().getLocation().getX(), e.getEntity().getLocation().getY(),e.getEntity().getLocation().getZ(), 3F, false, true);
                                Location en2 = e.getEntity().getLocation();
                                PlayEffect.play(VisualEffect.EXPLOSION, en2, "offset:0.5 num:20");
                            }else
                                hitBlock.getWorld().playEffect(hitBlock.getLocation(), Effect.STEP_SOUND, hitBlock.getTypeId());
                                hitBlock.setType(Material.AIR); //здесь мне надо добавить радиус.
                                Location en = e.getEntity().getLocation();
                                PlayEffect.play(VisualEffect.SPELL, en, "num:60 offset:0.3");
                                PlayEffect.play(VisualEffect.EXPLOSION, en, "offset:0.2 num:10");
                                PlayEffect.play(VisualEffect.SOUND, en, "type:ANVIL_LAND volume:1 pitch:1");
Какую ? с center* ?
 
Совершенно верно. Даже не только тут, но и с
Block hitBlock = world.getBlockAt(x,y,z);
Ну тогда:
PHP:
int centerX = hitBlock.getLocation().getBlockX(); //или .getX()
int centerY = hitBlock.getLocation().getBlockY(); //или .getY()
int centerZ = hitBlock.getLocation().getBlockZ(); //или .getZ()

//А дальше код сверху...

Работоспособность так же не гарантирую. (Нет возможности проверить, сижу с телефона)
 
Ну тогда:
PHP:
int centerX = hitBlock.getLocation().getBlockX();
int centerY = hitBlock.getLocation().getBlockY();
int centerZ = hitBlock.getLocation().getBlockZ();

//А дальше код сверху...

Работоспособность так же не гарантирую. (Нет возможности проверить, сижу с телефона)
Если с телефона кодишь - суровый мужик. :)

PS. Ошибки остальные пропали, но осталась последняя строчка с Block hitBlock = world.getBlockAt(x,y,z);
 
Если с телефона кодишь - суровый мужик. :)

PS. Ошибки остальные пропали, но осталась последняя строчка с Block hitBlock = world.getBlockAt(x,y,z);

Тогда предположительно так:
PHP:
hitBlock.getWorld().playEffect(hitBlock.getLocation(), Effect.STEP_SOUND, hitBlock.getTypeId());

int centerX = hitBlock.getLocation().getBlockX();
int centerY = hitBlock.getLocation().getBlockY();
int centerZ = hitBlock.getLocation().getBlockZ();

int radius = 5;//Здесь типо твой радиус

for (int x = -centerX; x < centerX; x++){
for (int y = -centerY; x < centerY; y++){
for (int z = -centerZ; x < centerZ; z++){
//hitBlock.setType(Material.AIR); - Это теперь вроде не обязательно.
Block blocks = world.getBlockAt(x,y,z);
blocks.setType(Material.AIR);
}
}
}

Location en = e.getEntity().getLocation();
PlayEffect.play(VisualEffect.SPELL, en, "num:60 offset:0.3");
PlayEffect.play(VisualEffect.EXPLOSION, en, "offset:0.2 num:10");
PlayEffect.play(VisualEffect.SOUND, en, "type:ANVIL_LAND volume:1 pitch:1");
 
Код:
    @EventHandler
    public void onProjectileHit(ProjectileHitEvent event) {
    Entity entity = event.getEntity();
   
    if (entity instanceof Egg) {
        BlockIterator iterator = new BlockIterator(entity.getWorld(), entity.getLocation().toVector(), entity.getVelocity().normalize(), 0, 4);
        Block hitBlock = null;
   
        while(iterator.hasNext()) {
            hitBlock = iterator.next();
            if(hitBlock.getType() != Material.AIR) {
                hitBlock.breakNaturally();
                hitBlock.getLocation().getBlock().getRelative(1, 0, 0).breakNaturally();
                hitBlock.getLocation().getBlock().getRelative(0, 0, 1).breakNaturally();
                hitBlock.getLocation().getBlock().getRelative(1, 0, 1).breakNaturally();
                //В прочем, дальше сам сделаешь, куда тебе надо, мне лень ;p
            }
        }
   
        entity.remove();
        }
        }
 
Вот и очутилось ведро, все прекрасно, без ошибок (но радиус пишет, что он не используется)
Тогда предположительно так:
PHP:
hitBlock.getWorld().playEffect(hitBlock.getLocation(), Effect.STEP_SOUND, hitBlock.getTypeId());

int centerX = hitBlock.getLocation().getBlockX();
int centerY = hitBlock.getLocation().getBlockY();
int centerZ = hitBlock.getLocation().getBlockZ();

int radius = 5;//Здесь типо твой радиус

for (int x = -centerX; x < centerX; x++){
for (int y = -centerY; x < centerY; y++){
for (int z = -centerZ; x < centerZ; z++){
//hitBlock.setType(Material.AIR); - Это теперь вроде не обязательно.
Block blocks = world.getBlockAt(x,y,z);
blocks.setType(Material.AIR);
}
}
}

Location en = e.getEntity().getLocation();
PlayEffect.play(VisualEffect.SPELL, en, "num:60 offset:0.3");
PlayEffect.play(VisualEffect.EXPLOSION, en, "offset:0.2 num:10");
PlayEffect.play(VisualEffect.SOUND, en, "type:ANVIL_LAND volume:1 pitch:1");
 
Код:
                Location loc = e.getPlayer().getLocation();//Или же радиус твоего Entity
                int r = 5; //РАДИУС
                for(int x = (r * -1); x <= r; x++) {
                    for(int y = (r * -1); y <= r; y++) {
                        for(int z = (r * -1); z <= r; z++) {
                            Block b = loc.getWorld().getBlockAt(loc.getBlockX() + x, loc.getBlockY() + y, loc.getBlockZ() + z);
                            b.breakNaturally();
                        }
                    }
                }
 

Поделиться этой страницей

Назад
Верх