3
0
Mirror von https://github.com/PaperMC/Paper.git synchronisiert 2024-11-15 12:30:06 +01:00
Paper/Spigot-Server-Patches/0040-Add-player-view-distance-API.patch

133 Zeilen
5.5 KiB
Diff

2016-07-05 01:49:14 +02:00
From 068369d52a9520129daf8c4f175e21d3eff59ec6 Mon Sep 17 00:00:00 2001
2016-03-01 00:09:49 +01:00
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
2016-06-09 05:57:14 +02:00
index 522c7f2..4950db4 100644
2016-03-01 00:09:49 +01:00
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
2016-05-28 04:22:18 +02:00
@@ -56,6 +56,15 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
2016-03-01 00:09:49 +01:00
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
2016-03-01 00:09:49 +01:00
// 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 797a84f..df6801f 100644
2016-03-01 00:09:49 +01:00
--- a/src/main/java/net/minecraft/server/PlayerChunkMap.java
+++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java
2016-06-05 06:10:50 +02:00
@@ -47,7 +47,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;
@@ -283,8 +283,11 @@ public class PlayerChunkMap {
// CraftBukkit start - Load nearby chunks first
List<ChunkCoordIntPair> chunkList = new LinkedList<ChunkCoordIntPair>();
- 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
chunkList.add(new ChunkCoordIntPair(k, l));
}
}
@@ -303,8 +306,11 @@ public class PlayerChunkMap {
2016-03-01 00:09:49 +01:00
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) {
2016-03-01 00:09:49 +01:00
+ // Paper end
2016-05-12 04:07:46 +02:00
PlayerChunk playerchunk = this.getChunk(k, l);
2016-03-01 00:09:49 +01:00
if (playerchunk != null) {
@@ -334,7 +340,9 @@ public class PlayerChunkMap {
2016-03-01 00:09:49 +01:00
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
+
2016-03-01 00:09:49 +01:00
int j1 = i - k;
int k1 = j - l;
@@ -343,7 +351,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
}
@@ -495,4 +503,20 @@ public class PlayerChunkMap {
2016-03-01 00:09:49 +01:00
}
}
// 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);
2016-05-12 04:07:46 +02:00
+ if (toSet < 0) {
+ viewDistance = -1;
+ }
+ if (viewDistance != oldViewDistance) {
2016-05-12 04:07:46 +02:00
+ removePlayer(player);
+ player.setViewDistance(viewDistance);
2016-05-12 04:07:46 +02:00
+ addPlayer(player);
2016-03-01 00:09:49 +01:00
+ }
+ }
+ // Paper end
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
2016-07-05 01:49:14 +02:00
index 64c9c1c..e09dc78 100644
2016-03-01 00:09:49 +01:00
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
2016-07-05 01:49:14 +02:00
@@ -1438,6 +1438,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
return this.getHandle().affectsSpawning;
2016-03-01 00:09:49 +01:00
}
2016-03-01 00:09:49 +01:00
+ @Override
+ public int getViewDistance() {
+ return getHandle().getViewDistance();
2016-03-01 00:09:49 +01:00
+ }
+
+ @Override
+ public void setViewDistance(int viewDistance) {
+ ((WorldServer) getHandle().world).getPlayerChunkMap().updateViewDistance(getHandle(), viewDistance);
+ }
+
2016-03-01 00:09:49 +01:00
// Spigot start
private final Player.Spigot spigot = new Player.Spigot()
{
2016-03-01 00:09:49 +01:00
--
2016-07-05 01:49:14 +02:00
2.9.0.windows.1
2016-03-01 00:09:49 +01:00