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

Помогите Особенности блока (ТНТ)

Discussion in 'Разработка плагинов для новичков' started by BeYkeR, Mar 11, 2013.

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

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

    Trophy Points:
    173
    Как дать ТНТ (блоку) особенность радиуса взрыва ?(Отличие между обычным ТНТ и этим)
    Типо:
    C4 радиус взрыва 3 блока
    TNT(Обычный) радиус 8 блоков
    и т.д.(При этом используется один блок - ТНТ)
     
  2. Хостинг MineCraft
    <
  3. Автор темы
    BeYkeR

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

    Trophy Points:
    173
    Пытался, не получилось(Или я криворукий)
     
  4. Jampire

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

    Trophy Points:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    BeYkeR likes this.
  5. Автор темы
    BeYkeR

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

    Trophy Points:
    173
    Спасибо ,уже немного понял, тогда как "Прикрутить" к скрафченному блоку динамита?(Recept)
     
  6. Jampire

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

    Trophy Points:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    TNTPrimed tnt = ((TNTPrimed) Entity динамита).setYield(100500);
    А к блоку - даже не знаю. Ибо блок он и в африке блок..
     
  7. Jampire

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

    Trophy Points:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Можно дать блоку динамита data равное силе его взрыва, а в событии взрыва определять дату динамита и менять силу. Или использовать в итем мете тег Lore.
    Вариантов много, выбери лучший.
     
    BeYkeR likes this.
  8. Автор темы
    BeYkeR

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

    Trophy Points:
    173
    А какой "по-твоему" Самый оптимальный код ?(Извини если много спрашиваю)
     
    Vedroyder and Black-UK-Lord like this.
  9. Jampire

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

    Trophy Points:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Можно записать в Lore "Блок динамита имеет силу взрыва 100"
    а потом извлечь из строки только цифры.
     
    BeYkeR likes this.
  10. Автор темы
    BeYkeR

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

    Trophy Points:
    173
    и как я понял, через NBTTagCompound ?
     
  11. Den_Abr

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

    Trophy Points:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Кстати, а можно ли удалить активированный динамит?
     
  12. Автор темы
    BeYkeR

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

    Trophy Points:
    173
    Вероятно нет
     
  13. Den_Abr

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

    Trophy Points:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Вроде есть сущность TNTPrimed, только мне интересно, можно ли с ней взаимодействовать(пкм)?
     
  14. Автор темы
    BeYkeR

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

    Trophy Points:
    173
    Такой код подойдет ?
    Code:
                        final Location loc = event.getEntity().getLocation();
                        final TNTPrimed tnt = loc.getWorld().spawn(loc, TNTPrimed.class);
                        tnt.setFuseTicks(40);
                        tnt.setYield(0);
     
  15. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Trophy Points:
    153
    Skype:
    dpohvar
    Удалить tntprimed можно.
    Взаимодействовать пкм с ним тоже можно
    А вот создать блок динамита с кастомным data нельзя. Во всяком случае через API. Вероятно можно через рефлексии или CB api.
    Конечно простейший способ - запись силы взрыва в Lore (а можно и в скрытый тег), При установке блока будет ставиться сразу TNTPrimed. Время до взрыва по умолчанию 4 секунды, если поставить больше - через 4 сек. визуально динамит исчезает и с ним нельзя взаимодействовать.
     
    BeYkeR likes this.
  16. Автор темы
    BeYkeR

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

    Trophy Points:
    173
    Тогда как писать через Lore (Впервые вижу :D)
     
  17. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Trophy Points:
    153
    Skype:
    dpohvar
    Если не ошибаюсь - нужно взять getItemMeta(), там Lore представлен как массив строк. В любую из строк надо записать силу взрыва, она будет отображаться как описание предмета, под названием.

    Хандлер:
    При установке блока тнт(и если событие не отменено) - считываем из предмета Lore, если он есть - читаем нужную строчку, затем парсим значение. Дальше нужно отменить событие, на месте блока заспавнить TNTPrimed, установить силу взрыва.
    ПС: событие нужно ожидать с самым низким приоритетом, чтобы не было конфликтов с WorldGuard.
     
  18. Автор темы
    BeYkeR

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

    Trophy Points:
    173
    Примерно так ?
    Code:
            ItemStack poison_TNT = new ItemStack(Material.TNT, 1);
              ItemMeta im = poison_TNT.getItemMeta();
            ArrayList poison_TNT_lore = new ArrayList();
            poison_TNT_lore.add("5");
            im.setLore(poison_TNT_lore);
            im.setDisplayName("Poison TNT");
            poison_TNT.setItemMeta(im);
            ShapedRecipe craft = new ShapedRecipe(poison_TNT); 
            craft.shape(new String[] { "AAA", "AAA", "AAA" });
            craft.setIngredient('A', Material.getMaterial(46));
            getServer().addRecipe(craft);
            final Location loc = event.getEntity().getLocation();
            final TNTPrimed tnt = loc.getWorld().spawn(loc, TNTPrimed.class);
            tnt.setFuseTicks(20);
            tnt.setYield(4);
     
    ql_Nik_lp likes this.
  19. Jampire

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

    Trophy Points:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    На будущее для информации - не советую отменять событие установки блока с измененной метой. Краш всех кто это увидит обеспечен.
     
  20. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Trophy Points:
    153
    Skype:
    dpohvar
    Строчки верные, но:
    * Рецепт нужно создавать единожды при загрузке плагина, а спавнить тнт - при использовании предмета.
    * В момент, когда считываем мету, должны быть проверки на null или лучше код в блоке try.
    * Если нужен просто один новый блок динамита, можно не париться с Lore, а просто проверять название.
     
    BeYkeR likes this.
  21. Автор темы
    BeYkeR

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

    Trophy Points:
    173
    Теперь сойдет ?
    Code:
    public class MoreBombs extends JavaPlugin implements Listener {
     
        public static final Logger _log = Logger.getLogger("Minecraft");
     
        public void onEnable() {
            _log.info("[MoreBombs] Started! ");
     
            ItemStack poison_TNT = new ItemStack(Material.TNT, 1);
              ItemMeta im = poison_TNT.getItemMeta();
            ArrayList poison_TNT_lore = new ArrayList();
            poison_TNT_lore.add("5");
            im.setLore(poison_TNT_lore);
            im.setDisplayName("Poison TNT");
            poison_TNT.setItemMeta(im);
            ShapedRecipe craft = new ShapedRecipe(poison_TNT);
            craft.shape(new String[] { "AAA", "AAA", "AAA" });
            craft.setIngredient('A', Material.getMaterial(46));
            getServer().addRecipe(craft);
     
            ItemStack TNTNuke = new ItemStack(Material.TNT, 1);
              ItemMeta im1 = TNTNuke.getItemMeta();
            ArrayList TNT_Nuke_lore = new ArrayList();
            TNT_Nuke_lore.add("8");
            im1.setLore(TNT_Nuke_lore);
            im1.setDisplayName("DevTNT");
            TNTNuke.setItemMeta(im1);
            ShapedRecipe craft2 = new ShapedRecipe(TNTNuke);
            craft2.shape(new String[] { "AAB", "AAB", "BBB" });
            craft2.setIngredient('A', Material.getMaterial(46), 64);
            getServer().addRecipe(craft2);
     
            Bukkit.getPluginManager().registerEvents(this, this);
          }
     
     
    @EventHandler(priority = EventPriority.NORMAL)
    public void onBlockPlace(BlockPlaceEvent event) {
        if(event.getBlock().getType() == Material.TNT)
        {
            {
                Location toSpawn = event.getBlock().getLocation();
                event.getBlock().setType(Material.AIR);
                TNTPrimed tnt = toSpawn.getWorld().spawn(toSpawn, TNTPrimed.class);
                int TNTNuke_lore = 15;
                tnt.setFuseTicks(TNTNuke_lore);
                tnt.setYield(15);
            }
        }
    }
    }
    А про 2 и 3 не слышал(Недавно начал)
    Еще:Можно ли брать значение из конфига ?
     

Share This Page