diff options
author | Yasin <a.piri@hotmail.de> | 2023-10-09 12:58:02 +0200 |
---|---|---|
committer | Yasin <a.piri@hotmail.de> | 2023-10-09 12:58:02 +0200 |
commit | bd3f0329d0e391bd84b5f9e3ff207d9dd9815853 (patch) | |
tree | 2fd1d1ef625f57acc2e4916c967d8d2393844798 /src/main/java/de/hysky/skyblocker/compatibility/rei | |
parent | 2315b90da8117f28f66348927afdb621ee4fc815 (diff) | |
download | Skyblocker-bd3f0329d0e391bd84b5f9e3ff207d9dd9815853.tar.gz Skyblocker-bd3f0329d0e391bd84b5f9e3ff207d9dd9815853.tar.bz2 Skyblocker-bd3f0329d0e391bd84b5f9e3ff207d9dd9815853.zip |
new pr because fixing merge conflict would take too long
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/compatibility/rei')
4 files changed, 223 insertions, 0 deletions
diff --git a/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockCategory.java b/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockCategory.java new file mode 100644 index 00000000..dfc6e871 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockCategory.java @@ -0,0 +1,84 @@ +package de.hysky.skyblocker.compatibility.rei; + +import com.google.common.collect.Lists; +import de.hysky.skyblocker.utils.ItemUtils; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.Renderer; +import me.shedaniel.rei.api.client.gui.widgets.Label; +import me.shedaniel.rei.api.client.gui.widgets.Slot; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.registry.display.DisplayCategory; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.api.common.util.EntryStacks; +import net.minecraft.text.Text; + +import java.util.ArrayList; +import java.util.List; + +/** + * Skyblock recipe category class for REI + */ +public class SkyblockCategory implements DisplayCategory<SkyblockCraftingDisplay> { + @Override + public CategoryIdentifier<SkyblockCraftingDisplay> getCategoryIdentifier() { + return SkyblockerREIClientPlugin.SKYBLOCK; + } + + @Override + public Text getTitle() { + return Text.translatable("emi.category.skyblocker.skyblock"); + } + + @Override + public Renderer getIcon() { + return EntryStacks.of(ItemUtils.getSkyblockerStack()); + } + + @Override + public int getDisplayHeight() { + return 73; + } + + /** + * Draws display for SkyblockCraftingDisplay + * + * @param display the display + * @param bounds the bounds of the display, configurable with overriding the width, height methods. + */ + @Override + public List<Widget> setupDisplay(SkyblockCraftingDisplay display, Rectangle bounds) { + List<Widget> out = new ArrayList<>(); + out.add(Widgets.createRecipeBase(bounds)); + + Point startPoint; + if (!display.getCraftText().isEmpty() && display.getCraftText() != null) { + startPoint = new Point(bounds.getCenterX() - 58, bounds.getCenterY() - 31); + } + else { + startPoint = new Point(bounds.getCenterX() - 58, bounds.getCenterY() - 26); + } + Point resultPoint = new Point(startPoint.x + 95, startPoint.y + 19); + out.add(Widgets.createArrow(new Point(startPoint.x + 60, startPoint.y + 18))); + out.add(Widgets.createResultSlotBackground(resultPoint)); + + // Generate Slots + List<EntryIngredient> input = display.getInputEntries(); + List<Slot> slots = Lists.newArrayList(); + for (int y = 0; y < 3; y++) + for (int x = 0; x < 3; x++) + slots.add(Widgets.createSlot(new Point(startPoint.x + 1 + x * 18, startPoint.y + 1 + y * 18)).markInput()); + for (int i = 0; i < input.size(); i++) { + slots.get(i).entries(input.get(i)).markInput(); + } + out.addAll(slots); + out.add(Widgets.createSlot(resultPoint).entries(display.getOutputEntries().get(0)).disableBackground().markOutput()); + + // Add craftingText Label + Label craftTextLabel = Widgets.createLabel(new Point(bounds.getCenterX(), startPoint.y + 55), Text.of(display.getCraftText())); + out.add(craftTextLabel); + return out; + } +} diff --git a/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockCraftingDisplay.java b/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockCraftingDisplay.java new file mode 100644 index 00000000..7cd712f2 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockCraftingDisplay.java @@ -0,0 +1,40 @@ +package de.hysky.skyblocker.compatibility.rei; + + +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay; +import me.shedaniel.rei.api.common.display.basic.BasicDisplay; +import me.shedaniel.rei.api.common.entry.EntryIngredient; + +import java.util.List; + +/** + * Skyblock Crafting Recipe display class for REI + */ +public class SkyblockCraftingDisplay extends BasicDisplay implements SimpleGridMenuDisplay { + private final String craftText; + + public SkyblockCraftingDisplay(List<EntryIngredient> input, List<EntryIngredient> output, String craftText) { + super(input, output); + this.craftText = craftText; + } + + public String getCraftText() { + return craftText; + } + + @Override + public int getWidth() { + return 3; + } + + @Override + public int getHeight() { + return 3; + } + + @Override + public CategoryIdentifier<?> getCategoryIdentifier() { + return SkyblockerREIClientPlugin.SKYBLOCK; + } +}
\ No newline at end of file diff --git a/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockCraftingDisplayGenerator.java b/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockCraftingDisplayGenerator.java new file mode 100644 index 00000000..8db617dc --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockCraftingDisplayGenerator.java @@ -0,0 +1,65 @@ +package de.hysky.skyblocker.compatibility.rei; + +import de.hysky.skyblocker.skyblock.itemlist.ItemRegistry; +import de.hysky.skyblocker.skyblock.itemlist.SkyblockCraftingRecipe; +import me.shedaniel.rei.api.client.registry.display.DynamicDisplayGenerator; +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.EntryStacks; +import net.minecraft.item.ItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class SkyblockCraftingDisplayGenerator implements DynamicDisplayGenerator<SkyblockCraftingDisplay> { + + @Override + public Optional<List<SkyblockCraftingDisplay>> getRecipeFor(EntryStack<?> entry) { + if (!(entry.getValue() instanceof ItemStack)) return Optional.empty(); + EntryStack<ItemStack> inputItem = EntryStacks.of((ItemStack) entry.getValue()); + List<SkyblockCraftingRecipe> filteredRecipes = ItemRegistry.getRecipesStream() + .filter(recipe -> ItemRegistry.getInternalName(recipe.getResult()).equals(ItemRegistry.getInternalName(inputItem.getValue()))) + .toList(); + + return Optional.of(generateDisplays(filteredRecipes)); + } + + @Override + public Optional<List<SkyblockCraftingDisplay>> getUsageFor(EntryStack<?> entry) { + if (!(entry.getValue() instanceof ItemStack)) return Optional.empty(); + EntryStack<ItemStack> inputItem = EntryStacks.of((ItemStack) entry.getValue()); + List<SkyblockCraftingRecipe> filteredRecipes = ItemRegistry.getRecipesStream() + .filter(recipe -> { + for (ItemStack item : recipe.getGrid()) { + if(!ItemRegistry.getInternalName(item).isEmpty() && ItemRegistry.getInternalName(item).equals(ItemRegistry.getInternalName(inputItem.getValue()))) + return true; + } + return false; + }) + .toList(); + return Optional.of(generateDisplays(filteredRecipes)); + } + + /** + * Generate Displays from a list of recipes + */ + private List<SkyblockCraftingDisplay> generateDisplays(List<SkyblockCraftingRecipe> recipes) { + List<SkyblockCraftingDisplay> displays = new ArrayList<>(); + for (SkyblockCraftingRecipe recipe : recipes) { + List<EntryIngredient> inputs = new ArrayList<>(); + List<EntryIngredient> outputs = new ArrayList<>(); + + ArrayList<EntryStack<ItemStack>> inputEntryStacks = new ArrayList<>(); + recipe.getGrid().forEach((item) -> inputEntryStacks.add(EntryStacks.of(item))); + + for (EntryStack<ItemStack> entryStack : inputEntryStacks) { + inputs.add(EntryIngredient.of(entryStack)); + } + outputs.add(EntryIngredient.of(EntryStacks.of(recipe.getResult()))); + + displays.add(new SkyblockCraftingDisplay(inputs, outputs, recipe.getCraftText())); + } + return displays; + } +} diff --git a/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockerREIClientPlugin.java b/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockerREIClientPlugin.java new file mode 100644 index 00000000..97651718 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockerREIClientPlugin.java @@ -0,0 +1,34 @@ +package de.hysky.skyblocker.compatibility.rei; + +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.skyblock.itemlist.ItemRegistry; +import me.shedaniel.rei.api.client.plugins.REIClientPlugin; +import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; +import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; +import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.util.EntryStacks; +import net.minecraft.item.Items; + +/** + * REI integration + */ +public class SkyblockerREIClientPlugin implements REIClientPlugin { + public static final CategoryIdentifier<SkyblockCraftingDisplay> SKYBLOCK = CategoryIdentifier.of(SkyblockerMod.NAMESPACE, "skyblock"); + + @Override + public void registerCategories(CategoryRegistry categoryRegistry) { + categoryRegistry.addWorkstations(SKYBLOCK, EntryStacks.of(Items.CRAFTING_TABLE)); + categoryRegistry.add(new SkyblockCategory()); + } + + @Override + public void registerDisplays(DisplayRegistry displayRegistry) { + displayRegistry.registerDisplayGenerator(SKYBLOCK, new SkyblockCraftingDisplayGenerator()); + } + + @Override + public void registerEntries(EntryRegistry entryRegistry) { + entryRegistry.addEntries(ItemRegistry.getItemsStream().map(EntryStacks::of).toList()); + } +} |