MFF

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

    Effectuer une suite d'actions lors du placement d'une TNT ?

    Planifier Épinglé Verrouillé Déplacé Résolu 1.9.x et 1.10.x
    1.9.4
    28 Messages 2 Publieurs 5.8k 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

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

      1 réponse Dernière réponse Répondre Citer 0
      • LaiteuxL Hors-ligne
        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
        • robin4002R Hors-ligne
          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
          • LaiteuxL Hors-ligne
            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
            • robin4002R Hors-ligne
              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
              • LaiteuxL Hors-ligne
                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
                • robin4002R Hors-ligne
                  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
                  • LaiteuxL Hors-ligne
                    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
                    • robin4002R Hors-ligne
                      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
                      • LaiteuxL Hors-ligne
                        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
                        • LaiteuxL Hors-ligne
                          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
                          • robin4002R Hors-ligne
                            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
                            • LaiteuxL Hors-ligne
                              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
                              • LaiteuxL Hors-ligne
                                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
                                • robin4002R Hors-ligne
                                  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
                                  • LaiteuxL Hors-ligne
                                    Laiteux
                                    dernière édition par

                                    @‘robin4002’:

                                    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.

                                    D’accord, je n’y connaît rien du tout là dedans.
                                    J’ai cru comprendre que c’était les proxys qui géraient ça, mais je ne sais pas m’en servir.

                                    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

                                      Dans ton cas tu n’as pas à te soucier des proxys comme tu veux faire un mod client side only.

                                      Par contre pour que ton mod puisse fonctionner comme tu veux il faut faire uniquement des actions sur le client (donc world.isRemote doit être avoir la valeur true).
                                      PlayerInteractEvent.RightClickBlock est bien appelé côté client, mais il ne permet pas de faire ce que tu veux 😕

                                      Je crains que ce que tu souhaites faire n’est pas possible sans modifier le code de Minecraft via ASM ou sans que le mod soit installé sur le serveur.

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

                                        @‘robin4002’:

                                        Dans ton cas tu n’as pas à te soucier des proxys comme tu veux faire un mod client side only.

                                        Par contre pour que ton mod puisse fonctionner comme tu veux il faut faire uniquement des actions sur le client (donc world.isRemote doit être avoir la valeur true).
                                        PlayerInteractEvent.RightClickBlock est bien appelé côté client, mais il ne permet pas de faire ce que tu veux 😕

                                        Je crains que ce que tu souhaites faire n’est pas possible sans modifier le code de Minecraft via ASM ou sans que le mod soit installé sur le serveur.

                                        Ah 😞

                                        Mais quel est donc le problème, je ne l’ai pas bien compris ?

                                        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

                                          BlockEvent.PlaceEvent n’est que appelé côté serveur.
                                          Donc si le mod n’est pas installé sur le serveur, ça ne fonctionnera pas.
                                          De plus la fonction setPickedItemStack que tu as utilisé n’est que disponible côté client. C’est pour ça que ton code ne fonctionne pas vraiment (bug visuel en solo et ne fonctionnerai pas du tout en multi, il ferai crasher le serveur si on le tente de l’installer sur un serveur).

                                          Et avec l’event PlayerInteractEvent.RightClickBlock on ne peut pas détecté le bloc posé car il n’est pas encore posé à ce moment.
                                          J’ai essayé de détecter l’item en main du-coup, mais player.getActiveHand() ne fonctionne pas à ce moment. En fait je viens de voir qu’on peut utiliser e.getHand().
                                          Du-coup on peut détecter l’item en main, mais le souci est ensuite de faire le clic droit avec le briquet : il sera fait trop tôt.
                                          Il faudrait mettre en place un petit délai.

                                          Finalement c’est peut-être quand même possible sans trop se casser la tête.

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

                                            @‘robin4002’:

                                            BlockEvent.PlaceEvent n’est que appelé côté serveur.
                                            Donc si le mod n’est pas installé sur le serveur, ça ne fonctionnera pas.
                                            De plus la fonction setPickedItemStack que tu as utilisé n’est que disponible côté client. C’est pour ça que ton code ne fonctionne pas vraiment (bug visuel en solo et ne fonctionnerai pas du tout en multi, il ferai crasher le serveur si on le tente de l’installer sur un serveur).

                                            Et avec l’event PlayerInteractEvent.RightClickBlock on ne peut pas détecté le bloc posé car il n’est pas encore posé à ce moment.
                                            J’ai essayé de détecter l’item en main du-coup, mais player.getActiveHand() ne fonctionne pas à ce moment. En fait je viens de voir qu’on peut utiliser e.getHand().
                                            Du-coup on peut détecter l’item en main, mais le souci est ensuite de faire le clic droit avec le briquet : il sera fait trop tôt.
                                            Il faudrait mettre en place un petit délai.

                                            Finalement c’est peut-être quand même possible sans trop se casser la tête.

                                            Ah, voila qui me rassure 😄

                                            As-tu Skype, pour pouvoir discuter (à l’écrit, pas forcément en vocal) instantanément, ce serait plus simple.
                                            Si oui, ajoute moi : fury.jar

                                            Merci d’avance cordialement, Matt.

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

                                            MINECRAFT FORGE FRANCE © 2024

                                            Powered by NodeBB