Skip to content

Commit

Permalink
Clamp tick distance by load distance
Browse files Browse the repository at this point in the history
This brings expected behavior in-line more with Vanilla,
which will not always load chunks up to the tick distance.
  • Loading branch information
Spottedleaf committed May 28, 2024
1 parent 3ab838b commit 3222ed8
Showing 1 changed file with 26 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -224,13 +224,19 @@ public void setTickDistance(final int distance) {
// Note: follow the player chunk loader so everything stays consistent...
public int getAPITickDistance() {
final ViewDistances distances = ((ChunkSystemServerLevel)this.world).moonrise$getViewDistanceHolder().getViewDistances();
final int tickViewDistance = PlayerChunkLoaderData.getTickDistance(-1, distances.tickViewDistance);
final int tickViewDistance = PlayerChunkLoaderData.getTickDistance(
-1, distances.tickViewDistance,
-1, distances.loadViewDistance
);
return tickViewDistance;
}

public int getAPIViewDistance() {
final ViewDistances distances = ((ChunkSystemServerLevel)this.world).moonrise$getViewDistanceHolder().getViewDistances();
final int tickViewDistance = PlayerChunkLoaderData.getTickDistance(-1, distances.tickViewDistance);
final int tickViewDistance = PlayerChunkLoaderData.getTickDistance(
-1, distances.tickViewDistance,
-1, distances.loadViewDistance
);
final int loadDistance = PlayerChunkLoaderData.getLoadViewDistance(tickViewDistance, -1, distances.loadViewDistance);

// loadDistance = api view distance + 1
Expand All @@ -239,7 +245,10 @@ public int getAPIViewDistance() {

public int getAPISendViewDistance() {
final ViewDistances distances = ((ChunkSystemServerLevel)this.world).moonrise$getViewDistanceHolder().getViewDistances();
final int tickViewDistance = PlayerChunkLoaderData.getTickDistance(-1, distances.tickViewDistance);
final int tickViewDistance = PlayerChunkLoaderData.getTickDistance(
-1, distances.tickViewDistance,
-1, distances.loadViewDistance
);
final int loadDistance = PlayerChunkLoaderData.getLoadViewDistance(tickViewDistance, -1, distances.loadViewDistance);
final int sendViewDistance = PlayerChunkLoaderData.getSendViewDistance(
loadDistance, -1, -1, distances.sendViewDistance
Expand Down Expand Up @@ -486,8 +495,12 @@ private static int getClientViewDistance(final ServerPlayer player) {
return vd == null ? -1 : Math.max(0, vd.intValue());
}

private static int getTickDistance(final int playerTickViewDistance, final int worldTickViewDistance) {
return playerTickViewDistance < 0 ? worldTickViewDistance : playerTickViewDistance;
private static int getTickDistance(final int playerTickViewDistance, final int worldTickViewDistance,
final int playerLoadViewDistance, final int worldLoadViewDistance) {
return Math.min(
playerTickViewDistance < 0 ? worldTickViewDistance : playerTickViewDistance,
playerLoadViewDistance < 0 ? worldLoadViewDistance : playerLoadViewDistance
);
}

private static int getLoadViewDistance(final int tickViewDistance, final int playerLoadViewDistance,
Expand Down Expand Up @@ -824,7 +837,10 @@ void add() {
final int chunkX = this.player.chunkPosition().x;
final int chunkZ = this.player.chunkPosition().z;

final int tickViewDistance = getTickDistance(playerDistances.tickViewDistance, worldDistances.tickViewDistance);
final int tickViewDistance = getTickDistance(
playerDistances.tickViewDistance, worldDistances.tickViewDistance,
playerDistances.loadViewDistance, worldDistances.loadViewDistance
);
// load view cannot be less-than tick view + 1
final int loadViewDistance = getLoadViewDistance(tickViewDistance, playerDistances.loadViewDistance, worldDistances.loadViewDistance);
// send view cannot be greater-than load view
Expand Down Expand Up @@ -875,7 +891,10 @@ void update() {
final ViewDistances playerDistances = ((ChunkSystemServerPlayer)this.player).moonrise$getViewDistanceHolder().getViewDistances();
final ViewDistances worldDistances = ((ChunkSystemServerLevel)this.world).moonrise$getViewDistanceHolder().getViewDistances();

final int tickViewDistance = getTickDistance(playerDistances.tickViewDistance, worldDistances.tickViewDistance);
final int tickViewDistance = getTickDistance(
playerDistances.tickViewDistance, worldDistances.tickViewDistance,
playerDistances.loadViewDistance, worldDistances.loadViewDistance
);
// load view cannot be less-than tick view + 1
final int loadViewDistance = getLoadViewDistance(tickViewDistance, playerDistances.loadViewDistance, worldDistances.loadViewDistance);
// send view cannot be greater-than load view
Expand Down

0 comments on commit 3222ed8

Please sign in to comment.