2cbd400e17
The Player View Distance patch has been screwing with the configured world view distance. The world a player was created in would set the players view distance, which would be locked to that distance. Then switching worlds would not give you an updated view distance. This then caused issues with what view distance the player should have in the chunk map and did not send chunks to the client correctly during movement. This patch has now been changed to use a -1 default for "default" and will not override view distance until someone has actually used the API to change it.
140 lines
5.7 KiB
Diff
140 lines
5.7 KiB
Diff
From a957633c889b9135b6f3a6fc0c9cf28d30beeb4a Mon Sep 17 00:00:00 2001
|
|
From: Byteflux <byte@byteflux.net>
|
|
Date: Wed, 2 Mar 2016 14:35:27 -0600
|
|
Subject: [PATCH] Add player view distance API
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
|
|
index dffc6d9..184b9c2 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
|
|
@@ -53,6 +53,15 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
|
public boolean f;
|
|
public int ping;
|
|
public boolean viewingCredits;
|
|
+ // Paper start - Player view distance API
|
|
+ private int viewDistance = -1;
|
|
+ public int getViewDistance() {
|
|
+ return viewDistance == -1 ? ((WorldServer) world).getPlayerChunkMap().getViewDistance() : viewDistance;
|
|
+ }
|
|
+ public void setViewDistance(int viewDistance) {
|
|
+ this.viewDistance = viewDistance;
|
|
+ }
|
|
+ // Paper end
|
|
|
|
// CraftBukkit start
|
|
public String displayName;
|
|
diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java
|
|
index 8ef7eb2..d7cbe31 100644
|
|
--- a/src/main/java/net/minecraft/server/PlayerChunkMap.java
|
|
+++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java
|
|
@@ -43,7 +43,7 @@ public class PlayerChunkMap {
|
|
private final List<PlayerChunk> g = Lists.newLinkedList();
|
|
private final List<PlayerChunk> h = Lists.newLinkedList();
|
|
private final List<PlayerChunk> i = Lists.newArrayList();
|
|
- private int j;
|
|
+ private int j;public int getViewDistance() { return j; } // Paper OBFHELPER
|
|
private long k;
|
|
private boolean l = true;
|
|
private boolean m = true;
|
|
@@ -284,8 +284,11 @@ public class PlayerChunkMap {
|
|
int i = (int) entityplayer.d >> 4;
|
|
int j = (int) entityplayer.e >> 4;
|
|
|
|
- for (int k = i - this.j; k <= i + this.j; ++k) {
|
|
- for (int l = j - this.j; l <= j + this.j; ++l) {
|
|
+ // Paper start - Player view distance API
|
|
+ int viewDistance = entityplayer.getViewDistance();
|
|
+ for (int k = i - viewDistance; k <= i + viewDistance; ++k) {
|
|
+ for (int l = j - viewDistance; l <= j + viewDistance; ++l) {
|
|
+ // Paper end
|
|
PlayerChunk playerchunk = this.b(k, l);
|
|
|
|
if (playerchunk != null) {
|
|
@@ -315,7 +318,9 @@ public class PlayerChunkMap {
|
|
if (d2 >= 64.0D) {
|
|
int k = (int) entityplayer.d >> 4;
|
|
int l = (int) entityplayer.e >> 4;
|
|
- int i1 = this.j;
|
|
+ final int viewDistance = entityplayer.getViewDistance(); // Paper - Player view distance API
|
|
+ int i1 = Math.max(getViewDistance(), viewDistance); // Paper - Player view distance API
|
|
+
|
|
int j1 = i - k;
|
|
int k1 = j - l;
|
|
|
|
@@ -324,7 +329,7 @@ public class PlayerChunkMap {
|
|
if (j1 != 0 || k1 != 0) {
|
|
for (int l1 = i - i1; l1 <= i + i1; ++l1) {
|
|
for (int i2 = j - i1; i2 <= j + i1; ++i2) {
|
|
- if (!this.a(l1, i2, k, l, i1)) {
|
|
+ if (!this.a(l1, i2, k, l, viewDistance)) { // Paper - Player view distance API
|
|
// this.c(l1, i2).a(entityplayer);
|
|
chunksToLoad.add(new ChunkCoordIntPair(l1, i2)); // CraftBukkit
|
|
}
|
|
@@ -471,4 +476,42 @@ public class PlayerChunkMap {
|
|
}
|
|
}
|
|
// CraftBukkit end
|
|
+
|
|
+ // Paper start - Player view distance API
|
|
+ public void updateViewDistance(EntityPlayer player, int toSet) {
|
|
+ final int oldViewDistance = player.getViewDistance();
|
|
+
|
|
+ int viewDistance = MathHelper.clamp(toSet, 3, 32);
|
|
+ if (viewDistance != oldViewDistance) {
|
|
+ int cx = (int) player.locX >> 4;
|
|
+ int cz = (int) player.locZ >> 4;
|
|
+
|
|
+ if (viewDistance - oldViewDistance > 0) {
|
|
+ for (int x = cx - viewDistance; x <= cx + viewDistance; ++x) {
|
|
+ for (int z = cz - viewDistance; z <= cz + viewDistance; ++z) {
|
|
+ PlayerChunk playerchunkmap_playerchunk = this.c(x, z);
|
|
+
|
|
+ if (!playerchunkmap_playerchunk.c.contains(player)) {
|
|
+ playerchunkmap_playerchunk.a(player);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ } else {
|
|
+ for (int x = cx - oldViewDistance; x <= cx + oldViewDistance; ++x) {
|
|
+ for (int z = cz - oldViewDistance; z <= cz + oldViewDistance; ++z) {
|
|
+ if (!this.a(x, z, cx, cz, viewDistance)) {
|
|
+ this.c(x, z).b(player);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ player.setViewDistance(viewDistance);
|
|
+ }
|
|
+
|
|
+ if (toSet == -1) {
|
|
+ player.setViewDistance(-1);
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
index 64bd053..4abf441 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
@@ -1416,6 +1416,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|
return this.getHandle().affectsSpawning;
|
|
}
|
|
|
|
+ @Override
|
|
+ public int getViewDistance() {
|
|
+ return getHandle().getViewDistance();
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setViewDistance(int viewDistance) {
|
|
+ ((WorldServer) getHandle().world).getPlayerChunkMap().updateViewDistance(getHandle(), viewDistance);
|
|
+ }
|
|
+
|
|
// Spigot start
|
|
private final Player.Spigot spigot = new Player.Spigot()
|
|
{
|
|
--
|
|
2.8.1
|
|
|