Résolu Filtre : buffer slot
-
Bonjour ! Je suis en trains d’améliorer mon détecteur de block : je lui ai mis une interface pour pouvoir choisir quel block, il vas pouvoir détecter (avec un slot). Le Problème c’est que je n’arrive pas à faire en sorte que lorsqu’on essaye de poser un item dedans, il soit enregistré dans le slot mais qu’il reste dans l’inventaire du joueur. J’ai essayé de plusieurs manières mais ça ne fonctionne pas.
Aidez-moi, s’il vois plais. -
Soit tu modifie la fonction slotClick de ton container (qui est très longue), soit tu fais un slot custom et quand la fonction setSlotsContents est appelée, tu remet l’item dans l’inventaire du joueur.
-
J’ai réussi à remettre l’item dans l’inventaire du joueur grâce à un slot custom mais est-ce qu’il est possible de mettre l’item directement sur le curseur du joueur et non pas dans la première case vide du joueur ?
Voici la fonction :
public void putStack(ItemStack stack) { if (stack != null) { ItemStack stack2 = stack.copy(); stack2.stackSize = 1; this.inventory.setInventorySlotContents(0, stack2);; this.player.inventory.setItemStack(stack); } this.onSlotChanged(); }
[edit] :
C’est bon, j’ai trouvé comment faire : il fait this.player.inventory.setItemStack(stack);
Voici la version modifiée :public void putStack(ItemStack stack) { if (stack != null) { ItemStack stack2 = stack.copy(); stack2.stackSize = 1; this.inventory.setInventorySlotContents(0, stack2); if (player.inventory.getItemStack().getItem() == stack.getItem()) { ItemStack stack3 = player.inventory.getItemStack(); if (stack3.stackSize + stack.stackSize > stack3.getItem().getItemStackLimit(stack3)) { stack3.stackSize = stack3.getItem().getItemStackLimit(stack3); stack.stackSize = stack3.stackSize + stack.stackSize - stack3.getItem().getItemStackLimit(stack3); this.player.inventory.addItemStackToInventory(stack); } else stack3.stackSize = stack3.stackSize + stack.stackSize; } else if (player.inventory.getItemStack().getItem() == null) this.player.inventory.setItemStack(stack); else this.player.inventory.addItemStackToInventory(stack); } this.onSlotChanged(); }
Mais il y a toujours un problème : si je fait shit click pour mettre un item dans mon slot, l’item disparais.
Et deuxième problème, si il y a un item dans le slot et que je tente de placer un item différent à la place, l’item du buffer arrive sur le curseur (ce que je ne veut pas) et l’item du curseur ce met dans le buffer.
-
Pour le premier problème, regarde la fonction transfertStackInSlot de ton container
-
Merci !
J’ai mis ça pour la fonction et ça à l’aire de marcher.public ItemStack transferStackInSlot(EntityPlayer player, int slotIndex) { Slot slot = (Slot)this.inventorySlots.get(slotIndex); if(slot != null && slot.getHasStack()) { ItemStack stack = slot.getStack(); ItemStack stack1 = stack.copy(); stack1.stackSize = 1; this.tileEntity.setInventorySlotContents(0, stack1); } return null; }
Pour le deuxième problème, la fonction putStack(ItemStack stack) de mon slot custom est bien appelée mais ne fonctionne pas comme il faut.
-
Pour le deuxième problème, j’ai fini par trouver une solution :
@Override public void putStack(ItemStack stack) { if (stack != null) { ItemStack newStack = stack.copy(); ItemStack oldStack = this.inventory.getStackInSlot(0); newStack.stackSize = 1; if (oldStack != null) { oldStack.setItem(stack.getItem()); oldStack.stackSize = stack.stackSize; oldStack.setItemDamage(stack.getItemDamage()); } this.inventory.setInventorySlotContents(0, newStack); ItemStack playerStack = player.inventory.getItemStack(); if (playerStack != null && playerStack.getItem() == stack.getItem()) { if (playerStack.stackSize + stack.stackSize > playerStack.getItem().getItemStackLimit(playerStack)) { playerStack.stackSize = playerStack.getItem().getItemStackLimit(playerStack); stack.stackSize = playerStack.stackSize + stack.stackSize - playerStack.getItem().getItemStackLimit(playerStack); this.player.inventory.addItemStackToInventory(stack); } else { playerStack.stackSize = playerStack.stackSize + stack.stackSize; } } else if (playerStack != null && player.inventory.getItemStack().getItem() != null) { this.player.inventory.addItemStackToInventory(stack); } } this.onSlotChanged(); }
Mais entre temps, j’ai trouvé deux autres bugs :
- Lorsqu’il y a un item dans le slot et que j’ai le même item dans l’inventaire, si je fait double-click sur celui de mon inventaire, ça essai de prendre celui qui est dans le slot et ça crash.
- Si je met un hopper/dropper (avec un item) en direction de mon block detector, l’item vas aller dans le slot buffer et donc est perdu. Comment faire pour désactiver l’interaction entre hopper/dropper et mon block ?
- Si je met ma souris sur le slot et que je click sur une touche de chiffre, de 1 à 9, le slot ce comporte comme un slot normal.
[edit] :
Pour le premier nouveau problème, j’ai trouvé, il suffit d’ajouter au container ça :@Override public boolean canMergeSlot(ItemStack stack, Slot slot) { return !(slot instanceof BufferSlot); }
-
pour le 2 : tu dois implémenter ISidedInventory et modifier les fonctions canInsertItem, canExtractItem et getAccessibleSlotsFromSide
-
Merci, ça à bien corrigé le problème.
Pour le problème suivant, je crois que je vais être obligé de modifier la fonction “slotClick” de mon container. -
Je pense, mais je crois qu’il y a une autre fonction qui s’occupe de ça, à vérifier.
-
C’est bon, j’ai trouvé une solution :
:::@Override public ItemStack slotClick(int slotId, int clickedButton, int mode, EntityPlayer playerIn) { if (mode == 2 && clickedButton >= 0 && clickedButton < 9) //Ici, c'est la partie intéressante { Slot clickedSlot = (Slot)this.inventorySlots.get(slotId); if (clickedSlot.canTakeStack(playerIn)) { InventoryPlayer inventoryPlayer = playerIn.inventory; ItemStack hotbarStack = inventoryPlayer.getStackInSlot(clickedButton); if (clickedSlot.inventory != inventoryPlayer) { if (hotbarStack == null) { return null; } else { ItemStack newStack = hotbarStack.copy(); newStack.stackSize = 1; clickedSlot.putStack(newStack); return null; } } } } else if (mode == 1 && (clickedButton == 0 || clickedButton == 1)) //Ici, c'est pour fixer un autre petit problème avec le chift-click { Slot clickedSlot = (Slot)this.inventorySlots.get(slotId); if (clickedSlot != null && clickedSlot.canTakeStack(playerIn) && clickedSlot.inventory != playerIn.inventory) { clickedSlot.decrStackSize(clickedSlot.getStack().stackSize); return null; } } return super.slotClick(slotId, clickedButton, mode, playerIn); }
:::
Je fait encore quelques essais pour voir si il n’y a plus de bug et ensuite, je met le poste en résolu. Merci à tous pour votre aide !