TileEntity sur mon bloc
-
Bonjour,
J’ai créé un entité sur mon bloc permettant de stocker une valeur.
Du coup j’ai créé ma classe TileEntityRCF :public class TileEntityRCF extends TileEntity{ private int number = 1; @Override public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); this.number = compound.getInteger("Number"); } @Override public NBTTagCompound writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); compound.setInteger("Number", this.number); return compound; } public void increase() { this.number++; } public void decrease() { this.number–; } public int getNumber() { return number; } }
J’ai créé un item qui lorsque l’on clique sur mon block la valeur stocké dans le tileEntity est incrémenté :
@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(pos); if (tile == null) { return EnumActionResult.PASS; } if (tile instanceof TileEntityRCF) { if (((TileEntityRCF) tile).getNumber() < 10) { ((TileEntityRCF) tile).increase(); return EnumActionResult.SUCCESS; } else Minecraft.getMinecraft().ingameGUI.displayTitle("Max atteint", "", 1, 10, 1); } } return EnumActionResult.PASS; }
Jusque là tout se passe bien, cependant avec mon deuxième item la valeur récupéré du tileEntity n’est pas bonne :
@Override public ActionResult <itemstack>onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) { int compteur = 0; if (worldIn != null) { for (int i = 0; i < Minecraft.getMinecraft().world.loadedTileEntityList.size(); i++) { TileEntity tile = Minecraft.getMinecraft().world.loadedTileEntityList.get(i); if ((tile instanceof TileEntityRCF)) { if (Minecraft.getMinecraft().world.loadedTileEntityList.get(i).getPos().getX() < playerIn.getPosition().getX() + 36 && Minecraft.getMinecraft().world.loadedTileEntityList.get(i).getPos().getX() > playerIn.getPosition().getX() - 36 && Minecraft.getMinecraft().world.loadedTileEntityList.get(i).getPos().getY() < playerIn.getPosition().getY() + 36 && Minecraft.getMinecraft().world.loadedTileEntityList.get(i).getPos().getY() > playerIn.getPosition().getY() - 36 && Minecraft.getMinecraft().world.loadedTileEntityList.get(i).getPos().getZ() < playerIn.getPosition().getZ() + 36 && Minecraft.getMinecraft().world.loadedTileEntityList.get(i).getPos().getZ() > playerIn.getPosition().getZ() - 36) { int valeur = ((TileEntityRCF) tile).getNumber(); System.out.println("AAAAA : " + valeur); //valeur erronée compteur-= ((TileEntityRCF)tile).getNumber(); } } //Minecraft.getMinecraft().renderEngine.bindTexture(new ResourceLocation(Main.MODID,"textures/gui/chestbutin.png")); // Minecraft.getMinecraft().ingameGUI.drawTexturedModalRect((int)playerIn.posX + (-193), (int)playerIn.posY + (-115), 0, 0, 256, 256); Minecraft.getMinecraft().ingameGUI.displayTitle("Coffre : " + compteur, "", 1, 10, 1); return new ActionResult(EnumActionResult.SUCCESS, new ItemStack(this)); }
La valeur récupérer est toujours celle de base (1 initialisé à la création du tileEntity). C’est comme si l’incrémentation n’avait pas été effectué.
De plus lorsque le je redémarre le jeu, cette valeur est égale à 0J’aimerais également savoir s’il est possible de détruire l’objet une fois que l’on a fait un click droit. J’ai mis setMaxDamage à 1 mais ça ne marche pas.</itemstack>
-
Pour récupérer un tile entity, tu devrais plutôt faire comme ça :
ItemStack itemstack = playerIn.getHeldItem(handIn); RayTraceResult raytraceresult = this.rayTrace(worldIn, playerIn, false); if(raytraceresult == null || raytraceresult.typeOfHit != RayTraceResult.Type.BLOCK) return new ActionResult(EnumActionResult.PASS, itemstack); else { TileEntity te = worldIn.getTileEntity(raytraceresult.getBlockPos()); if(te instanceof TileEntityRCF) { TileEntityRCF teRCF = (TileEntityRCF) te; … } }
Ensuite, à tes méthodes inscrease() et decrease(), rajoute cette ligne :
this.markDirty();
Et pour détuire l’itemstack :
is.damageItem(99999, playerIn); //is est un itemstack
-
Pour récupérer un tile entity, tu devrais plutôt faire comme ça :
ItemStack itemstack = playerIn.getHeldItem(handIn); RayTraceResult raytraceresult = this.rayTrace(worldIn, playerIn, false); if(raytraceresult == null || raytraceresult.typeOfHit != RayTraceResult.Type.BLOCK) return new ActionResult(EnumActionResult.PASS, itemstack); else { TileEntity te = worldIn.getTileEntity(raytraceresult.getBlockPos()); if(te instanceof TileEntityRCF) { TileEntityRCF teRCF = (TileEntityRCF) te; … } }
Ensuite, à tes méthodes inscrease() et decrease(), rajoute cette ligne :
this.markDirty();
J’ai rajouté this.markDirty(); mais la valeur récupéré est toujours 1 Et quand je redémarre le jeu la valeur est à 0
-
Et si tu rajoutes ces 2 méthodes :
@Override public SPacketUpdateTileEntity getUpdatePacket() { NBTTagCompound nbt = new NBTTagCompound(); this.writeToNBT(nbt); int metadata = getBlockMetadata(); return new SPacketUpdateTileEntity(this.pos, metadata, nbt); } @Override public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) { this.readFromNBT(pkt.getNbtCompound()); }
-
@‘Alexandre1156’:
Et si tu rajoutes ces 2 méthodes :
@Override public SPacketUpdateTileEntity getUpdatePacket() { NBTTagCompound nbt = new NBTTagCompound(); this.writeToNBT(nbt); int metadata = getBlockMetadata(); return new SPacketUpdateTileEntity(this.pos, metadata, nbt); } @Override public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) { this.readFromNBT(pkt.getNbtCompound()); }
Toujours pareil
-
Tu ne devrais pas utiliser Minecraft.getMinecraft() à l’intérieur d’un if(!world.isRemote)
Tu as bien mis les deux fonctions dans le tile entity ?
-
@‘robin4002’:
Tu ne devrais pas utiliser Minecraft.getMinecraft() à l’intérieur d’un if(!world.isRemote)
Tu as bien mis les deux fonctions dans le tile entity ?
D’accord je vais modifier alors.
Oui j’ai bien les deux fonctions, voici ma classe désormais :
package fr.sebenforce.mod; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SPacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; public class TileEntityRCF extends TileEntity { private int number = 1; @Override public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); this.number = compound.getInteger("Number"); } @Override public NBTTagCompound writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); compound.setInteger("Number", this.number); return compound; } public void increase() { this.number++; this.markDirty(); } public void decrease() { this.number–; this.markDirty(); } public int getNumber() { return number; } @Override public SPacketUpdateTileEntity getUpdatePacket() { NBTTagCompound nbt = new NBTTagCompound(); this.writeToNBT(nbt); int metadata = getBlockMetadata(); return new SPacketUpdateTileEntity(this.pos, metadata, nbt); } @Override public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) { this.readFromNBT(pkt.getNbtCompound()); } }
-
Si j’étais toi je chercherai un code fonctionnel qui reprends les fonctionnalités que tu souhaites utilisé tu traduis ton problème en anglais, tu gardes les mots-clés et tu rajoutes Minecraft 1.11 Modding
Ou penses même à prendre un code d’une autre version et à tenté de le convertir en 1.11 et cherches sur le forum je pense que ça déjà été demandé -
@Benjamin Loison:
Si j’étais toi je chercherai un code fonctionnel qui reprends les fonctionnalités que tu souhaites utilisé tu traduis ton problème en anglais, tu gardes les mots-clés et tu rajoutes Minecraft 1.11 Modding
Ou penses même à prendre un code d’une autre version et à tenté de le convertir en 1.11 et cherches sur le forum je pense que ça déjà été demandéJe n’ai pas réussis à trouver d’info supplémentaires par rapport à ce que j’ai déjà