MFF

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

    Autre problème avec mon effet

    Planifier Épinglé Verrouillé Déplacé Résolu 1.9.x et 1.10.x
    1.9.4
    11 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.
    • DeletedD Hors-ligne
      Deleted
      dernière édition par

      Je ne suis pas sûr de tout avoir compris. En gros tu essaies d’appliquer ton effet custom au joueur quand il se lève le matin, après avoir dormi toute la nuit, c’est bien ça ?? Et le problème rencontré est qu’il l’obtient quand même lorsqu’il se lève à n’importe quel moment du lit, même si il n’a pas passé toute la nuit, oui ?
      Au passage vérifie ta convention Java, je vais essayer de faire quelque recherche 😉

      EDIT = Alors tu as deux moyens de t’y prendre.
      1)Override la méthode WorldServer#wakeAllPlayers à l’aide d’un Class Transformer, assez difficile, mais je peux bien t’expliquer si tu veux, de manière à rajouter ton effet à tous les joueurs, accessibles via un iterator de la liste World#playerEntities. Bref c’est suffisamment explicite.
      2)La deuxième reste de check dans l’event InputKeyEvent, ou quelque chose du genre, si la touche appuyé est échap, ou celle pour quitter un gui (je ne sais plus si un keybinding existe spécifiquement pour cette action ou non), et de check si le boolean EntityPlayer#isPlayerFullyAsleep renvoie true (Returns whether or not the player is asleep and the screen has fully faded.), si c’est le cas, encore une fois, tu lui appliques ton effet de popo.

      La première méthode a une portée directe sur tous les joueurs du serveur, mais reste + compliquée. Tandis que la deuxième se fait au niveau local puisqu’on est côté client, mais nécessitera sûrement l’envoie d’un packet pour ajouter ton nouvel effet de popo. A toi de voir laquelle choisir.

      PS = Pour check si il neige, tu regardes si le biome où se trouve le joueur (World#getBiomeGenForCoords()), hérite de BiomeGenSnow, et si World#isRaining()) .

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

        Oui, c’est exactement ça. Je n’y pense jamais à la convention, je vais coriger

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

          J’ai édité au cas où personne n’aurait vu 😉

          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

            world.isDaytime() ne fonctionne que côté serveur.
            Côté client il renvoie toujours false.

            Ce qui explique surement ton problème.

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

              Salut
              Au départ je pensais utilisé la deuxième méthode, mais maintenant j’hésite. J’avais essayé de détecté le pressage de échap. Quand j’appuie sur échap alors que je suis en jeu, ça détecte bien mais quand je fait échap en étant dans le lit, rien du tout. Mais le problème avec la 1ère, c’est que (d’après ce que j’ai compris) on applique l’effet à tout les joueurs connectés. Or, moi je voudrais que ça soit aléatoire (comme ce que ça fait pour l’instant), qu’il y ai seulement que quelques joueurs qui aient l’effet. Tu me conseillerais quoi ?

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

                De te servir de la classe Random.
                Bizarre pour ton problème de key input. Quels event utlises-tu ? Y’en pas des centaines je sais bien mais au cas où …
                Sinon je crois que lorsqu’on dort et qu’on quitte le lit, il s’agit également de quitter le gui spécialement ouvert, le GuiSleep, ou quelque chose dans le genre…Si mes dires sont vrais, tu peux alors remplacer le GuiSleep vanilla par le tien, à la manière du MainMenu, afin d’override la méthode keyTyped, et de gérer ton effet, etc…lors du pressage de la touche échap.

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

                  Salut
                  J’ai remplacé le GuiSleep par un gui qui y est extends, et Override deux fonctions : actionPerformed et keyTyped. J’ai ensuite créé un packet qui est censé être envoyé au serveur quand le joueur fais échap et appuie sur le bouton leave Bed. Le packet ajoute au joueur la potion avec un temps total de 0 tick. Comme vous pouvez le voir, j’ai dit que le packet est censé être envoyé. Hélas, il ne s’envoie pas, ça met plutôt des erreurs dans les logss

                  Déjà, voilà mes classes :
                  Le gui

                  package ThisisChristmas.Client;
                  
                  import java.io.IOException;
                  
                  import ThisisChristmas.ChristmasEffectMessage;
                  import net.minecraft.client.gui.GuiButton;
                  import net.minecraft.client.gui.GuiSleepMP;
                  import net.minecraft.client.network.NetHandlerPlayClient;
                  import net.minecraft.network.play.client.CPacketEntityAction;
                  import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
                  
                  public class GuiSleepMPExt extends GuiSleepMP{
                  
                  @Override
                  protected void actionPerformed(GuiButton button) throws IOException
                     {
                         if (button.id == 1)
                         {
                          ThisisChristmas.ThisisChristmas.network.sendToServer(new ChristmasEffectMessage("effect"));
                          System.out.println("send");
                          this.wakeFromSleep();
                         }
                         else
                         {
                             super.actionPerformed(button);
                         }
                     }
                  
                  @Override
                     protected void keyTyped(char typedChar, int keyCode) throws IOException
                     {
                         if (keyCode == 1)
                         {
                          ThisisChristmas.ThisisChristmas.network.sendToServer(new ChristmasEffectMessage("effect"));
                          System.out.println("send");
                          this.wakeFromSleep();
                         }
                         else if (keyCode != 28 && keyCode != 156)
                         {
                             super.keyTyped(typedChar, keyCode);
                         }
                         else
                         {
                             String s = this.inputField.getText().trim();
                  
                             if (!s.isEmpty())
                             {
                                 this.sendChatMessage(s); // Forge: fix vanilla not adding messages to the sent list while sleeping
                             }
                  
                             this.inputField.setText("");
                             this.mc.ingameGUI.getChatGUI().resetScroll();
                         }
                     }
                  
                     private void wakeFromSleep()
                     {
                         NetHandlerPlayClient nethandlerplayclient = this.mc.thePlayer.connection;
                         nethandlerplayclient.sendPacket(new CPacketEntityAction(this.mc.thePlayer, CPacketEntityAction.Action.STOP_SLEEPING));
                     }
                  }
                  
                  

                  Dans la classe principale :

                  //Avant le pré init
                  public static SimpleNetworkWrapper network = NetworkRegistry.INSTANCE.newSimpleChannel(MODID);
                  
                  // dans le init
                  network.registerMessage(ChristmasEffectMessageHandler.class, ChristmasEffectMessage.class, 0, Side.SERVER);
                  
                  

                  ChristmasEffectMessage

                  package ThisisChristmas;
                  
                  import io.netty.buffer.ByteBuf;
                  import net.minecraftforge.fml.common.network.ByteBufUtils;
                  import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
                  
                  public class ChristmasEffectMessage implements IMessage{
                  
                  protected String msg;
                  
                  public ChristmasEffectMessage()
                  {
                  
                  }
                  
                  public ChristmasEffectMessage(String message)
                  {
                  message = msg;
                  }
                  
                  @Override
                  public void fromBytes(ByteBuf buf)
                  {
                  msg = ByteBufUtils.readUTF8String(buf);
                  }
                  
                  @Override
                  public void toBytes(ByteBuf buf)
                  {
                  ByteBufUtils.writeUTF8String(buf, msg);
                  }
                  
                  }
                  
                  

                  ChristmasEffectMessageHander

                  package ThisisChristmas;
                  
                  import net.minecraft.entity.player.EntityPlayerMP;
                  import net.minecraft.network.Packet;
                  import net.minecraft.util.text.ITextComponent;
                  import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
                  import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
                  import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
                  
                  public class ChristmasEffectMessageHandler implements IMessageHandler<christmaseffectmessage, imessage="">{
                  
                  @Override
                  public IMessage onMessage(ChristmasEffectMessage message, MessageContext ctx)
                  {
                  if(message.msg.equals("effect"))
                  {
                  EntityPlayerMP playerName = ctx.getServerHandler().playerEntity;
                  ThisisChristmas.proxy.MagicOfChristmasEffect(playerName, 0);
                  }
                  return null;
                  }
                  
                  }
                  
                  

                  Et voilà l’erreurs : Partie 1

                  [17:22:02] [Client thread/ERROR] [FML]: FMLIndexedMessageCodec exception caught
                  io.netty.handler.codec.EncoderException: java.lang.NullPointerException
                  at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:107) ~[MessageToMessageEncoder.class:4.0.23.Final]
                  at io.netty.handler.codec.MessageToMessageCodec.write(MessageToMessageCodec.java:116) ~[MessageToMessageCodec.class:4.0.23.Final]
                  at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:658) ~[AbstractChannelHandlerContext.class:4.0.23.Final]
                  at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:716) ~[AbstractChannelHandlerContext.class:4.0.23.Final]
                  at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:706) ~[AbstractChannelHandlerContext.class:4.0.23.Final]
                  at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:741) ~[AbstractChannelHandlerContext.class:4.0.23.Final]
                  at io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:895) ~[DefaultChannelPipeline.class:4.0.23.Final]
                  at io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:240) ~[AbstractChannel.class:4.0.23.Final]
                  at net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper.sendToServer(SimpleNetworkWrapper.java:270) [SimpleNetworkWrapper.class:?]
                  at ThisisChristmas.Client.GuiSleepMPExt.actionPerformed(GuiSleepMPExt.java:19) [GuiSleepMPExt.class:?]
                  at net.minecraft.client.gui.GuiScreen.mouseClicked(GuiScreen.java:494) [GuiScreen.class:?]
                  at net.minecraft.client.gui.GuiChat.mouseClicked(GuiChat.java:181) [GuiChat.class:?]
                  at net.minecraft.client.gui.GuiScreen.handleMouseInput(GuiScreen.java:609) [GuiScreen.class:?]
                  at net.minecraft.client.gui.GuiChat.handleMouseInput(GuiChat.java:141) [GuiChat.class:?]
                  at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:575) [GuiScreen.class:?]
                  at net.minecraft.client.Minecraft.runTick(Minecraft.java:1796) [Minecraft.class:?]
                  at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1119) [Minecraft.class:?]
                  at net.minecraft.client.Minecraft.run(Minecraft.java:404) [Minecraft.class:?]
                  at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?]
                  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_92]
                  at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_92]
                  at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_92]
                  at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_92]
                  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_92]
                  at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_92]
                  at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_92]
                  at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_92]
                  at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
                  at GradleStart.main(GradleStart.java:26) [start/:?]
                  Caused by: java.lang.NullPointerException
                  at net.minecraftforge.fml.common.network.ByteBufUtils.writeUTF8String(ByteBufUtils.java:132) ~[ByteBufUtils.class:?]
                  at ThisisChristmas.ChristmasEffectMessage.toBytes(ChristmasEffectMessage.java:30) ~[ChristmasEffectMessage.class:?]
                  at net.minecraftforge.fml.common.network.simpleimpl.SimpleIndexedCodec.encodeInto(SimpleIndexedCodec.java:11) ~[SimpleIndexedCodec.class:?]
                  at net.minecraftforge.fml.common.network.simpleimpl.SimpleIndexedCodec.encodeInto(SimpleIndexedCodec.java:7) ~[SimpleIndexedCodec.class:?]
                  at net.minecraftforge.fml.common.network.FMLIndexedMessageToMessageCodec.encode(FMLIndexedMessageToMessageCodec.java:54) ~[FMLIndexedMessageToMessageCodec.class:?]
                  at io.netty.handler.codec.MessageToMessageCodec$1.encode(MessageToMessageCodec.java:67) ~[MessageToMessageCodec$1.class:4.0.23.Final]
                  at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:89) ~[MessageToMessageEncoder.class:4.0.23.Final]
                  … 30 more
                  

                  Partie 2```

                  nov. 30, 2016 5:22:02 PM io.netty.channel.embedded.EmbeddedChannel recordException
                  AVERTISSEMENT: More than one exception was raised. Will report only the first one and log others.
                  io.netty.handler.codec.EncoderException: java.lang.NullPointerException
                  at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:107)
                  at io.netty.handler.codec.MessageToMessageCodec.write(MessageToMessageCodec.java:116)
                  at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:658)
                  at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:716)
                  at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:706)
                  at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:741)
                  at io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:895)
                  at io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:240)
                  at net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper.sendToServer(SimpleNetworkWrapper.java:270)
                  at ThisisChristmas.Client.GuiSleepMPExt.actionPerformed(GuiSleepMPExt.java:19)
                  at net.minecraft.client.gui.GuiScreen.mouseClicked(GuiScreen.java:494)
                  at net.minecraft.client.gui.GuiChat.mouseClicked(GuiChat.java:181)
                  at net.minecraft.client.gui.GuiScreen.handleMouseInput(GuiScreen.java:609)
                  at net.minecraft.client.gui.GuiChat.handleMouseInput(GuiChat.java:141)
                  at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:575)
                  at net.minecraft.client.Minecraft.runTick(Minecraft.java:1796)
                  at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1119)
                  at net.minecraft.client.Minecraft.run(Minecraft.java:404)
                  at net.minecraft.client.main.Main.main(Main.java:118)
                  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:135)
                  at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
                  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.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97)
                  at GradleStart.main(GradleStart.java:26)
                  Caused by: java.lang.NullPointerException
                  at net.minecraftforge.fml.common.network.ByteBufUtils.writeUTF8String(ByteBufUtils.java:132)
                  at ThisisChristmas.ChristmasEffectMessage.toBytes(ChristmasEffectMessage.java:30)
                  at net.minecraftforge.fml.common.network.simpleimpl.SimpleIndexedCodec.encodeInto(SimpleIndexedCodec.java:11)
                  at net.minecraftforge.fml.common.network.simpleimpl.SimpleIndexedCodec.encodeInto(SimpleIndexedCodec.java:7)
                  at net.minecraftforge.fml.common.network.FMLIndexedMessageToMessageCodec.encode(FMLIndexedMessageToMessageCodec.java:54)
                  at io.netty.handler.codec.MessageToMessageCodec$1.encode(MessageToMessageCodec.java:67)
                  at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:89)
                  … 30 more

                  [17:22:02] [Client thread/INFO] [STDOUT]: [ThisisChristmas.Client.GuiSleepMPExt:actionPerformed:20]: send

                  J'ai découpé l'erreur en deux parties. Elle s'affichent en même temps, mais la première partie s'affiche normalement (en blanc) mais la deuxième partie s'affiche en rouge (ça me l'a encore jamais fait, c'est que ça doit être très grave comme erreur :[ )
                  L'erreur me referre à l'envoie du packet au serveur (donc à ThisisChristmas.ThisisChristmas.network.sendToServer(new ChristmasEffectMessage("effect"));)
                  
                  Pourquoi ça me fait cet erreur ? Est-ce que la méthode que j'ai fait est bonne ? (Autrement dit, est-ce que ça marchera une fois l'erreur résolu ?)
                  
                  PS : j'ai aussi découvert un nouveau problème : quand je suis dans le lit et que je le quitte manuellement (échap ou bouton), ça me lève bien mais il fait toujours nuit, le temps ne change pas. Et là, je comprend pas pourquoi</christmaseffectmessage,>
                  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

                    Visiblement tu as essayé d’envoyer un string qui est null.

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

                      J’ai trouvé d’où ça vient. Après t’avoir lu, je comprenait pas d’où ça pouvait venir. J’ai regardé et c’est dans ma classe extends IMessage que ça coinçait. En fait, j’ai une fonction avec en paramètre un String, et j’avais créer une variable de type String. Je disais que le paramètre String de la fonction prenait le contenu de la variable String. C’était l’inverse qu’il fallait faire. Ca ne crash plus, mais ça me remet la potion quand je me lève. L’envoie de packet doit se faire avant l’appel de l’event PlayerWakeUpEvent. Du coup, comment faire ?

                      ÉDIT : j’ai peut-être trouver une solution. Je pourrais essayer de créer une variable de type boolean (qui vaut false au départ), et à l’envoie du packet je le passe à true. Dans l’event PlayerWakeUp, je vérifie l’était de la variable : si elle est à true, je ne fais rien et si elle est à false, je fais l’action (ajout de la magie de Noël). Vous pensé que c’est une bonne idée ?

                      Re-EDIT :Salut. En fait ça ne marchera pas, il suffit qu’un mec fasse échap et mersonne n’aura l’effet. Mais j’ai pensé à créer une variable de type liste UUID et dans la packet, j’envoie l’uuid du joueur qui l’envoie. Quand je le reçois, je l’ajoute à la liste. Et dans le PlayerWakeUpEvent, je n’aurai qu’à vérifier si le joueur qui se lève a un uuid qui correspond à un de ceux que il y a dans la liste. Si il y est, ça ne fait rien. Si il n’y est pas, ça fait l’action (effet). Après; dans le SleepInBedEvent, si celui qui se couche se trouve dans la liste, ça le supprime. Ensuite; je vide la liste. C’est une bonne idée ?

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

                        Salut
                        Je sais pas si vous avez vu mon édit, mais j’ai fait ce que j’ai dit et ça marche.
                        En gros, j’ai créé une liste de type String. Avec mon packet, j’envoie le string de l’uuid du joueur et quand je le reçois, (je fais déjà un null check) je l’ajoute à la liste. Dans mon PlayerWakeUpEvent, je fais une condition qui vérifie si le string de l’uuid du joueur n’est pas dans la liste, S’il y est, ça nbe fait rien. Et j’ai utilisé un autre event : PlayerSleepBedEvent, où je supprime le string de l’uuid du joueur de la liste.
                        Voilà les codes :

                        public List <string>uuids = new ArrayList(); // la liste de type String
                        
                        // Dans le MessageHandler du packet
                        if(message.msg != null)
                        {
                        ThisisChristmas.instance.uuids.add(message.msg);
                        }
                        
                        // Mon event PlayerWakeUp
                        if(!(ThisisChristmas.instance.uuids.contains(event.getEntityPlayer().getUniqueID().toString())))
                        {
                        ThisisChristmas.proxy.MagicOfChristmasEffect(event.getEntityPlayer(), 12536);
                        timer = 0;
                        }
                        
                        // et mon event PlayerSleepInBed
                        String uuid = event.getEntityPlayer().getUniqueID().toString();
                        if(ThisisChristmas.instance.uuids.contains(uuid))
                        {
                        ThisisChristmas.instance.uuids.remove(uuid);
                        }
                        
                        

                        Voilà, je pense que ce sujet est résolu. Merci à tous :)</string>

                        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