Aller au contenu

Du Skript au Java #4 - Les événements "At time" et "every X time"


Messages recommandés

Posté(e)

Bonjour,

 

Aujourd'hui je vais vous expliquer comment réaliser en Java les événements "at XX:XX" et "every X seconds/ticks/hours..."

 

 

 

 

 

L'évent At Time

 

Pour l'évent "at time", il vous faudra d'abord une variable locale qui enregistrera l'heure du dernier test. Ensuite on pourra voir grâce à cette donnée si l'heure est passée ou non.

Donc ajouter votre variable juste après le "public class":

static int lastTick = 0;

Maintenant on passe au code. Vous devez mettre ce code lorsque le serveur démarre, soit dans la méthode onEnable(), soit dans une fonction qui est appelée en même temps que le onEnable().

Voici le code en question:

       BukkitScheduler scheduler = Bukkit.getServer().getScheduler();
       int CHECKPERIOD = 10;
       String world = "world";
       int time = 0;
       scheduler.scheduleSyncRepeatingTask(this.getPlugin(this.getClass()), new Runnable() {
           @Override
           public void run() {
               World w = Bukkit.getServer().getWorld(world);
               boolean mid = false;
               final int tick = (int) w.getTime();
               if (lastTick == tick) {
                   if (lastTick + CHECKPERIOD * 2 < tick || lastTick > tick && lastTick - 24000 + CHECKPERIOD * 2 < tick) {
                       lastTick = (tick - CHECKPERIOD) % 24000;
                   }
                   final boolean midnight = lastTick > tick;
                   if (midnight) {
                       lastTick -= 24000;
                       mid = true;
                   }
               }
               if(tick>time && lastTick<=time) {
                   //CODE
               }
               lastTick = tick;
               return;
           }
       }, 0L, CHECKPERIOD);

Dans ce code vous pouvez changer 3 paramètres:

  1. L'heure
  2. Le monde
  3. Le période de test (tous les combiens de ticks ça va être testé)

Vous pouvez les trouver aux lignes 2, 3, 4.

Pour le monde c'est tout simplement du texte. Pour la période de test c'est en ticks. Vous savez probablement que 20 ticks font 1 seconde. De base ça test ça toutes les 1/2 secondes (car 10/20 = 1/2).

 

Pour l'heure il faut la mettre en ticks. Dans une journée Minecraft il y a 24000 ticks. 0 tick correspond à 6h et 24000 correspond à 6h aussi.

On prend donc la différence d'heure entre 6h et l'heure voulue et on multiplie par 1000. Par exemple pour 8h on aura: 2*1000 = 2000. 8h correspond à 2000 ticks.

Pour 22h: 16 * 1000 = 16000

 

Exemple:

        int CHECKPERIOD = 20;
       String world = "pvp";
       int time = 6000;

Ici à 12h dans le monde pvp, le code s'effectura.

Le code est à mettre à la place de "//CODE".

 

Exception:

Pour 6h, il faut remplacer:

                if(tick>time && lastTick<=time) {
                   //CODE
               }

par:

                if(mid) {
                   //CODE
               }

 

 

 

 

 

 

L'évent every X time

 

 

Pour l'évent every X time, c'est la même chose que précédemment mais simplifié.

Vous devez également le mettre à l'ouverture de votre serveur (dans le onEnable() ).

Voici le code:

    BukkitScheduler scheduler = Bukkit.getServer().getScheduler();
   int time = 20;
   scheduler.scheduleSyncRepeatingTask(this.getPlugin(this.getClass()), new Runnable() {
       @Override
       public void run() {
            //CODE
       }
   }, 0L, time);

Ici nous pouvons changer une seule variable:

    int time = 20;

C'est le temps avant que le code soit répété. Il est exprimé en ticks (je rappelle 20 ticks = 1 seconde).

 

Par exemple pour executer mon code toutes les minutes je met:

    int time = 1200; //Car 20 * 60 = 1200

 

 

 

 

 

 

 

 

Voilà j'espère avoir encore une fois avoir été assez clair :)

Et proposez moi des idées pour les prochains tutos car là je ne sèche un peu sur les thèmes à aborder :eek:

  • 2 semaines après...
Posté(e)

La seule solution que je connais c'est avec une flèche, en testant sa hauteur lros de l'impact par rapport à la hauteur de la tête du zombie. Pour ce qui est de taper à l'épée, il faut faire un système très compliqué en utilisant des vecteurs 3d, des locations, l'orientation du joueur etc...

Posté(e)
La seule solution que je connais c'est avec une flèche, en testant sa hauteur lros de l'impact par rapport à la hauteur de la tête du zombie. Pour ce qui est de taper à l'épée, il faut faire un système très compliqué en utilisant des vecteurs 3d, des locations, l'orientation du joueur etc...

Mince :/

  • 5 mois après...
Posté(e)

    public void ppj1(PlayerJoinEvent e){
       Player p = e.getPlayer();
       p.sendMessage("§6" + p.getName() + "§7a rejoind le serveur");
       p.getInventory().clear();
       p.getEquipment().clear();
       p.getInventory().setItem(0, diamondsword);
       p.updateInventory();

   }

 

diamondsword cannot be resolved to a variable :(

Posté(e)

A la place de diamondsword ça doit être une variable du type ItemStack. Si tu veux que ce soit une épée en diamant ton code doit être:

p.getInventory().setItem(0, new ItemStack(Material.DIAMOND_SWORD, 1));

Posté(e)
    public void ppj1(PlayerJoinEvent e){
       Player p = e.getPlayer();
       p.sendMessage("§6" + p.getName() + "§7a rejoind le serveur");
       p.getInventory().clear();
       p.getEquipment().clear();
       p.getInventory().setItem(0, diamondsword);
       p.updateInventory();

   }

 

diamondsword cannot be resolved to a variable :(

p.getInventory().setItem(0, new ItemStack(Material.DIAMOND_SWORD, 64)); # Tu remplaces 64 par le nombre d'épées en diamants.

Posté(e)

Comment je dois faire si je veut que sa fasse:

clear inventory

set slot 0 of player to diamond sword named "Ouvrir#" with lore "TEST"

 

J'ai comencé :o

 

@EventHandler
public void oj(PlayerJoinEvent e){
Player p = e.getPlayer()
p.inventory().p.clear();
Après ji sais pas :(
}

Posté(e)

@EventHandler
public void onJoin(PlayerJoinEvent e){

   Player p = e.getPlayer();
   p.getInventory().clear();
   ItemStack sword = new ItemStack(Material.DIAMOND_SWORD);
   ItemMeta meta = sword.getItemMeta();
   meta.setDisplayName("Ouvrir");
   ArrayList<String> lore = new ArrayList<String>();
   lore.add("Test");
   meta.setLore(lore);
   sword.setItemMeta(meta);
   p.getInventory().setItem(0, sword);

   }

 

Après comme c'est long, si tu veux utiliser ça plusieurs fois, tu peux passer par une fonction :

 

public void giveItem(Player p, Material item, int size, String name, String lore, int slot){

   ItemStack itemStack = new ItemStack(item, size);
   ItemMeta meta = itemStack.getItemMeta();
   meta.setDisplayName(name);
   ArrayList<String> lores = new ArrayList<String>();
   lores.add(lore);
   meta.setLore(lores);
   itemStack.setItemMeta(meta);
   p.getInventory().setItem(slot, itemStack);

   }

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.