diff options
| author | shedaniel <daniel@shedaniel.me> | 2020-01-11 00:34:07 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2020-01-11 00:34:07 +0800 |
| commit | a855c0284c3b285dd8a71b57ec35702995ae5b30 (patch) | |
| tree | 4b2876163d99301960a26ff821aff5c97e3fb02e /src | |
| parent | bde33221f4e4732daafdc9ecd3a0e559c1f74ed2 (diff) | |
| download | RoughlyEnoughItems-a855c0284c3b285dd8a71b57ec35702995ae5b30.tar.gz RoughlyEnoughItems-a855c0284c3b285dd8a71b57ec35702995ae5b30.tar.bz2 RoughlyEnoughItems-a855c0284c3b285dd8a71b57ec35702995ae5b30.zip | |
3.3.7
Diffstat (limited to 'src')
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(); + RenderSystem.enableAlphaTest(); + BufferRenderer.draw(bufferBuilder); + } + + @Override + public List<Widget> setupDisplay(Supplier<DefaultInformationDisplay> recipeDisplaySupplier, Rectangle bounds) { + DefaultInformationDisplay display = recipeDisplaySupplier.get(); + List<Widget> widgets = Lists.newArrayList(); + widgets.add(new LabelWidget(new Point(bounds.getCenterX(), bounds.y + 3), display.getName().asFormattedString()).noShadow().color(ScreenHelper.isDarkModeEnabled() ? 0xFFBBBBBB : 0xFF404040)); + widgets.add(EntryWidget.create(bounds.getCenterX() - 8, bounds.y + 15).entries(display.getEntryStacks())); + Rectangle rectangle = new Rectangle(bounds.getCenterX() - (bounds.width / 2), bounds.y + 35, bounds.width, bounds.he |
