diff options
Diffstat (limited to 'src')
41 files changed, 929 insertions, 408 deletions
diff --git a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index 686e34006..faa647b3f 100644 --- a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -1,12 +1,15 @@ package me.shedaniel.rei; import com.google.common.collect.Maps; +import me.shedaniel.rei.api.IItemRegisterer; +import me.shedaniel.rei.api.IPluginDisabler; import me.shedaniel.rei.api.IRecipePlugin; -import me.shedaniel.rei.client.ClientHelper; import me.shedaniel.rei.client.ConfigHelper; import me.shedaniel.rei.client.GuiHelper; +import me.shedaniel.rei.client.ItemListHelper; import me.shedaniel.rei.client.RecipeHelper; import me.shedaniel.rei.plugin.DefaultPlugin; +import me.shedaniel.rei.plugin.PluginManager; import me.shedaniel.rei.update.UpdateChecker; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ModInitializer; @@ -33,7 +36,8 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer, ModInitiali public static final Identifier DELETE_ITEMS_PACKET = new Identifier("roughlyenoughitems", "delete_item"); public static final Identifier CREATE_ITEMS_PACKET = new Identifier("roughlyenoughitems", "create_item"); private static final RecipeHelper RECIPE_HELPER = new RecipeHelper(); - private static final ClientHelper CLIENT_HELPER = new ClientHelper(); + private static final PluginManager PLUGIN_MANAGER = new PluginManager(); + private static final ItemListHelper ITEM_LIST_HELPER = new ItemListHelper(); private static final Map<Identifier, IRecipePlugin> plugins = Maps.newHashMap(); private static ConfigHelper configHelper; @@ -45,13 +49,18 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer, ModInitiali return configHelper; } - public static ClientHelper getClientHelper() { - return CLIENT_HELPER; + public static IItemRegisterer getItemRegisterer() { + return ITEM_LIST_HELPER; + } + + public static IPluginDisabler getPluginDisabler() { + return PLUGIN_MANAGER; } public static IRecipePlugin registerPlugin(Identifier identifier, IRecipePlugin plugin) { plugins.put(identifier, plugin); RoughlyEnoughItemsCore.LOGGER.info("REI: Registered plugin %s from %s", identifier.toString(), plugin.getClass().getSimpleName()); + plugin.onFirstLoad(getPluginDisabler()); return plugin; } @@ -66,14 +75,16 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer, ModInitiali return null; } + @SuppressWarnings("deprecation") @Override public void onInitializeClient() { + configHelper = new ConfigHelper(); + // If pluginloader is not installed, base functionality should still remain if (!FabricLoader.INSTANCE.getModContainers().stream().map(modContainer -> modContainer.getInfo().getId()).anyMatch(s -> s.equalsIgnoreCase("pluginloader"))) { RoughlyEnoughItemsCore.LOGGER.warn("REI: Plugin Loader is not loaded! Please consider installing https://minecraft.curseforge.com/projects/pluginloader for REI plugin compatibility!"); registerPlugin(new Identifier("roughlyenoughitems", "default_plugin"), new DefaultPlugin()); } - configHelper = new ConfigHelper(); ClientTickCallback.EVENT.register(GuiHelper::onTick); if (getConfigHelper().checkUpdates()) diff --git a/src/main/java/me/shedaniel/rei/api/IItemRegisterer.java b/src/main/java/me/shedaniel/rei/api/IItemRegisterer.java new file mode 100644 index 000000000..090e26742 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/api/IItemRegisterer.java @@ -0,0 +1,35 @@ +package me.shedaniel.rei.api; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +import java.util.List; + +public interface IItemRegisterer { + + public List<ItemStack> getItemList(); + + @Deprecated + public List<ItemStack> getModifiableItemList(); + + public ItemStack[] getAllStacksFromItem(Item item); + + public void registerItemStack(Item afterItem, ItemStack stack); + + default public void registerItemStack(Item afterItem, ItemStack... stacks) { + for(ItemStack stack : stacks) + if (stack != null && !stack.isEmpty()) + registerItemStack(afterItem, stack); + } + + default public void registerItemStack(ItemStack... stacks) { + for(ItemStack stack : stacks) + if (stack != null && !stack.isEmpty()) + registerItemStack(null, stack); + } + + default boolean alreadyContain(ItemStack stack) { + return getItemList().stream().anyMatch(stack1 -> ItemStack.areEqual(stack, stack1)); + } + +} diff --git a/src/main/java/me/shedaniel/rei/api/IPluginDisabler.java b/src/main/java/me/shedaniel/rei/api/IPluginDisabler.java new file mode 100644 index 000000000..8663e76bd --- /dev/null +++ b/src/main/java/me/shedaniel/rei/api/IPluginDisabler.java @@ -0,0 +1,23 @@ +package me.shedaniel.rei.api; + +import net.minecraft.util.Identifier; + +public interface IPluginDisabler { + + default public void disablePluginFunctions(Identifier plugin, PluginFunction... functions) { + for(PluginFunction function : functions) + disablePluginFunction(plugin, function); + } + + default public void enablePluginFunctions(Identifier plugin, PluginFunction... functions) { + for(PluginFunction function : functions) + enablePluginFunction(plugin, function); + } + + public void disablePluginFunction(Identifier plugin, PluginFunction function); + + public void enablePluginFunction(Identifier plugin, PluginFunction function); + + public boolean isFunctionEnabled(Identifier plugin, PluginFunction function); + +} diff --git a/src/main/java/me/shedaniel/rei/api/IRecipePlugin.java b/src/main/java/me/shedaniel/rei/api/IRecipePlugin.java index 064f20abe..6ba6c70e7 100644 --- a/src/main/java/me/shedaniel/rei/api/IRecipePlugin.java +++ b/src/main/java/me/shedaniel/rei/api/IRecipePlugin.java @@ -1,12 +1,18 @@ package me.shedaniel.rei.api; +import me.shedaniel.rei.client.RecipeHelper; + public interface IRecipePlugin { - public void registerPluginCategories(); + default public void onFirstLoad(IPluginDisabler pluginDisabler) {} + + public void registerItems(IItemRegisterer itemRegisterer); + + public void registerPluginCategories(RecipeHelper recipeHelper); - public void registerRecipes(); + public void registerRecipeDisplays(RecipeHelper recipeHelper); - public void registerSpeedCraft(); + public void registerSpeedCraft(RecipeHelper recipeHelper); default public int getPriority() { return 0; diff --git a/src/main/java/me/shedaniel/rei/api/PluginFunction.java b/src/main/java/me/shedaniel/rei/api/PluginFunction.java new file mode 100644 index 000000000..bef757db1 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/api/PluginFunction.java @@ -0,0 +1,5 @@ +package me.shedaniel.rei.api; + +public enum PluginFunction { + REGISTER_ITEMS, REGISTER_CATEGORIES, REGISTER_RECIPE_DISPLAYS, REGISTER_SPEED_CRAFT; +} diff --git a/src/main/java/me/shedaniel/rei/client/ClientHelper.java b/src/main/java/me/shedaniel/rei/client/ClientHelper.java index fb2522f01..474fdf1ce 100644 --- a/src/main/java/me/shedaniel/rei/client/ClientHelper.java +++ b/src/main/java/me/shedaniel/rei/client/ClientHelper.java @@ -1,26 +1,22 @@ package me.shedaniel.rei.client; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; import io.netty.buffer.Unpooled; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.IRecipeCategory; import me.shedaniel.rei.api.IRecipeDisplay; import me.shedaniel.rei.gui.ContainerScreenOverlay; -import me.shedaniel.rei.gui.widget.ConfigWidget; +import me.shedaniel.rei.gui.config.ConfigScreen; import me.shedaniel.rei.gui.widget.RecipeViewingWidgetScreen; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding; import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl; -import net.fabricmc.loader.FabricLoader; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.MinecraftClient; import net.minecraft.client.Mouse; import net.minecraft.client.gui.Screen; import net.minecraft.client.util.InputUtil; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.util.DefaultedList; @@ -30,7 +26,6 @@ import net.minecraft.util.registry.Registry; import java.awt.*; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -40,13 +35,8 @@ public class ClientHelper implements ClientModInitializer { private static final Identifier USAGE_KEYBIND = new Identifier("roughlyenoughitems", "usage_keybind"); private static final Identifier HIDE_KEYBIND = new Identifier("roughlyenoughitems", "hide_keybind"); public static FabricKeyBinding RECIPE, USAGE, HIDE; - private static List<ItemStack> itemList; private static boolean cheating; - public ClientHelper() { - this.itemList = Lists.newLinkedList(); - } - public static String getModFromItemStack(ItemStack stack) { if (!stack.isEmpty()) { Identifier location = Registry.ITEM.getId(stack.getItem()); @@ -54,7 +44,7 @@ public class ClientHelper implements ClientModInitializer { String modid = location.getNamespace(); if (modid.equalsIgnoreCase("minecraft")) return "Minecraft"; - return FabricLoader.INSTANCE.getModContainers().stream().map(modContainer -> { + return ((net.fabricmc.loader.FabricLoader) FabricLoader.getInstance()).getModContainers().stream().map(modContainer -> { return modContainer.getInfo(); }).filter(modInfo -> modInfo.getId().equals(modid) || (modInfo.getName() != null && modInfo.getName().equals(modid))).findFirst().map(modInfo -> { if (modInfo.getName() != null) @@ -65,10 +55,6 @@ public class ClientHelper implements ClientModInitializer { return ""; } - public static List<ItemStack> getItemList() { - return itemList; - } - public static Point getMouseLocation() { MinecraftClient client = MinecraftClient.getInstance(); Mouse mouse = client.mouse; @@ -127,7 +113,7 @@ public class ClientHelper implements ClientModInitializer { } public static void openConfigWindow(Screen parent) { - MinecraftClient.getInstance().openScreen(new ConfigWidget(parent)); + MinecraftClient.getInstance().openScreen(new ConfigScreen(parent)); } public static List<ItemStack> getInventoryItemsTypes() { @@ -140,41 +126,6 @@ public class ClientHelper implements ClientModInitializer { return inventoryStacks; } - public void clientLoaded() { - Registry.ITEM.forEach(item -> { - if (!item.equals(Items.ENCHANTED_BOOK)) - registerItem(item); - }); - Registry.ENCHANTMENT.forEach(enchantment -> { - for(int i = enchantment.getMinimumLevel(); i < enchantment.getMaximumLevel(); i++) { - Map<Enchantment, Integer> map = new HashMap<>(); - map.put(enchantment, i); - ItemStack itemStack = new ItemStack(Items.ENCHANTED_BOOK); - EnchantmentHelper.set(map, itemStack); - registerItemStack(itemStack); - } - }); - } - - public void registerItem(Item item) { - registerItemStack(item.getDefaultStack()); - DefaultedList<ItemStack> stacks = DefaultedList.create(); - item.addStacksForDisplay(item.getItemGroup(), stacks); - stacks.forEach(this::registerItemStack); - } - - public void registerItemStack(ItemStack stack) { - if (!stack.getItem().equals(Items.AIR) && !alreadyContain(stack)) - itemList.add(stack); - } - - private boolean alreadyContain(ItemStack stack) { - for(ItemStack itemStack : itemList) - if (ItemStack.areEqual(stack, itemStack)) - return true; - return false; - } - @Override public void onInitializeClient() { this.cheating = false; diff --git a/src/main/java/me/shedaniel/rei/client/ConfigHelper.java b/src/main/java/me/shedaniel/rei/client/ConfigHelper.java index ccc340af3..caf307313 100644 --- a/src/main/java/me/shedaniel/rei/client/ConfigHelper.java +++ b/src/main/java/me/shedaniel/rei/client/ConfigHelper.java @@ -20,6 +20,7 @@ public class ConfigHelper { this.craftableOnly = false; try { loadConfig(); + RoughlyEnoughItemsCore.LOGGER.info("REI: Config is loaded."); } catch (IOException e) { e.printStackTrace(); } @@ -119,4 +120,12 @@ public class ConfigHelper { config.mirrorItemPanel = mirrorItemPanel; } + public boolean isLoadingDefaultPlugin() { + return config.loadDefaultPlugin; + } + + public void setLoadingDefaultPlugin(boolean loadDefaultPlugin) { + config.loadDefaultPlugin = loadDefaultPlugin; + } + } diff --git a/src/main/java/me/shedaniel/rei/client/GuiHelper.java b/src/main/java/me/shedaniel/rei/client/GuiHelper.java index 2b453c784..cf74fafbd 100644 --- a/src/main/java/me/shedaniel/rei/client/GuiHelper.java +++ b/src/main/java/me/shedaniel/rei/client/GuiHelper.java @@ -17,7 +17,6 @@ public class GuiHelper { private static boolean overlayVisible = true; private static ContainerScreenOverlay overlay; private static ContainerScreen lastContainerScreen; - private static IMixinContainerScreen lastMixinContainerScreen; public static boolean isOverlayVisible() { return overlayVisible; @@ -27,19 +26,21 @@ public class GuiHelper { overlayVisible = !overlayVisible; } - public static ContainerScreenOverlay getLastOverlay() { + public static ContainerScreenOverlay getLastOverlay(boolean reset) { + if (overlay == null || reset) { + overlay = new ContainerScreenOverlay(); + overlay.onInitialized(); + } return overlay; } - public static void setOverlay(ContainerScreenOverlay overlay) { - GuiHelper.overlay = overlay; - overlay.onInitialized(); + public static ContainerScreenOverlay getLastOverlay() { + return getLastOverlay(false); } public static void onTick(MinecraftClient client) { if (client.currentScreen instanceof ContainerScreen && lastContainerScreen != client.currentScreen) { GuiHelper.lastContainerScreen = (ContainerScreen) client.currentScreen; - GuiHelper.lastMixinContainerScreen = (IMixinContainerScreen) lastContainerScreen; } } @@ -52,11 +53,7 @@ public class GuiHelper { } public static IMixinContainerScreen getLastMixinContainerScreen() { - return lastMixinContainerScreen; - } - - public static void setLastMixinContainerScreen(IMixinContainerScreen lastMixinContainerScreen) { - GuiHelper.lastMixinContainerScreen = lastMixinContainerScreen; + return (IMixinContainerScreen) lastContainerScreen; } } diff --git a/src/main/java/me/shedaniel/rei/client/ItemListHelper.java b/src/main/java/me/shedaniel/rei/client/ItemListHelper.java new file mode 100644 index 000000000..81c882d49 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/client/ItemListHelper.java @@ -0,0 +1,53 @@ +package me.shedaniel.rei.client; + +import com.google.common.collect.Lists; +import me.shedaniel.rei.api.IItemRegisterer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.DefaultedList; + +import java.util.Collections; +import java.util.List; +import java.util.TreeSet; +import java.util.stream.Collectors; + +public class ItemListHelper implements IItemRegisterer { + + private final List<ItemStack> itemList = Lists.newLinkedList(); + + @Override + public List<ItemStack> getItemList() { + return Collections.unmodifiableList(itemList); + } + + @Deprecated + @Override + public List<ItemStack> getModifiableItemList() { + return itemList; + } + + @Override + public ItemStack[] getAllStacksFromItem(Item item) { + DefaultedList<ItemStack> list = DefaultedList.create(); + list.add(item.getDefaultStack()); + item.addStacksForDisplay(item.getItemGroup(), list); + TreeSet<ItemStack> stackSet = list.stream().collect(Collectors.toCollection(() -> new TreeSet<ItemStack>((p1, p2) -> ItemStack.areEqual(p1, p2) ? 0 : 1))); + return Lists.newArrayList(stackSet).toArray(new ItemStack[0]); + } + + @Override + public void registerItemStack(Item afterItem, ItemStack stack) { + if (!stack.isEmpty() && !alreadyContain(stack)) + if (afterItem == null || afterItem.equals(Items.AIR)) + itemList.add(stack); + else { + int last = itemList.size(); + for(int i = 0; i < itemList.size(); i++) + if (itemList.get(i).getItem().equals(afterItem)) + last = i + 1; + itemList.add(last, stack); + } + } + +} diff --git a/src/main/java/me/shedaniel/rei/client/REIConfig.java b/src/main/java/me/shedaniel/rei/client/REIConfig.java index b5b798371..be4eabfeb 100644 --- a/src/main/java/me/shedaniel/rei/client/REIConfig.java +++ b/src/main/java/me/shedaniel/rei/client/REIConfig.java @@ -14,5 +14,6 @@ public class REIConfig { public String giveCommandPrefix = "/give"; public boolean checkUpdates = true; public boolean mirrorItemPanel = false; + public boolean loadDefaultPlugin = true; } diff --git a/src/main/java/me/shedaniel/rei/client/RecipeHelper.java b/src/main/java/me/shedaniel/rei/client/RecipeHelper.java index 80d76c5f1..96490c6dd 100644 --- a/src/main/java/me/shedaniel/rei/client/RecipeHelper.java +++ b/src/main/java/me/shedaniel/rei/client/RecipeHelper.java @@ -59,7 +59,7 @@ public class RecipeHelper { recipeCategoryListMap.put(category.getIdentifier(), Lists.newLinkedList()); } - public void registerRecipe(Identifier categoryIdentifier, IRecipeDisplay display) { + public void registerDisplay(Identifier categoryIdentifier, IRecipeDisplay display) { if (!recipeCategoryListMap.containsKey(categoryIdentifier)) return; recipeCategoryListMap.get(categoryIdentifier).add(display); @@ -147,6 +147,7 @@ public class RecipeHelper { speedCraftFunctionalMap.put(category, list); } + @SuppressWarnings("deprecation") public void recipesLoaded(RecipeManager recipeManager) { this.recipeManager = recipeManager; this.recipeCategoryListMap.clear(); @@ -162,10 +163,20 @@ public class RecipeHelper { return identifier == null ? "NULL" : identifier.toString(); }).collect(Collectors.toList()))); Collections.reverse(plugins); + RoughlyEnoughItemsCore.getItemRegisterer().getModifiableItemList().clear(); + IPluginDisabler pluginDisabler = RoughlyEnoughItemsCore.getPluginDisabler(); plugins.forEach(plugin -> { - plugin.registerPluginCategories(); - plugin.registerRecipes(); - plugin.registerSpeedCraft(); + Identifier identifier = RoughlyEnoughItemsCore.getPluginIdentifier(plugin); + if (identifier == null) + identifier = new Identifier("null"); + if (pluginDisabler.isFunctionEnabled(identifier, PluginFunction.REGISTER_ITEMS)) + plugin.registerItems(RoughlyEnoughItemsCore.getItemRegisterer()); + if (pluginDisabler.isFunctionEnabled(identifier, PluginFunction.REGISTER_CATEGORIES)) + plugin.registerPluginCategories(this); + if (pluginDisabler.isFunctionEnabled(identifier, PluginFunction.REGISTER_RECIPE_DISPLAYS)) + plugin.registerRecipeDisplays(this); + if (pluginDisabler.isFunctionEnabled(identifier, PluginFunction.REGISTER_SPEED_CRAFT)) + plugin.registerSpeedCraft(this); }); RoughlyEnoughItemsCore.LOGGER.info("Registered REI Categories: " + String.join(", ", categories.stream().map(category -> { return category.getCategoryName(); diff --git a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java index eb1daa9a4..41700f7c1 100644 --- a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java +++ b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java @@ -5,11 +5,12 @@ import com.mojang.blaze3d.platform.GlStateManager; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.client.ClientHelper; import me.shedaniel.rei.client.GuiHelper; +import me.shedaniel.rei.gui.credits.CreditsScreen; import me.shedaniel.rei.gui.widget.*; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.ContainerScreen; +import net.minecraft.client.gui.DrawableContainer; import net.minecraft.client.gui.GuiEventListener; -import net.minecraft.client.gui.Screen; import net.minecraft.client.render.GuiLighting; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.util.Window; @@ -22,7 +23,7 @@ import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; -public class ContainerScreenOverlay extends Screen { +public class ContainerScreenOverlay extends DrawableContainer { private static final List<QueuedTooltip> QUEUED_TOOLTIPS = Lists.newArrayList(); public static String searchTerm = ""; @@ -80,7 +81,13 @@ public class ContainerScreenOverlay extends Screen { ClientHelper.openConfigWindow(GuiHelper.getLastContainerScreen()); } }); - this.widgets.add(new LabelWidget(rectangle.x + (rectangle.width / 2), rectangle.y + 10, "") { + widgets.add(new ButtonWidget(RoughlyEnoughItemsCore.getConfigHelper().isMirrorItemPanel() ? window.getScaledWidth() - 50 : 10, window.getScaledHeight() - 30, 40, 20, I18n.translate("text.rei.credits")) { + @Override + public void onPressed(int button, double mouseX, double mouseY) { + MinecraftClient.getInstance().openScreen(new CreditsScreen(GuiHelper.getLastContainerScreen())); + } + }); + widgets.add(new LabelWidget(rectangle.x + (rectangle.width / 2), rectangle.y + 10, "") { @Override public void draw(int mouseX, int mouseY, float partialTicks) { page = MathHelper.clamp(page, 0, getTotalPage()); @@ -101,7 +108,7 @@ public class ContainerScreenOverlay extends Screen { }; GuiHelper.searchField.setChangedListener(s -> { searchTerm = s; - itemListOverlay.updateList(page, searchTerm); + itemListOverlay.updateList(getItemListArea(), page, searchTerm); }); GuiHelper.searchField.setBounds(getTextFieldArea()); this.widgets.add(GuiHelper.searchField); @@ -111,12 +118,11 @@ public class ContainerScreenOverlay extends Screen { @Override public void onPressed(int button, double mouseX, double mouseY) { RoughlyEnoughItemsCore.getConfigHelper().toggleCraftableOnly(); - itemListOverlay.updateList(page, searchTerm); + itemListOverlay.updateList(getItemListArea(), page, searchTerm); } }); this.itemListOverlay.updateList(getItemListArea(), page, searchTerm); - this.listeners.addAll(widgets); } private Rectangle getTextFieldArea() { @@ -127,7 +133,7 @@ public class ContainerScreenOverlay extends Screen { RecipeViewingWidgetScreen widget = (RecipeViewingWidgetScreen) MinecraftClient.getInstance().currentScreen; return new Rectangle(widget.getBounds().x, window.getScaledHeight() - 22, widget.getBounds().width - widthRemoved, 18); } - return new Rectangle(GuiHelper.getLastMixinContainerScreen().getContainerLeft(), window.getScaledHeight() - 22, GuiHelper.getLastMixinContainerS |
