diff --git a/nms-patches/BiomeDecorator.patch b/nms-patches/BiomeDecorator.patch new file mode 100644 index 0000000000..91b04ca2e1 --- /dev/null +++ b/nms-patches/BiomeDecorator.patch @@ -0,0 +1,139 @@ +--- ../work/decompile-8eb82bde//net/minecraft/server/BiomeDecorator.java Tue Dec 2 23:22:43 2014 ++++ src/main/java/net/minecraft/server/BiomeDecorator.java Tue Dec 2 23:22:34 2014 +@@ -132,7 +132,7 @@ + WorldGenTreeAbstract worldgentreeabstract = biomebase.a(this.b); + + worldgentreeabstract.e(); +- blockposition = this.a.getHighestBlockYAt(this.c.a(k, 0, l)); ++ blockposition = this.getHighestBlockYAt(this.c.a(k, 0, l)); // CraftBukkit - Prevent crash + if (worldgentreeabstract.generate(this.a, this.b, blockposition)) { + worldgentreeabstract.a(this.a, this.b, blockposition); + } +@@ -141,7 +141,7 @@ + for (j = 0; j < this.K; ++j) { + k = this.b.nextInt(16) + 8; + l = this.b.nextInt(16) + 8; +- this.v.generate(this.a, this.b, this.a.getHighestBlockYAt(this.c.a(k, 0, l))); ++ this.v.generate(this.a, this.b, this.getHighestBlockYAt(this.c.a(k, 0, l ))); // CraftBukkit - Prevent crash + } + + int i1; +@@ -149,7 +149,7 @@ + for (j = 0; j < this.B; ++j) { + k = this.b.nextInt(16) + 8; + l = this.b.nextInt(16) + 8; +- i1 = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(k, 0, l)).getY() + 32); ++ i1 = this.b.nextInt(this.getHighestBlockYAt(this.c.a(k, 0, l)).getY() + 32); // CraftBukkit - Prevent crash + blockposition = this.c.a(k, i1, l); + EnumFlowerVarient enumflowervarient = biomebase.a(this.b, blockposition); + BlockFlowers blockflowers = enumflowervarient.a().a(); +@@ -163,14 +163,14 @@ + for (j = 0; j < this.C; ++j) { + k = this.b.nextInt(16) + 8; + l = this.b.nextInt(16) + 8; +- i1 = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); ++ i1 = this.b.nextInt(this.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); // CraftBukkit - Prevent crash + biomebase.b(this.b).generate(this.a, this.b, this.c.a(k, i1, l)); + } + + for (j = 0; j < this.D; ++j) { + k = this.b.nextInt(16) + 8; + l = this.b.nextInt(16) + 8; +- i1 = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); ++ i1 = this.b.nextInt(this.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); // CraftBukkit - Prevent crash + (new WorldGenDeadBush()).generate(this.a, this.b, this.c.a(k, i1, l)); + } + +@@ -179,7 +179,7 @@ + while (j < this.z) { + k = this.b.nextInt(16) + 8; + l = this.b.nextInt(16) + 8; +- i1 = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); ++ i1 = this.b.nextInt(this.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); // CraftBukkit - Prevent crash + blockposition = this.c.a(k, i1, l); + + while (true) { +@@ -202,7 +202,7 @@ + if (this.b.nextInt(4) == 0) { + k = this.b.nextInt(16) + 8; + l = this.b.nextInt(16) + 8; +- BlockPosition blockposition2 = this.a.getHighestBlockYAt(this.c.a(k, 0, l)); ++ BlockPosition blockposition2 = this.getHighestBlockYAt(this.c.a(k, 0, l)); // CraftBukkit - Prevent crash + + this.t.generate(this.a, this.b, blockposition2); + } +@@ -210,7 +210,7 @@ + if (this.b.nextInt(8) == 0) { + k = this.b.nextInt(16) + 8; + l = this.b.nextInt(16) + 8; +- i1 = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); ++ i1 = this.b.nextInt(this.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); // CraftBukkit - Prevent crash + blockposition = this.c.a(k, i1, l); + this.u.generate(this.a, this.b, blockposition); + } +@@ -219,42 +219,42 @@ + if (this.b.nextInt(4) == 0) { + j = this.b.nextInt(16) + 8; + k = this.b.nextInt(16) + 8; +- l = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(j, 0, k)).getY() * 2); ++ l = this.b.nextInt(this.getHighestBlockYAt(this.c.a(j, 0, k)).getY() * 2); // CraftBukkit - Prevent crash + this.t.generate(this.a, this.b, this.c.a(j, l, k)); + } + + if (this.b.nextInt(8) == 0) { + j = this.b.nextInt(16) + 8; + k = this.b.nextInt(16) + 8; +- l = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(j, 0, k)).getY() * 2); ++ l = this.b.nextInt(this.getHighestBlockYAt(this.c.a(j, 0, k)).getY() * 2); // CraftBukkit - Prevent crash + this.u.generate(this.a, this.b, this.c.a(j, l, k)); + } + + for (j = 0; j < this.F; ++j) { + k = this.b.nextInt(16) + 8; + l = this.b.nextInt(16) + 8; +- i1 = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); ++ i1 = this.b.nextInt(this.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); // CraftBukkit - Prevent crash + this.w.generate(this.a, this.b, this.c.a(k, i1, l)); + } + + for (j = 0; j < 10; ++j) { + k = this.b.nextInt(16) + 8; + l = this.b.nextInt(16) + 8; +- i1 = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); ++ i1 = this.b.nextInt(this.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); // CraftBukkit - Prevent crash + this.w.generate(this.a, this.b, this.c.a(k, i1, l)); + } + + if (this.b.nextInt(32) == 0) { + j = this.b.nextInt(16) + 8; + k = this.b.nextInt(16) + 8; +- l = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(j, 0, k)).getY() * 2); ++ l = this.b.nextInt(this.getHighestBlockYAt(this.c.a(j, 0, k)).getY() * 2); // CraftBukkit - Prevent crash + (new WorldGenPumpkin()).generate(this.a, this.b, this.c.a(j, l, k)); + } + + for (j = 0; j < this.G; ++j) { + k = this.b.nextInt(16) + 8; + l = this.b.nextInt(16) + 8; +- i1 = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); ++ i1 = this.b.nextInt(this.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); // CraftBukkit - Prevent crash + this.x.generate(this.a, this.b, this.c.a(k, i1, l)); + } + +@@ -273,6 +273,16 @@ + } + + } ++ ++ // CraftBukkit start - The heightMap can be wrong calculated and return Y = 0 which will crash the Server ++ private BlockPosition getHighestBlockYAt( BlockPosition blockPosition ) { ++ BlockPosition returnBlockPosition = this.a.getHighestBlockYAt( blockPosition ); ++ if ( returnBlockPosition.getY() == 0 ) { ++ returnBlockPosition = returnBlockPosition.up( 1 ); ++ } ++ return returnBlockPosition; ++ } ++ // CraftBukkit end + + protected void a(int i, WorldGenerator worldgenerator, int j, int k) { + int l;