From 68b1c0598ca52f7a5d49f56c3cb55eacd195b115 Mon Sep 17 00:00:00 2001 From: Jordan Byrne Date: Wed, 23 May 2018 05:27:51 +1000 Subject: $ More improvements to the Chunk Loader ID system. Should now avoid ID conflicts. --- .../api/objects/data/ReverseAutoMap.java | 76 +++++++++++++--------- .../api/objects/minecraft/ChunkManager.java | 19 ++++++ 2 files changed, 66 insertions(+), 29 deletions(-) (limited to 'src/Java/gtPlusPlus/api/objects') 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 extends AutoMap { @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 extends AutoMap { } 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 extends AutoMap { } public synchronized int getNextFreeMapID() { - if (this.mInternalMap.size() < 1 || this.mInternalMapReverseLookup.size() < 1) { - return 0; - } - if (this.mInternalMap.size() == getInternalID()-1) { - return getInternalID(); - } - AutoMap free = new AutoMap(); - values: for (int d : this.mInternalMapReverseLookup.values()) { - sequential: for (int m=0;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 extends AutoMap { return mInternalMap.values(); } + public synchronized Collection keys(){ + return mInternalMapReverseLookup.values(); + } + @Override public synchronized int size(){ return mInternalMap.size(); @@ -154,4 +166,10 @@ public class ReverseAutoMap extends AutoMap { return val; } + public synchronized Integer[] toArrayInternalMap() { + Collection 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); } } -- cgit