1
0
mirror of https://github.com/Zrips/Jobs.git synced 2024-11-29 14:05:25 +01:00

ExploreRegion: Fix encoding X and Z

Use a long to store the two ints (x is upper and z is lower) - this is guranteed to work with any world map size out there.

It also properly handle negative values that the old implementation some times did not properly manage.

This might use slighly more RAM, but should provide support for actual infinite / huge map sizes

Signed-off-by: Christian Winther <jippignu@gmail.com>
This commit is contained in:
Christian Winther 2022-01-07 22:35:22 +00:00
parent 93f5423300
commit a340b99349
2 changed files with 61 additions and 81 deletions

View File

@ -10,66 +10,46 @@ public class ExploreRegion {
int x;
int z;
private final Map<Short, ExploreChunk> chunks = new HashMap<>();
private final Map<Long, ExploreChunk> chunks = new HashMap<>();
public ExploreRegion(int x, int z) {
this.x = x;
this.z = z;
this.x = x;
this.z = z;
}
public void addChunk(int x, int z, ExploreChunk chunk) {
chunks.put(getPlace(x, z), chunk);
chunks.put(getPlace(x, z), chunk);
}
public Map<Short, ExploreChunk> getChunks() {
return chunks;
public Map<Long, ExploreChunk> getChunks() {
return chunks;
}
public ExploreChunk getChunk(int x, int z) {
return getChunk(getPlace(x, z));
return getChunk(getPlace(x, z));
}
public ExploreChunk getChunk(Chunk chunk) {
return getChunk(getPlace(chunk));
return getChunk(getPlace(chunk));
}
public ExploreChunk getChunk(short place) {
return chunks.get(place);
public ExploreChunk getChunk(long place) {
return chunks.get(place);
}
private static short getPlace(Chunk chunk) {
return getPlace(chunk.getX(), chunk.getZ());
private static long getPlace(Chunk chunk) {
return getPlace(chunk.getX(), chunk.getZ());
}
private static short getPlace(int x, int z) {
return (short) ((x - ((x >> 5) * 32)) + ((z - ((z >> 5) * 32)) * 32));
private static long getPlace(int x, int z) {
return (((long) x) << 32) | (z & 0xffffffff);
}
public int getChunkX(short place) {
int endX = place % 32;
if (x < 0)
endX = -endX;
endX = x * 32 + endX;
if (endX < 0) {
endX += 32;
}
return endX;
public int getChunkX(long place) {
return (int)(place >> 32);
}
public int getChunkZ(short place) {
int endZ = (place - (place % 32)) / 32;
if (z < 0)
endZ = -endZ;
endZ = z * 32 + endZ;
if (endZ < 0) {
endZ += 32;
}
return endZ;
public int getChunkZ(long place) {
return (int) place;
}
}

View File

@ -2466,7 +2466,7 @@ public abstract class JobsDAO {
int id = jobsWorld == null ? 0 : jobsWorld.getId();
if (id != 0)
for (Entry<Short, ExploreChunk> oneChunk : region.getValue().getChunks().entrySet()) {
for (Entry<Long, ExploreChunk> oneChunk : region.getValue().getChunks().entrySet()) {
ExploreChunk chunk = oneChunk.getValue();
if (chunk.getDbId() != -1)
continue;