Fix chunk coordinates not being properly calculated

This commit is contained in:
themode 2021-03-13 23:04:15 +01:00
parent 0010c1c158
commit 4f2ec0a65f
4 changed files with 19 additions and 18 deletions

View File

@ -646,8 +646,8 @@ public class Player extends LivingEntity implements CommandSender {
final ChunkCallback eachCallback = chunk -> { final ChunkCallback eachCallback = chunk -> {
if (chunk != null) { if (chunk != null) {
final int chunkX = ChunkUtils.getChunkCoordinate((int) spawnPosition.getX()); final int chunkX = ChunkUtils.getChunkCoordinate(spawnPosition.getX());
final int chunkZ = ChunkUtils.getChunkCoordinate((int) spawnPosition.getZ()); final int chunkZ = ChunkUtils.getChunkCoordinate(spawnPosition.getZ());
if (chunk.getChunkX() == chunkX && if (chunk.getChunkX() == chunkX &&
chunk.getChunkZ() == chunkZ) { chunk.getChunkZ() == chunkZ) {
updateViewPosition(chunkX, chunkZ); updateViewPosition(chunkX, chunkZ);

View File

@ -581,8 +581,8 @@ public abstract class Instance implements BlockModifier, EventHandler, DataConta
* @param callback the optional callback to run when the chunk is loaded * @param callback the optional callback to run when the chunk is loaded
*/ */
public void loadChunk(@NotNull Position position, @Nullable ChunkCallback callback) { public void loadChunk(@NotNull Position position, @Nullable ChunkCallback callback) {
final int chunkX = ChunkUtils.getChunkCoordinate((int) position.getX()); final int chunkX = ChunkUtils.getChunkCoordinate(position.getX());
final int chunkZ = ChunkUtils.getChunkCoordinate((int) position.getZ()); final int chunkZ = ChunkUtils.getChunkCoordinate(position.getZ());
loadChunk(chunkX, chunkZ, callback); loadChunk(chunkX, chunkZ, callback);
} }
@ -594,8 +594,8 @@ public abstract class Instance implements BlockModifier, EventHandler, DataConta
* @param callback the optional callback executed when the chunk is loaded (or with a null chunk if not) * @param callback the optional callback executed when the chunk is loaded (or with a null chunk if not)
*/ */
public void loadOptionalChunk(@NotNull Position position, @Nullable ChunkCallback callback) { public void loadOptionalChunk(@NotNull Position position, @Nullable ChunkCallback callback) {
final int chunkX = ChunkUtils.getChunkCoordinate((int) position.getX()); final int chunkX = ChunkUtils.getChunkCoordinate(position.getX());
final int chunkZ = ChunkUtils.getChunkCoordinate((int) position.getZ()); final int chunkZ = ChunkUtils.getChunkCoordinate(position.getZ());
loadOptionalChunk(chunkX, chunkZ, callback); loadOptionalChunk(chunkX, chunkZ, callback);
} }
@ -786,8 +786,8 @@ public abstract class Instance implements BlockModifier, EventHandler, DataConta
*/ */
@Nullable @Nullable
public Chunk getChunkAt(double x, double z) { public Chunk getChunkAt(double x, double z) {
final int chunkX = ChunkUtils.getChunkCoordinate((int) Math.floor(x)); final int chunkX = ChunkUtils.getChunkCoordinate(x);
final int chunkZ = ChunkUtils.getChunkCoordinate((int) Math.floor(z)); final int chunkZ = ChunkUtils.getChunkCoordinate(z);
return getChunk(chunkX, chunkZ); return getChunk(chunkX, chunkZ);
} }

View File

@ -268,11 +268,11 @@ public class Position implements PublicCloneable<Position> {
* @return true if 'this' is in the same chunk as {@code position} * @return true if 'this' is in the same chunk as {@code position}
*/ */
public boolean inSameChunk(@NotNull Position position) { public boolean inSameChunk(@NotNull Position position) {
final int chunkX1 = ChunkUtils.getChunkCoordinate((int) getX()); final int chunkX1 = ChunkUtils.getChunkCoordinate(getX());
final int chunkZ1 = ChunkUtils.getChunkCoordinate((int) getZ()); final int chunkZ1 = ChunkUtils.getChunkCoordinate(getZ());
final int chunkX2 = ChunkUtils.getChunkCoordinate((int) position.getX()); final int chunkX2 = ChunkUtils.getChunkCoordinate(position.getX());
final int chunkZ2 = ChunkUtils.getChunkCoordinate((int) position.getZ()); final int chunkZ2 = ChunkUtils.getChunkCoordinate(position.getZ());
return chunkX1 == chunkX2 && chunkZ1 == chunkZ2; return chunkX1 == chunkX2 && chunkZ1 == chunkZ2;
} }

View File

@ -77,8 +77,8 @@ public final class ChunkUtils {
* @return true if the chunk is loaded, false otherwise * @return true if the chunk is loaded, false otherwise
*/ */
public static boolean isLoaded(@NotNull Instance instance, double x, double z) { public static boolean isLoaded(@NotNull Instance instance, double x, double z) {
final int chunkX = getChunkCoordinate((int) x); final int chunkX = getChunkCoordinate(x);
final int chunkZ = getChunkCoordinate((int) z); final int chunkZ = getChunkCoordinate(z);
final Chunk chunk = instance.getChunk(chunkX, chunkZ); final Chunk chunk = instance.getChunk(chunkX, chunkZ);
return isLoaded(chunk); return isLoaded(chunk);
@ -88,9 +88,10 @@ public final class ChunkUtils {
* @param xz the instance coordinate to convert * @param xz the instance coordinate to convert
* @return the chunk X or Z based on the argument * @return the chunk X or Z based on the argument
*/ */
public static int getChunkCoordinate(int xz) { public static int getChunkCoordinate(double xz) {
final int coordinate = (int) Math.floor(xz);
assert Chunk.CHUNK_SIZE_X == Chunk.CHUNK_SIZE_Z; assert Chunk.CHUNK_SIZE_X == Chunk.CHUNK_SIZE_Z;
return Math.floorDiv(xz, Chunk.CHUNK_SIZE_X); return Math.floorDiv(coordinate, Chunk.CHUNK_SIZE_X);
} }
/** /**
@ -155,8 +156,8 @@ public final class ChunkUtils {
int counter = 0; int counter = 0;
for (int x = startLoop; x < endLoop; x++) { for (int x = startLoop; x < endLoop; x++) {
for (int z = startLoop; z < endLoop; z++) { for (int z = startLoop; z < endLoop; z++) {
final int chunkX = getChunkCoordinate((int) (position.getX() + Chunk.CHUNK_SIZE_X * x)); final int chunkX = getChunkCoordinate(position.getX() + Chunk.CHUNK_SIZE_X * x);
final int chunkZ = getChunkCoordinate((int) (position.getZ() + Chunk.CHUNK_SIZE_Z * z)); final int chunkZ = getChunkCoordinate(position.getZ() + Chunk.CHUNK_SIZE_Z * z);
visibleChunks[counter++] = getChunkIndex(chunkX, chunkZ); visibleChunks[counter++] = getChunkIndex(chunkX, chunkZ);
} }
} }