2013-08-25 5 views
0

OK je fais un plugin java minecraft et joue une chanson au joueur Présélection des sons, il est déclenche avec:
player.playSound(player.getLocation(), Sound.NOTE_BASS, 2, 10);façons alternatives java pour mettre en pause le script

Et je veux qu'il veut faire chanter paroles par exemple le temps de marteau il serait donc ressembler à ceci:

Bukkit.broadcastMessage(ChatColor.DARK_PURPLE +"[Server]" +ChatColor.AQUA + "Na Na Na Na, Na Na"); 
player.playSound(player.getLocation(), Sound.NOTE_BASS, 1, 10); 
player.playSound(player.getLocation(), Sound.NOTE_BASS, 2, 10); 
player.playSound(player.getLocation(), Sound.NOTE_BASS, 3, 10); 
player.playSound(player.getLocation(), Sound.NOTE_BASS, 4, 10); 
player.playSound(player.getLocation(), Sound.NOTE_BASS, 1, 10); 
//a sleep statement here 

et ainsi de suite ..... donc, je ne veux pas utiliser le Thread.sleep(100) ou wait() parce qu'ils ont besoin de moi d'utiliser un try, catch déclaration witc h ne fonctionnerait pas parce que j'ai besoin d'agir comme un grand script je ne peux pas avoir un tas d'essayer de saisir dans le script. alors je suppose que je demande s'il y a d'autres moyens pour moi de faire cela?

Répondre

2

Vous pourriez compromettre et utiliser un try-catch:

try { 
    player.playSound(...); 
    Thread.sleep(100); 
    player.playSound(...); 
    Thread.sleep(100); 
    /* etc */ 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
    // handle exception 
} 
+0

yer j'ai pensé à cela après mais pour être honnête je ne suis pas complètement sous tente essayer et attraper – Gerard2202

+0

@ Gerard2202 Qu'est-ce que vous ne comprenez pas? – Jeffrey

+0

Je ne comprends pas complètement comment ils fonctionnent ou ce qu'ils sont pour j'ai commencé java il y a une semaine ou 2 et je fais beaucoup de programmes et j'essaie juste de ne pas les utiliser J'essaie d'essayer de corriger les erreurs – Gerard2202

2

Vous devez utiliser le planificateur Bukkit. Puisque vous voulez faire en sorte que le script soit le plus possible, voici comment je vous suggère de le faire. Il utilise quelque chose appelé une interface, à laquelle vous n'avez probablement pas accès, mais vous n'avez pas besoin de le comprendre dès maintenant pour l'utiliser. Créez une nouvelle classe contenant toutes les informations dont vous avez besoin pour votre note et implements Runnable.

public class Note implements Runnable { 

    private Sound note; 
    private Player player; 
    private float volume; 
    private float pitch; 

    public Note(Player player, Sound note, float volume, float pitch) { 
     this.player = player; 
     this.note = note; 
     this.volume = volume; 
     this.pitch = pitch; 
    } 

    @Override 
    public void run() { 
     player.playSound(player.getLocation(), note, volume, pitch); 
    } 
} 

Maintenant, vous pouvez utiliser cette classe dans ce qu'on appelle un scheduledSyncDelayedTask() (nom long, des résultats étonnants: P). Avec elle, vous pouvez envoyer des notes des joueurs dans les déclarations d'une ligne comme celle-ci:

 Player player = Bukkit.getPlayer("InspiredOne"); 
    BukkitScheduler sched = plugin.getServer().getScheduler(); 
    long delayInServerTicks = 20; // There are 20 server ticks per second. 
    int id; // Used if you need to cancel the task 

    id = sched.scheduleSyncDelayedTask(plugin, new Note(player, Sound.NOTE_BASS, 1, 10), delayInServerTicks); 

Cette méthode ne permet pas vraiment de structures d'accords, donc si vous voulez faire cela, vous pouvez créer une classe qui sera essentiellement tenir une liste des notes comme suit:

public class Note { 
    public Sound note; 
    public Player player; 
    public float volume; 
    public float pitch; 

    public Note(Player player, Sound note, float volume, float pitch) { 
     this.player = player; 
     this.note = note; 
     this.volume = volume; 
     this.pitch = pitch; 
    } 
} 

Ensuite, vous faites la chose qui implémente Runnable comme avant, mais maintenant utiliser une boucle pour jouer toutes les notes à la fois si vous obtenez un accord:

public class runNote implements Runnable { 
    private Note[] notes; 
    public runNote(Note[] notes) { 
     this.notes = notes; 
    } 

    @Override 
    public void run() { 
     for(Note note:notes) { 
      note.player.playSound(note.player.getLocation(), note.note, note.pitch, note.volume); 
     } 
    } 
} 

Maintenant, vous pouvez l'utiliser en faisant ceci:

 Player player = Bukkit.getPlayer("InspiredOne"); 
    BukkitScheduler sched = plugin.getServer().getScheduler(); 
    long delayInServerTicks = 20; // There are 20 server ticks per second. 
    int id; // Used if you need to cancel the task 

    id = sched.scheduleSyncDelayedTask(plugin, new runNote(new Note[] {new Note(player, Sound.NOTE_BASS, 1, 10)}), delayInServerTicks); 

Si vous trouvez que vous utilisez souvent des accords particuliers, vous pouvez les faire en tant que variables comme celui-ci:

 Note[] chord =new Note[] { 
      new Note(player, Sound.NOTE_BASS, 1, 10), 
      new Note(player, Sound.NOTE_BASS, 2, 10), 
      new Note(player, Sound.NOTE_BASS, 3, 10) 
      // ect... 
      }; 

Si vous trouvez AsychDelayedTask, c'est une méthode obsolète qui signifie que Bukkit est en train de l'éliminer. Ne l'utilisez pas. En outre, le planificateur Bukkit a une méthode de tâche répétitive qui vous permet de répéter facilement une action encore et encore. Cette méthode est scheduleSyncRepeatingTask(). Avec ceci vous devez annuler la tâche, sinon vous risquez des pointeurs Nuls lorsque le joueur se déconnecte, ou fait quelque chose qui provoque une erreur. Si vous devez annuler la tâche soit retardée ou la tâche répétitive, utilisez ceci:

sched.cancelTask(id); 

Je pense que est à peu près tout. J'espère que cela aide.:)

Questions connexes