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

Статус
Закрыто для дальнейших ответов.

Lisenochek

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

Как это можно пофиксить?
JavaScript:
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);
    }
}
 
Я не про воздух, а про блок твоей шашки.
Ты его в таймере не проверяешь.
А лучше бы ты стопил таймер, а то у тебя будут висеть таймеры, которые уже отработали свое.
Вот здесь стопай таймер.
if(r.nextInt(1000)<=1){...}
 
Я не про воздух, а про блок твоей шашки.
Ты его в таймере не проверяешь.
А лучше бы ты стопил таймер, а то у тебя будут висеть таймеры, которые уже отработали свое.
Вот здесь стопай таймер.
if(r.nextInt(1000)<=1){...}
Так я не могу стопнуть внутри таймера, можно было бы конечно сделать поле и присваивать ему значение, но если шашек несколько, то все перестают работать, как одна из них отработало свое.
 
Так я не могу стопнуть внутри таймера, можно было бы конечно сделать поле и присваивать ему значение, но если шашек несколько, то все перестают работать, как одна из них отработало свое.
cancel(); стопнет
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх