From b4e6e7d7a7b9bd228d808f50d26855cb743a36a1 Mon Sep 17 00:00:00 2001 From: mckuhei Date: Wed, 7 Aug 2024 22:17:47 +0800 Subject: [PATCH] Fix terrain generation --- .../net/minecraft/client/Minecraft.java | 5 + src/minecraft/net/minecraft/src/Chunk.java | 28 ++- .../minecraft/src/ChunkProviderGenerate.java | 209 +++++++++++++----- .../minecraft/src/ChunkProviderServer.java | 5 + .../net/minecraft/src/EntityPlayerMP.java | 6 +- .../minecraft/src/ExtendedBlockStorage.java | 2 + .../net/minecraft/src/IChunkProvider.java | 2 + .../net/minecraft/src/PlayerInstance.java | 17 +- .../net/minecraft/src/PlayerManager.java | 75 ++++--- src/minecraft/net/minecraft/src/World.java | 6 +- .../net/minecraft/src/WorldServer.java | 9 + 11 files changed, 265 insertions(+), 99 deletions(-) diff --git a/src/minecraft/net/minecraft/client/Minecraft.java b/src/minecraft/net/minecraft/client/Minecraft.java index a64733f..3e47923 100644 --- a/src/minecraft/net/minecraft/client/Minecraft.java +++ b/src/minecraft/net/minecraft/client/Minecraft.java @@ -1552,6 +1552,11 @@ public abstract class Minecraft implements Runnable, IPlayerUsage { this.gameSettings.smoothCamera = !this.gameSettings.smoothCamera; } + if (Keyboard.getEventKey() == Keyboard.KEY_F) { + if (this.thePlayer != null) { + this.thePlayer.capabilities.isFlying ^= true; + } + } } int var5; diff --git a/src/minecraft/net/minecraft/src/Chunk.java b/src/minecraft/net/minecraft/src/Chunk.java index b81b28e..6d3103d 100644 --- a/src/minecraft/net/minecraft/src/Chunk.java +++ b/src/minecraft/net/minecraft/src/Chunk.java @@ -118,19 +118,19 @@ public class Chunk this(par1World, par3, par4); int var5 = par2ArrayOfByte.length / 256; - for (int var6 = 0; var6 < 16; ++var6) + for (int x = 0; x < 16; ++x) { - for (int var7 = 0; var7 < 16; ++var7) + for (int z = 0; z < 16; ++z) { - for (int var8 = 0; var8 < var5; ++var8) + for (int y = 0; y < var5; ++y) { - byte var9 = par2ArrayOfByte[var6 << 12 | var7 << 8 | var8]; + byte var9 = par2ArrayOfByte[x << 12 | z << 8 | y]; if (var9 != 0) { - int var10 = var8 >> 4; + int var10 = y >> 4; - getBlockStorage(var10).setExtBlockID(var6, var8 & 15, var7, var9); + getBlockStorage(var10).setExtBlockID(x, y & 15, z, var9); } } } @@ -181,10 +181,15 @@ public class Chunk if(yBase < 0 || yBase >= storageArrays.length) { LinkedList list = extraStorageArray[yBase & 0xFF]; if(list == null) list = extraStorageArray[yBase & 0xFF] = new LinkedList<>(); - for(ExtendedBlockStorage blockStorage : list) if(blockStorage.yBase == yBase) return blockStorage; + for(ExtendedBlockStorage blockStorage : list) if(blockStorage.yBase == yBase) { + if (blockStorage.isPrototype) { + this.worldObj.doDecorateExtraChunk(this, xPosition, yBase, zPosition, blockStorage); + } + return blockStorage; + } ExtendedBlockStorage blockStorage = new ExtendedBlockStorage(yBase); list.add(blockStorage); - worldObj.addExtraChunk(xPosition, yBase, zPosition, blockStorage); + this.worldObj.addExtraChunk(xPosition, yBase, zPosition, blockStorage); return blockStorage; } else { ExtendedBlockStorage blockStorage; @@ -1434,4 +1439,11 @@ public class Chunk public LinkedList[] getExtraStorageArray() { return extraStorageArray; } + + public void addExtraChunk(ExtendedBlockStorage storage) { + int yBase = storage.yBase; + if (yBase < 0 || yBase > storageArrays.length) { + extraStorageArray[yBase & 0xFF].add(storage); + } + } } diff --git a/src/minecraft/net/minecraft/src/ChunkProviderGenerate.java b/src/minecraft/net/minecraft/src/ChunkProviderGenerate.java index d814050..da703a2 100644 --- a/src/minecraft/net/minecraft/src/ChunkProviderGenerate.java +++ b/src/minecraft/net/minecraft/src/ChunkProviderGenerate.java @@ -180,88 +180,93 @@ public class ChunkProviderGenerate implements IChunkProvider /** * Replaces the stone that was placed in with blocks that match the biome + * @param storage */ - public void replaceBlocksForBiome(BigInteger par1, BigInteger par2, byte[] par3ArrayOfByte, BiomeGenBase[] par4ArrayOfBiomeGenBase) + public void replaceBlocksForBiome(BigInteger par1, BigInteger par2, byte[] blockArray, BiomeGenBase[] par4ArrayOfBiomeGenBase, ExtendedBlockStorage storage) { - byte var5 = 63; + byte seaLevel = 63; double var6 = 0.03125D; // X, Y, 0 -> X. 0, Y this.stoneNoise = this.noiseGen4.generateNoiseOctaves(this.stoneNoise, par1.shiftLeft(4), BigInteger.ZERO, par2.shiftLeft(4), 16, 1, 16, var6 * 2.0D, var6 * 2.0D, var6 * 2.0D); - for (int var8 = 0; var8 < 16; ++var8) + for (int z = 0; z < 16; ++z) { - for (int var9 = 0; var9 < 16; ++var9) + for (int x = 0; x < 16; ++x) { - BiomeGenBase var10 = par4ArrayOfBiomeGenBase[var9 + var8 * 16]; - float var11 = var10.getFloatTemperature(); - int var12 = (int)(this.stoneNoise[var8 + var9 * 16] / 3.0D + 3.0D + this.rand.nextDouble() * 0.25D); - int var13 = -1; - byte var14 = var10.topBlock; - byte var15 = var10.fillerBlock; - - for (int var16 = 255; var16 >= 0; --var16) + BiomeGenBase biome = par4ArrayOfBiomeGenBase[x + z * 16]; + float temperature = biome.getFloatTemperature(); + int dirtLayerHeight = Math.min((int)(this.stoneNoise[z + x * 16] / 3.0D + 3.0D + this.rand.nextDouble() * 0.25D), 16); // clamp to 16 blocks + int currentHeight = -1; + byte topBlockId = biome.topBlock; + byte fillerBlockId = biome.fillerBlock; + + for (int y = 271; y >= 0; --y) { - int var17 = (var9 * 16 + var8) * 256 + var16; + int idx = (x * 16 + z) * 256 + y; - if (var16 <= 0 + this.rand.nextInt(5)) + if (y <= 0 + this.rand.nextInt(5)) { -// par3ArrayOfByte[var17] = (byte)Block.bedrock.blockID; +// par3ArrayOfByte[idx] = (byte)Block.bedrock.blockID; } else { - byte var18 = par3ArrayOfByte[var17]; + byte blockId = (byte) (y > 255 ? storage.getExtBlockID(x, y & 0xF, z) : blockArray[idx]); - if (var18 == 0) + if (blockId == 0) { - var13 = -1; + currentHeight = -1; } - else if (var18 == Block.stone.blockID) + else if (blockId == Block.stone.blockID) { - if (var13 == -1) + if (currentHeight == -1) { - if (var12 <= 0) + if (dirtLayerHeight <= 0) { - var14 = 0; - var15 = (byte)Block.stone.blockID; + topBlockId = 0; + fillerBlockId = (byte)Block.stone.blockID; } - else if (var16 >= var5 - 4 && var16 <= var5 + 1) + else if (y >= seaLevel - 4 && y <= seaLevel + 1) { - var14 = var10.topBlock; - var15 = var10.fillerBlock; + topBlockId = biome.topBlock; + fillerBlockId = biome.fillerBlock; } - if (var16 < var5 && var14 == 0) + if (y < seaLevel && topBlockId == 0) { - if (var11 < 0.15F) + if (temperature < 0.15F) { - var14 = (byte)Block.ice.blockID; + topBlockId = (byte)Block.ice.blockID; } else { - var14 = (byte)Block.waterStill.blockID; + topBlockId = (byte)Block.waterStill.blockID; } } - var13 = var12; + currentHeight = dirtLayerHeight; - if (var16 >= var5 - 1) - { - par3ArrayOfByte[var17] = var14; - } - else - { - par3ArrayOfByte[var17] = var15; + if (y < 256) { + if (y >= seaLevel - 1) + { + blockArray[idx] = topBlockId; + } + else + { + blockArray[idx] = fillerBlockId; + } } } - else if (var13 > 0) + else if (currentHeight > 0) { - --var13; - par3ArrayOfByte[var17] = var15; + --currentHeight; + if (y < 256) { + blockArray[idx] = fillerBlockId; + } - if (var13 == 0 && var15 == Block.sand.blockID) + if (currentHeight == 0 && fillerBlockId == Block.sand.blockID) { - var13 = this.rand.nextInt(4); - var15 = (byte)Block.sandStone.blockID; + currentHeight = this.rand.nextInt(4); + fillerBlockId = (byte)Block.sandStone.blockID; } } } @@ -286,28 +291,33 @@ public class ChunkProviderGenerate implements IChunkProvider public Chunk provideChunk(BigInteger par1, BigInteger par2) { this.rand.setSeed((long)par1.longValue() * 341873128712L + (long)par2.longValue() * 132897987541L); - byte[] var3 = new byte[65536]; - this.generateTerrain(par1, par2, var3); + // index format: xxxxzzzzyyyyyyyy + byte[] blockArray = new byte[65536]; + this.generateTerrain(par1, par2, blockArray); this.biomesForGeneration = this.worldObj.getWorldChunkManager().loadBlockGeneratorData(this.biomesForGeneration, par1.shiftLeft(4), par2.shiftLeft(4), 16, 16); - this.replaceBlocksForBiome(par1, par2, var3, this.biomesForGeneration); - this.caveGenerator.generate(this, this.worldObj, par1, par2, var3); - this.ravineGenerator.generate(this, this.worldObj, par1, par2, var3); + ExtendedBlockStorage storage = new ExtendedBlockStorage(16); + this.generateExtraBlockStorage(par1, 16, par2, storage); + this.replaceBlocksForBiome(par1, par2, blockArray, this.biomesForGeneration, storage); + this.caveGenerator.generate(this, this.worldObj, par1, par2, blockArray); + this.ravineGenerator.generate(this, this.worldObj, par1, par2, blockArray); if (this.mapFeaturesEnabled) { - this.mineshaftGenerator.generate(this, this.worldObj, par1, par2, var3); - this.villageGenerator.generate(this, this.worldObj, par1, par2, var3); - this.strongholdGenerator.generate(this, this.worldObj, par1, par2, var3); - this.scatteredFeatureGenerator.generate(this, this.worldObj, par1, par2, var3); + this.mineshaftGenerator.generate(this, this.worldObj, par1, par2, blockArray); + this.villageGenerator.generate(this, this.worldObj, par1, par2, blockArray); + this.strongholdGenerator.generate(this, this.worldObj, par1, par2, blockArray); + this.scatteredFeatureGenerator.generate(this, this.worldObj, par1, par2, blockArray); } - Chunk var4 = new Chunk(this.worldObj, var3, par1, par2); + Chunk var4 = new Chunk(this.worldObj, blockArray, par1, par2); byte[] var5 = var4.getBiomeArray(); for (int var6 = 0; var6 < var5.length; ++var6) { var5[var6] = (byte)this.biomesForGeneration[var6].biomeID; } + + var4.addExtraChunk(storage); var4.generateSkylightMap(); return var4; @@ -342,9 +352,9 @@ public class ChunkProviderGenerate implements IChunkProvider double var45 = 684.412D; this.noise5 = this.noiseGen5.generateNoiseOctaves(this.noise5, par2, par4, par5, par7, 1.121D, 1.121D, 0.5D); this.noise6 = this.noiseGen6.generateNoiseOctaves(this.noise6, par2, par4, par5, par7, 200.0D, 200.0D, 0.5D); - this.noise3 = this.noiseGen3.generateNoiseOctaves(this.noise3, par2, par3, par4, par5, par6, par7, var44 / 80.0D, var45 / 160.0D, var44 / 80.0D); - this.noise1 = this.noiseGen1.generateNoiseOctaves(this.noise1, par2, par3, par4, par5, par6, par7, var44, var45, var44); - this.noise2 = this.noiseGen2.generateNoiseOctaves(this.noise2, par2, par3, par4, par5, par6, par7, var44, var45, var44); + this.noise3 = this.noiseGen3.generateNoiseOctaves(this.noise3, par2, -par3, par4, par5, par6, par7, var44 / 80.0D, var45 / 160.0D, var44 / 80.0D); + this.noise1 = this.noiseGen1.generateNoiseOctaves(this.noise1, par2, -par3, par4, par5, par6, par7, var44, var45, var44); + this.noise2 = this.noiseGen2.generateNoiseOctaves(this.noise2, par2, -par3, par4, par5, par6, par7, var44, var45, var44); boolean var43 = false; boolean var42 = false; int var12 = 0; @@ -549,6 +559,91 @@ public class ChunkProviderGenerate implements IChunkProvider int blockId = par3ArrayOfByte[i << 8 | k << 4 | j] & 0xFF; if(blockId != 0) storage.setExtBlockID(i, j, k, blockId); } + storage.isPrototype = true; + } + + @Override + public void decorateExtraChunk(Chunk chunk, BigInteger x, int y, BigInteger z, ExtendedBlockStorage blockStorage) { + blockStorage.isPrototype = false; + if (blockStorage.getBlockRefCnt() <= 0) return; +// this.rand.setSeed(((long)x.longValue() * 341873128712L + (long)z.longValue() * 132897987541L) ^ (0x5555555555555555L >>> y)); + this.rand.setSeed((long)x.longValue() * 341873128712L + (long)z.longValue() * 132897987541L); + ExtendedBlockStorage upperStorage = chunk.getBlockStorage(y + 1); + if (!upperStorage.isPrototype) { + upperStorage = new ExtendedBlockStorage(y + 1); + generateExtraBlockStorage(x, y + 1, z, upperStorage); + } + BiomeGenBase[] biomesForGeneration = this.worldObj.getWorldChunkManager().loadBlockGeneratorData(null, x.shiftLeft(4), z.shiftLeft(4), 16, 16); + replaceBlocksForBiome(x, y, z, biomesForGeneration, blockStorage, upperStorage); + } + + public void replaceBlocksForBiome(BigInteger chunkX, int chunkY, BigInteger chunkZ, BiomeGenBase[] par4ArrayOfBiomeGenBase, ExtendedBlockStorage storage, ExtendedBlockStorage upperStorage) + { + double var6 = 0.03125D; + // X, Y, 0 -> X. 0, Y + this.stoneNoise = this.noiseGen4.generateNoiseOctaves(this.stoneNoise, chunkX.shiftLeft(4), BigInteger.ZERO, chunkZ.shiftLeft(4), 16, 1, 16, var6 * 2.0D, var6 * 2.0D, var6 * 2.0D); + + for (int z = 0; z < 16; ++z) + { + for (int x = 0; x < 16; ++x) + { + BiomeGenBase biome = par4ArrayOfBiomeGenBase[x + z * 16]; + float temperature = biome.getFloatTemperature(); + int dirtLayerHeight = Math.min((int)(this.stoneNoise[z + x * 16] / 3.0D + 3.0D + this.rand.nextDouble() * 0.25D), 16); // clamp to 16 blocks + int currentHeight = -1; + byte topBlockId = biome.topBlock; + byte fillerBlockId = biome.fillerBlock; + + for (int y = 31; y >= 0; --y) + { + byte blockId = (byte) (y > 15 ? upperStorage : storage).getExtBlockID(x, y & 0xF, z); + + if (blockId == 0) + { + currentHeight = -1; + } + else if (blockId == Block.stone.blockID) + { + if (currentHeight == -1) + { + if (dirtLayerHeight <= 0) + { + topBlockId = 0; + fillerBlockId = (byte)Block.stone.blockID; + } + + currentHeight = dirtLayerHeight; + + if (y < 16) { + if (chunkY > 0) + { + storage.setExtBlockID(x, y, z, topBlockId); + } + else + { + storage.setExtBlockID(x, y, z, fillerBlockId); + } + } + } + else if (currentHeight > 0) + { + --currentHeight; + if (y < 16) { + storage.setExtBlockID(x, y, z, fillerBlockId); + } + + if (currentHeight == 0 && fillerBlockId == Block.sand.blockID) + { + currentHeight = this.rand.nextInt(4); + fillerBlockId = (byte)Block.sandStone.blockID; + } + } + } else { + System.out.println("WTF"); + } + } + } + } } /** diff --git a/src/minecraft/net/minecraft/src/ChunkProviderServer.java b/src/minecraft/net/minecraft/src/ChunkProviderServer.java index 39dc05d..979863b 100644 --- a/src/minecraft/net/minecraft/src/ChunkProviderServer.java +++ b/src/minecraft/net/minecraft/src/ChunkProviderServer.java @@ -337,4 +337,9 @@ public class ChunkProviderServer implements IChunkProvider public void generateExtraBlockStorage(BigInteger x, int y, BigInteger z, ExtendedBlockStorage storage) { this.currentChunkProvider.generateExtraBlockStorage(x, y, z, storage); } + + @Override + public void decorateExtraChunk(Chunk chunk, BigInteger x, int y, BigInteger z, ExtendedBlockStorage blockStorage) { + this.currentChunkProvider.decorateExtraChunk(chunk, x, y, z, blockStorage); + } } diff --git a/src/minecraft/net/minecraft/src/EntityPlayerMP.java b/src/minecraft/net/minecraft/src/EntityPlayerMP.java index 69fb34e..f23fc15 100644 --- a/src/minecraft/net/minecraft/src/EntityPlayerMP.java +++ b/src/minecraft/net/minecraft/src/EntityPlayerMP.java @@ -24,8 +24,9 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting /** The ItemInWorldManager belonging to this player */ public ItemInWorldManager theItemInWorldManager; - public BigDecimal field_71131_d = BigDecimal.ZERO; - public BigDecimal field_71132_e = BigDecimal.ZERO; + public BigDecimal lastTrackX = BigDecimal.ZERO; + public BigDecimal lastTrackZ = BigDecimal.ZERO; + public double lastTrackY = 0d; public final List chunksToLoad = new LinkedList(); /** entities added to this list will be packet29'd to the player */ @@ -198,6 +199,7 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting LinkedList linkedList = list[i]; if(linkedList == null) continue; for(ExtendedBlockStorage blockStorage : linkedList) { + if (blockStorage.isPrototype) continue; this.serverForThisPlayer.sendPacketToPlayer(new Packet57ExtraChunk(chunk.xPosition, blockStorage.yBase, chunk.zPosition, blockStorage)); } } diff --git a/src/minecraft/net/minecraft/src/ExtendedBlockStorage.java b/src/minecraft/net/minecraft/src/ExtendedBlockStorage.java index ebe3348..921c128 100644 --- a/src/minecraft/net/minecraft/src/ExtendedBlockStorage.java +++ b/src/minecraft/net/minecraft/src/ExtendedBlockStorage.java @@ -38,6 +38,8 @@ public class ExtendedBlockStorage /** The NibbleArray containing a block of Sky-light data. */ private NibbleArray skylightArray; + + boolean isPrototype; public ExtendedBlockStorage(int par1) { diff --git a/src/minecraft/net/minecraft/src/IChunkProvider.java b/src/minecraft/net/minecraft/src/IChunkProvider.java index c4fc086..291dfa4 100644 --- a/src/minecraft/net/minecraft/src/IChunkProvider.java +++ b/src/minecraft/net/minecraft/src/IChunkProvider.java @@ -61,4 +61,6 @@ public interface IChunkProvider int getLoadedChunkCount(); default void generateExtraBlockStorage(BigInteger x, int y, BigInteger z, ExtendedBlockStorage storage) {} + + default void decorateExtraChunk(Chunk chunk, BigInteger x, int y, BigInteger z, ExtendedBlockStorage blockStorage) {} } diff --git a/src/minecraft/net/minecraft/src/PlayerInstance.java b/src/minecraft/net/minecraft/src/PlayerInstance.java index b49880d..07d11db 100644 --- a/src/minecraft/net/minecraft/src/PlayerInstance.java +++ b/src/minecraft/net/minecraft/src/PlayerInstance.java @@ -138,7 +138,22 @@ class PlayerInstance BigInteger var1, var2; var1 = this.chunkLocation.chunkXPos.shiftLeft(4); var2 = this.chunkLocation.chunkZPos.shiftLeft(4); - this.sendToAllPlayersWatchingChunk(new Packet51MapChunk(PlayerManager.getWorldServer(this.myManager).getChunkFromChunkCoords(this.chunkLocation.chunkXPos, this.chunkLocation.chunkZPos), false, this.field_73260_f)); + Chunk chunk = PlayerManager.getWorldServer(this.myManager).getChunkFromChunkCoords(this.chunkLocation.chunkXPos, this.chunkLocation.chunkZPos); + this.sendToAllPlayersWatchingChunk(new Packet51MapChunk(chunk, false, this.field_73260_f)); + LinkedList[] extraStorageArray = chunk.getExtraStorageArray(); + for (int i = 0; i < extraStorageArray.length; i++) { + LinkedList linkedList = extraStorageArray[i]; + if (linkedList == null) continue; + Iterator iterator = linkedList.iterator(); + while (iterator.hasNext()) { + ExtendedBlockStorage blockStorage = iterator.next(); + if (blockStorage.isPrototype) { + PlayerManager.getWorldServer(this.myManager).doDecorateExtraChunk(chunk,this.chunkLocation.chunkXPos, blockStorage.yBase, this.chunkLocation.chunkZPos, blockStorage); + continue; + } + sendToAllPlayersWatchingChunk(new Packet57ExtraChunk(this.chunkLocation.chunkXPos, blockStorage.yBase, this.chunkLocation.chunkZPos, blockStorage)); + } + } for (int var3 = 0; var3 < 16; ++var3) { diff --git a/src/minecraft/net/minecraft/src/PlayerManager.java b/src/minecraft/net/minecraft/src/PlayerManager.java index c91574e..d8eb879 100644 --- a/src/minecraft/net/minecraft/src/PlayerManager.java +++ b/src/minecraft/net/minecraft/src/PlayerManager.java @@ -101,8 +101,8 @@ public class PlayerManager BigInteger var3 = MathHelper.toBigInteger(par1EntityPlayerMP.posZBig).shiftRight(4); // int var2 = (int)par1EntityPlayerMP.posX >> 4; // int var3 = (int)par1EntityPlayerMP.posZ >> 4; - par1EntityPlayerMP.field_71131_d = par1EntityPlayerMP.posXBig; - par1EntityPlayerMP.field_71132_e = par1EntityPlayerMP.posZBig; + par1EntityPlayerMP.lastTrackX = par1EntityPlayerMP.posXBig; + par1EntityPlayerMP.lastTrackZ = par1EntityPlayerMP.posZBig; for (int var4 = -this.playerViewDistance; var4 <= this.playerViewDistance; ++var4) { @@ -207,43 +207,42 @@ public class PlayerManager public void func_72685_d(EntityPlayerMP par1EntityPlayerMP) { // Edited - BigInteger var2 = MathHelper.toBigInteger(par1EntityPlayerMP.posXBig).shiftRight(4); - BigInteger var3 = MathHelper.toBigInteger(par1EntityPlayerMP.posZBig).shiftRight(4); + BigInteger playerX = MathHelper.toBigInteger(par1EntityPlayerMP.posXBig).shiftRight(4); + BigInteger playerZ = MathHelper.toBigInteger(par1EntityPlayerMP.posZBig).shiftRight(4); // int var2 = (int)par1EntityPlayerMP.posX >> 4; // int var3 = (int)par1EntityPlayerMP.posZ >> 4; - int y = (int)par1EntityPlayerMP.posY >> 4; - double var4 = par1EntityPlayerMP.field_71131_d.subtract(par1EntityPlayerMP.posXBig).doubleValue(); - double var6 = par1EntityPlayerMP.field_71132_e.subtract(par1EntityPlayerMP.posZBig).doubleValue(); - double var8 = var4 * var4 + var6 * var6; + int playerY = (int)par1EntityPlayerMP.posY >> 4; + double diffX = par1EntityPlayerMP.lastTrackX.subtract(par1EntityPlayerMP.posXBig).doubleValue(); + double diffZ = par1EntityPlayerMP.lastTrackZ.subtract(par1EntityPlayerMP.posZBig).doubleValue(); + double diffY = par1EntityPlayerMP.lastTrackY - par1EntityPlayerMP.posY; + double dist = diffX * diffX + diffZ * diffZ + diffY * diffY; - if (var8 >= 64.0D) + if (dist >= 64.0D) { - BigInteger var10 = MathHelper.toBigInteger(par1EntityPlayerMP.field_71131_d).shiftRight(4); - BigInteger var11 = MathHelper.toBigInteger(par1EntityPlayerMP.field_71132_e).shiftRight(4); - BigInteger var12 = BigInteger.valueOf(this.playerViewDistance); - BigInteger var13 = var2.subtract(var10); - BigInteger var14 = var3.subtract(var11); - - if (!var13.equals(BigInteger.ZERO) || !var14.equals(BigInteger.ZERO)) + BigInteger lastTrackX = MathHelper.toBigInteger(par1EntityPlayerMP.lastTrackX).shiftRight(4); + BigInteger lastTrackZ = MathHelper.toBigInteger(par1EntityPlayerMP.lastTrackZ).shiftRight(4); + BigInteger playerViewDistance = BigInteger.valueOf(this.playerViewDistance); + BigInteger dx = playerX.subtract(lastTrackX); + BigInteger dz = playerZ.subtract(lastTrackZ); + int lastTrackY = (int) par1EntityPlayerMP.lastTrackY >> 4; + int dy = playerY - lastTrackY; + + if (!dx.equals(BigInteger.ZERO) || !dz.equals(BigInteger.ZERO)) { - BigInteger targetX = var2.add(var12), - targetZ = var3.add(var12); - for (BigInteger var15 = var2.subtract(var12); var15.compareTo(targetX) <= 0; var15 = var15.add(BigInteger.ONE)) + BigInteger targetX = playerX.add(playerViewDistance), + targetZ = playerZ.add(playerViewDistance); + for (BigInteger xx = playerX.subtract(playerViewDistance); xx.compareTo(targetX) <= 0; xx = xx.add(BigInteger.ONE)) { - for (BigInteger var16 = var3.subtract(var12); var16.compareTo(targetZ) <= 0; var16 = var16.add(BigInteger.ONE)) + for (BigInteger zz = playerZ.subtract(playerViewDistance); zz.compareTo(targetZ) <= 0; zz = zz.add(BigInteger.ONE)) { - if (!this.func_72684_a(var15, var16, var10, var11, var12)) + if (!this.func_72684_a(xx, zz, lastTrackX, lastTrackZ, playerViewDistance)) { - this.getOrCreateChunkWatcher(var15, var16, true).addPlayerToChunkWatchingList(par1EntityPlayerMP); - Chunk chunk = theWorldServer.getChunkFromChunkCoords(var15, var16); - for(int var17 = y - this.playerViewDistance; var17 <= y + this.playerViewDistance; var17++) { - chunk.getBlockStorage(var17); - } + this.getOrCreateChunkWatcher(xx, zz, true).addPlayerToChunkWatchingList(par1EntityPlayerMP); } - if (!this.func_72684_a(var15.subtract(var13), var16.subtract(var14), var2, var3, var12)) + if (!this.func_72684_a(xx.subtract(dx), zz.subtract(dz), playerX, playerZ, playerViewDistance)) { - PlayerInstance var17 = this.getOrCreateChunkWatcher(var15.subtract(var13), var16.subtract(var14), false); + PlayerInstance var17 = this.getOrCreateChunkWatcher(xx.subtract(dx), zz.subtract(dz), false); if (var17 != null) { @@ -254,8 +253,24 @@ public class PlayerManager } this.func_72691_b(par1EntityPlayerMP); - par1EntityPlayerMP.field_71131_d = par1EntityPlayerMP.posXBig; - par1EntityPlayerMP.field_71132_e = par1EntityPlayerMP.posZBig; + par1EntityPlayerMP.lastTrackX = par1EntityPlayerMP.posXBig; + par1EntityPlayerMP.lastTrackZ = par1EntityPlayerMP.posZBig; + par1EntityPlayerMP.lastTrackY = par1EntityPlayerMP.posY; + } + if (dy != 0) { + BigInteger targetX = playerX.add(playerViewDistance), + targetZ = playerZ.add(playerViewDistance); + for (BigInteger xx = playerX.subtract(playerViewDistance); xx.compareTo(targetX) <= 0; xx = xx.add(BigInteger.ONE)) + { + for (BigInteger zz = playerZ.subtract(playerViewDistance); zz.compareTo(targetZ) <= 0; zz = zz.add(BigInteger.ONE)) + { + Chunk chunk = theWorldServer.getChunkFromChunkCoords(xx, zz); + for(int yy = playerY - this.playerViewDistance; yy <= playerY + this.playerViewDistance; yy++) { + chunk.getBlockStorage(yy); + } + } + } + par1EntityPlayerMP.lastTrackY = par1EntityPlayerMP.posY; } } } diff --git a/src/minecraft/net/minecraft/src/World.java b/src/minecraft/net/minecraft/src/World.java index b84e549..efb3610 100644 --- a/src/minecraft/net/minecraft/src/World.java +++ b/src/minecraft/net/minecraft/src/World.java @@ -1321,7 +1321,7 @@ public abstract class World implements IBlockAccess BigInteger var8 = MathHelper.floor_double_BigInteger(par2AxisAlignedBB.maxZ + 1.0D); // temporary fix - if(var3.subtract(var4).abs().compareTo(BigInteger.valueOf(1024)) == 1 || var7.subtract(var8).abs().compareTo(BigInteger.valueOf(1024)) == 1) return collidingBoundingBoxes; + if(var3.subtract(var4).abs().compareTo(BigInteger.valueOf(1024)) == 1 || var7.subtract(var8).abs().compareTo(BigInteger.valueOf(1024)) == 1 || Math.abs(var6 - var5) > 1024) return collidingBoundingBoxes; for (BigInteger var9 = var3; var9.compareTo(var4) == -1; var9 = var9.add(BigInteger.ONE)) { @@ -3837,4 +3837,8 @@ public abstract class World implements IBlockAccess public void addExtraChunk(BigInteger x, int y, BigInteger z, ExtendedBlockStorage blockStorage) { chunkProvider.generateExtraBlockStorage(x, y, z, blockStorage); } + + public void doDecorateExtraChunk(Chunk chunk, BigInteger x, int y, BigInteger z, ExtendedBlockStorage blockStorage) { + chunkProvider.decorateExtraChunk(chunk, x, y, z, blockStorage); + } } diff --git a/src/minecraft/net/minecraft/src/WorldServer.java b/src/minecraft/net/minecraft/src/WorldServer.java index 66960d6..2247906 100644 --- a/src/minecraft/net/minecraft/src/WorldServer.java +++ b/src/minecraft/net/minecraft/src/WorldServer.java @@ -558,6 +558,15 @@ public class WorldServer extends World // long time = System.currentTimeMillis(); super.addExtraChunk(x, y, z, blockStorage); // System.out.println(System.currentTimeMillis() - time); +// if(thePlayerManager == null || blockStorage.isEmpty()) return; +// PlayerInstance instance = thePlayerManager.getOrCreateChunkWatcher(x, z, false); +// if(instance != null) { +// instance.sendToAllPlayersWatchingChunk(new Packet57ExtraChunk(x, y, z, blockStorage)); +// } + } + + public void doDecorateExtraChunk(Chunk chunk, BigInteger x, int y, BigInteger z, ExtendedBlockStorage blockStorage) { + super.doDecorateExtraChunk(chunk, x, y, z, blockStorage); if(thePlayerManager == null || blockStorage.isEmpty()) return; PlayerInstance instance = thePlayerManager.getOrCreateChunkWatcher(x, z, false); if(instance != null) {