Faire un ban temporaire

LEZIKO

Architecte en herbe
2 Novembre 2021
93
2
69
19
Bonjour,

Je demande de l'aide car j'aimerais faire un bannissement temporaire mais je ne sais pas trop quel objet utiliser pour ça du coup j'en ai pris un le System.currentTimeMillis et avec ça j'ai déjà fait (ce que j'ai mis dans le premier screen) puis dans l'évènement (deuxième screen) je vérifie si le System.currentTimeMilis > la fin du ban mais ça ne fonctionne pas il m'envoi le message test tout le temps quand je join alors je ne comprends pas trop, pourriez-vous m'aider svp ?

Merci d'avance,

LEZIKO
 

Fichiers joints

  • image_2022-07-09_155920831.png
    image_2022-07-09_155920831.png
    69 KB · Affichages: 117
  • image_2022-07-09_155937021.png
    image_2022-07-09_155937021.png
    64.1 KB · Affichages: 110

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 129
162
461
247
21
Mìlhüsa
Bonjour,

Plusieurs problèmes avec ton code actuel, sans compter le fait que ce sont des captures d'écran et que donc je suis obligé de le recopier à la main ;

Java:
ProxiedPlayer p = (ProxiedPlayer) sender;
Ta commande ne fonctionnera pas si l'exécuteur n'est pas un joueur, or ta commande est censée devoir marcher sur la console.

Java:
Configuration file = Main.Instance().getFile("banliste");
  • Préfère nommer ta classe principale d'un plugin « Foo » FooPlugin ou équivalant, parce que si tu veux utiliser un autre plugin qui a aussi appelé sa classe principale Main bah tu seras obligé d'écrire truc.machine.bidule.Main pour l'utiliser.

  • Les fonctions en Java s'écrivent en camalCase, donc FooPlugin.instance() au lieu de FooPlugin.Instance().

  • Les fichiers doivent avoir des extensions, donc "banlist.yml".

  • Ta variable n'est pas un fichier mais une configuration, donc config au lieu de file comme nom.

Java:
"/tempban [Joueur] [Temps] [Unité] [Raison]"
La convention dans Minecraft est d'indiquer les paramètres entre chevrons et de rajouter en plus des crochets si ceux-ci sont optionnels ; de plus tout est en minuscules :
Java:
"/tempban <joueur> <durée> [<raison>]"

Java:
String arg1 = args[0];
UUID uuid = UUID.nameUUIDFromBytes("...");
Désolé mais args[0] qui s'appelle arg1 c'est un peu chelou, de plus ta commande ne fonctionnera pas en online-mode=true. Utilise Bukkit :
Java:
OfflinePlayer toBan = Bukkit.getOfflinePlayer(args[0]);
if(!toBan.hasPlayedBefore()) {
    // le joueur ne s'est jamais connecté sur le serveur
}

Ensuite, toujours dans le premier screenshot :
Java:
Integer nb = Integer.parseInt(args[1] /* temps */);
if(args[2] /* unité */.equals("s")) {
    config.set("blablabla", nb + System.currentTimeMillis()));
}
Second screenshot :
Java:
if(System.currentTimeMillis() > config.get("blablabla")) { ... }

Aucun langage de programmation ne va s'amuser à convertir des secondes en millisecondes dans une addition de nombres sans unité, donc oui tu rentres toujours dans la condition parce que ton bannissement est mille fois plus cours que la durée que tu as mise dans la commande.

De plus la commande crashera si jamais le joueur n'entre pas un nombre entier, et un joueur peut entrer un nombre négatif.

Ensuite dans ton code tu t'amuses à accéder directement à ton fichier de configuration ; créer une classe dédiée :
Java:
public class BanEntry {
    private final Configuration config;
    
    public BanEntry(Configuration config) {
        this.config = config;
    }
    
    public Blabla getBlabla() {
        this.config.get("blabla");
    }
    
    public void setBlabla(Blabla blabla) {
        this.config.set("blabla", blabla);
    }
}
Comme ça ton code ressemblera à
Java:
BanEntry entry = ...;
if(myBlabla == entry.getBlabla()) { ... }
Comme ça si un jour tu veux stocker les données sur une base de données, tu auras juste à modifier getBlabla() et setBlabla() dans un seul fichier, au lieu de modifier absolument tout ton code source en espérant ne pas avoir oublié un endroit.

Par contre j'avais déjà répondu à ta question il y a quatre mois ?
https://minecraft.fr/forum/threads/plugin-bans-temporaire.269258/post-1840705

Cordialement,
ShE3py
 

LEZIKO

Architecte en herbe
2 Novembre 2021
93
2
69
19
Bonjour !

Merci beaucoup de ta réponse j'ai beaucoup de choses à changer, pour ce qui est de la réponse il y'a 4 mois j'avais oublié car j'avais abandonné le plugin de plus là on est sur un tempban bungeecord (on le voit avec le ProxiedPlayer)

Cordialement,
LEZIKO
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 129
162
461
247
21
Mìlhüsa
Bah tu peux faire un truc dans ce style :
Java:
Duration banDuration = DurationParser.parse(args[1]); // cf. la discussion d'il y a quatre mois pour cette fonction
LocalDateTime expires = LocalDateTime.now().plus(banDuration);

// pour sauvegarder :
config.setString("expires", expires.toString());

// pour charger :
LocalDateTime expires = LocalDateTime.parse(config.getString("expires"));

// pour savoir si le ban est toujours valable :
if(LocalDateTime.now().isAfter(expires)) { ... }

Tu peux un peu regarder le package java.time pour voir un peu tout ce que propose Java pour la représentation du temps :
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/package-summary.html

Notons que LocalDateTime ne prend pas en compte le fuseau horaire, et que donc tous tes serveurs doivent être réglés sur la même horloge (typiquement Europe/Paris) sinon les dates ne correspondront pas entre les serveurs.
 
  • J'aime
Reactions: LEZIKO

LEZIKO

Architecte en herbe
2 Novembre 2021
93
2
69
19
Bah tu peux faire un truc dans ce style :
Java:
Duration banDuration = DurationParser.parse(args[1]); // cf. la discussion d'il y a quatre mois pour cette fonction
LocalDateTime expires = LocalDateTime.now().plus(banDuration);

// pour sauvegarder :
config.setString("expires", expires.toString());

// pour charger :
LocalDateTime expires = LocalDateTime.parse(config.getString("expires"));

// pour savoir si le ban est toujours valable :
if(LocalDateTime.now().isAfter(expires)) { ... }

Tu peux un peu regarder le package java.time pour voir un peu tout ce que propose Java pour la représentation du temps :
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/package-summary.html

Notons que LocalDateTime ne prend pas en compte le fuseau horaire, et que donc tous tes serveurs doivent être réglés sur la même horloge (typiquement Europe/Paris) sinon les dates ne correspondront pas entre les serveurs.
Merci beaucoup ! :)