Résolu CustomContainer : modifier les maxStackSize
-
Bonjour à tous !
J’écris ce petit topic pour vous demander vos avis ou vos idées concernant un partie de mon mod.
Pour faire simple, la totalité de mes Items ont un MaxStackSize de 1 et je souhaiterai faire un block (équivalent à un gros chest peut être ?) dans lequel les itemstack pourraient atteindre la size de 64 (Le top serait que lorsqu’un joueur retire un objet, un seul itemstack de size 1 lui est rendu).
Pour l’instant la seule idée que j’ai eu serait plutot de faire un bloc avec GUI et tile entity qui peut “recevoir” les objets un par un. Il détecte l’objet et incrémente une variable (associée à l’objet détecté) dans la tileEntity. Inversement, le block serait capable de rendre les objets un par un (avec un bouton “retrait” sur le GUI par exemple ?) et décrémenterait la variable associée dans la tileEntity.
Le soucis est que ça fait beaucoup puisque chaque item aurait une variable et un bouton associé …
Du coup je suis ouvert à toutes vos propositionsJe vous remercie d’avance et je vous souhaite une bonne journée !
~Myrilandel -
Même si tu as mis setMaxStackSize, quand tu fait lestack.stackSize = quelque chose, la limite n’es pas vérifiée donc tu n’as pas besoin de tembeter
Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
-
Salut AymericRed et merci de ta réponse.
En fait, j’aimerai effectivement que le stackSize augmente dans le coffre indépendemment du MaxStackSize.
Seulement comme ce coffre est associé à un Container, le container vérifie que le StackSize est bien inférieur ou égal au MaxStackSize de l’objet (dans les méthodes slotClick(), mergeItemStack(), isStackable() …).
Du coup je me demande si ça vaudrait plus le coup de redéfinir les méthodes ou plutot de partir sur une “Machine” avec des entrées/sorties. -
Ou sinon, tu peux te servir des metadatas. Genre si ton item se trouve hors de ton container, metadata 0, sinon c’est qu’il est dedans, alors metadata 1. Ensuite tu override la méthode onUpdate(blabla) et tu vérifies ton metadata, et en fonction de cela tu adaptes la paramètre de setMaxStackSize. Y’a sûrement une autre méthode moins dégueu après, j’pense ^^’
-
Non sinon redéfinir les fonctions peut être un bon moyen, tu les copies dans ton Container, tu fais ctrl+f (recherche) et tu recherches stackSize et à chaque endroit, si ça gène tu enlèves.
-
Salut Plaigon, merci à toi aussi !
C’est vrai que je n’avais pas pensé à utiliser les metadatas pour ça. L’ennuie c’est que j’ai pas mal d’Items dans le mod et ça risque de me faire une sacrée dose de copier/coller, je garde quand même l’idée dans un coin de ma tête ça me sera certainement utile à un moment donnéJe suis en train de tester les redéfinitions de méthodes, je pars sur un customContainer pour pas que ça fasse trop fouilli, je vous tiens au courant de ce que ça donne !
Hésitez pas si vous avez d’autres idées pendant ce temps, je suis preneur
Merci pour votre aide en tout cas ! -
Ah et aussi, pendant que j’y pense, si tu retires les vérifications, les limites de l’inventaire du joueur ne seront pas check non plus, il faudrait que tu vérifies si le slot est de l’inv du joueur ou de ton coffre au début des fonctions (si possible) et puis appelé la fonction de la superclass si c’est l’inv vanilla.
-
Justement j’en viens à cette étape
Pour l’instant les stacks s’empilent bien dans le coffre et il est uniquement possible de déposer et retirer les items un par un.
Il ne reste plus qu’à faire en sorte qu’ils ne se stackent pas dans l’inventaire du joueur et le tour est joué !
Quand ce sera fini je posterai la métode dans le post (au cas où ça puisse servir à quelqu’un… Et si j’y arrive !)Par contre j’ai un petit bug qui apparait de temps à autres (je n’arrive pas bien à cerner à quel moment). Mais en gros au bout d’un certains nombre de manipulation dans le coffre, je ne peux plus déplacer aucun item avec la souris (que ce soit de l’inventaire du joueur vers le coffre ou inversement. Les déplacements au sein du coffre ou au sein de l’inventaire du joueur sont eux aussi impossibles). Si jamais vous avez des idées !
A plus tard
EDIT : Voilà, tout est modifié et tout fonctionne ! Encore merci pour votre aide
Je pose ici les redéfinitions des méthodes si quelqu’un en a besoin !
:::public ItemStack transferStackInSlot(EntityPlayer player, int slotIndex) { /* On modifie légèrement en ajoutant un test (slot.inventory instanceof InventoryPlayer) * Les transfert via shift + Click seront donc possible uniquement dans le sens * inventaire du joueur -> Coffre. * Cela permet d'empiler les stacks automatiquement dans le coffre et de ne pas pouvoir retirer * d'itemStacks de stackSize > 1. */ ItemStack itemstack = null; Slot slot = (Slot)this.inventorySlots.get(slotIndex); if(slot != null && slot.getHasStack() && slot.inventory instanceof InventoryPlayer) { ItemStack itemstack1 = slot.getStack(); itemstack = itemstack1.copy(); if(slotIndex < this.tileEntityBanque.getSizeInventory()) { if(!this.mergeItemStack(itemstack1, this.tileEntityBanque.getSizeInventory(), this.inventorySlots.size(), true)) return null; } else if(!this.mergeItemStack(itemstack1, 0, this.tileEntityBanque.getSizeInventory(), false)) return null; if(itemstack1.stackSize == 0) slot.putStack((ItemStack)null); else slot.onSlotChanged(); } return itemstack; } @Override public ItemStack slotClick(int indexSlot, int mouseButon, int function, EntityPlayer entityPlayer) { /* On redéfinie la fonction de telle sorte à ce que les itemStacks soient déposées ou retirées par pile de 1. * Si l'itemStack est déposé dans le coffre, il peut se stacker avec les items déjà présents et atteindre une * stackSize de 64. * Si l'itemStack est déposé dans l'inventaire du joueur, il ne peut pas avoir de stackSize > 1\. */ ItemStack itemstack = null; InventoryPlayer inventoryplayer = entityPlayer.inventory; int i1; ItemStack itemstack3; if (function == 5) { int l = this.field_94536_g; this.field_94536_g = func_94532_c(mouseButon); if ((l != 1 || this.field_94536_g != 2) && l != this.field_94536_g) { this.func_94533_d(); } else if (inventoryplayer.getItemStack() == null) { this.func_94533_d(); } else if (this.field_94536_g == 0) { this.field_94535_f = func_94529_b(mouseButon); if (func_94528_d(this.field_94535_f)) { this.field_94536_g = 1; this.field_94537_h.clear(); } else { this.func_94533_d(); } } else if (this.field_94536_g == 1) { Slot slot = (Slot)this.inventorySlots.get(indexSlot); if (slot != null && func_94527_a(slot, inventoryplayer.getItemStack(), true) && slot.isItemValid(inventoryplayer.getItemStack()) && inventoryplayer.getItemStack().stackSize > this.field_94537_h.size() && this.canDragIntoSlot(slot)) { this.field_94537_h.add(slot); } } else if (this.field_94536_g == 2) { if (!this.field_94537_h.isEmpty()) { itemstack3 = inventoryplayer.getItemStack().copy(); i1 = inventoryplayer.getItemStack().stackSize; Iterator iterator = this.field_94537_h.iterator(); while (iterator.hasNext()) { Slot slot1 = (Slot)iterator.next(); if (slot1 != null && func_94527_a(slot1, inventoryplayer.getItemStack(), true) && slot1.isItemValid(inventoryplayer.getItemStack()) && inventoryplayer.getItemStack().stackSize >= this.field_94537_h.size() && this.canDragIntoSlot(slot1)) { ItemStack itemstack1 = itemstack3.copy(); int j1 = slot1.getHasStack() ? slot1.getStack().stackSize : 0; func_94525_a(this.field_94537_h, this.field_94535_f, itemstack1, j1); if (itemstack1.stackSize > 64) { itemstack1.stackSize = 64; } if (itemstack1.stackSize > slot1.getSlotStackLimit()) { itemstack1.stackSize = slot1.getSlotStackLimit(); } i1 -= itemstack1.stackSize - j1; slot1.putStack(itemstack1); } } itemstack3.stackSize = i1; if (itemstack3.stackSize <= 0) { itemstack3 = null; } inventoryplayer.setItemStack(itemstack3); } this.func_94533_d(); } else { this.func_94533_d(); } } else if (this.field_94536_g != 0) { this.func_94533_d(); } else { Slot slot2; int l1; ItemStack itemstack5; if ((function == 0 || function == 1) && (mouseButon == 0 || mouseButon == 1)) { if (indexSlot == -999) { if (inventoryplayer.getItemStack() != null && indexSlot == -999) { if (mouseButon == 0 || mouseButon == 1) { entityPlayer.dropPlayerItemWithRandomChoice(inventoryplayer.getItemStack().splitStack(1), true); if (inventoryplayer.getItemStack().stackSize == 0) { inventoryplayer.setItemStack((ItemStack)null); } } } } else if (function == 1) { if (indexSlot < 0) { return null; } slot2 = (Slot)this.inventorySlots.get(indexSlot); if (slot2 != null && slot2.canTakeStack(entityPlayer)) { itemstack3 = this.transferStackInSlot(entityPlayer, indexSlot); if (itemstack3 != null) { Item item = itemstack3.getItem(); itemstack = itemstack3.copy(); if (slot2.getStack() != null && slot2.getStack().getItem() == item) { this.retrySlotClick(indexSlot, mouseButon, true, entityPlayer); } } } } else { if (indexSlot < 0) { return null; } slot2 = (Slot)this.inventorySlots.get(indexSlot); if (slot2 != null) { itemstack3 = slot2.getStack(); ItemStack itemstack4 = inventoryplayer.getItemStack(); if (itemstack3 != null) { itemstack = itemstack3.copy(); } if (itemstack3 == null) { if (itemstack4 != null && slot2.isItemValid(itemstack4)) { l1 = 1;//mouseButon == 0 ? itemstack4.stackSize : 1; if (l1 > slot2.getSlotStackLimit()) { l1 = slot2.getSlotStackLimit(); } if (itemstack4.stackSize >= l1) { slot2.putStack(itemstack4.splitStack(l1)); } if (itemstack4.stackSize == 0) { inventoryplayer.setItemStack((ItemStack)null); } } } else if (slot2.canTakeStack(entityPlayer)) { if (itemstack4 == null) { l1 = 1;//mouseButon == 0 ? itemstack3.stackSize : (itemstack3.stackSize + 1) / 2; itemstack5 = slot2.decrStackSize(l1); inventoryplayer.setItemStack(itemstack5); if (itemstack3.stackSize == 0) { slot2.putStack((ItemStack)null); } slot2.onPickupFromSlot(entityPlayer, inventoryplayer.getItemStack()); } else if (slot2.isItemValid(itemstack4)) { if (itemstack3.getItem() == itemstack4.getItem() && itemstack3.getItemDamage() == itemstack4.getItemDamage() && ItemStack.areItemStackTagsEqual(itemstack3, itemstack4)) { l1 = 1;//mouseButon == 0 ? itemstack4.stackSize : 1; if (l1 > slot2.getSlotStackLimit() - itemstack3.stackSize) { l1 = slot2.getSlotStackLimit() - itemstack3.stackSize; } if (l1 > itemstack4.getMaxStackSize() - itemstack3.stackSize) { l1 = itemstack4.getMaxStackSize() - itemstack3.stackSize; } //Partie Modifiée - START// if(!(slot2.inventory == inventoryplayer)) { l1 = 1; itemstack4.splitStack(l1); itemstack3.stackSize += l1; } else { itemstack4.splitStack(l1); slot2.onPickupFromSlot(entityPlayer, inventoryplayer.getItemStack()); inventoryplayer.setItemStack(itemstack4); } if (itemstack4.stackSize == 0) { inventoryplayer.setItemStack((ItemStack)null); } //Partie Modifiée - END// } else if (itemstack4.stackSize <= slot2.getSlotStackLimit()) { slot2.putStack(itemstack4); inventoryplayer.setItemStack(itemstack3); } } else if (itemstack3.getItem() == itemstack4.getItem() && itemstack4.getMaxStackSize() > 1 && (!itemstack3.getHasSubtypes() || itemstack3.getItemDamage() == itemstack4.getItemDamage()) && ItemStack.areItemStackTagsEqual(itemstack3, itemstack4)) { l1 = itemstack3.stackSize; if (l1 > 0 && l1 + itemstack4.stackSize <= itemstack4.getMaxStackSize()) { itemstack4.stackSize += l1; itemstack3 = slot2.decrStackSize(l1); if (itemstack3.stackSize == 0) { slot2.putStack((ItemStack)null); } slot2.onPickupFromSlot(entityPlayer, inventoryplayer.getItemStack()); } } } slot2.onSlotChanged(); } } } else if (function == 2 && mouseButon >= 0 && mouseButon < 9) { slot2 = (Slot)this.inventorySlots.get(indexSlot); if (slot2.canTakeStack(entityPlayer)) { itemstack3 = inventoryplayer.getStackInSlot(mouseButon); boolean flag = itemstack3 == null || slot2.inventory == inventoryplayer && slot2.isItemValid(itemstack3); l1 = -1; if (!flag) { l1 = inventoryplayer.getFirstEmptyStack(); flag |= l1 > -1; } if (slot2.getHasStack() && flag) { itemstack5 = slot2.getStack(); inventoryplayer.setInventorySlotContents(mouseButon, itemstack5.copy()); if ((slot2.inventory != inventoryplayer || !slot2.isItemValid(itemstack3)) && itemstack3 != null) { if (l1 > -1) { inventoryplayer.addItemStackToInventory(itemstack3); slot2.decrStackSize(itemstack5.stackSize); slot2.putStack((ItemStack)null); slot2.onPickupFromSlot(entityPlayer, itemstack5); } } else { slot2.decrStackSize(itemstack5.stackSize); slot2.putStack(itemstack3); slot2.onPickupFromSlot(entityPlayer, itemstack5); } } else if (!slot2.getHasStack() && itemstack3 != null && slot2.isItemValid(itemstack3)) { inventoryplayer.setInventorySlotContents(mouseButon, (ItemStack)null); slot2.putStack(itemstack3); } } } else if (function == 3 && entityPlayer.capabilities.isCreativeMode && inventoryplayer.getItemStack() == null && indexSlot >= 0) { slot2 = (Slot)this.inventorySlots.get(indexSlot); if (slot2 != null && slot2.getHasStack()) { itemstack3 = slot2.getStack().copy(); itemstack3.stackSize = itemstack3.getMaxStackSize(); inventoryplayer.setItemStack(itemstack3); } } else if (function == 4 && inventoryplayer.getItemStack() == null && indexSlot >= 0) { slot2 = (Slot)this.inventorySlots.get(indexSlot); if (slot2 != null && slot2.getHasStack() && slot2.canTakeStack(entityPlayer)) { itemstack3 = slot2.decrStackSize(mouseButon == 0 ? 1 : slot2.getStack().stackSize); slot2.onPickupFromSlot(entityPlayer, itemstack3); entityPlayer.dropPlayerItemWithRandomChoice(itemstack3, true); } } else if (function == 6 && indexSlot >= 0) { slot2 = (Slot)this.inventorySlots.get(indexSlot); itemstack3 = inventoryplayer.getItemStack(); if (itemstack3 != null && (slot2 == null || !slot2.getHasStack() || !slot2.canTakeStack(entityPlayer))) { i1 = mouseButon == 0 ? 0 : this.inventorySlots.size() - 1; l1 = mouseButon == 0 ? 1 : -1; for (int i2 = 0; i2 < 2; ++i2) { for (int j2 = i1; j2 >= 0 && j2 < this.inventorySlots.size() && itemstack3.stackSize < itemstack3.getMaxStackSize(); j2 += l1) { Slot slot3 = (Slot)this.inventorySlots.get(j2); if (slot3.getHasStack() && func_94527_a(slot3, itemstack3, true) && slot3.canTakeStack(entityPlayer) && this.func_94530_a(itemstack3, slot3) && (i2 != 0 || slot3.getStack().stackSize != slot3.getStack().getMaxStackSize())) { int k1 = Math.min(itemstack3.getMaxStackSize() - itemstack3.stackSize, slot3.getStack().stackSize); ItemStack itemstack2 = slot3.decrStackSize(k1); itemstack3.stackSize += k1; if (itemstack2.stackSize <= 0) { slot3.putStack((ItemStack)null); } slot3.onPickupFromSlot(entityPlayer, itemstack2); } } } } this.detectAndSendChanges(); } } return itemstack; } @Override protected boolean mergeItemStack(ItemStack itemStack, int start, int end, boolean backward) { /* Ici, on redéfinie la méthode en remplaçant simplement quelques condtions. * Dans la méthode de la classe Container mère on trouve un test if (itemStack.isStackable()). * La méthode isStackable() est définie comme : * public boolean isStackable() { return this.getMaxStackSize() > 1 && (!this.isItemStackDamageable() || !this.isItemDamaged()); } * Il faut alors simplement faire sauter la partie getMaxStackSize() > 1\. Le test devient donc * if (!itemStack.isItemStackDamageable() || !itemStack.isItemDamaged()) * * Par la suite, il suffit simplement de remplacer les itemStack.getMaxStackSize() par 64 * car on ne peut stacker les objets que le coffre (Grace à la modification de la méthode transferStackInSlot */ boolean flag1 = false; int k = start; if (backward) { k = end - 1; } Slot slot; ItemStack itemstack1; if (!itemStack.isItemStackDamageable() || !itemStack.isItemDamaged()) { while (itemStack.stackSize > 0 && (!backward && k < end || backward && k >= start)) { slot = (Slot)this.inventorySlots.get(k); itemstack1 = slot.getStack(); if (itemstack1 != null && itemstack1.getItem() == itemStack.getItem() && (!itemStack.getHasSubtypes() || itemStack.getItemDamage() == itemstack1.getItemDamage()) && ItemStack.areItemStackTagsEqual(itemStack, itemstack1)) { int l = itemstack1.stackSize + itemStack.stackSize; //if (l <= itemStack.getMaxStackSize()) if (l <= 64) { itemStack.stackSize = 0; itemstack1.stackSize = l; slot.onSlotChanged(); flag1 = true; } //else if (itemstack1.stackSize < itemStack.getMaxStackSize()) else if (itemstack1.stackSize < 64) { //itemStack.stackSize -= itemStack.getMaxStackSize() - itemstack1.stackSize; //itemstack1.stackSize = itemStack.getMaxStackSize(); itemStack.stackSize -= 64 - itemstack1.stackSize; itemstack1.stackSize = 64; slot.onSlotChanged(); flag1 = true; } } if (backward) { --k; } else { ++k; } } } if (itemStack.stackSize > 0) { if (backward) { k = end - 1; } else { k = start; } while (!backward && k < end || backward && k >= start) { slot = (Slot)this.inventorySlots.get(k); itemstack1 = slot.getStack(); if (itemstack1 == null) { slot.putStack(itemStack.copy()); slot.onSlotChanged(); itemStack.stackSize = 0; flag1 = true; break; } if (backward) { --k; } else { ++k; } } } return flag1; } }
:::