Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем JustBlender, 29 янв 2014.

  1. Автор темы
    JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    Всем привет, при создании плагина, мне понадобилось создать оружие и чтобы оно стреляло яйца (готово!), но мне надо, чтобы при ProjectileHitEvent, когда яйцо разобьется, в радиусе 3 блоков сломать все (тобишь сломать все эти блоки). Проблема состоит в том, что я не могу сделать определенный радиус.
     
    BeLkA нравится это.
  2. Хостинг MineCraft
    <
  3. BeYkeR

    BeYkeR Старожил Девелопер Пользователь

    Баллы:
    173
  4. Автор темы
    JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    BeLkA нравится это.
  5. BeYkeR

    BeYkeR Старожил Девелопер Пользователь

    Баллы:
    173
    Ну тогда попробуй так:
    PHP:
    int radius 5;
    for (
    int x = -centerXcenterXx++)
    for (
    int y = -centerYcenterYy++)
    for (
    int z = -centerZcenterZz++)
    Block blocks world.getBlockAt(x,y,z);
    blocks.breakNaturallity();
    //Ну или...
    blocks.setType(Material.AIR);

    P.S. Работоспособность не гарантирую.
     
    ПриветОтЛайки нравится это.
  6. Автор темы
    JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    Хм... Эклипс выдает ошибку.
    Код:
                        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");
     
    BeLkA нравится это.
  7. BeYkeR

    BeYkeR Старожил Девелопер Пользователь

    Баллы:
    173
    Какую ? с center* ?
     
  8. Автор темы
    JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    Совершенно верно. Даже не только тут, но и с
    Block hitBlock = world.getBlockAt(x,y,z);
     
    BeLkA нравится это.
  9. BeYkeR

    BeYkeR Старожил Девелопер Пользователь

    Баллы:
    173
    Ну тогда:
    PHP:
    int centerX hitBlock.getLocation().getBlockX(); //или .getX()
    int centerY hitBlock.getLocation().getBlockY(); //или .getY()
    int centerZ hitBlock.getLocation().getBlockZ(); //или .getZ()

    //А дальше код сверху...
    Работоспособность так же не гарантирую. (Нет возможности проверить, сижу с телефона)
     
    ПриветОтЛайки нравится это.
  10. Автор темы
    JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    Если с телефона кодишь - суровый мужик. :)

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

    BeYkeR Старожил Девелопер Пользователь

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

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

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

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

    Location en e.getEntity().getLocation();
    PlayEffect.play(VisualEffect.SPELLen"num:60 offset:0.3");
    PlayEffect.play(VisualEffect.EXPLOSIONen"offset:0.2 num:10");
    PlayEffect.play(VisualEffect.SOUNDen"type:ANVIL_LAND volume:1 pitch:1");
     
  12. StealerSlain

    StealerSlain Активный участник Пользователь

    Баллы:
    88
    Имя в Minecraft:
    StealerSlain
    Код:
        @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();
            }
            }
     
  13. Автор темы
    JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    Вот и очутилось ведро, все прекрасно, без ошибок (но радиус пишет, что он не используется)
     
    BeLkA нравится это.
  14. BeYkeR

    BeYkeR Старожил Девелопер Пользователь

    Баллы:
    173
    Как писал md_5:
    попробуй сделать так же с -center* (Вместо минуса ставь плюс).
     
    ПриветОтЛайки нравится это.
  15. Hilgert

    Hilgert Старожил Пользователь

    Баллы:
    123
    Skype:
    mixa2258
    Имя в Minecraft:
    Hilgert
    Код:
                    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();
                            }
                        }
                    }
     

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