Créer des effets de potions



  • Sommaire

    Introduction

    Yellow à tous ! Je reviens parmi vous pour vous faire un petit tutoriel fort sympathique !
    Et ce, pour créer des effets de potions customs ! Et seulement des effets de potion, pas la potion !
    Bonne lecture !

    Pré-requis

    Code

    Classe CustomPotion :

    Commençons par créer la classe CustomPotion.java que nous extendrons Potion.java
    Et voilà ce que ça nous donne:

    import net.minecraft.potion.Potion;
    
    public class CustomPotion extends Potion {
    
        protected CustomPotion(int p_i1573_1_, boolean p_i1573_2_, int p_i1573_3_){
            super(p_i1573_1_, p_i1573_2_, p_i1573_3_);
        }
    }
    

    Vu que p_i1573_1_, p_i1573_2_, p_i1573_3_ a relativement un effet vomitif sur mes yeux nous allons changer ça en ID, isBadEffectOrNot, color

    Ce qui sera tout de suite plus lisible et plus compréhensible

    import net.minecraft.potion.Potion;
    
    public class CustomPotion extends Potion{
        protected CustomPotion(int id, boolean isBadEffectOrNot, int color, String name) {
            super(id, isBadEffectOrNot, color);
        }
    }
    

    Dans le constructeur ajoutons la fonction pour définir le nom de nos futurs effets de potions !
    Voilà pourquoi le petit String name est parmi nous, pour nous simplifier la vie !

    this.setPotionName("potion." + name);
    

    Ensuite dans la classe il va falloir rajouter 3 fonctions, qui sont les suivantes:

    @Override
    public CustomPotion setIconIndex(int x, int y) 
    {
        super.setIconIndex(x, y);
        return this;
    }
    
    public static void loadEffects()
    {
    
    }
    
    public static void register() 
    {
    
    }
    

    Bien, passons maintenant au vif du sujet en ce qui concerne la création de nos effets de potions !

    Entre le constructeur et le début de la classe il nous faut déclarer deux choses:

    • L'effet de potion
    • L'ID de ce dernier

    Pour ce faire rien de plus simple !

        public static CustomPotion customEffect;
    public static int customEffectID;
    

    Ces deux petits bouts de lignes nous servent à créer la potion en elle même (elle est prête à être créée à ce stade) et l'autre à lui définir un ID

    Passons à la deuxième fonction "loadEffects()"

    et ajoutons ce code que je vous ai préparé !

    customEffect = new CustomPotion(customEffectID, true, Color.red.getRGB(), "customEffectDeFifou").setIconIndex(4, 2);
    

    Et expliquons tout ça !
    D'une certaine manière cela ressemble à la création d'un bloc ou d'un objet basique ! C'est cool non ?

    customEffectID = l'ID de notre effet de potion
    true = (isBadEffectOrNot) traduction Malus ou Bonus ?
    ici c'est un Malus en true et si c'est false c'est un Bonus !
    La différence entre les deux ? À vous de voir ! Tout le reste passe par des events !
    Color.red.getRGB() = La couleur des particules de potion une fois sur vous
    "customEffectDeFifou" = Le nom de la potion dans l'inventaire (L'effet toujours ! Nous ne créons pas d'item potion !)
    .setIconIndex(4, 2); = Ajoute une petit icône à votre effet de potion, pour ce faire il faut modifier l'image "inventory.png" qui ce trouve dans la version de minecraft .jar "assets/gui/inventory.png"
    Moi je fait comme ça en tout cas, il y a sans doute une autre solution, mais je ne la connais pas 😕

    Et pour "terminer" dans la classe CustomPotion il faut enregistrer notre potion !

    Allez dans la fonction "register()" et ajoutez

    CustomPotion.potionTypes[customEffect.getId()] = customEffect;
    

    Pour faire simple:

    On get le type de potion que nous avons fait, plus précisément sont ID (/!\ Pas customEffectID nous ne l'avons pas définie encore), puis on l'attribue à notre effet de potion !

    Et nous avons terminé la partie où nous créons notre effet de potion !
    Mais il manque 2 / 3 trucs encore ! Et il faut aller dans la classe principale !

    Classe Principale :

    Bien, définissons un ID à notre potion !

    Dans la fonction "preInit" (Pré-Initialisation), ajoutez ceci:

    CustomPotion.customEffectID = 30;

    Il faut que l'ID soit supérieur à 24 et inférieur à 32 sinon votre jeu crashera !
    Ce qui vous laisse la possibilité de créer ......8 effets de potions...

    C'est NUL ! REMBOURSÉ ! REMBOURSÉ !

    Petite aparté...

    La classe Potion.java est comme l'ancienne classe Block.java il faut passer par des ID pour créer notre effet, mais, car il y a toujours un MAIS, seulement 32 slots sont réservés pour les potions ! Ce qui nous laisse pas énormément de possibilités !
    La seule solution serait de passer par l'ASM et de modifier cette valeur, mais là encore je ne suis pas sûr de mes dires !
    A confirmer...

    Il vous faut encore ajouter deux choses !
    Dans la fonction "init" (Initialisation)

        CustomPotion.loadEffects();
    CustomPotion.register();
    

    Et voilà notre effet de potion est prêt ! Mais le mieux est de faire en sorte que si notre effet est actif par exemple notre joueur aille plus vite ? Et pour faire ce genre de modification sur le joueur, moi je passe par les events !

    Bonus

    Comment faire pour que notre joueur aille plus vite si il a l'effet de potion actif ?

    GROS INDICE:

    if(event.entityLiving instanceof EntityPlayer)
    {
        if (event.entityLiving.isPotionActive(BOTIEffect.superPowersFlash))
        {
            if (event.entityLiving.getActivePotionEffect(BOTIEffect.superPowersFlash).getDuration() == 0)
            {
                event.entityLiving.removePotionEffect(BOTIEffect.superPowersFlash.id);
                return;
            }
            if (event.entityLiving.worldObj.isRemote)
            {
                if(event.entityLiving.onGround)
                {
                    event.entityLiving.motionX *= 1.6F;
                    event.entityLiving.motionZ *= 1.6F;
                }
            }
        }
    }
    

    Je ne vous dirais pas quel event utiliser, car là j'en ai trop dit ! À vous de trouver !

    Résultat

    Fichiers .lang

    en_US.lang:

    potion.customEffectDeFifou=Custom Effect
    

    fr_FR.lang:

    potion.customEffectDeFifou=Effet Custom
    

    Dans l'inventaire :

    Les particules sont rouges :

    Crédits

    Rédaction :

    Correction :

    Creative Commons
    Ce tutoriel de Minecraft Forge France est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International

    retourRetour vers le sommaire des tutoriels



  • Tu ne développe pas assez, je te demande une chose dure mais pourquoi pas montrer les craft de potion (j'ai mis au moins un mois a comprendre c'est très dure) ? Et développer un peux avec les attributs… Sinon très bon tutoriel et quand je dit développer je veux dire montrer comment changé des attributs, modifier la vue... Et il y a deux ou trois autre fonction cool, si tu peux les expliquer.



  • Sauf erreur de ma part, il a écrit que ce n'est que les effets de potion, pas les potions en elles-mêmes 😉



  • les modifications de l'ath sont provoquer par l'effet de la potion d’après mon point de vue



  • @'Fine33':

    Sauf erreur de ma part, il a écrit que ce n'est que les effets de potion, pas les potions en elles-mêmes 😉

    Oui ce n'est que les effets de potions car je trouve que cela reste simple de créer un item potion et de faire en sorte d'addPotionEffect

    Envoyé depuis mon Android edition by sfr STARADDICT avec Tapatalk



  • Oui, je répondais à Diangle 😉



  • tu peut le faire en partie bonus sa fait plus de contenu



  • Je trouves pas pour le bonus.. Help Please



  • Up, tu peux dire comment rajouter des effets autres que speed par exmple pour fusionner 2 effets de potion sous un autre nom etc.. Ou comment créer des effets completement customs ?



  • #event tu mes un if(l effet est actif) et tu fais ce que tu veux a l intérieur c est pas sorcier !



  • Je peux débuter non ?



  • @'sosoh':

    Je peux débuter non ?

    Bah Va voir un tuto sur java car c'est la base



  • @'pulganr':

    @'sosoh':

    Je peux débuter non ?

    Bah Va voir un tuto sur java car c'est la base

    Mais je ne maitrise pas les events encore c'est pour ca.. D'ailleurs j'ai toujours pas trouvé.. Je cherche dans toutes les classes des events mais je ne trouves pas l'event pour savoir si un joueur a un effet de potion..



  • Tu peux m'aider, j'ai créer une classe avec mon event:

    package com.harrypotter.sosoh.common;
    
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.entity.player.EntityPlayerMP;
    import cpw.mods.fml.common.gameevent.TickEvent;
    import cpw.mods.fml.common.gameevent.TickEvent.Phase;
    import cpw.mods.fml.common.gameevent.TickEvent.Type;
    import cpw.mods.fml.relauncher.Side;
    
    public class EventHandler {
    
        public static class PlayerTickEvent extends TickEvent {
            public final EntityPlayer player;
    
            public PlayerTickEvent(Phase phase, EntityPlayer player)
            {
                super(Type.PLAYER, player instanceof EntityPlayerMP ? Side.SERVER : Side.CLIENT, phase);
                this.player = player;
            }
        }
    }
    

    Mais je ne trouves pas comment checker si le joueur a mon effet.. J'ai essaye avec ca mais ca ne marche pas:

    package com.harrypotter.sosoh.common;
    
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.entity.player.EntityPlayerMP;
    import cpw.mods.fml.common.gameevent.TickEvent;
    import cpw.mods.fml.common.gameevent.TickEvent.Phase;
    import cpw.mods.fml.common.gameevent.TickEvent.Type;
    import cpw.mods.fml.relauncher.Side;
    
    public class EventHandler {
    
        public static class PlayerTickEvent extends TickEvent {
            public final EntityPlayer player;
    
            public PlayerTickEvent(Phase phase, EntityPlayer player)
            {
                super(Type.PLAYER, player instanceof EntityPlayerMP ? Side.SERVER : Side.CLIENT, phase);
                this.player = player;
                if player.getActivePotionEffect(SomniferePotionEffect){
    
                }
            }
        }
    }
    


  • S'il vous plait je galere je ne trouves pas 😢



  • C est cette ligne

    1. if (event.entityLiving.isPotionActive(BOTIEffect.superPowersFlash))


  • Ah ok merci! J'etais bloqué et tu me rend extrêmement service 🙂


  • Administrateurs

    Déjà tu devais lire le tutoriel sur les event car le code que tu as mit ne risque pas du tout de fonctionner …
    Et 24h entre chaque message, merci de respecter le règlement.



  • J'ai mis le code, suivis le tuto sur les events mais je ne sais pas par quoi remplacer 

    J'ai remplacer BOTIEffect par SomniferePotionEffect, mais pour le superPowersFlash je ne sais pas quoi mettre car sinon ca fais une erreur..

    Et la j'ai pas besoin d'attendre 24h pour répondre non ? Car tu as mis un message toi non?


  • Administrateurs

    Oui, 24h entre deux posts de la même personne, dans l'autre cas il suffit d'éditer le message …
    C'est presque la même règle sur tous les forums, ça évite le spam.

    Logiquement tu mets ClassOuSeTrouveLaDeclarationDeLaPotion.nomDuField
    ça c'est la base en Java, il faut l'apprendre (il y a un bon tutoriel sur OpenClassRoom) sinon tu n'arrivera à rien.