MFF

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

    Encore quelques problèmes. Attaque de mobs, impossible de se lever et autres ..

    Planifier Épinglé Verrouillé Déplacé Résolu 1.9.x et 1.10.x
    1.9.4
    19 Messages 2 Publieurs 2.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.
    • robin4002R Hors-ligne
      robin4002 Moddeurs confirmés Rédacteurs Administrateurs
      dernière édition par

      Salut,

      1. Tu cherches à faire quoi avec ton target.attackEntityFrom(null, 0); ?
        Car là ce que tu fais c’est attaquer 0 de dégât depuis une source null, or la source n’a pas le droit d’être null (d’où le npe).
        Si tu veux annuler les dégâts, il faut faire un event.setCancel(true);

      2. La seule chose que tu fais c’est mettre à null ta variable local.
        Forcement ça ne fonctionne pas …
        Il faut faire comme ça :
        ((EntityLiving)event.getEntityLiving()).setAttackTarget(null);

      3. je ne crois pas qu’on peut.
        Pour les blocs et item, il y a MissingMappingEvent. Mais rien pour les entités

      4. player.getServer() n’existe que côté serveur, tu as surement un problème de side.
        Utilises plutôt player.worldObj.
        Si tu as vraiment besoin du world 0, ajoutes un if(!player.worldObj.isRemote) avant.

      5. à nouveau surement un problème de side, ajoutes dans le if && !worldEvent.player.worldObj.isRemote

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

        Ok merci, ça marche mieux (du moins pour les 2 premiers).J’ai toujours des problèmes pour les 2 derniers. Quand j’obtient l’effet, je peux à nouveau me lever, mais il ne neige toujours pas. J’ai essayer tes 2 méthodes, mais rien, il ne neige toujours pas. Pourtant, dans la condition, j’ai mis un message et ça s’affiche bien.

        Pour le message de Noël, au départ j’avais pensé comme toi, que c’était un problème de side. Du coup, j’ai essayé de le mettre dans le clientProxy mais ça faisait rien de plus. Mais j’ai pas pensé à le faire comme t’as proposé : uniquement serveur. En tout cas, ça l’affiche toujours 2 fois. Ce qui est bizarre, c’est que en 1.7 et 1.8, j’utilisais le même code et ça ne l’affichait qu’une seule fois.

        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

          1. étrange.

          2. ahhh je sais pourquoi.
            En fait rien à voir avec le side (cet event est en serveur only).
            Dans ta classe principale, retires la ligne FMLCommonHandle.instance().bus().register(new TaClassD’event());
            Depuis la 1.8 la méthode de forge sert pour tous les event, celle de fml est déprécié (elle disparaît en 1.9) et fait temporairement la même chose que celle de forge.
            Donc actuellement tout tes event se font en double …

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

            Ok merci. Ca marche bien maintenant. Mais t’es sûr qu’elle va disparaître ? Parce que pour mon mod d’halloween (qui est en 1.10), elle existe toujours.

            Je vais faire des recherches pour mon problème 4 et je reviens quand j’aurais trouvé

            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

              Ils ne l’ont pas retiré en 1.9 ? C’était pourtant prévu. Ils ont sûrement oublié.

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

                Salut
                Pour la 4, c’est bien le WorldServer qui fait que je ne me peut pas me lever. J’ai décomposé : ```java
                EntityPlayer worldserver = event.getEntityPlayer();//.getServer().worldServers[0];
                MinecraftServer mcserver = worldserver.getServer();
                WorldServer worldserv = mcserver.worldServers[0];
                //World worldserver = player.worldObj;
                WorldInfo worldinfo = worldserv.getWorldInfo();

                J'ai donc essayer de faire ça :```java
                EntityPlayer worldserver = event.getEntityPlayer();//.getServer().worldServers[0];
                MinecraftServer mcserver = worldserver.getServer();
                WorldServer worldserv = mcserver.worldServerForDimension(worldserver.dimension);
                //World worldserver = player.worldObj;
                WorldInfo worldinfo = worldserv.getWorldInfo();
                ```(en récupérant la dimension du joueur) mais c'est pareil, même erreur au même endroit.
                
                Du coup, je sais pas comment faire. J'aimerais vraiment que la neige s'active. Après, peut-être qu'il y a une autre méthode de faire ça : il faudrait que ça neige tant que l'effet est actif (comme l'effet dure 12536 ticks, la neige devra aussi durer 12536 ticks).
                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

                  Pour la deuxième fois, player.getServer() n’existe que côté serveur.
                  Côté client ça renvoies null.

                  Donc tant que tu utilisera cette fonction tu aura un NPE.

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

                    Ah oui c’est vrai, j’ai complètement oublié. Désolé
                    Du coup, j’ai mis la condition si le monde n’est pas remote, y’a pas d’erreur mais il ne neige toujours pas. Du coup, il faudrait passer par autre chose pour mettre la neige en même temps que l’effet. Mais je sais pas quoi

                    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

                      event.getEntityPlayer().worldObj.getWorldInfo(); ça ne va pas ?

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

                        Bah en fait c’est bizarre. J’ai mis ton code, et quand je me couche et que je me lève en appuyant sur le bouton, il neige. Mais quand j’attend que le jour arrive, il ne neige pas. Ce qu’il y a de plus bizarre, c’est les logs. J’ai mis ça : ```java
                        WorldInfo worldinfo = event.getEntityPlayer().worldObj.getWorldInfo();
                        System.out.println(worldinfo);
                        worldinfo.setRainTime(12536);
                        worldinfo.setThunderTime(0);
                        worldinfo.setRaining(true);
                        worldinfo.setThundering(false);
                        System.out.println(worldinfo.isRaining());
                        System.out.println(worldinfo.getRainTime());

                        Et les logs me donnent ça : ```
                        [15:53:02] [Server thread/INFO] [STDOUT]: [This_is_Christmas.CommonEventHandler:MagicOfChristmasEffectActivator:88]: net.minecraft.world.storage.WorldInfo@5883e379
                        true
                        12536
                        [15:53:02] [Client thread/INFO]: [CHAT] msg.christmas.effect
                        [15:53:02] [Client thread/INFO] [STDOUT]: [This_is_Christmas.CommonEventHandler:MagicOfChristmasEffectActivator:88]: net.minecraft.world.storage.WorldInfo@1ad39c66
                        true
                        12536
                        [15:53:02] [Client thread/INFO]: [CHAT] msg.christmas.effect
                        ```Pourtant, y'a tout pour qu'il neige et même les logs le disent. Je ne pense pas, mais est-ce que ça serait parce que le code s'exécute deux fois ?
                        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

                          Je sais où est le problème.
                          Quand on dort et qu’il neige ou pleut, la pluie / la neige s’arrête.
                          Le code qui gère ça s’exécute donc après ton code, ce qui désactive ta neige.

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

                            Ah ouais, c’est vrai …
                            Mais du coup, y’aurait pas un moyen d’annuler ça ?

                            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

                              Aucune idée.

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

                                J’ai trouvé où ça remet à zéro le temps. Dans la classe WorldServer, dans la fonction wakeAllPlayers, ça appelle une fonction de la même classe qui, à son tour appelle cette fonction dans la classe WorldProvider :

                                public void resetRainAndThunder()
                                {
                                worldObj.worldInfo.setRainTime(0);
                                worldObj.worldInfo.setRaining(false);
                                worldObj.worldInfo.setThunderTime(0);
                                worldObj.worldInfo.setThundering(false);
                                }
                                ``` Du coup, je me demande si ça serait possible d'annuler l'appelle de cette fonction, ou alors de modifier les valeurs. J'avais essayé de cancel l'event PlayerWakeUp pour ensuite mettre le jour manuellement, mais on peut pas le cancel.
                                Une idée ?
                                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

                                  Sans modification du byte code (via un coremod) tu ne pourra pas changer la fonction (ni ses valeurs ni le fait qu’elle soit appelé)

                                  Une solution que je vois (mais pas super propre) est de changer la valeur d’une variable int qui serait dans la classe de tes évent, et ensuite via l’évent WorldTickEvent décrémenter cette variable et activer la neige lorsqu’elle arrive à 0.

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

                                    Salut
                                    Pourquoi dit tu que ce n’est pas très propre ?
                                    Sinon voilà ce que j’ai fait :

                                    int timer = 5;
                                    […]
                                    @SubscribeEvent
                                    public void SnowTimer(WorldTickEvent event)
                                    {
                                    if(timer == 4)
                                    {
                                    WorldInfo worldinfo = event.world.getWorldInfo();
                                    worldinfo.setRainTime(12532);
                                    worldinfo.setThunderTime(0);
                                    worldinfo.setRaining(true);
                                    worldinfo.setThundering(false);
                                    }
                                    if(timer <= 4)
                                    {
                                    timer++;
                                    }
                                    }
                                    

                                    Et dans l’obtention de mon effet (en gros, quand le jouer se lève) :```java
                                    timer = 0;

                                    Ca marche bien. Mais j'ai un autre problème (que j'avais déjà avant). Je sais pas si on pourra y faire grand chose mais quand j'obtient l'effet, je fais afficher un message par ```java
                                    public void MagicOfChristmasEffect(EntityPlayer player)
                                    {
                                    ChristmasPotion potion = ChristmasPotion.MagicOfChristmasEffect;
                                    PotionEffect potioneffect = new PotionEffect(potion, 12536, 0, false, true);
                                    TextComponentTranslation textcomponenttranslation = new TextComponentTranslation("msg.christmas.effect");
                                    textcomponenttranslation.getStyle().setColor(TextFormatting.RED);
                                    
                                    player.addPotionEffect(potioneffect);
                                    player.addChatMessage(textcomponenttranslation);
                                    }
                                    ```Et le problème, c'est que le message s'affiche deux fois. Mais cette fonction n'est appelée qu'une seule fois, quand le joueur se lève. Une idée pour régler ?
                                    
                                    Merci d'avance
                                    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

                                      Tu as essayé avec if(!player.worldObj.isRemote()) ?

                                      Je dis que ce n’est pas très propre car la solution nécessite une fonction qui est exécuté à chaque tick pour faire quelque chose seulement a un moment donné et non à chaque fois.

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

                                        Salut
                                        Mais avec ce que j’ai fait, ce n’est exécuté qu’à un moment donné, tant que ma variable n’atteint pas 5. Je comprend, mais c’est (sans doute) la seule solution (en tout cas pour l’instant).
                                        Sinon, pour la condition ça marche. Je le savais qu’il faut mettre cette condition mais à chaque fois, j’y pense jamais. 😕
                                        Je vais essayé d’y penser les autres fois, mais c’est pas gagné. Je sais pas pourquoi, j’arrive à faire/penser des trucs compliqué de tête (par exemple, hier un ami m’a demandé 91*500) mais des trucs aussi simple que ça, j’y arrive pas. Mais bon, je vais arrêté le HS, c’est de la psychologie, plus du codage

                                        En tout cas, merci à toi 😄 Tout marche bien

                                        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