From a5398f3351741484d6cf9b76d4446dfdb2a8c170 Mon Sep 17 00:00:00 2001 From: TheDarkDnKTv Date: Thu, 20 Aug 2020 22:05:44 +0300 Subject: [PATCH] Fixed covers behavior & digital tank recipe Closes #36 --- .../api/metatileentity/BaseTileEntity.java | 39 +++++++++++-------- .../loaders/load/GT_ItemIterator.java | 2 +- .../postload/GT_CraftingRecipeLoader.java | 2 +- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/main/java/gregtechmod/api/metatileentity/BaseTileEntity.java b/src/main/java/gregtechmod/api/metatileentity/BaseTileEntity.java index ec1007e..d3fe3d5 100644 --- a/src/main/java/gregtechmod/api/metatileentity/BaseTileEntity.java +++ b/src/main/java/gregtechmod/api/metatileentity/BaseTileEntity.java @@ -1,5 +1,6 @@ package gregtechmod.api.metatileentity; +import java.lang.ref.SoftReference; import gregtechmod.api.GregTech_API; import gregtechmod.api.interfaces.IGregTechTileEntity; import gregtechmod.api.interfaces.IHasWorldObjectAndCoords; @@ -33,10 +34,18 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje * * "this" means that there is no TileEntity, while "null" means that it doesn't know if there is even a TileEntity and still needs to check that if needed. */ - private final TileEntity[] mBufferedTileEntities = new TileEntity[6]; + @SuppressWarnings({ "unchecked"}) + private final SoftReference mBufferedTileEntities[] = new SoftReference[6]; private final void clearNullMarkersFromTileEntityBuffer() { - for (int i = 0; i < mBufferedTileEntities.length; i++) if (mBufferedTileEntities[i] == this) mBufferedTileEntities[i] = null; + for (int i = 0; i < mBufferedTileEntities.length; i++) { + SoftReference reference = mBufferedTileEntities[i]; + if (reference != null && reference.get() != null) { + if (reference.get() == this || reference.get().isInvalid()) { + mBufferedTileEntities[i] = null; + } + } + } } @Override public final World getWorld () {return worldObj;} @@ -130,22 +139,18 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje @Override public final TileEntity getTileEntityAtSide(byte aSide) { - if (aSide < 0 || aSide >= 6 || mBufferedTileEntities[aSide] == this) return null; - if (mBufferedTileEntities[aSide] == null) { - mBufferedTileEntities[aSide] = getTileEntity(getOffsetX(aSide, 1), getOffsetY(aSide, 1), getOffsetZ(aSide, 1)); - if (mBufferedTileEntities[aSide] == null) { - mBufferedTileEntities[aSide] = this; - return null; + if (aSide >= 0 && aSide < 6) { + SoftReference reference = mBufferedTileEntities[aSide]; + if (reference != null && reference.get() != null && !reference.get().isInvalid()) { + if (reference.get() == this || reference.isEnqueued()) this.clearNullMarkersFromTileEntityBuffer(); + return reference.get(); + } else { + TileEntity tile = getTileEntity(getOffsetX(aSide, 1), getOffsetY(aSide, 1), getOffsetZ(aSide, 1)); + mBufferedTileEntities[aSide] = new SoftReference(tile); + return tile; } - return mBufferedTileEntities[aSide]; - } - if (mBufferedTileEntities[aSide].isInvalid()) { - mBufferedTileEntities[aSide] = null; - return getTileEntityAtSide(aSide); - } - if (mBufferedTileEntities[aSide].xCoord == getOffsetX(aSide, 1) && mBufferedTileEntities[aSide].yCoord == getOffsetY(aSide, 1) && mBufferedTileEntities[aSide].zCoord == getOffsetZ(aSide, 1)) { - return mBufferedTileEntities[aSide]; - } + } + return null; } diff --git a/src/main/java/gregtechmod/loaders/load/GT_ItemIterator.java b/src/main/java/gregtechmod/loaders/load/GT_ItemIterator.java index a218bcd..7954bc5 100644 --- a/src/main/java/gregtechmod/loaders/load/GT_ItemIterator.java +++ b/src/main/java/gregtechmod/loaders/load/GT_ItemIterator.java @@ -142,7 +142,7 @@ public class GT_ItemIterator implements Runnable { } } catch (Throwable e) {} try { - if (tItem instanceof IToolWrench) { + if (tItem instanceof IToolWrench && !(tItem instanceof IToolCrowbar)) { if (!tItem.isDamageable() && !GT_ModHandler.isElectricItem(new ItemStack(tItem, 1, 0))) { if (GregTech_API.sRecipeFile.get(GT_ConfigCategories.Recipes.disabledrecipes, "infiniteDurabilityBCWrenches", false) && GT_ModHandler.removeRecipeByOutput(new ItemStack(tItem, 1, GregTech_API.ITEM_WILDCARD_DAMAGE))) { GT_Log.log.info("GT_Mod: Removed infinite BC Wrench: " + tName); diff --git a/src/main/java/gregtechmod/loaders/postload/GT_CraftingRecipeLoader.java b/src/main/java/gregtechmod/loaders/postload/GT_CraftingRecipeLoader.java index 979fdbc..30f1f0d 100644 --- a/src/main/java/gregtechmod/loaders/postload/GT_CraftingRecipeLoader.java +++ b/src/main/java/gregtechmod/loaders/postload/GT_CraftingRecipeLoader.java @@ -386,7 +386,7 @@ public class GT_CraftingRecipeLoader implements Runnable { if (GregTech_API.sRecipeFile.get(GT_ConfigCategories.Recipes.gregtechrecipes, "digitalchest", true)) { GT_ModHandler.addCraftingRecipe(new ItemStack(GregTech_API.sBlockList[1], 1,48), new Object[] {"AAA", "ADA", "ASA", 'D', OrePrefixes.circuit.get(Materials.Ultimate), 'S', GT_OreDictNames.craftingMonitorTier02, 'A', OrePrefixes.plate.get(Materials.Iron)}); GT_ModHandler.addCraftingRecipe(new ItemStack(GregTech_API.sBlockList[1], 1,48), new Object[] {"AAA", "ADA", "ASA", 'D', OrePrefixes.circuit.get(Materials.Ultimate), 'S', GT_OreDictNames.craftingMonitorTier02, 'A', OrePrefixes.plate.get(Materials.Aluminium)}); - GT_ModHandler.addCraftingRecipe(new ItemStack(GregTech_API.sBlockList[1], 1,48), new Object[] {"AAA", "ADA", "ASA", 'D', OrePrefixes.circuit.get(Materials.Ultimate), 'S', GT_OreDictNames.craftingMonitorTier02, 'A', GT_OreDictNames.craftingPlateSteel}); + GT_ModHandler.addCraftingRecipe(new ItemStack(GregTech_API.sBlockList[1], 1,75), new Object[] {"AAA", "ADA", "ASA", 'D', OrePrefixes.circuit.get(Materials.Ultimate), 'S', GT_OreDictNames.craftingMonitorTier02, 'A', GT_OreDictNames.craftingPlateSteel}); } if (GregTech_API.sRecipeFile.get(GT_ConfigCategories.Recipes.gregtechrecipes, "quantumchest", true)) {