MFF

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

    Bug avec un four custom

    Planifier Épinglé Verrouillé Déplacé Non résolu Sans suite
    1.12.2
    9 Messages 6 Publieurs 544 Vues 6 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.
    • Ck_LukyC Hors-ligne
      Ck_Luky
      dernière édition par

      Bonjour à tous, j’ai récemment créé un four custom en 1.12.2 avec forge.
      Mon problème est le suivant : lorsque je fait shift + clic pour récupérer mon item de sortie il se duplique dans mon inventaire.
      comment puije résoudre ce problème ??

      PS : voici ma classe de TileEntity :

      package fr.luky.feurimod.blocks.machines.freezer;
      
      import net.minecraft.block.Block;
      import net.minecraft.entity.player.EntityPlayer;
      import net.minecraft.init.Blocks;
      import net.minecraft.inventory.IInventory;
      import net.minecraft.inventory.ItemStackHelper;
      import net.minecraft.item.Item;
      import net.minecraft.item.ItemBlock;
      import net.minecraft.item.ItemStack;
      import net.minecraft.nbt.NBTTagCompound;
      import net.minecraft.tileentity.TileEntity;
      import net.minecraft.util.ITickable;
      import net.minecraft.util.NonNullList;
      import net.minecraft.util.math.MathHelper;
      import net.minecraft.util.text.ITextComponent;
      import net.minecraft.util.text.TextComponentString;
      import net.minecraft.util.text.TextComponentTranslation;
      import net.minecraftforge.fml.common.registry.GameRegistry;
      import net.minecraftforge.fml.relauncher.Side;
      import net.minecraftforge.fml.relauncher.SideOnly;
      
      public class TileEntityFreezer extends TileEntity implements ITickable, IInventory {
      
          private NonNullList<ItemStack> inventory = NonNullList.<ItemStack>withSize(4, ItemStack.EMPTY);
          private String customName;
          private int burnTime, currentBurnTime, freezeTime, totalFreezeTime;
      
          @Override
          public String getName() {
              return this.hasCustomName() ? this.customName : "container.freezer";
          }
      
          @Override
          public boolean hasCustomName() {
              return this.customName != null && !this.customName.isEmpty();
          }
      
          public void setCustomName(String customName){
              this.customName = customName;
          }
      
          @Override
          public ITextComponent getDisplayName() {
              return this.hasCustomName() ? new TextComponentString(this.getName()) : new TextComponentTranslation(this.getName());
          }
      
          @Override
          public int getSizeInventory() {
              return this.inventory.size();
          }
      
          @Override
          public boolean isEmpty() {
              for (ItemStack stack : this.inventory){
                  if (!stack.isEmpty()) return false;
              }
              return true;
          }
      
          @Override
          public ItemStack getStackInSlot(int index) {
              return (ItemStack)this.inventory.get(index);
          }
      
          @Override
          public ItemStack decrStackSize(int index, int count) {
              return ItemStackHelper.getAndSplit(this.inventory, index, count);
          }
      
          @Override
          public ItemStack removeStackFromSlot(int index) {
              return ItemStackHelper.getAndRemove(this.inventory, index);
          }
      
          @Override
          public void setInventorySlotContents(int index, ItemStack stack) {
              ItemStack itemStack = (ItemStack)this.inventory.get(index);
              boolean flag = !stack.isEmpty() && stack.isItemEqual(itemStack) && ItemStack.areItemStackTagsEqual(stack, itemStack);
              this.inventory.set(index, stack);
      
              if (stack.getCount() > this.getInventoryStackLimit()){
                  stack.setCount(this.getInventoryStackLimit());
              }
              if (index == 0 && index + 1 == 1 && !flag){
                  ItemStack stack1 = (ItemStack)this.inventory.get(index + 1);
                  this.totalFreezeTime = this.getFreezeTime(stack, stack1);
                  this.freezeTime = 0;
                  this.markDirty();
              }
          }
      
          @Override
          public void readFromNBT(NBTTagCompound compound) {
              super.readFromNBT(compound);
              this.inventory = NonNullList.<ItemStack>withSize(this.getSizeInventory(), ItemStack.EMPTY);
              ItemStackHelper.loadAllItems(compound, this.inventory);
              this.burnTime = compound.getInteger("BurnTime");
              this.freezeTime = compound.getInteger("FreezeTime");
              this.totalFreezeTime = compound.getInteger("FreezeTimeTotal");
              this.currentBurnTime = getItemFreezeTime((ItemStack) this.inventory.get(2));
      
              if (compound.hasKey("CustomName", 8)) this.setCustomName(compound.getString("CustomName"));
          }
      
          @Override
          public NBTTagCompound writeToNBT(NBTTagCompound compound) {
              super.writeToNBT(compound);
              compound.setInteger("BurnTime", (short)this.burnTime);
              compound.setInteger("FreezeTime", (short)this.freezeTime);
              compound.setInteger("FreezeTimeTotal", (short)this.totalFreezeTime);
              ItemStackHelper.saveAllItems(compound, this.inventory);
      
              if (this.hasCustomName()) compound.setString("CustomName", this.customName);
              return compound;
          }
      
          @Override
          public int getInventoryStackLimit() {
              return 64;
          }
      
          public boolean isBurning (){
              return this.burnTime > 0;
          }
      
          @SideOnly(Side.CLIENT)
          public static boolean isBurning (IInventory inventory){
              return inventory.getField(0) > 0;
          }
      
          public void update() {
              boolean flag = this.isBurning();
              boolean flag1 = false;
      
              if (this.isBurning()) --this.burnTime;
      
              if (!world.isRemote){
                  ItemStack stack = (ItemStack)this.inventory.get(2);
      
                  if (this.isBurning() ||!stack.isEmpty() && !((((ItemStack)this.inventory.get(0)).isEmpty()) || ((ItemStack)this.inventory.get(1)).isEmpty())){
                      if (!this.isBurning() && this.canFreeze()){
                          this.burnTime = getItemFreezeTime(stack);
                          this.currentBurnTime = this.burnTime;
      
                          if (this.isBurning()){
                              flag1 = true;
      
                              if (!stack.isEmpty()){
                                  Item item = stack.getItem();
                                  stack.shrink(1);
      
                                  if (stack.isEmpty()){
                                      ItemStack item1 = item.getContainerItem(stack);
                                      this.inventory.set(2, item1);
                                  }
                              }
                          }
                      }
                      if (this.isBurning() && this.canFreeze()){
                          ++this.freezeTime;
                          if (this.freezeTime == this.totalFreezeTime){
                              this.freezeTime = 0;
                              this.totalFreezeTime = this.getFreezeTime((ItemStack)this.inventory.get(0), (ItemStack)this.inventory.get(1));
                              this.freezeItem();
                              flag1 = true;
                          }
                      }
                      else this.freezeTime = 0;
                  }
                  else if (!this.isBurning() && this.freezeTime  > 0){
                      this.freezeTime = MathHelper.clamp(this.freezeTime -2, 0, this.totalFreezeTime);
                  }
                  if (flag != this.isBurning()){
                      flag1 = true;
                      BlockFreezerBase.setState(this.isBurning(), this.world, this.pos);
                  }
              }if (flag1)
                  this.markDirty();
          }
      
          public int getFreezeTime(ItemStack input1, ItemStack input2) {
              return 200;
          }
      
          public boolean canFreeze(){
              if (((ItemStack)this.inventory.get(0)).isEmpty() || ((ItemStack)this.inventory.get(1)).isEmpty()) return false;
              else {
                  ItemStack result = RecipesFreezer.getInstance().getFreezingResult((ItemStack)this.inventory.get(0), (ItemStack)this.inventory.get(1));
                  if (result.isEmpty()) return false;
                  else {
                      ItemStack output = (ItemStack)this.inventory.get(3);
                      if (output.isEmpty()) return true;
                      if (!output.isItemEqual(result)) return false;
                      int res = output.getCount() + result.getCount();
                      return res <= getInventoryStackLimit() && res <= output.getMaxStackSize();
                  }
              }
          }
      
          public void freezeItem(){
              if (this.canFreeze()){
                  ItemStack input1 = this.inventory.get(0);
                  ItemStack input2 = this.inventory.get(1);
                  ItemStack result = RecipesFreezer.getInstance().getFreezingResult(input1, input2);
                  ItemStack output = (ItemStack)this.inventory.get(3);
      
                  if (output.isEmpty()) this.inventory.set(3, result.copy());
                  else if (output.getItem() == result.getItem()) output.grow(result.getCount());
      
                  input1.shrink(1);
                  input2.shrink(1);
              }
          }
      
           public static int getItemFreezeTime(ItemStack fuel){
              if (fuel.isEmpty()) return 0;
              else {
                  Item item = fuel.getItem();
      
                  if (item instanceof ItemBlock && Block.getBlockFromItem(item) != Blocks.AIR){
                      Block block = Block.getBlockFromItem(item);
      
                      if (block == Blocks.SNOW) return 200;
                      if (block == Blocks.ICE) return 1000;
                      if (block == Blocks.PACKED_ICE) return 16000;
                  }
                  return GameRegistry.getFuelValue(fuel);
              }
           }
      
           public static boolean isItemFuel(ItemStack fuel){
              return getItemFreezeTime(fuel) > 0;
           }
      
          @Override
          public boolean isUsableByPlayer(EntityPlayer player) {
              return this.world.getTileEntity(this.pos) != this ? false : player.getDistanceSq((double)this.pos.getX() + 0.5D, (double)this.pos.getY() + 0.5D, (double)this.pos.getZ() + 0.5D) <= 64.0D;
          }
      
          @Override
          public void openInventory(EntityPlayer player) {
      
          }
      
          @Override
          public void closeInventory(EntityPlayer player) {
      
          }
      
          @Override
          public boolean isItemValidForSlot(int index, ItemStack stack) {
              if (index == 3) return false;
              else if (index != 2) return true;
              else {
                  return isItemFuel(stack);
              }
          }
      
          public String getGuiID(){
              return "feurimod:freezer";
          }
      
          @Override
          public int getField(int id) {
              switch (id){
                  case 0:
                      return this.burnTime;
                  case 1:
                      return this.currentBurnTime;
                  case 2:
                      return this.freezeTime;
                  case 3:
                      return this.totalFreezeTime;
                  default:
                      return 0;
              }
          }
      
          @Override
          public void setField(int id, int value) {
              switch (id){
                  case 0:
                      this.burnTime = value;
                      break;
                  case 1:
                      this.currentBurnTime = value;
                      break;
                  case 2:
                      this.freezeTime = value;
                      break;
                  case 3:
                      this.totalFreezeTime = value;
              }
          }
      
          @Override
          public int getFieldCount() {
              return 4;
          }
      
          @Override
          public void clear() {
              this.inventory.clear();
          }
      }
      
      

      Merci d’avance, Luky.

      Je travail actuellement sur le Feurimod, un mod à l'origine pour un serveur entre potes en 1.12.2, mais le projet de serveur aillant été abandonné, je le termine pour mon propre plaisir.
      Je suis un membre apprécié et joueur, j'ai déjà obtenu 3 points de réputation.

      1 réponse Dernière réponse Répondre Citer 0
      • pazzazzoP Hors-ligne
        pazzazzo
        dernière édition par

        Tu n’as cas faire en sorte de supprimé un des items en question

        Clique sur ^ en bas a droite de de mon message s'il te plait

        1 réponse Dernière réponse Répondre Citer 0
        • blixow14B Hors-ligne
          blixow14
          dernière édition par blixow14

          Cela n’est pas plutôt du à la fonction “transfertStackInSlot” de la classe du container ? Essaie de regarde de ce côté là

          J'aime les pâtes

          1 réponse Dernière réponse Répondre Citer 0
          • Ck_LukyC Hors-ligne
            Ck_Luky
            dernière édition par

            Bonjour, je reviens sur ce topic puisque mon pc accepte enfin de relancer IntelliJ IDEA.
            Je suis vraiment assez nul en dévceloppement sur java donc voici ma fonction transferStackInSlot:

            @Override
                public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) {
                    ItemStack stack = ItemStack.EMPTY;
                    Slot slot = (Slot)this.inventorySlots.get(index);
            
                    if (slot != null && slot.getHasStack()){
                        ItemStack stack1 = slot.getStack();
                        stack = stack1.copy();
            
                        if (index == 3){
                            if (!this.mergeItemStack(stack, 4, 40, true)) return ItemStack.EMPTY;
                            slot.onSlotChange(stack1, stack);
                        }
                        else if (index != 2 && index != 1 && index != 0){
                            Slot slot1 = (Slot)this.inventorySlots.get(index + 1);
            
                            if (!RecipesFreezer.getInstance().getFreezingResult(stack1, slot1.getStack()).isEmpty()){
                                if (!this.mergeItemStack(stack1, 0, 2, false)){
                                    return ItemStack.EMPTY;
                                }
                                else if (TileEntityFreezer.isItemFuel(stack1)){
                                    if (!this.mergeItemStack(stack1,2, 3, false)) return ItemStack.EMPTY;
                                }
                                else if (TileEntityFreezer.isItemFuel(stack1)){
                                    if (!this.mergeItemStack(stack1,2, 3, false)) return ItemStack.EMPTY;
                                }
                                else if (TileEntityFreezer.isItemFuel(stack1)){
                                    if (!this.mergeItemStack(stack1,2, 3, false)) return ItemStack.EMPTY;
                                }
                                else if (index >= 4 && index < 31){
                                    if (!this.mergeItemStack(stack1, 31, 40, false)) return ItemStack.EMPTY;
                                }
                                else if (index >= 31 && index < 40 && !this.mergeItemStack(stack1, 4, 31, false)){
                                    return ItemStack.EMPTY;
                                }
                            }
                        }
                        else if (!this.mergeItemStack(stack1, 4, 40, false)){
                            return ItemStack.EMPTY;
                        }
                        if (stack1.isEmpty()){
                            slot.putStack(ItemStack.EMPTY);
                        }
                        else{
                            slot.onSlotChanged();
                        }
                        if (stack1.getCount() == stack.getCount()){
                            return ItemStack.EMPTY;
                        }
                        slot.onTake(playerIn, stack1);
                    }
                    return stack;
                }
            

            Je travail actuellement sur le Feurimod, un mod à l'origine pour un serveur entre potes en 1.12.2, mais le projet de serveur aillant été abandonné, je le termine pour mon propre plaisir.
            Je suis un membre apprécié et joueur, j'ai déjà obtenu 3 points de réputation.

            1 réponse Dernière réponse Répondre Citer 0
            • Ck_LukyC Hors-ligne
              Ck_Luky
              dernière édition par

              Up!

              Je travail actuellement sur le Feurimod, un mod à l'origine pour un serveur entre potes en 1.12.2, mais le projet de serveur aillant été abandonné, je le termine pour mon propre plaisir.
              Je suis un membre apprécié et joueur, j'ai déjà obtenu 3 points de réputation.

              1 réponse Dernière réponse Répondre Citer 0
              • ZunF1xZ Hors-ligne
                ZunF1x
                dernière édition par

                Ce message a été supprimé !
                1 réponse Dernière réponse Répondre Citer 0
                • baztoul76B Hors-ligne
                  baztoul76
                  dernière édition par baztoul76

                  je ne pense pas parce que le client envoie des paquets au serveur, le serveur ne détecte pas que le joueur clique sur telle ou telle chose il se contente juste d’actualiser dans ses données quand le client envoie une action

                  EDIT :
                  en plus dans le cas de @Ck_Luky il n’y a pas de serveur parce qu’il est en solo

                  je ne suis pas le plus compétent en développement de mod, mais je fais de mon mieux pour aider quand même

                  U 1 réponse Dernière réponse Répondre Citer 0
                  • Ck_LukyC Hors-ligne
                    Ck_Luky
                    dernière édition par

                    !up

                    Je travail actuellement sur le Feurimod, un mod à l'origine pour un serveur entre potes en 1.12.2, mais le projet de serveur aillant été abandonné, je le termine pour mon propre plaisir.
                    Je suis un membre apprécié et joueur, j'ai déjà obtenu 3 points de réputation.

                    1 réponse Dernière réponse Répondre Citer 0
                    • U Hors-ligne
                      UtopiePhysique @baztoul76
                      dernière édition par UtopiePhysique

                      @baztoul76 Lors que tu accèdes à un four le client envoie une donnée au serveur, puisque sinon tu ne pourrais pas savoir les items contenu dans celui-ci …

                      Tu peux simuler côté client l’ouverture, mais t’auras un four vide … En gros juste l’affichage de l’UI. Idem avec les coffres etc.

                      Tout stockages est réclamé par le client.

                      Ensuite “il n’a pas de serveur”, le solo est un serveur et un client sur une même application, il y à donc forcément bien un serveur sinon le jeu ne peut pas fonctionner … Minecraft n’a pas de système différent, c’est serveur + client 2 en 1 ou les 2 séparés. (Du moins le client possède le serveur mais ne l’utilise pas ne multijoueur).

                      Sinon je peux pas t’aider je ne connais pas bien encore les fours customs. 🙂

                      1 réponse Dernière réponse Répondre Citer 0
                      • robin4002R robin4002 a déplacé ce sujet de Support pour les moddeurs sur
                      • 1 / 1
                      • Premier message
                        Dernier message
                      Design by Woryk
                      ContactMentions Légales

                      MINECRAFT FORGE FRANCE © 2024

                      Powered by NodeBB