Un système de trade : le GUI



  • Salut
    Je voudrai créer un système de "trade" (commerce en français ?) avec un gui custom.
    J'ai réussi à créer le système (grandement inspiré de l'EntityVillager) mais le problème est avec le GUI : je ne sais pas comment l'afficher.
    J'ai créer la classe (je pense qu'elle marche) mais c'est pour l'afficher que je ne sais pas. J'ai suivi le tuto ici, mais ce n'est pas exactement pareil : le tuto est pour des TileEntity, hors moi je veux pour une entité. J'ai cherché partout sur internet et regarder les classes vanilla, mais ne trouve pas.
    J'ai tout de même tester des choses :
    -```java
    FMLClientHandler.instance().displayGuiScreen([size=smallplayer], [size=smallnew] GuiMerchant([size=smallplayer].[size=smallinventory], [size=smallmerchant], [size=smallworldObj], I18n.format([size=small"entity.MOB.name"], [size=smallnew] Object[0])));

    Mais il faut initialiser la variable merchant :
    ```java
    IMerchant [size=smallmerchant] =
    ``` je ne sais pas ce qu'il faut mettre après le égale.
    - ```java
    [size=smallplayer].openGui(This_is_Christmas.This_is_Christmas.*[size=smallinstance]*, 0, [size=smallworldObj], (**[size=smallint]**)[size=smallplayer].[size=smallposX], (**[size=smallint]**)[size=smallplayer].[size=smallposY], (**[size=smallint]**)[size=smallplayer].[size=smallposZ]);
    

    Ici, je suppose que ça affiche le GUI avec l'ID 0 dans le mod. Si c'est ça, comment affecter mon GUI à l'ID 0 ?
    -la méthode qui est utilisée chez les villageois est : ```java
    [size=smallplayer].displayGUIMerchant([size=smallthis], [size=smallthis].getCustomNameTag());

    Du coup, je suis aller à l'emplacement de displayGUIMerchant, ce qui me mène dans EntityPlayer à la ligne :
    ```java
    **[size=smallpublic]** **[size=smallvoid]** displayGUIMerchant(IMerchant [size=smallp_71030_1_], String [size=smallp_71030_2_]) {}
    ```.
    Mais je ne trouve pas où est dit que displayGUIMerchant doit afficher le GUI GuiMerchant. Du coup, je ne peux pas l'utiliser.
    
    Ca se trouve, la réponse est toute simple, mais je ne trouve pas.
    
    Merci d'avance
    
    PS : Si quelqu'un saurait comment faire pour que mon mob ne fasse de demande qu'une par une (par exemple s'il demande une pomme, on ne pourra pas lui donner autre chose tant qu'on lui a pas donner de pomme), je suis preneur.


  • Déjà tu n'as pas besoin de créer d'instance IMerchant nan, il te suffit d'implémenter ton mob qui affiche le gui, de l'interface IMerchant. Après le extends EntityCreature (ou autre chose, je sais pas) rajoute implement IMerchant et ainsi ta fonction qui appelle l'affichage du gui ressemblera à ça :

    FMLClientHandler.instance().displayGuiScreen(player, new GuiMerchant(player.inventory, this, worldObj, I18n.format("entity.MOB.name", new Object[0])));
    Ensuite vérifies bien avant d'appeller cette méthode que tu te trouve bien QUE et je dis bien QUE sur le Side Client, sinon crash assuré en multi. Pour ce faire rajoute ceci
    if(world.isRemote)
    FMLClientHandler.instance().displayGuiScreen(player, new GuiMerchant(player.inventory, this, worldObj, I18n.format("entity.MOB.name", new Object[0])));

    Je crois que c'est tout. Et juste pour te préciser sur le point des Entity / TileEntity qui affiche un gui, tu n'as pas besoin de créer un GuiHandler si tu n'as pas de TileEntity qui affice un gui
    Pour finir, je n'ai pas compris ta deuxième question (celle du PS).


  • Administrateurs

    Salut,
    Pour ajouter un gui sur une entité le mieux est d'utiliser l'id d'openGui pour savoir de quelle entité ça vient et utiliser le x pour l'id de l'entité. (le y et le z reste inutilisé).
    Voici un petit exemple.

    • la fonction interact de mon entité :
       @Override
       public boolean interactFirst(EntityPlayer player)
       {
           if(!player.worldObj.isRemote)
           {
    
               player.openGui(ExampleMod.instance, <l'id que="" tu="" veux,="" qui="" n'est="" pas="" utilisé="" dans="" un="" autre="" opengui="" de="" ton="" mod="">, player.worldObj, this.getEntityId(), 0, 0);
           }
           return true;
       }
    

    et le gui handler :

    public class ExampleGuiHandler implements IGuiHandler
    {
       @Override
       public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z)
       {
    
           if(ID == <l'id voulu="">)
           {
               EntityExample entity = (EntityExample)world.getEntityByID(x); // on recup l'entité
               return new ContainerExample(player.inventory, world, entity);
           }
           return null;
       }
    
       @Override
       public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z)
       {
           if(ID == <l'id voulu="">)
           {
               EntityExample entity = (EntityExample)world.getEntityByID(x); // on recup l'entité
               return new GuiExample(player.inventory, world, entity);
           }
           return null;
       }
    }
    ```</l'id></l'id></l'id>


  • Salut, désolé du temps de la réponse
    Ca marche parfaitement, merci à vous deux 🙂

    Pour ma deuxième question, je voudrais que si mon mob demande un objet A, on ne pourra rien lui donner d'autre tant qu'on ne lui a pas donner A. Par exemple, si il demande une pomme et qu'on veut lui donner une ender pearl, il n'en voudra pas et ça fera rien, il faut lui donner une pomme.
    Je ne sais pas si c'est clair, je ne sais pas bien expliquer 😕

    A mon avis, il faut utiliser des NBT Tags, mais je ne suis pas sûr



  • Est-ce que ta liste sera prédéfinie et fixe, du genre après la pomme, y'a le blé et ensuite la carotte, etc..Ou est-ce qu'elle variera d'un mob à l'autre ? Si elle est fixe, utilise un tableau d'Item pour stocker tous ces items dans le bon ordre, sinon si cette ensemble peut varier, utilise une ArrayList d'Item. Ensuite dans la fonction interact tu ajouteras une condition qui vérifie si l'item tenu du joueur est égal à tel index du tableau ou de la liste et si oui, tu mets ton code (n'oublie pas le null-check de l'itemstack : getHeldItem(), sinon CRASH !). Et oui évidemment, tu dois sauvegarder le tout (la progression des items donnés à l'Entity) dans ses NBT, mais ça je pense que tu sais le faire 😉



  • Salut
    Désolé pour le temps de la réponse.

    J'ai commencé à faire un tableau, et j'ai ensuite réfléchi que ça ferai un peu bizarre. J'ai donc mis comme les villageois, et ça marche.
    Merci 🙂