Compare commits

...

6 commits

7 changed files with 185 additions and 47 deletions

View file

@ -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;
}
}

View file

@ -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;

View file

@ -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);
}

View file

@ -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<ChunkCoordIntPair> 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<ChunkCoordIntPair>() {
@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<ChunkCoordIntPair>() {
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
}
}
}

View file

@ -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
}
}

View file

@ -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
}
}

View file

@ -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;
}
}