Unknown 6 жил өмнө
parent
commit
7707906fd2
19 өөрчлөгдсөн 111 нэмэгдсэн , 20 устгасан
  1. 1 0
      src/main/java/me/shedaniel/rei/api/ClientHelper.java
  2. 1 1
      src/main/java/me/shedaniel/rei/api/RecipeCategory.java
  3. 10 0
      src/main/java/me/shedaniel/rei/api/RecipeHelper.java
  4. 3 3
      src/main/java/me/shedaniel/rei/api/Renderer.java
  5. 15 0
      src/main/java/me/shedaniel/rei/client/ClientHelperImpl.java
  6. 39 1
      src/main/java/me/shedaniel/rei/client/RecipeHelperImpl.java
  7. 24 2
      src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
  8. 1 1
      src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java
  9. 1 1
      src/main/java/me/shedaniel/rei/gui/renderers/EmptyRenderer.java
  10. 1 1
      src/main/java/me/shedaniel/rei/gui/renderers/ItemStackRenderer.java
  11. 1 1
      src/main/java/me/shedaniel/rei/gui/renderers/RecipeRenderer.java
  12. 1 1
      src/main/java/me/shedaniel/rei/gui/renderers/SimpleRecipeRenderer.java
  13. 1 1
      src/main/java/me/shedaniel/rei/gui/widget/SlotWidget.java
  14. 7 3
      src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java
  15. 1 1
      src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingCategory.java
  16. 1 1
      src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingCategory.java
  17. 1 1
      src/main/java/me/shedaniel/rei/plugin/smelting/DefaultSmeltingCategory.java
  18. 1 1
      src/main/java/me/shedaniel/rei/plugin/smoking/DefaultSmokingCategory.java
  19. 1 0
      src/main/resources/assets/roughlyenoughitems/lang/en_us.json

+ 1 - 0
src/main/java/me/shedaniel/rei/api/ClientHelper.java

@@ -149,4 +149,5 @@ public interface ClientHelper {
     
     boolean executeViewAllRecipesFromCategory(Identifier category);
     
+    boolean executeViewAllRecipesFromCategories(List<Identifier> categories);
 }

+ 1 - 1
src/main/java/me/shedaniel/rei/api/RecipeCategory.java

@@ -7,7 +7,7 @@ package me.shedaniel.rei.api;
 
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.gui.RecipeViewingScreen;
-import me.shedaniel.rei.gui.renderables.RecipeRenderer;
+import me.shedaniel.rei.gui.renderers.RecipeRenderer;
 import me.shedaniel.rei.gui.widget.CategoryBaseWidget;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
 import me.shedaniel.rei.gui.widget.Widget;

+ 10 - 0
src/main/java/me/shedaniel/rei/api/RecipeHelper.java

@@ -6,11 +6,14 @@
 package me.shedaniel.rei.api;
 
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
+import me.shedaniel.rei.client.RecipeHelperImpl;
+import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen;
 import net.minecraft.item.ItemStack;
 import net.minecraft.recipe.Recipe;
 import net.minecraft.recipe.RecipeManager;
 import net.minecraft.util.Identifier;
 
+import java.awt.*;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -91,6 +94,8 @@ public interface RecipeHelper {
      */
     Map<RecipeCategory, List<RecipeDisplay>> getRecipesFor(ItemStack stack);
     
+    RecipeCategory getCategory(Identifier identifier);
+    
     /**
      * Gets the vanilla recipe manager
      *
@@ -204,7 +209,12 @@ public interface RecipeHelper {
      */
     void registerLiveRecipeGenerator(LiveRecipeGenerator<?> liveRecipeGenerator);
     
+    void registerScreenClickArea(Rectangle rectangle, Class<? extends AbstractContainerScreen> screenClass, Identifier... categories);
+    
     <T extends Recipe<?>> void registerRecipes(Identifier category, Class<T> recipeClass, Function<T, RecipeDisplay> mappingFunction);
     
     <T extends Recipe<?>> void registerRecipes(Identifier category, Function<Recipe, Boolean> recipeFilter, Function<T, RecipeDisplay> mappingFunction);
+    
+    List<RecipeHelperImpl.ScreenClickArea> getScreenClickAreas();
+    
 }

+ 3 - 3
src/main/java/me/shedaniel/rei/api/Renderer.java

@@ -5,9 +5,9 @@
 
 package me.shedaniel.rei.api;
 
-import me.shedaniel.rei.gui.renderables.EmptyRenderer;
-import me.shedaniel.rei.gui.renderables.ItemStackRenderer;
-import me.shedaniel.rei.gui.renderables.SimpleRecipeRenderer;
+import me.shedaniel.rei.gui.renderers.EmptyRenderer;
+import me.shedaniel.rei.gui.renderers.ItemStackRenderer;
+import me.shedaniel.rei.gui.renderers.SimpleRecipeRenderer;
 import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.item.ItemStack;
 import net.minecraft.util.math.MathHelper;

+ 15 - 0
src/main/java/me/shedaniel/rei/client/ClientHelperImpl.java

@@ -218,6 +218,21 @@ public class ClientHelperImpl implements ClientHelper, ClientModInitializer {
         return map.keySet().size() > 0;
     }
     
+    @Override
+    public boolean executeViewAllRecipesFromCategories(List<Identifier> categories) {
+        Map<RecipeCategory, List<RecipeDisplay>> map = Maps.newLinkedHashMap();
+        for(Identifier category : categories) {
+            Optional<RecipeCategory> any = RecipeHelper.getInstance().getAllCategories().stream().filter(c -> c.getIdentifier().equals(category)).findAny();
+            if (!any.isPresent())
+                continue;
+            RecipeCategory<?> recipeCategory = any.get();
+            map.put(recipeCategory, RecipeHelper.getInstance().getAllRecipesFromCategory(recipeCategory));
+        }
+        if (map.keySet().size() > 0)
+            openRecipeViewingScreen(map);
+        return map.keySet().size() > 0;
+    }
+    
     @Override
     public void openRecipeViewingScreen(Map<RecipeCategory, List<RecipeDisplay>> map) {
         if (RoughlyEnoughItemsCore.getConfigManager().getConfig().screenType == RecipeScreenType.VILLAGER)

+ 39 - 1
src/main/java/me/shedaniel/rei/client/RecipeHelperImpl.java

@@ -9,6 +9,7 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.*;
+import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen;
 import net.minecraft.item.ItemStack;
 import net.minecraft.recipe.Recipe;
 import net.minecraft.recipe.RecipeManager;
@@ -40,6 +41,7 @@ public class RecipeHelperImpl implements RecipeHelper {
     
     private final List<AutoCraftingHandler> autoCraftingHandlers = Lists.newArrayList();
     private final List<RecipeFunction> recipeFunctions = Lists.newArrayList();
+    private final List<ScreenClickArea> screenClickAreas = Lists.newArrayList();
     private final AtomicInteger recipeCount = new AtomicInteger();
     private final Map<Identifier, List<RecipeDisplay>> recipeCategoryListMap = Maps.newHashMap();
     private final List<RecipeCategory> categories = Lists.newArrayList();
@@ -140,7 +142,8 @@ public class RecipeHelperImpl implements RecipeHelper {
         return recipeCategoryListMap;
     }
     
-    private RecipeCategory getCategory(Identifier identifier) {
+    @Override
+    public RecipeCategory getCategory(Identifier identifier) {
         return categories.stream().filter(category -> category.getIdentifier().equals(identifier)).findFirst().orElse(null);
     }
     
@@ -217,6 +220,7 @@ public class RecipeHelperImpl implements RecipeHelper {
         this.recipeCategoryListMap.clear();
         this.categories.clear();
         this.speedCraftAreaSupplierMap.clear();
+        this.screenClickAreas.clear();
         this.categoryWorkingStations.clear();
         this.recipeFunctions.clear();
         this.displayVisibilityHandlers.clear();
@@ -360,6 +364,11 @@ public class RecipeHelperImpl implements RecipeHelper {
         return true;
     }
     
+    @Override
+    public void registerScreenClickArea(Rectangle rectangle, Class<? extends AbstractContainerScreen> screenClass, Identifier... categories) {
+        this.screenClickAreas.add(new ScreenClickArea(screenClass, rectangle, categories));
+    }
+    
     @Override
     public <T extends Recipe<?>> void registerRecipes(Identifier category, Class<T> recipeClass, Function<T, RecipeDisplay> mappingFunction) {
         recipeFunctions.add(new RecipeFunction(category, recipe -> recipeClass.isAssignableFrom(recipe.getClass()), mappingFunction));
@@ -380,6 +389,35 @@ public class RecipeHelperImpl implements RecipeHelper {
         liveRecipeGenerators.add(liveRecipeGenerator);
     }
     
+    @Override
+    public List<ScreenClickArea> getScreenClickAreas() {
+        return screenClickAreas;
+    }
+    
+    public class ScreenClickArea {
+        Class<? extends AbstractContainerScreen> screenClass;
+        Rectangle rectangle;
+        Identifier[] categories;
+        
+        private ScreenClickArea(Class<? extends AbstractContainerScreen> screenClass, Rectangle rectangle, Identifier[] categories) {
+            this.screenClass = screenClass;
+            this.rectangle = rectangle;
+            this.categories = categories;
+        }
+        
+        public Class<? extends AbstractContainerScreen> getScreenClass() {
+            return screenClass;
+        }
+        
+        public Rectangle getRectangle() {
+            return rectangle;
+        }
+        
+        public Identifier[] getCategories() {
+            return categories;
+        }
+    }
+    
     private class RecipeFunction {
         Identifier category;
         Predicate<Recipe> recipeFilter;

+ 24 - 2
src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java

@@ -11,6 +11,8 @@ import me.shedaniel.cloth.api.ClientUtils;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.ClientHelper;
 import me.shedaniel.rei.api.DisplayHelper;
+import me.shedaniel.rei.api.RecipeHelper;
+import me.shedaniel.rei.client.RecipeHelperImpl;
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.client.Weather;
 import me.shedaniel.rei.gui.widget.*;
@@ -351,7 +353,7 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra
             init(true);
         else if (RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() && (!hasSameListContent(new LinkedList<>(ScreenHelper.inventoryStacks), currentStacks) || (currentStacks.size() != ScreenHelper.inventoryStacks.size()))) {
             ScreenHelper.inventoryStacks = ClientHelper.getInstance().getInventoryItemsTypes();
-            DisplayHelper.DisplayBoundsHandler boundsHandler = RoughlyEnoughItemsCore.getDisplayHelper().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
+            DisplayHelper.DisplayBoundsHandler<?> boundsHandler = RoughlyEnoughItemsCore.getDisplayHelper().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
             itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true);
         }
         if (MinecraftClient.getInstance().currentScreen instanceof AbstractContainerScreen && SearchFieldWidget.isSearching) {
@@ -359,7 +361,7 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra
             blitOffset = 200;
             ContainerScreenHooks hooks = (ContainerScreenHooks) MinecraftClient.getInstance().currentScreen;
             int left = hooks.rei_getContainerLeft(), top = hooks.rei_getContainerTop();
-            for(Slot slot : ((AbstractContainerScreen) MinecraftClient.getInstance().currentScreen).getContainer().slotList)
+            for(Slot slot : ((AbstractContainerScreen<?>) MinecraftClient.getInstance().currentScreen).getContainer().slotList)
                 if (!slot.hasStack() || !itemListOverlay.filterItem(slot.getStack(), itemListOverlay.getLastSearchArgument()))
                     fillGradient(left + slot.xPosition, top + slot.yPosition, left + slot.xPosition + 16, top + slot.yPosition + 16, -601874400, -601874400);
             blitOffset = 0;
@@ -367,6 +369,16 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra
         GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         GuiLighting.disable();
         this.renderWidgets(mouseX, mouseY, delta);
+        if (MinecraftClient.getInstance().currentScreen instanceof AbstractContainerScreen) {
+            ContainerScreenHooks hooks = (ContainerScreenHooks) MinecraftClient.getInstance().currentScreen;
+            for(RecipeHelperImpl.ScreenClickArea area : RecipeHelper.getInstance().getScreenClickAreas())
+                if (area.getScreenClass().equals(MinecraftClient.getInstance().currentScreen.getClass()))
+                    if (area.getRectangle().contains(mouseX - hooks.rei_getContainerLeft(), mouseY - hooks.rei_getContainerTop())) {
+                        String collect = Arrays.asList(area.getCategories()).stream().map(identifier -> RecipeHelper.getInstance().getCategory(identifier).getCategoryName()).collect(Collectors.joining(", "));
+                        QUEUED_TOOLTIPS.add(QueuedTooltip.create(I18n.translate("text.rei.view_recipes_for", collect)));
+                        break;
+                    }
+        }
     }
     
     public void lateRender(int mouseX, int mouseY, float delta) {
@@ -510,6 +522,16 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra
     public boolean mouseClicked(double double_1, double double_2, int int_1) {
         if (!ScreenHelper.isOverlayVisible())
             return false;
+        if (MinecraftClient.getInstance().currentScreen instanceof AbstractContainerScreen) {
+            ContainerScreenHooks hooks = (ContainerScreenHooks) MinecraftClient.getInstance().currentScreen;
+            for(RecipeHelperImpl.ScreenClickArea area : RecipeHelper.getInstance().getScreenClickAreas())
+                if (area.getScreenClass().equals(MinecraftClient.getInstance().currentScreen.getClass()))
+                    if (area.getRectangle().contains(double_1 - hooks.rei_getContainerLeft(), double_2 - hooks.rei_getContainerTop())) {
+                        ClientHelper.getInstance().executeViewAllRecipesFromCategories(Arrays.asList(area.getCategories()));
+                        MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F));
+                        return true;
+                    }
+        }
         for(Element element : widgets)
             if (element.mouseClicked(double_1, double_2, int_1)) {
                 this.setFocused(element);

+ 1 - 1
src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java

@@ -13,7 +13,7 @@ import me.shedaniel.cloth.api.ClientUtils;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.*;
 import me.shedaniel.rei.client.ScreenHelper;
-import me.shedaniel.rei.gui.renderables.RecipeRenderer;
+import me.shedaniel.rei.gui.renderers.RecipeRenderer;
 import me.shedaniel.rei.gui.widget.*;
 import net.minecraft.ChatFormat;
 import net.minecraft.client.MinecraftClient;

+ 1 - 1
src/main/java/me/shedaniel/rei/gui/renderables/EmptyRenderer.java → src/main/java/me/shedaniel/rei/gui/renderers/EmptyRenderer.java

@@ -3,7 +3,7 @@
  * Licensed under the MIT License.
  */
 
-package me.shedaniel.rei.gui.renderables;
+package me.shedaniel.rei.gui.renderers;
 
 import me.shedaniel.rei.api.Renderer;
 

+ 1 - 1
src/main/java/me/shedaniel/rei/gui/renderables/ItemStackRenderer.java → src/main/java/me/shedaniel/rei/gui/renderers/ItemStackRenderer.java

@@ -3,7 +3,7 @@
  * Licensed under the MIT License.
  */
 
-package me.shedaniel.rei.gui.renderables;
+package me.shedaniel.rei.gui.renderers;
 
 import com.google.common.collect.Lists;
 import com.mojang.blaze3d.platform.GlStateManager;

+ 1 - 1
src/main/java/me/shedaniel/rei/gui/renderables/RecipeRenderer.java → src/main/java/me/shedaniel/rei/gui/renderers/RecipeRenderer.java

@@ -3,7 +3,7 @@
  * Licensed under the MIT License.
  */
 
-package me.shedaniel.rei.gui.renderables;
+package me.shedaniel.rei.gui.renderers;
 
 import me.shedaniel.rei.api.Renderer;
 

+ 1 - 1
src/main/java/me/shedaniel/rei/gui/renderables/SimpleRecipeRenderer.java → src/main/java/me/shedaniel/rei/gui/renderers/SimpleRecipeRenderer.java

@@ -3,7 +3,7 @@
  * Licensed under the MIT License.
  */
 
-package me.shedaniel.rei.gui.renderables;
+package me.shedaniel.rei.gui.renderers;
 
 import com.google.common.collect.Lists;
 import me.shedaniel.rei.api.Renderer;

+ 1 - 1
src/main/java/me/shedaniel/rei/gui/widget/SlotWidget.java

@@ -12,7 +12,7 @@ import me.shedaniel.rei.api.ClientHelper;
 import me.shedaniel.rei.api.Renderer;
 import me.shedaniel.rei.client.ClientHelperImpl;
 import me.shedaniel.rei.client.ScreenHelper;
-import me.shedaniel.rei.gui.renderables.ItemStackRenderer;
+import me.shedaniel.rei.gui.renderers.ItemStackRenderer;
 import net.minecraft.client.gui.Element;
 import net.minecraft.item.ItemStack;
 import net.minecraft.util.Identifier;

+ 7 - 3
src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java

@@ -32,9 +32,7 @@ import me.shedaniel.rei.plugin.stonecutting.DefaultStoneCuttingCategory;
 import me.shedaniel.rei.plugin.stonecutting.DefaultStoneCuttingDisplay;
 import net.minecraft.block.ComposterBlock;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen;
-import net.minecraft.client.gui.screen.ingame.AbstractInventoryScreen;
-import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
+import net.minecraft.client.gui.screen.ingame.*;
 import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider;
 import net.minecraft.enchantment.Enchantment;
 import net.minecraft.enchantment.EnchantmentHelper;
@@ -277,6 +275,12 @@ public class DefaultPlugin implements REIPluginEntry {
         recipeHelper.registerWorkingStations(COMPOSTING, new ItemStack(Items.COMPOSTER));
         recipeHelper.registerSpeedCraftButtonArea(COMPOSTING, bounds -> null);
         recipeHelper.registerSpeedCraftButtonArea(DefaultPlugin.CAMPFIRE, bounds -> new Rectangle((int) bounds.getMaxX() - 16, bounds.y + 6, 10, 10));
+        recipeHelper.registerScreenClickArea(new Rectangle(88, 32, 28, 23), CraftingTableScreen.class, CRAFTING);
+        recipeHelper.registerScreenClickArea(new Rectangle(137, 29, 10, 13), InventoryScreen.class, CRAFTING);
+        recipeHelper.registerScreenClickArea(new Rectangle(97, 16, 14, 30), BrewingStandScreen.class, BREWING);
+        recipeHelper.registerScreenClickArea(new Rectangle(78, 32, 28, 23), FurnaceScreen.class, SMELTING);
+        recipeHelper.registerScreenClickArea(new Rectangle(78, 32, 28, 23), SmokerScreen.class, SMOKING);
+        recipeHelper.registerScreenClickArea(new Rectangle(78, 32, 28, 23), BlastFurnaceScreen.class, BLASTING);
     }
     
     @Override

+ 1 - 1
src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingCategory.java

@@ -8,7 +8,7 @@ package me.shedaniel.rei.plugin.blasting;
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.RecipeCategory;
 import me.shedaniel.rei.api.Renderer;
-import me.shedaniel.rei.gui.renderables.RecipeRenderer;
+import me.shedaniel.rei.gui.renderers.RecipeRenderer;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
 import me.shedaniel.rei.gui.widget.SlotWidget;
 import me.shedaniel.rei.gui.widget.Widget;

+ 1 - 1
src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingCategory.java

@@ -9,7 +9,7 @@ import com.google.common.collect.Lists;
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.RecipeCategory;
 import me.shedaniel.rei.api.Renderer;
-import me.shedaniel.rei.gui.renderables.RecipeRenderer;
+import me.shedaniel.rei.gui.renderers.RecipeRenderer;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
 import me.shedaniel.rei.gui.widget.SlotWidget;
 import me.shedaniel.rei.gui.widget.Widget;

+ 1 - 1
src/main/java/me/shedaniel/rei/plugin/smelting/DefaultSmeltingCategory.java

@@ -8,7 +8,7 @@ package me.shedaniel.rei.plugin.smelting;
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.RecipeCategory;
 import me.shedaniel.rei.api.Renderer;
-import me.shedaniel.rei.gui.renderables.RecipeRenderer;
+import me.shedaniel.rei.gui.renderers.RecipeRenderer;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
 import me.shedaniel.rei.gui.widget.SlotWidget;
 import me.shedaniel.rei.gui.widget.Widget;

+ 1 - 1
src/main/java/me/shedaniel/rei/plugin/smoking/DefaultSmokingCategory.java

@@ -8,7 +8,7 @@ package me.shedaniel.rei.plugin.smoking;
 import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.rei.api.RecipeCategory;
 import me.shedaniel.rei.api.Renderer;
-import me.shedaniel.rei.gui.renderables.RecipeRenderer;
+import me.shedaniel.rei.gui.renderers.RecipeRenderer;
 import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
 import me.shedaniel.rei.gui.widget.SlotWidget;
 import me.shedaniel.rei.gui.widget.Widget;

+ 1 - 0
src/main/resources/assets/roughlyenoughitems/lang/en_us.json

@@ -108,6 +108,7 @@
   "text.rei.config.register_in_other_thread": "Register Recipes in other thread:",
   "text.rei.recipe_screen_type.selection": "Recipe Screen Type Selection",
   "text.rei.recipe_screen_type.selection.sub": "You can always edit this setting again via the config screen.",
+  "text.rei.view_recipes_for": "View Recipes for %s",
   "_comment": "Config Tooltips",
   "tooltip.rei.config.side_search_box": "Declares the location of the search field:\nYes: Left / Right\nNo: Center\n \nDefaulted: No",
   "tooltip.rei.config.list_ordering": "Declares the ordering of the side item list:\nValues: Registry / Name / Item Groups\n(Ascending / Descending)\n \nDefaulted: %s",