Problème Sauvegarde Boolean ExtendedEntityProperties
-
En fait je la get mais elle est modifiée, puisque dans une classe d item à part, dans le onItemRightClick, je me sers de ma méthode setHasKitSecour
-
Heu non.
Là tu as ça :@Override public void loadNBTData(NBTTagCompound compound) { NBTTagCompound properties = (NBTTagCompound) compound.getTag(EXT_PROP_NAME); //this.hasKitSecour = properties.getBoolean("hasKitSecour"); compound.getBoolean("hasKitSecour"); }Tu ne fais absolument rien avec compound.getBoolean(“hasKitSecour”) …
-
C’est ce que je t’avais dit dans la shoutbox, il faut ensuite que tu update ton datawatcher.
-
J’utilise le même code dans la classe d’un mob que j’ai fait et tout marche nikel. Voilà de quoi je parlais tout à l’heure
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { ExtendedEntityPropertiesPlayer props = ExtendedEntityPropertiesPlayer.get(player); if(props.hasKitSecour()) props.setHasKitSecour(false); else props.setHasKitSecour(true); return stack; }Pour moi vu que c’est la méthode qui load le boolean stocké dans le tag du joueur, y’a pas besoin de set une valeur ou quoique ce soit d’autre. Je ne sais pas si c’est comparable mais j’ai exactement les mêmes méthodes et j’ai donc procédé de la même manière pour un mob que j’ai fait : tag + dataWatcher. Tout marchait et marche encore où moment je vous parle ^^’
-
Ouais mais ta méthode load est complètement inutile dans ce cas car tu récupère seulement, il faudrait que tu update. c’est logique si tu fais seulement le récup et que tu le jete, ça sert a rien.
-
Mais mes data watcher sont censés se mettre à jour automatiquement. J’ai trouvé ce tuto où l’auteur ne se sert même pas des NBT, pensez vous que ce soit une bonne idée ?
-
En fait les NBT c’est pour sauvegarder et dans tout code actuel ils ne servent à rien puisque tu ne les update pas donc si ça fonctionne comma ça, oui tu peux les retirer
-
Mais je ne comprends pas ce que tu racontes. Les NBTTagCompound n’ont pas à être mis à jour.
Regarde cette entity, tu comprendras mieuxpublic class Assassin extends EntityMob { public Assassin(World world) { super(world); this.setSize(1.25f, 2.85f); //this.experienceValue = 30; } protected void applyEntityAttributes() { super.applyEntityAttributes(); this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(16.0D); this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(80.0D); this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.0D); this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(10.0D);//En hard, toujours mettre la valeur souhaitée - 2 pour que le mob et son attaque puissent bien fonctionner ! this.getEntityAttribute(SharedMonsterAttributes.knockbackResistance).setBaseValue(2.0D); } protected void entityInit() { super.entityInit(); this.dataWatcher.addObject(2, Byte.valueOf(((byte)0))); } public void writeEntityToNBT(NBTTagCompound compound) { super.writeEntityToNBT(compound); compound.setBoolean("isCrying", this.isCrying()); } public void readFromEntityToNBT(NBTTagCompound compound) { super.readFromNBT(compound); compound.getBoolean("isCrying"); } public void onLivingUpdate() { if(isCrying() && this.getHealth() > 0.0F && this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getBaseValue() != 0.0D) { worldObj.playSoundAtEntity(this, DyingCraftMod.MODID + ":assassinCry", 5.0F, 1.0F); this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.0D); } if(isCrying() && this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getBaseValue() == 0.0D) { if(worldObj.getTotalWorldTime() % 80 == 0) { this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.23D); this.setCrying(false); } } super.onLivingUpdate(); } public boolean attackEntityFrom(DamageSource damagesource, float amount) { if(!worldObj.isRemote && attackingPlayer != null) { if(attackingPlayer.getHeldItem() != null) { if(worldObj.rand.nextInt(3) + 1 == 3) { this.setCrying(true); } } } return super.attackEntityFrom(damagesource, amount); } public boolean isCrying() { return this.dataWatcher.getWatchableObjectByte(2) != 0; } public void setCrying(boolean flag) { byte b0 = this.dataWatcher.getWatchableObjectByte(2); if(flag) { this.dataWatcher.updateObject(2, Byte.valueOf(((byte)1))); } else { this.dataWatcher.updateObject(2, Byte.valueOf(((byte)0))); } } }Je réfléchis encore mais je pense retourner à l’utilisation des packets.
Je refais le code le plus proprement possible et je vous le renvoie si ça coince
-
C’est bon prob réglé. Je suis passé par les packets, la première fois j’avais dû faire des bêtises avec les conditions du genre isRemote…
Merci à vous tous !
-
Je ne parle pas du compound, je parle du datawatcher: this.datawatcher.updateObject(1, compound.getBoolean(“isCrying”));