[1.6.4]Un tile entity qui se reset à chaque fois que je recharge mon monde
-
bonjour minecraft forge france!
Alors voila j’ai crée un block qui possède un tileentity afin qu’il soit unique ce que j’entend par unique c’est qu’il comporte des donnés propre a lui même à titre d’exemple j’ai deux même block cote à cote, quand je clique sur l’un seul lui s’active et non les deux enfin bref mon problème est que les information du tileentity change à chaque clique mais quand je reset le monde donc que je déco reco et bah les informations reviennent à zero et certain boolean s’active sans raison alors qu’ils sont sur false !
Merci d’avance pour vos réponses !
voici le block
package monsterhuntercraft.block; import java.util.Random; import monsterhuntercraft.Gui.GuiDrop; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import cpw.mods.fml.client.FMLClientHandler; public class BlockDrop extends BlockContainer { public BlockDrop(int par1) { super(par1, Material.wood); } /** * Called when the block is placed in the world. */ public void onBlockPlacedBy(World par1World, int par2, int par3, int par4, EntityLivingBase par5EntityLivingBase, ItemStack par6ItemStack) { TileEntityBlockDrop tileEntityBlock = (TileEntityBlockDrop)par1World.getBlockTileEntity(par2, par3, par4); Random rand = new Random(); tileEntityBlock.upNumber = rand.nextInt(2); tileEntityBlock.upNumber = tileEntityBlock.upNumber + 2; tileEntityBlock.timeUntilNextDrop = rand.nextInt(40000); tileEntityBlock.timeUntilNextDrop = tileEntityBlock.timeUntilNextDrop + 40000; } /** * Called upon block activation (right click on the block.) */ public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) { TileEntityBlockDrop tileEntityBlock = (TileEntityBlockDrop)par1World.getBlockTileEntity(par2, par3, par4); System.out.println("dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"); tileEntityBlock.isClicked = true; return true; } /** * Udapte fonction */ protected void dropUdapte(World par1World, int par2, int par3, int par4, String par5NameItem, int par6ItemID, Item par7Item) { TileEntityBlockDrop tileEntityBlock = (TileEntityBlockDrop)par1World.getBlockTileEntity(par2, par3, par4); Random rand = new Random(); final Minecraft minecraft = FMLClientHandler.instance().getClient(); final EntityPlayerSP par5EntityPlayer = minecraft.thePlayer; if(tileEntityBlock.upNumber == 0) { tileEntityBlock.timeUntilNextDrop–; } System.out.println("\nisClicked " + tileEntityBlock.isClicked); System.out.println("upNumber " + tileEntityBlock.upNumber); System.out.println("timeUntilNextDrop " + tileEntityBlock.timeUntilNextDrop); if(tileEntityBlock != null && tileEntityBlock.upNumber > 0 && tileEntityBlock.isClicked == true) { tileEntityBlock.isClicked = false; Minecraft.getMinecraft().displayGuiScreen(new GuiDrop(Minecraft.getMinecraft(), par5EntityPlayer, par5NameItem, 5)); ItemStack itemstack = par5EntityPlayer.inventory.getCurrentItem(); minecraft.thePlayer.dropPlayerItem(new ItemStack(par6ItemID, 1, 0)); /* if(!(par5EntityPlayer.inventory.hasItem(par7Item.itemID))); { par5EntityPlayer.inventory.addItemStackToInventory(new ItemStack(par7Item, 1, 0)); } */ tileEntityBlock.upNumber--; } else { tileEntityBlock.isClicked = false; } if(tileEntityBlock.timeUntilNextDrop == 0) { tileEntityBlock.upNumber = rand.nextInt(2); tileEntityBlock.upNumber = tileEntityBlock.upNumber + 2; } } /** * Returns the ID of the items to drop on destruction. */ public int idDropped(int par1, Random par2Random, int par3) { return 0; } /** * Returns the quantity of items to drop on block destruction. */ public int quantityDropped(Random par1Random) { return 1; } @Override public TileEntity createNewTileEntity(World world) { return new TileEntityBlockDrop(); } }
et le tile entity
package monsterhuntercraft.block; import java.util.Random; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet; import net.minecraft.network.packet.Packet132TileEntityData; import net.minecraft.tileentity.TileEntity; public class TileEntityBlockDrop extends TileEntity { boolean isClicked = false; int upNumber, timeUntilNextDrop; @Override public void updateEntity() { super.updateEntity(); } @Override public void readFromNBT(NBTTagCompound par1NBTTagCompound) { super.readFromNBT(par1NBTTagCompound); this.isClicked = par1NBTTagCompound.getBoolean("isClicked"); this.upNumber = par1NBTTagCompound.getInteger("upNumber"); this.timeUntilNextDrop = par1NBTTagCompound.getInteger("timeUntilNextDrop"); } @Override public void writeToNBT(NBTTagCompound par1NBTTagCompound) { super.writeToNBT(par1NBTTagCompound); par1NBTTagCompound.setBoolean("isClicked", this.isClicked); par1NBTTagCompound.setInteger("upNumber", this.upNumber); par1NBTTagCompound.setInteger("timeUntilNextDrop", this.timeUntilNextDrop); } public Packet getDescriptionPacket() { NBTTagCompound nbttagcompound = new NBTTagCompound(); this.writeToNBT(nbttagcompound); return new Packet132TileEntityData(this.xCoord, this.yCoord, this.zCoord, 4, nbttagcompound); } public void onDataPacket(INetworkManager net, Packet132TileEntityData pkt) { this.readFromNBT(pkt.data); } }
-
Sans tes codes, on ne peut pas t’aider.
-
voila
-
Ton tile entity est t-il enregistré dans la classe principale ?
-
Dans la fonction init j’ai mis ceci : GameRegistry.registerTileEntity(monsterhuntercraft.block.TileEntityBlockDrop.class, “stringID”);
-
Cela sûrement du fais que tu modifie les valeurs en world client et pas en world serveur.
D’ailleurs la fonction dropUdapte n’existe pas, je sais pas du tout où tu l’appelle. -
Ouai drop udapte n’existe pas je l’appelle dans la fonction randomDisplayTick et world client si je fais !par1World.isRemote sa ne marche pas!
-
Concrètement tu cherche à faire quoi ?
Car la façon dont tu t’y prend n’est pas bonne, il faudrait utiliser des paquets, et le problème c’est que même avec des paquets, ton blocs va changer en fonction de tous les joueurs co, à moins que ce soit prévu comme ça ? -
clairement quand on clique on drop l’item et sa on peu le faire *2 a *4 puis il ya un cooldown et on peut le refaire tout fonctionne juste au rest de la map tout reset alors que les nbt ne sont ils censé resté les même
-
J’arrive toujours pas à comprendre, tu peux envoyer le reste du code ? (surtout la où dropUdapte est appelé).
-
Bah il est appelé dans un autre block :
/**
- Ticks the block if it’s been scheduled
*/
public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random par5Random)
{
this.dropUdapte(par1World, par2, par3, par4, ItemMonsterHunter.Honey.getStatName(), ItemMonsterHunter.Honey.itemID, ItemMonsterHunter.Honey);
}
- Ticks the block if it’s been scheduled
-
Un bloc qui est extends BlockDrop ?
Mais du-coup tu as le gui qui s’ouvre de façon random non ?
La seul solution que je vois, c’est les paquets, car tu change les valeurs côté client, et faut changer les valeurs côtés serveur. -
non mon gui s’ouvre bien et je vais essayer de me renseigner niveau packet!