Résolu Fonction addItemStackToInventory() ne fonctionne pas dans mon TileEntity
-
Bonjour,
J’ai un item “cookieSpoon”, lorsqu’on effectue un clic droit avec, il fait appel au TileEntity du bloc “cookieBloc”.
Ce TileEntity doit ensuite donner un “cookie” au joueur puis lorsque son compteur arrive à 0, le bloc se détruit.
Code du TileEntity :
:::
package com.squixdev.cookieparty.block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.world.World; public class TileEntityBlockContainer extends TileEntity { public Integer basicQuantity = 9; public Integer quantityStored = 9; @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.quantityStored = nbt.getInteger("quantityStored"); } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("quantityStored", quantityStored); } public void activate(EntityPlayer player, World world) { if (this.quantityStored != 1) { this.quantityStored –; player.inventory.addItemStackToInventory(new ItemStack(Items.cookie)); player.addChatMessage(new ChatComponentText(" " + this.quantityStored + " cookies restants.")); world.notifyBlockChange(xCoord, yCoord, zCoord, this.blockType); } else { boolean good = world.func_147480_a(xCoord, yCoord, zCoord, false); } } public Integer getQuantity() { // TODO Auto-generated method stub return quantityStored; } }
:::
Mon problème se situe dans la classe de la “cookieSpoon” :
package com.squixdev.cookieparty.item; import com.squixdev.cookieparty.block.TileEntityBlockContainer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; public class cookieSpoon extends Item { @Override public boolean onItemUse(ItemStack is, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { TileEntityBlockContainer te = (TileEntityBlockContainer)world.getTileEntity(x, y, z); te.activate(player, world); return super .onItemUse(is, player, world, x, y, z, side, hitX, hitY, hitZ); } }
Dans cette configuration, sans la condition if(!world.isRemote), le TileEntity fonctionne mais le message dans le Chat est doublé.
C’est pourquoi j’ai donc ajouté cette fameuse condition et là le message n’est plus doublé mais la fonction *player.inventory.addItemStackToInventory(new ItemStack(Items.cookie)); *ne fonctionne plus !
Code de la “cookieSpoon” avec la condition :
:::package com.squixdev.cookieparty.item; import com.squixdev.cookieparty.block.TileEntityBlockContainer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; public class cookieSpoon extends Item { @Override public boolean onItemUse(ItemStack is, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { if(!world.isRemote) { TileEntityBlockContainer te = (TileEntityBlockContainer)world.getTileEntity(x, y, z); te.activate(player, world); } return super .onItemUse(is, player, world, x, y, z, side, hitX, hitY, hitZ); } }
:::
Voilà j’espère vraiment trouver comment résoudre ce problème, surtout que je n’ai pas la moindre d’idée d’où ça peut venir
J’utilise Forge 1.7.10-10.13.2.1230.
Merci d’avance,
Squix
-
Surement une désynchronisation entre le client et le serveur.
Le client ne reçoit pas d’information concernant la mise a jour que tu fais sur la TE coté serveur. -
Merci, oui j’ai pensé à ça aussi au début mais vu que je n’ai jamais eu ce genre de problème, concrètement, que dois-je faire pour que le client reçoive la mise à jour de la TileEntity ??
-
Si tu mets un System.out.println(quantityStored) au début de la fonction activate du tile entity il t’affiche quoi ?
Autre chose, ton code va causer un ClassCastException si tu fais un clic droit sur un autre bloc comme par exemple un coffre, il faut juste ajouter un if(te instanceof TileEntityBlockContainer) pour corriger ça. -
Salut, désolé de ne pas avoir répondu plus tôt, j’ai eu quelques problèmes avec mon fournisseur internet
Alors voilà ce que j’obtient dans la console en mettant un System.out.print :
[20:28:18] [Server thread/INFO] [STDOUT]: [com.squixdev.cookieparty.block.TileEntityBlockContainer:activate:35]: 9
[20:28:18] [Client thread/INFO]: [CHAT] 8 cookies restants.
[20:28:20] [Client thread/WARN]: Unable to play unknown soundEvent: minecraft:liquid.water
[20:28:20] [Client thread/WARN]: Unable to play unknown soundEvent: minecraft:music.game.creative
[20:28:21] [Client thread/WARN]: Unable to play unknown soundEvent: minecraft:liquid.water
[20:28:22] [Client thread/WARN]: Unable to play unknown soundEvent: minecraft:mob.zombie.step
[20:28:24] [Server thread/INFO] [STDOUT]: [com.squixdev.cookieparty.block.TileEntityBlockContainer:activate:35]: 8
[20:28:24] [Client thread/INFO]: [CHAT] 7 cookies restants.Je pense donc que tout fonctionne correctement de ce côté là ^^
-
Personne ne peut m’aider ??
-
Envoie un zip de ton dossier src, je vais faire des tests de mon côté quand j’aurai le temps car je trouve ça étrange.
-
D’accord voici le lien :
https://mega.co.nz/#!TwVQSJTB!itgOOSi9m5yPJyrywdG__Tq3-luSFt2AClZtFK9DJQ4
-
C’est normal que ton code soit erroné ? Eclipse m’indique 6 erreurs … (principalement sur la classe CookieTreeGenerator)
EDIT : Faudra aussi que tu m’explique comment tu t’en sort dans ton code sans respecter la convention Java et sans formater x) Car pour moi c’est complètement illisible.
Bref, en fait ton code fonctionne, le problème c’est que l’inventaire ne se met pas à jour côté client. Si tu clic partout dans l’inventaire tu finira pas trouver tes cookies.
Il suffit d’ajouter cette ligne après avoir ajouter l’item dans l’inventaire du joueur :
player.inventoryContainer.detectAndSendChanges();
-
Salut oui c’est normal c’est ça de pas finir un élément et se concentrer sur un autre x)
Je ne respecte aucune convention en effet c’est carrément l’anarchie ^^
Sinon pour le code ça marche parfaitement merci j’aurais jamais trouvé sinon ! ^^