From 2f9c6fe279671c444260d62b4c631873b46544f6 Mon Sep 17 00:00:00 2001 From: Swedz Date: Tue, 17 Sep 2024 16:53:27 -0400 Subject: [PATCH 1/2] Simplify internal recipe building --- .../compat/viewer/usage/MachineCategory.java | 41 ++----------------- 1 file changed, 4 insertions(+), 37 deletions(-) diff --git a/src/client/java/aztech/modern_industrialization/compat/viewer/usage/MachineCategory.java b/src/client/java/aztech/modern_industrialization/compat/viewer/usage/MachineCategory.java index 05f5c0e0d..df9d4be89 100644 --- a/src/client/java/aztech/modern_industrialization/compat/viewer/usage/MachineCategory.java +++ b/src/client/java/aztech/modern_industrialization/compat/viewer/usage/MachineCategory.java @@ -38,15 +38,14 @@ import aztech.modern_industrialization.machines.init.MIMachineRecipeTypes; import aztech.modern_industrialization.machines.init.MachineTier; import aztech.modern_industrialization.machines.recipe.MachineRecipe; -import aztech.modern_industrialization.machines.recipe.RecipeConversions; import aztech.modern_industrialization.thirdparty.fabrictransfer.api.fluid.FluidVariant; import aztech.modern_industrialization.util.TextHelper; import java.util.ArrayList; import java.util.Comparator; import java.util.List; -import java.util.Objects; import java.util.function.Consumer; import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; import net.minecraft.core.RegistryAccess; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; @@ -54,9 +53,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeManager; -import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.ComposterBlock; public class MachineCategory extends ViewerCategory> { public static MachineCategory create(MachineCategoryParams params) { @@ -96,41 +93,11 @@ public void buildWorkstations(WorkstationConsumer consumer) { @Override public void buildRecipes(RecipeManager recipeManager, RegistryAccess registryAccess, Consumer> consumer) { - var machineRecipes = recipeManager.getRecipes().stream() - .filter(r -> r.value() instanceof MachineRecipe) - .map(r -> (RecipeHolder) r) - .toList(); - - // regular recipes - machineRecipes.stream() - .filter(r -> params.recipePredicate.test(r.value())) + MIMachineRecipeTypes.getRecipeTypes().stream() + .flatMap(type -> type.getRecipes(Minecraft.getInstance().level).stream()) + .filter(recipe -> params.recipePredicate.test(recipe.value())) .sorted(Comparator.comparing(RecipeHolder::id)) .forEach(consumer); - - // converted recipes - if (params.category.getNamespace().equals(MI.ID)) { - switch (params.category.getPath()) { - case "bronze_furnace" -> { - recipeManager.getAllRecipesFor(RecipeType.SMELTING) - .stream() - .map(r -> RecipeConversions.ofSmelting(r, MIMachineRecipeTypes.FURNACE, registryAccess)) - .forEach(consumer); - } - case "bronze_cutting_machine" -> { - recipeManager.getAllRecipesFor(RecipeType.STONECUTTING) - .stream() - .map(r -> RecipeConversions.ofStonecutting(r, MIMachineRecipeTypes.CUTTING_MACHINE, registryAccess)) - .forEach(consumer); - } - case "centrifuge" -> { - ComposterBlock.COMPOSTABLES.keySet() - .stream() - .map(RecipeConversions::ofCompostable) - .filter(Objects::nonNull) - .forEach(consumer); - } - } - } } @Override From c723cc367c2788e6b1b9be8fc87e771004bbedbe Mon Sep 17 00:00:00 2001 From: Technici4n <13494793+Technici4n@users.noreply.github.com> Date: Mon, 25 Nov 2024 01:03:55 +0100 Subject: [PATCH 2/2] Don't go through MachineRecipeType caching on the client side --- .../compat/viewer/usage/MachineCategory.java | 4 +--- .../rei/machines/MachineCategoryParams.java | 7 +++++-- .../AbstractCraftingMachineBlockEntity.java | 6 +++--- ...ElectricCraftingMultiblockBlockEntity.java | 6 +++--- .../SteamCraftingMultiblockBlockEntity.java | 6 +++--- .../machines/components/CrafterComponent.java | 5 ++--- .../machines/init/MultiblockMachines.java | 2 +- .../init/SingleBlockCraftingMachines.java | 4 ++-- .../recipe/CentrifugeMachineRecipeType.java | 4 +++- .../recipe/CuttingMachineRecipeType.java | 4 +++- .../machines/recipe/FurnaceRecipeProxy.java | 3 ++- .../machines/recipe/MachineRecipeType.java | 19 +++++++++++-------- .../recipe/ProxyableMachineRecipeType.java | 16 ++++++++++++---- 13 files changed, 51 insertions(+), 35 deletions(-) diff --git a/src/client/java/aztech/modern_industrialization/compat/viewer/usage/MachineCategory.java b/src/client/java/aztech/modern_industrialization/compat/viewer/usage/MachineCategory.java index df9d4be89..9fd62cdd6 100644 --- a/src/client/java/aztech/modern_industrialization/compat/viewer/usage/MachineCategory.java +++ b/src/client/java/aztech/modern_industrialization/compat/viewer/usage/MachineCategory.java @@ -35,7 +35,6 @@ import aztech.modern_industrialization.machines.gui.MachineScreen; import aztech.modern_industrialization.machines.guicomponents.EnergyBarClient; import aztech.modern_industrialization.machines.guicomponents.ProgressBarClient; -import aztech.modern_industrialization.machines.init.MIMachineRecipeTypes; import aztech.modern_industrialization.machines.init.MachineTier; import aztech.modern_industrialization.machines.recipe.MachineRecipe; import aztech.modern_industrialization.thirdparty.fabrictransfer.api.fluid.FluidVariant; @@ -93,8 +92,7 @@ public void buildWorkstations(WorkstationConsumer consumer) { @Override public void buildRecipes(RecipeManager recipeManager, RegistryAccess registryAccess, Consumer> consumer) { - MIMachineRecipeTypes.getRecipeTypes().stream() - .flatMap(type -> type.getRecipes(Minecraft.getInstance().level).stream()) + params.recipeType.getRecipesWithoutCache(Minecraft.getInstance().level).stream() .filter(recipe -> params.recipePredicate.test(recipe.value())) .sorted(Comparator.comparing(RecipeHolder::id)) .forEach(consumer); diff --git a/src/main/java/aztech/modern_industrialization/compat/rei/machines/MachineCategoryParams.java b/src/main/java/aztech/modern_industrialization/compat/rei/machines/MachineCategoryParams.java index 9027de47b..721c1ea27 100644 --- a/src/main/java/aztech/modern_industrialization/compat/rei/machines/MachineCategoryParams.java +++ b/src/main/java/aztech/modern_industrialization/compat/rei/machines/MachineCategoryParams.java @@ -26,6 +26,7 @@ import aztech.modern_industrialization.inventory.SlotPositions; import aztech.modern_industrialization.machines.guicomponents.ProgressBar; import aztech.modern_industrialization.machines.recipe.MachineRecipe; +import aztech.modern_industrialization.machines.recipe.MachineRecipeType; import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; @@ -39,14 +40,15 @@ public class MachineCategoryParams { public final SlotPositions fluidInputs; public final SlotPositions fluidOutputs; public final ProgressBar.Parameters progressBarParams; + public final MachineRecipeType recipeType; public final Predicate recipePredicate; public final boolean isMultiblock; public final SteamMode steamMode; public final List workstations = new ArrayList<>(); public MachineCategoryParams(String englishName, ResourceLocation category, SlotPositions itemInputs, SlotPositions itemOutputs, - SlotPositions fluidInputs, SlotPositions fluidOutputs, ProgressBar.Parameters progressBarParams, Predicate recipePredicate, - boolean isMultiblock, SteamMode steamMode) { + SlotPositions fluidInputs, SlotPositions fluidOutputs, ProgressBar.Parameters progressBarParams, MachineRecipeType recipeType, + Predicate recipePredicate, boolean isMultiblock, SteamMode steamMode) { this.englishName = englishName; this.category = category; this.itemInputs = itemInputs; @@ -54,6 +56,7 @@ public MachineCategoryParams(String englishName, ResourceLocation category, Slot this.fluidInputs = fluidInputs; this.fluidOutputs = fluidOutputs; this.progressBarParams = progressBarParams; + this.recipeType = recipeType; this.recipePredicate = recipePredicate; this.isMultiblock = isMultiblock; this.steamMode = steamMode; diff --git a/src/main/java/aztech/modern_industrialization/machines/blockentities/AbstractCraftingMachineBlockEntity.java b/src/main/java/aztech/modern_industrialization/machines/blockentities/AbstractCraftingMachineBlockEntity.java index 7cfe6eb4b..d1d5f4ee6 100644 --- a/src/main/java/aztech/modern_industrialization/machines/blockentities/AbstractCraftingMachineBlockEntity.java +++ b/src/main/java/aztech/modern_industrialization/machines/blockentities/AbstractCraftingMachineBlockEntity.java @@ -39,7 +39,7 @@ import aztech.modern_industrialization.machines.recipe.MachineRecipeType; import aztech.modern_industrialization.util.Tickable; import java.util.UUID; -import net.minecraft.world.level.Level; +import net.minecraft.server.level.ServerLevel; import org.jetbrains.annotations.Nullable; public abstract class AbstractCraftingMachineBlockEntity extends MachineBlockEntity implements CrafterComponent.Behavior, Tickable, @@ -106,8 +106,8 @@ public MIInventory getInventory() { } @Override - public Level getCrafterWorld() { - return level; + public ServerLevel getCrafterWorld() { + return (ServerLevel) level; } @Override diff --git a/src/main/java/aztech/modern_industrialization/machines/blockentities/multiblocks/AbstractElectricCraftingMultiblockBlockEntity.java b/src/main/java/aztech/modern_industrialization/machines/blockentities/multiblocks/AbstractElectricCraftingMultiblockBlockEntity.java index 1b564feaf..4b511e37e 100644 --- a/src/main/java/aztech/modern_industrialization/machines/blockentities/multiblocks/AbstractElectricCraftingMultiblockBlockEntity.java +++ b/src/main/java/aztech/modern_industrialization/machines/blockentities/multiblocks/AbstractElectricCraftingMultiblockBlockEntity.java @@ -35,10 +35,10 @@ import java.util.List; import java.util.UUID; import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; public abstract class AbstractElectricCraftingMultiblockBlockEntity extends AbstractCraftingMultiblockBlockEntity @@ -109,8 +109,8 @@ public final long consumeEu(long max, Simulation simulation) { } @Override - public final Level getCrafterWorld() { - return level; + public final ServerLevel getCrafterWorld() { + return (ServerLevel) level; } @Override diff --git a/src/main/java/aztech/modern_industrialization/machines/blockentities/multiblocks/SteamCraftingMultiblockBlockEntity.java b/src/main/java/aztech/modern_industrialization/machines/blockentities/multiblocks/SteamCraftingMultiblockBlockEntity.java index f7d26d5ea..69cf0c6aa 100644 --- a/src/main/java/aztech/modern_industrialization/machines/blockentities/multiblocks/SteamCraftingMultiblockBlockEntity.java +++ b/src/main/java/aztech/modern_industrialization/machines/blockentities/multiblocks/SteamCraftingMultiblockBlockEntity.java @@ -38,10 +38,10 @@ import java.util.UUID; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; public class SteamCraftingMultiblockBlockEntity extends AbstractCraftingMultiblockBlockEntity { @@ -105,8 +105,8 @@ public long getMaxRecipeEu() { } @Override - public Level getCrafterWorld() { - return level; + public ServerLevel getCrafterWorld() { + return (ServerLevel) level; } @Override diff --git a/src/main/java/aztech/modern_industrialization/machines/components/CrafterComponent.java b/src/main/java/aztech/modern_industrialization/machines/components/CrafterComponent.java index b913def4a..5e03261a2 100644 --- a/src/main/java/aztech/modern_industrialization/machines/components/CrafterComponent.java +++ b/src/main/java/aztech/modern_industrialization/machines/components/CrafterComponent.java @@ -57,7 +57,6 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.RecipeHolder; -import net.minecraft.world.level.Level; import net.minecraft.world.level.material.Fluid; import org.jetbrains.annotations.Nullable; @@ -104,7 +103,7 @@ default boolean isOverdriving() { } // can't use getWorld() or the remapping will fail - Level getCrafterWorld(); + ServerLevel getCrafterWorld(); default int getMaxFluidOutputs() { return Integer.MAX_VALUE; @@ -627,7 +626,7 @@ protected void clearLocks() { public void lockRecipe(ResourceLocation recipeId, net.minecraft.world.entity.player.Inventory inventory) { // Find MachineRecipe - Optional> optionalMachineRecipe = behavior.recipeType().getRecipes(behavior.getCrafterWorld()).stream() + Optional> optionalMachineRecipe = behavior.recipeType().getRecipesWithCache(behavior.getCrafterWorld()).stream() .filter(recipe -> recipe.id().equals(recipeId)).findFirst(); if (optionalMachineRecipe.isEmpty()) return; diff --git a/src/main/java/aztech/modern_industrialization/machines/init/MultiblockMachines.java b/src/main/java/aztech/modern_industrialization/machines/init/MultiblockMachines.java index 8748fa485..9fa3bb376 100644 --- a/src/main/java/aztech/modern_industrialization/machines/init/MultiblockMachines.java +++ b/src/main/java/aztech/modern_industrialization/machines/init/MultiblockMachines.java @@ -790,7 +790,7 @@ public final void register() { ReiMachineRecipes.registerCategory(category, new MachineCategoryParams(englishName, category, itemInputs.build(), itemOutputs.build(), fluidInputs.build(), fluidOutputs.build(), - progressBarParams, recipe -> recipe.getType() == recipeType && extraTest.test(recipe), true, steamMode)); + progressBarParams, recipeType, extraTest, true, steamMode)); for (ResourceLocation workstation : workstations) { ReiMachineRecipes.registerWorkstation(category, workstation); ReiMachineRecipes.registerRecipeCategoryForMachine(workstation, category, ReiMachineRecipes.MachineScreenPredicate.MULTIBLOCK); diff --git a/src/main/java/aztech/modern_industrialization/machines/init/SingleBlockCraftingMachines.java b/src/main/java/aztech/modern_industrialization/machines/init/SingleBlockCraftingMachines.java index f877f3fb8..c439e619e 100644 --- a/src/main/java/aztech/modern_industrialization/machines/init/SingleBlockCraftingMachines.java +++ b/src/main/java/aztech/modern_industrialization/machines/init/SingleBlockCraftingMachines.java @@ -245,7 +245,7 @@ public static void registerMachineTiers(String englishName, String machine, Mach new MachineCategoryParams(null, null, items.sublist(0, itemInputCount), items.sublist(itemInputCount, itemInputCount + itemOutputCount), fluids.sublist(0, fluidInputCount), fluids.sublist(fluidInputCount, fluidInputCount + fluidOutputCount), progressBarParams, - null, false, SteamMode.BOTH), + null, null, false, SteamMode.BOTH), tiers); } @@ -265,7 +265,7 @@ private static void registerReiTiers(String englishName, String machine, Machine MachineCategoryParams category = new MachineCategoryParams(fullEnglishName, MI.id(itemId), categoryParams.itemInputs, categoryParams.itemOutputs, categoryParams.fluidInputs, categoryParams.fluidOutputs, categoryParams.progressBarParams, - recipe -> recipe.getType() == recipeType && minEu <= recipe.eu && recipe.eu <= maxEu, false, + recipeType, recipe -> minEu <= recipe.eu && recipe.eu <= maxEu, false, i < 2 ? SteamMode.BOTH : SteamMode.ELECTRIC_ONLY); ReiMachineRecipes.registerCategory(MI.id(itemId), category); ReiMachineRecipes.registerMachineClickArea(MI.id(itemId), categoryParams.progressBarParams.toRectangle()); diff --git a/src/main/java/aztech/modern_industrialization/machines/recipe/CentrifugeMachineRecipeType.java b/src/main/java/aztech/modern_industrialization/machines/recipe/CentrifugeMachineRecipeType.java index 7d49de2db..1b85eeda5 100644 --- a/src/main/java/aztech/modern_industrialization/machines/recipe/CentrifugeMachineRecipeType.java +++ b/src/main/java/aztech/modern_industrialization/machines/recipe/CentrifugeMachineRecipeType.java @@ -23,7 +23,9 @@ */ package aztech.modern_industrialization.machines.recipe; +import java.util.List; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.ComposterBlock; @@ -34,7 +36,7 @@ public CentrifugeMachineRecipeType(ResourceLocation id) { } @Override - protected void fillRecipeList(Level world) { + protected void fillRecipeList(Level world, List> recipeList) { recipeList.addAll(getManagerRecipes(world)); for (var itemCompostable : ComposterBlock.COMPOSTABLES.keySet()) { diff --git a/src/main/java/aztech/modern_industrialization/machines/recipe/CuttingMachineRecipeType.java b/src/main/java/aztech/modern_industrialization/machines/recipe/CuttingMachineRecipeType.java index 45bfc5302..7bef3a510 100644 --- a/src/main/java/aztech/modern_industrialization/machines/recipe/CuttingMachineRecipeType.java +++ b/src/main/java/aztech/modern_industrialization/machines/recipe/CuttingMachineRecipeType.java @@ -23,7 +23,9 @@ */ package aztech.modern_industrialization.machines.recipe; +import java.util.List; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; @@ -33,7 +35,7 @@ public CuttingMachineRecipeType(ResourceLocation id) { } @Override - protected void fillRecipeList(Level world) { + protected void fillRecipeList(Level world, List> recipeList) { // Add all regular cutting machine recipes recipeList.addAll(getManagerRecipes(world)); // Add all stone cutter recipes diff --git a/src/main/java/aztech/modern_industrialization/machines/recipe/FurnaceRecipeProxy.java b/src/main/java/aztech/modern_industrialization/machines/recipe/FurnaceRecipeProxy.java index a1f25d76e..97f700ffa 100644 --- a/src/main/java/aztech/modern_industrialization/machines/recipe/FurnaceRecipeProxy.java +++ b/src/main/java/aztech/modern_industrialization/machines/recipe/FurnaceRecipeProxy.java @@ -26,6 +26,7 @@ import aztech.modern_industrialization.MI; import java.util.*; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; @@ -34,7 +35,7 @@ public FurnaceRecipeProxy(ResourceLocation id) { super(id); } - protected void fillRecipeList(Level world) { + protected void fillRecipeList(Level world, List> recipeList) { for (var smeltingRecipe : world.getRecipeManager().getAllRecipesFor(RecipeType.SMELTING)) { var recipe = RecipeConversions.ofSmelting(smeltingRecipe, this, world.registryAccess()); recipeList.add(recipe); diff --git a/src/main/java/aztech/modern_industrialization/machines/recipe/MachineRecipeType.java b/src/main/java/aztech/modern_industrialization/machines/recipe/MachineRecipeType.java index 9ef9052a5..fd3fa681a 100644 --- a/src/main/java/aztech/modern_industrialization/machines/recipe/MachineRecipeType.java +++ b/src/main/java/aztech/modern_industrialization/machines/recipe/MachineRecipeType.java @@ -23,7 +23,6 @@ */ package aztech.modern_industrialization.machines.recipe; -import com.google.gson.*; import com.mojang.serialization.DataResult; import com.mojang.serialization.MapCodec; import java.util.*; @@ -59,17 +58,21 @@ public MachineRecipeType(ResourceLocation id) { /** * Never modify or store the result! */ - protected Collection> getManagerRecipes(Level world) { - return world.getRecipeManager().getAllRecipesFor(this); + protected Collection> getManagerRecipes(Level level) { + return level.getRecipeManager().getAllRecipesFor(this); } - public Collection> getRecipes(Level world) { - return getManagerRecipes(world); + public Collection> getRecipesWithoutCache(Level level) { + return getManagerRecipes(level); + } + + public Collection> getRecipesWithCache(ServerLevel level) { + return getManagerRecipes(level); } @Nullable - public RecipeHolder getRecipe(Level world, ResourceLocation id) { - return getRecipes(world).stream().filter(r -> r.id().equals(id)).findFirst().orElse(null); + public RecipeHolder getRecipe(ServerLevel world, ResourceLocation id) { + return getRecipesWithCache(world).stream().filter(r -> r.id().equals(id)).findFirst().orElse(null); } /* @@ -97,7 +100,7 @@ private void updateRecipeCache(ServerLevel world) { lastUpdate = time; recipeCache.clear(); fluidOnlyRecipes.clear(); - for (RecipeHolder recipe : getRecipes(world)) { + for (RecipeHolder recipe : getRecipesWithCache(world)) { if (recipe.value().itemInputs.size() == 0) { if (recipe.value().fluidInputs.size() > 0) { fluidOnlyRecipes.add(recipe); diff --git a/src/main/java/aztech/modern_industrialization/machines/recipe/ProxyableMachineRecipeType.java b/src/main/java/aztech/modern_industrialization/machines/recipe/ProxyableMachineRecipeType.java index 0db9c1e9d..09e8c6c2b 100644 --- a/src/main/java/aztech/modern_industrialization/machines/recipe/ProxyableMachineRecipeType.java +++ b/src/main/java/aztech/modern_industrialization/machines/recipe/ProxyableMachineRecipeType.java @@ -27,6 +27,7 @@ import java.util.Collection; import java.util.List; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.level.Level; @@ -40,17 +41,24 @@ public ProxyableMachineRecipeType(ResourceLocation id) { private long lastUpdate = 0; private static final long UPDATE_INTERVAL = 20 * 1000; - protected List> recipeList = new ArrayList<>(); + private final List> recipeList = new ArrayList<>(); - protected abstract void fillRecipeList(Level world); + protected abstract void fillRecipeList(Level world, List> recipeList); @Override - public Collection> getRecipes(Level world) { + public final Collection> getRecipesWithoutCache(Level level) { + var recipes = new ArrayList>(); + fillRecipeList(level, recipes); + return recipes; + } + + @Override + public final Collection> getRecipesWithCache(ServerLevel level) { long time = System.currentTimeMillis(); if (time - lastUpdate > UPDATE_INTERVAL) { lastUpdate = time; recipeList.clear(); - fillRecipeList(world); + fillRecipeList(level, recipeList); } return recipeList; }