diff --git a/gradle.properties b/gradle.properties index 83926abd..20079cde 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.daemon=false mod_id=sophisticatedcore mod_group_id=sophisticatedcore -mod_version=1.0.3 +mod_version=1.0.4 sonar_project_key=sophisticatedcore:SophisticatedCore github_package_url=https://maven.pkg.github.com/P3pp3rF1y/SophisticatedCore diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedcore/common/gui/ICraftingContainer.java b/src/main/java/net/p3pp3rf1y/sophisticatedcore/common/gui/ICraftingContainer.java index 500a5efb..f0b04051 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedcore/common/gui/ICraftingContainer.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedcore/common/gui/ICraftingContainer.java @@ -3,6 +3,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.Container; import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.crafting.RecipeType; import java.util.List; @@ -10,5 +11,8 @@ public interface ICraftingContainer { List getRecipeSlots(); Container getCraftMatrix(); + void setRecipeUsed(ResourceLocation recipeId); + + RecipeType getRecipeType(); } diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedcore/common/gui/StorageContainerMenuBase.java b/src/main/java/net/p3pp3rf1y/sophisticatedcore/common/gui/StorageContainerMenuBase.java index 672ed4f6..a1a37d6e 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedcore/common/gui/StorageContainerMenuBase.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedcore/common/gui/StorageContainerMenuBase.java @@ -16,6 +16,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.RecipeType; import net.minecraftforge.fml.util.ObfuscationReflectionHelper; import net.minecraftforge.items.SlotItemHandler; import net.p3pp3rf1y.sophisticatedcore.SophisticatedCore; @@ -773,10 +774,10 @@ public void setUpgradeChangeListener(Consumer> upgra protected abstract boolean storageItemHasChanged(); @SuppressWarnings("unchecked") // both conditions of T are checked before casting it in the result - public & ICraftingContainer> Optional getOpenOrFirstCraftingContainer() { + public & ICraftingContainer> Optional getOpenOrFirstCraftingContainer(RecipeType recipeType) { T firstContainer = null; for (UpgradeContainerBase container : upgradeContainers.values()) { - if (container instanceof ICraftingContainer) { + if (container instanceof ICraftingContainer craftingContainer && craftingContainer.getRecipeType() == recipeType) { if (container.isOpen()) { return Optional.of((T) container); } else if (firstContainer == null) { diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedcore/compat/jei/CraftingContainerRecipeTransferHandlerBase.java b/src/main/java/net/p3pp3rf1y/sophisticatedcore/compat/jei/CraftingContainerRecipeTransferHandlerBase.java index 0cf8354f..44bc8323 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedcore/compat/jei/CraftingContainerRecipeTransferHandlerBase.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedcore/compat/jei/CraftingContainerRecipeTransferHandlerBase.java @@ -13,12 +13,16 @@ import mezz.jei.common.transfer.RecipeTransferUtil; import mezz.jei.common.transfer.TransferOperation; import mezz.jei.common.util.StringUtil; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.CraftingRecipe; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraftforge.registries.ForgeRegistries; import net.p3pp3rf1y.sophisticatedcore.SophisticatedCore; import net.p3pp3rf1y.sophisticatedcore.common.gui.ICraftingContainer; import net.p3pp3rf1y.sophisticatedcore.common.gui.StorageContainerMenuBase; @@ -29,7 +33,7 @@ import java.util.*; import java.util.stream.Collectors; -public abstract class CraftingContainerRecipeTransferHandlerBase> implements IRecipeTransferHandler { +public abstract class CraftingContainerRecipeTransferHandlerBase, R extends Recipe> implements IRecipeTransferHandler { private final IRecipeTransferHandlerHelper handlerHelper; private final IStackHelper stackHelper; @@ -43,15 +47,10 @@ public Optional> getMenuType() { return Optional.empty(); } - @Override - public RecipeType getRecipeType() { - return RecipeTypes.CRAFTING; - } - @Nullable @Override - public IRecipeTransferError transferRecipe(C container, CraftingRecipe recipe, IRecipeSlotsView recipeSlots, Player player, boolean maxTransfer, boolean doTransfer) { - Optional> potentialCraftingContainer = container.getOpenOrFirstCraftingContainer(); + public IRecipeTransferError transferRecipe(C container, R recipe, IRecipeSlotsView recipeSlots, Player player, boolean maxTransfer, boolean doTransfer) { + Optional> potentialCraftingContainer = container.getOpenOrFirstCraftingContainer(recipe.getType()); if (potentialCraftingContainer.isEmpty()) { return handlerHelper.createInternalError(); } @@ -108,13 +107,17 @@ public IRecipeTransferError transferRecipe(C container, CraftingRecipe recipe, I openOrFirstCraftingContainer.setIsOpen(true); container.setOpenTabId(openOrFirstCraftingContainer.getUpgradeContainerId()); } - TransferRecipeMessage message = new TransferRecipeMessage( - recipe.getId(), - toMap(transferOperations.results), - craftingSlotIndexes, - inventorySlotIndexes, - maxTransfer); - PacketHandler.INSTANCE.sendToServer(message); + ResourceLocation recipeTypeId = ForgeRegistries.RECIPE_TYPES.getKey(recipe.getType()); + if (recipeTypeId != null) { + TransferRecipeMessage message = new TransferRecipeMessage( + recipe.getId(), + recipeTypeId, + toMap(transferOperations.results), + craftingSlotIndexes, + inventorySlotIndexes, + maxTransfer); + PacketHandler.INSTANCE.sendToServer(message); + } } return null; diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedcore/compat/jei/CraftingContainerRecipeTransferHandlerServer.java b/src/main/java/net/p3pp3rf1y/sophisticatedcore/compat/jei/CraftingContainerRecipeTransferHandlerServer.java index dc2a7ddb..ed73977a 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedcore/compat/jei/CraftingContainerRecipeTransferHandlerServer.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedcore/compat/jei/CraftingContainerRecipeTransferHandlerServer.java @@ -5,6 +5,7 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeType; import net.p3pp3rf1y.sophisticatedcore.common.gui.StorageContainerMenuBase; import javax.annotation.Nullable; @@ -16,7 +17,7 @@ private CraftingContainerRecipeTransferHandlerServer() {} /** * Called server-side to actually put the items in place. */ - public static void setItems(Player player, ResourceLocation recipeId, Map slotIdMap, List craftingSlots, List inventorySlots, boolean maxTransfer) { + public static void setItems(Player player, ResourceLocation recipeId, RecipeType recipeType, Map slotIdMap, List craftingSlots, List inventorySlots, boolean maxTransfer) { if (!(player.containerMenu instanceof StorageContainerMenuBase container)) { return; } @@ -41,7 +42,7 @@ public static void setItems(Player player, ResourceLocation recipeId, Map clearedCraftingItems = clearAndPutItemsIntoGrid(player, recipeId, craftingSlots, container, toTransfer); + List clearedCraftingItems = clearAndPutItemsIntoGrid(player, recipeId, recipeType, craftingSlots, container, toTransfer); putIntoInventory(player, inventorySlots, container, clearedCraftingItems); @@ -57,7 +58,7 @@ private static void putIntoInventory(Player player, List inventorySlots } } - private static List clearAndPutItemsIntoGrid(Player player, ResourceLocation recipeId, List craftingSlots, AbstractContainerMenu container, Map toTransfer) { + private static List clearAndPutItemsIntoGrid(Player player, ResourceLocation recipeId, RecipeType recipeType, List craftingSlots, AbstractContainerMenu container, Map toTransfer) { List clearedCraftingItems = new ArrayList<>(); int minSlotStackLimit = Integer.MAX_VALUE; for (int craftingSlotNumberIndex = 0; craftingSlotNumberIndex < craftingSlots.size(); craftingSlotNumberIndex++) { @@ -80,7 +81,7 @@ private static List clearAndPutItemsIntoGrid(Player player, ResourceL // put items into the crafting grid putItemIntoGrid(container, toTransfer, clearedCraftingItems, minSlotStackLimit); if (container instanceof StorageContainerMenuBase storageContainerMenu) { - storageContainerMenu.getOpenOrFirstCraftingContainer().ifPresent(c -> c.setRecipeUsed(recipeId)); + storageContainerMenu.getOpenOrFirstCraftingContainer(recipeType).ifPresent(c -> c. setRecipeUsed(recipeId)); } return clearedCraftingItems; } diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedcore/compat/jei/TransferRecipeMessage.java b/src/main/java/net/p3pp3rf1y/sophisticatedcore/compat/jei/TransferRecipeMessage.java index cb83c099..6642f714 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedcore/compat/jei/TransferRecipeMessage.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedcore/compat/jei/TransferRecipeMessage.java @@ -3,7 +3,9 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.crafting.RecipeType; import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.registries.ForgeRegistries; import javax.annotation.Nullable; import java.util.ArrayList; @@ -13,14 +15,16 @@ import java.util.function.Supplier; public class TransferRecipeMessage { + private final ResourceLocation recipeTypeId; private final Map matchingItems; private final List craftingSlotIndexes; private final List inventorySlotIndexes; private final boolean maxTransfer; private final ResourceLocation recipeId; - public TransferRecipeMessage(ResourceLocation recipeId, Map matchingItems, List craftingSlotIndexes, List inventorySlotIndexes, boolean maxTransfer) { + public TransferRecipeMessage(ResourceLocation recipeId, ResourceLocation recipeTypeId, Map matchingItems, List craftingSlotIndexes, List inventorySlotIndexes, boolean maxTransfer) { this.recipeId = recipeId; + this.recipeTypeId = recipeTypeId; this.matchingItems = matchingItems; this.craftingSlotIndexes = craftingSlotIndexes; this.inventorySlotIndexes = inventorySlotIndexes; @@ -29,6 +33,7 @@ public TransferRecipeMessage(ResourceLocation recipeId, Map ma public static void encode(TransferRecipeMessage msg, FriendlyByteBuf packetBuffer) { packetBuffer.writeResourceLocation(msg.recipeId); + packetBuffer.writeResourceLocation(msg.recipeTypeId); writeMap(packetBuffer, msg.matchingItems); writeList(packetBuffer, msg.craftingSlotIndexes); writeList(packetBuffer, msg.inventorySlotIndexes); @@ -49,7 +54,7 @@ private static void writeList(FriendlyByteBuf packetBuffer, List list) } public static TransferRecipeMessage decode(FriendlyByteBuf packetBuffer) { - return new TransferRecipeMessage(packetBuffer.readResourceLocation(), readMap(packetBuffer), readList(packetBuffer), readList(packetBuffer), packetBuffer.readBoolean()); + return new TransferRecipeMessage(packetBuffer.readResourceLocation(), packetBuffer.readResourceLocation(), readMap(packetBuffer), readList(packetBuffer), readList(packetBuffer), packetBuffer.readBoolean()); } private static Map readMap(FriendlyByteBuf packetBuffer) { @@ -80,6 +85,11 @@ private static void handleMessage(TransferRecipeMessage msg, @Nullable ServerPla if (sender == null) { return; } - CraftingContainerRecipeTransferHandlerServer.setItems(sender, msg.recipeId, msg.matchingItems, msg.craftingSlotIndexes, msg.inventorySlotIndexes, msg.maxTransfer); + + RecipeType recipeType = ForgeRegistries.RECIPE_TYPES.getValue(msg.recipeTypeId); + if (recipeType == null) { + return; + } + CraftingContainerRecipeTransferHandlerServer.setItems(sender, msg.recipeId, recipeType, msg.matchingItems, msg.craftingSlotIndexes, msg.inventorySlotIndexes, msg.maxTransfer); } } diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/crafting/CraftingUpgradeContainer.java b/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/crafting/CraftingUpgradeContainer.java index 17a7ba91..b2d8fe0e 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/crafting/CraftingUpgradeContainer.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/crafting/CraftingUpgradeContainer.java @@ -249,6 +249,11 @@ public void setRecipeUsed(ResourceLocation recipeId) { }); } + @Override + public RecipeType getRecipeType() { + return RecipeType.CRAFTING; + } + public boolean shouldShiftClickIntoStorage() { return upgradeWrapper.shouldShiftClickIntoStorage(); } diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedcore/util/RecipeHelper.java b/src/main/java/net/p3pp3rf1y/sophisticatedcore/util/RecipeHelper.java index 84909902..82413096 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedcore/util/RecipeHelper.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedcore/util/RecipeHelper.java @@ -3,7 +3,9 @@ import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; +import com.mojang.datafixers.util.Pair; import net.minecraft.core.NonNullList; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; @@ -26,6 +28,7 @@ import net.minecraftforge.registries.ForgeRegistries; import net.p3pp3rf1y.sophisticatedcore.SophisticatedCore; +import javax.annotation.Nullable; import java.lang.ref.WeakReference; import java.util.*; import java.util.concurrent.TimeUnit; @@ -279,7 +282,7 @@ public boolean stillValid(Player playerIn) { } public static Optional getCookingRecipe(ItemStack stack, RecipeType recipeType) { - return getLevel().flatMap(w -> safeGetRecipeFor(recipeType, new RecipeWrapper(new ItemStackHandler(NonNullList.of(ItemStack.EMPTY, stack))), w)); + return getLevel().flatMap(w -> safeGetRecipeFor(recipeType, new RecipeWrapper(new ItemStackHandler(NonNullList.of(ItemStack.EMPTY, stack))), w, null)); } public static Set getItemCompactingShapes(Item item) { @@ -290,9 +293,13 @@ public static > List getRecipesOfType(RecipeType< return getLevel().map(w -> w.getRecipeManager().getRecipesFor(recipeType, inventory, w)).orElse(Collections.emptyList()); } - public static > Optional safeGetRecipeFor(RecipeType recipeType, C inventory, Level level) { + public static > Optional safeGetRecipeFor(RecipeType recipeType, C inventory, @Nullable ResourceLocation recipeId) { + return getLevel().flatMap(w -> safeGetRecipeFor(recipeType, inventory, w, recipeId)); + } + + public static > Optional safeGetRecipeFor(RecipeType recipeType, C inventory, Level level, @Nullable ResourceLocation recipeId) { try { - return level.getRecipeManager().getRecipeFor(recipeType, inventory, level); + return level.getRecipeManager().getRecipeFor(recipeType, inventory, level, recipeId).map(Pair::getSecond); } catch (Exception e) { SophisticatedCore.LOGGER.error("Error while getting recipe ", e); return Optional.empty();