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

Помогите Баг с таймером

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

Статус темы:
Закрыта.
  1. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Всем привет! Сделал сигнальные шашки, которые должны дымиться и дропать ящики, но беда в том, что если на место шашки поставить любой блок, то дым опять пойдет и ящик заспавнится, при этом блок исчезнет и так по новой.

    Как это можно пофиксить?
    Код:
    package ru.lisenochek.fgmrealistic.listeners;
    
    import org.bukkit.Material;
    import org.bukkit.block.Block;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.BlockPlaceEvent;
    import org.bukkit.scheduler.BukkitRunnable;
    import ru.lisenochek.fgmrealistic.API;
    import ru.lisenochek.fgmrealistic.MainConfig;
    import ru.lisenochek.fgmrealistic.crate.CrateList;
    import ru.lisenochek.fgmrealistic.lists.ListItems;
    import ru.lisenochek.fgmrealistic.utils.C;
    import ru.lisenochek.fgmrealistic.utils.ParticleEffect;
    
    import java.util.Random;
    
    public class PlaceSignalListener implements Listener {
    
        private static Random r = new Random();
    
        @EventHandler
        public void placeSignal(BlockPlaceEvent e) {
    
            Player p = e.getPlayer();
    
            if (p.getWorld().getName().equalsIgnoreCase("Realistic_nether") || p.getWorld().getName().equalsIgnoreCase("Realistic_the_end")) {
                p.sendMessage(C.getPrefix() + C.c("&cЯ в другом мире, не могу поставить шашку."));
                e.setCancelled(true);
                return;
            }
    
            if (!MainConfig.wlWorlds.contains(p.getWorld())) return;
            if (e.getBlockPlaced().getType() != Material.REDSTONE_TORCH_ON) return;
            if (!p.getItemInHand().hasItemMeta()) return;
            if (!p.getItemInHand().getItemMeta().hasDisplayName()) return;
            if (p.getItemInHand().getItemMeta().getDisplayName().equalsIgnoreCase(ListItems.commonSignal.getItemMeta().getDisplayName())) spawnCrate(p, e.getBlockPlaced(), "common");
            if (p.getItemInHand().getItemMeta().getDisplayName().equalsIgnoreCase(ListItems.strangeSignal.getItemMeta().getDisplayName())) spawnCrate(p, e.getBlockPlaced(), "strange");
        }
    
        public void spawnCrate(Player p, Block b, String name) {
    
            BukkitRunnable run = new BukkitRunnable() {
    
                @Override
                public void run() {
    
                    if (b.getType() == Material.AIR) return;
    
                    ParticleEffect.SMOKE_LARGE.display(0, 2, 0, 0, 5, b.getLocation().add(0.5, 3, 0.5), 200);
    
                    if (r.nextInt(1000) <= 1) {
    
                        if (name.equalsIgnoreCase("common")) CrateList.getCommonCrate(p);
                        if (name.equalsIgnoreCase("strange")) CrateList.getStrangeCrate(b.getLocation());
    
                        b.setType(Material.AIR);
                    }
                }
            };
            run.runTaskTimer(API.getInstance(), 5, 0);
        }
    }
    
     
  2. Хостинг MineCraft
    <
  3. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Ну так проверяй на тип блока.
     
  4. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Ну так он есть!
     
  5. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Я не про воздух, а про блок твоей шашки.[DOUBLEPOST=1485520957,1485520880][/DOUBLEPOST]Ты его в таймере не проверяешь.[DOUBLEPOST=1485521066][/DOUBLEPOST]А лучше бы ты стопил таймер, а то у тебя будут висеть таймеры, которые уже отработали свое.[DOUBLEPOST=1485521145][/DOUBLEPOST]Вот здесь стопай таймер.
    if(r.nextInt(1000)<=1){...}
     
  6. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Так я не могу стопнуть внутри таймера, можно было бы конечно сделать поле и присваивать ему значение, но если шашек несколько, то все перестают работать, как одна из них отработало свое.
     
  7. Blc_Dragon

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    cancel(); стопнет
     
  8. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Спасибо, не увидел этот метод :)

    Проблема исчерпана, все работает, крою тему.
     
Статус темы:
Закрыта.

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