Fix Biome Decoration Crashes

We don't really know what affect this will have on the terrain generation, but its better than crashing and not having terrain generate at all!
This commit is contained in:
md_5 2014-01-05 09:35:15 +11:00
parent 885ae9871e
commit cd0c975a6d

View File

@ -1,33 +1,15 @@
From 60f931b9efb9140650ffb140af1dee18f557f8fe Mon Sep 17 00:00:00 2001 From eed402ce73fec9890879e3ed03ec3ba4e4a2c9e6 Mon Sep 17 00:00:00 2001
From: Dan Mulloy <dmulloy2@live.com> From: md_5 <git@md-5.net>
Date: Sun, 22 Dec 2013 18:40:53 -0500 Date: Sun, 5 Jan 2014 09:35:01 +1100
Subject: [PATCH] Fix Biome Decoration Crashes Subject: [PATCH] Fix Biome Decoration Crashes
We don't really know what affect this will have on the terrain generation, but its better than crashing and not having terrain generate at all!
diff --git a/src/main/java/net/minecraft/server/BiomeDecorator.java b/src/main/java/net/minecraft/server/BiomeDecorator.java diff --git a/src/main/java/net/minecraft/server/BiomeDecorator.java b/src/main/java/net/minecraft/server/BiomeDecorator.java
index b048d6c..2a5333a 100644 index b048d6c..962d719 100644
--- a/src/main/java/net/minecraft/server/BiomeDecorator.java --- a/src/main/java/net/minecraft/server/BiomeDecorator.java
+++ b/src/main/java/net/minecraft/server/BiomeDecorator.java +++ b/src/main/java/net/minecraft/server/BiomeDecorator.java
@@ -1,5 +1,10 @@ @@ -147,7 +147,7 @@ public class BiomeDecorator {
package net.minecraft.server;
+// Spigot Start
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+// Spigot End
import java.util.Random;
public class BiomeDecorator {
@@ -39,6 +44,7 @@ public class BiomeDecorator {
protected int G;
protected int H;
public boolean I;
+ private final List<Chunk> chunksToUnload = new ArrayList<Chunk>(); // Spigot
public BiomeDecorator() {
this.f = new WorldGenSand(Blocks.SAND, 7);
@@ -147,7 +153,7 @@ public class BiomeDecorator {
for (j = 0; j < this.z; ++j) { for (j = 0; j < this.z; ++j) {
k = this.c + this.b.nextInt(16) + 8; k = this.c + this.b.nextInt(16) + 8;
l = this.d + this.b.nextInt(16) + 8; l = this.d + this.b.nextInt(16) + 8;
@ -36,34 +18,25 @@ index b048d6c..2a5333a 100644
WorldGenerator worldgenerator = biomebase.b(this.b); WorldGenerator worldgenerator = biomebase.b(this.b);
worldgenerator.a(this.a, this.b, k, i1, l); worldgenerator.a(this.a, this.b, k, i1, l);
@@ -156,15 +162,15 @@ public class BiomeDecorator { @@ -156,7 +156,7 @@ public class BiomeDecorator {
for (j = 0; j < this.A; ++j) { for (j = 0; j < this.A; ++j) {
k = this.c + this.b.nextInt(16) + 8; k = this.c + this.b.nextInt(16) + 8;
l = this.d + this.b.nextInt(16) + 8; l = this.d + this.b.nextInt(16) + 8;
- i1 = this.b.nextInt(this.a.getHighestBlockYAt(k, l) * 2); - i1 = this.b.nextInt(this.a.getHighestBlockYAt(k, l) * 2);
- (new WorldGenDeadBush(Blocks.DEAD_BUSH)).a(this.a, this.b, k, i1, l); + i1 = this.b.nextInt(this.getHighestBlockYAt(k, l) * 2); // Spigot
+ i1 = this.b.nextInt(this.getHighestBlockYAt(k, l) * 2); (new WorldGenDeadBush(Blocks.DEAD_BUSH)).a(this.a, this.b, k, i1, l);
+ (new WorldGenDeadBush(Blocks.DEAD_BUSH)).a(this.a, this.b, k, i1, l); // Spigot
} }
for (j = 0; j < this.w; ++j) { @@ -164,7 +164,7 @@ public class BiomeDecorator {
k = this.c + this.b.nextInt(16) + 8; k = this.c + this.b.nextInt(16) + 8;
l = this.d + this.b.nextInt(16) + 8; l = this.d + this.b.nextInt(16) + 8;
- for (i1 = this.b.nextInt(this.a.getHighestBlockYAt(k, l) * 2); i1 > 0 && this.a.isEmpty(k, i1 - 1, l); --i1) { - for (i1 = this.b.nextInt(this.a.getHighestBlockYAt(k, l) * 2); i1 > 0 && this.a.isEmpty(k, i1 - 1, l); --i1) {
+ for (i1 = this.b.nextInt(this.getHighestBlockYAt(k, l) * 2); i1 > 0 && this.a.isEmpty(k, i1 - 1, l); --i1) { // Spigot + for (i1 = this.b.nextInt(this.getHighestBlockYAt(k, l) * 2); i1 > 0 && this.a.isEmpty(k, i1 - 1, l); --i1) { // Spigot
; ;
} }
@@ -175,14 +181,14 @@ public class BiomeDecorator { @@ -182,7 +182,7 @@ public class BiomeDecorator {
if (this.b.nextInt(4) == 0) {
k = this.c + this.b.nextInt(16) + 8;
l = this.d + this.b.nextInt(16) + 8;
- i1 = this.a.getHighestBlockYAt(k, l);
+ i1 = this.getHighestBlockYAt(k, l); // Spigot
this.q.a(this.a, this.b, k, i1, l);
}
if (this.b.nextInt(8) == 0) { if (this.b.nextInt(8) == 0) {
k = this.c + this.b.nextInt(16) + 8; k = this.c + this.b.nextInt(16) + 8;
l = this.d + this.b.nextInt(16) + 8; l = this.d + this.b.nextInt(16) + 8;
@ -72,7 +45,7 @@ index b048d6c..2a5333a 100644
this.r.a(this.a, this.b, k, i1, l); this.r.a(this.a, this.b, k, i1, l);
} }
} }
@@ -190,42 +196,42 @@ public class BiomeDecorator { @@ -190,42 +190,42 @@ public class BiomeDecorator {
if (this.b.nextInt(4) == 0) { if (this.b.nextInt(4) == 0) {
j = this.c + this.b.nextInt(16) + 8; j = this.c + this.b.nextInt(16) + 8;
k = this.d + this.b.nextInt(16) + 8; k = this.d + this.b.nextInt(16) + 8;
@ -121,42 +94,17 @@ index b048d6c..2a5333a 100644
this.u.a(this.a, this.b, k, i1, l); this.u.a(this.a, this.b, k, i1, l);
} }
@@ -244,6 +250,7 @@ public class BiomeDecorator { @@ -276,4 +276,11 @@ public class BiomeDecorator {
(new WorldGenLiquids(Blocks.LAVA)).a(this.a, this.b, k, l, i1);
}
}
+ this.unloadChunks(); // Spigot - unload chunks we force loaded
}
protected void a(int i, WorldGenerator worldgenerator, int j, int k) {
@@ -276,4 +283,28 @@ public class BiomeDecorator {
this.a(1, this.n, 0, 16); this.a(1, this.n, 0, 16);
this.b(1, this.o, 16, 16); this.b(1, this.o, 16, 16);
} }
+ +
+ // Spigot start - force load chunks + // Spigot Start
+ private int getHighestBlockYAt(int i, int j) + private int getHighestBlockYAt(int x, int z)
+ { + {
+ // Make sure the chunk is loaded + return Math.max( 1, this.a.getHighestBlockYAt( x, z ) );
+ if ( !this.a.isChunkLoaded( i >> 4, j >> 4 ) )
+ {
+ // If not, load it, then add it to our unload list
+ this.chunksToUnload.add( this.a.getChunkAt( i >> 4, j >> 4 ) );
+ }
+
+ return this.a.getHighestBlockYAt( i, j );
+ } + }
+ + // Spigot End
+ private void unloadChunks()
+ {
+ Iterator<Chunk> iter = this.chunksToUnload.iterator();
+ while ( iter.hasNext() )
+ {
+ this.a.getWorld().unloadChunk( iter.next().bukkitChunk );
+ iter.remove();
+ }
+ }
+ // Spigot end
} }
-- --
1.8.3.2 1.8.3.2