• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

    Résolu Effectuer une suite d'actions lors du placement d'une TNT ?

    1.9.x et 1.10.x
    1.9.4
    2
    28
    4763
    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.
    • Laiteux
      Laiteux dernière édition par

      Bonjour, avant toute chose, je tiens à préciser que je débutes en développement de mods, je m’y connaît en Java, pour cela pas de soucis, mais, à la base, je développe des plugins (Spigot) .

      Alors voila, débutant en modding et n’ayant pas trouvé ce que je cherchais sur le net, je pose donc ma question ici, en espérant obtenir une réponse complète et correcte, merci d’avance pour cela.

      Je souhaiterais donc, lors du placement d’une TNT, si le joueur dispose d’un briquet dans son inventaire, lui mettre en main et allumer la TNT avec automatiquement dans un délai presque instantané.

      Je ne sais pas si cela est compliqué à faire, n’ayant pas trouvé d’event pour le placement d’un block (BlockPlaceEvent sous Spigot  :D) .

      Je vous remercie d’avance pour les réponses qui seront apportées à ce topic, et vous souhaite tous par la même occasion une excellente journée.

      Cordialement, Matt.

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

        Salut,
        Tu peux utiliser l’event net.minecraftforge.event.world.BlockEvent.PlaceEvent

        1 réponse Dernière réponse Répondre Citer 0
        • Laiteux
          Laiteux dernière édition par

          @‘robin4002’:

          Salut,
          Tu peux utiliser l’event net.minecraftforge.event.world.BlockEvent.PlaceEvent

          Merci à toi (je me permets de te tutoyer puisque tu le fais de même ;)) pour ta réponse rapide, mais, ensuite, comment effectuer les actions voulues (voir mon premier post) s’il-te-plaît ?
          Encore désolé si cela vous dérange, je ne m’y connaît juste pas bien en modding Minecraft, étant débutant comme expliqué dans mon premier poste (encore lui, décidément :D) .
          Merci d’avance, cordialement.

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

            Pour enregistrer un event tu peux suivre ce tutoriel : https://www.minecraftforgefrance.fr/showthread.php?tid=716
            Il est toujours valable en 1.9.

            Voila à quoi pourrait ressemble un code faisant ce que tu souhaites :

            @SubscribeEvent
            public void onBlockPlace(BlockEvent.PlaceEvent event)
            {
            if(event.getPlacedBlock() == Blocks.TNT && event.getPlayer().inventory.hasItemStack(new ItemStack(Items.FLINT_AND_STEEL)))
            {
            event.getPlayer().inventory.deleteStack(new ItemStack(Items.FLINT_AND_STEEL)); // retire le briquet
            event.getPlayer().setHeldItem(event.getPlayer().getActiveHand(), new ItemStack(Items.FLINT_AND_STEEL)); // met le briquet en main
            event.getPlacedBlock().getBlock().onBlockActivated(event.getWorld(), event.getPos(), event.getPlacedBlock(), event.getPlayer(), event.getPlayer().getActiveHand(), event.getPlayer().getHeldItem(event.getPlayer().getActiveHand()), EnumFacing.UP, 0, 0, 0); // appel la fonction du clic droit sur la tnt.
            }
            }
            

            Il reste imparfait par contre, si le joueur à plusieurs tnt en main ils vont être remplacé par le briquet.
            Il faudrait les placer ailleurs dans l’inventaire avant de faire event.getPlayer().setHeldItem …

            1 réponse Dernière réponse Répondre Citer 0
            • Laiteux
              Laiteux dernière édition par

              @‘robin4002’:

              Pour enregistrer un event tu peux suivre ce tutoriel : https://www.minecraftforgefrance.fr/showthread.php?tid=716
              Il est toujours valable en 1.9.

              Voila à quoi pourrait ressemble un code faisant ce que tu souhaites :

                 @SubscribeEvent
                 public void onBlockPlace(BlockEvent.PlaceEvent event)
                 {
                     if(event.getPlacedBlock() == Blocks.TNT && event.getPlayer().inventory.hasItemStack(new ItemStack(Items.FLINT_AND_STEEL)))
                     {
                         event.getPlayer().inventory.deleteStack(new ItemStack(Items.FLINT_AND_STEEL)); // retire le briquet
                         event.getPlayer().setHeldItem(event.getPlayer().getActiveHand(), new ItemStack(Items.FLINT_AND_STEEL)); // met le briquet en main
                         event.getPlacedBlock().getBlock().onBlockActivated(event.getWorld(), event.getPos(), event.getPlacedBlock(), event.getPlayer(), event.getPlayer().getActiveHand(), event.getPlayer().getHeldItem(event.getPlayer().getActiveHand()), EnumFacing.UP, 0, 0, 0); // appel la fonction du clic droit sur la tnt.
                     }
                 }
              

              Il reste imparfait par contre, si le joueur à plusieurs tnt en main ils vont être remplacé par le briquet.
              Il faudrait les placer ailleurs dans l’inventaire avant de faire  event.getPlayer().setHeldItem …

              Merci beaucoup de ta grande aide, je ne veux pas lui mettre en main comme je crois que tu l’as compris, je t’explique :
              Si il a un briquet dans l’inventaire, alors sa case active de l’inventaire switch sur la case du briquet.
              Voila, encore merci, je vais essayer de me débrouiller avec 🙂
              PS: Cela doit fonctionner en multijoueur en survie, donc il ne me semble pas que retirer le briquet de l’inventaire soit possible.

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

                Ah d’accord.
                Tu cherches à faire un mod client side only ?

                1 réponse Dernière réponse Répondre Citer 0
                • Laiteux
                  Laiteux dernière édition par

                  @‘robin4002’:

                  Ah d’accord.
                  Tu cherches à faire un mod client side only ?

                  Alors, je ne sais pas ce qu’est un mod client side only, j’ai cherché sur Google, mais les résultats étant tous Anglais, je n’ai pas correctement tout compris, peux-tu me l’expliquer correctement, s’il-te-plaît ?

                  Merci d’avance, cordialement, Matt.

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

                    Optifine, inventory tweak, les mods de minimap, etc … sont des mods client side only.
                    Il ne s’installe que sur le client mais agissent aussi quand on joue sur un serveur.

                    1 réponse Dernière réponse Répondre Citer 0
                    • Laiteux
                      Laiteux dernière édition par

                      @‘robin4002’:

                      Optifine, inventory tweak, les mods de minimap, etc … sont des mods client side only.
                      Il ne s’installe que sur le client mais agissent aussi quand on joue sur un serveur.

                      D’accord, merci, c’est bien plus clair maintenant, oui, c’est donc ce que je cherche à faire.___@‘robin4002’:

                      Optifine, inventory tweak, les mods de minimap, etc … sont des mods client side only.
                      Il ne s’installe que sur le client mais agissent aussi quand on joue sur un serveur.

                      Est-ce donc possible ?
                      Et qu’est-ce qui change donc ?

                      J’ai suivi les différents tutoriaux depuis le lien que tu m’as donné et j’avoue avoir bien appris en peu de,temps, et je t’en remercie donc, je continuerais à les lire demain (00:30 en Nouvelle-Calédonie :D) .

                      J’aurais aimé essayer le code que tu m’as donné précédemment mais je suis sous tablette 😕

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

                        Du-coup ça va faire une difficulté supplémentaire comme il faut éviter de faire des trucs côté serveur (sinon ça ne fonctionnera pas si le mod n’est pas installé sur le serveur).

                        L’event semble être appelé côté client donc pas de souci à ce niveau.
                        Pour le changer l’emplacement du curseur ça doit être possible sans souci, il faudra juste parcourir les 9 cases de l’inventaire pour trouver le briquet (event.getPlayer().inventory.hasItemStack(new ItemStack(Items.FLINT_AND_STEEL)) ne convient pas car il cherche dans tout l’inventaire).

                        1 réponse Dernière réponse Répondre Citer 0
                        • Laiteux
                          Laiteux dernière édition par

                          @‘robin4002’:

                          Du-coup ça va faire une difficulté supplémentaire comme il faut éviter de faire des trucs côté serveur (sinon ça ne fonctionnera pas si le mod n’est pas installé sur le serveur).

                          L’event semble être appelé côté client donc pas de souci à ce niveau.
                          Pour le changer l’emplacement du curseur ça doit être possible sans souci, il faudra juste parcourir les 9 cases de l’inventaire pour trouver le briquet (event.getPlayer().inventory.hasItemStack(new ItemStack(Items.FLINT_AND_STEEL)) ne convient pas car il cherche dans tout l’inventaire).

                          D’accord, merci, mais alors comment faire pour parcourir les 9 cases de l’inventaire ?

                          PS: N’ayant pas bien compris ta première phrase, il n’est pas nécessaire que le mod soit installé sur le serveur.
                          Le mod doit être utilisable quand voulu, où voulu, si le joueur dispose de ce dernier, bien sûr.

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

                            Oui justement, c’est pour ça que je dis que ça fait une difficulté supplémentaire.

                            Pour parcourir les 9 cases de l’inventaire il n’y a pas 50 solutions : boucle for + player.inventory.getItemInSlot(i)

                            1 réponse Dernière réponse Répondre Citer 0
                            • Laiteux
                              Laiteux dernière édition par

                              @‘robin4002’:

                              Oui justement, c’est pour ça que je dis que ça fait une difficulté supplémentaire.

                              Pour parcourir les 9 cases de l’inventaire il n’y a pas 50 solutions : boucle for + player.inventory.getItemInSlot(i)

                              C’est aussi ce à quoi j’avais pensé  ^^

                              Est-il possible que tu m’écrive un code faisant celon dont on parle depuis le départ du topic, s’il-te-plaît ?
                              Chaud sur tablette  😕

                              Merci d’avance, cordialement.

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

                                Bha tu le fera quand tu sera sur ton pc x)
                                Je suis là pour guider / aider, pas pour faire le travail à la place des autres …

                                1 réponse Dernière réponse Répondre Citer 1
                                • Laiteux
                                  Laiteux dernière édition par

                                  @‘robin4002’:

                                  Bha tu le fera quand tu sera sur ton pc x)
                                  Je suis là pour guider / aider, pas pour faire le travail à la place des autres …

                                  Haha je sais bien ^^

                                  J’essayerai sur mon PC, bonne journée, et encore merci 🙂

                                  Cordialement, Matt.

                                  1 réponse Dernière réponse Répondre Citer 0
                                  • Laiteux
                                    Laiteux dernière édition par

                                    @‘robin4002’:

                                    Bha tu le fera quand tu sera sur ton pc x)
                                    Je suis là pour guider / aider, pas pour faire le travail à la place des autres …

                                    Salut, j’ai enregistré mes événements pour le onBlockPlace, voici mon code :

                                    Main.java :

                                    package fr.laiteux.rushplus.common;
                                    
                                    import fr.laiteux.rushplus.common.events.EventsManager;
                                    import net.minecraftforge.common.MinecraftForge;
                                    import net.minecraftforge.fml.common.Mod;
                                    import net.minecraftforge.fml.common.Mod.EventHandler;
                                    import net.minecraftforge.fml.common.Mod.Instance;
                                    import net.minecraftforge.fml.common.event.FMLInitializationEvent;
                                    import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
                                    import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
                                    
                                    @Mod(modid = "rushplus", name = "RushPlus", version = "1.0.0")
                                    
                                    public class Main{
                                    
                                    @Instance("rushplus")
                                    public static Main instance;
                                    
                                    @EventHandler
                                    public void preInit(FMLPreInitializationEvent e){
                                    
                                    System.out.println("preInit");
                                    
                                    }
                                    
                                    @EventHandler
                                    public void init(FMLInitializationEvent e){
                                    
                                    System.out.println("init");
                                    
                                    MinecraftForge.EVENT_BUS.register(new EventsManager());
                                    
                                    }
                                    
                                    @EventHandler
                                    public void postInit(FMLPostInitializationEvent e){
                                    
                                    System.out.println("postInit");
                                    
                                    }
                                    
                                    }
                                    

                                    EventsManager.java :

                                    package fr.laiteux.rushplus.common.events;
                                    
                                    import net.minecraft.init.Blocks;
                                    import net.minecraft.init.Items;
                                    import net.minecraft.item.ItemStack;
                                    import net.minecraft.util.EnumFacing;
                                    import net.minecraftforge.event.world.BlockEvent;
                                    import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
                                    
                                    public class EventsManager{
                                    
                                    @SubscribeEvent
                                    public void onBlockPlace(BlockEvent.PlaceEvent e){
                                    
                                    System.out.println("onBlockPlace");
                                    
                                    if(e.getPlacedBlock() == Blocks.TNT && e.getPlayer().inventory.hasItemStack(new ItemStack(Items.FLINT_AND_STEEL))){
                                    
                                    System.out.println("ok");
                                    
                                    // retire le briquet de l'inventaire
                                                e.getPlayer().inventory.deleteStack(new ItemStack(Items.FLINT_AND_STEEL));
                                    
                                                // met le briquet en main
                                                e.getPlayer().setHeldItem(e.getPlayer().getActiveHand(), new ItemStack(Items.FLINT_AND_STEEL));
                                    
                                                // appelle la fonction du clic droit sur la tnt
                                                e.getPlacedBlock().getBlock().onBlockActivated(e.getWorld(), e.getPos(), e.getPlacedBlock(), e.getPlayer(), e.getPlayer().getActiveHand(), e.getPlayer().getHeldItem(e.getPlayer().getActiveHand()), EnumFacing.UP, 0, 0, 0);
                                    
                                    }
                                    
                                    }
                                    
                                    }
                                    

                                    Cela fonctionne, puisque quand je place un bloc, il m’imprime “onBlockPlace” dans la console, comme voulu.
                                    Mais il n’arrive pas (avec ton code) à voir si le block placé est une tnt ou / et si le joueur a un briquet dans son inventaire, puisque la console n’imprime pas “ok” …

                                    Une solution, s’il-te-plaît ?

                                    Merci d’avance, cordialement.

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

                                      My bad, getPlacedBlock renvoies un objet IBlockState alors que Blocks.TNT est de type Block.
                                      Donc e.getPlacedBlock() == Blocks.TNT est toujours faux.

                                      Il faut faire comme ça :
                                      e.getPlacedBlock().getBlock() == Blocks.TNT

                                      1 réponse Dernière réponse Répondre Citer 0
                                      • Laiteux
                                        Laiteux dernière édition par

                                        @‘robin4002’:

                                        My bad, getPlacedBlock renvoies un objet IBlockState alors que Blocks.TNT est de type Block.
                                        Donc e.getPlacedBlock() == Blocks.TNT est toujours faux.

                                        Il faut faire comme ça :
                                        e.getPlacedBlock().getBlock() == Blocks.TNT

                                        Waw, super le résultat, je vais optimiser tout ça pour faire ce que je veux à la base et te recontacte si besoin, merci  ❤

                                        1 réponse Dernière réponse Répondre Citer 0
                                        • Laiteux
                                          Laiteux dernière édition par

                                          @‘robin4002’:

                                          My bad, getPlacedBlock renvoies un objet IBlockState alors que Blocks.TNT est de type Block.
                                          Donc e.getPlacedBlock() == Blocks.TNT est toujours faux.

                                          Il faut faire comme ça :
                                          e.getPlacedBlock().getBlock() == Blocks.TNT

                                          Re, pourrais-tu essayer ce code chez toi s’il-te-plaît ?
                                          Car ce qu’il fait est compliqué à expliquer de plus que ça se passe très vite, je ne crois en plus pas avoir écrit ce qu’il faut (comme code).

                                          @SubscribeEvent
                                          public void onBlockPlace(BlockEvent.PlaceEvent e){
                                          
                                          // Si le bloc placé est une TNT
                                          if(e.getPlacedBlock().getBlock() == Blocks.TNT){
                                          
                                          // Si le joueur dispose d'un briquet dans son inventaire
                                          if(e.getPlayer().inventory.hasItemStack(new ItemStack(Items.FLINT_AND_STEEL))){
                                          
                                          // La case sélectionnée dans l'inventaire du joueur devient la case dans laquelle est contenue le briquet
                                          e.getPlayer().inventory.setPickedItemStack(new ItemStack(Items.FLINT_AND_STEEL));
                                          
                                          // Le clic droit s'effectue sur la TNT pour l'allumer
                                          e.getPlacedBlock().getBlock().onBlockActivated(e.getWorld(), e.getPos(), e.getPlacedBlock(), e.getPlayer(), e.getPlayer().getActiveHand(), e.getPlayer().getHeldItem(e.getPlayer().getActiveHand()), EnumFacing.UP, 0, 0, 0);
                                          
                                          // Si le joueur dispose de blocs de grès (polis normalement) dans son inventaire
                                          if(e.getPlayer().inventory.hasItemStack(new ItemStack(Blocks.SANDSTONE))){
                                          
                                          // La case sélectionnée dans l'inventaire du joueur devient la case dans laquelle est contenur le grès (polis normalement)
                                          e.getPlayer().inventory.setPickedItemStack(new ItemStack(Blocks.SANDSTONE));
                                          
                                          }
                                          
                                          }
                                          
                                          }
                                          
                                          }
                                          

                                          ( http://hastebin.com/piculesoha.java )
                                          Si tu pouvais m’expliquer mes erreurs ce serait un plus, merci d’avance, cordialement.

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

                                            Je viens de vérifier ça :

                                            @SubscribeEvent
                                            public void onBlockPlace(BlockEvent.PlaceEvent e)
                                            {
                                            System.out.println(e.getWorld().isRemote);
                                            }
                                            

                                            La console ne renvoies que false.
                                            Donc l’event n’est que appelé côté serveur et non côté client, donc ça ne va pas.
                                            Il faut un autre event.
                                            Je vais voir avec l’event interact si c’est possible.

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

                                            MINECRAFT FORGE FRANCE © 2018

                                            Powered by NodeBB