Créer une classe générique pour les items



  • Bonjour à tous, dans ce petit message, je vais vous apprendre à gérer les objets en quelques lignes seulement ! (fonctionne principalement pour les items de base).

    Le but de ce petit tuto est tout simplement de ne pas avoir à s'emm..bêter avec les différentes déclarations de base des textures, des tabs, de un peu tout en fait. On aura juste à fournir un petit "this.setUnlocalizedName("nomItem")". L'intérêt est tout simplement que si votre mod est un mod par exemple basé sur les armures ou sur les items d'une manière générale (ou sur les mobs), on aura juste à fournir un nom et l'item sera prêt avec son appel de Textures, son appel de Tab etc.
    Sans plus attendre, lançons nous dans le code !

    Alors pour commencer, créons tout simplement une classe que l'on appellera "TutorielItem"

    [size=smallpackage ]fr.shadcanard.tutoriel.item%(#cc7832)[;
    ]
    import net.minecraft.item.Item%(#cc7832)[;
    ]
    public class TutorielItem extends Item
    {
    public TutorielItem()
    {
    super()%(#cc7832)[;
    ] }
    }
    
    

    Cette classe va être reliée directement à Item, c'est normal, ne vous en faites pas. En fait on va créer une classe-fille nommée "TutorielItem" à notre classe-mère "Item". Vu que c'est une classe "fille" (puisqu'elle étend la classe Item) elle va obtenir toutes les différentes fonctions de Item. Et c'est là qu'on intervient !

    à la fin de ce super et de son crochet ( } ) on va placer quelques méthodes :

    [size=small @Override
    ] public String getUnlocalizedName()
    {
    return String.*format*("item.%s%s", Tutoriel.*MOD_ID*.toLowerCase() + ":", getUnwrappedUnlocalizedName(super.getUnlocalizedName()))%(#cc7832)[;
    ] }
    %(#bbb529)[@Override
    ] public String getUnlocalizedName(ItemStack itemStack)
    {
    return String.*format*("item.%s%s", Tutoriel.*MOD_ID*.toLowerCase() + ":", getUnwrappedUnlocalizedName(super.getUnlocalizedName()))%(#cc7832)[;
    ] }
    %(#bbb529)[@Override
    ] @SideOnly(Side.*CLIENT*)
    public void registerIcons(IIconRegister iconRegister)
    {
    itemIcon = iconRegister.registerIcon(this.getUnlocalizedName().substring(this.getUnlocalizedName().indexOf(".") + 1))%(#cc7832)[;
    ] }
    protected String getUnwrappedUnlocalizedName(String unlocalizedName)
    {
    return unlocalizedName.substring(unlocalizedName.indexOf(".") + 1)%(#cc7832)[;
    ] }
    }
    

    à quoi vont nous servir ces méthodes ? C'est assez simple :
    Les deux premières vont nous permettre de nommer notre item de façon plus "personnelle". En fait, quand on crée un item, son nom unlocalized va être "item.nom_de_l'item.name". Ce qu'on fait avec ces deux méthodes, c'est qu'en gros, on va lui dire d'écraser la méthode toute moche de Minecraft et mettre la notre, qui sera qu'un item sera nommé "item.tutoriel:nomItem.name"
    L'avantage de direz-vous ? Eh bien déjà, on voit le nom du mod automatiquement quand on regarde le nom non-localisé. L'autre avantage, c'est que dans notre classe d'item, on aura juste à rentrer un setUnlocalizedName("itemTutoriel"); pour que l'item se nomme "item.tutoriel:itemTutoriel.name".

    Le second avantage vient avec la troisième méthode, "registerIcons". Que fait cette méthode ? En gros, elle va nous permettre (sans rentrer dans de l'explication longue et hasardeuse) de déclarer l'emplacement de notre texture selon le nom localisé de l'objet. Autrement dit, si vous avez déclaré dans votre classe d'item que son nom c'est "itemTutoriel", alors automatiquement, la texture de l'item sera "itemTutoriel.png".

    La dernière méthode est utilisée pour créer la première, je vous avouerai que j'y comprend pas grand chose, mais au moins ça a le mérite de fonctionner tout seul !

    Regardons maintenant dans notre classe "itemTutoriel".

    [size=smallpackage ]fr.shadcanard.tutoriel.item%(#cc7832)[;
    ]
    import fr.shadcanard.tutoriel.item.TutorielItem%(#cc7832)[;
    ]
    public class ItemBattleAxe extends TutorielItem {
    public ItemQuelconque()
    {
    super()%(#cc7832)[;
    ] this.setUnlocalizedName("itemQuelconque")%(#cc7832)[;
    ] }
    }
    
    

    Voilà ce qui doit être dans notre classe. En gros, au lieu d'étendre les fonctions de Item avec tout les trucs, on les remplit déjà dans un truc commun et on fait un extends de cette classe-fille afin "d'importer" nos modifications.
    De la même façon en faisant notre item dans la classe principale, on pourrait simplement avoir à mettre par exemple

    ​public static TutorielItem itemQuelconque;
    
    itemQuelconque = new Itemquelconque().setUnlocalizedName("itemQuelconque");
    

    Et c'est tout. Un coup de registerItem derrière et votre item est tout prêt à être lancé dans le monde, avec sa petite texture auto-déclarée et étant dans " textures/items/itemQuelconque " !

    Un avantage, c'est que par exemple, si on veut tout enregistrer d'un coup et automatiquement dans un onglet créatif, il suffit d'entrer cette ligne en dessous du super(); de notre classe TutorielItem :

    ​this.setCreativeTab(CreativeTab.misc);
    

    ou bien de renvoyer comme vous le feriez à votre Tab créatif avant. Du coup, à chaque fois qu'un item sera créé, il sera ajouté automatiquement à la tab créative, du moment que vous faites un extends sur "TutorielItem" et pas sur "Item".

    Pour ce qui est des blocs, il suffit théoriquement de remplacer "extends Item" dans notre classe "TutorielItem" par un "extends Block" (Et par là même pouvoir dire de quel matériel est fait le bloc aussi, de façon automatique, si vous voulez que tout vos blocs aient le même son en marchant dessus)

    Voilà, si il y a d'autres questions, n'hésitez pas, j'essaierai de vous aider du mieux que je peux !
    ShadCanard


  • Administrateurs

    Coucou shadt ^^
    C'est gentil du partage, mais en fait ton tutoriel est un peu inutile x)
    En fait il suffit de faire un .setTextureName("modid:texture").setUnlocalizedName("nom") et on peut utiliser la même classe pour tous les items ^^



  • Très bon tuto ! Pratique pour faire des item de base !



  • Bah c'est surtout que c'est une méthode de fainéant pour éviter de taper 50 fois ton .setTextureName("modid:texture") et ton .setCreativeTab() (et tout ce que tu peux rentrer comme paramètres qui sont communs à tout tes items/blocs ou presque)



  • Beh pour faire des items sans utilités comme ceux que j'ai créé par nécessité c'est utile ,.