From d187facbdd47eca0afa5d91b9ed559b2c6b9863e Mon Sep 17 00:00:00 2001 From: lantice3720 <65650884+lantice3720@users.noreply.github.com> Date: Sun, 7 May 2023 15:03:23 +0900 Subject: REI Integration. Needed to add recipe identifier. Small change in itemlist. --- .../skyblocker/skyblock/rei/SkyblockCategory.java | 43 +++++++++++ .../skyblock/rei/SkyblockCraftingDisplay.java | 18 +++++ .../rei/SkyblockCraftingDisplayGenerator.java | 52 +++++++++++++ .../skyblock/rei/SkyblockFocusedStackProvider.java | 30 ++++++++ .../skyblock/rei/SkyblockerREIClientPlugin.java | 87 ++++++++++++++++++++++ 5 files changed, 230 insertions(+) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockCategory.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockCraftingDisplay.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockCraftingDisplayGenerator.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockFocusedStackProvider.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockerREIClientPlugin.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/skyblock/rei') diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockCategory.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockCategory.java new file mode 100644 index 00000000..cafdf11b --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockCategory.java @@ -0,0 +1,43 @@ +package me.xmrvizzy.skyblocker.skyblock.rei; + +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import me.shedaniel.rei.api.client.gui.Renderer; +import me.shedaniel.rei.api.client.registry.display.DisplayCategory; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.util.EntryStacks; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.StringNbtReader; +import net.minecraft.text.Text; + +import java.util.Locale; + +/** + * Skyblock recipe category class for REI + */ +public class SkyblockCategory implements DisplayCategory { + @Override + public CategoryIdentifier getCategoryIdentifier() { + return SkyblockerREIClientPlugin.SKYBLOCK; + } + + @Override + public Text getTitle() { + // TODO use own translation key + return Text.translatable("key.categories.skyblocker"); + } + + @Override + public Renderer getIcon() { + // TODO separate icon from quickNav + SkyblockerConfig.ItemData iconItem = SkyblockerConfig.get().quickNav.button7.item; + String nbtString = "{id:\"minecraft:" + iconItem.itemName.toLowerCase(Locale.ROOT) + "\",Count:1"; + if (iconItem.nbt.length() > 2) nbtString += "," + iconItem.nbt; + nbtString += "}"; + try { + return EntryStacks.of(ItemStack.fromNbt(StringNbtReader.parse(nbtString))); + } catch (CommandSyntaxException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockCraftingDisplay.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockCraftingDisplay.java new file mode 100644 index 00000000..aee78990 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockCraftingDisplay.java @@ -0,0 +1,18 @@ +package me.xmrvizzy.skyblocker.skyblock.rei; + + +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.plugin.common.displays.crafting.DefaultCustomDisplay; +import net.minecraft.recipe.Recipe; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +/** + * Skyblock Crafting Recipe display class for REI + */ +public class SkyblockCraftingDisplay extends DefaultCustomDisplay { + public SkyblockCraftingDisplay(@Nullable Recipe possibleRecipe, List input, List output) { + super(possibleRecipe, input, output); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockCraftingDisplayGenerator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockCraftingDisplayGenerator.java new file mode 100644 index 00000000..73ace337 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockCraftingDisplayGenerator.java @@ -0,0 +1,52 @@ +package me.xmrvizzy.skyblocker.skyblock.rei; + +import me.shedaniel.rei.api.client.registry.display.DynamicDisplayGenerator; +import me.shedaniel.rei.api.client.view.ViewSearchBuilder; +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 me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; +import me.xmrvizzy.skyblocker.skyblock.itemlist.SkyblockCraftingRecipe; +import net.minecraft.item.ItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class SkyblockCraftingDisplayGenerator implements DynamicDisplayGenerator { + + public SkyblockCraftingDisplayGenerator() { + for (SkyblockCraftingRecipe recipe : ItemRegistry.getRecipes()) { + List inputs = new ArrayList<>(); + List outputs = new ArrayList<>(); + + ArrayList> inputEntryStacks = new ArrayList<>(); + recipe.getGrid().forEach((item) -> inputEntryStacks.add(EntryStacks.of(item))); + + for (EntryStack entryStack : inputEntryStacks) { + inputs.add(EntryIngredient.of(entryStack)); + } +// inputs.add(EntryIngredient.of(inputEntryStacks.get(0))); + outputs.add(EntryIngredient.of(EntryStacks.of(recipe.getResult()))); +// displayRegistry.add(new SkyblockCraftingDisplay(null, inputs, outputs)); + } + } + + @Override + public Optional> getRecipeFor(EntryStack entry) { + if (!(entry.getValue() instanceof ItemStack)) return Optional.empty(); + EntryStack itemStackEntryStack = EntryStacks.of((ItemStack) entry.getValue()); + ItemRegistry.getRecipes().stream().filter(recipe -> ItemRegistry.getInternalName(recipe.getResult()).equals(ItemRegistry.getInternalName(itemStackEntryStack.getValue()))); + return null; + } + + @Override + public Optional> getUsageFor(EntryStack entry) { + return null; + } + + @Override + public Optional> generate(ViewSearchBuilder builder) { + return null; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockFocusedStackProvider.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockFocusedStackProvider.java new file mode 100644 index 00000000..a9941ace --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockFocusedStackProvider.java @@ -0,0 +1,30 @@ +package me.xmrvizzy.skyblocker.skyblock.rei; + +import dev.architectury.event.CompoundEventResult; +import me.shedaniel.math.Point; +import me.shedaniel.rei.api.client.registry.screen.FocusedStackProvider; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.EntryStacks; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.ingame.HandledScreen; + +public class SkyblockFocusedStackProvider implements FocusedStackProvider { + @Override + public CompoundEventResult> provide(Screen screen, Point mouse) { + + return CompoundEventResult.pass(); +// if (screen instanceof HandledScreen handledScreen) { +// System.out.println(handledScreen.getTitle().getString() + ", item: " + handledScreen.getScreenHandler().getCursorStack().getItem().getName().getString()); +// return CompoundEventResult.interruptFalse(EntryStacks.of(handledScreen.getScreenHandler().getCursorStack())); +// } else { +// System.out.println(screen.getTitle().getString()); +// screen. +// } +// return CompoundEventResult.pass(); + } + + @Override + public double getPriority() { + return 100d; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockerREIClientPlugin.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockerREIClientPlugin.java new file mode 100644 index 00000000..907bacad --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockerREIClientPlugin.java @@ -0,0 +1,87 @@ +package me.xmrvizzy.skyblocker.skyblock.rei; + +import com.mojang.brigadier.exceptions.CommandSyntaxException; +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.display.DynamicDisplayGenerator; +import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; +import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; +import me.shedaniel.rei.api.client.view.ViewSearchBuilder; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +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 me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; +import me.xmrvizzy.skyblocker.skyblock.itemlist.SkyblockCraftingRecipe; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.StringNbtReader; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +/** + * REI integration + */ +public class SkyblockerREIClientPlugin implements REIClientPlugin { + public static final CategoryIdentifier SKYBLOCK = CategoryIdentifier.of(SkyblockerMod.NAMESPACE, "skyblock"); + + @Override + public void registerCategories(CategoryRegistry categoryRegistry) { + // TODO separate icon from quickNav + SkyblockerConfig.ItemData iconItem = SkyblockerConfig.get().quickNav.button7.item; + String nbtString = "{id:\"minecraft:" + iconItem.itemName.toLowerCase(Locale.ROOT) + "\",Count:1"; + if (iconItem.nbt.length() > 2) nbtString += "," + iconItem.nbt; + nbtString += "}"; + + try { + categoryRegistry.addWorkstations(SKYBLOCK, EntryStacks.of(ItemStack.fromNbt(StringNbtReader.parse(nbtString)))); + } catch (CommandSyntaxException e) { + throw new RuntimeException(e); + } + categoryRegistry.add(new SkyblockCategory()); + } + + @Override + public void registerDisplays(DisplayRegistry displayRegistry) { + + ViewSearchBuilder builder = ViewSearchBuilder.builder(); + builder.addCategory(SKYBLOCK); + + System.out.println(displayRegistry.getCategoryDisplayGenerators(SKYBLOCK).isEmpty()); + + + displayRegistry.registerDisplayGenerator(SKYBLOCK, new SkyblockCraftingDisplayGenerator()); + + for (SkyblockCraftingRecipe recipe : ItemRegistry.getRecipes()) { + List inputs = new ArrayList<>(); + List outputs = new ArrayList<>(); + + ArrayList> inputEntryStacks = new ArrayList<>(); + recipe.getGrid().forEach((item) -> inputEntryStacks.add(EntryStacks.of(item))); + + for (EntryStack entryStack : inputEntryStacks) { + inputs.add(EntryIngredient.of(entryStack)); + } +// inputs.add(EntryIngredient.of(inputEntryStacks.get(0))); + outputs.add(EntryIngredient.of(EntryStacks.of(recipe.getResult()))); + displayRegistry.add(new SkyblockCraftingDisplay(null, inputs, outputs)); + } + + } + + @Override + public void registerEntries(EntryRegistry entryRegistry) { + ArrayList> entries = new ArrayList<>(); + ItemRegistry.getRecipes().forEach(recipe -> entries.add(EntryStacks.of(recipe.getResult()))); + entryRegistry.addEntries(entries); + } + + @Override + public void registerScreens(ScreenRegistry screenRegistry) { + screenRegistry.registerFocusedStack(new SkyblockFocusedStackProvider()); + } +} -- cgit