MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    ExtendedEntityProperties et problème de synchro

    Planifier Épinglé Verrouillé Déplacé Résolu 1.7.x
    1.7.10
    13 Messages 3 Publieurs 1.9k Vues 1 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • Snowy_1803S Hors-ligne
      Snowy_1803
      dernière édition par

      Moi perso, j’ai fait ce genre de classe avec qu’un Packet serveur -> client. Après ça dépends de ce que tu veux faire.

      Moddeur 1.8

      Développeur Java

      1 réponse Dernière réponse Répondre Citer 0
      • DeletedD Hors-ligne
        Deleted
        dernière édition par

        @Snowy_1803 : Essaie d’utiliser ton extprop dans un event client side only et tu t’apercevras qu’il ne marchera pas 😉
        A part ça je pense m’approcher de + en + du but mais en vain le prob persiste.
        Mes classes modifiées :
        Mon packet client

        
        public class ClientPacketToBeLying implements IMessage
        {
        
        private static boolean beLying;
        
        public ClientPacketToBeLying()
        {
        
        }
        
        public ClientPacketToBeLying(boolean beLying)
        {
        this.beLying = beLying;
        }
        
        @Override
        public void fromBytes(ByteBuf buf)
        {
        this.beLying = buf.readBoolean();
        }
        
        @Override
        public void toBytes(ByteBuf buf)
        {
        buf.writeBoolean(beLying);
        }
        
        public static class Handler implements IMessageHandler <clientpackettobelying, commonpackettobelying="">{
        @Override
        public CommonPacketToBeLying onMessage(ClientPacketToBeLying message, MessageContext ctx)
        {
        return new CommonPacketToBeLying(message.beLying);
        }
        }
        }
        
        

        Mon packet common

        
        public class CommonPacketToBeLying implements IMessage
        {
        
        private static boolean beLying;
        
        public CommonPacketToBeLying()
        {
        
        }
        
        public CommonPacketToBeLying(boolean beLying)
        {
        this.beLying = beLying;
        }
        
        @Override
        public void fromBytes(ByteBuf buf)
        {
        this.beLying = buf.readBoolean();
        }
        
        @Override
        public void toBytes(ByteBuf buf)
        {
        buf.writeBoolean(beLying);
        }
        
        public static class Handler implements IMessageHandler <commonpackettobelying, imessage="">{
        @Override
        public IMessage onMessage(CommonPacketToBeLying message, MessageContext ctx)
        {
        EntityPlayerMP player = ctx.getServerHandler().playerEntity;
        ExtendedEntityPropertiesPlayer props = ExtendedEntityPropertiesPlayer.get(player);
        boolean flag = props.isLyingDown();
        flag = beLying;
        return null;
        }
        }
        }
        
        

        Ma méthode sync()

        
        public final void sync()
        {
        EntityPlayerMP player1 = (EntityPlayerMP) player;
        ClientPacketToBeLying packet1 = new ClientPacketToBeLying(this.beLying);
        StolenLifeMod.network.sendTo(packet1, player1);
        }
        
        

        Dans l’espoir d’avoir une réponse pertinente :)</commonpackettobelying,></clientpackettobelying,>

        1 réponse Dernière réponse Répondre Citer 0
        • robin4002R Hors-ligne
          robin4002 Moddeurs confirmés Rédacteurs Administrateurs
          dernière édition par

          Oui ta fonction sync envoie le paquet dans les deux sens. Mais ton paquet n’est que conçu pour arriver sur le serveur.
          Et oui c’est exactement ça, tu fais un deuxième handler et tu utilises Minecraft.getMinecraft().thePlayer. (n’oublies pas le @SideOnly au dessus de la méthode onMessage).

          Et si un paquet peut très bien être envoyé sur les deux side. Il faut juste l’enregistrer deux fois, avec un handler différent pour chaque side.

          EDIT : utilises le même paquet, ça sera plus simple.

          1 réponse Dernière réponse Répondre Citer 0
          • DeletedD Hors-ligne
            Deleted
            dernière édition par

            Alors je dois vraiment pas être doué, j’ai (il me semble) bien suivi tes conseils, or ça ne marche toujours pas (le client ne connaît pas la réelle valeur du boolean)
            Mon (unique packet)

            
            public class PacketToBeLying implements IMessage
            {
            
            private static boolean beLying;
            
            public PacketToBeLying()
            {
            
            }
            
            public PacketToBeLying(boolean beLying)
            {
            this.beLying = beLying;
            }
            
            @Override
            public void fromBytes(ByteBuf buf)
            {
            this.beLying = buf.readBoolean();
            }
            
            @Override
            public void toBytes(ByteBuf buf)
            {
            buf.writeBoolean(beLying);
            }
            
            public static class ClientHandler implements IMessageHandler <packettobelying, imessage="">{
            @Override
            @SideOnly(Side.CLIENT)
            public IMessage onMessage(PacketToBeLying message, MessageContext ctx)
            {
            EntityPlayer player = Minecraft.getMinecraft().thePlayer;
            ExtendedEntityPropertiesPlayer props = ExtendedEntityPropertiesPlayer.get(player);
            boolean flag = props.isLyingDown();
            flag = beLying;
            return null;
            }
            }
            public static class CommonHandler implements IMessageHandler <packettobelying, imessage="">{
            @Override
            public IMessage onMessage(PacketToBeLying message, MessageContext ctx)
            {
            EntityPlayerMP player = ctx.getServerHandler().playerEntity;
            ExtendedEntityPropertiesPlayer props = ExtendedEntityPropertiesPlayer.get(player);
            boolean flag = props.isLyingDown();
            flag = beLying;
            return null;
            }
            }
            }
            
            

            Ma méthode sync

            
            public final void sync()
            {
            PacketToBeLying packet1 = new PacketToBeLying(this.beLying);
            StolenLifeMod.network.sendToServer(packet1);
            if (!player.worldObj.isRemote)
            {
            EntityPlayerMP player1 = (EntityPlayerMP) player;
            StolenLifeMod.network.sendTo(packet2, player1);
            }
            }
            
            

            Mes enregistrements de packets
            network.registerMessage(PacketToBeLying.ClientHandler.class, PacketToBeLying.class, 0, Side.CLIENT);
            network.registerMessage(PacketToBeLying.CommonHandler.class, PacketToBeLying.class, 1, Side.SERVER);

            Moi qui pensait tout connaitre des packets xD
            En + ma méthode sync n’est appellé que côté common, donc je pense que c’est à cause de ça que la méthode sendToServer ne peut pas fonctionner, qu’en penses-tu ?</packettobelying,></packettobelying,>

            1 réponse Dernière réponse Répondre Citer 0
            • robin4002R Hors-ligne
              robin4002 Moddeurs confirmés Rédacteurs Administrateurs
              dernière édition par

              Non le problème est dans ta fonction onMessage (je ne sais pas pourquoi je l’ai pas vu plus tôt x))
              EntityPlayer player = Minecraft.getMinecraft().thePlayer;
              ExtendedEntityPropertiesPlayer props = ExtendedEntityPropertiesPlayer.get(player);
              boolean flag = props.isLyingDown();
              flag = beLying;
              return null;

              ça devrait plutôt être :
              EntityPlayer player = Minecraft.getMinecraft().thePlayer;
              ExtendedEntityPropertiesPlayer props = ExtendedEntityPropertiesPlayer.get(player);
              props.setLyingDown(message.beLying);
              return null;

              Et beLying ne doit pas être static dans le paquet. (les histoires d’instance c’est toujours pas ça, je vois encore trop de static mal placé faut vraiment que je finisse le tutoriel sur Java).

              1 réponse Dernière réponse Répondre Citer 0
              • DeletedD Hors-ligne
                Deleted
                dernière édition par

                Le problème persiste, sauf que cette fois ma console ne m’indique même plus le server side, que le client. Et d’ailleurs le client est toujours à false. Je sais pas si c’est clair, si ça ne l’est pas tu peux peut-être essayer chez toi
                Mes 2 handlers :

                
                public static class ClientHandler implements IMessageHandler <packettobelying, imessage="">{
                @Override
                @SideOnly(Side.CLIENT)
                public IMessage onMessage(PacketToBeLying message, MessageContext ctx)
                {
                EntityPlayer player = Minecraft.getMinecraft().thePlayer;
                ExtendedEntityPropertiesPlayer props = ExtendedEntityPropertiesPlayer.get(player);
                props.setBeLyingDown(message.beLying);
                return null;
                }
                }
                public static class CommonHandler implements IMessageHandler <packettobelying, imessage="">{
                @Override
                public IMessage onMessage(PacketToBeLying message, MessageContext ctx)
                {
                EntityPlayerMP player = ctx.getServerHandler().playerEntity;
                ExtendedEntityPropertiesPlayer props = ExtendedEntityPropertiesPlayer.get(player);
                props.setBeLyingDown(message.beLying);
                return null;
                }
                }
                
                ```</packettobelying,></packettobelying,>
                1 réponse Dernière réponse Répondre Citer 0
                • robin4002R Hors-ligne
                  robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                  dernière édition par

                  La fonction setBeLyingDown set bien ta variable ?
                  Sinon envoies un zip du dossier src.

                  1 réponse Dernière réponse Répondre Citer 0
                  • DeletedD Hors-ligne
                    Deleted
                    dernière édition par

                    Oui c’est bien un setter qui m’a l’air fonctionnel.
                    Je te les ai envoyées en mp 😃

                    1 réponse Dernière réponse Répondre Citer 0
                    • robin4002R Hors-ligne
                      robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                      dernière édition par

                      PacketToBeLying :

                      package fr.stdevteam.stolenlife.common.packets;
                      
                      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;
                      import fr.stdevteam.stolenlife.common.extprop.ExtendedEntityPropertiesPlayer;
                      import io.netty.buffer.ByteBuf;
                      import net.minecraft.client.Minecraft;
                      import net.minecraft.entity.player.EntityPlayer;
                      import net.minecraft.entity.player.EntityPlayerMP;
                      
                      public class PacketToBeLying implements IMessage
                      {
                      
                      private boolean beLying;
                      
                      public PacketToBeLying()
                      {
                      
                      }
                      
                      public PacketToBeLying(boolean beLying)
                      {
                      this.beLying = beLying;
                      }
                      
                      @Override
                      public void fromBytes(ByteBuf buf)
                      {
                      this.beLying = buf.readBoolean();
                      }
                      
                      @Override
                      public void toBytes(ByteBuf buf)
                      {
                      buf.writeBoolean(beLying);
                      }
                      
                      public static class ClientHandler implements IMessageHandler <packettobelying, imessage="">{
                      @Override
                      @SideOnly(Side.CLIENT)
                      public IMessage onMessage(PacketToBeLying message, MessageContext ctx)
                      {
                      EntityPlayer player = Minecraft.getMinecraft().thePlayer;
                      ExtendedEntityPropertiesPlayer props = ExtendedEntityPropertiesPlayer.get(player);
                      props.beLying = message.beLying;
                      System.out.println("paquet " + props.beLying + " " + message.beLying);
                      return null;
                      }
                      }
                      public static class CommonHandler implements IMessageHandler <packettobelying, imessage="">{
                      @Override
                      public IMessage onMessage(PacketToBeLying message, MessageContext ctx)
                      {
                      EntityPlayerMP player = ctx.getServerHandler().playerEntity;
                      ExtendedEntityPropertiesPlayer props = ExtendedEntityPropertiesPlayer.get(player);
                      props.beLying = message.beLying;
                      return null;
                      }
                      }
                      }
                      

                      ExtendedEntityPropertiesPlayer :

                      package fr.stdevteam.stolenlife.common.extprop;
                      
                      import fr.stdevteam.stolenlife.common.core.CommonProxy;
                      import fr.stdevteam.stolenlife.common.core.StolenLifeMod;
                      import fr.stdevteam.stolenlife.common.packets.PacketToBeLying;
                      import net.minecraft.entity.Entity;
                      import net.minecraft.entity.player.EntityPlayer;
                      import net.minecraft.entity.player.EntityPlayerMP;
                      import net.minecraft.nbt.NBTTagCompound;
                      import net.minecraft.world.World;
                      import net.minecraftforge.common.IExtendedEntityProperties;
                      
                      public class ExtendedEntityPropertiesPlayer implements IExtendedEntityProperties
                      {
                      
                      public final static String EXT_PROP_NAME = "ExtProp" + StolenLifeMod.MODID;
                      private final EntityPlayer player;
                      public boolean beLying;
                      
                      public ExtendedEntityPropertiesPlayer(EntityPlayer player)
                      {
                      this.player = player;
                      this.beLying = false;
                      }
                      
                      @Override
                      public void saveNBTData(NBTTagCompound compound)
                      {
                      NBTTagCompound properties = new NBTTagCompound();
                      properties.setBoolean("beLying", this.beLying);
                      compound.setTag(EXT_PROP_NAME, properties);
                      }
                      
                      @Override
                      public void loadNBTData(NBTTagCompound compound)
                      {
                      NBTTagCompound properties = (NBTTagCompound) compound.getTag(EXT_PROP_NAME);
                      this.beLying = properties.getBoolean("beLying");
                      }
                      
                      @Override
                      public void init(Entity entity, World world)
                      {
                      }
                      
                      public static final void register(EntityPlayer player)
                      {
                      player.registerExtendedProperties(ExtendedEntityPropertiesPlayer.EXT_PROP_NAME, new ExtendedEntityPropertiesPlayer(player));
                      }
                      
                      public static final ExtendedEntityPropertiesPlayer get(EntityPlayer player)
                      {
                      return (ExtendedEntityPropertiesPlayer) player.getExtendedProperties(EXT_PROP_NAME);
                      }
                      
                      public final void sync()
                      {
                      PacketToBeLying packet1 = new PacketToBeLying(this.beLying);
                      StolenLifeMod.network.sendToServer(packet1);
                      if (!player.worldObj.isRemote)
                      {
                      EntityPlayerMP player1 = (EntityPlayerMP) player;
                      StolenLifeMod.network.sendTo(packet1, player1);
                      }
                      }
                      
                      private static String getSaveKey(EntityPlayer player)
                      {
                      return player.getDisplayName() + ":" + EXT_PROP_NAME;
                      }
                      
                      public static void saveProxyData(EntityPlayer player)
                      {
                      ExtendedEntityPropertiesPlayer playerData = ExtendedEntityPropertiesPlayer.get(player);
                      NBTTagCompound savedData = new NBTTagCompound();
                      playerData.saveNBTData(savedData);
                      CommonProxy.storeEntityData(getSaveKey(player), savedData);
                      }
                      
                      public static void loadProxyData(EntityPlayer player)
                      {
                      ExtendedEntityPropertiesPlayer playerData = ExtendedEntityPropertiesPlayer.get(player);
                      NBTTagCompound savedData = CommonProxy.getEntityData(getSaveKey(player));
                      if (savedData != null)
                      {
                      playerData.loadNBTData(savedData);
                      }
                      playerData.sync();
                      }
                      
                      public boolean isLyingDown()
                      {
                      return beLying;
                      }
                      
                      public void setBeLyingDown(boolean flag)
                      {
                      this.beLying = flag;
                      this.sync();
                      }
                      }
                      

                      Comme ça cela fonctionne, il affiche deux fois true dans la console.</packettobelying,></packettobelying,>

                      1 réponse Dernière réponse Répondre Citer 0
                      • DeletedD Hors-ligne
                        Deleted
                        dernière édition par

                        Ok super prob résolu ! Merci encore de ton aide =D

                        1 réponse Dernière réponse Répondre Citer 0
                        • 1 / 1
                        • Premier message
                          Dernier message
                        Design by Woryk
                        ContactMentions Légales

                        MINECRAFT FORGE FRANCE © 2024

                        Powered by NodeBB