Potion incurable



  • Bonjour,

    je me pose une question est-ce que c'est possible de faire en sorte que un effet de potion ne puisse pas être enlever avec un seau de lait?


  • Administrateurs

    PotionEffect effect = new PotionEffect(id, durée, amplificateur);
    effect.getCurativeItems().clear();
    player.addPotionEffect(effect);
    


  • On utilise ça dans la classe ou on ajoute les effet?

    ou dans le living event?



  • Dans le Living Event



  • if (event.entityLiving.isPotionActive(ViruZEffect.Dependance))
    {
    ViruZEffect effect = new ViruZEffect(id, durée, amplificateur);
    effect.getCurativeItems().clear();
    player.addPotionEffect(effect);
    comme ça dans l'idée? parce que j ai pas le getCurrativeItem 😕



  • la classe ViruZEffect

    package virusz.miscellaneous;
    
    import java.awt.Color;
    
    import net.minecraft.potion.Potion;
    
    public class ViruZEffect extends Potion {
    public static ViruZEffect bleeding;
    public static int bleedingID;
    public static ViruZEffect fracture;
    public static int fractureID;
    public static ViruZEffect adrenaline;
    public static int adrenalineID;
    public static ViruZEffect Dependance;
    public static int DependanceID;
    public static ViruZEffect Drogue;
    public static int DrogueID;
    public static ViruZEffect Manque;
    public static int ManqueID;
    
    public ViruZEffect(int id, boolean isBadEffect, int color, String name) {
    super(id, isBadEffect, color);
    setPotionName("potion." + name);
    }
    
    @Override
    public ViruZEffect setIconIndex(int x, int y) {
    super.setIconIndex(x, y);
    return this;
    }
    
    public static void loadEffects() {
    bleeding = new ViruZEffect(bleedingID, true, Color.red.getRGB(), "bleeding").setIconIndex(4, 2);
    fracture = new ViruZEffect(fractureID, true, Color.white.getRGB(), "fracture").setIconIndex(5, 2);
    adrenaline = new ViruZEffect(adrenalineID, true, Color.blue.getRGB(), "adrenaline").setIconIndex(6, 2);
    Dependance = new ViruZEffect(DependanceID, true, Color.TRANSLUCENT, "Dependance").setIconIndex(7, 2);
    Drogue = new ViruZEffect(DrogueID, true, Color.TRANSLUCENT, "Drogue").setIconIndex(8, 2);
    Manque = new ViruZEffect(ManqueID, true, Color.TRANSLUCENT, "Manque").setIconIndex(9, 2);
    }
    
    public static void register() {
    Potion.potionTypes[bleeding.getId()] = bleeding;
    Potion.potionTypes[fracture.getId()] = fracture;
    Potion.potionTypes[adrenaline.getId()] = adrenaline;
    Potion.potionTypes[Dependance.getId()] = Dependance;
    Potion.potionTypes[Drogue.getId()] = Drogue;
    Potion.potionTypes[Manque.getId()] = Manque;
    }
    }
    

  • Administrateurs

    Tu confonds Potion et PotionEffect. Ce sont deux choses différentes.
    Le code que je t'ai donné doit être utilisé là ou tu appliques l'effet. Dans ton cas ça sera :
    PotionEffect effect = new PotionEffect(ViruZEffect.bleeding.getId(), durée, amplificateur);
    effect.getCurativeItems().clear();
    player.addPotionEffect(effect);

    ViruZEffect devrait plutôt être nommé ViruZPotions pour éviter toutes confusion.



  • ok le probleme c'est que si le joueur deco/reco alors que l'effet est appliquer il peut utiliser un seau de lait parce que le premier effet est ajouter par un item 😕 il y a un moyen pour que tout les effets créé soit incurable?



  • j ai trouver suffit d'ajouter:

    public class Effect extends PotionEffect {
    
     public Effect(int potionID, int duration, int amplifier) {
       super(potionID, duration, amplifier);
    //toutes les potion créé sont incurable
       this.getCurativeItems().clear();
     }
    }
    

    Mais le joueur peut toujours se clear si il deco reco T_T


  • Administrateurs

    Dans ce cas dans un event de tick de joueur tu parcours la liste de tous les effets de potions qu'a le joueur et si l'effet est le tient tu clear la liste des CurativeItems



  • On enregistre bien l'event player tick comme ca?

    MinecraftForge.EVENT_BUS.register(new PlayerEventTick());
    dans le init?

    parce que j'ai aucun effet a mon event j'ai mis des print partout c est comme si l event était pas la

    public class PlayerEventTick {
    VirusZEffect effect;
    @SubscribeEvent
    public void onPlayerTick(PlayerTickEvent e){
    System.out.println("test");
    if(e.player.isPotionActive(VirusZPotion.Drogue)){
    effect.getCurativeItems().clear();
    System.out.println("test");
    }
    else if(e.player.isPotionActive(VirusZPotion.Dependance)){
    effect.getCurativeItems().clear();
    System.out.println("test");
    
    }
    else if(e.player.isPotionActive(VirusZPotion.Manque)){
    effect.getCurativeItems().clear();
    System.out.println("test");
    }
    }
    }
    
    

  • Administrateurs

    PlayerTickEvent est un event de fml, donc FMLCommonHandler.instance().bus().register(new PlayerEventTick());
    Par contre ton code n'est pas bon, tu vas te manger un NPE.
    J'aurai plutôt fait comme ça :

    public class PlayerEventTick {
        @SubscribeEvent
        public void onPlayerTick(PlayerTickEvent e)
        {
            Iterator it = e.player.getActivePotionEffects().iterator();
            while(it.hasNext())
            {
                PotionEffect p = (PotionEffect)it.next();
                if(p.getPotionID() ==VirusZPotion.Drogue.getId() || p.getPotionID() == VirusZPotion.Dependance || p.getPotionID() == VirusZPotion.Manque)
                {
                    p.getCurativeItems().clear();
    
                }
            }
        }
    
    }
    


  • ça fonctionne merci 😃