aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/bartworks/hooks
diff options
context:
space:
mode:
authorAlexdoru <57050655+Alexdoru@users.noreply.github.com>2024-09-22 01:41:01 +0200
committerGitHub <noreply@github.com>2024-09-21 23:41:01 +0000
commitcc0266c5a740a2155536694111ba37ac8c3f1d46 (patch)
tree4d0e44a1e1c78a2345911090b265aee777409888 /src/main/java/bartworks/hooks
parent93966f7709e765b8be05b5127054046c9ac3bce0 (diff)
downloadGT5-Unofficial-cc0266c5a740a2155536694111ba37ac8c3f1d46.tar.gz
GT5-Unofficial-cc0266c5a740a2155536694111ba37ac8c3f1d46.tar.bz2
GT5-Unofficial-cc0266c5a740a2155536694111ba37ac8c3f1d46.zip
GT++ ASM Cleanup (#3238)
Co-authored-by: Martin Robertz <dream-master@gmx.net>
Diffstat (limited to 'src/main/java/bartworks/hooks')
-rw-r--r--src/main/java/bartworks/hooks/BWCoreStaticReplacementMethodes.java112
1 files changed, 112 insertions, 0 deletions
diff --git a/src/main/java/bartworks/hooks/BWCoreStaticReplacementMethodes.java b/src/main/java/bartworks/hooks/BWCoreStaticReplacementMethodes.java
new file mode 100644
index 0000000000..6110d9c32d
--- /dev/null
+++ b/src/main/java/bartworks/hooks/BWCoreStaticReplacementMethodes.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2018-2020 bartimaeusnek Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
+ * conditions: The above copyright notice and this permission notice shall be included in all copies or substantial
+ * portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+package bartworks.hooks;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+
+import net.minecraft.inventory.InventoryCrafting;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.CraftingManager;
+import net.minecraft.item.crafting.IRecipe;
+import net.minecraft.world.World;
+
+import bartworks.util.NonNullWrappedHashSet;
+import bartworks.util.accessprioritylist.AccessPriorityList;
+import bartworks.util.accessprioritylist.AccessPriorityListNode;
+
+public class BWCoreStaticReplacementMethodes {
+
+ private static ThreadLocal<AccessPriorityList<IRecipe>> RECENTLYUSEDRECIPES = ThreadLocal
+ .withInitial(AccessPriorityList::new);
+
+ public static void clearRecentlyUsedRecipes() {
+ // the easiest way to ensure the cache is flushed without causing synchronization overhead
+ // is to just replace the whole ThreadLocal instance.
+ RECENTLYUSEDRECIPES = ThreadLocal.withInitial(AccessPriorityList::new);
+ }
+
+ public static ItemStack findCachedMatchingRecipe(InventoryCrafting inventoryCrafting, World world) {
+ int i = 0;
+ ItemStack itemstack = null;
+ ItemStack itemstack1 = null;
+ int j;
+
+ for (j = 0; j < inventoryCrafting.getSizeInventory(); ++j) {
+ ItemStack itemstack2 = inventoryCrafting.getStackInSlot(j);
+
+ if (itemstack2 != null) {
+ if (i == 0) itemstack = itemstack2;
+
+ if (i == 1) itemstack1 = itemstack2;
+
+ ++i;
+ }
+ }
+
+ if (i == 2 && itemstack.getItem() == itemstack1.getItem()
+ && itemstack.stackSize == 1
+ && itemstack1.stackSize == 1
+ && itemstack.getItem()
+ .isRepairable()) {
+ Item item = itemstack.getItem();
+ int j1 = item.getMaxDamage() - itemstack.getItemDamageForDisplay();
+ int k = item.getMaxDamage() - itemstack1.getItemDamageForDisplay();
+ int l = j1 + k + item.getMaxDamage() * 5 / 100;
+ int i1 = item.getMaxDamage() - l;
+
+ if (i1 < 0) i1 = 0;
+
+ return new ItemStack(itemstack.getItem(), 1, i1);
+
+ }
+ IRecipe iPossibleRecipe = null;
+ AccessPriorityList<IRecipe> cache = RECENTLYUSEDRECIPES.get();
+ Iterator<AccessPriorityListNode<IRecipe>> it = cache.nodeIterator();
+
+ while (it.hasNext()) {
+ AccessPriorityListNode<IRecipe> recipeNode = it.next();
+ iPossibleRecipe = recipeNode.getELEMENT();
+
+ if (!iPossibleRecipe.matches(inventoryCrafting, world)) continue;
+
+ cache.addPrioToNode(recipeNode);
+ return iPossibleRecipe.getCraftingResult(inventoryCrafting);
+ }
+
+ HashSet<IRecipe> recipeSet = new NonNullWrappedHashSet<>();
+ List<IRecipe> recipeList = CraftingManager.getInstance()
+ .getRecipeList();
+
+ for (IRecipe r : recipeList) {
+ if (r.matches(inventoryCrafting, world)) recipeSet.add(r);
+ }
+
+ Object[] arr = recipeSet.toArray();
+
+ if (arr.length == 0) return null;
+
+ IRecipe recipe = (IRecipe) arr[0];
+ ItemStack stack = recipe.getCraftingResult(inventoryCrafting);
+
+ if (arr.length != 1) return stack;
+
+ if (stack != null) cache.addLast(recipe);
+
+ return stack;
+ }
+
+}