geforkt von Mirrors/Paper
[Bleeding] Prevent update inconsistencies on generation/decoration that span chunks. Fixes BUKKIT-871
Dieser Commit ist enthalten in:
Ursprung
09a73d352c
Commit
f188afe794
@ -30,6 +30,7 @@ public class Chunk {
|
|||||||
public long n;
|
public long n;
|
||||||
private int s;
|
private int s;
|
||||||
boolean o;
|
boolean o;
|
||||||
|
public boolean sentToClient; // CraftBukkit - flag if chunk has been seen
|
||||||
|
|
||||||
public Chunk(World world, int i, int j) {
|
public Chunk(World world, int i, int j) {
|
||||||
this.sections = new ChunkSection[16];
|
this.sections = new ChunkSection[16];
|
||||||
|
@ -51,6 +51,13 @@ public class ChunkProviderFlat implements IChunkProvider {
|
|||||||
if (this.c) {
|
if (this.c) {
|
||||||
this.d.a(this, this.a, i, j, abyte);
|
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();
|
chunk.initLighting();
|
||||||
return chunk;
|
return chunk;
|
||||||
|
@ -192,6 +192,13 @@ public class ChunkProviderHell implements IChunkProvider {
|
|||||||
this.t.a(this, this.o, i, j, abyte);
|
this.t.a(this, this.o, i, j, abyte);
|
||||||
this.c.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);
|
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();
|
chunk.m();
|
||||||
return chunk;
|
return chunk;
|
||||||
|
@ -142,6 +142,13 @@ public class ChunkProviderTheEnd implements IChunkProvider {
|
|||||||
this.b(i, j, abyte, this.o);
|
this.b(i, j, abyte, this.o);
|
||||||
Chunk chunk = new Chunk(this.m, abyte, i, j);
|
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();
|
chunk.initLighting();
|
||||||
return chunk;
|
return chunk;
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,7 @@ public class Packet51MapChunk extends Packet {
|
|||||||
this.f = flag;
|
this.f = flag;
|
||||||
if (flag) {
|
if (flag) {
|
||||||
i = '\uffff';
|
i = '\uffff';
|
||||||
|
chunk.sentToClient = true; // CraftBukkit - flag as seen
|
||||||
}
|
}
|
||||||
|
|
||||||
ChunkSection[] achunksection = chunk.h();
|
ChunkSection[] achunksection = chunk.h();
|
||||||
|
@ -60,7 +60,7 @@ public class WorldGenForest extends WorldGenerator implements BlockSapling.TreeG
|
|||||||
} else {
|
} else {
|
||||||
i1 = world.getTypeId(i, j - 1, k);
|
i1 = world.getTypeId(i, j - 1, k);
|
||||||
if ((i1 == Block.GRASS.id || i1 == Block.DIRT.id) && j < 256 - l - 1) {
|
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;
|
int i2;
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ public class WorldGenGroundBush extends WorldGenerator implements BlockSapling.T
|
|||||||
|
|
||||||
if (i1 == Block.DIRT.id || i1 == Block.GRASS.id) {
|
if (i1 == Block.DIRT.id || i1 == Block.GRASS.id) {
|
||||||
++j;
|
++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) {
|
for (int j1 = j; j1 <= j + 2; ++j1) {
|
||||||
int k1 = j1 - j;
|
int k1 = j1 - j;
|
||||||
|
@ -59,7 +59,7 @@ public class WorldGenSwampTree extends WorldGenerator implements BlockSapling.T
|
|||||||
} else {
|
} else {
|
||||||
i1 = world.getTypeId(i, j - 1, k);
|
i1 = world.getTypeId(i, j - 1, k);
|
||||||
if ((i1 == Block.GRASS.id || i1 == Block.DIRT.id) && j < 128 - l - 1) {
|
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 i2;
|
||||||
int j2;
|
int j2;
|
||||||
@ -75,7 +75,7 @@ public class WorldGenSwampTree extends WorldGenerator implements BlockSapling.T
|
|||||||
int l2 = k2 - k;
|
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)]) {
|
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) {
|
for (j2 = 0; j2 < l; ++j2) {
|
||||||
j1 = world.getTypeId(i, j + j2, k);
|
j1 = world.getTypeId(i, j + j2, k);
|
||||||
if (j1 == 0 || j1 == Block.LEAVES.id || j1 == Block.WATER.id || j1 == Block.STATIONARY_WATER.id) {
|
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
|
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;
|
int i1 = 4;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
@ -135,7 +135,7 @@ public class WorldGenSwampTree extends WorldGenerator implements BlockSapling.T
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
world.setTypeIdAndData(i, j, k, Block.VINE.id, l);
|
this.setTypeAndData(world, i, j, k, Block.VINE.id, l); // CraftBukkit
|
||||||
--i1;
|
--i1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ public class WorldGenTaiga1 extends WorldGenerator implements BlockSapling.TreeG
|
|||||||
} else {
|
} else {
|
||||||
l1 = world.getTypeId(i, j - 1, k);
|
l1 = world.getTypeId(i, j - 1, k);
|
||||||
if ((l1 == Block.GRASS.id || l1 == Block.DIRT.id) && j < 128 - l - 1) {
|
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;
|
l2 = 0;
|
||||||
|
|
||||||
for (i2 = j + l; i2 >= j + i1; --i2) {
|
for (i2 = j + l; i2 >= j + i1; --i2) {
|
||||||
@ -71,7 +71,7 @@ public class WorldGenTaiga1 extends WorldGenerator implements BlockSapling.TreeG
|
|||||||
int j3 = i3 - k;
|
int j3 = i3 - k;
|
||||||
|
|
||||||
if ((Math.abs(k2) != l2 || Math.abs(j3) != l2 || l2 <= 0) && !Block.n[world.getTypeId(j2, i2, i3)]) {
|
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) {
|
for (i2 = 0; i2 < l - 1; ++i2) {
|
||||||
j2 = world.getTypeId(i, j + i2, k);
|
j2 = world.getTypeId(i, j + i2, k);
|
||||||
if (j2 == 0 || j2 == Block.LEAVES.id) {
|
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ public class WorldGenTaiga2 extends WorldGenerator implements BlockSapling.TreeG
|
|||||||
} else {
|
} else {
|
||||||
l1 = world.getTypeId(i, j - 1, k);
|
l1 = world.getTypeId(i, j - 1, k);
|
||||||
if ((l1 == Block.GRASS.id || l1 == Block.DIRT.id) && j < 256 - l - 1) {
|
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);
|
k2 = random.nextInt(2);
|
||||||
i2 = 1;
|
i2 = 1;
|
||||||
byte b0 = 0;
|
byte b0 = 0;
|
||||||
|
@ -72,7 +72,7 @@ public class WorldGenTrees extends WorldGenerator implements BlockSapling.TreeGe
|
|||||||
} else {
|
} else {
|
||||||
i1 = world.getTypeId(i, j - 1, k);
|
i1 = world.getTypeId(i, j - 1, k);
|
||||||
if ((i1 == Block.GRASS.id || i1 == Block.DIRT.id) && j < 256 - l - 1) {
|
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;
|
b0 = 3;
|
||||||
byte b1 = 0;
|
byte b1 = 0;
|
||||||
|
|
||||||
@ -162,7 +162,7 @@ public class WorldGenTrees extends WorldGenerator implements BlockSapling.TreeGe
|
|||||||
|
|
||||||
// CraftBukkit - Changed world to BlockChangeDelegate
|
// CraftBukkit - Changed world to BlockChangeDelegate
|
||||||
private void a(BlockChangeDelegate world, int i, int j, int k, int l) {
|
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;
|
int i1 = 4;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
@ -171,7 +171,7 @@ public class WorldGenTrees extends WorldGenerator implements BlockSapling.TreeGe
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
world.setTypeIdAndData(i, j, k, Block.VINE.id, l);
|
this.setTypeAndData(world, i, j, k, Block.VINE.id, l); // CraftBukkit
|
||||||
--i1;
|
--i1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,13 @@ public abstract class WorldGenerator {
|
|||||||
protected void setTypeAndData(BlockChangeDelegate world, int i, int j, int k, int l, int i1) {
|
protected void setTypeAndData(BlockChangeDelegate world, int i, int j, int k, int l, int i1) {
|
||||||
if (this.a) {
|
if (this.a) {
|
||||||
world.setTypeIdAndData(i, j, k, l, i1);
|
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 {
|
} else {
|
||||||
world.setRawTypeIdAndData(i, j, k, l, i1);
|
world.setRawTypeIdAndData(i, j, k, l, i1);
|
||||||
}
|
}
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren