aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Java/gtPlusPlus/api/objects/data/ReverseAutoMap.java76
-rw-r--r--src/Java/gtPlusPlus/api/objects/minecraft/ChunkManager.java19
-rw-r--r--src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaTileEntityChunkLoader.java18
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();
+ }
+
}