diff --git a/src/net/minecraft/block/BlockFlowing.java b/src/net/minecraft/block/BlockFlowing.java index cd6343a..c2c9e2f 100644 --- a/src/net/minecraft/block/BlockFlowing.java +++ b/src/net/minecraft/block/BlockFlowing.java @@ -54,7 +54,10 @@ public class BlockFlowing extends BlockFluid { if (this.field_659_a >= 2 && this.blockMaterial == Material.water) { if (var1.getBlockMaterial(var2, var3 - 1, var4).isSolid()) { var10 = 0; - } else if (var1.getBlockMaterial(var2, var3 - 1, var4) == this.blockMaterial && var1.getBlockMetadata(var2, var3, var4) == 0) { + // Patch start + // } else if (var1.getBlockMaterial(var2, var3 - 1, var4) == this.blockMaterial && var1.getBlockMetadata(var2, var3, var4) == 0) { + } else if (var1.getBlockMaterial(var2, var3 - 1, var4) == this.blockMaterial && var1.getBlockMetadata(var2, var3 - 1, var4) == 0) { + // Patch end var10 = 0; } } diff --git a/src/net/minecraft/entity/EntityItem.java b/src/net/minecraft/entity/EntityItem.java index 741153d..a2edc3a 100644 --- a/src/net/minecraft/entity/EntityItem.java +++ b/src/net/minecraft/entity/EntityItem.java @@ -23,6 +23,15 @@ public class EntityItem extends Entity { this.yOffset = this.height / 2.0F; this.setPosition(var2, var4, var6); this.item = var8; + // Patch start + if (this.item.itemID < 0 || this.item.itemID >= Item.itemsList.length || Item.itemsList[this.item.itemID] == null) { + this.setEntityDead(); + this.item = new ItemStack(Block.stone); // Workaround for the EntityTracker + } + if (this.item.stackSize < 1) { + this.item.stackSize = 1; + } + // Patch end this.rotationYaw = (float) (Math.random() * 360.0D); this.motionX = (double) ((float) (Math.random() * (double) 0.2F - (double) 0.1F)); this.motionY = (double) 0.2F; @@ -47,6 +56,12 @@ public class EntityItem extends Entity { if (this.delayBeforeCanPickup > 0) { --this.delayBeforeCanPickup; } + // Patch start + if (this.item.itemID < 0 || this.item.itemID >= Item.itemsList.length || Item.itemsList[this.item.itemID] == null) { + this.setEntityDead(); + this.age = 6001; + } + // Patch end this.prevPosX = this.posX; this.prevPosY = this.posY; diff --git a/src/net/minecraft/server/observers/PlayerInstance.java b/src/net/minecraft/server/observers/PlayerInstance.java index dd8ca09..1c4e864 100644 --- a/src/net/minecraft/server/observers/PlayerInstance.java +++ b/src/net/minecraft/server/observers/PlayerInstance.java @@ -61,7 +61,10 @@ class PlayerInstance { } var1.loadedChunks.remove(this.currentChunk); - if (var1.field_420_ah.contains(this.currentChunk)) { + // Patch start + //if (var1.field_420_ah.contains(this.currentChunk)) { // ChunkCoordIntPair leaking + if (var1.field_420_ah.remove(this.currentChunk)) { + // Patch end var1.playerNetServerHandler.sendPacket(new Packet50PreChunk(this.chunkX, this.chunkZ, false)); } @@ -117,6 +120,11 @@ class PlayerInstance { public void sendPacketToPlayersInInstance(Packet var1) { for (int var2 = 0; var2 < this.players.size(); ++var2) { EntityPlayerMP var3 = (EntityPlayerMP) this.players.get(var2); + // Patch start + if (var1.isChunkDataPacket && var3.loadedChunks.contains(this.currentChunk)) { + continue; + } + // Patch end if (var3.field_420_ah.contains(this.currentChunk)) { var3.playerNetServerHandler.sendPacket(var1); } diff --git a/src/net/minecraft/server/observers/PlayerManager.java b/src/net/minecraft/server/observers/PlayerManager.java index 62e3638..9e4eb4c 100644 --- a/src/net/minecraft/server/observers/PlayerManager.java +++ b/src/net/minecraft/server/observers/PlayerManager.java @@ -1,11 +1,11 @@ package net.minecraft.server.observers; import net.minecraft.entity.EntityPlayerMP; +import net.minecraft.math.ChunkCoordIntPair; import net.minecraft.server.MinecraftServer; import net.minecraft.world.WorldServer; -import java.util.ArrayList; -import java.util.List; +import java.util.*; public class PlayerManager { public List players = new ArrayList(); @@ -15,6 +15,10 @@ public class PlayerManager { private int field_28110_e; private int playerViewRadius; private final int[][] field_22089_e = new int[][]{{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; + // Patch start + private final byte[] circularMask; + private final Set prevChunksTmp = new HashSet<>(); + // Patch end public PlayerManager(MinecraftServer var1, int var2, int var3) { if (var3 > 15) { @@ -25,6 +29,22 @@ public class PlayerManager { this.playerViewRadius = var3; this.mcServer = var1; this.field_28110_e = var2; + // Patch start + if (var1.propertyManagerObj.getBooleanProperty("round-view-of-the-terrain", false)) { + int sideWidth = var3 + var3 + 1; + this.circularMask = new byte[sideWidth * sideWidth]; + for (int x = 0; x < sideWidth; x++) { + for (int y = 0; y < sideWidth; y++) { + int a = x - var3, b = y - var3; + if (a * a + b * b - sideWidth < var3 * var3) { + this.circularMask[sideWidth * x + y] = 1; + } + } + } + } else { + this.circularMask = new byte[0]; + } + // Patch end } } @@ -62,37 +82,62 @@ public class PlayerManager { } public void addPlayer(EntityPlayerMP var1) { - int var2 = (int) var1.posX >> 4; - int var3 = (int) var1.posZ >> 4; + // Patch start + //int var2 = (int) var1.posX >> 4; + //int var3 = (int) var1.posZ >> 4; + final int var2 = (int) var1.posX >> 4; + final int var3 = (int) var1.posZ >> 4; + // Patch end var1.field_9155_d = var1.posX; var1.field_9154_e = var1.posZ; int var4 = 0; int var5 = this.playerViewRadius; int var6 = 0; int var7 = 0; - this.getPlayerInstance(var2, var3, true).addPlayer(var1); - - int var8; - for (var8 = 1; var8 <= var5 * 2; ++var8) { - for (int var9 = 0; var9 < 2; ++var9) { - int[] var10 = this.field_22089_e[var4++ % 4]; - - for (int var11 = 0; var11 < var8; ++var11) { - var6 += var10[0]; - var7 += var10[1]; - this.getPlayerInstance(var2 + var6, var3 + var7, true).addPlayer(var1); + // Patch start + if (this.circularMask.length > 0) { + int k1 = var5 + var5 + 1; + for (int vx = -var5; vx <= var5; vx++) { + for (int vz = -var5; vz <= var5; vz++) { + int relX = vx + var5, relZ = vz + var5; + if (this.circularMask[k1 * relX + relZ] != 0) { + this.getPlayerInstance(var2 + vx, var3 + vz, true).addPlayer(var1); + } } } + } else { + this.getPlayerInstance(var2, var3, true).addPlayer(var1); + + int var8; + for (var8 = 1; var8 <= var5 * 2; ++var8) { + for (int var9 = 0; var9 < 2; ++var9) { + int[] var10 = this.field_22089_e[var4++ % 4]; + + for (int var11 = 0; var11 < var8; ++var11) { + var6 += var10[0]; + var7 += var10[1]; + this.getPlayerInstance(var2 + var6, var3 + var7, true).addPlayer(var1); + } + } + } + + var4 %= 4; + + for (var8 = 0; var8 < var5 * 2; ++var8) { + var6 += this.field_22089_e[var4][0]; + var7 += this.field_22089_e[var4][1]; + this.getPlayerInstance(var2 + var6, var3 + var7, true).addPlayer(var1); + } } - var4 %= 4; - - for (var8 = 0; var8 < var5 * 2; ++var8) { - var6 += this.field_22089_e[var4][0]; - var7 += this.field_22089_e[var4][1]; - this.getPlayerInstance(var2 + var6, var3 + var7, true).addPlayer(var1); - } - + Collections.sort(var1.loadedChunks, new Comparator() { + @Override + public int compare(ChunkCoordIntPair a, ChunkCoordIntPair b) { + return Math.max(Math.abs(a.chunkXPos - var2), Math.abs(a.chunkZPos - var3)) + - Math.max(Math.abs(b.chunkXPos - var2), Math.abs(b.chunkZPos - var3)); + } + }); + // Patch end this.players.add(var1); } @@ -130,16 +175,44 @@ public class PlayerManager { int var12 = var2 - var10; int var13 = var3 - var11; if (var12 != 0 || var13 != 0) { - for (int var14 = var2 - this.playerViewRadius; var14 <= var2 + this.playerViewRadius; ++var14) { - for (int var15 = var3 - this.playerViewRadius; var15 <= var3 + this.playerViewRadius; ++var15) { - if (!this.func_544_a(var14, var15, var10, var11)) { - this.getPlayerInstance(var14, var15, true).addPlayer(var1); - } + // Patch start + if (this.circularMask.length > 0) { + this.prevChunksTmp.clear(); + this.prevChunksTmp.addAll(var1.field_420_ah); + int k1 = this.playerViewRadius + this.playerViewRadius + 1; - if (!this.func_544_a(var14 - var12, var15 - var13, var2, var3)) { - PlayerInstance var16 = this.getPlayerInstance(var14 - var12, var15 - var13, false); - if (var16 != null) { - var16.removePlayer(var1); + for (int vx = -this.playerViewRadius; vx <= this.playerViewRadius; vx++) { + for (int vz = -this.playerViewRadius; vz <= this.playerViewRadius; vz++) { + int relX = vx + this.playerViewRadius, relZ = vz + this.playerViewRadius; + if (this.circularMask[k1 * relX + relZ] == 0) { + continue; + } + ChunkCoordIntPair rem = new ChunkCoordIntPair(var2 + vx, var3 + vz); + if (!this.prevChunksTmp.remove(rem)) { + this.getPlayerInstance(var2 + vx, var3 + vz, true).addPlayer(var1); + } + } + } + + for (ChunkCoordIntPair pair : this.prevChunksTmp) { + PlayerInstance playerinstance = this.getPlayerInstance(pair.chunkXPos, pair.chunkZPos, false); + if (playerinstance != null) { + playerinstance.removePlayer(var1); + } + } + this.prevChunksTmp.clear(); + } else { + for (int var14 = var2 - this.playerViewRadius; var14 <= var2 + this.playerViewRadius; ++var14) { + for (int var15 = var3 - this.playerViewRadius; var15 <= var3 + this.playerViewRadius; ++var15) { + if (!this.func_544_a(var14, var15, var10, var11)) { + this.getPlayerInstance(var14, var15, true).addPlayer(var1); + } + + if (!this.func_544_a(var14 - var12, var15 - var13, var2, var3)) { + PlayerInstance var16 = this.getPlayerInstance(var14 - var12, var15 - var13, false); + if (var16 != null) { + var16.removePlayer(var1); + } } } } @@ -147,6 +220,20 @@ public class PlayerManager { var1.field_9155_d = var1.posX; var1.field_9154_e = var1.posZ; + + // CraftBukkit start - send nearest chunks first + if (var12 > 1 || var12 < -1 || var13 > 1 || var13 < -1) { + final int x = var2; + final int z = var3; + Collections.sort(var1.loadedChunks, new Comparator() { + public int compare(ChunkCoordIntPair a, ChunkCoordIntPair b) { + return Math.max(Math.abs(a.chunkXPos - x), Math.abs(a.chunkZPos - z)) + - Math.max(Math.abs(b.chunkXPos - x), Math.abs(b.chunkZPos - z)); + } + }); + } + // CraftBukkit end + // Patch end } } } diff --git a/src/net/minecraft/world/generators/MapGenCaves.java b/src/net/minecraft/world/generators/MapGenCaves.java index 9501324..45e20da 100644 --- a/src/net/minecraft/world/generators/MapGenCaves.java +++ b/src/net/minecraft/world/generators/MapGenCaves.java @@ -8,15 +8,19 @@ import java.util.Random; public class MapGenCaves extends MapGenBase { protected void func_669_a(int var1, int var2, byte[] var3, double var4, double var6, double var8) { - this.releaseEntitySkin(var1, var2, var3, var4, var6, var8, 1.0F + this.rand.nextFloat() * 6.0F, 0.0F, 0.0F, -1, -1, 0.5D); + // Patch start + //this.releaseEntitySkin(var1, var2, var3, var4, var6, var8, 1.0F + this.rand.nextFloat() * 6.0F, 0.0F, 0.0F, -1, -1, 0.5D); + this.releaseEntitySkin(var1, var2, var3, var4, var6, var8, 1.0F + this.rand.nextFloat() * 6.0F, 0.0F, 0.0F, -1, -1, 0.5D, new Random(this.rand.nextLong())); } - protected void releaseEntitySkin(int var1, int var2, byte[] var3, double var4, double var6, double var8, float var10, float var11, float var12, int var13, int var14, double var15) { + //protected void releaseEntitySkin(int var1, int var2, byte[] var3, double var4, double var6, double var8, float var10, float var11, float var12, int var13, int var14, double var15) { + protected void releaseEntitySkin(int var1, int var2, byte[] var3, double var4, double var6, double var8, float var10, float var11, float var12, int var13, int var14, double var15, Random var23) { double var17 = (double) (var1 * 16 + 8); double var19 = (double) (var2 * 16 + 8); float var21 = 0.0F; float var22 = 0.0F; - Random var23 = new Random(this.rand.nextLong()); + //Random var23 = new Random(this.rand.nextLong()); + // Patch end if (var14 <= 0) { int var24 = this.field_947_a * 16 - 16; var14 = var24 - var23.nextInt(var24 / 4); @@ -51,8 +55,12 @@ public class MapGenCaves extends MapGenBase { var22 += (var23.nextFloat() - var23.nextFloat()) * var23.nextFloat() * 2.0F; var21 += (var23.nextFloat() - var23.nextFloat()) * var23.nextFloat() * 4.0F; if (!var52 && var13 == var25 && var10 > 1.0F) { - this.releaseEntitySkin(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 - (float) Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D); - this.releaseEntitySkin(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 + (float) Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D); + // Patch start + //this.releaseEntitySkin(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 - (float) Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D); + //this.releaseEntitySkin(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 + (float) Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D); + this.releaseEntitySkin(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 - (float) Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D, var23); + this.releaseEntitySkin(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 + (float) Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D, var23); + // Patch end return; } @@ -182,7 +190,10 @@ public class MapGenCaves extends MapGenBase { float var17 = this.rand.nextFloat() * (float) Math.PI * 2.0F; float var18 = (this.rand.nextFloat() - 0.5F) * 2.0F / 8.0F; float var19 = this.rand.nextFloat() * 2.0F + this.rand.nextFloat(); - this.releaseEntitySkin(var4, var5, var6, var9, var11, var13, var19, var17, var18, 0, 0, 1.0D); + // Patch start + //this.releaseEntitySkin(var4, var5, var6, var9, var11, var13, var19, var17, var18, 0, 0, 1.0D); + this.releaseEntitySkin(var4, var5, var6, var9, var11, var13, var19, var17, var18, 0, 0, 1.0D, new Random(this.rand.nextLong())); + // Patch end } } diff --git a/src/net/minecraft/world/generators/MapGenCavesHell.java b/src/net/minecraft/world/generators/MapGenCavesHell.java index d81adb9..9f749f0 100644 --- a/src/net/minecraft/world/generators/MapGenCavesHell.java +++ b/src/net/minecraft/world/generators/MapGenCavesHell.java @@ -8,15 +8,19 @@ import java.util.Random; public class MapGenCavesHell extends MapGenBase { protected void func_4106_a(int var1, int var2, byte[] var3, double var4, double var6, double var8) { - this.func_4105_a(var1, var2, var3, var4, var6, var8, 1.0F + this.rand.nextFloat() * 6.0F, 0.0F, 0.0F, -1, -1, 0.5D); + // Patch start + //this.func_4105_a(var1, var2, var3, var4, var6, var8, 1.0F + this.rand.nextFloat() * 6.0F, 0.0F, 0.0F, -1, -1, 0.5D); + this.func_4105_a(var1, var2, var3, var4, var6, var8, 1.0F + this.rand.nextFloat() * 6.0F, 0.0F, 0.0F, -1, -1, 0.5D, new Random(this.rand.nextLong())); } - protected void func_4105_a(int var1, int var2, byte[] var3, double var4, double var6, double var8, float var10, float var11, float var12, int var13, int var14, double var15) { + //protected void func_4105_a(int var1, int var2, byte[] var3, double var4, double var6, double var8, float var10, float var11, float var12, int var13, int var14, double var15) { + protected void func_4105_a(int var1, int var2, byte[] var3, double var4, double var6, double var8, float var10, float var11, float var12, int var13, int var14, double var15, Random var23) { double var17 = (double) (var1 * 16 + 8); double var19 = (double) (var2 * 16 + 8); float var21 = 0.0F; float var22 = 0.0F; - Random var23 = new Random(this.rand.nextLong()); + //Random var23 = new Random(this.rand.nextLong()); + // Patch end if (var14 <= 0) { int var24 = this.field_947_a * 16 - 16; var14 = var24 - var23.nextInt(var24 / 4); @@ -51,8 +55,12 @@ public class MapGenCavesHell extends MapGenBase { var22 += (var23.nextFloat() - var23.nextFloat()) * var23.nextFloat() * 2.0F; var21 += (var23.nextFloat() - var23.nextFloat()) * var23.nextFloat() * 4.0F; if (!var51 && var13 == var25 && var10 > 1.0F) { - this.func_4105_a(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 - (float) Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D); - this.func_4105_a(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 + (float) Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D); + // Patch start + //this.func_4105_a(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 - (float) Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D); + //this.func_4105_a(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 + (float) Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D); + this.func_4105_a(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 - (float) Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D, var23); + this.func_4105_a(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 + (float) Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D, var23); + //Patch end return; } @@ -169,7 +177,10 @@ public class MapGenCavesHell extends MapGenBase { float var17 = this.rand.nextFloat() * (float) Math.PI * 2.0F; float var18 = (this.rand.nextFloat() - 0.5F) * 2.0F / 8.0F; float var19 = this.rand.nextFloat() * 2.0F + this.rand.nextFloat(); - this.func_4105_a(var4, var5, var6, var9, var11, var13, var19 * 2.0F, var17, var18, 0, 0, 0.5D); + // Patch start + //this.func_4105_a(var4, var5, var6, var9, var11, var13, var19 * 2.0F, var17, var18, 0, 0, 0.5D); + this.func_4105_a(var4, var5, var6, var9, var11, var13, var19 * 2.0F, var17, var18, 0, 0, 0.5D, new Random(this.rand.nextLong())); + // Patch end } } diff --git a/src/net/minecraft/world/generators/WorldGenBigTree.java b/src/net/minecraft/world/generators/WorldGenBigTree.java index 5e0c01a..c1fd20a 100644 --- a/src/net/minecraft/world/generators/WorldGenBigTree.java +++ b/src/net/minecraft/world/generators/WorldGenBigTree.java @@ -289,7 +289,10 @@ public class WorldGenBigTree extends WorldGenerator { var13[var6] = MathHelper.floor_double((double) var1[var6] + (double) var14 * var9); var13[var7] = MathHelper.floor_double((double) var1[var7] + (double) var14 * var11); int var16 = this.worldObj.getBlockId(var13[0], var13[1], var13[2]); - if (var16 != 0 && var16 != 18) { + // Patch start + // if (var16 != 0 && var16 != 18) { + if ((var16 != 0 && var16 != 18) || var13[1] >= 128) { + // Patch end break; } }