diff options
| author | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2024-08-18 15:41:11 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-18 15:41:11 -0400 |
| commit | 31af537e8ea86c2208ca75f708d55845408c94be (patch) | |
| tree | c1307107b8e33dbb9463afafeedf75f242358aa1 /src/main/java/de | |
| parent | ec6a2176bf6636c3c2fe1daaa5d2d228e946cd87 (diff) | |
| parent | 39d78b4bf85d745559bc9eaecce807aaf5fd450e (diff) | |
| download | Skyblocker-31af537e8ea86c2208ca75f708d55845408c94be.tar.gz Skyblocker-31af537e8ea86c2208ca75f708d55845408c94be.tar.bz2 Skyblocker-31af537e8ea86c2208ca75f708d55845408c94be.zip | |
Merge pull request #448 from kevinthegreat1/jei
Add JEI integration
Diffstat (limited to 'src/main/java/de')
5 files changed, 125 insertions, 12 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 218eb8d1..7f102fc1 100644 --- a/src/main/java/de/hysky/skyblocker/compatibility/emi/SkyblockEmiRecipe.java +++ b/src/main/java/de/hysky/skyblocker/compatibility/emi/SkyblockEmiRecipe.java @@ -1,7 +1,6 @@ package de.hysky.skyblocker.compatibility.emi; import de.hysky.skyblocker.skyblock.itemlist.SkyblockCraftingRecipe; -import de.hysky.skyblocker.utils.ItemUtils; import dev.emi.emi.api.recipe.EmiCraftingRecipe; import dev.emi.emi.api.recipe.EmiRecipeCategory; import dev.emi.emi.api.stack.EmiIngredient; @@ -9,13 +8,12 @@ import dev.emi.emi.api.stack.EmiStack; import dev.emi.emi.api.widget.WidgetHolder; import net.minecraft.client.MinecraftClient; import net.minecraft.text.Text; -import net.minecraft.util.Identifier; public class SkyblockEmiRecipe extends EmiCraftingRecipe { private final String craftText; public SkyblockEmiRecipe(SkyblockCraftingRecipe recipe) { - super(recipe.getGrid().stream().map(EmiStack::of).map(EmiIngredient.class::cast).toList(), EmiStack.of(recipe.getResult()), Identifier.of("skyblock", ItemUtils.getItemId(recipe.getResult()).toLowerCase().replace(';', '_') + "_" + recipe.getResult().getCount())); + super(recipe.getGrid().stream().map(EmiStack::of).map(EmiIngredient.class::cast).toList(), EmiStack.of(recipe.getResult()), recipe.getId()); this.craftText = recipe.getCraftText(); } diff --git a/src/main/java/de/hysky/skyblocker/compatibility/jei/SkyblockCraftingRecipeCategory.java b/src/main/java/de/hysky/skyblocker/compatibility/jei/SkyblockCraftingRecipeCategory.java new file mode 100644 index 00000000..c08155a5 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/compatibility/jei/SkyblockCraftingRecipeCategory.java @@ -0,0 +1,42 @@ +package de.hysky.skyblocker.compatibility.jei; + +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.utils.ItemUtils; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.RecipeType; +import mezz.jei.library.plugins.vanilla.crafting.CraftingRecipeCategory; +import net.minecraft.recipe.CraftingRecipe; +import net.minecraft.recipe.RecipeEntry; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; +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 IDrawable icon; + + public SkyblockCraftingRecipeCategory(IGuiHelper guiHelper) { + super(guiHelper); + icon = guiHelper.createDrawableItemStack(ItemUtils.getSkyblockerStack()); + } + + @Override + @NotNull + public RecipeType<RecipeEntry<CraftingRecipe>> getRecipeType() { + return SKYBLOCK_RECIPE; + } + + @NotNull + @Override + public Text getTitle() { + return title; + } + + @Override + public IDrawable getIcon() { + return icon; + } +}
\ No newline at end of file diff --git a/src/main/java/de/hysky/skyblocker/compatibility/jei/SkyblockerJEIPlugin.java b/src/main/java/de/hysky/skyblocker/compatibility/jei/SkyblockerJEIPlugin.java new file mode 100644 index 00000000..a1e57682 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/compatibility/jei/SkyblockerJEIPlugin.java @@ -0,0 +1,65 @@ +package de.hysky.skyblocker.compatibility.jei; + +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.skyblock.itemlist.ItemRepository; +import de.hysky.skyblocker.utils.datafixer.ItemStackComponentizationFixer; +import mezz.jei.api.IModPlugin; +import mezz.jei.api.JeiPlugin; +import mezz.jei.api.constants.VanillaTypes; +import mezz.jei.api.registration.IRecipeCategoryRegistration; +import mezz.jei.api.registration.IRecipeRegistration; +import mezz.jei.api.registration.ISubtypeRegistration; +import mezz.jei.library.ingredients.subtypes.SubtypeInterpreters; +import mezz.jei.library.load.registration.SubtypeRegistration; +import mezz.jei.library.plugins.vanilla.crafting.CraftingCategoryExtension; +import net.minecraft.item.ItemStack; +import net.minecraft.recipe.*; +import net.minecraft.recipe.book.CraftingRecipeCategory; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.NotNull; + +import java.util.Map; + +@JeiPlugin +public class SkyblockerJEIPlugin implements IModPlugin { + private SkyblockCraftingRecipeCategory skyblockCraftingRecipeCategory; + + @Override + @NotNull + public Identifier getPluginUid() { + return Identifier.of(SkyblockerMod.NAMESPACE, "skyblock"); + } + + @Override + public void registerItemSubtypes(@NotNull ISubtypeRegistration registration) { + SubtypeInterpreters interpreters = ((SubtypeRegistration) registration).getInterpreters(); + ItemRepository.getItemsStream().filter(stack -> !interpreters.contains(VanillaTypes.ITEM_STACK, stack)).map(ItemStack::getItem).distinct().forEach(item -> + registration.registerSubtypeInterpreter(item, (stack, context) -> ItemStackComponentizationFixer.componentsAsString(stack)) + ); + } + + @Override + public void registerCategories(@NotNull IRecipeCategoryRegistration registration) { + skyblockCraftingRecipeCategory = new SkyblockCraftingRecipeCategory(registration.getJeiHelpers().getGuiHelper()); + skyblockCraftingRecipeCategory.addExtension(CraftingRecipe.class, new CraftingCategoryExtension()); + registration.addRecipeCategories(skyblockCraftingRecipeCategory); + } + + @Override + public void registerRecipes(@NotNull IRecipeRegistration registration) { + 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( + 'a', Ingredient.ofStacks(recipe.getGrid().get(0)), + 'b', Ingredient.ofStacks(recipe.getGrid().get(1)), + 'c', Ingredient.ofStacks(recipe.getGrid().get(2)), + 'd', Ingredient.ofStacks(recipe.getGrid().get(3)), + 'e', Ingredient.ofStacks(recipe.getGrid().get(4)), + 'f', Ingredient.ofStacks(recipe.getGrid().get(5)), + 'g', Ingredient.ofStacks(recipe.getGrid().get(6)), + 'h', Ingredient.ofStacks(recipe.getGrid().get(7)), + 'i', Ingredient.ofStacks(recipe.getGrid().get(8)) + ), "abc", "def", "ghi"), recipe.getResult())) + ).toList()); + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SkyblockCraftingRecipe.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SkyblockCraftingRecipe.java index f5b379dc..bc6d7977 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SkyblockCraftingRecipe.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SkyblockCraftingRecipe.java @@ -1,9 +1,11 @@ package de.hysky.skyblocker.skyblock.itemlist; +import de.hysky.skyblocker.utils.ItemUtils; import io.github.moulberry.repo.data.NEUCraftingRecipe; import io.github.moulberry.repo.data.NEUIngredient; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; +import net.minecraft.util.Identifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,4 +54,8 @@ public class SkyblockCraftingRecipe { public String getCraftText() { return craftText; } + + public Identifier getId() { + return Identifier.of("skyblock", ItemUtils.getItemId(getResult()).toLowerCase().replace(';', '_') + "_" + getResult().getCount()); + } } diff --git a/src/main/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixer.java b/src/main/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixer.java index a9b227a1..9c74cc99 100644 --- a/src/main/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixer.java +++ b/src/main/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixer.java @@ -10,6 +10,7 @@ import com.mojang.serialization.Dynamic; import net.minecraft.client.MinecraftClient; import net.minecraft.command.argument.ItemStringReader; import net.minecraft.command.argument.ItemStringReader.ItemResult; +import net.minecraft.component.Component; import net.minecraft.component.ComponentType; import net.minecraft.datafixer.Schemas; import net.minecraft.datafixer.TypeReferences; @@ -48,15 +49,16 @@ public class ItemStackComponentizationFixer { RegistryOps<NbtElement> nbtRegistryOps = getRegistryLookup().getOps(NbtOps.INSTANCE); return Arrays.toString(stack.getComponentChanges().entrySet().stream().map(entry -> { - @SuppressWarnings("unchecked") - ComponentType<Object> dataComponentType = (ComponentType<Object>) entry.getKey(); - Identifier componentId = Registries.DATA_COMPONENT_TYPE.getId(dataComponentType); - Optional<NbtElement> encodedComponent = dataComponentType.getCodec().encodeStart(nbtRegistryOps, entry.getValue().orElseThrow()).result(); + ComponentType<?> componentType = entry.getKey(); + Identifier componentId = Registries.DATA_COMPONENT_TYPE.getId(componentType); + if (componentId == null) return null; - if (componentId == null || encodedComponent.isEmpty()) { - return null; - } + Optional<?> component = entry.getValue(); + if (component.isEmpty()) return "!" + componentId; + Optional<NbtElement> encodedComponent = Component.of(componentType, component.get()).encode(nbtRegistryOps).result(); + + if (encodedComponent.isEmpty()) return null; return componentId + "=" + encodedComponent.orElseThrow(); }).filter(Objects::nonNull).toArray()); } @@ -87,6 +89,6 @@ public class ItemStackComponentizationFixer { */ public static WrapperLookup getRegistryLookup() { MinecraftClient client = MinecraftClient.getInstance(); - return client != null && client.getNetworkHandler() != null && client.getNetworkHandler().getRegistryManager() != null ? client.getNetworkHandler().getRegistryManager() : LOOKUP; - } + return client != null && client.getNetworkHandler() != null && client.getNetworkHandler().getRegistryManager() != null ? client.getNetworkHandler().getRegistryManager() : LOOKUP; + } } |
