diff options
3 files changed, 81 insertions, 32 deletions
diff --git a/src/Java/gtPlusPlus/api/objects/data/ReverseAutoMap.java b/src/Java/gtPlusPlus/api/objects/data/ReverseAutoMap.java index dd50d456d2..73858e8d43 100644 --- a/src/Java/gtPlusPlus/api/objects/data/ReverseAutoMap.java +++ b/src/Java/gtPlusPlus/api/objects/data/ReverseAutoMap.java @@ -38,7 +38,6 @@ public class ReverseAutoMap<N> extends AutoMap<N> { @Override public synchronized N set(N object){ - raiseInternalID(); int newID = getNextFreeMapID(); mInternalMapReverseLookup.put(object, newID); return mInternalMap.put(newID, object); @@ -49,10 +48,42 @@ public class ReverseAutoMap<N> extends AutoMap<N> { } public synchronized int setInternalMap(N object){ - raiseInternalID(); int newID = getNextFreeMapID(); mInternalMap.put(newID, object); - return mInternalMapReverseLookup.put(object, newID); + mInternalMapReverseLookup.put(object, newID); + return newID; + } + + public synchronized boolean injectCleanDataToAutoMap(Integer g, N object){ + if (!mInternalMap.containsKey(g) && !mInternalMapReverseLookup.containsKey(object)) { + int a1 = 0, a2 = 0, a11 = 0, a22 = 0; + a1 = mInternalMap.size(); + a2 = mInternalMapReverseLookup.size(); + a11 = a1; + a22 = a2; + mInternalMap.put(g, object); + a1 = mInternalMap.size(); + mInternalMapReverseLookup.put(object, g); + a2 = mInternalMapReverseLookup.size(); + if (a1 > a11 && a2 > a22) + return true; + } + return false; + } + + public synchronized boolean injectDataToAutoMap(Integer g, N object){ + int a1 = 0, a2 = 0, a11 = 0, a22 = 0; + a1 = mInternalMap.size(); + a2 = mInternalMapReverseLookup.size(); + a11 = a1; + a22 = a2; + mInternalMap.put(g, object); + a1 = mInternalMap.size(); + mInternalMapReverseLookup.put(object, g); + a2 = mInternalMapReverseLookup.size(); + if (a1 > a11 && a2 > a22) + return true; + return false; } private boolean raiseInternalID() { @@ -62,33 +93,10 @@ public class ReverseAutoMap<N> extends AutoMap<N> { } public synchronized int getNextFreeMapID() { - if (this.mInternalMap.size() < 1 || this.mInternalMapReverseLookup.size() < 1) { - return 0; - } - if (this.mInternalMap.size() == getInternalID()-1) { - return getInternalID(); - } - AutoMap<Integer> free = new AutoMap<Integer>(); - values: for (int d : this.mInternalMapReverseLookup.values()) { - sequential: for (int m=0;m<this.mInternalMap.size();m++) { - - //Counter is lower than current ID, keep counting. - if (m < d || m == d) { - continue sequential; - } - //Possible that d is missing in sequence i.e. (m=0,1,2,3 & d=0,1,3,4) - else if (m > d) { - free.put(m); - continue values; - } - } - } - if (free.isEmpty()) { - return 0; - } - else { - return free.get(0); + if (raiseInternalID()) { + return mInternalID; } + return Short.MIN_VALUE; } @Override @@ -105,6 +113,10 @@ public class ReverseAutoMap<N> extends AutoMap<N> { return mInternalMap.values(); } + public synchronized Collection<Integer> keys(){ + return mInternalMapReverseLookup.values(); + } + @Override public synchronized int size(){ return mInternalMap.size(); @@ -154,4 +166,10 @@ public class ReverseAutoMap<N> extends AutoMap<N> { return val; } + public synchronized Integer[] toArrayInternalMap() { + Collection<Integer> col = this.mInternalMapReverseLookup.values(); + Integer[] val = col.toArray(new Integer[col.size()]); + return val; + } + } diff --git a/src/Java/gtPlusPlus/api/objects/minecraft/ChunkManager.java b/src/Java/gtPlusPlus/api/objects/minecraft/ChunkManager.java index ef180b05c5..bf080424ea 100644 --- a/src/Java/gtPlusPlus/api/objects/minecraft/ChunkManager.java +++ b/src/Java/gtPlusPlus/api/objects/minecraft/ChunkManager.java @@ -58,11 +58,30 @@ public class ChunkManager implements LoadingCallback, OrderedLoadingCallback, Fo Utils.registerEvent(this); } + public static boolean setIdAndUniqueString(int id, String blockposString) { + if (mIdToUUIDMap.injectCleanDataToAutoMap(id, blockposString)) { + Logger.INFO("Found Cached ID from NBT, cleanly injected into ChunkManager."); + return true; + } + else { + Logger.INFO("Creating new Cached ID based on blockpos UID"); + if (mIdToUUIDMap.injectCleanDataToAutoMap(mIdToUUIDMap.getNextFreeMapID(), blockposString)) { + Logger.INFO("Success! Cleanly injected into ChunkManager."); + return true; + } + else { + return false; + } + } + } + public static int getIdFromUniqueString(String blockposString) { if (mIdToUUIDMap.containsValue(blockposString)) { + Logger.INFO("Found Cached ID based on blockpos UID"); return mIdToUUIDMap.get(blockposString); } else { + Logger.INFO("Creating new Cached ID based on blockpos UID"); return mIdToUUIDMap.putToInternalMap(blockposString); } } diff --git a/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaTileEntityChunkLoader.java b/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaTileEntityChunkLoader.java index b73daf3db6..49901e57bc 100644 --- a/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaTileEntityChunkLoader.java +++ b/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaTileEntityChunkLoader.java @@ -34,6 +34,7 @@ import gtPlusPlus.api.objects.data.Triplet; import gtPlusPlus.api.objects.minecraft.BlockPos; import gtPlusPlus.api.objects.minecraft.ChunkManager; import gtPlusPlus.api.objects.minecraft.DimChunkPos; +import gtPlusPlus.core.util.reflect.ReflectionUtils; import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.ForgeChunkManager.Ticket; import net.minecraftforge.common.ForgeChunkManager.Type; @@ -106,7 +107,7 @@ public class GregtechMetaTileEntityChunkLoader extends GT_MetaTileEntity_TieredM return; } - if (aTimer % 300 == 0) { + if (aTimer % 20 == 0) { if (!isRegistered() && this.getEUVar() > 0) { registerLoader(); } @@ -263,10 +264,16 @@ public class GregtechMetaTileEntityChunkLoader extends GT_MetaTileEntity_TieredM return; } + try { if (this.getBaseMetaTileEntity() != null && this.getBaseMetaTileEntity().getWorld() != null && this.getBaseMetaTileEntity().getWorld().getWorldTime() >= 100) { - if (!mHasID) { + if (mChunkLoaderMapID == -1) { this.mChunkLoaderMapID = ChunkManager.getIdFromUniqueString(getUniqueID()); - mHasID = true; + Logger.INFO("["+getUniqueID()+"] Adjusted Chunk Loaders ID from -1 to "+mChunkLoaderMapID+". This chunk loader is not registered to the global list yet."); + } + else { + Logger.INFO("["+getUniqueID()+"] Found cached ID - "+mChunkLoaderMapID); + ChunkManager.setIdAndUniqueString(this.mChunkLoaderMapID, getUniqueID()); + this.mChunkLoaderMapID = ChunkManager.getIdFromUniqueString(getUniqueID()); // Just Incase the ID gets shifted. } if (this != null && this.getBaseMetaTileEntity() != null) { if (!isRegistered() && !getUniqueID().equalsIgnoreCase("0@0@0@0")) { @@ -279,6 +286,11 @@ public class GregtechMetaTileEntityChunkLoader extends GT_MetaTileEntity_TieredM } } } + } + catch (Throwable t) { + t.printStackTrace(); + } + } |