Nombre d'items dans l'inventaire
-
Bonjour, je suis en train de développer un petit mod pour minecraft, je voudrais qu’il affiche sur l’écran constamment le nombre d’émeraudes dans l’inventaire du joueur un peu comme cela:
Ici, c’est un screen où j’ai prédéfinis le nombre d’émeraudes cependant, je voudrais que ça soit automatique, pour ceux que ça intéresse voici le code que j’utilise:@EventHandler public void init(FMLInitializationEvent event) { MinecraftForge.EVENT_BUS.register(new EventManager()); }
public class EventManager { public int emeraldNumber = 25; @SubscribeEvent public void renderEmeraldsNumber(RenderGameOverlayEvent event) { if(event.type == ElementType.JUMPBAR || event.type == ElementType.EXPERIENCE) { Minecraft.getMinecraft().fontRenderer.drawString("Emeralds: " + emeraldNumber, 2, 2, 0xFFFFFF); } } }
Merci d’avance.
-
Tu peux utiliser une boucle for en accédant à l’inventaire du joueur avec Minecraft.getMinecraft().thePlayer.
PS : penses à utiliser les balises java pour que l’on puisse voir les lignes plus facilement.
-
C’est ce à quoi j’avais penser, une boucle for qui test pour chaque slot si l’item est de l’emeraude, et si oui ajouter à une variable le nombre d’émeraudes, mais comment testez si l’item est de l’émeraude et savoir le nombre d’item dans un slot ?
[EDIT]:
J’ai trouver ça:emeraldNumber = Minecraft.getMinecraft().thePlayer.inventory.getStackInSlot(3);
Si je m’et dans mon 4ème slot 5emeraudes j’ai:
5xitem.emerald@0, y a t’il moyen de n’obtenir que le 5 ? -
Essaie avec çà :
int size = 0; // On initialise la variable InventoryPlayer inv = Minecraft.getMinecraft().thePlayer.inventory; // On récupère l'inventaire du joueur for (int i = 0; i < inv.getSizeInventory; i++) { // Boucle for if (inv.getStackInslot(i) != null && inv.getStackInSlot(i).getItem() == Items.emerald) size += inv.getStackInSlot(i).stackSize; // Si l'ItemStack à l'index n'est pas nul et que c'est bien une émeraude, alors on l'ajoute }
-
Merci, ça marche a peu prés sauf que le nombre n’arrête pas d’augmenter tant que j’ai une émeraude dans l’inventaire
[EDIT]:
C’est bon j’ai tous simplement réinitialiser la valeur à 0 à la fin de la fonction -
Juste, si quelqu’un sais comment faire pour utiliser
InventoryPlayer inv = Minecraft.getMinecraft().thePlayer.inventory;
avec l’ender Chest ?
[EDIT]:
J’ai trouver:InventoryEnderChest invEnderChest = Minecraft.getMinecraft().thePlayer.getInventoryEnderChest();
-
Je voudrais faire la même chose mais avec l’ender chest cependant quand je met:
public int invEmeraldNumber; public int bankEmeraldNumber; @SubscribeEvent public void renderEmeraldsNumber(RenderGameOverlayEvent event) { InventoryPlayer inv = Minecraft.getMinecraft().thePlayer.inventory; InventoryEnderChest bank = Minecraft.getMinecraft().thePlayer.getInventoryEnderChest(); for (int i = 0; i < inv.getSizeInventory(); i++) { if (inv.getStackInSlot(i) != null && inv.getStackInSlot(i).getItem() == Items.emerald) bankEmeraldNumber += (inv.getStackInSlot(i).stackSize); } for (int i = 0; i < bank.getSizeInventory(); i++) { if (bank.getStackInSlot(i) != null && bank.getStackInSlot(i).getItem() == Items.emerald) bankEmeraldNumber += (bank.getStackInSlot(i).stackSize); } Minecraft.getMinecraft().fontRenderer.drawString("Emeralds: " + invEmeraldNumber + " (" + bankEmeraldNumber + ")", 2, 2, 0xFFFFFF); invEmeraldNumber = 0; bankEmeraldNumber = 0; } }
Ca ne marche pas :/, j’ai beau avoir des emeraudes dans mon enderchest, le nombre entre parenthèse, reste à 0.
-
Je comprends pas trop ce que tu veux faire, tu veux faire la même chose mais avec l’enderchest ?
-
Oui exactement, j’ai mis mon code au dessus.
-
La fonction getInventoryEnderChest est publique, je vois pas où est le problème, mis à part qu’il faudrait utiliser un autre nom de variable dans la 2ème boucle.
-
Normalement non, la variable de la boucle est seulement utilisé dans la boucle, donc ça devrais aller.
J’ai aussi testez la fonction:
inv.setInventorySlotContents(); bank.setInventorySlotContents();
et dans l’inventaire, elle marche mais pas dans l’ender chest
-
Il me semble qu’il faut mettre à jour l’inventaire après avoir modifié des slots, car le joueur est seulement côté client.
-
Sauf que je ne veut pas modifier les slots moi, je veut juste savoir les items dans les slots dans l’ender chest
-
alors pourquoi tu veux utiliser setInventorySlotContents ?
-
Non, c’était juste pour testez
-
@‘PlasMania’:
Je voudrais faire la même chose mais avec l’ender chest cependant quand je met:
public int invEmeraldNumber; public int bankEmeraldNumber; @SubscribeEvent public void renderEmeraldsNumber(RenderGameOverlayEvent event) { InventoryPlayer inv = Minecraft.getMinecraft().thePlayer.inventory; InventoryEnderChest bank = Minecraft.getMinecraft().thePlayer.getInventoryEnderChest(); for (int i = 0; i < inv.getSizeInventory(); i++) { if (inv.getStackInSlot(i) != null && inv.getStackInSlot(i).getItem() == Items.emerald) bankEmeraldNumber += (inv.getStackInSlot(i).stackSize); } for (int i = 0; i < bank.getSizeInventory(); i++) { if (bank.getStackInSlot(i) != null && bank.getStackInSlot(i).getItem() == Items.emerald) bankEmeraldNumber += (bank.getStackInSlot(i).stackSize); } Minecraft.getMinecraft().fontRenderer.drawString("Emeralds: " + invEmeraldNumber + " (" + bankEmeraldNumber + ")", 2, 2, 0xFFFFFF); invEmeraldNumber = 0; bankEmeraldNumber = 0; } }
Ca ne marche pas :/, j’ai beau avoir des emeraudes dans mon enderchest, le nombre entre parenthèse, reste à 0.
Utilise des variables local au lieu de reset sur 0 …
@SubscribeEvent public void renderEmeraldsNumber(RenderGameOverlayEvent event) { int invEmeraldNumber = 0; int bankEmeraldNumber = 0; InventoryPlayer inv = Minecraft.getMinecraft().thePlayer.inventory; InventoryEnderChest bank = Minecraft.getMinecraft().thePlayer.getInventoryEnderChest(); for (int i = 0; i < inv.getSizeInventory(); i++) { if (inv.getStackInSlot(i) != null && inv.getStackInSlot(i).getItem() == Items.emerald) bankEmeraldNumber += (inv.getStackInSlot(i).stackSize); } for (int i = 0; i < bank.getSizeInventory(); i++) { if (bank.getStackInSlot(i) != null && bank.getStackInSlot(i).getItem() == Items.emerald) bankEmeraldNumber += (bank.getStackInSlot(i).stackSize); } Minecraft.getMinecraft().fontRenderer.drawString("Emeralds: " + invEmeraldNumber + " (" + bankEmeraldNumber + ")", 2, 2, 0xFFFFFF); } }
à mon avis pour l’enderchest, ça ne fonctionne pas car temps que tu ne l’ouvre pas il est considéré comme vide côté client. Ouvre-le et regardes si la valeur change.
-
Okai, merci pour la correction, et l’ouvrir ne change rien
-
Envoi le code de ton block + GuiHandler.
-
Il y a au moins des émeraudes dans le coffre x) ?
@‘SCAREX’:
Envoi le code de ton block + GuiHandler.
fail ?
-