Effets de potions qui ne disparaissent pas



  • C'est encore moi,

    J'ai maintenant un autre problème, toujours avec mes papillotes, cette fois-ci on admet que ma papillote me donne un morceau de chocolat moisi. Celui-ci est censé me donné des effets négatifs quand je le mange. C'est ce qu'il fait, mais il y a 2 problèmes :

    il arrive d'avoir 2effets en même temps quand je le mange, et les effets ne disparaissent pas tous le temps, il restent pour certains afficher dans l'inventaire.

    Voici ma classe :

    package fr.cloudcommunity.fiesta.common;
    
    import net.minecraft.client.renderer.texture.IIconRegister;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.ItemFood;
    import net.minecraft.item.ItemStack;
    import net.minecraft.potion.Potion;
    import net.minecraft.potion.PotionEffect;
    import net.minecraft.world.World;
    
    public class Morceau_chocolat extends ItemFood
    {
    
    @Override
    public void registerIcons(IIconRegister iconregister)
    {
    this.itemIcon = iconregister.registerIcon(ModFiesta.MODID + ":morceau_chocolat");
    //Défini son icone
    }
    
    public Morceau_chocolat()
    {
    super(5,false); // D'abord combien de demi-gigot ça rend + si c'est de la bouffe pour les loups
    this.setCreativeTab(ModFiesta.FiestaMod);
    }
    
    public ItemStack onEaten(ItemStack ItemStack, World World, EntityPlayer EntityPlayer)
    {
    int random = (int)(Math.random()*9);
    switch(random){
    case 1:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.regeneration.id, 60, 1)); //Durée de l'effet en tick (20tick = 1s) puis niveau de l'effet(Avec amplificateur de 0, la potion sera de niveau 1\. Avec un amplificateur de 1, la potion sera de niveau 2\. L'amplificateur monte jusqu'à 4, au-delà le niveau de la potion ne s'affiche plus en jeu.)
    break;
    case 2:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.nightVision.id, 60, 1));
    break;
    case 3:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.fireResistance.id, 60, 1));
    break;
    case 4:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.heal.id, 60, 1));
    break;
    case 5:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.waterBreathing.id, 60, 1));
    break;
    case 6:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 60, 1));
    break;
    case 7:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.jump.id, 60, 1));
    break;
    case 8:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.digSpeed.id, 60, 1));
    break;
    case 9:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.resistance.id, 60, 1));
    break;
    default:
    break;
    }
    
    System.out.println(random + "");
    ItemStack.stackSize –;
    return ItemStack;
    
    }
    
    }
    
    

    Voilà, et je ne comprends pas d'où vient le problème.
    Merci d'avance aux personnes qui prendront du temps pour me répondre.



  • Il me semble que les niveaux de potions sont 1-2-3-4 et pas 0-1-2-3
    Ensuite remplace (int)(Math.random()*9) par new Random().nextInt(9)+1


  • Administrateurs

    Le problème c'est que tu fais l'effet sur les deux sides (client et serveur)
    Mets tout le code dans une condition : if(!World.isRemote) ça devrait régler le problème.



  • Alors, dans l'ordre, j'ai essayé ça :

    package fr.cloudcommunity.fiesta.common;
    
    import java.util.Random;
    
    import net.minecraft.client.renderer.texture.IIconRegister;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.ItemFood;
    import net.minecraft.item.ItemStack;
    import net.minecraft.potion.Potion;
    import net.minecraft.potion.PotionEffect;
    import net.minecraft.world.World;
    
    public class Morceau_chocolat_moisi extends ItemFood
    {
    
    @Override
    public void registerIcons(IIconRegister iconregister)
    {
    this.itemIcon = iconregister.registerIcon(ModFiesta.MODID + ":Morceau_chocolat_moisi");
    //Défini son icone
    }
    
    public Morceau_chocolat_moisi()
    {
    super(2,false); // D'abord combien de demi-gigot ça rend + si c'est de la bouffe pour les loups
    this.setCreativeTab(ModFiesta.FiestaMod);
    
    }
    
    public ItemStack onEaten(ItemStack ItemStack, World World, EntityPlayer EntityPlayer)
    {
    if(!World.isRemote){
    
    int random = (int)(Math.random()*9);
    switch(random){
    case 1:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.blindness.id, 60, 1)); //Durée de l'effet en tick (20tick = 1s) puis niveau de l'effet(Avec amplificateur de 0, la potion sera de niveau 1\. Avec un amplificateur de 1, la potion sera de niveau 2\. L'amplificateur monte jusqu'à 4, au-delà le niveau de la potion ne s'affiche plus en jeu.)
    break;
    case 2:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.confusion.id, 60, 1));
    break;
    case 3:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 60, 1));
    break;
    case 4:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.hunger.id, 60, 1));
    break;
    case 5:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 60, 1));
    break;
    case 6:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.poison.id, 60, 1));
    break;
    case 7:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.invisibility.id, 60, 1));
    break;
    case 8:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.weakness.id, 60, 1));
    break;
    case 9:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.wither.id, 60, 1));
    break;
    default:
    break;
    }
    ItemStack.stackSize –;
    return ItemStack;
    }
    
    }
    
    }
    
    

    Puis j'ai essayé ça :

    package fr.cloudcommunity.fiesta.common;
    
    import java.util.Random;
    
    import net.minecraft.client.renderer.texture.IIconRegister;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.ItemFood;
    import net.minecraft.item.ItemStack;
    import net.minecraft.potion.Potion;
    import net.minecraft.potion.PotionEffect;
    import net.minecraft.world.World;
    
    public class Morceau_chocolat_moisi extends ItemFood
    {
    
    @Override
    public void registerIcons(IIconRegister iconregister)
    {
    this.itemIcon = iconregister.registerIcon(ModFiesta.MODID + ":Morceau_chocolat_moisi");
    //Défini son icone
    }
    
    public Morceau_chocolat_moisi()
    {
    super(2,false); // D'abord combien de demi-gigot ça rend + si c'est de la bouffe pour les loups
    this.setCreativeTab(ModFiesta.FiestaMod);
    
    }
    
    public ItemStack onEaten(ItemStack ItemStack, World World, EntityPlayer EntityPlayer)
    {
    if(!World.isRemote){
    
    int random = new Random().nextInt(9)+1;
    switch(random){
    case 1:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.blindness.id, 60, 1)); //Durée de l'effet en tick (20tick = 1s) puis niveau de l'effet(Avec amplificateur de 0, la potion sera de niveau 1\. Avec un amplificateur de 1, la potion sera de niveau 2\. L'amplificateur monte jusqu'à 4, au-delà le niveau de la potion ne s'affiche plus en jeu.)
    break;
    case 2:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.confusion.id, 60, 1));
    break;
    case 3:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 60, 1));
    break;
    case 4:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.hunger.id, 60, 1));
    break;
    case 5:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 60, 1));
    break;
    case 6:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.poison.id, 60, 1));
    break;
    case 7:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.invisibility.id, 60, 1));
    break;
    case 8:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.weakness.id, 60, 1));
    break;
    case 9:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.wither.id, 60, 1));
    break;
    default:
    break;
    }
    }
    
    }
    
    }
    
    

    Et enfin j'ai essayé ça :

    package fr.cloudcommunity.fiesta.common;
    
    import java.util.Random;
    
    import net.minecraft.client.renderer.texture.IIconRegister;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.ItemFood;
    import net.minecraft.item.ItemStack;
    import net.minecraft.potion.Potion;
    import net.minecraft.potion.PotionEffect;
    import net.minecraft.world.World;
    
    public class Morceau_chocolat_moisi extends ItemFood
    {
    
    @Override
    public void registerIcons(IIconRegister iconregister)
    {
    this.itemIcon = iconregister.registerIcon(ModFiesta.MODID + ":Morceau_chocolat_moisi");
    //Défini son icone
    }
    
    public Morceau_chocolat_moisi()
    {
    super(2,false); // D'abord combien de demi-gigot ça rend + si c'est de la bouffe pour les loups
    this.setCreativeTab(ModFiesta.FiestaMod);
    
    }
    
    protected void onFoodEaten(ItemStack ItemStack, World World, EntityPlayer EntityPlayer)
    {
    if(!World.isRemote){
    
    int random = World.rand.nextInt(8)+1;
    switch(random){
    case 1:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.blindness.id, 60, 1)); //Durée de l'effet en tick (20tick = 1s) puis niveau de l'effet(Avec amplificateur de 0, la potion sera de niveau 1\. Avec un amplificateur de 1, la potion sera de niveau 2\. L'amplificateur monte jusqu'à 4, au-delà le niveau de la potion ne s'affiche plus en jeu.)
    break;
    case 2:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.confusion.id, 60, 1));
    break;
    case 3:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 60, 1));
    break;
    case 4:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.hunger.id, 60, 1));
    break;
    case 5:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 60, 1));
    break;
    case 6:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.poison.id, 60, 1));
    break;
    case 7:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.invisibility.id, 60, 1));
    break;
    case 8:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.weakness.id, 60, 1));
    break;
    case 9:
    EntityPlayer.addPotionEffect(new PotionEffect(Potion.wither.id, 60, 1));
    break;
    default:
    break;
    }
    }
    
    }
    
    }
    
    

    Au final ces trois solutions arrivent au même résultat :
    -C'est à dire que oui les effets disparaissent à tous les coups.
    -Cependant 1fois sur 10 je chope encore 2 effets de potions, ils apparaissent l'un après l'autre, mais les deux sont actifs en même temps quand même...

    Donc bon, ceci est-il réparable ?


  • Administrateurs

    switch(World.rand.nextInt(9)
    Et commence à 0 à la place de 1.



  • Fait, et le soucis est le même 😞



  • La deuxième solution avec la modification proposée par Robin à l'air d'être la bonne. Ajoute un @Override, on ne sait jamais



  • En fait cela est vraiment bizarre. J'ai l'impression que l'erreur ne vient pas de mon code, mais du jeu en lui même.
    Le fait que 1fois sur 10 j'ai 2 effets au lieu d'un est étrange.
    Faudrait tester avec un mod vierge pour voir, un item mangeable qui te donne des effets et c'est tout, juste pour voir si le problème persiste.
    Je ferai peut-être cela plus tard, je posterai à l'occasion dans ce sujet les résultats 😉

    En tout cas j'aime bien ce forum très réactif, je reviendrai surement poser mes autres problèmes, peut-être qu'à force de me les corriger je n'en ferai plus 😉

    Aller, et un +1 pour vous deux !



  • Ce bug doit sûrement être dû à un lag ou un problème de synchronisation client/serveur