Texture item
-
enlève la majuscule dans le nom de ta texture, le nom de ton json et le nom de ton item dans le registre (ainsi que le nom non localisé si tu en as mis une là-bas aussi).
En effet ça venait de là, c’est une erreur assez bête merci

Quelqu’un a une idée pour le tileEntity null ?
-
Tu essaies de l’utiliser sur quelle tileEntity ? +poste le code
-
@‘Dylem’:
Tu essaies de l’utiliser sur quelle tileEntity ? +poste le code
J’essaie sur un coffre avec ce code :
@Override public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { if (!world.isRemote) { TileEntity tile = world.getTileEntity(new BlockPos(hitX, hitY, hitZ)); System.out.println(tile); //affiche toujours null if (tile == null) { return EnumActionResult.SUCCESS; } if (((tile instanceof IInventory)) && (tile.getClass().toString().contains("Chest"))) { player.openGui(Main.instance, 13, world, (int)hitX, (int)hitY, (int)hitZ); return EnumActionResult.SUCCESS; } } return EnumActionResult.SUCCESS; } -
Plusieurs remarques :
- Pourquoi !world.isRemote ? Ca ne me semble pas très logique pour ce que tu veux en faire…
- Pourquoi return EnumActionResult.SUCCESS si l’entité est null ? Il faut return PASS
- Ce code est étrange :
if (((tile instanceof IInventory)) && (tile.getClass().toString().contains("Chest"))) {Fais plutôt directement :
if(tile instanceof TileEntityChest) { -
Et il faudrait également get le tile entity avec le pos en paramètre et non les trois float qui désignent précisément l’endroit où tu as tapé sur la face du block, il me semble.
-
@‘Plaigon’:
Et il faudrait également get le tile entity avec le pos en paramètre et non les trois float qui désignent précisément l’endroit où tu as tapé sur le block, il me semble
ça a l’air bon, si tu regardes il a instancié un nouveau BlockPos en paramètre, les floats devraient être automatiquement convertis en double.
-
Non, les hit n’ont rien à voir avec les coordonnées du block sur lequel le joueur frappe. On a un BlockPos en paramètre, il est + qu’évident qu’il faut get la TE avec, et non refaire une nouvelle instance.
-
@‘Plaigon’:
Non, les hit n’ont rien à voir avec les coordonnées du block sur lequel le joueur frappe. On a un BlockPos en paramètre, il est + qu’évident qu’il faut get la TE avec, et non refaire une nouvelle instance.
ah oui juste, autant pour moi, j’ai regardé en diagonale
-
Merci j’ai modifié le code en suivant ce que vous m’avez dis, du coup le TileEntity n’est plus nul et contient le chest.
Par contre j’ai un soucis avec le openGui ça n’affiche rien.Voici mon code maintenant :
@Override public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { if (!world.isRemote) { System.out.println("test1"); TileEntity tile = world.getTileEntity(pos); System.out.println(tile); //renvoie toujours null if (tile == null) { return EnumActionResult.PASS; } if(tile instanceof TileEntityChest) { System.out.println("test2"); player.openGui(Main.instance, 13, world, pos.getX(), pos.getY(), pos.getZ()); return EnumActionResult.SUCCESS; } } return EnumActionResult.PASS; }(le test2 est bien affiché)
-
Tu as quoi dans ton GuiHandler ?
-
Sûrement un problème avec ton GuiHandler. File nous sa classe stp
-
J’utilise pas de GuiHandler perso.
J’utilise directement la méthode de la classe player :/** * Opens a GUI with this player, uses FML's IGuiHandler system. * Allows for extension by modders. * * @param mod The mod trying to open a GUI * @param modGuiId GUI ID * @param world Current World * @param x Passed directly to IGuiHandler, data meaningless Typically world X position * @param y Passed directly to IGuiHandler, data meaningless Typically world Y position * @param z Passed directly to IGuiHandler, data meaningless Typically world Z position */ public void openGui(Object mod, int modGuiId, World world, int x, int y, int z)C’est au niveau des position où je ne sais pas trop quoi mettre. En 1.7.10 je l’avais utilisé mais il y avait des paramètres supplémentaires (x,y et z)
-
En fait t’as pas vraiment le choix :x
-
Cette fonction est une fonction de forge qui redirige vers le GuiHandler du mod passé en paramètres. Si tu veux utiliser la fonction de Minecraft, il te faut utiliser : player.displayGUIChest
-
D’accord autant pour moi.
Du coup j’ai mis mon gui cependant ça plante. Voici ma classe GuiHandler :package fr.sebenforce.mod; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.common.network.IGuiHandler; public class GuiHandler implements IGuiHandler { public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { switch (ID) { case 0: return new ContainerChestExplorer(world.getTileEntity(new BlockPos(x, y, z))); } return null; } public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { switch (ID) { case 0: return new GuiChestExplorer(world.getTileEntity(new BlockPos(x, y, z))); } return null; } }Et voici le crash report :
-
Montres ta classe “ContainerChestExplorer” car à la vue du crash report je pense que tu as spécifié un Inventory null pour un des slots.
-
@‘AymericRed’:
Montres ta classe “ContainerChestExplorer” car à la vue du crash report je pense que tu as spécifié un Inventory null pour un des slots.
Oui la voici :
package fr.sebenforce.mod; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; public class ContainerChestExplorer extends Container { IInventory inventory; public ContainerChestExplorer(TileEntity tile) { this.inventory = ((IInventory)tile); int i = 0; int j = 0; for (i = 0; i < 108; i++) { if (i % 12 == 0) j++; int u = i % 12 + 1; if (i < this.inventory.getSizeInventory()) { addSlotToContainer(new SlotChestExplorer(this.inventory, i, u * 18 - 6, j * 18 - 10)); } else { addSlotToContainer(new SlotChestExplorer(new InventoryDummy(), 0, u * 18 - 6, j * 18 - 10)); } } } public boolean canInteractWith(EntityPlayer player) { return this.inventory.isUsableByPlayer(player); } public ItemStack slotClick(int slotIndex, int buttonPressed, int flag, EntityPlayer player) { return null; } public ItemStack transferStackInSlot(EntityPlayer player, int quantity) { return null; } } -
Personne a une idée ?
-
Ah non, ce n’est pas un Inventory null mais un ItemStack qui est null, en 1.11 les item stack ne peuvent pas être null, il faut remplacer cela par ItemStack.EMPTY donc passes en revue la classe de ton TileEntity et la classe “InventoryDummy” pour remplacer tout ce qui ferait référence à des ItemStack null.
PS : pour savoir si un stack est vide (ou avant si un stack était null), c’est “lestack.isEmpty()”. -
Ah non, ce n’est pas un Inventory null mais un ItemStack qui est null, en 1.11 les item stack ne peuvent pas être null, il faut remplacer cela par ItemStack.EMPTY donc passes en revue la classe de ton TileEntity et la classe “InventoryDummy” pour remplacer tout ce qui ferait référence à des ItemStack null.
PS : pour savoir si un stack est vide (ou avant si un stack était null), c’est “lestack.isEmpty()”.Merci, ça ne crash plus désormais cependant mon gui ne s’affiche pas et je ne comprends pas pourquoi.
J’ai bien ma méthode onItemUse qui appel le gui :
@Override public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { if (!world.isRemote) { System.out.println("test1"); TileEntity tile = world.getTileEntity(pos); System.out.println(tile); //renvoie toujours null if (tile == null) { return EnumActionResult.PASS; } if(tile instanceof TileEntityChest) { System.out.println("test2"); player.openGui(Main.instance, 0, world, pos.getX(), pos.getY(), pos.getZ()); return EnumActionResult.SUCCESS; } } return EnumActionResult.PASS; }Et mon guiHandler :
public class GuiHandler implements IGuiHandler { @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { switch (ID) { case 0: return new ContainerChestExplorer(world.getTileEntity(new BlockPos(x, y, z))); } return null; } @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { switch (ID) { case 0: return new GuiChestExplorer(world.getTileEntity(new BlockPos(x, y, z))); } return null; } }