MFF

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

    Problème avec les "Capabilities"

    Planifier Épinglé Verrouillé Déplacé Résolu 1.12.x
    1.12.2
    12 Messages 3 Publieurs 604 Vues 2 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.
    • robin4002R Hors-ligne
      robin4002 Moddeurs confirmés Rédacteurs Administrateurs
      dernière édition par

      Salut,

      As-tu vérifiés que les fonctions deserializeNBT et serializeNBT sont bien appelé ?

      Vort3x_V 1 réponse Dernière réponse Répondre Citer 0
      • Vort3x_V Hors-ligne
        Vort3x_ @robin4002
        dernière édition par

        @robin4002 Bonjour, merci de cette réponse rapide.

        Alors oui j’ai vérifier qu’elles étaient appelée (avec un System.out.println), et elle le sont bien.

        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

          Et les valeurs sont cohérentes ?

          Vort3x_V 1 réponse Dernière réponse Répondre Citer 0
          • Vort3x_V Hors-ligne
            Vort3x_ @robin4002
            dernière édition par

            @robin4002

            Dans la console, le println donne la bonne valeur pour “serializeNBT”
            serializeNBT.png

            Et dans le “deserializeNBT” le println envoie aussi la bonne valeur.
            deserializeNBT.png

            J’ai également été voir la valeur dans le ForgeCaps via
            “NBTExplorer” elle aussi est à 200.
            Capture d’écran 2021-01-03 162749.png

            C’est ce qui est étrange peut-être un problème de sync Client/Server.

            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 donc c’est un problème de synchro entre le client et le serveur.

              La valeur est sauvegarder uniquement sur le serveur, pour l’afficher sur le gui il faut un paquet afin de synchroniser la valeur vers le client.

              Vort3x_V 1 réponse Dernière réponse Répondre Citer 0
              • Vort3x_V Hors-ligne
                Vort3x_ @robin4002
                dernière édition par

                @robin4002 Bonsoir,

                Un paquet de ce style ?

                public class PacketPlayerData implements IMessage
                {
                	private EntityPlayer player;
                	private int water;
                	 
                	public PacketPlayerData() {}
                	
                	public PacketPlayerData(EntityPlayer p) {
                		this.player = p;
                		PlayerData data = player.getCapability(ExampleMod.data, null);
                		this.water = data.water;
                	}
                	
                    @Override
                    public void fromBytes(ByteBuf buf)
                    {
                    	buf.writeInt(this.water);
                    }
                 
                    @Override
                    public void toBytes(ByteBuf buf)
                    {
                    	water = buf.readInt();
                    }
                    
                    public static class Handler implements IMessageHandler <PacketPlayerData, IMessage>{
                        @Override
                        public IMessage onMessage(PacketPlayerData message, MessageContext ctx)
                        {
                        	PlayerData data = message.player.getCapability(ExampleMod.data, null);
                        	data.water = message.water;
                            return message;
                        }
                    }
                }
                

                ensuite j’ai créé une fonction sync:

                public void sync()
                {
                	PacketPlayerData packet = new PacketPlayerData(this.p);
                	if(!this.p.world.isRemote)
                	{
                	        EntityPlayerMP playerMP = (EntityPlayerMP)p;
                	        ExampleMod.net.sendTo(packet, playerMP);
                	 }
                	 else { ExampleMod.net.sendToServer(packet); }
                }
                

                J’appelle cette fonction dans la fonction setWater(int i)

                public void setWater(int i)
                {
                	this.water = i;
                	sync();
                }
                

                PS: J’utilisais le même genre de paquets avec les **IExtendedEntityProperties ** en 1.7.10.

                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 c’est ça, mais il faudrait également envoyer ce paquet lors de la premier connexion du joueur afin qu’il récupère la valeur.

                  Vort3x_V 1 réponse Dernière réponse Répondre Citer 0
                  • Vort3x_V Hors-ligne
                    Vort3x_ @robin4002
                    dernière édition par

                    @robin4002 Salut désolé pour cette réponse tardive,
                    je vais essayer tout ça, je tiens informé.

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

                      Bonjour, il y a un problème dans ton packet, tu as pas besoin de passer le joueur en paramètre, tu peux directement passer par Minecraft.getMinecraft().player dans ce cas, parce que le packet est reçu coté client

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

                        Bonbjour/Bonsoir,

                        J’ai donc créé un paquet (ci-dessous).

                        public class PacketPlayerData implements IMessage
                        {
                        	private int water;
                        	 
                        	public PacketPlayerData() {}
                        	
                        	public PacketPlayerData(PlayerData data) {
                        		this.water = data.water;
                        	}
                        	
                            @Override
                            public void fromBytes(ByteBuf buf)
                            {
                            	this.water = buf.readInt();
                            }
                         
                            @Override
                            public void toBytes(ByteBuf buf)
                            {
                            	buf.writeInt(this.water);
                            }
                            
                            public static class Handler implements IMessageHandler <PacketPlayerData, IMessage> {
                            	
                                @Override
                                public IMessage onMessage(PacketPlayerData message, MessageContext ctx)
                                {
                                	PlayerData data = Minecraft.getMinecraft().player.getCapability(ModEngine.data, null);
                        //Il semblerait que data soit null
                                	data.water = message.water;
                                    return null;
                                }
                            }
                        }
                        

                        Ensuite j’ai ma fonction “sync” qui envoie le paquet

                        public void sync()
                        {
                        	PacketPlayerData packet = new PacketPlayerData(this);
                               if(!this.player.world.isRemote) { ModEngine.mc_network.sendTo(packet, 
                                (EntityPlayerMP)this.player); }
                        }
                        

                        Sauf que quand cette fonction est appelée (connexion au monde) il me fait cette erreur:

                        java.util.concurrent.ExecutionException: java.lang.NullPointerException
                        	at java.util.concurrent.FutureTask.report(Unknown Source) ~[?:1.8.0_271]
                        	at java.util.concurrent.FutureTask.get(Unknown Source) ~[?:1.8.0_271]
                        	at net.minecraft.util.Util.runTask(Util.java:51) [Util.class:?]
                        	at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1088) [Minecraft.class:?]
                        	at net.minecraft.client.Minecraft.run(Minecraft.java:398) [Minecraft.class:?]
                        	at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?]
                        	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_271]
                        	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_271]
                        	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_271]
                        	at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_271]
                        	at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
                        	at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
                        	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_271]
                        	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_271]
                        	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_271]
                        	at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_271]
                        	at net.minecraftforge.legacydev.Main.start(Main.java:86) [legacydev-0.2.3.1-fatjar.jar:0.2.3.1+4+372be23]
                        	at net.minecraftforge.legacydev.MainClient.main(MainClient.java:29) [legacydev-0.2.3.1-fatjar.jar:0.2.3.1+4+372be23]
                        Caused by: java.lang.NullPointerException
                        	at net.minecraft.client.network.NetHandlerPlayClient.handleWindowItems(NetHandlerPlayClient.java:1187) ~[NetHandlerPlayClient.class:?]
                        	at net.minecraft.network.play.server.SPacketWindowItems.processPacket(SPacketWindowItems.java:59) ~[SPacketWindowItems.class:?]
                        	at net.minecraft.network.play.server.SPacketWindowItems.processPacket(SPacketWindowItems.java:13) ~[SPacketWindowItems.class:?]
                        	at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:15) ~[PacketThreadUtil$1.class:?]
                        	at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:1.8.0_271]
                        	at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:1.8.0_271]
                        	at net.minecraft.util.Util.runTask(Util.java:50) ~[Util.class:?]
                        	... 15 more
                        [16:36:14] [Client thread/FATAL] [minecraft/Minecraft]: Error executing task
                        
                        1 réponse Dernière réponse Répondre Citer 0
                        • Vort3x_V Hors-ligne
                          Vort3x_
                          dernière édition par

                          Bon j’ai finalement réglé le problème de “capabilities”, je passe donc ce poste en résolu.
                          Encore merci pour vos réponses.

                          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