diff options
Diffstat (limited to 'src')
8 files changed, 333 insertions, 50 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java index 68f587bc..a1507b95 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java @@ -29,7 +29,7 @@ public class ItemRegistry { protected static final List<ItemStack> items = new ArrayList<>(); protected static final Map<String, ItemStack> itemsMap = new HashMap<>(); - protected static final List<Recipe> recipes = new ArrayList<>(); + protected static final List<SkyblockCraftingRecipe> recipes = new ArrayList<>(); public static final MinecraftClient client = MinecraftClient.getInstance(); public static boolean filesImported = false; @@ -98,13 +98,13 @@ public class ItemRegistry { } for (JsonObject jsonObj : jsonObjs) if (jsonObj.has("recipe")) { - recipes.add(Recipe.fromJsonObject(jsonObj)); + recipes.add(SkyblockCraftingRecipe.fromJsonObject(jsonObj)); } items.sort((lhs, rhs) -> { - String lhsInternalName = lhs.getNbt().getCompound("ExtraAttributes").getString("id"); + String lhsInternalName = getInternalName(lhs); String lhsFamilyName = lhsInternalName.replaceAll(".\\d+$", ""); - String rhsInternalName = rhs.getNbt().getCompound("ExtraAttributes").getString("id"); + String rhsInternalName = getInternalName(rhs); String rhsFamilyName = rhsInternalName.replaceAll(".\\d+$", ""); if (lhsFamilyName.equals(rhsFamilyName)) { if (lhsInternalName.length() != rhsInternalName.length()) @@ -134,56 +134,33 @@ public class ItemRegistry { } } - public static List<Recipe> getRecipes(String internalName) { - List<Recipe> result = new ArrayList<>(); - for (Recipe recipe : recipes) - if (recipe.result.getNbt().getCompound("ExtraAttributes").getString("id").equals(internalName)) + public static List<SkyblockCraftingRecipe> getRecipes(String internalName) { + List<SkyblockCraftingRecipe> result = new ArrayList<>(); + for (SkyblockCraftingRecipe recipe : recipes) + if (getInternalName(recipe.result).equals(internalName)) result.add(recipe); - for (Recipe recipe : recipes) + for (SkyblockCraftingRecipe recipe : recipes) for (ItemStack ingredient : recipe.grid) - if (!ingredient.getItem().equals(Items.AIR) && ingredient.getNbt().getCompound("ExtraAttributes").getString("id").equals(internalName)) { + if (!ingredient.getItem().equals(Items.AIR) && getInternalName(ingredient).equals(internalName)) { result.add(recipe); break; } return result; } -} -class Recipe { - private static final Logger LOGGER = LoggerFactory.getLogger(Recipe.class); - String text = ""; - final List<ItemStack> grid = new ArrayList<>(9); - ItemStack result; - - public static Recipe fromJsonObject(JsonObject jsonObj) { - Recipe recipe = new Recipe(); - if (jsonObj.has("crafttext")) recipe.text = jsonObj.get("crafttext").getAsString(); - recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("A1").getAsString())); - recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("A2").getAsString())); - recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("A3").getAsString())); - recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("B1").getAsString())); - recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("B2").getAsString())); - recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("B3").getAsString())); - recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("C1").getAsString())); - recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("C2").getAsString())); - recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("C3").getAsString())); - recipe.result = ItemRegistry.itemsMap.get(jsonObj.get("internalname").getAsString()); - return recipe; + public static List<SkyblockCraftingRecipe> getRecipes() { + return recipes; } - private static ItemStack getItemStack(String internalName) { - try { - if (internalName.length() > 0) { - int count = Integer.parseInt(internalName.split(":").length > 1 ? internalName.split(":")[1] : "1"); - internalName = internalName.split(":")[0]; - ItemStack itemStack = ItemRegistry.itemsMap.get(internalName).copy(); - itemStack.setCount(count); - return itemStack; - } - } - catch(Exception e) { - LOGGER.error("[Skyblocker-Recipe] "+internalName,e); - } - return Items.AIR.getDefaultStack(); + /** + * Get Internal name of an ItemStack + * + * @param itemStack ItemStack to get internal name from + * @return internal name of the given ItemStack + */ + public static String getInternalName(ItemStack itemStack) { + if (itemStack.getNbt() == null) return ""; + return itemStack.getNbt().getCompound("ExtraAttributes").getString("id"); } -}
\ No newline at end of file +} + diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java index 64ba237d..ce53112b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java @@ -22,7 +22,7 @@ public class SearchResultsWidget implements Drawable { private final int parentY; private final List<ItemStack> searchResults = new ArrayList<>(); - private List<Recipe> recipeResults = new ArrayList<>(); + private List<SkyblockCraftingRecipe> recipeResults = new ArrayList<>(); private String searchText = null; private final List<ResultButtonWidget> resultButtons = new ArrayList<>(); private final ToggleButtonWidget nextPageButton; @@ -79,7 +79,7 @@ public class SearchResultsWidget implements Drawable { private void updateButtons() { if (this.displayRecipes) { - Recipe recipe = this.recipeResults.get(this.currentPage); + SkyblockCraftingRecipe recipe = this.recipeResults.get(this.currentPage); for (ResultButtonWidget button : resultButtons) button.clearItemStack(); resultButtons.get(5).setItemStack(recipe.grid.get(0)); @@ -109,7 +109,7 @@ public class SearchResultsWidget implements Drawable { public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { RenderSystem.disableDepthTest(); if (this.displayRecipes) { - String craftText = this.recipeResults.get(this.currentPage).text; + String craftText = this.recipeResults.get(this.currentPage).craftText; this.client.textRenderer.drawWithShadow(matrices, craftText, this.parentX + 11, this.parentY + 31, 0xffffffff); Text resultText = this.recipeResults.get(this.currentPage).result.getName(); this.client.textRenderer.drawWithShadow(matrices, resultText, this.parentX + 11, this.parentY + 43, 0xffffffff); @@ -142,7 +142,7 @@ public class SearchResultsWidget implements Drawable { continue; } String internalName = button.itemStack.getNbt().getCompound("ExtraAttributes").getString("id"); - List<Recipe> recipes = ItemRegistry.getRecipes(internalName); + List<SkyblockCraftingRecipe> recipes = ItemRegistry.getRecipes(internalName); if (!recipes.isEmpty()) { this.recipeResults = recipes; this.currentPage = 0; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SkyblockCraftingRecipe.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SkyblockCraftingRecipe.java new file mode 100644 index 00000000..29aed7a1 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SkyblockCraftingRecipe.java @@ -0,0 +1,60 @@ +package me.xmrvizzy.skyblocker.skyblock.itemlist; + +import com.google.gson.JsonObject; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; + +public class SkyblockCraftingRecipe { + private static final Logger LOGGER = LoggerFactory.getLogger(SkyblockCraftingRecipe.class); + String craftText = ""; + final List<ItemStack> grid = new ArrayList<>(9); + ItemStack result; + + public static SkyblockCraftingRecipe fromJsonObject(JsonObject jsonObj) { + SkyblockCraftingRecipe recipe = new SkyblockCraftingRecipe(); + if (jsonObj.has("crafttext")) recipe.craftText = jsonObj.get("crafttext").getAsString(); + recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("A1").getAsString())); + recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("A2").getAsString())); + recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("A3").getAsString())); + recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("B1").getAsString())); + recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("B2").getAsString())); + recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("B3").getAsString())); + recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("C1").getAsString())); + recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("C2").getAsString())); + recipe.grid.add(getItemStack(jsonObj.getAsJsonObject("recipe").get("C3").getAsString())); + recipe.result = ItemRegistry.itemsMap.get(jsonObj.get("internalname").getAsString()); + return recipe; + } + + private static ItemStack getItemStack(String internalName) { + try { + if (internalName.length() > 0) { + int count = internalName.split(":").length == 1 ? 1 : Integer.parseInt(internalName.split(":")[1]); + internalName = internalName.split(":")[0]; + ItemStack itemStack = ItemRegistry.itemsMap.get(internalName).copy(); + itemStack.setCount(count); + return itemStack; + } + } catch (Exception e) { + LOGGER.error("[Skyblocker-Recipe] " + internalName, e); + } + return Items.AIR.getDefaultStack(); + } + + public List<ItemStack> getGrid() { + return grid; + } + + public ItemStack getResult() { + return result; + } + + public String getCraftText() { + return craftText; + } +} 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..3b402dc9 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockCategory.java @@ -0,0 +1,97 @@ +package me.xmrvizzy.skyblocker.skyblock.rei; + +import com.google.common.collect.Lists; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +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 me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.StringNbtReader; +import net.minecraft.text.Text; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +/** + * 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("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); + } + } + + @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/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockCraftingDisplay.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockCraftingDisplay.java new file mode 100644 index 00000000..5820780c --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockCraftingDisplay.java @@ -0,0 +1,39 @@ +package me.xmrvizzy.skyblocker.skyblock.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/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockCraftingDisplayGenerator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockCraftingDisplayGenerator.java new file mode 100644 index 00000000..fd3f56ee --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockCraftingDisplayGenerator.java @@ -0,0 +1,67 @@ +package me.xmrvizzy.skyblocker.skyblock.rei; + +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 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<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.getRecipes() + .stream() + .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.getRecipes() + .stream() + .filter(recipe -> { + for (ItemStack item : recipe.getGrid()) { + if(!ItemRegistry.getInternalName(item).equals("") && 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/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockerREIClientPlugin.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockerREIClientPlugin.java new file mode 100644 index 00000000..5f43ca0e --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rei/SkyblockerREIClientPlugin.java @@ -0,0 +1,40 @@ +package me.xmrvizzy.skyblocker.skyblock.rei; + +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.entry.EntryStack; +import me.shedaniel.rei.api.common.util.EntryStacks; +import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; + +import java.util.ArrayList; + +/** + * 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) { + ArrayList<EntryStack<ItemStack>> entries = new ArrayList<>(); + ItemRegistry.getRecipes().forEach(recipe -> entries.add(EntryStacks.of(recipe.getResult()))); + entryRegistry.addEntries(entries); + } +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index d8ef4941..52cedcfb 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -20,6 +20,9 @@ ], "modmenu": [ "me.xmrvizzy.skyblocker.config.modmenu.ModMenuEntry" + ], + "rei_client": [ + "me.xmrvizzy.skyblocker.skyblock.rei.SkyblockerREIClientPlugin" ] }, "mixins": [ |