diff options
Diffstat (limited to 'src/main/java')
23 files changed, 684 insertions, 357 deletions
diff --git a/src/main/java/de/hysky/skyblocker/compatibility/emi/SkyblockEmiRecipe.java b/src/main/java/de/hysky/skyblocker/compatibility/emi/SkyblockEmiRecipe.java index 7f102fc1..281867f1 100644 --- a/src/main/java/de/hysky/skyblocker/compatibility/emi/SkyblockEmiRecipe.java +++ b/src/main/java/de/hysky/skyblocker/compatibility/emi/SkyblockEmiRecipe.java @@ -1,35 +1,70 @@ package de.hysky.skyblocker.compatibility.emi; -import de.hysky.skyblocker.skyblock.itemlist.SkyblockCraftingRecipe; -import dev.emi.emi.api.recipe.EmiCraftingRecipe; +import de.hysky.skyblocker.skyblock.itemlist.recipes.SkyblockRecipe; +import dev.emi.emi.api.recipe.EmiRecipe; import dev.emi.emi.api.recipe.EmiRecipeCategory; +import dev.emi.emi.api.render.EmiTexture; import dev.emi.emi.api.stack.EmiIngredient; import dev.emi.emi.api.stack.EmiStack; import dev.emi.emi.api.widget.WidgetHolder; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.ScreenPos; import net.minecraft.text.Text; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.Nullable; -public class SkyblockEmiRecipe extends EmiCraftingRecipe { - private final String craftText; +import java.util.List; - public SkyblockEmiRecipe(SkyblockCraftingRecipe recipe) { - super(recipe.getGrid().stream().map(EmiStack::of).map(EmiIngredient.class::cast).toList(), EmiStack.of(recipe.getResult()), recipe.getId()); - this.craftText = recipe.getCraftText(); +public class SkyblockEmiRecipe implements EmiRecipe { + private final Text craftText; + private final SkyblockRecipe recipe; + + public SkyblockEmiRecipe(SkyblockRecipe recipe) { + this.craftText = recipe.getExtraText(); + this.recipe = recipe; } @Override public EmiRecipeCategory getCategory() { - return SkyblockerEMIPlugin.SKYBLOCK; + return SkyblockerEMIPlugin.IDENTIFIER_CATEGORY_MAP.get(recipe.getCategoryIdentifier()); + } + + @Override + public @Nullable Identifier getId() { + return recipe.getRecipeIdentifier(); + } + + @Override + public List<EmiIngredient> getInputs() { + return recipe.getInputs().stream().map(EmiStack::of).map(EmiIngredient.class::cast).toList(); + } + + @Override + public List<EmiStack> getOutputs() { + return recipe.getOutputs().stream().map(EmiStack::of).toList(); + } + + @Override + public int getDisplayWidth() { + return 118; } @Override public int getDisplayHeight() { - return super.getDisplayHeight() + (craftText.isEmpty() ? 0 : 10); + return 54 + (craftText.getString().isEmpty() ? 0 : 10); } @Override public void addWidgets(WidgetHolder widgets) { - super.addWidgets(widgets); - widgets.addText(Text.of(craftText), 59 - MinecraftClient.getInstance().textRenderer.getWidth(craftText) / 2, 55, 0xFFFFFF, true); + ScreenPos arrowLocation = recipe.getArrowLocation(getDisplayWidth(), getDisplayHeight()); + if (arrowLocation != null) widgets.addTexture(EmiTexture.EMPTY_ARROW, arrowLocation.x(), arrowLocation.y()); + widgets.addText(craftText, 59 - MinecraftClient.getInstance().textRenderer.getWidth(craftText) / 2, 55, 0xFFFFFF, true); + for (SkyblockRecipe.RecipeSlot inputSlot : recipe.getInputSlots(getDisplayWidth(), getDisplayHeight())) { + widgets.addSlot(EmiStack.of(inputSlot.stack()), inputSlot.x(), inputSlot.y()); + } + for (SkyblockRecipe.RecipeSlot outputSlot : recipe.getOutputSlots(getDisplayWidth(), getDisplayHeight())) { + widgets.addSlot(EmiStack.of(outputSlot.stack()), outputSlot.x(), outputSlot.y()).recipeContext(this); + } + widgets.addDrawable(0, 0, getDisplayWidth(), getDisplayHeight(), (draw, mouseX, mouseY, delta) -> recipe.render(draw, getDisplayWidth(), getDisplayHeight(), mouseX, mouseY)); } } diff --git a/src/main/java/de/hysky/skyblocker/compatibility/emi/SkyblockerEMIPlugin.java b/src/main/java/de/hysky/skyblocker/compatibility/emi/SkyblockerEMIPlugin.java index d8d2d28c..2baed2f2 100644 --- a/src/main/java/de/hysky/skyblocker/compatibility/emi/SkyblockerEMIPlugin.java +++ b/src/main/java/de/hysky/skyblocker/compatibility/emi/SkyblockerEMIPlugin.java @@ -4,7 +4,8 @@ import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor; import de.hysky.skyblocker.skyblock.itemlist.ItemRepository; -import de.hysky.skyblocker.utils.ItemUtils; +import de.hysky.skyblocker.skyblock.itemlist.recipes.SkyblockCraftingRecipe; +import de.hysky.skyblocker.skyblock.itemlist.recipes.SkyblockForgeRecipe; import de.hysky.skyblocker.utils.Location; import de.hysky.skyblocker.utils.Utils; import dev.emi.emi.api.EmiPlugin; @@ -18,22 +19,33 @@ import net.minecraft.client.gui.screen.ingame.InventoryScreen; import net.minecraft.item.Items; import net.minecraft.util.Identifier; +import java.util.Map; + /** * EMI integration */ public class SkyblockerEMIPlugin implements EmiPlugin { - public static final Identifier SIMPLIFIED_TEXTURES = Identifier.of("emi", "textures/gui/widgets.png"); - // TODO: Custom simplified texture for Skyblock - public static final EmiRecipeCategory SKYBLOCK = new EmiRecipeCategory(Identifier.of(SkyblockerMod.NAMESPACE, "skyblock"), EmiStack.of(ItemUtils.getSkyblockerStack()), new EmiTexture(SIMPLIFIED_TEXTURES, 240, 240, 16, 16)); + public static final Identifier SIMPLIFIED_TEXTURES = Identifier.of(SkyblockerMod.NAMESPACE, "textures/gui/emi_icons.png"); + + public static final EmiRecipeCategory SKYBLOCK_CRAFTING = new EmiRecipeCategory(SkyblockCraftingRecipe.IDENTIFIER, EmiStack.of(Items.CRAFTING_TABLE), new EmiTexture(SIMPLIFIED_TEXTURES, 0, 0, 16, 16)); + public static final EmiRecipeCategory SKYBLOCK_FORGE = new EmiRecipeCategory(SkyblockForgeRecipe.IDENTIFIER, EmiStack.of(Items.LAVA_BUCKET), new EmiTexture(SIMPLIFIED_TEXTURES, 16, 0, 16, 16)); + + protected static final Map<Identifier, EmiRecipeCategory> IDENTIFIER_CATEGORY_MAP = Map.of( + SkyblockCraftingRecipe.IDENTIFIER, SKYBLOCK_CRAFTING, + SkyblockForgeRecipe.IDENTIFIER, SKYBLOCK_FORGE + ); @Override public void register(EmiRegistry registry) { + if (!SkyblockerConfigManager.get().general.itemList.enableItemList) return; ItemRepository.getItemsStream().map(EmiStack::of).forEach(emiStack -> { registry.addEmiStack(emiStack); - registry.setDefaultComparison(emiStack, Comparison.compareComponents()); + registry.setDefaultComparison(emiStack, Comparison.compareData(emiStack1 -> emiStack1.getItemStack().getSkyblockId())); }); - registry.addCategory(SKYBLOCK); - registry.addWorkstation(SKYBLOCK, EmiStack.of(Items.CRAFTING_TABLE)); + registry.addCategory(SKYBLOCK_CRAFTING); + registry.addCategory(SKYBLOCK_FORGE); + registry.addWorkstation(SKYBLOCK_CRAFTING, EmiStack.of(Items.CRAFTING_TABLE)); + registry.addWorkstation(SKYBLOCK_CRAFTING, EmiStack.of(Items.LAVA_BUCKET)); ItemRepository.getRecipesStream().map(SkyblockEmiRecipe::new).forEach(registry::addRecipe); registry.addExclusionArea(InventoryScreen.class, (screen, consumer) -> { if (!SkyblockerConfigManager.get().farming.garden.gardenPlotsWidget || !Utils.getLocation().equals(Location.GARDEN)) return; diff --git a/src/main/java/de/hysky/skyblocker/compatibility/jei/SkyblockCraftingRecipeCategory.java b/src/main/java/de/hysky/skyblocker/compatibility/jei/SkyblockCraftingRecipeCategory.java index c08155a5..edafd7a6 100644 --- a/src/main/java/de/hysky/skyblocker/compatibility/jei/SkyblockCraftingRecipeCategory.java +++ b/src/main/java/de/hysky/skyblocker/compatibility/jei/SkyblockCraftingRecipeCategory.java @@ -15,7 +15,7 @@ import org.jetbrains.annotations.NotNull; public class SkyblockCraftingRecipeCategory extends CraftingRecipeCategory { @SuppressWarnings({"unchecked", "RedundantCast", "rawtypes"}) private static final RecipeType<RecipeEntry<CraftingRecipe>> SKYBLOCK_RECIPE = new RecipeType<>(Identifier.of(SkyblockerMod.NAMESPACE, "skyblock"), (Class<? extends RecipeEntry<CraftingRecipe>>) (Class) RecipeEntry.class); - private final Text title = Text.translatable("emi.category.skyblocker.skyblock"); + private final Text title = Text.translatable("emi.category.skyblocker.skyblock_crafting"); private final IDrawable icon; public SkyblockCraftingRecipeCategory(IGuiHelper guiHelper) { diff --git a/src/main/java/de/hysky/skyblocker/compatibility/jei/SkyblockerJEIPlugin.java b/src/main/java/de/hysky/skyblocker/compatibility/jei/SkyblockerJEIPlugin.java index cf35208b..9b75bd77 100644 --- a/src/main/java/de/hysky/skyblocker/compatibility/jei/SkyblockerJEIPlugin.java +++ b/src/main/java/de/hysky/skyblocker/compatibility/jei/SkyblockerJEIPlugin.java @@ -4,6 +4,7 @@ import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor; import de.hysky.skyblocker.skyblock.itemlist.ItemRepository; +import de.hysky.skyblocker.skyblock.itemlist.recipes.SkyblockCraftingRecipe; import de.hysky.skyblocker.utils.Location; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.datafixer.ItemStackComponentizationFixer; @@ -64,8 +65,8 @@ public class SkyblockerJEIPlugin implements IModPlugin { public void registerRecipes(@NotNull IRecipeRegistration registration) { //FIXME no clue what to replace any of this with, we can't use items as that does not work /*registration.getIngredientManager().addIngredientsAtRuntime(VanillaTypes.ITEM_STACK, ItemRepository.getItems()); - registration.addRecipes(skyblockCraftingRecipeCategory.getRecipeType(), ItemRepository.getRecipesStream().map(recipe -> - new RecipeEntry<CraftingRecipe>(recipe.getId(), new ShapedRecipe("", CraftingRecipeCategory.MISC, RawShapedRecipe.create(Map.of( + registration.addRecipes(skyblockCraftingRecipeCategory.getRecipeType(), ItemRepository.getRecipesStream().filter(skyblockRecipe -> skyblockRecipe instanceof SkyblockCraftingRecipe).map(SkyblockCraftingRecipe.class::cast).map(recipe -> + new RecipeEntry<CraftingRecipe>(recipe.getRecipeIdentifier(), new ShapedRecipe("", CraftingRecipeCategory.MISC, RawShapedRecipe.create(Map.of( 'a', Ingredient.ofStacks(recipe.getGrid().get(0)), 'b', Ingredient.ofStacks(recipe.getGrid().get(1)), 'c', Ingredient.ofStacks(recipe.getGrid().get(2)), diff --git a/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockCategory.java b/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockCategory.java deleted file mode 100644 index 1474c8be..00000000 --- a/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockCategory.java +++ /dev/null @@ -1,84 +0,0 @@ -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().getFirst()).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 deleted file mode 100644 index 3f4d7dd4..00000000 --- a/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockCraftingDisplay.java +++ /dev/null @@ -1,50 +0,0 @@ -package de.hysky.skyblocker.compatibility.rei; - - -import me.shedaniel.rei.api.common.category.CategoryIdentifier; -import me.shedaniel.rei.api.common.display.Display; -import me.shedaniel.rei.api.common.display.DisplaySerializer; -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; - -import org.jetbrains.annotations.Nullable; - -/** - * 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; - } - - @Override - @Nullable - public DisplaySerializer<? extends Display> getSerializer() { - return null; - } -}
\ 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 deleted file mode 100644 index f3ce5532..00000000 --- a/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockCraftingDisplayGenerator.java +++ /dev/null @@ -1,76 +0,0 @@ -package de.hysky.skyblocker.compatibility.rei; - -import de.hysky.skyblocker.skyblock.itemlist.ItemRepository; -import de.hysky.skyblocker.skyblock.itemlist.SkyblockCraftingRecipe; -import de.hysky.skyblocker.utils.ItemUtils; -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 = ItemRepository.getRecipesStream() - .filter(recipe -> { - ItemStack itemStack = inputItem.getValue(); - ItemStack itemStack1 = recipe.getResult(); - return ItemUtils.getItemId(itemStack1).equals(ItemUtils.getItemId(itemStack)); - }) - .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 = ItemRepository.getRecipesStream() - .filter(recipe -> { - for (ItemStack item : recipe.getGrid()) { - if(!ItemUtils.getItemId(item).isEmpty()) { - ItemStack itemStack = inputItem.getValue(); - if (ItemUtils.getItemId(item).equals(ItemUtils.getItemId(itemStack))) 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) { - if (entryStack.isEmpty()) { - inputs.add(EntryIngredient.empty()); - } else { - 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/SkyblockRecipeCategory.java b/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockRecipeCategory.java new file mode 100644 index 00000000..0460a1cf --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockRecipeCategory.java @@ -0,0 +1,94 @@ +package de.hysky.skyblocker.compatibility.rei; + +import de.hysky.skyblocker.skyblock.itemlist.recipes.SkyblockRecipe; +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.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.util.EntryStacks; +import net.minecraft.client.gui.ScreenPos; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import java.util.ArrayList; +import java.util.List; + +/** + * Skyblock recipe category class for REI + */ +public class SkyblockRecipeCategory implements DisplayCategory<SkyblockRecipeDisplay> { + + private final Identifier identifier; + private final Text title; + private final ItemStack icon; + private final int height; + + public SkyblockRecipeCategory(Identifier identifier, Text title, ItemStack icon, int height) { + this.identifier = identifier; + this.title = title; + this.icon = icon; + this.height = height; + } + + @Override + public CategoryIdentifier<? extends SkyblockRecipeDisplay> getCategoryIdentifier() { + return CategoryIdentifier.of(identifier); + } + + @Override + public int getDisplayHeight() { + return height; + } + + @Override + public Text getTitle() { + return title; + } + + @Override + public Renderer getIcon() { + return EntryStacks.of(icon); + } + + /** + * 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(SkyblockRecipeDisplay display, Rectangle bounds) { + List<Widget> out = new ArrayList<>(); + out.add(Widgets.createRecipeBase(bounds)); + SkyblockRecipe recipe = display.getRecipe(); + for (SkyblockRecipe.RecipeSlot inputSlot : recipe.getInputSlots(bounds.getWidth(), bounds.getHeight())) { + out.add(Widgets.createSlot(new Point(inputSlot.x() + bounds.getX(), inputSlot.y() + bounds.getY())) + .markInput() + .backgroundEnabled(inputSlot.showBackground()) + .entry(EntryStacks.of(inputSlot.stack()))); + } + for (SkyblockRecipe.RecipeSlot outputSlot : recipe.getOutputSlots(bounds.getWidth(), bounds.getHeight())) { + out.add(Widgets.createSlot(new Point(outputSlot.x() + bounds.getX(), outputSlot.y() + bounds.getY())) + .markOutput() + .backgroundEnabled(outputSlot.showBackground()) + .entry(EntryStacks.of(outputSlot.stack()))); + } + out.add(Widgets.createDrawableWidget((context, mouseX, mouseY, delta) -> { + MatrixStack matrices = context.getMatrices(); + matrices.push(); + matrices.translate(bounds.getX(), bounds.getY(), 0.f); + recipe.render(context, bounds.getWidth(), bounds.getHeight(), mouseX - bounds.getX(), mouseY - bounds.getY()); + matrices.pop(); + })); + ScreenPos arrowLocation = recipe.getArrowLocation(bounds.getWidth(), bounds.getHeight()); + if (arrowLocation != null) + out.add(Widgets.createArrow(new Point(arrowLocation.x() + bounds.getX(), arrowLocation.y() + bounds.getY()))); + out.add(Widgets.createLabel(new Point(bounds.getCenterX(), bounds.getCenterY() + 24), recipe.getExtraText())); + return out; + } +} diff --git a/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockRecipeDisplay.java b/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockRecipeDisplay.java new file mode 100644 index 00000000..44d44011 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockRecipeDisplay.java @@ -0,0 +1,56 @@ +package de.hysky.skyblocker.compatibility.rei; + +import de.hysky.skyblocker.skyblock.itemlist.recipes.SkyblockRecipe; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.Display; +import me.shedaniel.rei.api.common.display.DisplaySerializer; +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.api.common.util.EntryStacks; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Optional; + +/** + * Skyblock Crafting Recipe display class for REI + */ +public class SkyblockRecipeDisplay implements Display { + + private final Identifier category; + private final SkyblockRecipe recipe; + + public SkyblockRecipeDisplay(SkyblockRecipe recipe) { + this.category = recipe.getCategoryIdentifier(); + this.recipe = recipe; + } + + @Override + public List<EntryIngredient> getInputEntries() { + return recipe.getInputs().stream().map(EntryStacks::of).map(EntryIngredient::of).toList(); + } + + @Override + public List<EntryIngredient> getOutputEntries() { + return recipe.getOutputs().stream().map(EntryStacks::of).map(EntryIngredient::of).toList(); + } + + public SkyblockRecipe getRecipe() { + return recipe; + } + + @Override + public CategoryIdentifier<?> getCategoryIdentifier() { + return CategoryIdentifier.of(category); + } + + @Override + public Optional<Identifier> getDisplayLocation() { + return Optional.empty(); + } + + @Override + public @Nullable DisplaySerializer<? extends Display> getSerializer() { + return null; + } +} diff --git a/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockRecipeDisplayGenerator.java b/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockRecipeDisplayGenerator.java new file mode 100644 index 00000000..fa4787df --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockRecipeDisplayGenerator.java @@ -0,0 +1,27 @@ +package de.hysky.skyblocker.compatibility.rei; + +import de.hysky.skyblocker.skyblock.itemlist.ItemRepository; +import de.hysky.skyblocker.utils.ItemUtils; +import de.hysky.skyblocker.utils.NEURepoManager; +import me.shedaniel.rei.api.client.registry.display.DynamicDisplayGenerator; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; +import net.minecraft.item.ItemStack; + +import java.util.List; +import java.util.Optional; + +public class SkyblockRecipeDisplayGenerator implements DynamicDisplayGenerator<SkyblockRecipeDisplay> { + + @Override + public Optional<List<SkyblockRecipeDisplay>> getRecipeFor(EntryStack<?> entry) { + if (!(entry.getValue() instanceof ItemStack entryStack)) return Optional.empty(); + return Optional.of(ItemRepository.getRecipes(entryStack).map(SkyblockRecipeDisplay::new).toList()); + } + + @Override + public Optional<List<SkyblockRecipeDisplay>> getUsageFor(EntryStack<?> entry) { + if (!(entry.getValue() instanceof ItemStack entryStack)) return Optional.empty(); + return Optional.of(ItemRepository.getUsages(entryStack).map(SkyblockRecipeDisplay::new).toList()); + } +} diff --git a/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockerREIClientPlugin.java b/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockerREIClientPlugin.java index 7b1f7148..d4c9fe8f 100644 --- a/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockerREIClientPlugin.java +++ b/src/main/java/de/hysky/skyblocker/compatibility/rei/SkyblockerREIClientPlugin.java @@ -1,10 +1,12 @@ package de.hysky.skyblocker.compatibility.rei; -import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor; import de.hysky.skyblocker.skyblock.garden.visitor.VisitorHelper; import de.hysky.skyblocker.skyblock.itemlist.ItemRepository; +import de.hysky.skyblocker.skyblock.itemlist.recipes.SkyblockCraftingRecipe; +import de.hysky.skyblocker.skyblock.itemlist.recipes.SkyblockForgeRecipe; +import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Location; import de.hysky.skyblocker.utils.Utils; import me.shedaniel.math.Rectangle; @@ -15,9 +17,11 @@ import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.client.registry.screen.ExclusionZones; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.util.EntryStacks; +import net.minecraft.item.ItemStack; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.InventoryScreen; import net.minecraft.item.Items; +import net.minecraft.text.Text; import java.util.List; @@ -25,21 +29,26 @@ import java.util.List; * 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()); + if (!SkyblockerConfigManager.get().general.itemList.enableItemList) return; + categoryRegistry.addWorkstations(CategoryIdentifier.of(SkyblockCraftingRecipe.IDENTIFIER), EntryStacks.of(Items.CRAFTING_TABLE)); + categoryRegistry.addWorkstations(CategoryIdentifier.of(SkyblockForgeRecipe.IDENTIFIER), EntryStacks.of(Items.ANVIL)); + categoryRegistry.add(new SkyblockRecipeCategory(SkyblockCraftingRecipe.IDENTIFIER, Text.translatable("emi.category.skyblocker.skyblock_crafting"), ItemUtils.getSkyblockerStack(), 73)); + categoryRegistry.add(new SkyblockRecipeCategory(SkyblockForgeRecipe.IDENTIFIER, Text.translatable("emi.category.skyblocker.skyblock_forge"), ItemUtils.getSkyblockerFo |
