MFF

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

    Ajouter des commandes

    Planifier Épinglé Verrouillé Déplacé Autres
    1.6.x
    22 Messages 3 Publieurs 14.6k 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.
    • Superloup10S Hors-ligne
      Superloup10 Modérateurs
      dernière édition par Superloup10

      Bonjour à tous et à toutes, me voici de retour pour un 2ème tutoriel. De plus, ce tutoriel est inédit car vous ne le trouverez qu’ici.

      Sommaire

      1. Introduction
      2. La base de la commande
      3. Appliquer la/les commande(s)
      4. Allez plus loin
      5. Ressources + rendu final
      6. Questions/Réponses

      Introduction

      La première étape consiste à déterminer le fonctionnement de la ou des commandes que vous allez utilisé.
      Dans notre cas, nous allons utilisé une commande pour activer ou désactiver le spawn d’une entitée (le creeper plus précisément)

      La base de la commande

      Classe Principale

      Dans votre classe Principale, après :

             @EventHandler
             public void PostInit(FMLPostInitializationEvent event)
             {
                     // Integration avec les autres mods - integration with others mods
             }
      

      Rajoutez :

             @EventHandler
             public void serverStarting(FMLServerStartingEvent event)
             {
                     // Executez au démarrage du serveur
                     event.registerServerCommand(new CommandTutoriel());
             }
      

      N’oubliez pas d’importez FMLServerStartingEvent

      Vous aurez une erreur à CommandTutoriel pour la résoudre, il vous suffit de créer la classe.

      La classe CommandTutoriel

      Voilà vous avez créé la classe CommandTutoriel, elle devrais ressembler à ceci :

      package tutoriel.common;
      
      import java.util.List;
      
      import net.minecraft.command.ICommand;
      import net.minecraft.command.ICommandSender;
      
      public class CommandTutoriel implements ICommand {
      
          @Override
          public int compareTo(Object arg0) {
              // TODO Auto-generated method stub
              return 0;
          }
      
          @Override
          public String getCommandName() {
              // TODO Auto-generated method stub
              return null;
          }
      
          @Override
          public String getCommandUsage(ICommandSender icommandsender) {
              // TODO Auto-generated method stub
              return null;
          }
      
          @Override
          public List getCommandAliases() {
              // TODO Auto-generated method stub
              return null;
          }
      
          @Override
          public void processCommand(ICommandSender icommandsender, String[] astring) {
              // TODO Auto-generated method stub
      
          }
      
          @Override
          public boolean canCommandSenderUseCommand(ICommandSender icommandsender) {
              // TODO Auto-generated method stub
              return false;
          }
      
          @Override
          public List addTabCompletionOptions(ICommandSender icommandsender, String[] astring) {
              // TODO Auto-generated method stub
              return null;
          }
      
          @Override
          public boolean isUsernameIndex(String[] astring, int i) {
              // TODO Auto-generated method stub
              return false;
          }
      
      }
      

      Modifiez-la de manière à ce qu’elle ressemble à celle-ci :

      package tutoriel.common;
      
      import net.minecraft.command.CommandBase;
      import net.minecraft.command.ICommandSender;
      
      public class CommandTutoriel extends CommandBase
      {
          @Override
          public String getCommandName()
          {
              return null;
          }
      
          @Override
          public String getCommandUsage(ICommandSender sender)
          {
              return null;
          }
      
          @Override
          public void processCommand(ICommandSender sender, String[] arguments)
          {
      
          }
      }
      

      Dans la méthode getCommandName, à la place de:

      return null;
      

      Mettez

      return "tutoriel";
      

      Ceci va être le nom de la commande en jeu, donc /tutoriel dans notre cas.

      Dans la méthode getCommandUsage, à la place de :

      return null;
      

      Mettez

      return "commands.tutoriel.usage";
      

      Si la commande est mal utilisé, ce texte sera envoyé au joueur. Nous allons l’ajouter en ressource externe dans les fichiers de langages.

      Dans la méthode processCommand, rajoutez :

      if(arguments.length <= 0)
                  throw new WrongUsageException(this.getCommandUsage(sender));
              if(arguments[0].matches("creeper"))
              {
                  if(arguments.length == 1)
                  {
                      sender.sendChatToPlayer(ChatMessageComponent.createFromTranslationKey("commands.tutoriel.usage").setColor(EnumChatFormatting.RED));
                      sender.sendChatToPlayer(ChatMessageComponent.createFromTranslationKey("commands.tutoriel.creeper.usage").setColor(EnumChatFormatting.RED));
                  }
                  else if(arguments[1].matches("enable"))
                  {
                      sender.getEntityWorld().getWorldInfo().getGameRulesInstance().setOrCreateGameRule("enableCreeper", "true");
                      sender.sendChatToPlayer(ChatMessageComponent.createFromTranslationKey("commands.tutoriel.creeper.enable"));
                  }
                  else if(arguments[1].matches("disable"))
                  {
                      sender.getEntityWorld().getWorldInfo().getGameRulesInstance().setOrCreateGameRule("enableCreeper", "false");
                      sender.sendChatToPlayer(ChatMessageComponent.createFromTranslationKey("commands.tutoriel.creeper.disable"));
                  }
                  else if(arguments[1].matches("help"))
                  {
                      sender.sendChatToPlayer(ChatMessageComponent.createFromTranslationKey("commands.tutoriel.usage"));
                      sender.sendChatToPlayer(ChatMessageComponent.createFromTranslationKey("commands.tutoriel.creeper.usage"));
                  }
                  else
                  {
                      sender.sendChatToPlayer(ChatMessageComponent.createFromTranslationKey("commands.tutoriel.creeper.invalid").setColor(EnumChatFormatting.RED));
                  }
              }
              else if(arguments[0].matches("help"))
              {
                  sender.sendChatToPlayer(ChatMessageComponent.createFromTranslationKey("commands.tutoriel.help"));
              }
              else
              {
                  throw new WrongUsageException(this.getCommandUsage(sender));
              }
      

      arguments.length est le nombre de mot tapez après la commande. En fonction de sa taille, on fait une action. S’il y a aucun argument, alors on envoie une erreur pour dire que la commande est mal utilisé. Si la longueur est de 1 et que l’argument correspond à creeper alors on vérifie que la longueur des arguments est 1. Si oui, le joueur à juste entré /tutoriel creeper, donc on lui dit comment utiliser la commande. Sinon, la longueur est plus longue, donc si l’argument 2 correspond à enable, on enregistre un tag nbt dans le world info. Si c’est disable, même chose, mais on met le tag sur false. Si c’est help, on envoie l’aide et sinon l’argument 2 est invalide, on envoie une erreur.
      Si l’argument 0 de la commande correspond à help, on envoie l’aide de la commande, sinon, c’est que l’argument 0 est invalide, on envoie donc une erreur.

      Pour les effets de votre commande, grâce à sender.getEntityWorld() vous pouvez obtenir l’instance du monde du joueur qui a envoyé la commande, et avec ça on peut faire de nombreuses choses. Dans cette exemple, j’ai enregistré une clé dans le NBT des règles de jeu, pour l’instant il n’a pas d’effet, nous allons voir ça juste après.
      Les commandes étant exécuter sur le side serveur, vous pouvez aussi utiliser tout ce qui vient du serveur.
      Tapez juste MinecraftServer.getServer(). et faite ctrl + espace, vous allez voir de nombreuses fonctions et variables, vous pouvez toutes les utilisez pour faire votre effet (exemple d’utilisation plus bas).

      Vous avez aussi pu remarquer que j’ai utilisé des sous-commandes (creeper et help), vous pouvez en ajouter d’autres avec des simples conditions.

      Appliquez la/les commande(s)

      Comme dit plus haut, pour l’instant ma commande enregistre juste un tag dans le NBT des gameRules, elle n’a pas d’autre effet.
      Les events de forge vont donc nous être très utile. Dans la classe principale, dans ma fonction init, j’enregistre mon event :

      MinecraftForge.EVENT_BUS.register(new EntityEvent());
      

      Dans cette classe, j’ajoute :

              @ForgeSubscribe
              public void onEntityJoinWorld(EntityJoinWorldEvent event)
              {
                  if(event.entity instanceof EntityCreeper)
                  {
                      if(event.world.getWorldInfo().getGameRulesInstance().hasRule("enableCreeper"))
                      {
                          if(!event.world.getWorldInfo().getGameRulesInstance().getGameRuleBooleanValue("enableCreeper"))
                          {
                              event.setCanceled(true);
                          }
                      }
                  }
              }
      
              @ForgeSubscribe
              public void onLivingUpdate(LivingUpdateEvent event)
              {
                  if(event.entity instanceof EntityCreeper)
                  {
                      if(event.entity.worldObj.getWorldInfo().getGameRulesInstance().hasRule("enableCreeper"))
                      {
                          if(!event.entity.worldObj.getWorldInfo().getGameRulesInstance().getGameRuleBooleanValue("enableCreeper"))
                          {
                              event.entity.setDead();
                          }
                      }
                  }
              }
      

      Le premier event est déclenché à chaque fois qu’une entité rejoint le monde, l’autre à chaque fois qu’une entité vivante est tické.
      Dans les deux cas, je vérifie si l’entité est d’instance EntityCreeper (donc EntityCreeper lui même, et toutes les classes filles).
      Je vérifie que le NBT des règles de jeu ont un tag nommé enableCreeper pour éviter tout risque de NullPointerException, si la commande n’a jamais été exécuté dans ce monde.
      Si elle existe et qu’elle est sur false, alors j’annule l’event de spawn dans le cas du EntityJoinWorldEvent et je tue l’entité dans le cas du LivingUpdateEvent. Ma commande a donc maintenant un effet, si je mets sur false, les creepers ne pourront plus spawné, et ceux présent sur la map vont être tués (sans drop, le setDead(); supprime l’entitée)

      Allez plus loin

      L’auto-complétion

      Vous avez créé vos premières commandes, mais l’utilisateur est obligé de connaître les commandes de tête, nous allons donc lui faciliter le travail en rajoutant la possibilité de taper les commandes via la touche TAB :

          public List addTabCompletionOptions(ICommandSender sender, String[] arguments)
          {
              return arguments.length == 1 ? getListOfStringsMatchingLastWord(arguments, new String[] {"creeper", "fire"}) : (arguments.length == 2 && arguments[0].matches("creeper") ? getListOfStringsMatchingLastWord(arguments, new String[] {"enable", "disable"}) : (arguments.length == 2 && arguments[0].matches("fire") ? getListOfStringsMatchingLastWord(arguments, this.getPlayers()) : null));
          }
      

      Le principe est exactement le même que la fonction processCommand. Ce sont à chaque fois des conditions (enfin une condition ternaire ici). Lorsqu’il y a plusieurs possibilités, il faut utilisé un tableau de string (new String[] {“exemple1”, “exemple2”, “exemple3”})

      La commande fire

      Un autre exemple de commande, celle-ci permet d’enflammer soit le joueur qui utilise la commande, soit un joueur défini. Ajoutez ce code avant le else if(arguments[0].matches(“help”))

              else if(arguments[0].matches("fire"))
              {
                  if(arguments.length == 2)
                  {
                      EntityPlayerMP playermp = this.getCommandSenderAsPlayer(sender);
                      if(playermp != null)
                      {
                          playermp.setFire(this.parseInt(sender, arguments[1]));
                          sender.sendChatToPlayer(ChatMessageComponent.createFromTranslationWithSubstitutions("commands.tutoriel.fire.success", playermp.getEntityName(), arguments[1]));
                      }
                      else
                      {
                          sender.sendChatToPlayer(ChatMessageComponent.createFromTranslationWithSubstitutions("commands.tutoriel.fire.failure"));
                      }
                  }
                  else if(arguments.length == 3)
                  {
                      if(arguments[2].matches("help"))
                      {
                          sender.sendChatToPlayer(ChatMessageComponent.createFromTranslationKey("commands.tutoriel.usage"));
                          sender.sendChatToPlayer(ChatMessageComponent.createFromTranslationWithSubstitutions("commands.tutoriel.fire.usage.1"));
                          sender.sendChatToPlayer(ChatMessageComponent.createFromTranslationWithSubstitutions("commands.tutoriel.fire.usage.2"));
                      }
                      else
                      {
                          EntityPlayerMP playermp = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(arguments[1]);
                          if(playermp != null)
                          {
                              playermp.setFire(this.parseInt(sender, arguments[2]));
                              sender.sendChatToPlayer(ChatMessageComponent.createFromTranslationWithSubstitutions("commands.tutoriel.fire.success", playermp.getEntityName(), arguments[2]));
                          }
                          else
                          {
                              sender.sendChatToPlayer(ChatMessageComponent.createFromTranslationWithSubstitutions("commands.tutoriel.fire.failure"));
                          }
                      }
                  }
                  else
                  {
                      sender.sendChatToPlayer(ChatMessageComponent.createFromTranslationWithSubstitutions("commands.tutoriel.usage").setColor(EnumChatFormatting.RED));
                      sender.sendChatToPlayer(ChatMessageComponent.createFromTranslationWithSubstitutions("commands.tutoriel.fire.usage.1").setColor(EnumChatFormatting.RED));
                      sender.sendChatToPlayer(ChatMessageComponent.createFromTranslationWithSubstitutions("commands.tutoriel.fire.usage.2").setColor(EnumChatFormatting.RED));
                  }
              }
      

      Pensez à rajouter ceci :

          protected String[] getPlayers()
          {
              return MinecraftServer.getServer().getAllUsernames();
          }
      

      Cette commande est donc un exemple d’utilisation de MinecraftServer.getServer().quelque_chose

      Ressources + Rendu final

      Dans vos fichiez de lang, voici ce que vous devez rajouter :

      #Commands
      commands.tutoriel.usage=Usage : /tutoriel <subcommand><value>
      commands.tutoriel.help=Available commands is creeper (Enable or disable creeper) and fire (burn a player)
      commands.tutoriel.creeper.enable=Creeper enabled
      commands.tutoriel.creeper.disable=Creeper disabled
      commands.tutoriel.creeper.usage=- creeper <value>: Enable or disable creeper. <value>is "enable" or "disable"
      commands.tutoriel.creeper.invalid=Invalid argument.
      commands.tutoriel.fire.success=%1$s burn for %2$s secondes
      commands.tutoriel.fire.failure=Player no found
      commands.tutoriel.fire.usage.1=- fire <seconds>: burn you for <seconds>
      commands.tutoriel.fire.usage.2=- fire <player><seconds>: burn <player>for <seconds>
      

      Voir le commit sur github

      Questions/Réponses

      Rien pour l’instant.

      Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

      Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

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

        Un tutoriel sur les commandes! 🙂 Depuis le temps que je l’attendais!

        Moddeur à la retraite et développeur de trucs en Java.

        J'aide les gens comme je peux, alors si mon message v…

        1 réponse Dernière réponse Répondre Citer 1
        • Superloup10S Hors-ligne
          Superloup10 Modérateurs
          dernière édition par

          La suite arrivera le WE prochain au plus tard.

          Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

          Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

          1 réponse Dernière réponse Répondre Citer 0
          • Superloup10S Hors-ligne
            Superloup10 Modérateurs
            dernière édition par

            Tutoriel pratiquement finis.

            Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

            Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

            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

              En fait, tu as regardé les ajouts que j’ai apporté ?
              https://github.com/FFMT/ModTutoriel/commit/b3e973aa18acdc6e6504b0cbb9b36b1e4f514a4b
              Ça serait bien d’adapter le tuto.

              Pour mettre à jour ton repo local :
              git remote add upstream https://github.com/FFMT/ModTutoriel.git
              git pull –rebase upstream command

              1 réponse Dernière réponse Répondre Citer 0
              • Superloup10S Hors-ligne
                Superloup10 Modérateurs
                dernière édition par

                ok, je vais l’adapter, tu as tester, tout fonctionne?

                Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

                Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

                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, à part pour activer/désactiver le spawn, je vais faire encore des tests demain.

                  1 réponse Dernière réponse Répondre Citer 0
                  • Superloup10S Hors-ligne
                    Superloup10 Modérateurs
                    dernière édition par

                    ok, moi les commandes que j’utilise dans mon mod fonctionnent à merveille.

                    Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

                    Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

                    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 es sur quel la boucle while ne cause pas de surcharge ou quelque chose comme ça ?

                      1 réponse Dernière réponse Répondre Citer 0
                      • Superloup10S Hors-ligne
                        Superloup10 Modérateurs
                        dernière édition par Superloup10

                        Uniquement des if exemple

                                if (!CommandDino.Debugmode)
                                {
                                    if(var2.itemID == EGItemList.ChickenEss.itemID)
                                    {
                                        if (!this.worldObj.isRemote)
                                        {
                                            EreGeologique.ShowMessage(StatCollector.translateToLocal(LocalizationStrings.STATUS_ESSENCE_FAIL), var1);
                                            return true;
                                        }
                                    }
                                }
                        

                        Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

                        Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

                        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 parlais du pull que tu as envoyé sur le github, je l’ai changé sans vérifier si ça fonctionne :
                          https://github.com/FFMT/ModTutoriel/commit/b3e973aa18acdc6e6504b0cbb9b36b1e4f514a4b#diff-82cd490dfc56f8c4865be299461d897bL186

                          1 réponse Dernière réponse Répondre Citer 0
                          • Superloup10S Hors-ligne
                            Superloup10 Modérateurs
                            dernière édition par

                            Bah, j’avais mis While avant de savoir qu’un if étais suffisant.

                            Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

                            Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

                            1 réponse Dernière réponse Répondre Citer 0
                            • Superloup10S Hors-ligne
                              Superloup10 Modérateurs
                              dernière édition par

                              Tutoriel terminé en attente d’un correcteur.

                              Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

                              Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

                              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

                                J’ai ajouter quelque explication supplémentaire, refait le poste à ma façon, et refait le commit github pour tout regrouper en un. Tu apparait quand même dans la liste des contributeurs sur github.

                                Tutoriel validé.

                                1 réponse Dernière réponse Répondre Citer 0
                                • Superloup10S Hors-ligne
                                  Superloup10 Modérateurs
                                  dernière édition par

                                  J’ai corrigé quelques fautes et des oublies de mots.

                                  Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

                                  Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

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

                                    Et mince, je m’étais relu en plus 😕
                                    Ha en passant, je t’es mit moddeur confirmé 🙂 la couleur te conviens ?

                                    1 réponse Dernière réponse Répondre Citer 0
                                    • Superloup10S Hors-ligne
                                      Superloup10 Modérateurs
                                      dernière édition par

                                      Oui, même si je préfère la couleur verte.

                                      Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

                                      Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

                                      1 réponse Dernière réponse Répondre Citer 0
                                      • Superloup10S Hors-ligne
                                        Superloup10 Modérateurs
                                        dernière édition par Superloup10

                                        Dis-moi, est-ce que

                                        sender.getEntityWorld().getWorldInfo().getGameRulesInstance().setOrCreateGameRule("enableCreeper", "true");
                                        

                                        et

                                        sender.getEntityWorld().getWorldInfo().getGameRulesInstance().addGameRule("enableCreeper", "true");
                                        

                                        ont le même effet?

                                        Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

                                        Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

                                        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

                                          La première créer la gameRule si elle n’existe pas, ou changer la valeur si elle existe alors que la deuxième créer la gameRule dans ton les cas.
                                          La première est donc a utiliser, puis la deuxième est juste utilisé dans la première, ou pour initialiser les gameRules la première fois.

                                          1 réponse Dernière réponse Répondre Citer 1
                                          • Superloup10S Hors-ligne
                                            Superloup10 Modérateurs
                                            dernière édition par

                                            Ok, merci.

                                            Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

                                            Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

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

                                            MINECRAFT FORGE FRANCE © 2024

                                            Powered by NodeBB