Extended Entity Properties les données restent à 0
-
Étrange ça, pourtant c’est bien le serveur qui envoie un paquet au client, donc il est sensé le recevoir. Il faudrait voir avec gugu, c’est sont code, personnellement je passe par les DataWatcher pour syncho les valeurs de mes custom prop.
-
Bah si tu veux me montrer une autre méthode qui marche ça ne me dérange pas

-
Dans ta classe IExtendedEntityProperties, dans le constructeur ajoute :
this.player.getDataWatcher().addObject(id, variable a syncro);les ids vont de 0 à 31, certains id sont déjà utilisé par mc, prends au dessus de 20 de préférence.
dans saveNBTData, pour sauvegarder la variable fait comme ça :
compound.setInteger("nom dans le tag", this.player.getDataWatcher().getWatchableObjectInt(id));(getWatchableObjectInt c’est pour une variable de type int, tu en as d’autre pour les byte, string …)
dans loadNBTData :
this.player.getDataWatcher().updateObject(id, compound.getInteger("nom dans le tag"));Et dernière changement, le getter et le setter :
public int getTaVariable() { return this.player.getDataWatcher().getWatchableObjectInt(id); } public void setTaVariable(int valeur) { this.player.getDataWatcher().updateObject(id, valeur); }Il faut rien de plus, pas besoin de packet.
-
Ok je suis en train de l’essayer mais je vois qu’il n’y a pas de getWatchableObjectBoolean, je dois changer mon boolean en int (avec par exemple mon false qui sera 0 et mon true qui sera 1) ou il y a une autre méthode
Edit : de même pour les long :s
-
Oui en effet, pas de long ni de double. Pour les boolean suffit de faire passer un byte qui vaut 1 ou 0 et voila.
Mais pour les long ou double il faut passer par les paquets, donc la faudrait voir avec gugu. -
Bah c’est pas grave ça m’étonnerais que les personnes récoltent assez afin de dépasser un la valeur maximal d’un int
(2.147.483.647 il me semble)
En revanche j’ai essayé plusieurs ids > 20 mais à chaque fois ils étaient utilisés (aussi bien le 29 que le 21) -
Ah ? J’utilise le 31, 30, 29, et 28, je n’ai pas de problème.
-
java.lang.IllegalArgumentException: Duplicate id value for 29! at net.minecraft.entity.DataWatcher.addObject(DataWatcher.java:56) at lmac.sonic.ExtendedEntityPropSonic.<init>(ExtendedEntityPropSonic.java:29) at lmac.sonic.InfoOverlay.renderGameOverlay(InfoOverlay.java:67) at cpw.mods.fml.common.eventhandler.ASMEventHandler_15_InfoOverlay_renderGameOverlay_Post.invoke(.dynamic) at cpw.mods.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:51) at cpw.mods.fml.common.eventhandler.EventBus.post(EventBus.java:122) at net.minecraftforge.client.GuiIngameForge.post(GuiIngameForge.java:901) at net.minecraftforge.client.GuiIngameForge.renderHelmet(GuiIngameForge.java:263) at net.minecraftforge.client.GuiIngameForge.renderGameOverlay(GuiIngameForge.java:120) at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1122) at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1025) at net.minecraft.client.Minecraft.run(Minecraft.java:912) at net.minecraft.client.main.Main.main(Main.java:112) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.minecraft.launchwrapper.Launch.launch(Launch.java:134) at net.minecraft.launchwrapper.Launch.main(Launch.java:28):s
Pas d’idée
?</init> -
deux mob qui on le même id
-
.<’
C’est pas de mobs qui ont le même id c’est deux DataWatcher qui ont le même id mais le problème c’est que c’est pareil avec tout les ids dispo :s -
Tu as bien mit un id différent à chaque watcher ajouté ?
-
Bah apparemment non ._.
public final static String EXT_PROP_NAME = "ExtPropSonic"; private final EntityPlayer player; public int Descendre; public byte DoubleJump; public int Ring; int i = 28; public ExtendedEntityPropSonic(EntityPlayer player) { this.player = player; this.Descendre = 0; this.DoubleJump = 0; this.Ring = 0; this.player.getDataWatcher().addObject(i + 1, Descendre); this.player.getDataWatcher().addObject(i + 2, DoubleJump); this.player.getDataWatcher().addObject(i + 3, Ring); } @Override public void saveNBTData(NBTTagCompound compound) { compound.setInteger("Descendre", this.player.getDataWatcher().getWatchableObjectInt(i + 1)); compound.setByte("DoubleJump", this.player.getDataWatcher().getWatchableObjectByte(i + 2)); compound.setInteger("Ring", this.player.getDataWatcher().getWatchableObjectInt(i + 3)); } @Override public void loadNBTData(NBTTagCompound compound) { this.player.getDataWatcher().updateObject(i + 1, compound.getInteger("Descendre")); this.player.getDataWatcher().updateObject(i + 2, compound.getByte("DoubleJump")); this.player.getDataWatcher().updateObject(i + 3, compound.getLong("Ring")); } @Override public void init(Entity entity, World world) { // TODO Auto-generated method stub } public static final void register(EntityPlayer player) { player.registerExtendedProperties(ExtendedEntityPropSonic.EXT_PROP_NAME, new ExtendedEntityPropSonic(player)); } public static final ExtendedEntityPropSonic get(EntityPlayer player) { return (ExtendedEntityPropSonic) player.getExtendedProperties(EXT_PROP_NAME); } private static String getSaveKey(EntityPlayer player) { return player.getDisplayName() + ":" + EXT_PROP_NAME; } public static void saveProxyData(EntityPlayer player) { ExtendedEntityPropSonic playerData = ExtendedEntityPropSonic.get(player); NBTTagCompound savedData = new NBTTagCompound(); playerData.saveNBTData(savedData); CommonProxy.storeEntityData(getSaveKey(player), savedData); } public int getDescendre() { return this.player.getDataWatcher().getWatchableObjectInt(i + 1); } public void setDescendre(int newDescendre) { this.player.getDataWatcher().updateObject(i + 1, newDescendre); } public boolean getDoubleJump() { if(this.player.getDataWatcher().getWatchableObjectInt(i + 2) == 0){ return false; } else{ return true; } } public void setDoubleJump(boolean newDoubleJump) { if(newDoubleJump){ this.player.getDataWatcher().updateObject(i + 2, 0); } else{ this.player.getDataWatcher().updateObject(i + 2, 1); } } public long getRing() { return this.player.getDataWatcher().getWatchableObjectInt(i + 3); } public void setRing(long newRing) { this.player.getDataWatcher().updateObject(i + 3, newRing); }Je me sentirais bête si ça viens de là >.<
Edit: Je viens d’y penser mais le faite d’initialisé deux fois ExtendedEntityPropSonic doit être la cause du problème (je l’initialise dans l’event et dans un overlay)
-
C’est en effet étrange, tu n’as pas d’autre mod sur ta workspace si ? Car c’est peut être un autre mod qui les utilisent déjà.
Ou alors il y a vraiment un problème x) -
Bah Glutils de (je ne vais pas citer le nom pour pas faire de faute, bon ok (jglrxavpok)) et FFTM
-
Dans ce cas je ne vois pas pourquoi ça ne fonctionne pas

-
Je crois avoir trouvé
cf: mon édit d’hier
Edit: Je viens d’y penser mais le faite d’initialisé deux fois ExtendedEntityPropSonic doit être la cause du problème (je l’initialise dans l’event et dans un overlay)
Le constructeur de mon ExtendedEntityPropSonic n’arrête pas d’être chargé donc la première fois ça l’ajoute mais la seconde bah … ça peut que buguer maintenant faut savoir qu’elle bétise ai-je fais pour le charger plusieurs fois >.<’
-
Ah oui en effet, c’est pas bon ça. Il faut seulement l’enregistrer dans l’event EntityConstructing
Dans les autres event il faut juste le get. -
Yep justement je remettais
ExtendedEntityPropSonic propSonic = new ExtendedEntityPropSonic(player);Good maintenant ça ce charge effectivement qu’une seule fois ^^
Dernière petite question (même si je pense déjà connaître la réponse) cette méthode risque de causer des problèmes de compatibilité si deux mods utilisent le même id :s , non? -
Oui, c’est pour ça le mieux est de passer le système de config.
Mais tu pourrais remettre le premier système, si ça se trouve (voir très surement) le problème venant aussi du fait que tu enregistrais deux fois l’extended prop -
tousse tousse
Je me sens bête mais VRAIMENT bête >.<’
Effectivement ça marche (mais qu’à moitié (me permettant d’avoir encore un peu de dignité :P))
La valeur ring reste à 0, elle passe à un lors d’un packet puis … revient à 0 (ce qui n’était pas le cas avec l’autre méthode)Edit : En lançant en multiplayer je vois que les rings sont changés côté serveur mais pas transmis au client :s , de plus le nombre à l’air d’être reset si on relance la partie
Re-edit : Je pense en faite que le packet n’est pas transmis au client mais je ne sais pas trop pourquoi :s