From 99ba3f0be8835dac87b506a37f2a62ba89af0ca0 Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Sat, 27 Jan 2024 03:22:37 +0200 Subject: Add support for a bunch of mods --- src/main/java/lv/enes/mc/eris_alchemy/Emc.java | 13 +++--- .../mc/eris_alchemy/recipe/SimplifiedRecipe.java | 50 ++++++++++++++++------ .../enes/mc/eris_alchemy/utils/ForeignUtils.java | 14 ++++++ 3 files changed, 55 insertions(+), 22 deletions(-) create mode 100644 src/main/java/lv/enes/mc/eris_alchemy/utils/ForeignUtils.java (limited to 'src/main/java/lv') diff --git a/src/main/java/lv/enes/mc/eris_alchemy/Emc.java b/src/main/java/lv/enes/mc/eris_alchemy/Emc.java index 731ecee..576fdc2 100644 --- a/src/main/java/lv/enes/mc/eris_alchemy/Emc.java +++ b/src/main/java/lv/enes/mc/eris_alchemy/Emc.java @@ -87,9 +87,7 @@ public final class Emc { public static void initClient(Minecraft ignoredClient) { ClientPlayNetworking.registerGlobalReceiver( NetworkingConstants.UPDATE_EMCS, - (client, handler, buf, responseSender) -> { - syncFrom(buf); - } + (client, handler, buf, responseSender) -> syncFrom(buf) ); } @@ -98,9 +96,7 @@ public final class Emc { reinit(); warnOfMissingValues(); - ServerPlayConnectionEvents.JOIN.register((handler, sender, server1) -> { - syncTo(handler.getPlayer()); - }); + ServerPlayConnectionEvents.JOIN.register((handler, sender, server1) -> syncTo(handler.getPlayer())); } public static void reloadData( @@ -192,7 +188,8 @@ public final class Emc { world.getRecipeManager() .getRecipes() .stream() - .map(recipe -> new SimplifiedRecipe(recipe, world.registryAccess())) + .map(recipe -> SimplifiedRecipe.of(recipe, world.registryAccess())) + .flatMap(List::stream) ); } @@ -226,7 +223,7 @@ public final class Emc { var sortedItems = sorted(recipes); sortedItems.stream() .filter(id -> !VALUES.containsKey(id)) - .forEach(id -> VALUES.put(id, calcEmc(id, recipes))); + .forEach(id -> calcEmc(id, recipes).ifPresent(v -> VALUES.put(id, OptionalDouble.of(v)))); ErisAlchemy.LOGGER.info("Done calculating EMC values..."); sync(); diff --git a/src/main/java/lv/enes/mc/eris_alchemy/recipe/SimplifiedRecipe.java b/src/main/java/lv/enes/mc/eris_alchemy/recipe/SimplifiedRecipe.java index 469ed52..6bb1274 100644 --- a/src/main/java/lv/enes/mc/eris_alchemy/recipe/SimplifiedRecipe.java +++ b/src/main/java/lv/enes/mc/eris_alchemy/recipe/SimplifiedRecipe.java @@ -4,13 +4,17 @@ import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; +import earth.terrarium.chipped.common.recipe.ChippedRecipe; import jakarta.annotation.Nonnull; +import lv.enes.mc.eris_alchemy.utils.ForeignUtils; import lv.enes.mc.eris_alchemy.utils.IngredientProvider; import lv.enes.mc.eris_alchemy.utils.ItemUtils; import lv.enes.mc.eris_alchemy.utils.RecipeUtils; +import net.minecraft.core.Holder; import net.minecraft.core.RegistryAccess; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; @@ -21,20 +25,45 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Objects; +import java.util.function.Predicate; import java.util.function.Supplier; import java.util.stream.Stream; public record SimplifiedRecipe(ItemStack output, List remainder, List> input) { - public SimplifiedRecipe(Recipe recipe, RegistryAccess registryAccess) { - this( + public static List of(Recipe recipe, RegistryAccess registryAccess) { + if (ForeignUtils.IS_CHIPPED_AVAILABLE && recipe instanceof ChippedRecipe chippedRecipe) { + var remainder = List.of(); + return chippedRecipe.tags() + .stream() + .flatMap(tag -> { + var items = tag.stream().map(Holder::value).toList(); + Predicate isOutput = item -> ItemUtils.getId(item).getNamespace().equals("chipped"); + var inputs = items.stream() + .filter(item -> !isOutput.test(item)) + .map(Ingredient::of) + .map(x -> (Supplier) () -> x) + .map(List::of) + .toList(); + var outputs = items.stream().filter(isOutput).map(Item::getDefaultInstance).toList(); + return outputs.stream() + .flatMap( + output -> + inputs.stream() + .map(input -> new SimplifiedRecipe(output, remainder, input)) + ); + }) + .toList(); + } + + return List.of(new SimplifiedRecipe( RecipeUtils.getOutput(recipe, registryAccess), - List.of(), // TODO: + List.of(), // TODO RecipeUtils.getIngredients(recipe) .stream() .filter(ingredient -> !ingredient.isEmpty()) - .map(x -> (Supplier) () -> x) + .map(x -> (Supplier)() -> x) .toList() - ); + )); } public Stream dependencies() { @@ -45,15 +74,8 @@ public record SimplifiedRecipe(ItemStack output, List remainder, List } public boolean hasDuplication() { - var outputId = ItemUtils.getId(output); - var outputsInRemainder = remainder.stream() - .map(ItemUtils::getId) - .anyMatch(id -> Objects.equals(id, outputId)); - if (outputsInRemainder) { - return true; - } - - return input.stream().anyMatch(ingredient -> ingredient.get().test(output)); + return remainder.stream().anyMatch(stack -> ItemStack.isSameItem(stack, output)) + || input.stream().anyMatch(ingredient -> ingredient.get().test(output)); } public boolean isAllowed(BannedRecipe ban) { diff --git a/src/main/java/lv/enes/mc/eris_alchemy/utils/ForeignUtils.java b/src/main/java/lv/enes/mc/eris_alchemy/utils/ForeignUtils.java new file mode 100644 index 0000000..b686a9e --- /dev/null +++ b/src/main/java/lv/enes/mc/eris_alchemy/utils/ForeignUtils.java @@ -0,0 +1,14 @@ +package lv.enes.mc.eris_alchemy.utils; + +public class ForeignUtils { + public static boolean IS_CHIPPED_AVAILABLE = check("earth.terrarium.chipped.Chipped"); + + private static boolean check(String className) { + try { + Class.forName(className); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } +} -- cgit v1.2.3