• Bonjour,

    J'ai donc un mod 1.10.2 avec Forge et j'ai un problème : j'ai crée un système d'effets de potions que le joueur obtient quand il porte l'armure complète, ce système marche bien depuis la 1.7.10 mais depuis la 1.9 et maintenant en 1.10.2 il ne marche qu'en solo. Lorsque le joueur s'équipe d'une pièce d'armure faisant partie d'un "set" éligible à un effet de potion, le joueur crash et ne peut plus revenir sur le serveur.

    Logs serveur : http://pastebin.com/gnmDSgxj

    Code :

    package fr.zeiyo.zeiyocraft.item;
    
    import fr.zeiyo.zeiyocraft.crafting.ZCraftingUtils;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.inventory.EntityEquipmentSlot;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemArmor;
    import net.minecraft.item.ItemStack;
    import net.minecraft.potion.Potion;
    import net.minecraft.potion.PotionEffect;
    import net.minecraft.world.World;
    
    public class ZItemArmor extends ItemArmor
    
    {
    
        protected int id;
    
        public ZItemArmor(String unlocalizedName, ArmorMaterial material, int renderIndex, EntityEquipmentSlot armorType, int nmb) {
            super(material, renderIndex, armorType);
            this.setUnlocalizedName(unlocalizedName);
            this.setRegistryName(unlocalizedName);
            this.isRepairable();
            this.id = nmb;
        }    
    
        @Override
        public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack){
    
        if (this.isWearingFullSet(player, ZeiyoItems.onyxHelmet, ZeiyoItems.onyxChestplate, ZeiyoItems.onyxLeggings, ZeiyoItems.onyxBoots)) 
    {
    this.effectPlayer(player, Potion.getPotionById(22), 0, 600);
    }
    if (this.isWearingFullSet(player, ZeiyoItems.rubyHelmet, ZeiyoItems.rubyChestplate, ZeiyoItems.rubyLeggings, ZeiyoItems.rubyBoots)) 
    {
    this.effectPlayer(player, Potion.getPotionById(12), 0, 50);
    }
    if (this.isWearingFullSet(player, ZeiyoItems.sapphireHelmet, ZeiyoItems.sapphireChestplate, ZeiyoItems.sapphireLeggings, ZeiyoItems.sapphireBoots)) 
    {
    this.effectPlayer(player, Potion.getPotionById(13), 0, 50);
    }
        }
    
    private void effectPlayer(EntityPlayer player, Potion potion, int amplifier, int duration)
    {
    if (player.getActivePotionEffect(potion) == null || player.getActivePotionEffect(potion).getDuration() <= 1)
    player.addPotionEffect(new PotionEffect(potion , duration, amplifier, false, false));
    }
    
    private boolean isWearingFullSet(EntityPlayer player, Item helmet, Item chestplate, Item leggings, Item boots) 
    {
    return player.inventory.armorItemInSlot(3) != null && player.inventory.armorItemInSlot(3).getItem() == helmet
    && player.inventory.armorItemInSlot(2) != null && player.inventory.armorItemInSlot(2).getItem() == chestplate
    && player.inventory.armorItemInSlot(1) != null && player.inventory.armorItemInSlot(1).getItem() == leggings
    && player.inventory.armorItemInSlot(0) != null && player.inventory.armorItemInSlot(0).getItem() == boots;
    }
    
        @Override
        public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) {
            return ZCraftingUtils.getRepairItem(id) == repair.getItem() ? true : super.getIsRepairable(toRepair, repair);
        }
    }
    

    Le mod comportait aussi des chaises mais je les ai provisoirement enlevées car elle me pose le même problème elles marchaient très bien et depuis la 1.9 elles ne fonctionnent plus sur les serveurs à cause encore une fois d'une erreur TickingEntity

    En espérant qu'on trouve une solution et merci d'avance 🙂


  • Apparement le serveur ne reconnait pas la fonction player.inventory.armorItemInSlot(…), tu as bien la même version sur eclipse que sur ton serveur ?


  • Oui étant donné que le serveur que j'utilise dans ces logs est celui présent avec le MDK forge (runServer) ^^
    Et ce problème arrive aussi sur tous les autres serveurs que j'ai testé (j'utilise sur tous forge 1.10.2 - 12.18.1.2011)


  • Fais shift clic sur la fonction et regarde si elle n'aurait pas un @SideOnly(Side.CLIENT) par hasard.


  • Shift+Clic ne marche pas chez moi mais si c'est pour accéder à la fonction "mère" elle n'as pas de SideOnly (elle se trouve dans Item)

    /**

    • Called to tick armor in the armor slot. Override to do something
      */
      public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack){}

  • Je ne parles pas de onArmorTick mais de la fonction qui fait le crash, armorItemInSlot(…) dans InventoryPlayer.

  • Moddeurs confirmés Rédacteurs Administrateurs

    C'est ctrl + clic.
    Et en effet la fonction est seulement dispo en client :

    @SideOnly(Side.CLIENT)
    public ItemStack armorItemInSlot(int slotIn)
    {
    return this.armorInventory[slotIn];
    }
    

    Mais comme armorInventory est public le problème est vite contourné.


  • En effet la fonction est bien côté client, bizarre
    Du coup je me demande bien comment je vais pouvoir implementer ça sur serveur, je vais chercher une autre fonction

    OK en effet j'y ai même pas pensé …


  • Ah oui en effet je me suis trompé (quelques jours sans eclipse et j'oublie déjà ça xD).