"Wait 1 seconds" Nasıl ekleyebiliriz?

MrPoteyto

Is the excellence? Ok..
En iyi cevaplar
0
Herkese merhabalar.
Yine bir amatör olarak kodladığım eklenti konusunda yardıma ihtiyacım var ve konumuzu daha da uzatmadan hemen geçeceğim.
Şimdi PhysicalEffects diye bir eklenti kodlamış bulunmaktayım ve bu eklenti sayesinde, belirlenen bloklara kırıldığı zaman çıkacak bir
particle effect ekleyebilirsiniz ancak şöyle bir daha eklemek istemekteyim ben: Bloğu kırınca çıkan efektin 5 tane ve 1 saniye aralıkla çıkması gerekiyor ve bunun içinde bir for döngüsüne ihtiyacım var. Ancak, bunda 1 saniye bekleme olmassa hepsi aynı anda çıkıyor ve bu da birkaç saniye lag oluşturuyor. Şimdi benim sorunum bu "wait 1 seconds" ı nasıl ekleyebiliriz?
Daha eklenti kodlama seviyesinde amatör olduğum için ne yaparsam yapıyım çözemiyorum ve buraya da belki bilenleriniz bana nasıl çözebileceğimi anlatabilir diye gelmiş bulunmaktayım.
İşte eklentinin kodları:
Kod:
package me.minedream.physicale;

import org.bukkit.Bukkit;
import org.bukkit.Effect;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
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.BlockBreakEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class Peffects extends JavaPlugin implements Listener{
 
    public void onEnable() {
        Bukkit.getServer().getPluginManager().registerEvents(this, this);
        getLogger().info("Eklenti aktif! " + getDescription().getVersion());
    }
    public void onDisable() {
        getLogger().info("Eklenti kapanıyor...");
    }
    @EventHandler
    public void blokKirinca(BlockBreakEvent e) throws InterruptedException {
        Player o = e.getPlayer();
        Block b = e.getBlock();
        Location loc = b.getLocation();
        Material m = b.getType();
        World world = o.getWorld();
        if(m == Material.GLASS) {
            for(int x = 0; x < 5; x++) {
                // İşte burada 1 saniye bekleyeceğiz
                world.playEffect(loc, Effect.HEART, 0);
            }
        }
    }

}
 

MegaCrafter

Obsidyen Madencisi
En iyi cevaplar
0
Bekleme olayını normalde alttaki kod ile yaparsın:
Kod:
Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> {
    // Buraya yazdığın kod altta belirttiğin kadar saniye sonra çalışacak..
}, saniye * 20L);
Ama senin durumunda bunlardan 5 tane iç içe yazmak pek mantıklı değil. Bunun için normal Java'nın sunduğu Timer'ı kullanabilirsin. (Tabii ki repeatingtask de olabilirdi ama repeatingtask kendi içinde kapatılamıyor. İşlem yapmamasını sağlasan bile öylece durması bence iyi değil.)

Timer'ı kullanmak için önce aşağıdaki import'u eklemen gerekli. (Timer için birkaç farklı import var, o yüzden bunu belirttim.)
Kod:
import java.util.Timer;
Sonra da aşağıdaki gibi bir kod yazarak 1 saniye aralıklarla 5 kere particle yapabilirsin ve sonra da bu Timer'ı tamamen kapatabilirsin.
Kod:
int counter = 0; // Bu sayı her particle yapışında 1 artacak. 5 olduğunda ise Timer'ı kapatıcaz.
int saniye1 = 1; // Bu, particle'lar başlamadan önceki beklemedir. Eğer bunu 0 yaparsan ilk particle hiç beklemeden başlar.
int saniye2 = 1; // Bu da particle'lar arasında geçen saniyedir. Mesela 1. particle ile 2. particle arasında bu kadar saniye geçecek.
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    public void run() {
        if (counter < 5) {
            // Particle kodu
            counter++;
        } else { // 5 kere particle yaptığımıza göre artık timer ile işimiz kalmadı.
            timer.cancel();
        }
    }
}, saniye1 * 1000, saniye2 * 1000);
Az önce 20L yazıp da burada 1000 yazmamızın sebebi, Bukkit'in saniyede 20 tane olan tick'e göre çalışmasından kaynaklı. Bu Timer milisaniyeye göre çalışıyor.

Bu kodları aklımdan yazdım yani isimlerde hata olabilir. Eğer hata olursa geri söylersen yardımcı olabilirim.
 

MrPoteyto

Is the excellence? Ok..
En iyi cevaplar
0
Bekleme olayını normalde alttaki kod ile yaparsın:
Kod:
Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> {
    // Buraya yazdığın kod altta belirttiğin kadar saniye sonra çalışacak..
}, saniye * 20L);
Ama senin durumunda bunlardan 5 tane iç içe yazmak pek mantıklı değil. Bunun için normal Java'nın sunduğu Timer'ı kullanabilirsin. (Tabii ki repeatingtask de olabilirdi ama repeatingtask kendi içinde kapatılamıyor. İşlem yapmamasını sağlasan bile öylece durması bence iyi değil.)

Timer'ı kullanmak için önce aşağıdaki import'u eklemen gerekli. (Timer için birkaç farklı import var, o yüzden bunu belirttim.)
Kod:
import java.util.Timer;
Sonra da aşağıdaki gibi bir kod yazarak 1 saniye aralıklarla 5 kere particle yapabilirsin ve sonra da bu Timer'ı tamamen kapatabilirsin.
Kod:
int counter = 0; // Bu sayı her particle yapışında 1 artacak. 5 olduğunda ise Timer'ı kapatıcaz.
int saniye1 = 1; // Bu, particle'lar başlamadan önceki beklemedir. Eğer bunu 0 yaparsan ilk particle hiç beklemeden başlar.
int saniye2 = 1; // Bu da particle'lar arasında geçen saniyedir. Mesela 1. particle ile 2. particle arasında bu kadar saniye geçecek.
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    public void run() {
        if (counter < 5) {
            // Particle kodu
            counter++;
        } else { // 5 kere particle yaptığımıza göre artık timer ile işimiz kalmadı.
            timer.cancel();
        }
    }
}, saniye1 * 1000, saniye2 * 1000);

Bu kodları aklımdan yazdım yani isimlerde hata olabilir. Eğer hata olursa geri söylersen yardımcı olabilirim.

Teşekkürler :)
 
Üst