Problème avec des Slot



  • Bonjour,

    J'ai créer une machine en suivant un tuto de membre. Presque tout marche.

    Je m'explique, dans la machine, il y a 4 Slots d'input, 2 de fuel et un d'output. Il n'y a aucun soucis sur les Slots d'output ou de fuel mais en revanche les Slots d'input ne fonctionnent pas vraiment bien.

    En effet, lorsque qu'un ItemStack est présent sur le Slot, le shift-clic, le clic droit et même le clic gauche de fonctionne pas bien voire pas du tout. Le clic gauche ne ramasse pas le stack mais drop les tiems un par un ou des fois ramasse le stack. Le shift et right clic de fonctionne pas du tout.

    Ce que je ne comprends pas, c'est que la class Slot est une classe de base du jeu, nous n'intervenant pas dessus si ?

    Si jamais une âme charitable aurait une idée. 🙂

    Merci d'avance.



  • Pour le shift-clic, il faut que tu regardes dans la fonction transfertStackInSlot de ton gui (bonne chance car la fonction est compliquée).
    Pour les autres problèmes, c'est byzarre, montre ton Container. Et as-tu des slots custom ?



  • @'AymericRed':

    Pour le shift-clic, il faut que tu regardes dans la fonction transfertStackInSlot de ton gui (bonne chance car la fonction est compliquée).
    Pour les autres problèmes, c'est byzarre, montre ton Container. Et as-tu des slots custom ?

    Merci pour ton réponse. Ce ne sont pas des classes customs (les classes customs marchent bien ^^). Avec le debug que j'ai pus faire, il me semble que la fonction transfertStackInSlot n'ai appelée que lorsque que l'on transfère dans le Slot et non pas quand on extrait les items. Je me trompe ? Ça pourrait en effet être ça le problème sinon en effet.

    Pour ce qui est du Container :

     public class ContainerSmeltery extends Container
    {
        private TileEntitySmeltery tile;
        private int currentWorkingTime;
        private int totalWorkingTime;
        private int remainingFuelTime;
        private int totalCurrentFuelTime;
        private int remainingWaterQuantity;
        private int totalWaterCapacity;
    
        public ContainerSmeltery(TileEntitySmeltery tile, InventoryPlayer inventory)
        {
            this.tile = tile;
    
            // INPUTS
            this.addSlotToContainer(new Slot(tile, 0, 45, -9));
            this.addSlotToContainer(new Slot(tile, 1, 69, -9));
            this.addSlotToContainer(new Slot(tile, 2, 93, -9));
            this.addSlotToContainer(new Slot(tile, 3, 117, -9));
    
            // FUEL
            this.addSlotToContainer(new Slot(tile, 4, 44, 39));
            this.addSlotToContainer(new Slot(tile, 5, 117, 39));
    
            // OUTPUTS
            this.addSlotToContainer(new SlotOutput(tile, 6, 80, 39));
    
            this.bindPlayerInventory(inventory);
        }
    
        private void bindPlayerInventory(InventoryPlayer inventory)
        {
            int i;
            int j;
            for(i = 0; i < 3; ++i)
            {
                for(j = 0; j < 9; ++j)
                    this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 9 + j * 18, 66 + i * 18 + 17));
            }
    
            for(i = 0; i < 9; ++i)
                this.addSlotToContainer(new Slot(inventory, i, 9 + i * 18, 124 + 17));
        }
    
        @Override
        public ItemStack transferStackInSlot(EntityPlayer player, int quantity)
        {
            System.out.println("Transfer stack in slot");
            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.tile.getSizeInventory())
                {
                    if(!this.mergeItemStack(itemstack1, this.tile.getSizeInventory(), this.inventorySlots.size(), true))
                        return null;
                }
                else if(!this.mergeItemStack(itemstack1, 0, this.tile.getSizeInventory(), false))
                    return null;
                if(itemstack1.stackSize == 0)
                    slot.putStack((ItemStack)null);
                else
                    slot.onSlotChanged();
            }
            return itemstack;
        }
    
        @Override
        public boolean canInteractWith(EntityPlayer player)
        {
            return this.tile.isUseableByPlayer(player);
        }
    
        @Override
        public void onContainerClosed(EntityPlayer player)
        {
            super.onContainerClosed(player);
            this.tile.closeInventory(player);
        }
    
        @Override
        public void addCraftingToCrafters(ICrafting crafting)
        {
            super.addCraftingToCrafters(crafting);
            for(int i = 0; i < this.tile.getFieldCount(); i++)
                crafting.sendProgressBarUpdate(this, i, this.tile.getField(i));
            crafting.func_175173_a(this, this.tile);
        }
    
        @Override
        public void detectAndSendChanges()
        {
            super.detectAndSendChanges();
            for(int i = 0; i < this.crafters.size(); ++i)
            {
                ICrafting icrafting = (ICrafting)this.crafters.get(i);
                for(int j = 0; j < this.tile.getFieldCount(); j++)
                {
                    if(this.getField(j) != this.tile.getField(j))
                        icrafting.sendProgressBarUpdate(this, j, this.tile.getField(j));
                }
            }
            for(int i = 0; i < this.tile.getFieldCount(); i++)
                this.setField(i, this.tile.getField(i));
        }
    
        @Override
        @SideOnly(Side.CLIENT)
        public void updateProgressBar(int id, int value)
        {
            this.tile.setField(id, value);
        }
    
        private int getField(int id)
        {
            switch(id)
            {
                case 0:
                    return this.currentWorkingTime;
                case 1:
                    return this.totalWorkingTime;
                case 2:
                    return this.remainingFuelTime;
                case 3:
                    return this.totalCurrentFuelTime;
                case 4:
                    return this.remainingWaterQuantity;
                case 5:
                    return this.totalWaterCapacity;
                default:
                    return 0;
            }
        }
    
        private void setField(int id, int value)
        {
            switch(id)
            {
                case 0:
                    this.currentWorkingTime = value;
                    break;
                case 1:
                    this.totalWorkingTime = value;
                    break;
                case 2:
                    this.remainingFuelTime = value;
                    break;
                case 3:
                    this.totalCurrentFuelTime = value;
                    break;
                case 4:
                    this.remainingWaterQuantity = value;
                    break;
                case 5:
                    this.totalWaterCapacity = value;
                    break;
            }
        }
    } 
    


  • D'après ce que je sais, transferStackInSlot est appelée quand on fait shift+clic sur un slot avec un item et la fonction doit déplacer le stack dans un slot qu'elle aura trouver, mais elle ne gère pas les clics, c'est slotClick, qui le fait, ça me paraîtrait bizarre qu'elle soit buggée, surtout que les ids de tes slots ont l'air corrects…
    PS : Quelle version de Mc (des fois que transferStackInSlot ait changé dans la dernière version).
    PS-2 : pense à mettre une balise java pour le code java au lieu d'un balise code, ça colore le texte.



  • @'AymericRed':

    D'après ce que je sais, transferStackInSlot est appelée quand on fait shift+clic sur un slot avec un item et la fonction doit déplacer le stack dans un slot qu'elle aura trouver, mais elle ne gère pas les clics, c'est slotClick, qui le fait, ça me paraîtrait bizarre qu'elle soit buggée, surtout que les ids de tes slots ont l'air corrects…
    PS : Quelle version de Mc (des fois que transferStackInSlot ait changé dans la dernière version).
    PS-2 : pense à mettre une balise java pour le code java au lieu d'un balise code, ça colore le texte.

    Merci pour le tuyau ! 😄

    Pour ce qui est de Forge c'est la 11.14.4.1563 en Minecraft 1.8.


Log in to reply