Résolu Texture item
-
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; } }
-
Vérifies que la fonction isUseableByPlayer de ton TileEntity retourne bien true et ensuite mets des prints/du debug dans les fonctions de draw, d’init et le constructeur du gui pour voir où ça bloque.
-
J’ai dû rater un truc, il faut un tileEntity pour un item ? Je pensais que c’était juste pour les blocs.
-
Euh…. tu sais ce que tu veux faire au moins, tu connais ton code ?
T’as un TileEntity ici :public ContainerChestExplorer(TileEntity tile) ``` et ici aussi ```java return this.inventory.isUsableByPlayer(player);
Bon il se trouve que c’est le TileEntity du coffre vanilla donc devrait pas poser de problème mais je te conseillerait de vérifier si sa fonction “isUsableByPlayer” retourne bien true à ton Container.
-
Comment je peux tester la fonction isUsableByPlayer car il faut y passer en paramètre le player mais je n’y ai pas accès dans ma classe ContainerChestExplorer.
J’ai remarqué également en faisant différent test que le programme ne rentre jamais dans ma fonction
public boolean canInteractWith(EntityPlayer player) {
return this.inventory.isUsableByPlayer(player);
}Est-ce normal ?
-
Tu y as accès dans canInteractWith.
Non mais ça va avec le fait que ton gui s’ouvre pas.
@AymericRed:[…] et ensuite mets des prints/du debug dans les fonctions de draw, d’init et le constructeur du gui pour voir où ça bloque.
Il te reste à faire ça
-
Salut,
Du coup j’ai mis différents print :
Classe 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: System.out.println(" création container chest explorer"); 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: System.out.println(" création gui chest explorer"); return new GuiChestExplorer(world.getTileEntity(new BlockPos(x, y, z))); } return null; } }
Les deux print s’affiche bien.
Classe ContainerChestExplorer :
public class ContainerChestExplorer extends Container { IInventory inventory; public ContainerChestExplorer(TileEntity tile) { System.out.println("constructeur container"); 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) { System.out.println("AAAAAAAAAAAAAAA" + this.inventory.isUsableByPlayer(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; } }
Le print du constructeur s’affiche bien mais celui de la méthode de canInteractWith n’apparait pas et je ne comprends pas pourquoi.
Classe GuiChestExplorer :
public class GuiChestExplorer extends GuiContainer { TileEntity tile; ResourceLocation bg = new ResourceLocation("sebenforcemod:textures/gui/chestexplorer.png"); public GuiChestExplorer(TileEntity te) { super(new ContainerChestExplorer(te)); System.out.println("constructeur gui"); this.xSize = 256; this.ySize = 177; } protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { this.mc.renderEngine.bindTexture(this.bg); System.out.println("draw gui"); drawDefaultBackground(); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); int x = (this.width - this.xSize) / 2; int y = (this.height - this.ySize) / 2; drawTexturedModalRect(x, y, 0, 0, 256, 256); } }
Les deux print s’affichent bien.
Est ce qu’il est possible que le gui du coffre de base s’affiche par dessus le mien ?
-
C’est très probable.
Essaies dans la classe de ton item de remplacer EnumActionResult.SUCESS par FAILED pour éviter qu’il fasse l’action du clic droit du coffre. -
C’est très probable.
Essaies dans la classe de ton item de remplacer EnumActionResult.SUCESS par FAILED pour éviter qu’il fasse l’action du clic droit du coffre.Salut, j’ai essayé avec le EnumActionResult.FAIL mais ça ouvre toujours le gui du coffre de base.
-
Faudrait passer par un event alors.
-
Faudrait passer par un event alors.
Ah d’accord
J’ai essayé de voir la liste des event. J’ai trouvé celui là qui pourrait m’être utile mais il ne semble pas exister en 1.11 : PlayerUseItemEvent -
@‘Sebenf0rce’:
@‘robin4002’:
Faudrait passer par un event alors.
Ah d’accord
J’ai essayé de voir la liste des event. J’ai trouvé celui là qui pourrait m’être utile mais il ne semble pas exister en 1.11 : PlayerUseItemEventCelui là :
PlayerInteractEvent.RightClickBlock
Il suffit de cancel l’event et d’afficher ton Gui.
-
@‘Sebenf0rce’:
@‘robin4002’:
Faudrait passer par un event alors.
Ah d’accord
J’ai essayé de voir la liste des event. J’ai trouvé celui là qui pourrait m’être utile mais il ne semble pas exister en 1.11 : PlayerUseItemEventCelui là :
PlayerInteractEvent.RightClickBlock
Il suffit de cancel l’event et d’afficher ton Gui.
Merci, par contre comment je peux vérifier que le block a été right click avec mon item ?
-
Avec l’instance du joueur tu peux vérifier si l’item qu’il tient quand la main est ton item
-
@‘BrokenSwing’:
Avec l’instance du joueur tu peux vérifier si l’item qu’il tient quand la main est ton item
J’ai réussis à faire ça (est-ce que je suis sur la bonne piste ?)
public class EventPlayerUseItem { @SubscribeEvent public void onRightClick(PlayerInteractEvent.RightClickBlock event) { if (event.getItemStack() != null) { Item item = event.getItemStack().getItem(); if (item == Items.chestExplorer) { event.setCanceled(true); player.openGui(Main.instance, 0, world, pos.getX(), pos.getY(), pos.getZ()); } } } }
Seulement je ne sais pas comment récupérer l’instance du player du coup la ligne suivante ne fonctionne pas : player.openGui(Main.instance, 0, world, pos.getX(), pos.getY(), pos.getZ());
-
event.getPlayer() ?
-
Alors j’ai du nouveau !
Voici ma classe maintenant :
public class EventPlayerUseItem { @SubscribeEvent public void onRightClick(PlayerInteractEvent.RightClickBlock event) { System.out.println("on rentre dans l'event"); if (event.getItemStack() != null) { Item item = event.getItemStack().getItem(); if (item == Items.chestExplorer) { System.out.println("cliqué par un chest explorer"); event.setCanceled(true); event.getEntityPlayer().openGui(Main.instance, 0, event.getWorld(), event.getPos().getX(), event.getPos().getY(), event.getPos().getZ()); } } } }
On voit apparaître mon gui cependant tout de suite après le gui du coffre apparait et je ne vois pas pourquoi.
C’est bien event.setCanceled(true); ?Edit :
J’ai trouvé ça :
@SubscribeEvent public void onGuiOpen(GuiOpenEvent event) { System.out.println("A gui is open !"); if(event.) { //si je tiens l'objet } }
Je peux peut être utilisé ça pour cancel l’event ? Cependant je ne peux pas faire de event.getItemStack() comme avec l’event RightClickBlock pour vérifier que mon item est utilisé. Y a t’il une autre solution pour vérifier si mon item est utilisé ?
-
Tu sembles être côté client, regardes la liste des évents sur ce forum si tu peux cancer ou non ces évents.
Pour vérifier l’item penses à Minecraft.getMinecraft().thePlayer.itemInHand ou je ne sais plus très bien et tu check comme ça -
J’ai donc modifier la classe qui est comme ceci maintenant :
public class EventPlayerUseItem { @SubscribeEvent public void onRightClick(PlayerInteractEvent.RightClickBlock event) { System.out.println("on rentre dans l'event"); if (event.getItemStack() != null) { Item item = event.getItemStack().getItem(); if (item == Items.chestExplorer) { System.out.println("cliqué par un chest explorer"); event.setCanceled(true); event.getEntityPlayer().openGui(Main.instance, 0, event.getWorld(), event.getPos().getX(), event.getPos().getY(), event.getPos().getZ()); } } } @SubscribeEvent public void onGuiOpen(GuiOpenEvent event) { if(event.getGui() instanceof GuiChest && Minecraft.getMinecraft().player.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND).getItem() == Items.chestExplorer) { event.setCanceled(true); } } }
Il y a un petit problème, en effet lors de la première ouverture du coffre il ne se passe rien, mon inventaire disparaît et il y a une erreur dans la console.
Lorsque je reclick sur le coffre cette fois mon gui s’ouvre bien.Voici l’erreur obtenu :
[13:13:58] [Client thread/FATAL]: Error executing task java.util.concurrent.ExecutionException: java.lang.IndexOutOfBoundsException: Index: 46, Size: 46 at java.util.concurrent.FutureTask.report(Unknown Source) ~[?:1.8.0_141] at java.util.concurrent.FutureTask.get(Unknown Source) ~[?:1.8.0_141] at net.minecraft.util.Util.runTask(Util.java:30) [Util.class:?] at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1117) [Minecraft.class:?] at net.minecraft.client.Minecraft.run(Minecraft.java:407) [Minecraft.class:?] at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_141] at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_141] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_141] at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_141] at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?] at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_141] at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_141] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_141] at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_141] at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?] at GradleStart.main(GradleStart.java:26) [start/:?] Caused by: java.lang.IndexOutOfBoundsException: Index: 46, Size: 46 at java.util.ArrayList.rangeCheck(Unknown Source) ~[?:1.8.0_141] at java.util.ArrayList.get(Unknown Source) ~[?:1.8.0_141] at net.minecraft.inventory.Container.getSlot(Container.java:135) ~[Container.class:?] at net.minecraft.inventory.Container.setAll(Container.java:559) ~[Container.class:?] at net.minecraft.client.network.NetHandlerPlayClient.handleWindowItems(NetHandlerPlayClient.java:1306) ~[NetHandlerPlayClient.class:?] at net.minecraft.network.play.server.SPacketWindowItems.processPacket(SPacketWindowItems.java:72) ~[SPacketWindowItems.class:?] at net.minecraft.network.play.server.SPacketWindowItems.processPacket(SPacketWindowItems.java:13) ~[SPacketWindowItems.class:?] at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:21) ~[PacketThreadUtil$1.class:?] at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:1.8.0_141] at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:1.8.0_141] at net.minecraft.util.Util.runTask(Util.java:29) ~[Util.class:?] … 15 more [13:13:58] [Client thread/FATAL]: Error executing task java.util.concurrent.ExecutionException: java.lang.IndexOutOfBoundsException: Index: 54, Size: 46 at java.util.concurrent.FutureTask.report(Unknown Source) ~[?:1.8.0_141] at java.util.concurrent.FutureTask.get(Unknown Source) ~[?:1.8.0_141] at net.minecraft.util.Util.runTask(Util.java:30) [Util.class:?] at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1117) [Minecraft.class:?] at net.minecraft.client.Minecraft.run(Minecraft.java:407) [Minecraft.class:?] at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_141] at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_141] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_141] at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_141] at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?] at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_141] at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_141] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_141] at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_141] at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?] at GradleStart.main(GradleStart.java:26) [start/:?] Caused by: java.lang.IndexOutOfBoundsException: Index: 54, Size: 46 at java.util.ArrayList.rangeCheck(Unknown Source) ~[?:1.8.0_141] at java.util.ArrayList.get(Unknown Source) ~[?:1.8.0_141] at net.minecraft.inventory.Container.getSlot(Container.java:135) ~[Container.class:?] at net.minecraft.inventory.Container.putStackInSlot(Container.java:551) ~[Container.class:?] at net.minecraft.client.network.NetHandlerPlayClient.handleSetSlot(NetHandlerPlayClient.java:1262) ~[NetHandlerPlayClient.class:?] at net.minecraft.network.play.server.SPacketSetSlot.processPacket(SPacketSetSlot.java:33) ~[SPacketSetSlot.class:?] at net.minecraft.network.play.server.SPacketSetSlot.processPacket(SPacketSetSlot.java:11) ~[SPacketSetSlot.class:?] at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:21) ~[PacketThreadUtil$1.class:?] at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:1.8.0_141] at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:1.8.0_141] at net.minecraft.util.Util.runTask(Util.java:29) ~[Util.class:?] … 15 more