2016-04-09 23 views
3

Bir oyuncunun, ilk önce bir komutu çalıştırdıktan sonra elindeki bir kitapla sağ tıklatıp tıklattığını kontrol etmek istiyorum. Bir zamanlayıcı olarak çalışan Runnable'u yapmaya çalıştım ve bu zamanlayıcıda, oyuncunun elinde bir kitap sağ tıklayıp tıklamadığını kontrol ettim. Runnable, 'run' yöntemini geçersiz kılmam için beni zorladı.Zamanlanmış Olayı Etkinleştiren Olay İşleyicisi

Bu denedim budur: Oyuncunun komutunu çalıştırmanız durumunda amacıyla

@Override 
public void onEnable() { 

this.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable() { 

    @Override 
    public void run() { 
     //Here I want to check if the player right clicked with a book in their hand. 
    } 
} 
+0

Neden birden çok kez çalıştırılacak bir görev içinde bir olay dinleyicisi kaydetmek istiyorsunuz? Dinlemek istediğiniz her etkinlik için, bir dinleyicinin içinde sadece bir yöntem uygulamanız gerekir (bu yöntem etkinliğin her tetiklendiğinde çağrılır, yinelenen bir göreve gerek yoktur). –

+0

Bu komutu çalıştırıyorlarsa bir kitabın sağ tıklatılıp tıklanmadıklarını kontrol etmek istiyorum. –

+0

Bir kitabın sağ tıklamasına rağmen, bunun farklı bir şekilde yapılması gerekecek. Etkinlikler sadece bir kez kaydedilebilir. PlayerInteractEvent'i kaydettiririm ve bir oyuncu bir kitaba sağ tıklarsa, tıkladıkları zamanı ve isimlerini bir listeye ekler. Daha sonra, oyuncu komutu her çalıştırdığında, kitapla yakın zamanda tıklanmış olup olmadığını kontrol edebilirsiniz. –

cevap

1

bir yere oyuncunun UUID'sini saklamak zorunda bilmek. Her şeyden önce, komutu çalıştıran tüm oyuncuların tüm Unique ID'lerini geçici olarak saklayan bir Set<UUID> yaratırsınız, böylece bu sette saklanan bir oyuncu gördüğünüzde, komutu uyguladıklarını bilirsiniz. Bir UUID, her oyuncu için benzersiz olan ve her sunucuda aynı olan 36 karakterlik bir dizedir. Böyle Set olun:

final Set<UUID> players = new HashSet<>(); 

Sonraki size komutu yapmak gerekir. Böyle yapayım:

@Override 
public boolean onCommand(CommandSender sender, Command cmd, String cl, String[] args) { 
    //Check if your command was executed 
    if(cmd.getName().equalsIgnorecase("yourCommand")){ 
     //Check if the executor of the command is a player and not a commandblock or console 
     if(sender instanceof Player){ 

      Player player = (Player) sender; 

      //Add the player's unique ID to the set 
      players.add(player.getUniqueId()); 
     } 
    } 
} 

Şimdi ne yapacağım oyuncu kitabı tıkladığında PlayerInteractEvent görmek için dinlemek olduğunu. Oynatıcının Set’da olduğunu görürseniz, komutu uyguladıklarını biliyorsunuzdur. , Oyuncu komutu çalıştırıldığında

@EventHandler 
public void onInteract(PlayerInteractEvent event){ 
    //Check if the player right clicked. 
    if(event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK){ 
     //Check if the Set contains this player 
     if(players.contains(event.getPlayer().getUniqueId()){ 
      //Check if the player had an item in their hand 
      if(event.getPlayer().getItemInHand().getType() == Material.BOOK){ 
       //Remove player from the set so they have to execute the command again before right clicking the book again 
       players.remove(event.getPlayer().getUniqueId()); 
       //Here you can do whatever you want to do when the player executed the command and right clicks a book. 
      } 
     } 
    } 
} 

Yani ne yaptık olduğunu onlara Set saklamak: İşte EventHandler o olması nedeniyledir. Sonra PlayerInteractEvent'u dinleyin. Bu temelde, bir oyuncu her etkileşiminde çağrılan bir geri çağırma yöntemidir. Bir oyuncu oyuncu o Set saklanır eğer oyuncu sağ tıklandığında ise bir blokta veya havada bir oyuncu sağ veya sol tıklama o PlayerInteractEvent yılında

, ben, çek vs. zaman, bir pressureplate adımları bu olabilir Havada veya sağda bir blok tıkladıktan sonra oyuncunun elinde bir kitap olup olmadığını kontrol edin. Bu doğruysa, oyuncuyu Set'dan kaldırırım, böylece aynı eylemi gerçekleştirmek için komutu bir kez daha çalıştırmaları gerekir. Ayrıca olayları kaydetmeyi ve Listener'u uygulamayı da unutmayın.

Set hakkında daha fazla bilgi edinmek isterseniz, Javadocs here bulunabilir.

İlgili konular