Welcome to Bukkit France

Inscrivez-vous maintenant pour profiter d'un accès total à tout le contenu offert par la meilleur communauté Bukkit française ! Une fois inscrit et connecté, vous pourrez contribuez à la communauté en postant vos propres sujets et questions ou en répondant à ceux existants. Vous pourrez aussi customiser votre profil, recevoir des points de réputations, communiquer avec les autres membres via le chat, et plus encore! 

TheElectronWill

Membres
  • Compteur de contenus

    810
  • Inscription

  • Dernière visite

Réputation sur la communauté

953 Excellent

À propos de TheElectronWill

  • Rang
    ✨ Javarchimage ✨
  • Date de naissance 05/02/99

Me contacter

  • Discord TheElectronWill#0423
  • GitHub TheElectronWill
  • Minecraft TheElectronWill
  • Mail [email protected]il.com
  • Site Web mcphoton.fr
  • Twitter TheElectronWill

Informations de profil

  • Bukkitorg http://dev.bukkit.org/profiles/TheElectronWill/
  • Centres d'intérêt Informatique, Badminton, Aikido, Piano.
  • Sexe Homme

Visiteurs récents du profil

4784 visualisations du profil
  1. Moi tout simplement

    Bienvenue !
  2. Classer Des Joueurs

    @FloflololDev Tu veux faire quoi avec ton classement ? Pour manipuler les joueurs dans l'ordre un TreeSet qui est une collection triée automatiquement. Fais une classe CustomPlayer comme ça a été suggéré, et ajoute les joueurs dans le TreeSet, ils seront automatiquement dans le bon ordre.   Par contre avec ça tu peux pas récupérer instantanément un joueur avec son UUID, ni la position d'un joueur dans le Set. Il faut faire toi-même des méthodes auxiliaires. Pour obtenir la position d'un joueur dans le classement on pourrait parcourir tout le set, mais c'est plus optimisé de faire comme expliqué ici : https://stackoverflow.com/questions/7911621/how-to-find-the-index-of-an-element-in-a-treeset /** Donne le rang du joueur (Attention : le 1er est à la position 0), ou -1 s'il n'est pas dans le classement. */ public int getRank(CustomPlayer player) { // set est le TreeSet du classement return set.contains(element)? set.headSet(element).size(): -1; } Si tu es sûr que tous les CustomPlayer sont dans le classement tu peux virer la vérification "set.contains(element)". Pour obtenir le rang à partir de l'UUID on n'a pas d'autre choix que de parcourir tout le TreeSet... sauf si tu utilise en plus une Map<UUID, CustomPlayer>. public int getRank(UUID playerId) { CustomPlayer customPlayer = map.get(playerId); return getRank(customPlayer); }  
  3. Je savais bien que je connaissais "TheJulix" :) Welcome to SDD

  4. Magnifique rang x) "Se repaît de la souffrance des développeurs Java/bukkit"

    1. Wisteca

      Wisteca

      "Se repaît de la souffrance des développeurs OpenGL" n'aurait pas été si mal non plus xD

  5. Générer des grandes structures... sans lags !

    Désolé de la réponse tardive ^^ Par exemple au lieu de faire ça :  Object chunkNMS = getNMSClass("World").getMethod("getChunkAt", int.class, int.class).invoke(worldNMS, x >> 4, z >> 4); Tu récupère la méthode une seule fois pour toutes : static final Method getChunkAt = getNMSClass("World").getMethod("getChunkAt", int.class, int.class); Puis tu l'utilise comme ça : Object chunkNMS = getChunkAt.invoke(worldNms, x>>4, z>>4); Ça évitera de rechercher la classe et la méthode à chaque invocation  
  6. Générer des grandes structures... sans lags !

    Tu abuses sur la reflection là Au moins, essaie d'éviter les operéations inutiles : garde l'instance de Method par exemple. Initialise-là une seule fois en static final, et réutilise là après. Ça fera déjà une bonne optimisation
  7. >> Ebutance Innovation << Faction moderne RP RPG avec quêtes...

    Je pense que tu devrais écrire encore plus gros, là on arrive encore à voir plusieurs phrase sans scroller, ça ne va pas du tout !     C'est bien d'avoir un trailer avec une musique épique mais je trouve que la police bof sur fond noir casse un peu l'ambiance, c'est dommage Bonne ouverture de serveur en tout cas !
  8. Question compliquée. ;)

    Pourquoi pas un duel à l'ancienne ? Épée ou pistolet, selon le style. Celui qui gagne décide. (vu qu'apparemment on se fout un peu de ce que pense "SuperBonn" qui n'est que "bonne" et rien d'autre  je l'inclus pas dans l'histoire...)
  9. Je développe avec Vous - Youtube

    Salut ! Quelques remarques techniques (parce que je peux pas laisser dire n'importe quoi ) : Pas besoin d'installer le JDK et le JRE car le JDK contient déjà un JRE. Il existe une version d'IntelliJ qui est gratuite (et amplement suffisante pour faire des plugins) : c'est la "community edition". Je te conseille de l'essayer Sans oublier Netbeans, un autre gros IDE Aussi, pense à bien structurer ta vidéo avant de la faire, ça évitera notamment de devoir rajouter des infos à la fin. Bon courage pour la suite !
  10. Enfin en vacances ! :)

    1. Afficher les commentaires précedents  1 autres
    2. TheElectronWill

      TheElectronWill

      Eh ouais ^_^

      Après les examens, les vacances. Ça me semble normal non ?

    3. Kumakuma215 <3

      Kumakuma215 <3

      La chance ;-;

    4. SeaMoon69

      SeaMoon69

      Stp ne dis pas «c'est les vances» ca donne envie et il me reste 1 semaine, on est les derniers... :(

  11. [LIB] Night-Config : les configurations en Java

    Je veux bien ajouter xml (et ça serait pas très compliqué) mais faut m'expliquer l'intérêt de la chose pour les fichiers de configuration :   Entre ça: property = value   Et du xml : <property>value</property>   ... ben je vois pas ce qu'apporte le XML à part que c'est plus long et plus pénible ?   Pour sérialiser des objets j'avoue que ça peut être plus pratique car on peut ajouter plus d'infos (encore qu'on pourrait faire la même chose avec des strings dans autre format - mais ça serait moins propre). Mais ça serait peut-être mieux de faire une lib de serialization XML si ça ne sert qu'à ça.
  12. JAVA Mot clef incompréhensible

    C'est à cause de ma prof de prog de cette année. Elle dit absolument tout en français (mais vraiment tout !) alors ça déteint sur les élèves. Au moins j'ai pas fait de "francisisme". C'est le vocabulaire français "officiel"
  13. JAVA Mot clef incompréhensible

    Comme ça a déjà été dit, Serializable est une interface -> regarde le tutoriel d'oracle sur la serialization   transient permet d'exclure un attribut de la serialization. En fait c'est très utile (coucou @SkyBeast ^_^): imagine tu fais tout un tas de calcul en fonction de données et des paramètres entrés par l'utilisateur. Et bien tu veux stocker les données (qui sont toujours les mêmes) mais pas le résultat des calculs ! Et encore moins un éventuel cache. Une solution est donc de déclarer tes attributs résultat et cache comme étant transient.   native sert à indiquer qu'une méthode est implémentée non pas en Java mais avec du code natif (comme du C) via JNI Par exemple System.arraycopy est une méthode native.   volatile est utilisé en programmation "concurrente" ou "multi-thread", donc quand on fait potentiellement plusieurs choses en même temps sur des coeurs (de CPU) différents. Je met potentiellement parce que, même si un code est prévu pour ça, in fine c'est l'OS qui décide de ce qui tourne réellement sur les coeurs. De plus sur une machine avec un seul coeur (et sans hyper-threading, pour faire simple) ben le programme ne pourra pas faire plusieurs choses simultanément   Pour expliquer ce qu'est volatile il faut parler des threads et de cache. Un Thread est une unité d'exécution à l'intérieur d'un programme. Un programme peut démarrer plusieurs threads, et ces derniers ont la capacité de s'exécuter en parallèle. C'est ce qui permet de distribuer le travail sur les coeurs du CPU.   Ce qu'il faut comprendre c'est que, quand il y a plusieurs threads qui utilisent la même variable, chaque thread a le droit de "mettre en cache" cette variable. Et du coup on a un problème : si un thread modifie la variable, les autres n'ont aucune garantie de voir cette modification, et ils peuvent donc continuer à utiliser une valeur obsolète de la variable ! Le plus vicieux, c'est que comme on n'a vraiment aucune garantie, la modification peut être vue tout de suite, ou une minute plus tard, ou 2 jours plus tard, ou jamais ! On ne peut pas savoir et ça peut varier d'une exécution à l'autre.   Ce là que volatile fait son entrée : si une variable est volatile, alors les threads sont forcés d'utiliser la valeur la plus à jour, la dernière valeur qui lui a été assignée. Un exemple d'utilisation est pour arrêter un thread de façon non-brutale : public WorkThread extends Thread { private volatile boolean run = true; /** Arrête le thread.*/ public void stopWorking() { run = false; } @Override public void run() { while(run) { //continue le travail } } } Si run n'était pas volatile, alors la méthode stopWorking ne fonctionnerait pas correctement !   ATTENTION volatile ne permet pas de faire de la synchronization comme le mot-clé synchronized ou les verrous ! Il ne permet pas non plus de faire des opérations de calcul atomiques comme AtomicInteger. Notamment, volatile ne permet pas de gérer correctement un compteur incrémenté depuis plusieurs threads.*   * volatile ne permet pas ça à lui tout seul. Mais avec quelques ingénieuses astuces on peut faire des choses qui fonctionnent de façon sûre en multi-threading sans utiliser ni verrous ni blocs synchronized Par exemple AtomicInteger utilise un attribut volatile. Et on peut faire des files (queues) et autres collections en utilisant volatile astucieusement (mais je ne vais pas rentrer pas dans les détails ici ^^)
  14.   Bonjour à tous ! Aujourd'hui je vous présente ma lib de gestion des configurations: Night-Config ! Il en existe déjà beaucoup, mais j'avais envie de quelque chose de plus simple à utiliser, avec les fonctionnalités les plus utiles et de bonnes performances.   Tout n'est pas terminé, ce n'est pour l'instant qu'une version Bêta. À terme, les formats suivants seront supportés : JSON TOML HOCON YAML 1.2   Le projet est disponible sur Github.     Les bases L'interface Config définit les méthodes disponibles pour toutes les configurations, notamment des getters & setters pour les valeurs : get[Value/Int/Boolean/String/...](path) et set[Value/Int/...](path, value) Le chemin des valeurs peut être : une String dans laquelle chaque partie du chemin est séparée par un point. Par exemple "a.b.c" donne cette structure: a { b { c } } une List<String> dont chaque élément est une partie du chemin. Par exemple une liste "a", "b", "c" donne la même structure que précédemment.   Exemple : Config conf = new SimpleConfig(); conf.setString("a.b.c", "abc"); conf.setInt("five", 5); conf.setDouble("pi", Math.PI); conf.setList("list", Arrays.asList("a", "b", "c"); String str = conf.getString("a.b.c"); int five = conf.getInt("five"); double pi = conf.getDouble("pi"); List<String> list = conf.getList("list");//Pas besoin de cast, et il n'y a pas de warning !   Fichiers de configuration Il suffit d'utiliser une instance de FileConfig. Il y en aura une pour chaque type de fichier supporté (JsonConfig, TomlConfig, etc) Voici un exemple avec une configuration JSON : FileConfig conf = new JsonConfig(); File configFile = new File("path/to/config.json"); try { conf.readFrom(configFile);//lecture du fichier dans la config conf.writeTo(configFile);//écriture de la config dans le fichier } catch (IOException ex) { //ERREUR }   Pour personnaliser le résultat JSON (le type d'indentation par exemple), vous pouvez utiliser un FancyJsonWriter Config conf; try (Writer fileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8))) { CharacterOutput output = new WriterOutput(fileWriter); FancyJsonWriter.Builder builder = new FancyJsonWriter.Builder(); builder.indent(" ");//indentation de 4 espaces au lieu de la tabulation qui est le réglage par défaut //autres réglages FancyJsonWriter writer = builder.build(output); writer.writeJsonObject(conf); }   Et si vous avez peu de réglages à faire (ou si vous aimez les grosses chaînes d'appel de fonctions ) vous pouvez aussi créer le Writer comme ça : FancyJsonWriter writer = new FancyJsonWriter.Builder().indent(" ").build(output);     Vérification et correction automatique des configurations Oui vous avez bien lu : correction automatique des configurations ! Concrètement, tout ce que vous avez à faire est de créer une spécification pour votre config : définir quels chemins doivent exister et quelles valeurs sont correctes. Vous pourrez ensuite, avec un simple appel de méthode, vérifier que votre configuration est correcte et/ou la corriger automatiquement. Pour tout ça on utilise une ConfigSpecification : ConfigSpecification spec = new ConfigSpecification(); spec.defineInt("int", 0, -20, 20);//"int" doit être un int compris entre -20 et 20 (inclus). La valeur par défaut est 0 spec.defineString("string", "default", "possibleValueA", "possibleValueB", "possibleValueC", "default");//"string" doit être une String égale à //"possibleValueA", "possibleValueB", "possibleValueC" ou "default". La valeur par défaut est "default" boolean isValid = spec.check(conf);//true si et seulement si la configuration 'conf' est correcte spec.correct(conf);//corrige la configuration La correction fonctionne ainsi : Toute valeur qui ne devrait pas exister est supprimée Toute valeur qui devrait exister mais qui est incorrecte est remplacée par la valeur par défaut Toute valeur manquante est ajoutée, et la valeur par défaut est utilisée.     Conversion objet/config Night-Config peut convertir une configuration en objet Java et vice-versa, à l'aide des classes du paquet reflection. Et pas besoin d'annoter la classe ni de lui faire implémenter une interface spécifique Un petit exemple avec la classe suivante : public class MyObject { int integer; double decimal; String string; List<String> stringList; Config config; MyObject subObject; }   Conversion config -> MyObject : Config conf = new SimpleConfig(); conf.setDouble("decimal", Math.PI); conf.setString("string", "value"); conf.setList("stringList", list1); conf.setConfig("config", config1); conf.setInt("subObject.integer", -1); conf.setDouble("subObject.decimal", 0.5); conf.setString("subObject.string", "Hey!"); conf.setList("subObject.stringList", list2); conf.setConfig("subObject.config", config2); conf.setConfig("subObject.subObject", null); ConfigToObjectMapper coMapper = new ConfigToObjectMapper(); MyObject objectInstance = coMapper.map(conf, MyObject.class);   Conversion MyObject -> Config : MyObject object = new MyObject(); // [...] définition des variables de l'objet ObjectToConfigMapper ocMapper = new ObjectToConfigMapper(); Config conf = new SimpleConfig(); ocMapper.map(object, conf);