Par1ItemStack.stackSize; a une dysfonctionnement



  • Bonjour membre de minecraftforgefrance,
    Aujourd'hui j'ai un problème vous devez vous en douté 🙂
    Alors voila j'ai crée un block qui une voie un left click avec l'item bâton active un boolean jusque la pas de problème mais le problème est qu’après le left click ,je veux que le bâton ce consume donc j'ai mis –player.getCurrentEquippedItem().stackSize; et quand l'item a plus de 2 stack c'est à dire que par exemple on a deux bâtons "empilés" sa ce consume mais si il reste que un stack la l'item se consume mais après avoir taper un mec avec.


  • Administrateurs

    Salut,

    if(player.getCurrentEquippedItem().stackSize == 0)
    {
    entityplayer.destroyCurrentEquippedItem();
    }
    


  • non le même problème l'item ne se consume pas tout de suite.


  • Administrateurs

    player.getCurrentEquippedItem().damageItem(1, player);
    ?
    Si c'est toujours pas bon, envoie toute la classe.



  • /**
    * Called when a player hits the block. Args: world, x, y, z, player
    */
    public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player)
    {
    ItemStack stack = player.getCurrentEquippedItem();
    TileEntityDecondenseur te = (TileEntityDecondenseur)world.getTileEntity(x, y, z);
    
    if(!world.isRemote && te.isUse == false)
    {
    if ((stack != null) && ((stack.getItem() instanceof ItemCatalystPig)))
    {
    te.isUse = true;
    te.itemId = 1;
    
    player.getCurrentEquippedItem().damageItem(1, player);
    
    }
    }
    }
    

    Voila mais bon je pense pas que sa va changé grand chose.


  • Administrateurs

    Enlève le if(!world.isRemote)



  • non sa fais tout beugé ^^'.


  • Administrateurs

    Remplace player.getCurrentEquippedItem() par stack pour un soucis d'optimisation.
    À mon avis le serveur sait que l'item doit être retiré, mais pas le client. Et quand tu tape ça syncro. Donc ça le consume en client.
    Le problème est surement au niveau de la condition te.isUse == false, essaye de la retirer et regarde si ça fonctionne.
    Si oui, envoie le code de ton tile entity. Sinon, je sais pas trop x)



  • ok je vais essayer!


    Non sa ne marche pas bon autant exposer un autre problème ^^', alors voila je voudrais que mon item s'anime si mon boolean est true et ce boolean c'est is.use mais apparemment sa ne fonctionne pas voila mon tileEntity

    package portuar.cubicBeyond.client.blocks.decondenseur;
    
    import net.minecraft.entity.passive.EntityPig;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.tileentity.TileEntity;
    
    public class TileEntityDecondenseur extends TileEntity
    
    {
    public int coolDown = 100;
    public float motorAngle, prevMotorAngle;
    public boolean isUse;
    public int itemId;
    
    public void readFromNBT(NBTTagCompound nbtTag)
    {
    super.readFromNBT(nbtTag);
    isUse = nbtTag.getBoolean("isUse");
    itemId = nbtTag.getInteger("itemId");
    }
    
    public void writeToNBT(NBTTagCompound nbtTag)
    {
    super.writeToNBT(nbtTag);
    nbtTag.setBoolean("isUse", isUse);
    nbtTag.setInteger("itemId", itemId);
    }
    
    public void updateEntity()
    {
    if(this.isUse == true)
    {
    this.prevMotorAngle = this.motorAngle;
    this.motorAngle += 0.05F;
    this.coolDown–;
    
    if(this.coolDown < 0)
    {
    if(this.itemId == 1)
    {
    EntityPig entity = new EntityPig(this.worldObj);
    entity.setLocationAndAngles(this.xCoord, this.yCoord + 1, this.zCoord, 0, 0);
    this.worldObj.spawnEntityInWorld(entity);
    this.itemId = 0;
    }
    
    this.coolDown = 100;
    this.isUse = false;
    }
    
    }
    }
    }
    

  • Administrateurs

    Dans ton tile entity ajoute :

    public Packet getDescriptionPacket()
    {
    NBTTagCompound nbttagcompound = new NBTTagCompound();
    this.writeToNBT(nbttagcompound);
    return new Packet132TileEntityData(this.xCoord, this.yCoord, this.zCoord, 4, nbttagcompound);
    }
    
    public void onDataPacket(INetworkManager net, Packet132TileEntityData pkt)
    {
    this.readFromNBT(pkt.data);
    }
    

    Pour que les valeurs soit synchronisées client / serveur



  • Je ne peux pas importez INetworkManager et Packet132TileEntityData
    ps : je suis en 1.7


  • Administrateurs

    version 1.7 :

    
    public Packet getDescriptionPacket()
    {
    NBTTagCompound nbttagcompound = new NBTTagCompound();
    this.writeToNBT(nbttagcompound);
    return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 4, nbttagcompound);
    }
    
    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity updateTileEntity)
    {
    this.readFromNBT(updateTileEntity.func_148857_g());
    }
    
    


  • Ouai sa fonctionne mais ne change absolument rien au deux problèmes.


  • Administrateurs

    Sinon tu peux faire :

    player.getCurrentEquippedItem().damageItem(1, player);
    if(player.getCurrentEquippedItem().stackSize == 0)
    {
    player.setCurrentEquippedItem(null);
    }
    

    Si c'est toujours pas bon, je vois vraiment pas 😕



  • nop toujours pas :S



  • Met les syso un peut partout pour voir ou ça bloque



  • Mais sa bloque pas c'est juste un beug ^^



  • oue mais avec les syso on vera quelle partie bug



  • mais enfete c'est même pas un beug juste pas la bonne fonction je pense.



  • Envoi tout le code par pastebin stp