aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2020-01-11 00:34:07 +0800
committershedaniel <daniel@shedaniel.me>2020-01-11 00:34:07 +0800
commita855c0284c3b285dd8a71b57ec35702995ae5b30 (patch)
tree4b2876163d99301960a26ff821aff5c97e3fb02e /src/main
parentbde33221f4e4732daafdc9ecd3a0e559c1f74ed2 (diff)
downloadRoughlyEnoughItems-a855c0284c3b285dd8a71b57ec35702995ae5b30.tar.gz
RoughlyEnoughItems-a855c0284c3b285dd8a71b57ec35702995ae5b30.tar.bz2
RoughlyEnoughItems-a855c0284c3b285dd8a71b57ec35702995ae5b30.zip
3.3.7
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/me/shedaniel/rei/api/RecipeCategory.java1
-rw-r--r--src/main/java/me/shedaniel/rei/api/RecipeHelper.java6
-rw-r--r--src/main/java/me/shedaniel/rei/gui/entries/RecipeEntry.java104
-rw-r--r--src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java138
-rw-r--r--src/main/java/me/shedaniel/rei/impl/RenderingEntry.java112
-rw-r--r--src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java29
-rw-r--r--src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingCategory.java1
-rw-r--r--src/main/java/me/shedaniel/rei/plugin/information/DefaultInformationCategory.java275
-rw-r--r--src/main/java/me/shedaniel/rei/plugin/information/DefaultInformationDisplay.java75
-rw-r--r--src/main/java/me/shedaniel/rei/utils/CollectionUtils.java8
-rwxr-xr-xsrc/main/resources/assets/roughlyenoughitems/lang/en_us.json1
-rw-r--r--src/main/resources/assets/roughlyenoughitems/textures/gui/display.pngbin10151 -> 11200 bytes
-rw-r--r--src/main/resources/assets/roughlyenoughitems/textures/gui/display_dark.pngbin8722 -> 9896 bytes
-rwxr-xr-xsrc/main/resources/fabric.mod.json24
14 files changed, 596 insertions, 178 deletions
diff --git a/src/main/java/me/shedaniel/rei/api/RecipeCategory.java b/src/main/java/me/shedaniel/rei/api/RecipeCategory.java
index fb3ec0866..fea0cf166 100644
--- a/src/main/java/me/shedaniel/rei/api/RecipeCategory.java
+++ b/src/main/java/me/shedaniel/rei/api/RecipeCategory.java
@@ -121,7 +121,6 @@ public interface RecipeCategory<T extends RecipeDisplay> {
*
* @return the amount of recipes, returns -1 if not fixed
*/
- @Deprecated
default int getFixedRecipesPerPage() {
return -1;
}
diff --git a/src/main/java/me/shedaniel/rei/api/RecipeHelper.java b/src/main/java/me/shedaniel/rei/api/RecipeHelper.java
index 448f00d9e..9c50febba 100644
--- a/src/main/java/me/shedaniel/rei/api/RecipeHelper.java
+++ b/src/main/java/me/shedaniel/rei/api/RecipeHelper.java
@@ -178,7 +178,11 @@ public interface RecipeHelper {
* @deprecated {@link RecipeHelper#isDisplayVisible(RecipeDisplay)} )}
*/
@Deprecated
- boolean isDisplayVisible(RecipeDisplay display, boolean respectConfig);
+ default boolean isDisplayVisible(RecipeDisplay display, boolean respectConfig) {
+ return isDisplayVisible(display);
+ }
+
+ boolean isDisplayNotVisible(RecipeDisplay display);
/**
* Checks if the display is visible by asking recipe visibility handlers
diff --git a/src/main/java/me/shedaniel/rei/gui/entries/RecipeEntry.java b/src/main/java/me/shedaniel/rei/gui/entries/RecipeEntry.java
index 0361c2ba5..42e93f467 100644
--- a/src/main/java/me/shedaniel/rei/gui/entries/RecipeEntry.java
+++ b/src/main/java/me/shedaniel/rei/gui/entries/RecipeEntry.java
@@ -5,107 +5,11 @@
package me.shedaniel.rei.gui.entries;
-import me.shedaniel.rei.api.EntryStack;
-import net.minecraft.client.gui.DrawableHelper;
-import net.minecraft.util.Identifier;
+import me.shedaniel.rei.gui.widget.QueuedTooltip;
+import me.shedaniel.rei.impl.RenderingEntry;
-import java.util.Optional;
-
-public abstract class RecipeEntry extends DrawableHelper implements EntryStack {
- @Override
- public Optional<Identifier> getIdentifier() {
- return Optional.empty();
- }
-
- @Override
- public Type getType() {
- return Type.RENDER;
- }
-
- @Override
- public int getAmount() {
- return 0;
- }
-
- @Override
- public void setAmount(int amount) {
-
- }
-
- @Override
- public boolean isEmpty() {
- return false;
- }
-
- @Override
- public EntryStack copy() {
- return this;
- }
-
- @Override
- public Object getObject() {
- return null;
- }
-
- @Override
- public boolean equals(EntryStack stack, boolean ignoreTags, boolean ignoreAmount) {
- return stack == this;
- }
-
- @Override
- public boolean equalsIgnoreTagsAndAmount(EntryStack stack) {
- return stack == this;
- }
-
- @Override
- public boolean equalsIgnoreTags(EntryStack stack) {
- return stack == this;
- }
-
- @Override
- public boolean equalsIgnoreAmount(EntryStack stack) {
- return stack == this;
- }
-
- @Override
- public boolean equalsAll(EntryStack stack) {
- return stack == this;
- }
-
- @Override
- public int getZ() {
- return getBlitOffset();
- }
-
- @Override
- public void setZ(int z) {
- setBlitOffset(z);
- }
-
- @Override
- public <T> EntryStack setting(Settings<T> settings, T value) {
- return this;
- }
-
- @Override
- public <T> EntryStack removeSetting(Settings<T> settings) {
- return this;
- }
-
- @Override
- public EntryStack clearSettings() {
- return this;
- }
-
- @Override
- public <T> EntryStack addSetting(Settings<T> settings, T value) {
- return this;
- }
-
- @Override
- public <T> T get(Settings<T> settings) {
- return settings.getDefaultValue();
- }
+public abstract class RecipeEntry extends RenderingEntry {
+ public abstract QueuedTooltip getTooltip(int mouseX, int mouseY);
public abstract int getHeight();
diff --git a/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java b/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java
index af2d66637..898d82fbc 100644
--- a/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java
+++ b/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java
@@ -46,7 +46,8 @@ public class RecipeHelperImpl implements RecipeHelper {
private final List<ScreenClickArea> screenClickAreas = Lists.newLinkedList();
private final int[] recipeCount = {0};
private final Map<Identifier, List<RecipeDisplay>> recipeCategoryListMap = Maps.newLinkedHashMap();
- private final List<RecipeCategory<?>> categories = Lists.newLinkedList();
+ private final Map<RecipeCategory<?>, Identifier> categories = Maps.newLinkedHashMap();
+ private final Map<Identifier, RecipeCategory<?>> reversedCategories = Maps.newHashMap();
private final Map<Identifier, ButtonAreaSupplier> autoCraftAreaSupplierMap = Maps.newLinkedHashMap();
private final Map<Identifier, List<List<EntryStack>>> categoryWorkingStations = Maps.newLinkedHashMap();
private final List<DisplayVisibilityHandler> displayVisibilityHandlers = Lists.newLinkedList();
@@ -88,9 +89,10 @@ public class RecipeHelperImpl implements RecipeHelper {
@Override
public void registerCategory(RecipeCategory<?> category) {
- categories.add(category);
- recipeCategoryListMap.put(category.getIdentifier(), Lists.newLinkedList());
- categoryWorkingStations.put(category.getIdentifier(), Lists.newLinkedList());
+ categories.put(category, category.getIdentifier());
+ reversedCategories.put(category.getIdentifier(), category);
+ recipeCategoryListMap.put(category.getIdentifier(), Lists.newArrayList());
+ categoryWorkingStations.put(category.getIdentifier(), Lists.newArrayList());
}
@SafeVarargs
@@ -126,32 +128,40 @@ public class RecipeHelperImpl implements RecipeHelper {
@Override
public Map<RecipeCategory<?>, List<RecipeDisplay>> getRecipesFor(EntryStack stack) {
- Map<Identifier, List<RecipeDisplay>> categoriesMap = new HashMap<>();
- categories.forEach(f -> categoriesMap.put(f.getIdentifier(), Lists.newArrayList()));
- for (Map.Entry<Identifier, List<RecipeDisplay>> entry : recipeCategoryListMap.entrySet()) {
- RecipeCategory<?> category = getCategory(entry.getKey());
- for (RecipeDisplay recipeDisplay : entry.getValue())
- for (EntryStack outputStack : recipeDisplay.getOutputEntries())
- if (stack.equals(outputStack))
- categoriesMap.get(recipeDisplay.getRecipeCategory()).add(recipeDisplay);
+ Map<RecipeCategory<?>, List<RecipeDisplay>> result = Maps.newLinkedHashMap();
+ for (Map.Entry<RecipeCategory<?>, Identifier> entry : categories.entrySet()) {
+ RecipeCategory<?> category = entry.getKey();
+ Identifier categoryId = entry.getValue();
+ Set<RecipeDisplay> set = Sets.newLinkedHashSet();
+ for (RecipeDisplay display : recipeCategoryListMap.get(categoryId)) {
+ for (EntryStack outputStack : display.getOutputEntries())
+ if (stack.equals(outputStack) && isDisplayVisible(display)) {
+ set.add(display);
+ break;
+ }
+ }
+ if (!set.isEmpty())
+ CollectionUtils.getOrPutEmptyList(result, category).addAll(set);
}
for (LiveRecipeGenerator<RecipeDisplay> liveRecipeGenerator : liveRecipeGenerators) {
- liveRecipeGenerator.getRecipeFor(stack).ifPresent(o -> categoriesMap.get(liveRecipeGenerator.getCategoryIdentifier()).addAll(o));
+ RecipeCategory<?> category = getCategory(liveRecipeGenerator.getCategoryIdentifier());
+ Optional<List<RecipeDisplay>> recipeFor = liveRecipeGenerator.getRecipeFor(stack);
+ if (recipeFor.isPresent()) {
+ Set<RecipeDisplay> set = Sets.newLinkedHashSet();
+ for (RecipeDisplay display : recipeFor.get()) {
+ if (isDisplayVisible(display))
+ set.add(display);
+ }
+ if (!set.isEmpty())
+ CollectionUtils.getOrPutEmptyList(result, category).addAll(set);
+ }
}
- Map<RecipeCategory<?>, List<RecipeDisplay>> recipeCategoryListMap = Maps.newLinkedHashMap();
- categories.forEach(category -> {
- if (categoriesMap.containsKey(category.getIdentifier()) && !categoriesMap.get(category.getIdentifier()).isEmpty())
- recipeCategoryListMap.put(category, categoriesMap.get(category.getIdentifier()).stream().filter(this::isDisplayVisible).collect(Collectors.toList()));
- });
- for (RecipeCategory<?> category : Lists.newArrayList(recipeCategoryListMap.keySet()))
- if (recipeCategoryListMap.get(category).isEmpty())
- recipeCategoryListMap.remove(category);
- return recipeCategoryListMap;
+ return result;
}
@Override
public RecipeCategory<?> getCategory(Identifier identifier) {
- return CollectionUtils.findFirstOrNull(categories, category -> category.getIdentifier().equals(identifier));
+ return reversedCategories.get(identifier);
}
@Override
@@ -171,44 +181,48 @@ public class RecipeHelperImpl implements RecipeHelper {
@Override
public Map<RecipeCategory<?>, List<RecipeDisplay>> getUsagesFor(EntryStack stack) {
- Map<Identifier, Set<RecipeDisplay>> categoriesMap = new HashMap<>();
- categories.forEach(f -> categoriesMap.put(f.getIdentifier(), Sets.newLinkedHashSet()));
- for (Map.Entry<Identifier, List<RecipeDisplay>> entry : recipeCategoryListMap.entrySet()) {
- boolean isWorkstationCategory = isStackWorkStationOfCategory(entry.getKey(), stack);
- for (RecipeDisplay recipeDisplay : entry.getValue()) {
+ Map<RecipeCategory<?>, List<RecipeDisplay>> result = Maps.newLinkedHashMap();
+ for (Map.Entry<RecipeCategory<?>, Identifier> entry : categories.entrySet()) {
+ Set<RecipeDisplay> set = Sets.newLinkedHashSet();
+ RecipeCategory<?> category = entry.getKey();
+ Identifier categoryId = entry.getValue();
+ for (RecipeDisplay display : recipeCategoryListMap.get(categoryId)) {
back:
- for (List<EntryStack> input : recipeDisplay.getInputEntries()) {
+ for (List<EntryStack> input : display.getInputEntries()) {
for (EntryStack otherEntry : input) {
if (otherEntry.equals(stack)) {
- categoriesMap.get(recipeDisplay.getRecipeCategory()).add(recipeDisplay);
+ if (isDisplayVisible(display))
+ set.add(display);
break back;
}
}
}
}
- if (isWorkstationCategory) {
- for (RecipeDisplay recipeDisplay : entry.getValue()) {
- categoriesMap.get(recipeDisplay.getRecipeCategory()).add(recipeDisplay);
- }
+ if (isStackWorkStationOfCategory(categoryId, stack)) {
+ set.addAll(recipeCategoryListMap.get(categoryId));
}
+ if (!set.isEmpty())
+ CollectionUtils.getOrPutEmptyList(result, category).addAll(set);
}
for (LiveRecipeGenerator<RecipeDisplay> liveRecipeGenerator : liveRecipeGenerators) {
- liveRecipeGenerator.getUsageFor(stack).ifPresent(o -> categoriesMap.get(liveRecipeGenerator.getCategoryIdentifier()).addAll(o));
- }
- Map<RecipeCategory<?>, List<RecipeDisplay>> recipeCategoryListMap = Maps.newLinkedHashMap();
- for (RecipeCategory<?> category : categories) {
- if (categoriesMap.containsKey(category.getIdentifier()) && !categoriesMap.get(category.getIdentifier()).isEmpty())
- recipeCategoryListMap.put(category, CollectionUtils.filterSetToList(categoriesMap.get(category.getIdentifier()), this::isDisplayVisible));
+ RecipeCategory<?> category = getCategory(liveRecipeGenerator.getCategoryIdentifier());
+ Optional<List<RecipeDisplay>> recipeFor = liveRecipeGenerator.getUsageFor(stack);
+ if (recipeFor.isPresent()) {
+ Set<RecipeDisplay> set = Sets.newLinkedHashSet();
+ for (RecipeDisplay display : recipeFor.get()) {
+ if (isDisplayVisible(display))
+ set.add(display);
+ }
+ if (!set.isEmpty())
+ CollectionUtils.getOrPutEmptyList(result, category).addAll(set);
+ }
}
- for (RecipeCategory<?> category : Lists.newArrayList(recipeCategoryListMap.keySet()))
- if (recipeCategoryListMap.get(category).isEmpty())
- recipeCategoryListMap.remove(category);
- return recipeCategoryListMap;
+ return result;
}
@Override
public List<RecipeCategory<?>> getAllCategories() {
- return Collections.unmodifiableList(categories);
+ return Lists.newArrayList(categories.keySet());
}
@Override
@@ -234,6 +248,7 @@ public class RecipeHelperImpl implements RecipeHelper {
this.recipeManager = recipeManager;
this.recipeCategoryListMap.clear();
this.categories.clear();
+ this.reversedCategories.clear();
this.autoCraftAreaSupplierMap.clear();
this.screenClickAreas.clear();
this.categoryWorkingStations.clear();
@@ -331,8 +346,9 @@ public class RecipeHelperImpl implements RecipeHelper {
((DisplayHelperImpl) DisplayHelper.getInstance()).resetCache();
ScreenHelper.getOptionalOverlay().ifPresent(overlay -> overlay.shouldReInit = true);
+ displayVisibilityHandlers.sort(VISIBILITY_HANDLER_COMPARATOR);
long usedTime = System.currentTimeMillis() - startTime;
- RoughlyEnoughItemsCore.LOGGER.info("[REI] Registered %d stack entries, %d recipes displays, %d exclusion zones suppliers, %d bounds handler, %d visibility handlers and %d categories (%s) in %d ms.", EntryRegistry.getInstance().getStacksList().size(), recipeCount[0], DisplayHelper.getInstance().getBaseBoundsHandler().supplierSize(), DisplayHelper.getInstance().getAllBoundsHandlers().size(), getDisplayVisibilityHandlers().size(), categories.size(), categories.stream().map(RecipeCategory::getCategoryName).collect(Collectors.joining(", ")), usedTime);
+ RoughlyEnoughItemsCore.LOGGER.info("[REI] Registered %d stack entries, %d recipes displays, %d exclusion zones suppliers, %d bounds handler, %d visibility handlers and %d categories (%s) in %d ms.", EntryRegistry.getInstance().getStacksList().size(), recipeCount[0], DisplayHelper.getInstance().getBaseBoundsHandler().supplierSize(), DisplayHelper.getInstance().getAllBoundsHandlers().size(), getDisplayVisibilityHandlers().size(), categories.size(), categories.keySet().stream().map(RecipeCategory::getCategoryName).collect(Collectors.joining(", ")), usedTime);
}
@Override
@@ -359,15 +375,18 @@ public class RecipeHelperImpl implements RecipeHelper {
@Override
public Map<RecipeCategory<?>, List<RecipeDisplay>> getAllRecipes() {
- Map<RecipeCategory<?>, List<RecipeDisplay>> map = Maps.newLinkedHashMap();
- for (RecipeCategory<?> recipeCategory : categories) {
- if (recipeCategoryListMap.containsKey(recipeCategory.getIdentifier())) {
- List<RecipeDisplay> list = CollectionUtils.filter(recipeCategoryListMap.get(recipeCategory.getIdentifier()), this::isDisplayVisible);
- if (!list.isEmpty())
- map.put(recipeCategory, list);
+ Map<RecipeCategory<?>, List<RecipeDisplay>> result = Maps.newLinkedHashMap();
+ for (Map.Entry<RecipeCategory<?>, Identifier> entry : categories.entrySet()) {
+ RecipeCategory<?> category = entry.getKey();
+ Identifier categoryId = entry.getValue();
+ List<RecipeDisplay> displays = recipeCategoryListMap.get(categoryId);
+ if (displays != null) {
+ displays.removeIf(this::isDisplayNotVisible);
+ if (!displays.isEmpty())
+ result.put(category, Lists.newArrayList(displays));
}
}
- return map;
+ return result;
}
@Override
@@ -391,22 +410,21 @@ public class RecipeHelperImpl implements RecipeHelper {
}
@Override
- public boolean isDisplayVisible(RecipeDisplay display, boolean respectConfig) {
- return isDisplayVisible(display);
+ public boolean isDisplayNotVisible(RecipeDisplay display) {
+ return !isDisplayVisible(display);
}
@Override
public boolean isDisplayVisible(RecipeDisplay display) {
RecipeCategory<?> category = getCategory(display.getRecipeCategory());
- List<DisplayVisibilityHandler> list = getDisplayVisibilityHandlers().stream().sorted(VISIBILITY_HANDLER_COMPARATOR).collect(Collectors.toList());
- for (DisplayVisibilityHandler displayVisibilityHandler : list) {
- try {
+ try {
+ for (DisplayVisibilityHandler displayVisibilityHandler : displayVisibilityHandlers) {
ActionResult visibility = displayVisibilityHandler.handleDisplay(category, display);
if (visibility != ActionResult.PASS)
return visibility == ActionResult.SUCCESS;
- } catch (Throwable throwable) {
- RoughlyEnoughItemsCore.LOGGER.error("[REI] Failed to check if the recipe is visible!", throwable);
}
+ } catch (Throwable throwable) {
+ RoughlyEnoughItemsCore.LOGGER.error("[REI] Failed to check if the recipe is visible!", throwable);
}
return true;
}
diff --git a/src/main/java/me/shedaniel/rei/impl/RenderingEntry.java b/src/main/java/me/shedaniel/rei/impl/RenderingEntry.java
new file mode 100644
index 000000000..766b9f193
--- /dev/null
+++ b/src/main/java/me/shedaniel/rei/impl/RenderingEntry.java
@@ -0,0 +1,112 @@
+package me.shedaniel.rei.impl;
+
+import me.shedaniel.rei.api.EntryStack;
+import me.shedaniel.rei.gui.widget.QueuedTooltip;
+import net.minecraft.client.gui.DrawableHelper;
+import net.minecraft.util.Identifier;
+
+import javax.annotation.Nullable;
+import java.util.Optional;
+
+public abstract class RenderingEntry extends DrawableHelper implements EntryStack {
+ @Override
+ public Optional<Identifier> getIdentifier() {
+ return Optional.empty();
+ }
+
+ @Override
+ public Type getType() {
+ return Type.RENDER;
+ }
+
+ @Override
+ public int getAmount() {
+ return 0;
+ }
+
+ @Override
+ public void setAmount(int amount) {
+
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return false;
+ }
+
+ @Override
+ public EntryStack copy() {
+ return this;
+ }
+
+ @Override
+ public Object getObject() {
+ return null;
+ }
+
+ @Override
+ public boolean equals(EntryStack stack, boolean ignoreTags, boolean ignoreAmount) {
+ return stack == this;
+ }
+
+ @Override
+ public boolean equalsIgnoreTagsAndAmount(EntryStack stack) {
+ return stack == this;
+ }
+
+ @Override
+ public boolean equalsIgnoreTags(EntryStack stack) {
+ return stack == this;
+ }
+
+ @Override
+ public boolean equalsIgnoreAmount(EntryStack stack) {
+ return stack == this;
+ }
+
+ @Override
+ public boolean equalsAll(EntryStack stack) {
+ return stack == this;
+ }
+
+ @Override
+ public int getZ() {
+ return getBlitOffset();
+ }
+
+ @Override
+ public void setZ(int z) {
+ setBlitOffset(z);
+ }
+
+ @Override
+ public <T> EntryStack setting(Settings<T> settings, T value) {
+ return this;
+ }
+
+ @Override
+ public <T> EntryStack removeSetting(Settings<T> settings) {
+ return this;
+ }
+
+ @Override
+ public EntryStack clearSettings() {
+ return this;
+ }
+
+ @Override
+ public <T> EntryStack addSetting(Settings<T> settings, T value) {
+ return this;
+ }
+
+ @Override
+ public <T> T get(Settings<T> settings) {
+ return settings.getDefaultValue();
+ }
+
+ @Nullable
+ @Override
+ public QueuedTooltip getTooltip(int mouseX, int mouseY) {
+ return null;
+ }
+}
diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java
index 5513b2fe8..0f04e72d0 100644
--- a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java
+++ b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java
@@ -30,6 +30,8 @@ import me.shedaniel.rei.plugin.crafting.DefaultShapedDisplay;
import me.shedaniel.rei.plugin.crafting.DefaultShapelessDisplay;
import me.shedaniel.rei.plugin.fuel.DefaultFuelCategory;
import me.shedaniel.rei.plugin.fuel.DefaultFuelDisplay;
+import me.shedaniel.rei.plugin.information.DefaultInformationCategory;
+import me.shedaniel.rei.plugin.information.DefaultInformationDisplay;
import me.shedaniel.rei.plugin.smelting.DefaultSmeltingDisplay;
import me.shedaniel.rei.plugin.smoking.DefaultSmokingDisplay;
import me.shedaniel.rei.plugin.stonecutting.DefaultStoneCuttingCategory;
@@ -69,9 +71,11 @@ public class DefaultPlugin implements REIPluginV0 {
public static final Identifier PLUGIN = new Identifier("roughlyenoughitems", "default_plugin");
public static final Identifier COMPOSTING = new Identifier("minecraft", "plugins/composting");
public static final Identifier FUEL = new Identifier("minecraft", "plugins/fuel");
+ public static final Identifier INFO = new Identifier("roughlyenoughitems", "plugins/information");
private static final Identifier DISPLAY_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/display.png");
private static final Identifier DISPLAY_TEXTURE_DARK = new Identifier("roughlyenoughitems", "textures/gui/display_dark.png");
private static final List<DefaultBrewingDisplay> BREWING_DISPLAYS = Lists.newArrayList();
+ private static final List<DefaultInformationDisplay> INFO_DISPLAYS = Lists.newArrayList();
public static Identifier getDisplayTexture() {
return ScreenHelper.isDarkModeEnabled() ? DISPLAY_TEXTURE_DARK : DISPLAY_TEXTURE;
@@ -81,6 +85,10 @@ public class DefaultPlugin implements REIPluginV0 {
BREWING_DISPLAYS.add(display);
}
+ public static void registerInfoDisplay(DefaultInformationDisplay display) {
+ INFO_DISPLAYS.add(display);
+ }
+
@Override
public Identifier getPluginIdentifier() {
return PLUGIN;
@@ -92,6 +100,11 @@ public class DefaultPlugin implements REIPluginV0 {
}
@Override
+ public void preRegister() {
+ INFO_DISPLAYS.clear();
+ }
+
+ @Override
public void registerEntries(EntryRegistry entryRegistry) {
if (!ConfigObject.getInstance().isLoadingDefaultPlugin()) {
return;
@@ -149,6 +162,13 @@ public class DefaultPlugin implements REIPluginV0 {
if (!ConfigObject.getInstance().isLoadingDefaultPlugin()) {
return;
}
+ // DefaultPlugin.registerInfoDisplay(DefaultInformationDisplay.createFromEntry(EntryStack.create(Items.FURNACE), new LiteralText("Furnace Info"))
+ // .lines(new LiteralText("Furnace is a nice block, crafted using 8 cobblestone."),
+ // new LiteralText("An amazing tool to burn lil taters."),
+ // new LiteralText("Now available in a store next to you."),
+ // new LiteralText("Now with 60% off for an limited time!"),
+ // new LiteralText("Get it with coupon code: ").append(new LiteralText("TATERS").formatted(Formatting.BOLD))
+ // ));
recipeHelper.registerRecipes(CRAFTING, ShapelessRecipe.class, DefaultShapelessDisplay::new);
recipeHelper.registerRecipes(CRAFTING, ShapedRecipe.class, DefaultShapedDisplay::new);
recipeHelper.registerRecipes(SMELTING, SmeltingRecipe.class, DefaultSmeltingDisplay::new);
@@ -186,9 +206,7 @@ public class DefaultPlugin implements REIPluginV0 {
map.put(entry.getKey(), entry.getFloatValue());
}
List<ItemConvertible> stacks = new LinkedList<>(map.keySet());
- stacks.sort((first, second) -> {
- return (int) ((map.get(first) - map.get(second)) * 100);
- });
+ stacks.sort((first, second) -> (int) ((map.get(first) - map.get(second)) * 100));
for (int i = 0; i < stacks.size(); i += MathHelper.clamp(48, 1, stacks.size() - i)) {
List<ItemConvertible> thisStacks = Lists.newArrayList();
for (int j = i; j < i + 48; j++)
@@ -203,6 +221,10 @@ public class DefaultPlugin implements REIPluginV0 {
@Override
public void postRegister() {
+ RecipeHelper.getInstance().registerCategory(new DefaultInformationCategory());
+ for (DefaultInformationDisplay display : INFO_DISPLAYS) {
+ RecipeHelper.getInstance().registerDisplay(INFO, display);
+ }
// Sit tight! This will be a fast journey!
long time = System.currentTimeMillis();
for (EntryStack stack : EntryRegistry.getInstance().getStacksList())
@@ -321,6 +343,7 @@ public class DefaultPlugin implements REIPluginV0 {
recipeHelper.registerWorkingStations(COMPOSTING, EntryStack.create(Items.COMPOSTER));
recipeHelper.removeAutoCraftButton(FUEL);
recipeHelper.removeAutoCraftButton(COMPOSTING);
+ recipeHelper.removeAutoCraftButton(INFO);
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);
diff --git a/src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingCategory.java b/src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingCategory.java
index 96d3e2027..d427dc1a2 100644
--- a/src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingCategory.java
+++ b/src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingCategory.java
@@ -104,7 +104,6 @@ public class DefaultCompostingCategory implements RecipeCategory<DefaultComposti
return 140;
}
- @SuppressWarnings("deprecation")
@Override
public int getFixedRecipesPerPage() {
return 1;
diff --git a/src/main/java/me/shedaniel/rei/plugin/information/DefaultInformationCategory.java b/src/main/java/me/shedaniel/rei/plugin/information/DefaultInformationCategory.java
new file mode 100644
index 000000000..bb5095628
--- /dev/null
+++ b/src/main/java/me/shedaniel/rei/plugin/information/DefaultInformationCategory.java
@@ -0,0 +1,275 @@
+package me.shedaniel.rei.plugin.information;
+
+import com.google.common.collect.Lists;
+import com.mojang.blaze3d.systems.RenderSystem;
+import me.shedaniel.clothconfig2.ClothConfigInitializer;
+import me.shedaniel.clothconfig2.api.ScissorsHandler;
+import me.shedaniel.clothconfig2.gui.widget.DynamicEntryListWidget;
+import me.shedaniel.clothconfig2.gui.widget.DynamicNewSmoothScrollingEntryListWidget;
+import me.shedaniel.math.api.Point;
+import me.shedaniel.math.api.Rectangle;
+import me.shedaniel.math.impl.PointHelper;
+import me.shedaniel.rei.api.EntryStack;
+import me.shedaniel.rei.api.RecipeCategory;
+import me.shedaniel.rei.gui.entries.RecipeEntry;
+import me.shedaniel.rei.gui.widget.*;
+import me.shedaniel.rei.impl.RenderingEntry;
+import me.shedaniel.rei.impl.ScreenHelper;
+import me.shedaniel.rei.plugin.DefaultPlugin;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.Element;
+import net.minecraft.client.render.BufferBuilder;
+import net.minecraft.client.render.BufferRenderer;
+import net.minecraft.client.render.Tessellator;
+import net.minecraft.client.render.VertexFormats;
+import net.minecraft.client.resource.language.I18n;
+import net.minecraft.client.util.Texts;
+import net.minecraft.client.util.math.Matrix4f;
+import net.minecraft.text.Text;
+import net.minecraft.util.Identifier;
+import net.minecraft.util.math.MathHelper;
+
+import javax.annotation.Nullable;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Supplier;
+
+public class DefaultInformationCategory implements RecipeCategory<DefaultInformationDisplay> {
+ @Override
+ public Identifier getIdentifier() {
+ return DefaultPlugin.INFO;
+ }
+
+ @Override
+ public String getCategoryName() {
+ return I18n.translate("category.rei.information");
+ }
+
+ @Override
+ public RecipeEntry getSimpleRenderer(DefaultInformationDisplay recipe) {
+ Text name = recipe.getName();
+ return new RecipeEntry() {
+ @Override
+ public int getHeight() {
+ return 10 + MinecraftClient.getInstance().textRenderer.fontHeight;
+ }
+
+ @Nullable
+ @Override
+ public QueuedTooltip getTooltip(int mouseX, int mouseY) {
+ return null;
+ }
+
+ @Override
+ public void render(Rectangle rectangle, int mouseX, int mouseY, float delta) {
+ MinecraftClient.getInstance().textRenderer.draw(name.asFormattedString(), rectangle.x + 5, rectangle.y + 6, -1);
+ }
+ };
+ }
+
+ @Override
+ public EntryStack getLogo() {
+ return new RenderingEntry() {
+ @Override
+ public void render(Rectangle bounds, int mouseX, int mouseY, float delta) {
+ MinecraftClient.getInstance().getTextureManager().bindTexture(DefaultPlugin.getDisplayTexture());
+ Matrix4f matrix4f = Matrix4f.method_24021(-1.2f, -1, 0);
+ DefaultInformationCategory.innerBlit(matrix4f, bounds.getCenterX() - 8, bounds.getCenterX() + 8, bounds.getCenterY() - 8, bounds.getCenterY() + 8, 0, 116f / 256f, (116f + 16f) / 256f, 0f, 16f / 256f);
+ }
+ };
+ }
+
+ protected static void innerBlit(Matrix4f matrix4f, int xStart, int xEnd, int yStart, int yEnd, int z, float uStart, float uEnd, float vStart, float vEnd) {
+ BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer();
+ bufferBuilder.begin(7, VertexFormats.POSITION_TEXTURE);
+ bufferBuilder.vertex(matrix4f, xStart, yEnd, z).texture(uStart, vEnd).next();
+ bufferBuilder.vertex(matrix4f, xEnd, yEnd, z).texture(uEnd, vEnd).next();
+ bufferBuilder.vertex(matrix4f, xEnd, yStart, z).texture(uEnd, vStart).next();
+ bufferBuilder.vertex(matrix4f, xStart, yStart, z).texture(uStart, vStart).next();
+ bufferBuilder.end();
+ Re