MFF

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

    Créer une table de craft compatible avec JEI et NEI

    Planifier Épinglé Verrouillé Déplacé Les interfaces (GUI) et les container
    1.8.91.9.x
    90 Messages 11 Publieurs 23.4k Vues 3 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.
    • AymericRedA Hors-ligne
      AymericRed
      dernière édition par

      Pour l’idée de bonus, ça peut être un truc cool, mais étant donné qu’il faudrait remplacer le gui de l’inventaire, je pense qu’il faudrait un tuto à part entière.

      Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

      AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

      Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
      Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

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

        Ajout NEI ? en bonus bis

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

          Ah oui ça, ça serait bien à mettre ici, je verrais…

          Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

          AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

          Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
          Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

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

            Déjà gg AymericRed et merci beaucoup à toi pour ce tuto grâce à toi je vais réalisé ce que j’ai voulu faire il à longtemps 🙂
            après en bonus tu pourra rajouté 
            NEI,de décraft les objet qu’on on a craft du genre je craft une épée spécial avec 1 stick et 8 diamand et par rapport à sa durabilité par exemple si il est à 200 on récupéré 2 diamant

            Merci infiniment pour ce tuto 🙂

            Edit 
            comme je pourrais mettre ceci

            @Override
            public boolean canInteractWith(EntityPlayer player) 
            {
            return this.worldObj.getBlockState(this.pos).getBlock() != enderdeath.AnvilDragon ? false : player.getDistanceSq((double)this.pos.getX() + 0.5D, (double)this.pos.getY() + 0.5D, (double)this.pos.getZ() + 0.5D) <= 64.0D;
            }
            
            

            en 1.7.10?

            Voila ma signature

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

              De rien 🙂
              Donc du coup NEI c’est prévu, et pour ta proposition, il suffit d’ajouter les crafts mais en inversé.

              Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

              AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

              Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
              Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

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

                @‘AymericRed’:

                De rien 🙂
                Donc du coup NEI c’est prévu, et pour ta proposition, il suffit d’ajouter les crafts mais en inversé.

                Merci grace à toi j’ai fait ma nouvelle table de craft dans mon mod en 1.9 et je m’attaque pour une nouvelle table de craft pour mon mod en 1.7.10 🙂
                (sa va je pensé que c’était plus dur de passé du codage 1.9 en 1.7.10 mais c’est bon ^^)
                et pour NEI Yes 🙂
                et pour les craft inversé je vais m’y mettre après la nouvelle table de craft en 1.7.10 🙂

                Merci beaucoup 🙂

                Ps ce tuto = 5 étoiles 🙂

                Edit comme je peux passé ceci

                @Override
                public boolean canInteractWith(EntityPlayer player) 
                {
                return this.worldObj.getBlockState(this.pos).getBlock() != enderdeath.AnvilDragon ? false : player.getDistanceSq((double)this.pos.getX() + 0.5D, (double)this.pos.getY() + 0.5D, (double)this.pos.getZ() + 0.5D) <= 64.0D;
                }
                
                

                en 1.7.10

                Voila ma signature

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

                  getBlockState(…).getBlock() devient getBlock et ensuite il faut que tu fasses trois variables pour X, y, et z.

                  Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk

                  Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                  AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                  Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                  Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

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

                    J’ai un autre problème dans cette classe

                    package ed.enderdeath.mod.AnvilDragon;
                    
                    import com.sun.istack.internal.Nullable;
                    
                    import cpw.mods.fml.common.FMLCommonHandler;
                    import net.minecraft.entity.player.EntityPlayer;
                    import net.minecraft.init.Blocks;
                    import net.minecraft.init.Items;
                    import net.minecraft.inventory.IInventory;
                    import net.minecraft.inventory.InventoryCrafting;
                    import net.minecraft.inventory.Slot;
                    import net.minecraft.item.Item;
                    import net.minecraft.item.ItemHoe;
                    import net.minecraft.item.ItemPickaxe;
                    import net.minecraft.item.ItemStack;
                    import net.minecraft.item.ItemSword;
                    import net.minecraft.stats.AchievementList;
                    import net.minecraftforge.common.ForgeHooks;
                    
                    public class DragonSlotCrafting extends Slot {
                    /** The craft matrix inventory linked to this result slot. */
                      private final InventoryCrafting craftMatrix;
                      /** The player that is using the GUI where this slot resides. */
                      private final EntityPlayer thePlayer;
                      /** The number of items that have been crafted so far. Gets passed to ItemStack.onCrafting before being reset. */
                      private int amountCrafted;
                    
                      public DragonSlotCrafting(EntityPlayer player, InventoryCrafting craftingInventory, IInventory inventoryIn, int slotIndex, int xPosition, int yPosition)
                      {
                          super(inventoryIn, slotIndex, xPosition, yPosition);
                          this.thePlayer = player;
                          this.craftMatrix = craftingInventory;
                      }
                    
                      /**
                       * Check if the stack is a valid item for this slot. Always true beside for the armor slots.
                       */
                      @Override
                      public boolean isItemValid(@Nullable ItemStack stack)
                      {
                          return false;
                      }
                    
                      /**
                       * Decrease the size of the stack in slot (first int arg) by the amount of the second int arg. Returns the new
                       * stack.
                       */
                      @Override
                      public ItemStack decrStackSize(int amount)
                      {
                          if (this.getHasStack())
                          {
                              this.amountCrafted += Math.min(amount, this.getStack().stackSize);
                          }
                          return super.decrStackSize(amount);
                      }
                    
                      /**
                       * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood. Typically increases an
                       * internal count then calls onCrafting(item).
                       */
                      @Override
                      protected void onCrafting(ItemStack stack, int amount)
                      {
                          this.amountCrafted += amount;
                          this.onCrafting(stack);
                      }
                    
                      /**
                       * Appelé quand on craft, permet de gérer les achievements
                       */
                      @Override
                      protected void onCrafting(ItemStack stack)
                      {
                          if (this.amountCrafted > 0)
                          {
                              stack.onCrafting(this.thePlayer.worldObj, this.thePlayer, this.amountCrafted);
                          }
                          this.amountCrafted = 0;
                    
                          if (stack.getItem() == Item.getItemFromBlock(Blocks.bookshelf))
                          {
                              this.thePlayer.addStat(AchievementList.bookcase, 1);
                          }
                      }
                    
                      /**
                       * Appelée quand le joueur retire l'item du slot, permet de retirer le composants utilisés pour le craft
                       */
                      @Override
                      public void onPickupFromSlot(EntityPlayer playerIn, ItemStack stack)
                      {
                         FMLCommonHandler.instance().firePlayerCraftingEvent(playerIn, stack, craftMatrix); //Distribue l'event de craft
                          this.onCrafting(stack); //Gestion des achievements
                         ForgeHooks.setCraftingPlayer(playerIn); //Utilisé afin de retirer les items utiliser (pas sur de cela)
                          ItemStack[] aitemstack = TutorielCraftingManager.getInstance().getRemainingItems(this.craftMatrix, playerIn.worldObj); //On récupère les items restants
                          ForgeHooks.setCraftingPlayer(null);
                    
                          for (int i = 0; i < aitemstack.length; ++i) //On actualise les slots de craft
                          {
                              ItemStack itemstack = this.craftMatrix.getStackInSlot(i);
                              ItemStack itemstack1 = aitemstack*;
                              if (itemstack != null)
                              {
                                  this.craftMatrix.decrStackSize(i, 1);
                                  itemstack = this.craftMatrix.getStackInSlot(i);
                              }
                              if (itemstack1 != null)
                              {
                                  if (itemstack == null)
                                  {
                                      this.craftMatrix.setInventorySlotContents(i, itemstack1);
                                  }
                                  else if (ItemStack.areItemStacksEqual(itemstack, itemstack1) && ItemStack.areItemStackTagsEqual(itemstack, itemstack1))
                                  {
                                      itemstack1.stackSize += itemstack.stackSize;
                                      this.craftMatrix.setInventorySlotContents(i, itemstack1);
                                  }
                                  else if (!this.thePlayer.inventory.addItemStackToInventory(itemstack1))
                                  {
                                      this.thePlayer.dropOneItem(false);
                                  }
                              }
                          }
                      }
                    }
                    
                    

                    Le problème c’est que setCraftingPlayer n’existe pas donc j’ai éssayé de trouve une alternative mais j’ai pas trouvé

                    Voila ma signature

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

                      Pour le slot, je regarde tout à l’heure, pour le gui, ça devrait marcher mais retire xSize1 et ySize1, c’est totalement inutile.

                      EDIT : PS : Tu peux regarder dans la classe SlotCrafting de mc qui est comparable à celle du tuto.

                      Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk

                      Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                      AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                      Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                      Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

                      1 réponse Dernière réponse Répondre Citer 1
                      • leo01418L Hors-ligne
                        leo01418
                        dernière édition par

                        Merci beaucoup 🙂

                        Mais j’ai un autre problème

                           return irecipe.getRemainingItems(craftMatrix); //On retourne les items restants
                        
                        getRemainingItems(craftMatrix);
                        ``` n'existe pas j'ai essaye de trouvé un internative mais cela ne marche pas ):
                        
                        Merci de ta réponse :)

                        Voila ma signature

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

                          Essaye un icrecipe.func_quelquechose qui retourne la même chose (array de stack) et qui a un InventoryCrafting en paramètre.

                          Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                          AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                          Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                          Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

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

                            c’est à dire il na pas de func dans la classe IRecipe et pour moi les seul truc que j’ai son :

                            getCraftingResult

                            matches

                            getRecipeSize

                            plus précisément

                            boolean matches(InventoryCrafting p_77569_1_, World p_77569_2_);

                            ItemStack getCraftingResult(InventoryCrafting p_77572_1_);

                            int getRecipeSize();

                            après c’est peut être ma version de forge   😛

                            Merci de ta réponse rapide 🙂

                            Voila ma signature

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

                              Ah bon, je pensait qu’il y aurait ça en 1.7.10, ça doit fonctionner autrement, il faut regarder le SlotCrafting de Minecraft pour voir comment est-ce qu’il fait.

                              Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                              AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                              Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                              Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

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

                                Quelques updates du tuto ont été réalisées :

                                • Modification du code du Container, changement des variables craftWidth et craftHeigth de private à public et ajout de “final” aux différents variables.
                                • Rédaction de la partie “Faire une table de craft qui ne pert pas ses items” terminée.

                                Le bonus sur NEI arrivera quand NEI en 1.9.4 existera 🙂

                                Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                                AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                                Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                                Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

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

                                  @‘AymericRed’:

                                  Quelques updates du tuto ont été réalisées :

                                  • Modification du code du Container, changement des variables craftWidth et craftHeigth de private à public et ajout de “final” aux différents variables.
                                  • Rédaction de la partie “Faire une table de craft qui ne pert pas ses items” terminée.

                                  Le bonus sur NEI arrivera quand NEI en 1.9.4 existera 🙂

                                  Bravo sa complète ce tutoriel très bon 🙂

                                  Bonne chance pour NEI 🙂

                                  Pour revenir à mon problème après plusieurs recherche je n’ai pas trouvé peut être que je devrais cherché dans la classe qui gère les crafts

                                  Merci de complété ce tutoriel  qui est déjà très bon  et de ton aide 😄

                                  Voila ma signature

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

                                    Merci du compliment ^^ Je regarderais cet aprem dans les sources 1.7 que je devrais toujours avoir, pour ton problème 🙂

                                    Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk

                                    Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                                    AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                                    Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                                    Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

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

                                      Si c’est ce que je pense, avant la 1.8 c’était une autre méthode qui était utilisée : on configurait l’item qui restait depuis l’item et non depuis le craft, ça a du être modifié dans les dernières versions. Peut être qu’en retirant cette partie là ça fonctionnera (à vérifier)

                                      Site web contenant mes scripts : http://SCAREXgaming.github.io

                                      Pas de demandes de support par MP ni par skype SVP.
                                      Je n'accepte sur skype que l…

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

                                        Alors j’ai regardé rapidement le SlotCrafting de mc 1.7.10, il faut que tu retires toutes les fonctions getRemainingItems du crafting manager et des classes de recette, puis recopies la fonction onPickupFromSlot de la classe SlotCrafting dans la classe de ton Slot.

                                        Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                                        AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                                        Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                                        Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

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

                                          @‘AymericRed’:

                                          Alors j’ai regardé rapidement le SlotCrafting de mc 1.7.10, il faut que tu retires toutes les fonctions getRemainingItems du crafting manager et des classes de recette, puis recopies la fonction onPickupFromSlot de la classe SlotCrafting dans la classe de ton Slot.

                                          Merci je vais faire cela :)___Donc Petite question j’enlève

                                           public TutorielShapedRecipes addRecipe(ItemStack result, Object… recipeComponents)
                                            {
                                                String s = "";
                                                int i = 0;
                                                int j = 0;
                                                int k = 0;
                                                if (recipeComponents* instanceof String[])
                                                {
                                                    String[] astring = (String[])((String[])recipeComponents[i++]);
                                                    for (int l = 0; l < astring.length; ++l)
                                                    {
                                                        String s2 = astring[l];
                                                        ++k;
                                                        j = s2.length();
                                                        s = s + s2;
                                                    }
                                                }
                                                else
                                                {
                                                    while (recipeComponents* instanceof String)
                                                    {
                                                        String s1 = (String)recipeComponents[i++];
                                                        ++k;
                                                        j = s1.length();
                                                        s = s + s1;
                                                    }
                                                }
                                                Character character;
                                                Map <character, object="">components = Maps.<character, object="">newHashMap();
                                                Object in;
                                                for ( ; i < recipeComponents.length; i += 2)
                                                {
                                                 in = recipeComponents_;
                                                    Object component = null;
                                                    character = (Character)recipeComponents*;
                                                    if (in instanceof Item)
                                                    {
                                                        component = new ItemStack((Item)recipeComponents_);
                                                    }
                                                    else if (in instanceof Block)
                                                    {
                                                        component = new ItemStack((Block)recipeComponents_, 1, 32767);
                                                    }
                                                    else if (in instanceof ItemStack)
                                                    {
                                                        component = (ItemStack)recipeComponents_;
                                                    }
                                                    else if (in instanceof String)
                                                    {
                                                     component = (String)in;
                                                    }
                                                    else
                                                    {
                                                     throw new IllegalArgumentException("Invalid shaped recipe: unknown type " + in.getClass().getName() + "!");
                                                    }
                                                    components.put(character, component);
                                                }
                                                Object[] aitemstack = new Object[j * k];
                                                char key;
                                                Object component;
                                                for (int i1 = 0; i1 < j * k; ++i1)
                                                {
                                                    key = s.charAt(i1);
                                                    if (components.containsKey(Character.valueOf(key)))
                                                    {
                                                     component = components.get(Character.valueOf(key));
                                                        if(component instanceof ItemStack) 
                                                         aitemstack[i1] = ((ItemStack)component).copy();
                                                        else
                                                         aitemstack[i1] = component;
                                                    }
                                                    else
                                                        aitemstack[i1] = null;
                                                }
                                                TutorielShapedRecipes shapedrecipes = new TutorielShapedRecipes(j, k, aitemstack, result);
                                                this.recipes.add(shapedrecipes);
                                                return shapedrecipes;
                                            }
                                          
                                          

                                          et

                                            public void addShapelessRecipe(ItemStack result, Object… recipeComponents)
                                            {
                                                List list = Lists.newArrayList();
                                                for (Object component : recipeComponents) //Pour chaque composant de la recette
                                                {
                                                    if (component instanceof ItemStack)
                                                    {
                                                        list.add(((ItemStack)component).copy());
                                                    }
                                                    else if (component instanceof Item)
                                                    {
                                                        list.add(new ItemStack((Item)component));
                                                    }
                                                    else if(component instanceof Block)
                                                    {
                                                        list.add(new ItemStack((Block)component));
                                                    }
                                                    else if(component instanceof String) //Pour l'ore dictionnary
                                                    {
                                                     list.add(component);
                                                    }
                                                    else throw new IllegalArgumentException("Invalid shapeless recipe: unknown type " + component.getClass().getName() + "!");
                                                }
                                                this.recipes.add(new TutorielShapelessRecipe(result, list));
                                            }
                                          

                                          et

                                          public ItemStack[] getRemainingItems(InventoryCrafting craftMatrix, World worldIn)
                                            {
                                                for (IRecipe irecipe : this.recipes) //Pour chaque recette
                                                {
                                                    if (irecipe.matches(craftMatrix, worldIn)) //Si elle correspond à la matrice actuelle
                                                    {
                                                        return irecipe.getRemainingItems(craftMatrix); //On retourne les items restants
                                                    }
                                                }
                                                ItemStack[] aitemstack = new ItemStack[craftMatrix.getSizeInventory()];
                                                for (int i = 0; i < aitemstack.length; ++i)
                                                {
                                                    aitemstack* = craftMatrix.getStackInSlot(i);
                                                }
                                                return aitemstack; //Si ça ne correspond à aucune recette, on retourne tous les items qui sont présents dans la matrice
                                            }
                                          
                                          

                                          ?

                                          Merci de ton aide ;)____</character,></character,>

                                          Voila ma signature

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

                                            J’ai enlevé c’est méthode et sa ne marche pas

                                            voici mes classes
                                            Container
                                            http://pastebin.com/hiLFTGHV

                                            BlockCraftCustom
                                            http://pastebin.com/49s4j5pR

                                            Slot
                                            http://pastebin.com/PPY9L6kC

                                            gui
                                            http://pastebin.com/UPSfxNUX

                                            TutorielCraftingManager
                                            http://pastebin.com/ZsSRGZWZ

                                            Merci de ton aide 😉

                                            Voila ma signature

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

                                            MINECRAFT FORGE FRANCE © 2024

                                            Powered by NodeBB