Reuse chunk code

This commit is contained in:
TheMode 2021-06-12 13:37:37 +02:00
parent 1b31a81619
commit 94e92741c8
3 changed files with 26 additions and 21 deletions

View File

@ -152,16 +152,13 @@ public class CollisionUtils {
blockPos.setY((int) Math.floor(corner.getY()));
blockPos.setZ((int) Math.floor(corner.getZ()));
Chunk chunk = originChunk;
if (!ChunkUtils.same(originChunk, blockPos.getX(), blockPos.getZ())) {
chunk = instance.getChunkAt(blockPos);
if (!ChunkUtils.isLoaded(chunk)) {
// Collision at chunk border
return false;
}
Chunk chunk = ChunkUtils.retrieve(instance, originChunk, blockPos);
if (!ChunkUtils.isLoaded(chunk)) {
// Collision at chunk border
return false;
}
final Block block = chunk.getBlock(blockPos.getX(), blockPos.getY(), blockPos.getZ());
final Block block = chunk.getBlock(blockPos);
// TODO: block collision boxes
// TODO: for the moment, always consider a full block

View File

@ -538,14 +538,10 @@ public class Entity implements Viewable, Tickable, EventHandler, DataContainer,
// World border collision
final Position finalVelocityPosition = CollisionUtils.applyWorldBorder(instance, position, newPosition);
Chunk finalChunk = currentChunk;
if (!ChunkUtils.same(position, finalVelocityPosition)) {
finalChunk = instance.getChunkAt(finalVelocityPosition);
final Chunk finalChunk = ChunkUtils.retrieve(instance, currentChunk, finalVelocityPosition);
if (!ChunkUtils.isLoaded(finalChunk)) {
// Entity shouldn't be updated when moving in an unloaded chunk
if (!ChunkUtils.isLoaded(finalChunk)) {
return;
}
return;
}
// Apply the position if changed
@ -612,12 +608,9 @@ public class Entity implements Viewable, Tickable, EventHandler, DataContainer,
for (int y = minY; y <= maxY; y++) {
for (int x = minX; x <= maxX; x++) {
for (int z = minZ; z <= maxZ; z++) {
Chunk chunk = currentChunk;
if (!ChunkUtils.same(currentChunk, x, z)) {
chunk = instance.getChunkAt(x, z);
if (!ChunkUtils.isLoaded(chunk))
continue;
}
final Chunk chunk = ChunkUtils.retrieve(instance, currentChunk, x, z);
if (!ChunkUtils.isLoaded(chunk))
continue;
final Block block = chunk.getBlock(x, y, z);
final BlockHandler handler = block.getHandler();

View File

@ -98,6 +98,21 @@ public final class ChunkUtils {
return x1 == x2 && z1 == z2;
}
public static Chunk retrieve(Instance instance, Chunk originChunk, double x, double z) {
if (!ChunkUtils.same(originChunk, x, z)) {
return instance.getChunkAt(x, z);
}
return originChunk;
}
public static Chunk retrieve(Instance instance, Chunk originChunk, Position position) {
return retrieve(instance, originChunk, position.getX(), position.getZ());
}
public static Chunk retrieve(Instance instance, Chunk originChunk, BlockPosition blockPosition) {
return retrieve(instance, originChunk, blockPosition.getX(), blockPosition.getZ());
}
/**
* @param xz the instance coordinate to convert
* @return the chunk X or Z based on the argument