2017-06-16 17 views
-11

Ich versuche, ein Minecraft-Plugin zu erstellen, das einen Pfeil 5 Mal mit einer Verzögerung von 10 Ticks zwischen den Aufnahmen schießt.Minecraft Bukkit Runnable

Leider bin ich nicht wirklich erfahren mit Java, aber ich versuche mein Bestes, um die Antworten zu verstehen.

Das ist mein Code:

public void run() { 
    for (int i = 0; i <5; i++){ 
     player.playSound(player.getLocation(), Sound.SHOOT_ARROW, 1.0f, 1.0f); 
     Arrow arrow = player.launchProjectile(Arrow.class); 
     Events.removeArrows.put(arrow.getEntityId(), (byte) 1); 
    } 
} 

Im Moment dieser Code-Schnipsel 5 Pfeile ohne Verzögerung "schießt". Jetzt bin ich fest, wenn es darum geht, eine Verzögerung hinzuzufügen.

+0

Was ist dieser Code, und was ist Ihre Frage? – Pickle

+0

Wie kann ich Minecraft Bukkit Plugin verzögern? Ich gebe bereits 'Bukkit.getServer(). GetScheduler(). TemplateAsyncDelayedTask (dies, neue Runnable() {' Aber ich habe Fehler 'Konnte Ereignis nicht übergeben PlayerInteractEvent' –

+0

Sie haben meine Frage nicht beantwortet. Was ist dieser Code (Und warum ist es unvollständig? Du hast gerade eine halbe Klasse in die Box geworfen. Wenn du uns helfen willst, respektiere uns bitte, indem du zumindest deinen Code richtig formatierst. – Pickle

Antwort

0
BukkitScheduler scheduler = getServer().getScheduler(); 
scheduler.scheduleSyncRepeatingTask(yourPlugin, new Runnable() { 
    @Override 
    public void run() { 
     //Execute Arrow Code here 
    } 
}, 10L); 

, dass der Code innerhalb der run() Methode alle 10 Ticks ausgeführt wird, bis er gestoppt wird. Verwenden Sie dazu this.cancel(); innerhalb der Runnable.

0

wahrscheinlich einfachste Weg, dies zu tun, ist mit einer asynchronen Aufgabe:

//Asynchronous Task 
Bukkit.getScheduler().runTaskAsynchronously(plugin,() -> { 
    for (int i = 0; i <5; i++){ 

     player.playSound(player.getLocation(), Sound.SHOOT_ARROW, 1.0f, 1.0f); 
     Arrow arrow = player.launchProjectile(Arrow.class); 
     Events.removeArrows.put(arrow.getEntityId(), (byte) 1); 

     try { 
      //pause the task for 10 ticks/half a second 
      Thread.sleep(500); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

}); 

Dieser Code schießt ein Pfeil wartet dann 10 Ticks und beginnt wieder von vorn, bis die for Schleife beendet ist.

Normalerweise sollten Sie keinen Thread.sleep() in Ihren Code einfügen, da der gesamte Server für die von Ihnen definierte Zeit angehalten wird. Aber da diese Funktion asynchron ist, haben wir dieses Problem nicht.