summaryrefslogtreecommitdiffstats
path: root/nms-patches
diff options
context:
space:
mode:
authorFabian Faßbender <fabian.fassbender42@googlemail.com>2014-12-03 00:24:19 +0100
committermd_5 <git@md-5.net>2014-12-12 13:14:35 +1100
commit9d43c91cebc1b749d637a6489000c01bca043365 (patch)
tree6874f7ed4c1f4810859becb6c8fdd3ba6eff480b /nms-patches
parent45be36a7b85249a50872e8db1d44a14ebd1724b6 (diff)
downloadcraftbukkit-9d43c91cebc1b749d637a6489000c01bca043365.tar
craftbukkit-9d43c91cebc1b749d637a6489000c01bca043365.tar.gz
craftbukkit-9d43c91cebc1b749d637a6489000c01bca043365.tar.lz
craftbukkit-9d43c91cebc1b749d637a6489000c01bca043365.tar.xz
craftbukkit-9d43c91cebc1b749d637a6489000c01bca043365.zip
Default to Y=1 when a Y=0 BlockPosition is found to be used in the BiomeDecorator. This prevents the "n must be positive" Crash due to the fact that sometimes the heightMap can be wrong calculated. Fixes SPIGOT-91
Diffstat (limited to 'nms-patches')
-rw-r--r--nms-patches/BiomeDecorator.patch139
1 files changed, 139 insertions, 0 deletions
diff --git a/nms-patches/BiomeDecorator.patch b/nms-patches/BiomeDecorator.patch
new file mode 100644
index 00000000..91b04ca2
--- /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;