From f188afe794d49b8133b498f1a96732152a50b3da Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Wed, 21 Mar 2012 16:01:11 -0500 Subject: [Bleeding] Prevent update inconsistencies on generation/decoration that span chunks. Fixes BUKKIT-871 --- src/main/java/net/minecraft/server/Chunk.java | 1 + src/main/java/net/minecraft/server/ChunkProviderFlat.java | 7 +++++++ src/main/java/net/minecraft/server/ChunkProviderHell.java | 7 +++++++ src/main/java/net/minecraft/server/ChunkProviderTheEnd.java | 7 +++++++ src/main/java/net/minecraft/server/Packet51MapChunk.java | 1 + src/main/java/net/minecraft/server/WorldGenForest.java | 2 +- src/main/java/net/minecraft/server/WorldGenGroundBush.java | 2 +- src/main/java/net/minecraft/server/WorldGenSwampTree.java | 10 +++++----- src/main/java/net/minecraft/server/WorldGenTaiga1.java | 6 +++--- src/main/java/net/minecraft/server/WorldGenTaiga2.java | 2 +- src/main/java/net/minecraft/server/WorldGenTrees.java | 6 +++--- src/main/java/net/minecraft/server/WorldGenerator.java | 7 +++++++ 12 files changed, 44 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java index 3030f765..444d1f0f 100644 --- a/src/main/java/net/minecraft/server/Chunk.java +++ b/src/main/java/net/minecraft/server/Chunk.java @@ -30,6 +30,7 @@ public class Chunk { public long n; private int s; boolean o; + public boolean sentToClient; // CraftBukkit - flag if chunk has been seen public Chunk(World world, int i, int j) { this.sections = new ChunkSection[16]; diff --git a/src/main/java/net/minecraft/server/ChunkProviderFlat.java b/src/main/java/net/minecraft/server/ChunkProviderFlat.java index 7b51bf03..c2ab482f 100644 --- a/src/main/java/net/minecraft/server/ChunkProviderFlat.java +++ b/src/main/java/net/minecraft/server/ChunkProviderFlat.java @@ -51,6 +51,13 @@ public class ChunkProviderFlat implements IChunkProvider { if (this.c) { this.d.a(this, this.a, i, j, abyte); } + // CraftBukkit start - prime biome data to prevent uninitialized values racing to client + BiomeBase[] bb = this.a.getWorldChunkManager().getBiomeBlock(null, i * 16, j * 16, 16, 16); + byte[] biomes = chunk.l(); + for(int idx = 0; idx < biomes.length; idx++) { + biomes[idx] = (byte) bb[idx].id; + } + // CraftBukkit end chunk.initLighting(); return chunk; diff --git a/src/main/java/net/minecraft/server/ChunkProviderHell.java b/src/main/java/net/minecraft/server/ChunkProviderHell.java index a474f227..a773afd5 100644 --- a/src/main/java/net/minecraft/server/ChunkProviderHell.java +++ b/src/main/java/net/minecraft/server/ChunkProviderHell.java @@ -192,6 +192,13 @@ public class ChunkProviderHell implements IChunkProvider { this.t.a(this, this.o, i, j, abyte); this.c.a(this, this.o, i, j, abyte); Chunk chunk = new Chunk(this.o, abyte, i, j); + // CraftBukkit start - prime biome data to prevent uninitialized values racing to client + BiomeBase[] bb = this.o.getWorldChunkManager().getBiomeBlock(null, i * 16, j * 16, 16, 16); + byte[] biomes = chunk.l(); + for(int idx = 0; idx < biomes.length; idx++) { + biomes[idx] = (byte) bb[idx].id; + } + // CraftBukkit end chunk.m(); return chunk; diff --git a/src/main/java/net/minecraft/server/ChunkProviderTheEnd.java b/src/main/java/net/minecraft/server/ChunkProviderTheEnd.java index f2349c32..74ec946e 100644 --- a/src/main/java/net/minecraft/server/ChunkProviderTheEnd.java +++ b/src/main/java/net/minecraft/server/ChunkProviderTheEnd.java @@ -142,6 +142,13 @@ public class ChunkProviderTheEnd implements IChunkProvider { this.b(i, j, abyte, this.o); Chunk chunk = new Chunk(this.m, abyte, i, j); + // CraftBukkit start - prime biome data to prevent uninitialized values racing to client + byte[] biomes = chunk.l(); + for(int idx = 0; idx < biomes.length; idx++) { + biomes[idx] = (byte) this.o[idx].id; + } + // CraftBukkit end + chunk.initLighting(); return chunk; } diff --git a/src/main/java/net/minecraft/server/Packet51MapChunk.java b/src/main/java/net/minecraft/server/Packet51MapChunk.java index 08c1df81..78782d69 100644 --- a/src/main/java/net/minecraft/server/Packet51MapChunk.java +++ b/src/main/java/net/minecraft/server/Packet51MapChunk.java @@ -31,6 +31,7 @@ public class Packet51MapChunk extends Packet { this.f = flag; if (flag) { i = '\uffff'; + chunk.sentToClient = true; // CraftBukkit - flag as seen } ChunkSection[] achunksection = chunk.h(); diff --git a/src/main/java/net/minecraft/server/WorldGenForest.java b/src/main/java/net/minecraft/server/WorldGenForest.java index a792b1ed..6206daa1 100644 --- a/src/main/java/net/minecraft/server/WorldGenForest.java +++ b/src/main/java/net/minecraft/server/WorldGenForest.java @@ -60,7 +60,7 @@ public class WorldGenForest extends WorldGenerator implements BlockSapling.TreeG } else { i1 = world.getTypeId(i, j - 1, k); if ((i1 == Block.GRASS.id || i1 == Block.DIRT.id) && j < 256 - l - 1) { - world.setRawTypeId(i, j - 1, k, Block.DIRT.id); + this.setTypeAndData(world, i, j - 1, k, Block.DIRT.id, 0); // CraftBukkit int i2; diff --git a/src/main/java/net/minecraft/server/WorldGenGroundBush.java b/src/main/java/net/minecraft/server/WorldGenGroundBush.java index 63226648..24a21cd9 100644 --- a/src/main/java/net/minecraft/server/WorldGenGroundBush.java +++ b/src/main/java/net/minecraft/server/WorldGenGroundBush.java @@ -31,7 +31,7 @@ public class WorldGenGroundBush extends WorldGenerator implements BlockSapling.T if (i1 == Block.DIRT.id || i1 == Block.GRASS.id) { ++j; - world.setRawTypeIdAndData(i, j, k, Block.LOG.id, this.b); + this.setTypeAndData(world, i, j, k, Block.LOG.id, this.b); // CraftBukkit for (int j1 = j; j1 <= j + 2; ++j1) { int k1 = j1 - j; diff --git a/src/main/java/net/minecraft/server/WorldGenSwampTree.java b/src/main/java/net/minecraft/server/WorldGenSwampTree.java index aac4c035..0e2358db 100644 --- a/src/main/java/net/minecraft/server/WorldGenSwampTree.java +++ b/src/main/java/net/minecraft/server/WorldGenSwampTree.java @@ -59,7 +59,7 @@ public class WorldGenSwampTree extends WorldGenerator implements BlockSapling.T } else { i1 = world.getTypeId(i, j - 1, k); if ((i1 == Block.GRASS.id || i1 == Block.DIRT.id) && j < 128 - l - 1) { - world.setRawTypeId(i, j - 1, k, Block.DIRT.id); + this.setTypeAndData(world, i, j - 1, k, Block.DIRT.id, 0); // CraftBukkit int i2; int j2; @@ -75,7 +75,7 @@ public class WorldGenSwampTree extends WorldGenerator implements BlockSapling.T int l2 = k2 - k; if ((Math.abs(i2) != k1 || Math.abs(l2) != k1 || random.nextInt(2) != 0 && j1 != 0) && !Block.n[world.getTypeId(l1, j2, k2)]) { - world.setRawTypeId(l1, j2, k2, Block.LEAVES.id); + this.setTypeAndData(world, l1, j2, k2, Block.LEAVES.id, 0); // CraftBukkit } } } @@ -84,7 +84,7 @@ public class WorldGenSwampTree extends WorldGenerator implements BlockSapling.T for (j2 = 0; j2 < l; ++j2) { j1 = world.getTypeId(i, j + j2, k); if (j1 == 0 || j1 == Block.LEAVES.id || j1 == Block.WATER.id || j1 == Block.STATIONARY_WATER.id) { - world.setRawTypeId(i, j + j2, k, Block.LOG.id); + this.setTypeAndData(world, i, j + j2, k, Block.LOG.id, 0); // CraftBukkit } } @@ -126,7 +126,7 @@ public class WorldGenSwampTree extends WorldGenerator implements BlockSapling.T } private void a(org.bukkit.BlockChangeDelegate world, int i, int j, int k, int l) { // CraftBukkit - change signature - world.setTypeIdAndData(i, j, k, Block.VINE.id, l); + this.setTypeAndData(world, i, j, k, Block.VINE.id, l); // CraftBukkit int i1 = 4; while (true) { @@ -135,7 +135,7 @@ public class WorldGenSwampTree extends WorldGenerator implements BlockSapling.T return; } - world.setTypeIdAndData(i, j, k, Block.VINE.id, l); + this.setTypeAndData(world, i, j, k, Block.VINE.id, l); // CraftBukkit --i1; } } diff --git a/src/main/java/net/minecraft/server/WorldGenTaiga1.java b/src/main/java/net/minecraft/server/WorldGenTaiga1.java index edd3056c..ec16d813 100644 --- a/src/main/java/net/minecraft/server/WorldGenTaiga1.java +++ b/src/main/java/net/minecraft/server/WorldGenTaiga1.java @@ -60,7 +60,7 @@ public class WorldGenTaiga1 extends WorldGenerator implements BlockSapling.TreeG } else { l1 = world.getTypeId(i, j - 1, k); if ((l1 == Block.GRASS.id || l1 == Block.DIRT.id) && j < 128 - l - 1) { - world.setRawTypeId(i, j - 1, k, Block.DIRT.id); + this.setTypeAndData(world, i, j - 1, k, Block.DIRT.id, 0); // CraftBukkit l2 = 0; for (i2 = j + l; i2 >= j + i1; --i2) { @@ -71,7 +71,7 @@ public class WorldGenTaiga1 extends WorldGenerator implements BlockSapling.TreeG int j3 = i3 - k; if ((Math.abs(k2) != l2 || Math.abs(j3) != l2 || l2 <= 0) && !Block.n[world.getTypeId(j2, i2, i3)]) { - world.setRawTypeIdAndData(j2, i2, i3, Block.LEAVES.id, 1); + this.setTypeAndData(world, j2, i2, i3, Block.LEAVES.id, 1); // CraftBukkit } } } @@ -86,7 +86,7 @@ public class WorldGenTaiga1 extends WorldGenerator implements BlockSapling.TreeG for (i2 = 0; i2 < l - 1; ++i2) { j2 = world.getTypeId(i, j + i2, k); if (j2 == 0 || j2 == Block.LEAVES.id) { - world.setRawTypeIdAndData(i, j + i2, k, Block.LOG.id, 1); + this.setTypeAndData(world, i, j + i2, k, Block.LOG.id, 1); // CraftBukkit } } diff --git a/src/main/java/net/minecraft/server/WorldGenTaiga2.java b/src/main/java/net/minecraft/server/WorldGenTaiga2.java index 0f3a6d6f..91373035 100644 --- a/src/main/java/net/minecraft/server/WorldGenTaiga2.java +++ b/src/main/java/net/minecraft/server/WorldGenTaiga2.java @@ -61,7 +61,7 @@ public class WorldGenTaiga2 extends WorldGenerator implements BlockSapling.TreeG } else { l1 = world.getTypeId(i, j - 1, k); if ((l1 == Block.GRASS.id || l1 == Block.DIRT.id) && j < 256 - l - 1) { - world.setRawTypeId(i, j - 1, k, Block.DIRT.id); + this.setTypeAndData(world, i, j - 1, k, Block.DIRT.id, 0); // CraftBukkit k2 = random.nextInt(2); i2 = 1; byte b0 = 0; diff --git a/src/main/java/net/minecraft/server/WorldGenTrees.java b/src/main/java/net/minecraft/server/WorldGenTrees.java index f62ab02c..9d59a426 100644 --- a/src/main/java/net/minecraft/server/WorldGenTrees.java +++ b/src/main/java/net/minecraft/server/WorldGenTrees.java @@ -72,7 +72,7 @@ public class WorldGenTrees extends WorldGenerator implements BlockSapling.TreeGe } else { i1 = world.getTypeId(i, j - 1, k); if ((i1 == Block.GRASS.id || i1 == Block.DIRT.id) && j < 256 - l - 1) { - world.setRawTypeId(i, j - 1, k, Block.DIRT.id); + this.setTypeAndData(world, i, j - 1, k, Block.DIRT.id, 0); // CraftBukkit b0 = 3; byte b1 = 0; @@ -162,7 +162,7 @@ public class WorldGenTrees extends WorldGenerator implements BlockSapling.TreeGe // CraftBukkit - Changed world to BlockChangeDelegate private void a(BlockChangeDelegate world, int i, int j, int k, int l) { - world.setTypeIdAndData(i, j, k, Block.VINE.id, l); + this.setTypeAndData(world, i, j, k, Block.VINE.id, l); // CraftBukkit int i1 = 4; while (true) { @@ -171,7 +171,7 @@ public class WorldGenTrees extends WorldGenerator implements BlockSapling.TreeGe return; } - world.setTypeIdAndData(i, j, k, Block.VINE.id, l); + this.setTypeAndData(world, i, j, k, Block.VINE.id, l); // CraftBukkit --i1; } } diff --git a/src/main/java/net/minecraft/server/WorldGenerator.java b/src/main/java/net/minecraft/server/WorldGenerator.java index ae9b7ca6..d0a3f1b4 100644 --- a/src/main/java/net/minecraft/server/WorldGenerator.java +++ b/src/main/java/net/minecraft/server/WorldGenerator.java @@ -24,6 +24,13 @@ public abstract class WorldGenerator { protected void setTypeAndData(BlockChangeDelegate world, int i, int j, int k, int l, int i1) { if (this.a) { world.setTypeIdAndData(i, j, k, l, i1); + // CraftBukkit start - do equiv of setTypeIdAndData, but skip doing physics to prevent fades + } + else if ((world instanceof World) && ((World) world).getChunkAt(i >> 4, k >> 4).sentToClient) { + if (world.setRawTypeIdAndData(i, j, k, l, i1)) { + ((World) world).notify(i, j, k); + } + // CraftBukkt end } else { world.setRawTypeIdAndData(i, j, k, l, i1); } -- cgit v1.2.3