MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Problème d'update

    Planifier Épinglé Verrouillé Déplacé Résolu 1.7.x
    1.7.10
    5 Messages 2 Publieurs 1.0k Vues 1 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • BrokenSwingB Hors-ligne
      BrokenSwing Moddeurs confirmés Rédacteurs
      dernière édition par

      Bonjour, voilà j’ai un problème sur l’update de la barre de progression de ma machine. Elle n’est update que lorsque je rouvre le gui mais n’avance pas au fil du temps.
      Paticularités de la machine :
      Possède plusieurs metadata, lorsque la recette est en train de procédé je change le bloc tout les 2 ticks (je le remplace par le bloc avec le metadata au dessus) d’après mes tests le problème viens de là.

      Classe du bloc

      :::

      package fr.andemar.common;
      
      import java.util.List;
      
      import net.minecraft.block.Block;
      import net.minecraft.block.BlockContainer;
      import net.minecraft.block.material.Material;
      import net.minecraft.client.renderer.texture.IIconRegister;
      import net.minecraft.creativetab.CreativeTabs;
      import net.minecraft.entity.EntityLivingBase;
      import net.minecraft.entity.item.EntityItem;
      import net.minecraft.entity.player.EntityPlayer;
      import net.minecraft.inventory.IInventory;
      import net.minecraft.item.Item;
      import net.minecraft.item.ItemStack;
      import net.minecraft.nbt.NBTTagCompound;
      import net.minecraft.tileentity.TileEntity;
      import net.minecraft.util.IIcon;
      import net.minecraft.util.MathHelper;
      import net.minecraft.world.IBlockAccess;
      import net.minecraft.world.World;
      import cpw.mods.fml.relauncher.Side;
      import cpw.mods.fml.relauncher.SideOnly;
      
      public class BlockCompressor extends BlockContainer {
      
      IIcon bottom, front1, front2, front3, front4, front5, front6, front7, front8, front9;
      
      public BlockCompressor()
      {
      super(Material.rock);
      this.setCreativeTab(Andemar.creativeTab_andemar);
      this.setHarvestLevel("pickaxe", 2);
      this.setResistance(10.0F);
      this.setHardness(3.0F);
      this.setStepSound(soundTypeStone);
      }
      
      public void registerBlockIcons(IIconRegister iiconRegister)
         {
          this.blockIcon = iiconRegister.registerIcon(Andemar.MODID + ":compressor_side");
          this.bottom = iiconRegister.registerIcon(Andemar.MODID + ":compressor_bottom");
          this.front1 = iiconRegister.registerIcon(Andemar.MODID + ":compressor_front_1");
          this.front2 = iiconRegister.registerIcon(Andemar.MODID + ":compressor_front_2");
          this.front3 = iiconRegister.registerIcon(Andemar.MODID + ":compressor_front_3");
          this.front4 = iiconRegister.registerIcon(Andemar.MODID + ":compressor_front_4");
          this.front5 = iiconRegister.registerIcon(Andemar.MODID + ":compressor_front_5");
          this.front6 = iiconRegister.registerIcon(Andemar.MODID + ":compressor_front_6");
          this.front7 = iiconRegister.registerIcon(Andemar.MODID + ":compressor_front_7");
          this.front8 = iiconRegister.registerIcon(Andemar.MODID + ":compressor_front_8");
          this.front9 = iiconRegister.registerIcon(Andemar.MODID + ":compressor_front_9");
      
         }
      
      @SideOnly(Side.CLIENT)
         public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side)
         {
          int metadata = world.getBlockMetadata(x, y, z);
          if(side == 0 || side == 1)
          return this.bottom;
          TileEntity tile = world.getTileEntity(x, y, z);
          if(tile instanceof TileEntityCompressor)
          {
          byte direction = ((TileEntityCompressor)tile).getDirection();
          IIcon texture = this.getTextureForMetadata(metadata);
          return side == 3 && direction == 0 ? texture : (side == 4 && direction == 1) ? texture : (side == 2 && direction == 2) ? texture : (side == 5 && direction == 3) ? texture : this.blockIcon;
          }
          return this.blockIcon;
         }
      
      public IIcon getIcon(int side, int metadata)
      {
      if(side==1)
      return this.bottom;
          switch(metadata)
          {
          case 0 :
          if(side == 4)
          return this.front1;
          if(side == 0)
          return this.bottom;
          return this.blockIcon;
          case 1 :
          if(side == 4)
          return this.front2;
          if(side == 0)
          return this.bottom;
          return this.blockIcon;
          case 2 :
          if(side == 4)
          return this.front3;
          if(side == 0)
          return this.bottom;
          return this.blockIcon;
          case 3 :
          if(side == 4)
          return this.front4;
          if(side == 0)
          return this.bottom;
          return this.blockIcon;
          case 4 :
          if(side == 4)
          return this.front5;
          if(side == 0)
          return this.bottom;
          return this.blockIcon;
          case 5 :
          if(side == 4)
          return this.front6;
          if(side == 0)
          return this.bottom;
          return this.blockIcon;
          case 6 :
          if(side == 4)
          return this.front7;
          if(side == 0)
          return this.bottom;
          return this.blockIcon;
          case 7 :
          if(side == 4)
          return this.front8;
          if(side == 0)
          return this.bottom;
          return this.blockIcon;
          case 8 :
          if(side == 4)
          return this.front9;
          if(side == 0)
          return this.bottom;
          return this.blockIcon;
          default :
          return this.blockIcon;
          }
      }
      
      public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack stack)
         {
             int direction = MathHelper.floor_double((double)(entity.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
      
             TileEntity tile = world.getTileEntity(x, y, z);
             if(tile instanceof TileEntityCompressor)
             {
              ((TileEntityCompressor)tile).setDirection((byte)direction);
             }
         }
      
      public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitx, float hity, float hitz)
         {
             if (world.isRemote)
             {
                 return true;
             }
             else
             {
              player.openGui(Andemar.instance, 0, world, x, y, z);
                 return true;
             }
         }
      
         @Override
         public boolean hasTileEntity(int metadata)
         {
             return true;
         }
      
         @SuppressWarnings({ "unchecked", "rawtypes" })
      public void getSubBlocks(Item item, CreativeTabs tabs, List list)
      {
      for(int i = 0; i < 9; i++)
      {
      list.add(new ItemStack(item, 1, i));
      }
      }
      
         private IIcon getTextureForMetadata(int metadata)
         {
          switch(metadata)
          {
          case 0 :
          return this.front1;
          case 1 :
          return this.front2;
          case 2 :
          return this.front3;
          case 3 :
          return this.front4;
          case 4 :
          return this.front5;
          case 5 :
          return this.front6;
          case 6 :
          return this.front7;
          case 7 :
          return this.front8;
          case 8 :
          return this.front9;
          default :
          return this.front1;
          }
         }
      
         public static void updateCompressorState(World world, int x, int y, int z)
         {
          TileEntity tileentity = world.getTileEntity(x, y, z);
      
             int metadata = world.getBlockMetadata(x, y, z);
             if(metadata + 1 == 9)
             metadata = 0;
             world.setBlock(x, y, z, Andemar.compressor, metadata + 1, 2);
      
             if (tileentity != null)
             {
                 tileentity.validate();
                 world.setTileEntity(x, y, z, tileentity);
             }
         }
      
         public void breakBlock(World world, int x, int y, int z, Block block, int metadata)
         {
             TileEntity tileentity = world.getTileEntity(x, y, z);
      
             if(tileentity instanceof TileEntityCompressor)
             {
              if(!((TileEntityCompressor)tileentity).isBlockUpdating())
             if (tileentity instanceof IInventory)
             {
              IInventory inv = (IInventory)tileentity;
                 for (int i1 = 0; i1 < inv.getSizeInventory(); ++i1)
                 {
                     ItemStack itemstack = inv.getStackInSlot(i1);
      
                     if (itemstack != null)
                     {
                         float f = world.rand.nextFloat() * 0.8F + 0.1F;
                         float f1 = world.rand.nextFloat() * 0.8F + 0.1F;
                         EntityItem entityitem;
      
                         for (float f2 = world.rand.nextFloat() * 0.8F + 0.1F; itemstack.stackSize > 0; world.spawnEntityInWorld(entityitem))
                         {
                             int j1 = world.rand.nextInt(21) + 10;
      
                             if (j1 > itemstack.stackSize)
                             {
                                 j1 = itemstack.stackSize;
                             }
      
                             itemstack.stackSize -= j1;
                             entityitem = new EntityItem(world, (double)((float)x + f), (double)((float)y + f1), (double)((float)z + f2), new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage()));
                             float f3 = 0.05F;
                             entityitem.motionX = (double)((float)world.rand.nextGaussian() * f3);
                             entityitem.motionY = (double)((float)world.rand.nextGaussian() * f3 + 0.2F);
                             entityitem.motionZ = (double)((float)world.rand.nextGaussian() * f3);
      
                             if (itemstack.hasTagCompound())
                             {
                                 entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy());
                             }
                         }
                     }
                 }
             }
      
                 world.func_147453_f(x, y, z, block);
             }
      
             super.breakBlock(world, x, y, z, block, metadata);
         }
      
      @Override
      public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) {
      return new TileEntityCompressor();
      }
      }
      

      :::

      Classe du gui
      :::

      package fr.andemar.client;
      
      import org.lwjgl.opengl.GL11;
      
      import fr.andemar.common.Andemar;
      import fr.andemar.common.ContainerCompressor;
      import fr.andemar.common.TileEntityCompressor;
      import net.minecraft.client.gui.inventory.GuiContainer;
      import net.minecraft.client.resources.I18n;
      import net.minecraft.entity.player.InventoryPlayer;
      import net.minecraft.inventory.IInventory;
      import net.minecraft.util.ResourceLocation;
      
      public class GuiCompressor extends GuiContainer {
      
      private static final ResourceLocation texture = new ResourceLocation(Andemar.MODID,"textures/gui/gui_compressor.png");
         private TileEntityCompressor tileCompressor;
         private IInventory playerInv;
      
      public GuiCompressor(TileEntityCompressor tile, InventoryPlayer inventory)
      {
      super(new ContainerCompressor(tile, inventory));
             this.tileCompressor = tile;
             this.playerInv = inventory;
             this.allowUserInput = false;
             this.ySize = 207;
             this.xSize = 195;
      }
      
      @Override
      protected void drawGuiContainerBackgroundLayer(float partialRenderTick, int x, int y)
      {
      
      GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
             this.mc.getTextureManager().bindTexture(texture);
             int k = (this.width - this.xSize) / 2;
             int l = (this.height - this.ySize) / 2;
             this.drawTexturedModalRect(k, l, 0, 46, this.xSize, this.ySize);
      
             if(this.tileCompressor.isBurning())
             {
              int i = this.tileCompressor.getCookProgress();
              this.drawTexturedModalRect(k + 47, l + 46, 0, 2, 100, i);
             }
      
      }
      
      protected void drawGuiContainerForegroundLayer(int x, int y)
         {
             this.fontRendererObj.drawString(this.playerInv.hasCustomInventoryName() ? this.playerInv.getInventoryName() : I18n.format(this.playerInv.getInventoryName()), 10, this.ySize - 98, 4210752);
         }
      
      }
      

      :::

      Classe du TileEntity

      :::

      package fr.andemar.common;
      
      import cpw.mods.fml.relauncher.Side;
      import cpw.mods.fml.relauncher.SideOnly;
      import net.minecraft.entity.player.EntityPlayer;
      import net.minecraft.inventory.IInventory;
      import net.minecraft.item.ItemStack;
      import net.minecraft.nbt.NBTTagCompound;
      import net.minecraft.nbt.NBTTagList;
      import net.minecraft.network.NetworkManager;
      import net.minecraft.network.Packet;
      import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
      import net.minecraft.tileentity.TileEntity;
      
      public class TileEntityCompressor extends TileEntity implements IInventory {
      
      private ItemStack[] contents = new ItemStack[4];
      private byte direction;
      private int workingTime = 0;
      private int workingTimeNeeded = 200;
      private boolean isBlockUpdating = false;
      
      @Override
      public void readFromNBT(NBTTagCompound compound)
      {
      super.readFromNBT(compound);
      this.direction = compound.getByte("Direction");
      
      NBTTagList nbttaglist = compound.getTagList("Items", 10);
      this.contents = new ItemStack[this.getSizeInventory()];
      
      for (int i = 0; i < nbttaglist.tagCount(); ++i)
      {
      NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i);
      int j = nbttagcompound1.getByte("Slot") & 255;
      
      if (j >= 0 && j < this.contents.length)
      {
      this.contents[j] = ItemStack.loadItemStackFromNBT(nbttagcompound1);
      }
      }
      
      this.workingTime = compound.getShort("workingTime");
      this.workingTimeNeeded = compound.getShort("workingTimeNeeded");
      this.isBlockUpdating = compound.getBoolean("isBlockUpdating");
      }
      
      @Override
      public void writeToNBT(NBTTagCompound compound)
      {
      super.writeToNBT(compound);
      compound.setByte("Direction", this.direction);
      NBTTagList nbttaglist = new NBTTagList();
      
      for (int i = 0; i < this.contents.length; ++i)
      {
      if (this.contents* != null)
      {
      NBTTagCompound nbttagcompound1 = new NBTTagCompound();
      nbttagcompound1.setByte("Slot", (byte)i);
      this.contents*.writeToNBT(nbttagcompound1);
      nbttaglist.appendTag(nbttagcompound1);
      }
      }
      
      compound.setTag("Items", nbttaglist);
      compound.setShort("workingTime",(short)this.workingTime);
      compound.setShort("workingTimeNeeded", (short)this.workingTimeNeeded);
      compound.setBoolean("isBlockUpdating", this.isBlockUpdating);
      }
      
      @Override
      public int getSizeInventory() {
      return this.contents.length;
      }
      
      @Override
      public ItemStack getStackInSlot(int slotIndex) {
      return this.contents[slotIndex];
      }
      
      @Override
      public ItemStack decrStackSize(int slotIndex, int amount) {
      if (this.contents[slotIndex] != null)
      {
      ItemStack itemstack;
      
      if (this.contents[slotIndex].stackSize <= amount)
      {
      itemstack = this.contents[slotIndex];
      this.contents[slotIndex] = null;
      this.markDirty();
      return itemstack;
      }
      else
      {
      itemstack = this.contents[slotIndex].splitStack(amount);
      
      if (this.contents[slotIndex].stackSize == 0)
      {
      this.contents[slotIndex] = null;
      }
      
      this.markDirty();
      return itemstack;
      }
      }
      else
      {
      return null;
      }
      }
      
      @Override
      public ItemStack getStackInSlotOnClosing(int slotIndex) {
      if (this.contents[slotIndex] != null)
      {
      ItemStack itemstack = this.contents[slotIndex];
      this.contents[slotIndex] = null;
      return itemstack;
      }
      else
      {
      return null;
      }
      }
      
      @Override
      public void setInventorySlotContents(int slotIndex, ItemStack stack) {
      this.contents[slotIndex] = stack;
      
      if (stack != null && stack.stackSize > this.getInventoryStackLimit())
      {
      stack.stackSize = this.getInventoryStackLimit();
      }
      
      this.markDirty();
      }
      
      @Override
      public String getInventoryName() {
      return "tile.fermenter";
      }
      
      @Override
      public boolean hasCustomInventoryName() {
      return false;
      }
      
      @Override
      public int getInventoryStackLimit() {
      return 64;
      }
      
      @Override
      public boolean isUseableByPlayer(EntityPlayer player) {
      return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : player.getDistanceSq((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D;
      }
      
      @Override
      public void openInventory() {
      
      }
      
      @Override
      public void closeInventory() {
      
      }
      
      @Override
      public boolean isItemValidForSlot(int slot, ItemStack stack) {
      return slot == 3 ? false : true;
      }
      
      public void setDirection(byte direction)
      {
      this.direction = direction;
      this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
      }
      
      public byte getDirection()
      {
      return this.direction;
      }
      
      public Packet getDescriptionPacket()
      {
      NBTTagCompound nbttagcompound = new NBTTagCompound();
      this.writeToNBT(nbttagcompound);
      return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbttagcompound);
      }
      
      public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt)
      {
      this.readFromNBT(pkt.func_148857_g());
      this.worldObj.markBlockRangeForRenderUpdate(this.xCoord, this.yCoord, this.zCoord, this.xCoord, this.yCoord, this.zCoord);
      }
      
      public boolean isBurning()
      {
      return this.workingTime > 0;
      }
      
      private boolean canSmelt()
      {
      if (this.contents[0] == null || this.contents[1] == null || this.contents[2] == null)
      {
      return false;
      }
      else
      {
      ItemStack itemstack = CompressorRecipes.smelting().getSmeltingResult(new ItemStack[]{this.contents[0], this.contents[1], this.contents[2]});
      if (itemstack == null) return false;
      if (this.contents[3] == null) return true;
      if (!this.contents[3].isItemEqual(itemstack)) return false;
      int result = contents[3].stackSize + itemstack.stackSize;
      return result <= getInventoryStackLimit() && result <= this.contents[3].getMaxStackSize(); //Forge BugFix: Make it respect stack sizes properly.
      }
      }
      
      public void updateEntity()
      {
      if(this.isBurning() && this.canSmelt())
      {
      ++this.workingTime;
      if(this.workingTime % 2 == 0)
          {
          this.isBlockUpdating = true;
          BlockCompressor.updateCompressorState(this.worldObj, this.xCoord, this.yCoord, this.zCoord);
          this.markDirty();
          this.isBlockUpdating = false;
          }
      }
      if(this.canSmelt() && !this.isBurning())
      {
      this.workingTime = 1;
      }
      if(this.canSmelt() && this.workingTime == this.workingTimeNeeded)
      {
      this.smeltItem();
      this.workingTime = 0;
      }
      if(!this.canSmelt())
      {
      this.workingTime = 0;
      }
      }
      
      public void smeltItem()
      {
      if (this.canSmelt())
      {
      ItemStack itemstack = CompressorRecipes.smelting().getSmeltingResult(new ItemStack[]{this.contents[0], this.contents[1], this.contents[2]});
      if (this.contents[3] == null)
      {
      this.contents[3] = itemstack.copy();
      }
      else if (this.contents[3].getItem() == itemstack.getItem())
      {
      this.contents[3].stackSize += itemstack.stackSize; // Forge BugFix: Results may have multiple items
      }
      
      –this.contents[0].stackSize;
      –this.contents[1].stackSize;
      –this.contents[2].stackSize;
      
      if (this.contents[0].stackSize <= 0)
      {
      this.contents[0] = null;
      }
      if (this.contents[1].stackSize <= 0)
      {
      this.contents[1] = null;
      }
      if (this.contents[2].stackSize <= 0)
      {
      this.contents[2] = null;
      }
      }
      }
      
      public boolean isBlockUpdating()
      {
      return this.isBlockUpdating;
      }
      
      @SideOnly(Side.CLIENT)
      public int getCookProgress()
      {
      return this.workingTime * 41 / this.workingTimeNeeded;
      }
      }
      

      :::

      J’espère que vous pourrez m’aider

      1 réponse Dernière réponse Répondre Citer 0
      • robin4002R Hors-ligne
        robin4002 Moddeurs confirmés Rédacteurs Administrateurs
        dernière édition par

        Container ? Les fonctions qui update la bar se trouve dans le container.

        1 réponse Dernière réponse Répondre Citer 0
        • BrokenSwingB Hors-ligne
          BrokenSwing Moddeurs confirmés Rédacteurs
          dernière édition par

          @‘robin4002’:

          Container ? Les fonctions qui update la bar se trouve dans le container.

          Classe du containter

          package fr.andemar.common;
          
          import net.minecraft.entity.player.EntityPlayer;
          import net.minecraft.entity.player.InventoryPlayer;
          import net.minecraft.inventory.Container;
          import net.minecraft.inventory.Slot;
          import net.minecraft.item.ItemStack;
          
          public class ContainerCompressor extends Container {
          
          private TileEntityCompressor tileCompressor;
          
          public ContainerCompressor(TileEntityCompressor tile, InventoryPlayer inventory)
          {
          this.tileCompressor = tile;
          this.addSlotToContainer(new Slot(tile, 0, 49, 29));
          this.addSlotToContainer(new Slot(tile, 1, 89, 29));
          this.addSlotToContainer(new Slot(tile, 2, 129, 29));
          this.addSlotToContainer(new SlotResult(inventory.player, tile, 3, 89, 89));
          this.bindPlayerInventory(inventory);
          
          }
          
          @Override
          public boolean canInteractWith(EntityPlayer player) {
          return this.tileCompressor.isUseableByPlayer(player);
          }
          
          private void bindPlayerInventory(InventoryPlayer inventory)
          {
          int i;
          for (i = 0; i < 3; ++i)
          {
          for (int j = 0; j < 9; ++j)
          {
          this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 17 + j * 18, 125 + i * 18));
          }
          }
          
          for (i = 0; i < 9; ++i)
          {
          this.addSlotToContainer(new Slot(inventory, i, 17 + i * 18, 183));
          }
          }
          
          public ItemStack transferStackInSlot(EntityPlayer player, int quantity)
          {
          ItemStack itemstack = null;
          Slot slot = (Slot)this.inventorySlots.get(quantity);
          
          if (slot != null && slot.getHasStack())
          {
          ItemStack itemstack1 = slot.getStack();
          itemstack = itemstack1.copy();
          
          if (quantity < this.tileCompressor.getSizeInventory())
          {
          if (!this.mergeItemStack(itemstack1, this.tileCompressor.getSizeInventory(), this.inventorySlots.size(), true))
          {
          return null;
          }
          }
          else if (!this.mergeItemStack(itemstack1, 0, this.tileCompressor.getSizeInventory(), false))
          {
          return null;
          }
          
          if (itemstack1.stackSize == 0)
          {
          slot.putStack((ItemStack)null);
          }
          else
          {
          slot.onSlotChanged();
          }
          }
          
          return itemstack;
          }
          
          public void onContainerClosed(EntityPlayer player)
          {
          super.onContainerClosed(player);
          this.tileCompressor.closeInventory();
          }
          
          }
          
          
          1 réponse Dernière réponse Répondre Citer 0
          • robin4002R Hors-ligne
            robin4002 Moddeurs confirmés Rédacteurs Administrateurs
            dernière édition par

            Il te manque tout ça : https://github.com/FFMT/Privatizer/blob/master/privatizer_src/fr/mcnanotech/privatizer/common/ContainerPasswordFurnace.java#L44-L98

            1 réponse Dernière réponse Répondre Citer 0
            • BrokenSwingB Hors-ligne
              BrokenSwing Moddeurs confirmés Rédacteurs
              dernière édition par

              Merci beaucoup, j’espère que ça aura réglé un second problème que j’avais. Je passe en résolu

              1 réponse Dernière réponse Répondre Citer 0
              • 1 / 1
              • Premier message
                Dernier message
              Design by Woryk
              ContactMentions Légales

              MINECRAFT FORGE FRANCE © 2024

              Powered by NodeBB