java façons alternatives de suspendre le script


OK je fais un plugin java minecraft et il joue une chanson au lecteur en utilisant des sons prédéfinis avec lesquels il se déclenche:
player.playSound(player.getLocation(), Sound.NOTE_BASS, 2, 10);

Et je veux qu'il veuille lui faire chanter des paroles par exemple hammer time pour que cela ressemble à 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 auraient besoin de moi pour utiliser un try, catch déclaration sorcière ne fonctionnerait pas parce que j'en ai besoin pour agir comme un gros script je carnt avoir un tas de try catch dans le script. donc je suppose que je demande y a-t-il d'autres moyens pour moi de le faire ?

Author: Gerard2202, 2013-08-25

2 answers

Vous pouvez 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
}
 2
Author: Jeffrey, 2013-08-25 00:40:52

Vous devez utiliser le planificateur Bukkit. Puisque vous voulez faire ce script comme possible, voici comment je vous suggère de le faire. Il utilise quelque chose appelé une interface, que vous n'avez probablement pas eu, mais vous n'avez pas besoin de le comprendre maintenant pour l'utiliser.

Une nouvelle classe qui contient toutes les informations dont vous avez besoin pour votre remarque 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 quelque chose appelé a scheduledSyncDelayedTask() (Nom long, résultats étonnants:P). Avec elle vous pouvez envoyer des notes de joueurs dans des déclarations d'une ligne comme 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 Note(player, Sound.NOTE_BASS, 1, 10), delayInServerTicks);

Cette méthode ne permet pas vraiment d'accord structures, si vous voulez le faire, vous pouvez créer une classe qui va contenir la liste de 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 rendez la chose qui implémente Runnable comme avant, mais utilisez maintenant une boucle for pour jouer toutes les notes à la fois afin d'obtenir 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 accords particuliers souvent, vous pouvez les faire comme variables comme ceci:

        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 la supprime progressivement. Ne l'utilisez pas. En outre, le planificateur Bukkit dispose d'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 cela, vous devez annuler la tâche, sinon vous risquez des pointeurs nuls lorsque le lecteur se déconnecte ou fait quelque chose qui provoque une erreur. Si vous besoin d'annuler la tâche retardée ou la tâche répétitive, utilisez ceci:

sched.cancelTask(id);

Je pense que c'est à propos de tout. Espérons que cela aide. :)

 2
Author: Kammeot, 2013-08-25 07:39:55