Je crée de la nourriture périssable dans le temps, un seul détails coince (help)



  • Alors voila je crée de la nourriture périssable dans mon Mod et je me heurt a un seul pb c'est que une fois que ma "viande" est périmé l'item ne se delete pas

    sur la photo a gauche l'item est périmé a max mais il n'est pas delete et a droite c'est encore en cours.( voir miniature en bas)

    aux niveau du code j'ai simplifier pour l'instant sans la gestion du temps exacte car c'est second.

    
    public class itemFood extends ItemFood
    {
    
    public itemFood(int p_i45340_1_, boolean p_i45340_2_) {
    super(p_i45340_1_, p_i45340_2_);
    this.setMaxDamage(20);
    }
    
    public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean par5)
    {
    if(stack.getItemDamage() == 20)
    {
    stack.maxStackSize = 1;
    }else if(stack.getItemDamage() < 20 ){
    stack.setItemDamage(stack.getItemDamage() +1);
    }else{
    stack.setItemDamage(0);
    }
    
    }
    
    


  • Et c'est où que tu le supprimes ?
    Mets stack = null;
    Là, tu mets le nombre d'items maximum du stack à 1.
    Et puis lis la convention Java, trop de gens ne la respectent pas 😞


  • Administrateurs

    Il faut mettre l'item sur null. par4 est l'emplacement dans l'inventaire il me semble.
    tu check si entity est d'instanceof EntityPlayer si oui tu récup l'inventaire et tu fais un setStackInSlot(par4, null):



  • merci pour vos réponse à tous les deux, j'ai testé au mieux se que vous m'avais dit mais sa ne marche toujours pas : la c'est un exemple de se que j'ai essayer sans avoir d'erreur. j'ai toujours l'item dans mon inventaire.

    public class itemFood extends ItemFood
    {
    
    public itemFood(int p_i45340_1_, boolean p_i45340_2_) {
    super(p_i45340_1_, p_i45340_2_);
    this.setMaxDamage(20);
    this.setMaxStackSize(16);
    }
    
    public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean par5)
    {
    if(stack.getItemDamage() == 20)
    {
    stack = null;
    }else if(stack.getItemDamage() < 20 ){
    
    stack.setItemDamage(stack.getItemDamage() +1);
    
    }else if(entity instanceof EntityPlayer) {
    ((EntityPlayer)entity).inventory.setInventorySlotContents(0, null);
    
    //stack.setItemDamage(0);
    
    }
    
    }
    }
    

  • Administrateurs

    ((EntityPlayer)entity).inventory.setInventorySlotContents(0, null);
    ->
    ((EntityPlayer)entity).inventory.setInventorySlotContents(par4, null);

    J'aime quand on m'écoute.
    @'robin4002':

    Il faut mettre l'item sur null. par4 est l'emplacement dans l'inventaire il me semble.
    tu check si entity est d'instanceof EntityPlayer si oui tu récup l'inventaire et tu fais un setStackInSlot(par4, null):



  • Le code de Robin tu le mets à la place du mien, car apparement cela ne fonctionne pas…



  • @'robin4002':

    ((EntityPlayer)entity).inventory.setInventorySlotContents(0, null);
    ->
    ((EntityPlayer)entity).inventory.setInventorySlotContents(par4, null);

    J'aime quand on m'écoute.
    @'robin4002':

    Il faut mettre l'item sur null. par4 est l'emplacement dans l'inventaire il me semble.
    tu check si entity est d'instanceof EntityPlayer si oui tu récup l'inventaire et tu fais un setStackInSlot(par4, null):

    Lol tkt j'ai essayer aussi, franchement j'ai fait un max de truc différent sa marche toujours pas 😉


  • Administrateurs

    Étrange 😕



  • [résolue] j'ai trouver les gars et quand je vois la  réponse lol pourquoi parfois je cherche compliqué ?       . Merci 🙂

    Le seul problème et bien sur les coffres ou il n'y a pas de update

    
    public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean par5)
    {
     if(stack.getItemDamage() < 20 ){
    
    stack.setItemDamage(stack.getItemDamage() +1);
    
    }
    else 
     {
    ((EntityPlayer)entity).inventory.consumeInventoryItem(this);
    
    }
    }
    }
    
    


  • Le seul moyen que tu as pour le faire dans les coffres c'est de ticker la tileEntity mais je sais pas trop si c'est possible facilement, regarde s'il n'y a pas un événement pour ça


  • Administrateurs

    TickEvent.WorldTickEvent
    Dans la classe world il y a la liste de tous les tile entité chargé -> tu check si c'est instanceof IInventory si c'est le cas tu parcours tous les items.

    Mais ça va être lourd, très lourd.



  • Pour alléger tu peux demander à l'utilisateur de ne poser les items que dans certains containers customs, ex : créer un placard spécial pour les aliments et empêcher le joueur de poser l'item dans autre chose



  • oue je vais faire sa, je pense créer un congélateur pour toute les viandes et implanter aussi un T en bois pour la faire sécher type jerky beef. pour le coffre de base je vais le régler sa avec un move item stack event ( cancelled).
    Désolé pour la rep tardive je bosser sur l’élevage et implementation de genre male/femelle et d'un pregnancy delay (finit d’ailleurs).
    Merci pour vos rep 😉



  • Ce que tu peux faire sinon c'est stocker dans les nbt le moment où l'item est crées et ensuite générer la barre de pourrissage en fonction de ce moment, ce qui signifie que peu importe que l'objet soit dans un coffre ou non, il pourrira quand même et le serveur ne sera pas surchargé