Merge pull request #1195 from Techlone/fix_inconsistent_wordgen

Fix inconsistent worldgen
This commit is contained in:
Blood-Asp 2017-09-03 14:49:29 +02:00 committed by GitHub
commit 30daf05176

View file

@ -47,11 +47,10 @@ public class GT_Worldgenerator implements IWorldGenerator {
if (tempDimensionId != -1 && tempDimensionId != 1 && !aChunkGenerator.getClass().getName().contains("galacticraft")) { if (tempDimensionId != -1 && tempDimensionId != 1 && !aChunkGenerator.getClass().getName().contains("galacticraft")) {
tempDimensionId = 0; tempDimensionId = 0;
} }
new WorldGenContainer(new XSTR(aRandom.nextInt()), aX * 16, aZ * 16, tempDimensionId, aWorld, aChunkGenerator, aChunkProvider, aWorld.getBiomeGenForCoords(aX * 16 + 8, aZ * 16 + 8).biomeName).run(); new WorldGenContainer(aX * 16, aZ * 16, tempDimensionId, aWorld, aChunkGenerator, aChunkProvider, aWorld.getBiomeGenForCoords(aX * 16 + 8, aZ * 16 + 8).biomeName).run();
} }
public static class WorldGenContainer implements Runnable { public static class WorldGenContainer implements Runnable {
public final Random mRandom;
public int mX; public int mX;
public int mZ; public int mZ;
public final int mDimensionType; public final int mDimensionType;
@ -61,8 +60,7 @@ public class GT_Worldgenerator implements IWorldGenerator {
public final String mBiome; public final String mBiome;
public static HashSet<ChunkCoordIntPair> mGenerated = new HashSet<>(2000); public static HashSet<ChunkCoordIntPair> mGenerated = new HashSet<>(2000);
public WorldGenContainer(Random aRandom, int aX, int aZ, int aDimensionType, World aWorld, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider, String aBiome) { public WorldGenContainer(int aX, int aZ, int aDimensionType, World aWorld, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider, String aBiome) {
this.mRandom = aRandom;
this.mX = aX; this.mX = aX;
this.mZ = aZ; this.mZ = aZ;
this.mDimensionType = aDimensionType; this.mDimensionType = aDimensionType;
@ -82,22 +80,35 @@ public class GT_Worldgenerator implements IWorldGenerator {
return mWorld.checkChunksExist(xCenter - 16, 0, zCenter - 16, xCenter + 16, 0, zCenter + 16); return mWorld.checkChunksExist(xCenter - 16, 0, zCenter - 16, xCenter + 16, 0, zCenter + 16);
} }
public Random getRandom(int xChunk, int zChunk) {
long worldSeed = mWorld.getSeed();
Random fmlRandom = new Random(worldSeed);
long xSeed = fmlRandom.nextLong() >> 2 + 1L;
long zSeed = fmlRandom.nextLong() >> 2 + 1L;
long chunkSeed = (xSeed * xChunk + zSeed * zChunk) ^ worldSeed;
fmlRandom.setSeed(chunkSeed);
return new XSTR(fmlRandom.nextInt());
}
public void run() { public void run() {
int xCenter = getVeinCenterCoordinate(mX >> 4) << 4; int xCenter = getVeinCenterCoordinate(mX >> 4);
int zCenter = getVeinCenterCoordinate(mZ >> 4) << 4; int zCenter = getVeinCenterCoordinate(mZ >> 4);
Random random = getRandom(xCenter, zCenter);
xCenter <<= 4;
zCenter <<= 4;
ChunkCoordIntPair centerChunk = new ChunkCoordIntPair(xCenter, zCenter); ChunkCoordIntPair centerChunk = new ChunkCoordIntPair(xCenter, zCenter);
if (surroundingChunksLoaded(xCenter, zCenter) && !mGenerated.contains(centerChunk)) { if (!mGenerated.contains(centerChunk) && surroundingChunksLoaded(xCenter, zCenter)) {
mGenerated.add(centerChunk); mGenerated.add(centerChunk);
if ((GT_Worldgen_GT_Ore_Layer.sWeight > 0) && (GT_Worldgen_GT_Ore_Layer.sList.size() > 0)) { if ((GT_Worldgen_GT_Ore_Layer.sWeight > 0) && (GT_Worldgen_GT_Ore_Layer.sList.size() > 0)) {
boolean temp = true; boolean temp = true;
int tRandomWeight; int tRandomWeight;
for (int i = 0; (i < 256) && (temp); i++) { for (int i = 0; (i < 256) && (temp); i++) {
tRandomWeight = this.mRandom.nextInt(GT_Worldgen_GT_Ore_Layer.sWeight); tRandomWeight = random.nextInt(GT_Worldgen_GT_Ore_Layer.sWeight);
for (GT_Worldgen tWorldGen : GT_Worldgen_GT_Ore_Layer.sList) { for (GT_Worldgen tWorldGen : GT_Worldgen_GT_Ore_Layer.sList) {
tRandomWeight -= ((GT_Worldgen_GT_Ore_Layer) tWorldGen).mWeight; tRandomWeight -= ((GT_Worldgen_GT_Ore_Layer) tWorldGen).mWeight;
if (tRandomWeight <= 0) { if (tRandomWeight <= 0) {
try { try {
if (tWorldGen.executeWorldgen(this.mWorld, this.mRandom, this.mBiome, this.mDimensionType, xCenter, zCenter, this.mChunkGenerator, this.mChunkProvider)) { if (tWorldGen.executeWorldgen(this.mWorld, random, this.mBiome, this.mDimensionType, xCenter, zCenter, this.mChunkGenerator, this.mChunkProvider)) {
temp = false; temp = false;
} }
break; break;
@ -114,7 +125,7 @@ public class GT_Worldgenerator implements IWorldGenerator {
for (int tZ = zCenter - 16; j < 3; tZ += 16) { for (int tZ = zCenter - 16; j < 3; tZ += 16) {
try { try {
for (GT_Worldgen tWorldGen : GregTech_API.sWorldgenList) { for (GT_Worldgen tWorldGen : GregTech_API.sWorldgenList) {
tWorldGen.executeWorldgen(this.mWorld, this.mRandom, this.mBiome, this.mDimensionType, tX, tZ, this.mChunkGenerator, this.mChunkProvider); tWorldGen.executeWorldgen(this.mWorld, random, this.mBiome, this.mDimensionType, tX, tZ, this.mChunkGenerator, this.mChunkProvider);
} }
} catch (Throwable e) { } catch (Throwable e) {
e.printStackTrace(GT_Log.err); e.printStackTrace(GT_Log.err);
@ -139,7 +150,7 @@ public class GT_Worldgenerator implements IWorldGenerator {
for (int i = 0; (i < 256) && (temp); i++) { for (int i = 0; (i < 256) && (temp); i++) {
tRandomWeight = aRandom.nextInt(GT_Worldgen_GT_Ore_Layer.sWeight); tRandomWeight = aRandom.nextInt(GT_Worldgen_GT_Ore_Layer.sWeight);
for (GT_Worldgen_GT_Ore_Layer tWorldGen : GT_Worldgen_GT_Ore_Layer.sList) { for (GT_Worldgen_GT_Ore_Layer tWorldGen : GT_Worldgen_GT_Ore_Layer.sList) {
tRandomWeight -= ((GT_Worldgen_GT_Ore_Layer) tWorldGen).mWeight; tRandomWeight -= tWorldGen.mWeight;
if (tRandomWeight <= 0) { if (tRandomWeight <= 0) {
try { try {
if ((tWorldGen.mEndAsteroid && tDimensionType == 1) || (tWorldGen.mAsteroid && tDimensionType == -30)) { if ((tWorldGen.mEndAsteroid && tDimensionType == 1) || (tWorldGen.mAsteroid && tDimensionType == -30)) {