Extended Entity Properties
-
Merci maintenant ça marche, mais ça fait laguer mon ordi O_O et en plus, à chaque fois que j’utilise mon item, la console me sort :
[10:26:01] [Client thread/ERROR] [FML]: Detected ongoing potential memory leak. 100 packets have leaked. Top offenders [10:26:01] [Client thread/ERROR] [FML]: dragons:CHANNEL_1 : 100 [10:26:05] [Client thread/ERROR] [FML]: Detected ongoing potential memory leak. 200 packets have leaked. Top offenders [10:26:05] [Client thread/ERROR] [FML]: dragons:CHANNEL_1 : 200 [10:26:08] [Client thread/ERROR] [FML]: Detected ongoing potential memory leak. 300 packets have leaked. Top offenders [10:26:08] [Client thread/ERROR] [FML]: dragons:CHANNEL_1 : 300 [10:26:11] [Client thread/ERROR] [FML]: Detected ongoing potential memory leak. 400 packets have leaked. Top offenders [10:26:11] [Client thread/ERROR] [FML]: dragons:CHANNEL_1 : 400 [10:26:13] [Client thread/ERROR] [FML]: Detected ongoing potential memory leak. 500 packets have leaked. Top offenders [10:26:13] [Client thread/ERROR] [FML]: dragons:CHANNEL_1 : 500 [10:26:16] [Client thread/ERROR] [FML]: Detected ongoing potential memory leak. 600 packets have leaked. Top offenders [10:26:16] [Client thread/ERROR] [FML]: dragons:CHANNEL_1 : 600 -
Oula, envoie tout ton code, visiblement tu as des paquets qui se perdent.
-
PlayerData.java (le code intéressant) :
public final void sync() { PacketData$01 packet = new PacketData$01(this.mana, this.playerMaxMana, this.spell_levels, this.mana_regen_ticks); Dragons.network.sendToServer(packet); if (!player.worldObj.isRemote) { EntityPlayerMP player1 = (EntityPlayerMP) player; Dragons.network.sendTo(packet, player1); } }PacketData$01.java :
package fr.MrBlockTNT.Dragons.network; import fr.MrBlockTNT.Dragons.event.PlayerData; import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.network.NetHandlerPlayServer; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class PacketData$01 implements IMessage { private short mana, playerMaxMana; private int regen_ticks; private byte[] levels; public PacketData$01() { } public PacketData$01(short mana, short playerMaxMana, byte[] levels, int r_ticks) { this.mana = mana; this.playerMaxMana = playerMaxMana; this.levels = levels; this.regen_ticks = r_ticks; } @Override public void fromBytes(ByteBuf buf) { mana = buf.readShort(); playerMaxMana = buf.readShort(); byte size = buf.readByte(); levels = new byte; for(int i = 0; i < size; i++) levels* = buf.readByte(); regen_ticks = buf.readInt(); } @Override public void toBytes(ByteBuf buf) { buf.writeShort(mana); buf.writeShort(playerMaxMana); buf.writeByte(levels.length); for(int i = 0; i < levels.length; i++) buf.writeByte(levels*); buf.writeInt(regen_ticks); } public static class Handler implements IMessageHandler <packetdata$01, imessage="">{ @Override public IMessage onMessage(PacketData$01 message, MessageContext ctx) { if(ctx.netHandler instanceof NetHandlerPlayServer) { PlayerData dat = PlayerData.get(getClientPlayer()); dat.update(message.mana, message.playerMaxMana, message.levels, message.regen_ticks); } else if(ctx.netHandler instanceof NetHandlerPlayClient) { PlayerData dat = PlayerData.get(getClientPlayer()); dat.update(message.mana, message.playerMaxMana, message.levels, message.regen_ticks); } return null; } @SideOnly(Side.CLIENT) public EntityPlayer getClientPlayer() { return Minecraft.getMinecraft().thePlayer; } } } ```</packetdata$01,> -
if(ctx.netHandler instanceof NetHandlerPlayServer)
{
PlayerData dat = PlayerData.get(getClientPlayer());??!!??
Et autre problème, le nom de la classe. Mettre un $ dans le nom est une très mauvaise idée.
-
En fait, je ne voyais pas trop comment récupérer le joueur pour le côté serveur
mais je viens de me rendre compte que c’est complètement c**stupide puisque le serveur ne pourra pas le récupérer (SideOnly). Une idée ? (J’avais aussi pensé à envoyer l’entity player mais il semblerait que je ne puisse pas (et puis ça serai trop lourd…)).Sinon pour le nom je voulais un séparateur entre le nom du packet et son index x)
-
PlayerData dat = PlayerData.get(((NetHandlerPlayServer)netHandler).playerEntity);
Le $ est utilisé pour les noms des classes lorsque tu utilise des sous classe.
Par exemple si tu fais :public class BlaBla { public static class AutreClasse { } }Lors de la compilation ça va créer deux fichiers .class :
BlaBla.class
BlaBla$AutreClasse.classDonc c’est très déconseillé de mettre des $ dans le nom de la classe, ça risque de créer des problèmes avec ça.
-
Ah d’accord, merci
je vais changer ça.EDIT :
Ah ben en fait je perds toujours des packets
. Nouveau code :@Override public IMessage onMessage(PacketData_01 message, MessageContext ctx) { if(ctx.netHandler instanceof NetHandlerPlayServer) { PlayerData dat = PlayerData.get(((NetHandlerPlayServer)ctx.netHandler).playerEntity); dat.update(message.mana, message.playerMaxMana, message.levels, message.regen_ticks); } else if(ctx.netHandler instanceof NetHandlerPlayClient) { PlayerData dat = PlayerData.get(getClientPlayer()); dat.update(message.mana, message.playerMaxMana, message.levels, message.regen_ticks); } return null; } -
Up, help svp

-
Ta fonction dat.update fait quoi ?
-
Elle met juste à jour les propriétés du joueur.
-
Un copier/coller de la fonction aurait été utile. Car je suspecte que tu renvoie un paquet à chaque fois, enfin je ne vois pas d’autres explications.
-
public void update(short mana, short playerMaxMana, byte[] levels, int regen) { this.mana = mana; this.playerMaxMana = playerMaxMana; this.spell_levels = levels; this.mana_regen_ticks = regen; }En effet ta théorie sur le fait que je renvoie le packet à chaque fois n’est pas impossible. Je check ça.
EDIT : Rien trouvé
(Enfin intelligible pour moi)Code (peut-être auras-tu plus de chance
) :
PlayerData.java
PacketData_01.java
CommonProxy.javaIl y a quelques erreurs dans un constructeur et la méthode update notamment car je suis en train de mettre en place quelque chose.
-
Up

-
Je ne vois pas d’erreur non plus

Sinon envoie un zip de ton dossier src, je vais faire des tests en local. -
Regarde tes MPs
-
Je l’ai vu, il me faut juste le temps de regarder.
J’édite mon message dès que c’est bon (d’ici midi, et si j’ai pas trouvé pour midi je regarderais cette aprèm).En semaine mon temps est très limité.
Finalement ça a été assez rapide. Le problème c’est que les paquets qui partent du serveur se perdent, le client ne sait pas quoi en faire.
Dans ta classe principale tu as ça actuellement : // Network network = NetworkRegistry.INSTANCE.newSimpleChannel(MODID + ":CHANNEL_1"); network.registerMessage(PacketData_01.Handler.class, PacketData_01.class, 0, Side.SERVER);Donc si le paquet par du client vers le serveur le serveur sait ce qu’il doit faire.
Mais dans l’autre sens non.
Solution ? Il suffit d’ajouter cette ligne en plus : network.registerMessage(PacketData_01.Handler.class, PacketData_01.class, 0, Side.CLIENT); -
Merci je teste

EDIT :
Super ça marche ! Un grand merci
-
Bonjour j’ai suivi ce tuto mais j’ai des erreur dans ma console je ne comprend pas car le packet marche mais il y a des erreurs
[14:07:56 ERROR]: SimpleChannelHandlerWrapper exception java.lang.RuntimeException: Missing at cpw.mods.fml.server.FMLServerHandler.getClientToServerNetworkManager(FMLServerHandler.java:238) ~[FMLServerHandler.class:1.7.10-1448.121] at cpw.mods.fml.common.FMLCommonHandler.getClientToServerNetworkManager(FMLCommonHandler.java:542) ~[FMLCommonHandler.class:1.7.10-1448.121] at cpw.mods.fml.common.network.FMLOutboundHandler$OutboundTarget$8.selectNetworks(FMLOutboundHandler.java:225) ~[FMLOutboundHandler$OutboundTarget$8.class:1.7.10-1448 .121] at cpw.mods.fml.common.network.FMLOutboundHandler.write(FMLOutboundHandler.java:273) ~[FMLOutboundHandler.class:1.7.10-1448.121] at io.netty.channel.DefaultChannelHandlerContext.invokeWrite(DefaultChannelHandlerContext.java:644) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.write(DefaultChannelHandlerContext.java:698) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.write(DefaultChannelHandlerContext.java:637) ~[DefaultChannelHandlerContext.class:?] at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:115) ~[MessageToMessageEncoder.class:?] at io.netty.handler.codec.MessageToMessageCodec.write(MessageToMessageCodec.java:116) ~[MessageToMessageCodec.class:?] at io.netty.channel.DefaultChannelHandlerContext.invokeWrite(DefaultChannelHandlerContext.java:644) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.write(DefaultChannelHandlerContext.java:698) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.writeAndFlush(DefaultChannelHandlerContext.java:688) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.writeAndFlush(DefaultChannelHandlerContext.java:717) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java :893) ~[DefaultChannelPipeline.class:?] at io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:239) ~[AbstractChannel.class:?] at cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper.sendToServer(SimpleNetworkWrapper.java:236) [SimpleNetworkWrapper.class:1.7.10-1448.121] at joueur.ExtendedEntityPropCaracteristique.sync(ExtendedEntityPropCaracteristique.java:183) [ExtendedEntityPropCaracteristique.class:?] at joueur.ExtendedEntityPropCaracteristique.addKamas(ExtendedEntityPropCaracteristique.java:277) [ExtendedEntityPropCaracteristique.class:?] at equipement.epees.Goultard.func_77659_a(Goultard.java:29) [Goultard.class:?] at net.minecraft.item.ItemStack.func_77957_a(ItemStack.java:172) [add.class:?] at net.minecraft.server.management.ItemInWorldManager.func_73085_a(ItemInWorldManager.java:382) [mx.class:?] at net.minecraft.network.NetHandlerPlayServer.func_147346_a(NetHandlerPlayServer.java:825) [nh.class:?] at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.func_148833_a(SourceFile:60) [jo.class:?] at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.func_148833_a(SourceFile:9) [jo.class:?] at net.minecraft.network.NetworkManager.func_74428_b(NetworkManager.java:244) [ej.class:?] at net.minecraft.network.NetworkSystem.func_151269_c(NetworkSystem.java:173) [nc.class:?] at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:991) [MinecraftServer.class:?] at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:431) [lt.class:?] at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:809) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:669) [MinecraftServer.class:?] at java.lang.Thread.run(Thread.java:745) [?:1.8.0_45-internal] [14:07:56 WARN]: More than one exception was raised. Will report only the first one and log others. java.lang.RuntimeException: Missing at cpw.mods.fml.server.FMLServerHandler.getClientToServerNetworkManager(FMLServerHandler.java:238) ~[FMLServerHandler.class:1.7.10-1448.121] at cpw.mods.fml.common.FMLCommonHandler.getClientToServerNetworkManager(FMLCommonHandler.java:542) ~[FMLCommonHandler.class:1.7.10-1448.121] at cpw.mods.fml.common.network.FMLOutboundHandler$OutboundTarget$8.selectNetworks(FMLOutboundHandler.java:225) ~[FMLOutboundHandler$OutboundTarget$8.class:1.7.10-1448.121] at cpw.mods.fml.common.network.FMLOutboundHandler.write(FMLOutboundHandler.java:273) ~[FMLOutboundHandler.class:1.7.10-1448.121] at io.netty.channel.DefaultChannelHandlerContext.invokeWrite(DefaultChannelHandlerContext.java:644) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.write(DefaultChannelHandlerContext.java:698) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.write(DefaultChannelHandlerContext.java:637) ~[DefaultChannelHandlerContext.class:?] at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:115) ~[MessageToMessageEncoder.class:?] at io.netty.handler.codec.MessageToMessageCodec.write(MessageToMessageCodec.java:116) ~[MessageToMessageCodec.class:?] at io.netty.channel.DefaultChannelHandlerContext.invokeWrite(DefaultChannelHandlerContext.java:644) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.write(DefaultChannelHandlerContext.java:698) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.writeAndFlush(DefaultChannelHandlerContext.java:688) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.writeAndFlush(DefaultChannelHandlerContext.java :717) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:893) ~[DefaultChannelPipeline.class:?] at io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:239) ~[AbstractChannel.class:?] at cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper.sendToServer(SimpleNetworkWrapper.java:236) [SimpleNetworkWrapper.class:1.7.10-1448.121] at joueur.ExtendedEntityPropCaracteristique.sync(ExtendedEntityPropCaracteristique.java:183) [ExtendedEntityPropCaracteristique.class:?] at joueur.ExtendedEntityPropCaracteristique.addKamas(ExtendedEntityPropCaracteristique.java:277) [ExtendedEntityPropCaracteristique.class:?] at net.minecraft.item.ItemStack.func_77957_a(ItemStack.java:172) [add.class:?] at net.minecraft.server.management.ItemInWorldManager.func_73085_a(ItemInWorldManager.java:382) [mx.class:?] at net.minecraft.network.NetHandlerPlayServer.func_147346_a(NetHandlerPlayServer.java:825) [nh.class:?] at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.func_148833_a(SourceFile:60) [jo.class:?] at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.func_148833_a(SourceFile:9) [jo.class:?] at net.minecraft.network.NetworkManager.func_74428_b(NetworkManager.java:244) [ej.class:?] at net.minecraft.network.NetworkSystem.func_1 51269_c(NetworkSystem.java:173) [nc.class:?] at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:991) [MinecraftServer.class:?] at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:431) [lt.class:?] at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:809) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:669) [MinecraftServer.class:?] at java.lang.Thread.run(Thread.java:745) [?:1.8.0_45-internal]Mon extends entityproperties
public static final ExtendedEntityPropCaracteristique get(EntityPlayer player) { return (ExtendedEntityPropCaracteristique) player.getExtendedProperties(EXT_PROP_NAME); } @Override public void saveNBTData(NBTTagCompound compound) { NBTTagCompound properties = new NBTTagCompound(); properties.setLong("Cooldown", this.cooldown); properties.setLong("Argent", this.argent); compound.setTag(EXT_PROP_NAME, properties); } @Override public void loadNBTData(NBTTagCompound compound) { NBTTagCompound properties = (NBTTagCompound) compound.getTag(EXT_PROP_NAME); this.cooldown = properties.getLong("Cooldown"); this.argent = properties.getLong("Argent"); } @Override public void init(Entity entity, World world) { // TODO Auto-generated method stub } public final void sync() { Packetcaracteristique packetcaracteristique = new Packetcaracteristique(this.cooldown , this.argent); //La ligne suivante dépend de votre manière d'envoyer les packets. Celle-ci vient de mon mod, je ne la changerais pas car je ne peux l'appliquer à votre mod, mais elle reste bonne pour un exemple. TutoMod.network.sendToServer((IMessage)new Packetcaracteristique()); if (!player.worldObj.isRemote) { EntityPlayerMP player1 = (EntityPlayerMP) player; //Ici, même chose que précédemment, sauf que le packet est envoyé au player. TutoMod.network.sendTo((IMessage)new Packetcaracteristique(), player1); } } private static String getSaveKey(EntityPlayer player) { return player.getDisplayName() + ":" + EXT_PROP_NAME; } public static void saveProxyData(EntityPlayer player) { ExtendedEntityPropCaracteristique playerData = ExtendedEntityPropCaracteristique.get(player); NBTTagCompound savedData = new NBTTagCompound(); playerData.saveNBTData(savedData); Commonproxy.storeEntityData(getSaveKey(player), savedData); } public static void loadProxyData(EntityPlayer player) { ExtendedEntityPropCaracteristique playerData = ExtendedEntityPropCaracteristique.get(player); NBTTagCompound savedData = Commonproxy.getEntityData(getSaveKey(player)); if (savedData != null) { playerData.loadNBTData(savedData); } playerData.sync(); } public void update(long cooldown, long argent) { this.cooldown = cooldown; this.argent = argent; } public boolean pay(long amount) { boolean sufficient = amount <= this.argent; if (sufficient) { this.argent -= amount; this.sync(); } else { return false; } return sufficient; } public void addMoney(long amount) { this.argent += amount; this.sync(); } public long getMoney() { return this.argent; } public void setMoney(long newMoney) { this.argent = newMoney; this.sync(); } }mon packet
implements IMessage { public long cooldown; public long argent; public Packetcaracteristique() { } public Packetcaracteristique(long cooldown, long argent) { this.cooldown = cooldown; this.argent = argent; } @Override public void fromBytes(ByteBuf buf) { cooldown = buf.readInt(); argent = buf.readInt(); } @Override public void toBytes(ByteBuf buf) { buf.writeLong(cooldown); buf.writeLong(argent); } public static class Handler implements IMessageHandler <packetcaracteristique, imessage="">{ @Override public IMessage onMessage(Packetcaracteristique message, MessageContext ctx) { if(ctx.netHandler instanceof NetHandlerPlayServer) { ExtendedEntityPropCaracteristique prop = ExtendedEntityPropCaracteristique.get(((NetHandlerPlayServer)ctx.netHandler).playerEntity); prop.update(message.cooldown, message.argent); } else if(ctx.netHandler instanceof NetHandlerPlayClient) { ExtendedEntityPropCaracteristique prop = ExtendedEntityPropCaracteristique.get(getClientPlayer()); prop.update(message.cooldown, message.argent); } return null; } } @SideOnly(Side.CLIENT) public static EntityPlayer getClientPlayer() { return Minecraft.getMinecraft().thePlayer; } }Mon init
network.registerMessage(Packetcaracteristique.Handler.class, Packetcaracteristique.class, 1, Side.SERVER); network.registerMessage(Packetcaracteristique.Handler.class, Packetcaracteristique.class, 1, Side.CLIENT); ```</packetcaracteristique,> -
D’un côté tu fais un readInt et l’autre writeLong, essaie déjà en mettant un readLong plutôt
-
ah oui desolé l’erreur est déjà corrigé j’avais remarqué entre temps mais ca ne fonctionne toujours pas toujours ce message d’erreur dans la console