Navigation

    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    TileEntity sur mon bloc

    Sans suite
    1.11.x
    4
    9
    1438
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • S
      Sebenf0rce last edited by

      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>

      1 Reply Last reply Reply Quote 0
      • Alexandre1156
        Alexandre1156 last edited by

        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
        
        
        1 Reply Last reply Reply Quote 0
        • S
          Sebenf0rce last edited by

          @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

          1 Reply Last reply Reply Quote 0
          • Alexandre1156
            Alexandre1156 last edited by

            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());
            }
            
            
            1 Reply Last reply Reply Quote 0
            • S
              Sebenf0rce last edited by

              @‘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 😞

              1 Reply Last reply Reply Quote 0
              • robin4002
                robin4002 Administrateurs Rédacteurs Moddeurs confirmés last edited by

                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 ?

                1 Reply Last reply Reply Quote 0
                • S
                  Sebenf0rce last edited by

                  @‘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());
                  }
                  }
                  
                  
                  1 Reply Last reply Reply Quote 0
                  • Benjamin Loison
                    Benjamin Loison last edited by

                    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é 😉

                    1 Reply Last reply Reply Quote 0
                    • S
                      Sebenf0rce last edited by

                      @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à 😞

                      1 Reply Last reply Reply Quote 0
                      • 1 / 1
                      • First post
                        Last post
                      Design by Woryk
                      Contact / Mentions Légales / Faire un don

                      MINECRAFT FORGE FRANCE © 2018

                      Powered by NodeBB