Plugin Auto afk kick

Tatasy

Bucheron
7 Août 2019
4
0
11
66
J'aimerai faire un Auto afk kick mais le probleme c'est que je ne connais pas d'événement qui permet de faire ça

Si quelqu'un pourrait me passer un code ou m'aider , se sera trop gentil

Merci, cordialement Tatasy
 

Kaeios

Architecte en herbe
13 Avril 2019
35
5
69
44
www.magicalsky.fr
Salut, au cas où tu peut mettre en place un anti afk avec le server.properties avec la valeur player-idle-timeout

Si tu souhaite vraiment le faire toi même il faut utiliser le PlayerMoveEvent (et le PlayerInteractEvent si besoin) et vérifier si le joueur bouge avant un délai après lequel il seras kick.

Pour cela, il faut une méthode est de créer une Map qui permet d'associer une clé (le joueur) à une valeur (le Timestamp de sa dernière action), ensuite, dès que le joueur fait une action, tu mets à jour la date de la dernière action avec la date actuelle dans la Map.
Il faut ensuite créer une tache répétitive a l'aide d'un BukkitScheduler pour vérifier tout les X temps si des joueurs n'ont fait aucune action depuis plus de 30 minutes par exemple et les kick.

Attention il ne faut pas oublier de retirer les joueurs qui se déconnectent de la Map en utilisant le PlayerQuitEvent
 

Tatasy

Bucheron
7 Août 2019
4
0
11
66
Merci de ton aide
J'ai un autre question, pour mon scoreboard
J'aimerai que ca affiche le nom du joueur et le ping , pourrais tu me passe un code ou m'aider

Cordialement tatasy

et si par example je veux faire qu'il sois kick apres 15 ou 20 d'afk(avec le serveur properties)

Pourrait tu m'expliquer comment on fait
 
Dernière édition par un modérateur:

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 140
163
464
247
21
Mìlhüsa
Bonjour,

J'aimerai que ca affiche le nom du joueur
Si tu ne sais pas afficher une variable, comment espères-tu faire un plugin ?
Apprend d'abord les fondamentaux, sinon tu vas obtenir un code que tu crois comprendre mais quand tu voudras le modifier, bah tu pourras pas.
Le copier-coller ne marche que si tu comprends ce que tu copies, là on t’aiguille sur les tableaux associatifs mais si tu ne comprends pas les conteneurs ça va être difficile de les utiliser.

Bon j'ai tout de même pris la peine de te faire un exemple, fait ce que tu veux avec :
Code:
package fr.she3py.foo;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * La classe principale de ton plugin
 */
public class FooPlugin extends JavaPlugin implements Listener {
   /**
    * Une Map<K, V> est équivalant à un tableau, sauf qu'au lieu d'accéder aux éléments
    * avec leurs indices (son emplacement dans le tableau), on le fait avec un object.
    *
    * Ici, on associe chaque joueur à un entier, qui représente la date en millisecondes à
    * laquelle il a bougé pour la dernière fois.
    */
   private final Map<Player, Long> LAST_ACTIVITY = new HashMap<>();
  
   @Override
   public void onEnable() {
      // On enregistre notre classe, pour qu'on puisse recevoir des évènements
      Bukkit.getPluginManager().registerEvents(this, this);
     
      // Ensuite, on créer une tâche qui s'activera toutes les 10 minutes
      // Le premier paramètre est le plugin qui enregistre la tâche
      // Le deuxième paramètre est la tâche à effectué, on lui passe une fonction
      // Le troisième paramètre est le délai initial avant que la tâche s'exécute pour la 1ère fois
      // Le quatrième paramètre est le délai entre deux exécutions de la tâche
      // Les temps indiqués sont en ticks (20 ticks = 1 seconde), 10 mn = 600 s, 600 * 20 = 12 000 ticks
      Bukkit.getScheduler().scheduleSyncRepeatingTask(this, this::timeoutTask, 12000, 12000);
   }
  
   /**
    * En mettant l'annotation @EventHandler, on indique à Bukkit que cette fonction
    * est un point d'entrée ; elle sera appelée automatiquement si l'évènement correspondant
    * à son paramètre est déclanché.
    *
    * Bukkit ne cherche de telles fonctions que dans les classes enregistrées,
    * d'où le fait qu'il faille enregistrer nos évènements en amont.
    */
   @EventHandler
   public void onPlayerMove(PlayerMoveEvent e) {
      // On récupère le joueur qui a bougé
      Player player = e.getPlayer();
     
      // On récupère la date actuelle, en millisecondes
      long time = System.currentTimeMillis();
     
      // Et on ajoute le joueur dans notre tableau associatif
      // S'il y est déjà présent, l'ancienne valeure sera écrasée.
      LAST_ACTIVITY.put(player, time);
   }
  
   /**
    * Cette fonction est appelée toutes les 10 minutes
    */
   public void timeoutTask() {
      // On recupère la date actuelle
      long currentTime = System.currentTimeMillis();
     
      // On créer une liste qui contiendra tous les joueurs à kick
      List<Player> toKick = new ArrayList<>();
     
      // On ajoute tous les joueurs qui n'ont pas bougés depuis 600 000 ms (10 mn) dans notre liste
      LAST_ACTIVITY.entrySet().stream().filter(entry -> (currentTime - entry.getValue()) > 600000).map(Map.Entry::getKey).forEach(toKick::add);
     
      // Et on les kicks
      toKick.forEach(player -> player.kickPlayer("Inactivité prolongée"));
   }
  
   /**
    * Appelée lorsqu'un joueur quitte le serveur
    */
   @EventHandler
   public void onPlayerQuit(PlayerQuitEvent e) {
      // On l'enlève de notre liste
      LAST_ACTIVITY.remove(e.getPlayer());
   }
}

Cordialement,
ShE3py.
 
  • J'aime
Reactions: DiscowZombie