Non résolu Crash ouverture Gui
-
Bonjour,
Quand je fais un clique droit et que j’ouvre mon container, mon jeu crash.
Ci dessous le rapport de crash:---- Minecraft Crash Report ---- // Shall we play a game? Time: 7/2/21 7:05 PM Description: Ticking player java.lang.ArrayIndexOutOfBoundsException: 4 at java.util.Arrays$ArrayList.get(Unknown Source) at net.minecraft.util.NonNullList.get(NonNullList.java:51) at fr.gloria.glore.tileentity.TileEntityMachineGlorium.getStackInSlot(TileEntityMachineGlorium.java:101) at net.minecraft.inventory.Slot.getStack(Slot.java:81) at net.minecraft.inventory.Container.detectAndSendChanges(Container.java:97) at fr.gloria.glore.container.ContainerGloriumMachine.detectAndSendChanges(ContainerGloriumMachine.java:56) at net.minecraft.entity.player.EntityPlayerMP.onUpdate(EntityPlayerMP.java:365) at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2141) at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:872) at net.minecraft.world.World.updateEntity(World.java:2101) at net.minecraft.world.WorldServer.tickPlayers(WorldServer.java:673) at net.minecraft.world.World.updateEntities(World.java:1888) at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:644) at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:836) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:740) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:192) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:589) at java.lang.Thread.run(Unknown Source) A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Server thread Stacktrace: at java.util.Arrays$ArrayList.get(Unknown Source) at net.minecraft.util.NonNullList.get(NonNullList.java:51) at fr.gloria.glore.tileentity.TileEntityMachineGlorium.getStackInSlot(TileEntityMachineGlorium.java:101) at net.minecraft.inventory.Slot.getStack(Slot.java:81) at net.minecraft.inventory.Container.detectAndSendChanges(Container.java:97) at fr.gloria.glore.container.ContainerGloriumMachine.detectAndSendChanges(ContainerGloriumMachine.java:56) at net.minecraft.entity.player.EntityPlayerMP.onUpdate(EntityPlayerMP.java:365) at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2141) at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:872) at net.minecraft.world.World.updateEntity(World.java:2101) -- Player being ticked -- Details: Entity Type: null (net.minecraft.entity.player.EntityPlayerMP) Entity ID: 319 Entity Name: Player144 Entity's Exact location: -229.25, 68.00, 263.67 Entity's Block location: World: (-230,68,263), Chunk: (at 10,4,7 in -15,16; contains blocks -240,0,256 to -225,255,271), Region: (-1,0; contains chunks -32,0 to -1,31, blocks -512,0,0 to -1,255,511) Entity's Momentum: 0.00, -0.08, 0.00 Entity's Passengers: [] Entity's Vehicle: ~~ERROR~~ NullPointerException: null Stacktrace: at net.minecraft.world.WorldServer.tickPlayers(WorldServer.java:673) at net.minecraft.world.World.updateEntities(World.java:1888) at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:644) -- Affected level -- Details: Level name: New World All players: 1 total; [EntityPlayerMP['Player144'/319, l='New World', x=-229.25, y=68.00, z=263.67]] Chunk stats: ServerChunkCache: 625 Drop: 0 Level seed: 6883408356355277944 Level generator: ID 00 - default, ver 1. Features enabled: true Level generator options: Level spawn location: World: (-228,64,256), Chunk: (at 12,4,0 in -15,16; contains blocks -240,0,256 to -225,255,271), Region: (-1,0; contains chunks -32,0 to -1,31, blocks -512,0,0 to -1,255,511) Level time: 27998 game time, 27998 day time Level dimension: 0 Level storage version: 0x04ABD - Anvil Level weather: Rain time: 239 (now: true), thunder time: 90139 (now: false) Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: true Stacktrace: at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:836) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:740) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:192) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:589) at java.lang.Thread.run(Unknown Source) -- System Details -- Details: Minecraft Version: 1.12 Operating System: Windows 10 (amd64) version 10.0 Java Version: 1.8.0_241, Oracle Corporation Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 602582736 bytes (574 MB) / 1037959168 bytes (989 MB) up to 1037959168 bytes (989 MB) JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M IntCache: cache: 0, tcache: 0, allocated: 13, tallocated: 95 FML: MCP 9.40 Powered by Forge 14.21.1.2387 5 mods loaded, 5 mods active States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored UCHIJAAAA minecraft{1.12} [Minecraft] (minecraft.jar) UCHIJAAAA mcp{9.19} [Minecraft Coder Pack] (minecraft.jar) UCHIJAAAA FML{8.0.99.99} [Forge Mod Loader] (forgeSrc-1.12-14.21.1.2387.jar) UCHIJAAAA forge{14.21.1.2387} [Minecraft Forge] (forgeSrc-1.12-14.21.1.2387.jar) UCHIJAAAA glore{2.0} [Glore] (bin) Loaded coremods (and transformers): GL info: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread. Profiler Position: N/A (disabled) Player Count: 1 / 8; [EntityPlayerMP['Player144'/319, l='New World', x=-229.25, y=68.00, z=263.67]] Type: Integrated Server (map_client.txt) Is Modded: Definitely; Client brand changed to 'fml,forge'
Et la classe dont semble venir l’erreur:
public class TileEntityMachineGlorium extends TileEntityLockable implements ITickable { private NonNullList<ItemStack> stacks = NonNullList.withSize(4, ItemStack.EMPTY); private String customName; private int timePassed = 0; private int burningTimeLeft = 0; @Override public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); this.stacks = NonNullList.<ItemStack>withSize(this.getSizeInventory(), ItemStack.EMPTY); ItemStackHelper.loadAllItems(compound, this.stacks); if (compound.hasKey("CustomName", 8)) { this.customName = compound.getString("CustomName"); } this.burningTimeLeft = compound.getInteger("burningTimeLeft"); this.timePassed = compound.getInteger("timePassed"); } @Override public NBTTagCompound writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); ItemStackHelper.saveAllItems(compound, this.stacks); if (this.hasCustomName()) { compound.setString("CustomName", this.customName); } compound.setInteger("burningTimeLeft", this.burningTimeLeft); compound.setInteger("timePassed", this.timePassed); return compound; } @Override public boolean hasCustomName() { return this.customName != null && !this.customName.isEmpty(); } @Override public String getName() { return hasCustomName() ? this.customName : "tile.custom_furnace"; } public void setCustomName(String name) { this.customName = name; } @Override public int getField(int id) { switch (id) { case 0: return this.burningTimeLeft; case 1: return this.timePassed; } return 0; } @Override public void setField(int id, int value) { switch (id) { case 0: this.burningTimeLeft = value; break; case 1: this.timePassed = value; } } @Override public int getFieldCount() { return 2; } @Override public int getSizeInventory() { return this.stacks.size(); } @Override public ItemStack getStackInSlot(int index) { return this.stacks.get(index); } @Override public ItemStack decrStackSize(int index, int count) { return ItemStackHelper.getAndSplit(this.stacks, index, count); } @Override public ItemStack removeStackFromSlot(int index) { return ItemStackHelper.getAndRemove(stacks, index); } @Override public void setInventorySlotContents(int index, ItemStack stack) { this.stacks.set(index, stack); if (stack.getCount() > this.getInventoryStackLimit()) { stack.setCount(this.getInventoryStackLimit()); } } @Override public int getInventoryStackLimit() { return 64; } @Override public boolean isEmpty() { for(ItemStack stack : this.stacks) { if (!stack.isEmpty()) { return false; } } return true; } @Override public void clear() { for(int i = 0; i < this.stacks.size(); i++) { this.stacks.set(i, ItemStack.EMPTY); } } @Override public void openInventory(EntityPlayer player) {} @Override public void closeInventory(EntityPlayer player) {} @Override public boolean isItemValidForSlot(int index, ItemStack stack) { if (index == 2) return stack.getItem() == ItemsMod.lingot_glorium; return true; } /** Vérifie la distance entre le joueur et le bloc et que le bloc soit toujours présent */ public boolean isUsableByPlayer(EntityPlayer player) { return this.world.getTileEntity(this.pos) != this ? false : player .getDistanceSq((double) this.pos.getX() + 0.5D, (double) this.pos.getY() + 0.5D, (double) this.pos.getZ() + 0.5D) <= 64.0D; } public boolean hasFuelEmpty() { return this.getStackInSlot(2).isEmpty(); } public ItemStack getRecipeResult() { return RecipesGloriumMachine.getRecipeResult(new ItemStack[] { this.getStackInSlot(0), this.getStackInSlot(1) }); } public boolean canSmelt() { // On récupère le résultat de la recette ItemStack result = this.getRecipeResult(); // Le résultat est null si il n'y a pas de recette associée, donc on retourne faux if (result != null) { // On récupère le contenu du slot de résultat ItemStack slot4 = this.getStackInSlot(3); // Si il est vide on renvoie vrai if (slot4.isEmpty()) return true; // Sinon on vérifie que ce soit le même objet, les même métadata et que la taille finale ne sera pas trop grande if (slot4.getItem() == result.getItem() && slot4.getItemDamage() == result.getItemDamage()) { int newStackSize = slot4.getCount() + result.getCount(); if (newStackSize <= this.getInventoryStackLimit() && newStackSize <= slot4.getMaxStackSize()) { return true; } } } return false; } public void smelt() { // Cette fonction n'est appelée que si result != null, c'est pourquoi on ne fait pas de null check ItemStack result = this.getRecipeResult(); // On enlève un item de chaque ingrédient this.decrStackSize(0, 1); this.decrStackSize(1, 1); // On récupère le slot de résultat ItemStack stack4 = this.getStackInSlot(3); // Si il est vide if (stack4.isEmpty()) { // On y insère une copie du résultat this.setInventorySlotContents(3, result.copy()); } else { // Sinon on augmente le nombre d'objets de l'ItemStack stack4.setCount(stack4.getCount() + result.getCount()); } } /** Temps de cuisson de la recette */ public int getFullRecipeTime() { return 200; } /** Temps que dure 1 unité de carburant (ici : 1 planche + 1 blé) */ public int getFullBurnTime() { return 600; } /** Renvoie vrai si le feu est allumé */ public boolean isBurning() { return burningTimeLeft > 0; } @Override public void update() { if (!this.world.isRemote) { /* Si le carburant brûle, on réduit réduit le temps restant */ if (this.isBurning()) { this.burningTimeLeft--; } /* * Si la on peut faire cuire la recette et que le four ne cuit pas * alors qu'il peut, alors on le met en route */ if (!this.isBurning() && this.canSmelt() && !this.hasFuelEmpty()) { this.burningTimeLeft = this.getFullBurnTime(); this.decrStackSize(2, 1); } /* Si on peut faire cuire la recette et que le feu cuit */ if (this.isBurning() && this.canSmelt()) { this.timePassed++; if (timePassed >= this.getFullRecipeTime()) { timePassed = 0; this.smelt(); } } else { timePassed = 0; } this.markDirty(); } } @Override public Container createContainer(InventoryPlayer playerInventory, EntityPlayer playerIn) { // TODO Auto-generated method stub return null; } @Override public String getGuiID() { // TODO Auto-generated method stub return null; } }
Merci de votre aide
-
Bonjour,
Tu peux envoyer la classe de ton Container ? Visiblement tu as déclaré plus de slot que tu en as dans ton tile entity (4)
-
Ce message a été supprimé ! -
Pardon j’ai mal lu la classe de mon container :
public class ContainerGloriumMachine extends Container { private TileEntityMachineGlorium tile; private int timePassed = 0; private int burnTimeLeft = 0; public ContainerGloriumMachine(TileEntityMachineGlorium tile, InventoryPlayer playerInventory) { this.tile = tile; int i; for(i = 0; i < 2; i++) { this.addSlotToContainer(new Slot(tile, i, 33 + i * 18, 7)); } for(i = 0; i < 2; i++) { this.addSlotToContainer(new SlotSingleItem(tile, i + 2, 42, 40 + i * 18, i == 0 ? Item.getItemFromBlock(Blocks.PLANKS) : Items.WHEAT)); } this.addSlotToContainer(new SlotOutput(tile, 4, 116, 17)); for(i = 0; i < 9; ++i) { this.addSlotToContainer(new Slot(playerInventory, i, 8 + i * 18, 142)); } } @Override public boolean canInteractWith(EntityPlayer player) { return tile.isUsableByPlayer(player); } @Override public void addListener(IContainerListener listener) { super.addListener(listener); listener.sendAllWindowProperties(this, this.tile); } @Override public void detectAndSendChanges() { super.detectAndSendChanges(); for(int i = 0; i < this.listeners.size(); ++i) { IContainerListener icontainerlistener = (IContainerListener) this.listeners.get(i); if (this.burnTimeLeft != this.tile.getField(0)) { icontainerlistener.sendWindowProperty(this, 0, this.tile.getField(0)); } if (this.timePassed != this.tile.getField(1)) { icontainerlistener.sendWindowProperty(this, 1, this.tile.getField(1)); } } this.burnTimeLeft = this.tile.getField(0); this.timePassed = this.tile.getField(1); } @Override @SideOnly(Side.CLIENT) public void updateProgressBar(int id, int data) { this.tile.setField(id, data); } @Override public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) { return ItemStack.EMPTY; } public class SlotOutput extends Slot { public SlotOutput(IInventory inventoryIn, int index, int xPosition, int yPosition) { super(inventoryIn, index, xPosition, yPosition); } @Override public boolean isItemValid(ItemStack stack) { return false; } } public class SlotSingleItem extends Slot { private Item item; public SlotSingleItem(IInventory inventoryIn, int index, int xPosition, int yPosition, Item item) { super(inventoryIn, index, xPosition, yPosition); this.item = item; } @Override public boolean isItemValid(ItemStack stack) { return stack.isEmpty() || stack.getItem() == item; } } }
-
Donc effectivement tu as 5 slots sur ton container, il faut donc en ajouter un sur ton tile.
-
J’ai modifié le code pour garder les 4 slots, mais ça crashe toujours quand je clique dessus
public ContainerGloriumMachine(TileEntityMachineGlorium tile, InventoryPlayer playerInventory) { this.tile = tile; int i; for (i = 0; i < 3; ++i) { for (int j = 0; j < 9; ++j) { this.addSlotToContainer(new Slot(tile, j + i * 9 + 9, 49 + j * 18, 134 + i * 18)); } } for (i = 0; i < 9; ++i) { this.addSlotToContainer(new Slot(tile, i, 49 + i * 18, 192)); } }
Ce sont bien ces lignes à modifier pourtant
-
Non, la tu en as beaucoup plus que 4.
Le constructeur de la classe
Slot
prend en argument l’inventaire, l’id du slot, la coordonnée x puis la coordonnée y.Là rien qu’avec ta boucle for à la ligne 9 tu ajoutes 27 slots …
-
Alors j’ai modifié une grande partie de mon code pour faire ce que je voulais, malheuresement le jeu crashe encore quand j’ouvre ma machine. Ci-dessous les codes du container, du tileentity et du gui:
public class ContainerGloriumMachine extends Container { private TileEntityMachineGlorium tile; private int timePassed = 0; private int burnTimeLeft = 0; public ContainerGloriumMachine(TileEntityMachineGlorium tile, InventoryPlayer playerInventory) { this.tile = tile; this.addSlotToContainer(new Slot(tile, 0, 26, 11)); this.addSlotToContainer(new Slot(tile, 1, 26, 11)); this.addSlotToContainer(new Slot(tile, 2, 76, 105)); this.addSlotToContainer(new SlotResult(tile, 3, 164, 82)); //Ici c'est un slot que j'ai créer, on le fera après } @Override public boolean canInteractWith(EntityPlayer player) { return tile.isUsableByPlayer(player); } @Override public void addListener(IContainerListener listener) { super.addListener(listener); listener.sendAllWindowProperties(this, this.tile); } @Override public void detectAndSendChanges() { super.detectAndSendChanges(); for(int i = 0; i < this.listeners.size(); ++i) { IContainerListener icontainerlistener = (IContainerListener) this.listeners.get(i); if (this.burnTimeLeft != this.tile.getField(0)) { icontainerlistener.sendWindowProperty(this, 0, this.tile.getField(0)); } if (this.timePassed != this.tile.getField(1)) { icontainerlistener.sendWindowProperty(this, 1, this.tile.getField(1)); } } this.burnTimeLeft = this.tile.getField(0); this.timePassed = this.tile.getField(1); } @Override @SideOnly(Side.CLIENT) public void updateProgressBar(int id, int data) { this.tile.setField(id, data); } @Override public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) { return ItemStack.EMPTY; } }
tileEntity
public class TileEntityMachineGlorium extends TileEntityLockable implements ITickable { private NonNullList<ItemStack> stacks = NonNullList.withSize(4, ItemStack.EMPTY); private String customName; private int timePassed = 0; private int burningTimeLeft = 0; @Override public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); this.stacks = NonNullList.<ItemStack>withSize(this.getSizeInventory(), ItemStack.EMPTY); ItemStackHelper.loadAllItems(compound, this.stacks); if (compound.hasKey("CustomName", 8)) { this.customName = compound.getString("CustomName"); } this.burningTimeLeft = compound.getInteger("burningTimeLeft"); this.timePassed = compound.getInteger("timePassed"); } @Override public NBTTagCompound writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); ItemStackHelper.saveAllItems(compound, this.stacks); if (this.hasCustomName()) { compound.setString("CustomName", this.customName); } compound.setInteger("burningTimeLeft", this.burningTimeLeft); compound.setInteger("timePassed", this.timePassed); return compound; } @Override public boolean hasCustomName() { return this.customName != null && !this.customName.isEmpty(); } @Override public String getName() { return hasCustomName() ? this.customName : "tile.custom_furnace"; } public void setCustomName(String name) { this.customName = name; } @Override public int getField(int id) { switch (id) { case 0: return this.burningTimeLeft; case 1: return this.timePassed; } return 0; } @Override public void setField(int id, int value) { switch (id) { case 0: this.burningTimeLeft = value; break; case 1: this.timePassed = value; } } @Override public int getFieldCount() { return 2; } @Override public int getSizeInventory() { return this.stacks.size(); } @Override public ItemStack getStackInSlot(int index) { return this.stacks.get(index); } @Override public ItemStack decrStackSize(int index, int count) { return ItemStackHelper.getAndSplit(this.stacks, index, count); } @Override public ItemStack removeStackFromSlot(int index) { return ItemStackHelper.getAndRemove(stacks, index); } @Override public void setInventorySlotContents(int index, ItemStack stack) { this.stacks.set(index, stack); if (stack.getCount() > this.getInventoryStackLimit()) { stack.setCount(this.getInventoryStackLimit()); } } @Override public int getInventoryStackLimit() { return 64; } @Override public boolean isEmpty() { for(ItemStack stack : this.stacks) { if (!stack.isEmpty()) { return false; } } return true; } @Override public void clear() { for(int i = 0; i < this.stacks.size(); i++) { this.stacks.set(i, ItemStack.EMPTY); } } @Override public void openInventory(EntityPlayer player) {} @Override public void closeInventory(EntityPlayer player) {} @Override public boolean isItemValidForSlot(int index, ItemStack stack) { if (index == 2) return stack.getItem() == ItemsMod.lingot_glorium; return true; } /** Vérifie la distance entre le joueur et le bloc et que le bloc soit toujours présent */ public boolean isUsableByPlayer(EntityPlayer player) { return this.world.getTileEntity(this.pos) != this ? false : player .getDistanceSq((double) this.pos.getX() + 0.5D, (double) this.pos.getY() + 0.5D, (double) this.pos.getZ() + 0.5D) <= 64.0D; } public boolean hasFuelEmpty() { return this.getStackInSlot(2).isEmpty(); } public ItemStack getRecipeResult() { return RecipesGloriumMachine.getRecipeResult(new ItemStack[] { this.getStackInSlot(0), this.getStackInSlot(1) }); } public boolean canSmelt() { // On récupère le résultat de la recette ItemStack result = this.getRecipeResult(); // Le résultat est null si il n'y a pas de recette associée, donc on retourne faux if (result != null) { // On récupère le contenu du slot de résultat ItemStack slot4 = this.getStackInSlot(3); // Si il est vide on renvoie vrai if (slot4.isEmpty()) return true; // Sinon on vérifie que ce soit le même objet, les même métadata et que la taille finale ne sera pas trop grande if (slot4.getItem() == result.getItem() && slot4.getItemDamage() == result.getItemDamage()) { int newStackSize = slot4.getCount() + result.getCount(); if (newStackSize <= this.getInventoryStackLimit() && newStackSize <= slot4.getMaxStackSize()) { return true; } } } return false; } public void smelt() { // Cette fonction n'est appelée que si result != null, c'est pourquoi on ne fait pas de null check ItemStack result = this.getRecipeResult(); // On enlève un item de chaque ingrédient this.decrStackSize(0, 1); this.decrStackSize(1, 1); // On récupère le slot de résultat ItemStack stack4 = this.getStackInSlot(3); // Si il est vide if (stack4.isEmpty()) { // On y insère une copie du résultat this.setInventorySlotContents(3, result.copy()); } else { // Sinon on augmente le nombre d'objets de l'ItemStack stack4.setCount(stack4.getCount() + result.getCount()); } } /** Temps de cuisson de la recette */ public int getFullRecipeTime() { return 200; } /** Temps que dure 1 unité de carburant (ici : 1 planche + 1 blé) */ public int getFullBurnTime() { return 600; } /** Renvoie vrai si le feu est allumé */ public boolean isBurning() { return burningTimeLeft > 0; } @Override public void update() { if (!this.world.isRemote) { /* Si le carburant brûle, on réduit réduit le temps restant */ if (this.isBurning()) { this.burningTimeLeft--; } /* * Si la on peut faire cuire la recette et que le four ne cuit pas * alors qu'il peut, alors on le met en route */ if (!this.isBurning() && this.canSmelt() && !this.hasFuelEmpty()) { this.burningTimeLeft = this.getFullBurnTime(); this.decrStackSize(2, 1); } /* Si on peut faire cuire la recette et que le feu cuit */ if (this.isBurning() && this.canSmelt()) { this.timePassed++; if (timePassed >= this.getFullRecipeTime()) { timePassed = 0; this.smelt(); } } else { timePassed = 0; } this.markDirty(); } } @Override public Container createContainer(InventoryPlayer playerInventory, EntityPlayer playerIn) { // TODO Auto-generated method stub return null; } @Override public String getGuiID() { // TODO Auto-generated method stub return null; } }
et le gui
public class GuiGloriumMachine extends GuiContainer { private static final ResourceLocation background = new ResourceLocation("glore","textures/gui/container/custom_furnace.png"); private TileEntityMachineGlorium tile; private InventoryPlayer playerInv; public GuiGloriumMachine(TileEntityMachineGlorium tile, InventoryPlayer playerInv) { super(new ContainerGloriumMachine(tile, playerInv)); this.tile = tile; } @Override protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.getTextureManager().bindTexture(background); this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize); if(this.tile.isBurning()) { int i = this.getBurnLeftScaled(13); //Nous créerons cette fonction après this.drawTexturedModalRect(this.guiLeft + 8, this.guiTop + 54 + 12 - i, 176, 12 - i, 14, i + 1); } int l = this.getCookProgressScaled(24); this.drawTexturedModalRect(this.guiLeft + 44, this.guiTop + 36, 176, 14, l + 1, l); } @Override protected void drawGuiContainerForegroundLayer(int x, int y) { String tileName = this.tile.getDisplayName().getUnformattedText(); this.fontRenderer.drawString(tileName, (this.xSize / 2 - this.fontRenderer.getStringWidth(tileName) / 2) + 3, 8, 4210752); this.fontRenderer.drawString(this.playerInv.getDisplayName().getUnformattedText(), 122, this.ySize - 96 + 2, 4210752); } private int getBurnLeftScaled(int pixels) { int i = this.tile.getField(1); if(i == 0) i = 200; return this.tile.getField(0) * pixels / i; } private int getCookProgressScaled(int pixels) { int i = this.tile.getField(2); int j = this.tile.getField(3); return j != 0 && i != 0 ? i * pixels / j : 0; } }
Ainsi que le rapport de crash :
java.lang.NullPointerException: Rendering screen at fr.gloria.glore.guis.GuiGloriumMachine.drawGuiContainerForegroundLayer(GuiGloriumMachine.java:45) at net.minecraft.client.gui.inventory.GuiContainer.drawScreen(GuiContainer.java:135) at net.minecraftforge.client.ForgeHooksClient.drawScreen(ForgeHooksClient.java:349) at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1168) at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1192) at net.minecraft.client.Minecraft.run(Minecraft.java:436) at net.minecraft.client.main.Main.main(Main.java:118) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) at net.minecraft.launchwrapper.Launch.main(Launch.java:28) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) at GradleStart.main(GradleStart.java:25) A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Client thread Stacktrace: at fr.gloria.glore.guis.GuiGloriumMachine.drawGuiContainerForegroundLayer(GuiGloriumMachine.java:45) at net.minecraft.client.gui.inventory.GuiContainer.drawScreen(GuiContainer.java:135) at net.minecraftforge.client.ForgeHooksClient.drawScreen(ForgeHooksClient.java:349) -- Screen render details -- Details: Screen name: fr.gloria.glore.guis.GuiGloriumMachine Mouse location: Scaled: (213, 119). Absolute: (427, 240) Screen size: Scaled: (427, 240). Absolute: (854, 480). Scale factor of 2 -- Affected level -- Details: Level name: MpServer All players: 1 total; [EntityPlayerSP['Player917'/391, l='MpServer', x=180.42, y=15.00, z=544.10]] Chunk stats: MultiplayerChunkCache: 566, 566 Level seed: 0 Level generator: ID 00 - default, ver 1. Features enabled: false Level generator options: Level spawn location: World: (188,64,256), Chunk: (at 12,4,0 in 11,16; contains blocks 176,0,256 to 191,255,271), Region: (0,0; contains chunks 0,0 to 31,31, blocks 0,0,0 to 511,255,511) Level time: 11351 game time, 11351 day time Level dimension: 0 Level storage version: 0x00000 - Unknown? Level weather: Rain time: 0 (now: false), thunder time: 0 (now: false) Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: false Forced entities: 99 total; [EntityItem['item.tile.stonebrick'/515, l='MpServer', x=185.88, y=12.00, z=510.41], EntityItem['item.tile.stone.diorite'/516, l='MpServer', x=182.49, y=10.00, z=509.13], EntityItem['item.tile.stone.granite'/517, l='MpServer', x=182.88, y=10.00, z=509.16], EntityItem['item.tile.stone.granite'/518, l='MpServer', x=181.13, y=10.00, z=509.27], EntityItem['item.tile.stone.diorite'/519, l='MpServer', x=181.13, y=10.00, z=510.34], EntityItem['item.tile.stone.diorite'/520, l='MpServer', x=182.93, y=11.00, z=511.88], EntitySkeleton['Squelette'/521, l='MpServer', x=183.53, y=17.00, z=506.01], EntityZombie['Zombie'/522, l='MpServer', x=183.70, y=17.00, z=508.28], EntityParrot['Perroquet'/523, l='MpServer', x=189.24, y=65.00, z=510.44], EntityBat['Chauve-souris'/524, l='MpServer', x=121.58, y=13.10, z=575.75], EntitySheep['Mouton'/525, l='MpServer', x=116.29, y=64.00, z=562.19], EntitySheep['Mouton'/529, l='MpServer', x=124.29, y=71.00, z=487.80], EntityZombie['Zombie'/541, l='MpServer', x=151.74, y=18.00, z=489.50], EntityBat['Chauve-souris'/542, l='MpServer', x=135.66, y=26.67, z=506.26], EntitySpider['Araignée'/807, l='MpServer', x=138.50, y=44.00, z=520.50], EntityCreeper['Creeper'/554, l='MpServer', x=101.50, y=18.00, z=542.50], EntitySheep['Mouton'/556, l='MpServer', x=111.87, y=67.00, z=536.47], EntitySheep['Mouton'/557, l='MpServer', x=106.50, y=67.00, z=543.50], EntitySheep['Mouton'/558, l='MpServer', x=109.38, y=68.00, z=535.48], EntitySheep['Mouton'/559, l='MpServer', x=115.46, y=69.00, z=500.02], EntitySheep['Mouton'/560, l='MpServer', x=115.53, y=69.00, z=501.10], EntitySheep['Mouton'/561, l='MpServer', x=115.42, y=69.00, z=509.88], EntityCreeper['Creeper'/562, l='MpServer', x=132.21, y=57.00, z=481.49], EntityZombie['Zombie'/565, l='MpServer', x=110.78, y=40.00, z=518.48], EntityBat['Chauve-souris'/566, l='MpServer', x=109.56, y=47.10, z=522.97], EntityZombie['Zombie'/567, l='MpServer', x=102.50, y=39.00, z=524.50], EntityPlayerSP['Player917'/391, l='MpServer', x=180.42, y=15.00, z=544.10], EntityItem['item.tile.stonebrick'/392, l='MpServer', x=178.84, y=12.00, z=554.88], EntityItem['item.tile.stonebrick'/393, l='MpServer', x=177.94, y=12.00, z=554.88], EntityItem['item.tile.stone.diorite'/394, l='MpServer', x=179.13, y=10.00, z=547.81], EntityItem['item.tile.stone.diorite'/395, l='MpServer', x=180.88, y=11.00, z=547.66], EntityItem['item.tile.stone.diorite'/396, l='MpServer', x=182.07, y=11.00, z=547.88], EntityItem['item.tile.stonebrick'/397, l='MpServer', x=179.13, y=10.00, z=547.81], EntityBat['Chauve-souris'/398, l='MpServer', x=190.24, y=16.10, z=551.03], EntityItem['item.tile.stonebrick'/399, l='MpServer', x=181.13, y=11.00, z=543.55], EntityCreeper['Creeper'/400, l='MpServer', x=186.81, y=27.00, z=533.50], EntityCreeper['Creeper'/401, l='MpServer', x=191.58, y=26.00, z=533.52], EntityRabbit['Lapin'/669, l='MpServer', x=245.51, y=63.00, z=613.93], EntitySkeleton['Squelette'/671, l='MpServer', x=224.49, y=19.00, z=618.27], EntityBat['Chauve-souris'/692, l='MpServer', x=258.51, y=60.11, z=535.32], EntityBat['Chauve-souris'/693, l='MpServer', x=252.87, y=61.50, z=553.60], EntityBat['Chauve-souris'/694, l='MpServer', x=250.75, y=63.28, z=545.82], EntitySkeleton['Squelette'/695, l='MpServer', x=207.52, y=24.00, z=585.80], EntitySkeleton['Squelette'/440, l='MpServer', x=128.50, y=18.00, z=605.50], EntitySkeleton['Squelette'/696, l='MpServer', x=198.46, y=24.00, z=584.22], EntityZombie['Zombie'/697, l='MpServer', x=202.50, y=24.00, z=581.50], EntitySkeleton['Squelette'/698, l='MpServer', x=203.50, y=22.00, z=582.50], EntityZombie['Zombie'/701, l='MpServer', x=216.50, y=24.00, z=597.50], EntityRabbit['Lapin'/702, l='MpServer', x=196.08, y=64.00, z=608.34], EntityRabbit['Lapin'/703, l='MpServer', x=205.09, y=64.00, z=614.04], EntityItem['item.tile.flower1.dandelion'/704, l='MpServer', x=238.88, y=61.00, z=507.16], EntityItem['item.tile.flower1.dandelion'/705, l='MpServer', x=235.13, y=62.00, z=505.13], EntityBat['Chauve-souris'/706, l='MpServer', x=241.53, y=48.68, z=479.17], EntityCreeper['Creeper'/707, l='MpServer', x=197.58, y=26.00, z=531.30], EntityCreeper['Creeper'/708, l='MpServer', x=198.30, y=26.30, z=530.30], EntitySquid['Poulpe'/709, l='MpServer', x=168.85, y=59.40, z=572.51], EntityChicken['Poule'/710, l='MpServer', x=159.50, y=63.00, z=583.50], EntityChicken['Poule'/711, l='MpServer', x=148.81, y=63.00, z=578.50], EntityZombie['Zombie'/712, l='MpServer', x=245.19, y=49.00, z=477.48], EntityBat['Chauve-souris'/713, l='MpServer', x=243.43, y=50.16, z=471.65], EntitySkeleton['Squelette'/714, l='MpServer', x=202.84, y=14.00, z=518.51], EntityCreeper['Creeper'/715, l='MpServer', x=193.19, y=15.00, z=519.50], EntityBat['Chauve-souris'/716, l='MpServer', x=203.88, y=15.00, z=520.71], EntityCreeper['Creeper'/717, l='MpServer', x=205.17, y=24.00, z=516.50], EntityZombie['Zombie'/718, l='MpServer', x=160.30, y=17.03, z=551.70], EntityPig['Cochon'/719, l='MpServer', x=145.50, y=63.00, z=563.50], EntityChicken['Poule'/720, l='MpServer', x=149.29, y=63.00, z=571.86], EntityZombie['Zombie'/723, l='MpServer', x=245.29, y=17.00, z=520.49], EntityParrot['Perroquet'/724, l='MpServer', x=225.50, y=65.00, z=543.50], EntitySquid['Poulpe'/725, l='MpServer', x=179.33, y=61.34, z=579.51], EntitySquid['Poulpe'/726, l='MpServer', x=180.20, y=61.82, z=580.38], EntityZombie['Zombie'/727, l='MpServer', x=238.50, y=15.00, z=521.50], EntityCreeper['Creeper'/728, l='MpServer', x=235.58, y=15.00, z=514.78], EntityChicken['Poule'/729, l='MpServer', x=161.31, y=63.00, z=583.13], EntityCreeper['Creeper'/731, l='MpServer', x=215.50, y=20.00, z=494.50], EntityZombie['Zombie'/732, l='MpServer', x=229.51, y=18.00, z=470.20], EntityCreeper['Creeper'/733, l='MpServer', x=203.26, y=20.00, z=503.61], EntitySkeleton['Squelette'/734, l='MpServer', x=209.52, y=29.00, z=469.27], EntitySkeleton['Squelette'/735, l='MpServer', x=212.50, y=18.00, z=472.50], EntityCreeper['Creeper'/736, l='MpServer', x=211.50, y=18.00, z=474.46], EntitySquid['Poulpe'/481, l='MpServer', x=165.45, y=59.50, z=501.47], EntitySpider['Araignée'/737, l='MpServer', x=210.50, y=18.00, z=471.50], EntitySquid['Poulpe'/482, l='MpServer', x=157.10, y=56.38, z=513.32], EntityCreeper['Creeper'/489, l='MpServer', x=157.50, y=15.00, z=496.50], EntityZombie['Zombie'/490, l='MpServer', x=155.50, y=15.00, z=496.50], EntityBat['Chauve-souris'/491, l='MpServer', x=158.22, y=15.01, z=500.03], EntitySquid['Poulpe'/492, l='MpServer', x=154.40, y=56.19, z=498.42], EntitySquid['Poulpe'/493, l='MpServer', x=156.72, y=56.11, z=508.95], EntityBat['Chauve-souris'/494, l='MpServer', x=115.25, y=24.10, z=534.51], EntityBat['Chauve-souris'/495, l='MpServer', x=119.99, y=45.48, z=532.86], EntityZombie['Zombie'/502, l='MpServer', x=187.58, y=16.00, z=522.77], EntityBat['Chauve-souris'/503, l='MpServer', x=188.13, y=16.26, z=522.56], EntitySheep['Mouton'/504, l='MpServer', x=146.33, y=64.00, z=559.78], EntitySheep['Mouton'/505, l='MpServer', x=136.47, y=63.00, z=563.27], EntitySheep['Mouton'/506, l='MpServer', x=137.50, y=63.00, z=567.50], EntityPig['Cochon'/507, l='MpServer', x=141.84, y=63.00, z=564.55], EntityPig['Cochon'/508, l='MpServer', x=143.11, y=63.00, z=563.77], EntityPig['Cochon'/509, l='MpServer', x=138.51, y=63.00, z=568.83], EntitySheep['Mouton'/510, l='MpServer', x=134.50, y=63.00, z=563.28]] Retry entities: 0 total; [] Server brand: fml,forge Server type: Integrated singleplayer server Stacktrace: at net.minecraft.client.multiplayer.WorldClient.addWorldInfoToCrashReport(WorldClient.java:456) at net.minecraft.client.Minecraft.addGraphicsAndWorldToCrashReport(Minecraft.java:2862) at net.minecraft.client.Minecraft.run(Minecraft.java:457) at net.minecraft.client.main.Main.main(Main.java:118) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) at net.minecraft.launchwrapper.Launch.main(Launch.java:28) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) at GradleStart.main(GradleStart.java:25)
Merci de votre aide
-
Alors comme tu as enlevé les importations les numéros de ligne ne correspondent pas. À quel ligne correspond ceci ?
at fr.gloria.glore.guis.GuiGloriumMachine.drawGuiContainerForegroundLayer(GuiGloriumMachine.java:45)
-
Il correspond à la ligne :
this.fontRenderer.drawString(this.playerInv.getDisplayName().getUnformattedText(), 122, this.ySize - 96 + 2, 4210752);
-
C’est ta variable
playerInv
qui n’est jamais initialisé.Dans le constructeur, ajoutes
this.playerInv = playerInv;
-
Merci de ton aide. Ca marche, mais j’ai désormais un problème avec les recettes. Aucune erreur dans la console ni dans les logs pourtant le code semble bon.
public class RecipesGloriumMachine { private static final RecipesGloriumMachine smeltingBase = new RecipesGloriumMachine(); private Map smeltingList = new HashMap(); private static final HashMap <ItemStack[], ItemStack>recipes = new HashMap<ItemStack[], ItemStack>(); static { addRecipe(Items.APPLE, Items.ARROW, Items.BAKED_POTATO, new ItemStack(ItemsMod.lingot_glorium)); } private static void addRecipe(Item ingredient1, Item ingredient2, Item ingredient3, ItemStack resultat1) { addRecipe(new ItemStack(ingredient1), new ItemStack(ingredient2), new ItemStack(ingredient3), resultat1); } public static void addRecipe(ItemStack stack1, ItemStack stack2, ItemStack stack3, ItemStack stack4) { ItemStack[] stackList = new ItemStack[]{stack1, stack2, stack3}; recipes.put(stackList, stack4); } private static boolean areKeysEqual(ItemStack[] key1, ItemStack[] key2) { if(key1.length != key2.length) return false; for(int i = 0; i < key1.length; i++) { ItemStack s1 = key1[i]; ItemStack s2 = key2[i]; if(s1.isEmpty() && !s2.isEmpty()) return false; if(!s1.isEmpty() && s2.isEmpty()) return false; if(s1.getItem() != s2.getItem()) return false; if(s1.getItemDamage() != s2.getItemDamage()) return false; } return true; } public static ItemStack getRecipeResult(ItemStack[] ingredients) { Iterator<Entry<ItemStack[], ItemStack>> it = recipes.entrySet().iterator(); while(it.hasNext()) { Entry <ItemStack[], ItemStack>entry = it.next(); if(areKeysEqual(entry.getKey(), ingredients)) { return entry.getValue(); } } return null; } }
-
Lances ton jeu en debug, mets un point d’arrêt dans la fonction canSmelt de ton four et regardes la valeur des variables.
-
Ces valeurs là ?
-
regardes surtout le résultat de this.getStackInSlot(0), this.getStackInSlot(1) et de ItemStack result = this.getRecipeResult();
-
Il faut que je rajoute ?
this.getStackInSlot(0), this.getStackInSlot(1), this.getStackInSlot(2) });
-
Non, que tu regardes via le débugueur leur valeur quand tu es sur le point d’arrêt, pour comprendre ce qu’il se passe.
Dans l’onglet expression de débugueur tu peux y mettre des fonctions à interpréter, afin de récupérer la valeur.
-
J’ai regardé, et j’en déduis que:
le slot 0 enregistre un ItemFood
le slot 1 un ItemArrow
le slot 2 un ItemFood
et le slot 3 il est null -
Ok je crois avoir trouvé où est le problème.
C’est dans la classe de ton tile entity :
public ItemStack getRecipeResult() { return RecipesGloriumMachine.getRecipeResult(new ItemStack[] { this.getStackInSlot(0), this.getStackInSlot(1) }); }
ici tu appels ta fonction getRecipeResult avec deux items stack, or tes recettes prennent 3 items. Je pense que cela devrait être plutôt comme ceci :
return RecipesGloriumMachine.getRecipeResult(new ItemStack[] { this.getStackInSlot(0), this.getStackInSlot(1), this.getStackInSlot(2) });
-
Le Gui semble marcher mais pour une raison inconnu, le slot 3 récupére l’item comme combustible ce qui fait que la recette ne marche pas. Une idéé ?