Minecraft Pattern Recognition



  • Salut tout le monde.
    J'aimerai faire la présentation d'une première version d'un [infobulle="outils de développement"]devkit[/infobulle] qui permettra de faire de la reconnaissance de [infobulle="motif/structure"]pattern[/infobulle] dans minecraft rapidement quelques soit votre niveau en programmation.

    #Qu'est ce que la reconnaissance de pattern ? exemple concret(Qu'est ce que la reconnaissance de pattern ? exemple concret)

    Les images parlent d'elles-même, dans la situation 1 on reconnait un certain pattern qui n'est plus reconnu dans la situation 2.

    #I - Téléchargement(I - Téléchargement)

    Tout d'abbord il vous faut télécharger une application que voici pour créé votre pattern ainsi que des sources qui vous seront utile lorsque vous manipulerez des patterns dans vos mods, en vous rendant sur cette page.
    Les fichiers à télécharger sont très légers (~200 ko).

    #II - Création du pattern(II - Création du pattern)

    Voici comment se présente l'application :

    Et voila comment est représenté le pattern que je vous montre en exemple :

    Je pense qu'il est nécessaire de vous donner quelques informations sur le champs "value", et les axes.

    Value représente les meta-datas des blocs. Par exemple, un planche de bois possède l'ID 5 quelques soit le type de planche. Si vous souhaitez que le pattern ne [infobulle="corresponde"]matches[/infobulle] qu'avec un certain type de bois, il vous faut spécifier une valeur dans le champs "value".
    2 par exemple, représente du bois de bouleau 😉

    Les axes en y=0 : représentent le point d'ancrage de votre pattern. Nous reviendrons la dessus un peu plus tard.(1)
    Je vous conseil fortement de lire l'ensemble de l'article avant de vous lancer dans la création de votre pattern

    NB : Vous pouvez aussi créer votre pattern sans cette application en créant un fichier .ptrn que vous modifierez a la main avec bloc-note par exemple.
    Mais attention, ça risque de vous prendre du temps xD.
    Chaque bloc s'écrit sur une ligne sous le format suivant idmeta-data.
    Si vous ne voulez pas prendre en compte les meta-data, le format devient le suivant id(x,y,z)
    Vous pouvez écrire des commentaires en écrivant après un #.
    x,y,z sont les positions relative a l'ancre de votre pattern (1).

    #III - Utilisation de ce devkit dans vos mods(III - Utilisation de ce devkit dans vos mods)

    1 - (1.6.4) Copier l'intérieur de l'archive (c'est a dire le dossier "fr") dans votre dossier mcp/src/minecraft.
    2 - Il vous faut implémenter 2 interfaces : AnchorBlock et ComparableBlock.
    Pour forge voici l’implémentation d'AnchorBlock que j'utilise :

    
    import net.minecraft.world.World;
    import fr.eyzox.minecraftPattern.pattern.AnchorBlock;
    import fr.eyzox.minecraftPattern.pattern.ComparableBlock;
    
    public class ForgeAnchorBlock implements AnchorBlock{
    
    private World world;
    private int x,y,z;
    
    //Une implementation de ComparableBlock
    private ForgeComparableBlock block;
    
    //le constructeur prend en parametre un monde et les coordonnés du bloc qui nous servira d'ancre(1).
    public ForgeAnchorBlock(World w, int x, int y, int z) {
    this.world =w;
    this.x=x;
    this.y=y;
    this.z=z;
    block = new ForgeComparableBlock();
    }
    
    //retourne le bloc positionnés (dx,dy,dz) bloc plus loin.
    @Override
    public ComparableBlock getBlockRelativeTo(int dx, int dy, int dz) {
    block.setId(world.getBlockId(x+dx, y+dy, z+dz));
    block.setMetaData(world.getBlockMetadata(x+dx, y+dy, z+dz));
    return block;
    }
    
    }
    
    

    Et voici l'implementation de ComparableBlock que j'utilise :

    
    import fr.eyzox.minecraftPattern.pattern.ComparableBlock;
    
    public class ForgeComparableBlock implements ComparableBlock {
    private int id, metaData;
    @Override
    public int getId() {
    return id;
    }
    
    @Override
    public int getMetaData() {
    return metaData;
    }
    
    public void setId(int id) {
    this.id = id;
    }
    
    public void setMetaData(int metaData) {
    this.metaData = metaData;
    }
    }
    
    

    3 - Votre classe personnalisé :

    
    private List <mcpattern>patterns;
    private final File pattern_folder = new File("MCPattern");
    
    public void registerPattern() {
    //Create a new MCPattern
    if(pattern_folder.exists() && pattern_folder.isDirectory()) {
    patterns = new ArrayList<mcpattern>();
    //Pour tout les fichier du dossier MCPattern se trouvant a la racine du serveur
    for(String filename : pattern_folder.list())
    try {
    // Je vérifie si l'extension du fichier est .ptrn
    if(filename.endsWith(".ptrn")) {
    //Si oui, je l'ajoute dans ma liste de MCPattern (2)
    patterns.add(new MCPattern(new PtrnReader(new File(pattern_folder+"/"+filename))));
    System.out.println("[MCPattern] pattern added : "+filename);
    }
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    
    @ForgeSubscribe
    public void player_right_click(PlayerInteractEvent event) {
    //Si ce n'est pas un click droit, je ne fais rien
    if(event.action != PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK) return;
    //Je définis la référence vers l'ancre du pattern comme étant le bloc sur lequel j'ai cliqué
    AnchorBlock b = new ForgeAnchorBlock(event.entityPlayer.worldObj, event.x,event.y,event.z);
    //Pour tout les pattern enregistré pécédement dans ma liste de pattern
    for(MCPattern pattern : patterns) {
    //Si le pattern est reconnu
    if(pattern.matches(b)) {
    //J'ajoute un message dans le chat
    event.entityPlayer.addChatMessage("Matches !");
    }
    }
    }
    
    

    Annotation :
    (1) : Nous y voila enfin ! Qu'est ce que c'est que cette ancre. Certains l'ont surement déjà comprit, avant même les exemples, mais pour les autre :
    Je n'avais pas idée de comment vous l'expliquer avant l'exemple concret.
    Pour reconnaître si un pattern matches, on doit (pour l'instant) lui donner le bloc qui correspond au début du pattern, c'est a dire l'équivalent en jeu du point (0,0,0) que vous avez vu dans le grand I (l'intersection des axes en Y=0). C'est a partir de ce bloc que l'algorithme va vérifier si votre structure en jeu correspond ou non à ce que vous avez fabriqué dans l'application.
    (2) : Si vous utilisez un faible nombre de petits patterns, vous pouvez coder de la même manière que moi l'enregistrement des patterns. Mais si vous utilisez de plus gros patterns et en plus grand nombre, vous utiliserez de la mémoire inutilement avec l'implémentation que je vous propose.

    A savoir :
    Ce devkit est indépendant de minecraft, forge ou tout autre API ce qui je l'espère me permettra de ne pas être embêté par les MAJ minecraft, forge etc… et de toucher un plus large publique.

    #Divers(Divers)
    L'utilité de ce devkit réside surtout dans la création du pattern plus que dans ça mise en place in-game.
    Car en réalité, il suffit simplement de comparé un tableau avec les blocs en jeu pour déterminer si oui ou non le pattern correspond.
    A tout casser, c'est fait en 20 minutes ^^
    Par contre c'est la création du pattern qui vous demandera énormément de temps et c'est aussi la création de l'interface graphique qui m'a prise le plus de temps xD</mcpattern></mcpattern>



  • Ça peut paraître ridicule mais je te conseille de définir tous les mots en langue étrangère avant de commencer ton tutoriel, ça peut aider les nouveaux et complète ton tutoriel.



  • Mes codes c'est du Franglais 😛
    J'utilises pas des mots incompréhensible pourtant ^^ Et dès que ça devient un peu plus technique, je vous fait la traduction 😉
    J'ai hésité a poster ça dans tutoriel mais la je n'explique pas comment faire de la reconnaissance de pattern, puisque tout est masqué par mon code.

    S'il y a des mots sur lesquels tu butes, n'hésites pas a le dire, j'en ferais une traduction 😉



  • @'Blackout':

    Mes codes c'est du Franglais 😛
    J'utilises pas des mots incompréhensible pourtant ^^ Et dès que ça devient un peu plus technique, je vous fait la traduction 😉
    J'ai hésité a poster ça dans tutoriel mais la je n'explique pas comment faire de la reconnaissance de pattern, puisque tout est masqué par mon code.

    S'il y a des mots sur lesquels tu butes, n'hésites pas a le dire, j'en ferais une traduction 😉

    Non personnellement j'ai compris mais "pattern", "matches" etc. sont des mots anglais. Une partie "Qu'est-ce qu'un pattern ?" et des exemples dans Minecraft seraient utiles à la compréhension pour les nouveaux. Par exemple le portail du nether, de l'end etc…



  • J'ai edit mon post 😉
    Pour les exemples, je ne vois pas comment faire mieux, j'illustre déjà avec les images.
    Merci du feedback 🙂

    Pour contre, se serait bien de nous donner une balise d'info bulle pour proposer une traduction directement sur les mots anglais.
    Admins si vous m'entendez 😛 Ce serait un beau + pour le forum 😉



  • Pas de problème 🙂


  • Administrateurs

    @'Blackout':

    J'ai edit mon post 😉
    Pour les exemples, je ne vois pas comment faire mieux, j'illustre déjà avec les images.
    Merci du feedback 🙂

    Pour contre, se serait bien de nous donner une balise d'info bulle pour proposer une traduction directement sur les mots anglais.
    Admins si vous m'entendez 😛 Ce serait un beau + pour le forum 😉

    Je sais pas du tout comment faire ça. Faudrait que je regardes si il existe des plugins pour, sinon faut que je vois avec Woryk si il a le temps pour.



  • C'est pas très compliqué a coder _
    Tu crées la balise, ensuite tu fixes un class à ta balise convertie en HTML
    Pattern
    Et avec JQuerry tu fais en sort que lorsque la souris passe sur l'élément, il y a une infobulle qui apparaît juste au dessus.
    J'aimerai tenter de le faire dans ce cas mais avant il faudrait que je sache si vous avez accès au PHP ? Je sais que certains fournisseurs de forum préfabriqué bride l’accès au PHP.


  • Administrateurs

    J'ai accès à tout, le forum est monté sur un serveur dédié sous debian, je le contrôle total :p. (j'ai horreur d'être limité).



  • Je regarde tout ça ce WE alors (pour la balise) 😉

    C'est cool que tu ai pris un serv dédié 🙂
    Du coups vu que tu es sous Unix, tu va peut-être pouvoir corriger le problème des pubs frauduleuses sur mobile avec un grep.
    Tu dois avoir un plugin qui t'a ajouté une saloperie de script.
    http://www.blog.paranoidpenguin.net/2014/01/lovelinks-us-spam-adverts-on-android-devices/
    Tu peux toujours essayer de regarder si tu n'as les scripts énoncé sur ce site.



  • V1.1 disponible :
    Gros changements :

    • Création d'une barre de sélection d'outils (comme ça le pointeur n'est plus mélangé avec les blocs)
    • Gestion de la sélection multiple
    • Affichage de la sélection
    • On peut ajouter un rectangle de plusieurs bloc en maintenant la touche Ctrl enfoncée
    • Ajout de raccourcis
    • les axes et la grille s'affiche maintenant au dessus des blocs
    • Gain de performance énorme

    Tout le code est maintenant entièrement codé de manière a respecter rigoureusement le pattern-design MVC 😄
    Je vais pouvoir me concentrer sur la balise traduction du forum 😛 J'ai dl MyBB, je suis entrain de me familiariser avec 😉


Log in to reply