TileEntity sur mon bloc



  • Bonjour,

    J'ai créé un entité sur mon bloc permettant de stocker une valeur.
    Du coup j'ai créé ma classe TileEntityRCF :

    public class TileEntityRCF extends TileEntity{
    
    private int number = 1; 
    
    @Override
       public void readFromNBT(NBTTagCompound compound)
       {
           super.readFromNBT(compound);
           this.number = compound.getInteger("Number"); 
       }
    
       @Override
       public NBTTagCompound writeToNBT(NBTTagCompound compound)
       {
           super.writeToNBT(compound);
           compound.setInteger("Number", this.number);
    return compound;
       }
    
       public void increase()
       {
           this.number++;
       }
    
       public void decrease() 
       {
           this.number–;
       }
    
       public int getNumber() 
       {
           return number;
       }
    }
    

    J'ai créé un item qui lorsque l'on clique sur mon block la valeur stocké dans le tileEntity est incrémenté :

    @Override
    public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
    if (!world.isRemote) {
    TileEntity tile = world.getTileEntity(pos);
    
    if (tile == null) {
    return EnumActionResult.PASS;
    }
    if (tile instanceof TileEntityRCF) {
    if (((TileEntityRCF) tile).getNumber() < 10) {
    ((TileEntityRCF) tile).increase();
    return EnumActionResult.SUCCESS;
    }
    else
    Minecraft.getMinecraft().ingameGUI.displayTitle("Max atteint", "", 1, 10, 1);
    }
    }
    return EnumActionResult.PASS;
    }
    

    Jusque là tout se passe bien, cependant avec mon deuxième item la valeur récupéré du tileEntity n'est pas bonne :

    
    @Override
    public ActionResult <itemstack>onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) {
    int compteur = 0;
    if (worldIn != null) {
    for (int i = 0; i < Minecraft.getMinecraft().world.loadedTileEntityList.size(); i++) {
    TileEntity tile = Minecraft.getMinecraft().world.loadedTileEntityList.get(i);
    if ((tile instanceof TileEntityRCF)) {
    if (Minecraft.getMinecraft().world.loadedTileEntityList.get(i).getPos().getX() < playerIn.getPosition().getX() + 36
    && Minecraft.getMinecraft().world.loadedTileEntityList.get(i).getPos().getX() > playerIn.getPosition().getX() - 36
    && Minecraft.getMinecraft().world.loadedTileEntityList.get(i).getPos().getY() < playerIn.getPosition().getY() + 36
    && Minecraft.getMinecraft().world.loadedTileEntityList.get(i).getPos().getY() > playerIn.getPosition().getY() - 36
    && Minecraft.getMinecraft().world.loadedTileEntityList.get(i).getPos().getZ() < playerIn.getPosition().getZ() + 36
    && Minecraft.getMinecraft().world.loadedTileEntityList.get(i).getPos().getZ() > playerIn.getPosition().getZ() - 36) {
    
    int valeur = ((TileEntityRCF) tile).getNumber();
    System.out.println("AAAAA : " + valeur); //valeur erronée
    compteur-= ((TileEntityRCF)tile).getNumber();
    }
    
    }
    
    //Minecraft.getMinecraft().renderEngine.bindTexture(new ResourceLocation(Main.MODID,"textures/gui/chestbutin.png"));
           // Minecraft.getMinecraft().ingameGUI.drawTexturedModalRect((int)playerIn.posX + (-193), (int)playerIn.posY + (-115), 0, 0, 256, 256);
    Minecraft.getMinecraft().ingameGUI.displayTitle("Coffre : " + compteur, "", 1, 10, 1);
    
    return new ActionResult(EnumActionResult.SUCCESS, new ItemStack(this));
    
    }
    

    La valeur récupérer est toujours celle de base (1 initialisé à la création du tileEntity). C'est comme si l'incrémentation n'avait pas été effectué.
    De plus lorsque le je redémarre le jeu, cette valeur est égale à 0 😮

    J'aimerais également savoir s'il est possible de détruire l'objet une fois que l'on a fait un click droit. J'ai mis setMaxDamage à 1 mais ça ne marche pas.</itemstack>



  • Pour récupérer un tile entity, tu devrais plutôt faire comme ça :

    
    ItemStack itemstack = playerIn.getHeldItem(handIn);
    RayTraceResult raytraceresult = this.rayTrace(worldIn, playerIn, false);
    if(raytraceresult == null || raytraceresult.typeOfHit != RayTraceResult.Type.BLOCK)
       return new ActionResult(EnumActionResult.PASS, itemstack);
    else {
       TileEntity te = worldIn.getTileEntity(raytraceresult.getBlockPos());
       if(te instanceof TileEntityRCF) {
          TileEntityRCF teRCF = (TileEntityRCF) te;
          …
       }
    }
    
    

    Ensuite, à tes méthodes inscrease() et decrease(), rajoute cette ligne :

    
    this.markDirty();
    
    

    Et pour détuire l'itemstack :

    
    is.damageItem(99999, playerIn); //is est un itemstack
    
    


  • @Alexandre1156:

    Pour récupérer un tile entity, tu devrais plutôt faire comme ça :

    
    ItemStack itemstack = playerIn.getHeldItem(handIn);
    RayTraceResult raytraceresult = this.rayTrace(worldIn, playerIn, false);
    if(raytraceresult == null || raytraceresult.typeOfHit != RayTraceResult.Type.BLOCK)
       return new ActionResult(EnumActionResult.PASS, itemstack);
    else {
       TileEntity te = worldIn.getTileEntity(raytraceresult.getBlockPos());
       if(te instanceof TileEntityRCF) {
          TileEntityRCF teRCF = (TileEntityRCF) te;
          …
       }
    }
    
    

    Ensuite, à tes méthodes inscrease() et decrease(), rajoute cette ligne :

    
    this.markDirty();
    
    

    J'ai rajouté this.markDirty(); mais la valeur récupéré est toujours 1 😞 Et quand je redémarre le jeu la valeur est à 0



  • Et si tu rajoutes ces 2 méthodes :

    
    @Override
    public SPacketUpdateTileEntity getUpdatePacket() {
       NBTTagCompound nbt = new NBTTagCompound();
       this.writeToNBT(nbt);
       int metadata = getBlockMetadata();
       return new SPacketUpdateTileEntity(this.pos, metadata, nbt);
    }
    
    @Override
    public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) {
       this.readFromNBT(pkt.getNbtCompound());
    }
    
    


  • @'Alexandre1156':

    Et si tu rajoutes ces 2 méthodes :

    
    @Override
    public SPacketUpdateTileEntity getUpdatePacket() {
       NBTTagCompound nbt = new NBTTagCompound();
       this.writeToNBT(nbt);
       int metadata = getBlockMetadata();
       return new SPacketUpdateTileEntity(this.pos, metadata, nbt);
    }
    
    @Override
    public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) {
       this.readFromNBT(pkt.getNbtCompound());
    }
    
    

    Toujours pareil 😞


  • Administrateurs

    Tu ne devrais pas utiliser Minecraft.getMinecraft() à l'intérieur d'un if(!world.isRemote)

    Tu as bien mis les deux fonctions dans le tile entity ?



  • @'robin4002':

    Tu ne devrais pas utiliser  Minecraft.getMinecraft() à l'intérieur d'un if(!world.isRemote)

    Tu as bien mis les deux fonctions dans le tile entity ?

    D'accord je vais modifier alors.

    Oui j'ai bien les deux fonctions, voici ma classe désormais :

    package fr.sebenforce.mod;
    
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.network.NetworkManager;
    import net.minecraft.network.play.server.SPacketUpdateTileEntity;
    import net.minecraft.tileentity.TileEntity;
    
    public class TileEntityRCF extends TileEntity {
    
    private int number = 1;
    
    @Override
    public void readFromNBT(NBTTagCompound compound) {
    super.readFromNBT(compound);
    this.number = compound.getInteger("Number");
    }
    
    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound compound) {
    super.writeToNBT(compound);
    compound.setInteger("Number", this.number);
    return compound;
    }
    
    public void increase() {
    this.number++;
    this.markDirty();
    }
    
    public void decrease() {
    this.number–;
    this.markDirty();
    }
    
    public int getNumber() {
    return number;
    }
    
    @Override
    public SPacketUpdateTileEntity getUpdatePacket() {
    NBTTagCompound nbt = new NBTTagCompound();
    this.writeToNBT(nbt);
    int metadata = getBlockMetadata();
    return new SPacketUpdateTileEntity(this.pos, metadata, nbt);
    }
    
    @Override
    public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) {
    this.readFromNBT(pkt.getNbtCompound());
    }
    }
    
    


  • Si j'étais toi je chercherai un code fonctionnel qui reprends les fonctionnalités que tu souhaites utilisé 😉 tu traduis ton problème en anglais, tu gardes les mots-clés et tu rajoutes Minecraft 1.11 Modding
    Ou penses même à prendre un code d'une autre version et à tenté de le convertir en 1.11 et cherches sur le forum je pense que ça déjà été demandé 😉



  • @Benjamin Loison:

    Si j'étais toi je chercherai un code fonctionnel qui reprends les fonctionnalités que tu souhaites utilisé 😉 tu traduis ton problème en anglais, tu gardes les mots-clés et tu rajoutes Minecraft 1.11 Modding
    Ou penses même à prendre un code d'une autre version et à tenté de le convertir en 1.11 et cherches sur le forum je pense que ça déjà été demandé 😉

    Je n'ai pas réussis à trouver d'info supplémentaires par rapport à ce que j'ai déjà 😞