Résolu Savoir si un coffre est vide ou plein
-
@‘SCAREX’:
Arrête pendant un petit bout de temps, mojang en a marre que tu redémarres ton jeu.
xD
-
Je viens de re test et j’ai juste Minecraft qui cesse de fonctionner pas de crash ni rien
-
Si c’est au démarrage, c’est normal, sinon lance bien ton mod en mode RUN (au lieu de debug), si çà ne change rien, c’est que le problème vient de ton ordi.
-
SCAREX, non mon problème persiste toujours !
Je remet mon code au cas où avec deux trois modif’s
@SideOnly(Side.CLIENT) @SubscribeEvent public void renderContainerMessage(RenderGameOverlayEvent.Text event) { MovingObjectPosition movingObjPos = this.mc.thePlayer.rayTrace(2D, event.partialTicks); int width = event.resolution.getScaledWidth(); //EntityRenderer int height = event.resolution.getScaledHeight(); EntityPlayer player = Minecraft.getMinecraft().thePlayer; World world = Minecraft.getMinecraft().theWorld; MovingObjectPosition mov = player.rayTrace(2D, event.partialTicks); if(this.mc.objectMouseOver != null && mov != null && mov.typeOfHit == MovingObjectType.BLOCK) { BlockPos blockpos = this.mc.objectMouseOver.getBlockPos(); Block block = world.getBlockState(blockpos).getBlock(); String getOpeningMessage = EnumChatFormatting.BOLD + "Right Click" + EnumChatFormatting.RESET + " to open"; String getContainerBlockName = block.getLocalizedName(); String isEmpty = "(Empty)"; String getIfIsLocked = EnumChatFormatting.DARK_RED + "Locked"; TileEntityChest tile = (TileEntityChest)this.mc.theWorld.getTileEntity(blockpos); boolean flag = true; if((block) instanceof BlockChest) { this.drawCenteredString(this.mc.fontRendererObj, getOpeningMessage, width / 2 + 30, height / 2 + 8, new Color(255,255,255).getRGB()); this.drawCenteredString(this.mc.fontRendererObj, getContainerBlockName, width / 2 + 30, height / 2 + 22, new Color(255,255,255).getRGB()); if(tile.isLocked()) { this.drawCenteredString(this.mc.fontRendererObj, getIfIsLocked, width / 2 - 20, height / 2 - 10, new Color(255,255,255).getRGB()); } for (int i = 0; i < tile.getSizeInventory(); i++) { if (tile.getStackInSlot(i) != null) { flag = false; } } if(flag) { System.out.println("container vide"); } else { System.out.println("container non-vide"); } } } }
-
Essaie avec çà plutôt :
@SideOnly(Side.CLIENT) @SubscribeEvent public void renderContainerMessage(RenderGameOverlayEvent.Post event) { if (event.type == RenderGameOverlayEvent.ElementType.TEXT) { MovingObjectPosition movingObjPos = this.mc.thePlayer.rayTrace(2D, event.partialTicks); int width = event.resolution.getScaledWidth(); //EntityRenderer int height = event.resolution.getScaledHeight(); EntityPlayer player = Minecraft.getMinecraft().thePlayer; World world = Minecraft.getMinecraft().theWorld; MovingObjectPosition mov = player.rayTrace(2D, event.partialTicks); if(this.mc.objectMouseOver != null && mov != null && mov.typeOfHit == MovingObjectType.BLOCK) { BlockPos blockpos = this.mc.objectMouseOver.getBlockPos(); Block block = world.getBlockState(blockpos).getBlock(); String getOpeningMessage = EnumChatFormatting.BOLD + "Right Click" + EnumChatFormatting.RESET + " to open"; String getContainerBlockName = block.getLocalizedName(); String isEmpty = "(Empty)"; String getIfIsLocked = EnumChatFormatting.DARK_RED + "Locked"; TileEntityChest tile = (TileEntityChest)this.mc.theWorld.getTileEntity(blockpos); boolean flag = true; if((block) instanceof BlockChest) { this.drawCenteredString(this.mc.fontRendererObj, getOpeningMessage, width / 2 + 30, height / 2 + 8, new Color(255,255,255).getRGB()); this.drawCenteredString(this.mc.fontRendererObj, getContainerBlockName, width / 2 + 30, height / 2 + 22, new Color(255,255,255).getRGB()); if(tile.isLocked()) { this.drawCenteredString(this.mc.fontRendererObj, getIfIsLocked, width / 2 - 20, height / 2 - 10, new Color(255,255,255).getRGB()); } for (int i = 0; i < tile.getSizeInventory(); i++) { if (tile.getStackInSlot(i) != null) { flag = false; } } if(flag) { System.out.println("container vide"); } else { System.out.println("container non-vide"); } } } } }
-
Toujours Pareil
-
@‘ZeAmateis’:
Toujours Pareil
Et si tu mets tout ce code en commentaire ?
-
ça marche normalement ^^ Normal non ? ^^’
-
Dans quelle classe se trouve cette fonction ?
Après plusieurs tests, voici mes résultats :
1-Ta fonction est dans une classe Gui (ou GuiScreen), ce qui est une mauvaise manie
2-Le container est toujours vide car tu récupère un WorldClient et non un WorldServer donc ta tileEntity est vide. Il faut faire une synchronisation client / serveur. -
une classe ou des events côté clients sont chargés
-
Petit up, une petite idée ?
Quel serait le code alors ?
@‘SCAREX’:
Dans quelle classe se trouve cette fonction ?
Après plusieurs tests, voici mes résultats :
1-Ta fonction est dans une classe Gui (ou GuiScreen), ce qui est une mauvaise manie
2-Le container est toujours vide car tu récupère un WorldClient et non un WorldServer donc ta tileEntity est vide. Il faut faire une synchronisation client / serveur. -
@‘robin4002’:
Envoie le rapport.
J’ai fait :
for (int i = 0; i < tile.getSizeInventory(); i++) { System.out.println(tile.getStackInSlot(i)); if (tile.getStackInSlot(i) != null) { flag = false; } }
Le:
System.out.println(tile.getStackInSlot(i));
Me donne
[18:16:59] [Client thread/INFO] [STDOUT]: [fr.zeamateis.tesm.module.client.guis.client.gui.GuiInGame:renderContainerMessage:88]: null
Pas normal ?
-
Tout le temps ? car normalement comme la boucle va de 0 à la taille de l’inventaire ça devrait afficher plusieurs null. (et au contraire un truc non null si il y a quelques choses dans le IInventory).
-
ça l’affiche tout le temps oui effectivement
-
Bon c’est ce que je craignais. Côté client getStackInSlot return toujours null, le client ne sait pas ce qu’il y a dans le coffre temps qu’il ne l’ouvre pas (c’est à ce moment que le contenu est synchronisé).
-
Problème résolu grâce à Dermensolf sur IC
-
Le code qu’il a donné ne fonctionnera pas sur un serveur dédiée. Il ne fonctionne que en solo.