fix render distance cycling, but partially break new players appearing when doing so

This commit is contained in:
ayunami2000 2022-08-24 12:09:27 -04:00
parent 05379987aa
commit 73668289cf
6 changed files with 12078 additions and 12057 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

@ -816,9 +816,13 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
var2 = (var2 >> 5) + 2; var2 = (var2 >> 5) + 2;
if (var2 > 3 && var2 < 15) { if (var2 > 3 && var2 < 15) {
EntityPlayerMP fard = this.mcServer.getConfigurationManager().getPlayerEntity(this.mcServer.getServerOwner()); if (this.mcServer.getServerOwner().equals(this.username)) {
int maxRenderDistance = fard == null ? 10 : (fard.renderDistance > 10 ? 10 : fard.renderDistance); this.renderDistance = var2;
this.renderDistance = var2 > maxRenderDistance ? maxRenderDistance : var2; } else {
EntityPlayerMP fard = this.mcServer.getConfigurationManager().getPlayerEntity(this.mcServer.getServerOwner());
int maxRenderDistance = fard == null ? 10 : (fard.renderDistance > 10 ? 10 : fard.renderDistance);
this.renderDistance = var2 > maxRenderDistance ? maxRenderDistance : var2;
}
if(this.lastRenderDistance != this.renderDistance) { if(this.lastRenderDistance != this.renderDistance) {
if(this.mcServer.isSinglePlayer() && this.mcServer.getServerOwner().equals(this.username)) { if(this.mcServer.isSinglePlayer() && this.mcServer.getServerOwner().equals(this.username)) {
for(int i = 0; i < this.mcServer.worldServers.length; ++i) { for(int i = 0; i < this.mcServer.worldServers.length; ++i) {

@ -136,11 +136,15 @@ public class NetLoginHandler extends NetHandler {
if (var1 != null) { if (var1 != null) {
this.kickUser(var1); this.kickUser(var1);
} else { } else {
EntityPlayerMP fard = this.mcServer.getConfigurationManager().getPlayerEntity(this.mcServer.getServerOwner());
int maxRenderDistance = fard == null ? 10 : (fard.renderDistance > 10 ? 10 : fard.renderDistance);
EntityPlayerMP var2 = this.mcServer.getConfigurationManager().createPlayerForUser(this.clientUsername); EntityPlayerMP var2 = this.mcServer.getConfigurationManager().createPlayerForUser(this.clientUsername);
if (var2 != null) { if (var2 != null) {
var2.renderDistance = var2.lastRenderDistance = (this.viewDistance > maxRenderDistance && !this.mcServer.getServerOwner().equals(this.clientUsername)) ? maxRenderDistance : this.viewDistance; if (this.mcServer.getServerOwner().equals(this.clientUsername)) {
var2.renderDistance = this.viewDistance;
} else {
EntityPlayerMP fard = this.mcServer.getConfigurationManager().getPlayerEntity(this.mcServer.getServerOwner());
int maxRenderDistance = fard == null ? 10 : (fard.renderDistance > 10 ? 10 : fard.renderDistance);
var2.renderDistance = this.viewDistance > maxRenderDistance ? maxRenderDistance : this.viewDistance;
}
this.mcServer.getConfigurationManager().initializeConnectionToPlayer(this.myTCPConnection, var2); this.mcServer.getConfigurationManager().initializeConnectionToPlayer(this.myTCPConnection, var2);
}else { }else {
this.kickUser("Could not construct EntityPlayerMP for '" + var1 + "'"); this.kickUser("Could not construct EntityPlayerMP for '" + var1 + "'");

@ -86,37 +86,31 @@ public class PlayerManager {
} }
} }
public EntityPlayerMP cycleRenderDistance(EntityPlayerMP player) { public void cycleRenderDistance(EntityPlayerMP player) {
if(player.mcServer.getServerOwner().equals(player.username)) { if(player.lastRenderDistance != player.renderDistance) {
player = cycleAllRenderDistance(player); player.lastRenderDistance = player.renderDistance;
}else { player.mcServer.getConfigurationManager().updateOnRenderDistanceChange(player);
if(player.lastRenderDistance != player.renderDistance) { }
player.lastRenderDistance = player.renderDistance; if(player.mcServer.getServerOwner().equals(player.username)) {
player.playerNetServerHandler.playerEntity = player.mcServer.getConfigurationManager().recreatePlayerEntity(player, player.dimension, true, false); cycleAllRenderDistance(player);
player = player.playerNetServerHandler.playerEntity;
}
} }
return player;
} }
public EntityPlayerMP cycleAllRenderDistance(EntityPlayerMP player) { public void cycleAllRenderDistance(EntityPlayerMP player) {
if(player.lastRenderDistance != player.renderDistance) { player.mcServer.getConfigurationManager().viewDistance = player.renderDistance;
player.mcServer.getConfigurationManager().viewDistance = player.renderDistance; player.lastRenderDistance = player.renderDistance;
// player.lastRenderDistance = player.renderDistance; List curList = new ArrayList();
List curList = new ArrayList(); curList.addAll(players);
curList.addAll(players); curList.remove(player);
for(int i = 0, l = curList.size(); i < l; ++i) { int limited = player.renderDistance > 10 ? 10 : player.renderDistance;
EntityPlayerMP playerReload = (EntityPlayerMP)curList.get(i); for(int i = 0, l = curList.size(); i < l; ++i) {
boolean returnThisOne = playerReload.equals(player); EntityPlayerMP playerReload = (EntityPlayerMP)curList.get(i);
if (playerReload.lastRenderDistance != player.renderDistance) { int targetRenderDist = player.renderDistance > limited ? limited : player.renderDistance;
playerReload.lastRenderDistance = playerReload.renderDistance = player.renderDistance; if (playerReload.renderDistance != targetRenderDist) {
playerReload.playerNetServerHandler.playerEntity = playerReload.mcServer.getConfigurationManager().recreatePlayerEntity(playerReload, playerReload.dimension, true, false); playerReload.lastRenderDistance = playerReload.renderDistance = targetRenderDist;
playerReload = playerReload.playerNetServerHandler.playerEntity; playerReload.mcServer.getConfigurationManager().updateOnRenderDistanceChange(playerReload);
}
if (returnThisOne) player = playerReload;
} }
} }
return player;
} }
/** /**
@ -150,7 +144,7 @@ public class PlayerManager {
*/ */
public EntityPlayerMP filterChunkLoadQueue(EntityPlayerMP par1EntityPlayerMP) { public EntityPlayerMP filterChunkLoadQueue(EntityPlayerMP par1EntityPlayerMP) {
if(par1EntityPlayerMP.lastRenderDistance != par1EntityPlayerMP.renderDistance) { if(par1EntityPlayerMP.lastRenderDistance != par1EntityPlayerMP.renderDistance) {
par1EntityPlayerMP = cycleRenderDistance(par1EntityPlayerMP); cycleRenderDistance(par1EntityPlayerMP);
} }
ArrayList var2 = new ArrayList(par1EntityPlayerMP.loadedChunks); ArrayList var2 = new ArrayList(par1EntityPlayerMP.loadedChunks);
int var3 = 0; int var3 = 0;
@ -233,7 +227,7 @@ public class PlayerManager {
*/ */
public EntityPlayerMP updateMountedMovingPlayer(EntityPlayerMP par1EntityPlayerMP) { public EntityPlayerMP updateMountedMovingPlayer(EntityPlayerMP par1EntityPlayerMP) {
if(par1EntityPlayerMP.renderDistance != par1EntityPlayerMP.lastRenderDistance) { if(par1EntityPlayerMP.renderDistance != par1EntityPlayerMP.lastRenderDistance) {
par1EntityPlayerMP = cycleRenderDistance(par1EntityPlayerMP); cycleRenderDistance(par1EntityPlayerMP);
} }
int var2 = (int) par1EntityPlayerMP.posX >> 4; int var2 = (int) par1EntityPlayerMP.posX >> 4;
int var3 = (int) par1EntityPlayerMP.posZ >> 4; int var3 = (int) par1EntityPlayerMP.posZ >> 4;

@ -282,6 +282,19 @@ public class ServerConfigurationManager {
return new EntityPlayerMP(this.mcServer, this.mcServer.worldServerForDimension(0), par1Str, (ItemInWorldManager) var6); return new EntityPlayerMP(this.mcServer, this.mcServer.worldServerForDimension(0), par1Str, (ItemInWorldManager) var6);
} }
/**
* Called on render distance change
*/
public void updateOnRenderDistanceChange(EntityPlayerMP par1EntityPlayerMP) {
par1EntityPlayerMP.getServerForPlayer().getEntityTracker().removePlayerFromTrackers(par1EntityPlayerMP);
par1EntityPlayerMP.getServerForPlayer().getPlayerManager().removePlayer(par1EntityPlayerMP);
par1EntityPlayerMP.getServerForPlayer().getPlayerManager().addPlayer(par1EntityPlayerMP);
for (Object loadedChunk : par1EntityPlayerMP.loadedChunks) {
Chunk chunk = (Chunk) loadedChunk;
par1EntityPlayerMP.getServerForPlayer().getEntityTracker().func_85172_a(par1EntityPlayerMP, chunk);
}
}
/** /**
* Called on respawn * Called on respawn
*/ */
@ -307,6 +320,9 @@ public class ServerConfigurationManager {
var7.playerNetServerHandler = par1EntityPlayerMP.playerNetServerHandler; var7.playerNetServerHandler = par1EntityPlayerMP.playerNetServerHandler;
var7.clonePlayer(par1EntityPlayerMP, par3); var7.clonePlayer(par1EntityPlayerMP, par3);
var7.entityId = par1EntityPlayerMP.entityId; var7.entityId = par1EntityPlayerMP.entityId;
if (!teleport) {
var7.capabilities = par1EntityPlayerMP.capabilities;
}
WorldServer var8 = this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension); WorldServer var8 = this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension);
this.func_72381_a(var7, par1EntityPlayerMP, var8); this.func_72381_a(var7, par1EntityPlayerMP, var8);
ChunkCoordinates var9; ChunkCoordinates var9;
@ -334,8 +350,10 @@ public class ServerConfigurationManager {
var8.theChunkProviderServer.loadChunk((int) var7.posX >> 4, (int) var7.posZ >> 4); var8.theChunkProviderServer.loadChunk((int) var7.posX >> 4, (int) var7.posZ >> 4);
while (!var8.getCollidingBoundingBoxes(var7, var7.boundingBox).isEmpty()) { if (teleport) {
var7.setPosition(var7.posX, var7.posY + 1.0D, var7.posZ); while (!var8.getCollidingBoundingBoxes(var7, var7.boundingBox).isEmpty()) {
var7.setPosition(var7.posX, var7.posY + 1.0D, var7.posZ);
}
} }
if (startDim != par2) { if (startDim != par2) {