2015-06-23 15:29:05 -07:00
|
|
|
package gregtech.common;
|
|
|
|
|
|
|
|
import cpw.mods.fml.common.IWorldGenerator;
|
|
|
|
import cpw.mods.fml.common.registry.GameRegistry;
|
|
|
|
import gregtech.api.GregTech_API;
|
2017-03-31 21:27:50 +02:00
|
|
|
import gregtech.api.enums.GT_Values;
|
2016-09-16 00:17:08 +01:00
|
|
|
import gregtech.api.objects.XSTR;
|
2015-06-23 15:29:05 -07:00
|
|
|
import gregtech.api.util.GT_Log;
|
|
|
|
import gregtech.api.world.GT_Worldgen;
|
2015-10-21 20:47:13 -04:00
|
|
|
import gregtech.common.blocks.GT_TileEntity_Ores;
|
|
|
|
import net.minecraft.init.Blocks;
|
|
|
|
import net.minecraft.util.MathHelper;
|
2017-06-05 23:30:53 +02:00
|
|
|
import net.minecraft.world.ChunkCoordIntPair;
|
2015-06-23 15:29:05 -07:00
|
|
|
import net.minecraft.world.World;
|
|
|
|
import net.minecraft.world.biome.BiomeGenBase;
|
|
|
|
import net.minecraft.world.chunk.Chunk;
|
|
|
|
import net.minecraft.world.chunk.IChunkProvider;
|
|
|
|
import net.minecraft.world.gen.ChunkProviderEnd;
|
|
|
|
import net.minecraft.world.gen.ChunkProviderHell;
|
|
|
|
|
2017-06-05 23:30:53 +02:00
|
|
|
import java.util.HashSet;
|
2015-10-21 22:06:25 -04:00
|
|
|
import java.util.Random;
|
|
|
|
|
2015-06-23 15:29:05 -07:00
|
|
|
public class GT_Worldgenerator
|
2015-10-21 22:06:25 -04:00
|
|
|
implements IWorldGenerator {
|
2016-07-29 20:13:02 +01:00
|
|
|
private static int mEndAsteroidProbability = 300;
|
|
|
|
private static int mGCAsteroidProbability = 50;
|
2015-10-21 22:06:25 -04:00
|
|
|
private static int mSize = 100;
|
|
|
|
private static int endMinSize = 50;
|
|
|
|
private static int endMaxSize = 200;
|
2016-07-29 18:54:45 +01:00
|
|
|
private static int gcMinSize = 100;
|
|
|
|
private static int gcMaxSize = 400;
|
2015-10-21 22:06:25 -04:00
|
|
|
private static boolean endAsteroids = true;
|
2016-07-29 18:54:45 +01:00
|
|
|
private static boolean gcAsteroids = true;
|
2015-10-21 22:06:25 -04:00
|
|
|
|
|
|
|
|
|
|
|
public GT_Worldgenerator() {
|
|
|
|
endAsteroids = GregTech_API.sWorldgenFile.get("endasteroids", "GenerateAsteroids", true);
|
|
|
|
endMinSize = GregTech_API.sWorldgenFile.get("endasteroids", "AsteroidMinSize", 50);
|
|
|
|
endMaxSize = GregTech_API.sWorldgenFile.get("endasteroids", "AsteroidMaxSize", 200);
|
|
|
|
mEndAsteroidProbability = GregTech_API.sWorldgenFile.get("endasteroids", "AsteroidProbability", 300);
|
2016-07-29 18:54:45 +01:00
|
|
|
gcAsteroids = GregTech_API.sWorldgenFile.get("gcasteroids", "GenerateGCAsteroids", true);
|
|
|
|
gcMinSize = GregTech_API.sWorldgenFile.get("gcasteroids", "GCAsteroidMinSize", 100);
|
|
|
|
gcMaxSize = GregTech_API.sWorldgenFile.get("gcasteroids", "GCAsteroidMaxSize", 400);
|
|
|
|
mGCAsteroidProbability = GregTech_API.sWorldgenFile.get("gcasteroids", "GCAsteroidProbability", 300);
|
2015-10-21 22:06:25 -04:00
|
|
|
GameRegistry.registerWorldGenerator(this, 1073741823);
|
2015-06-23 15:29:05 -07:00
|
|
|
}
|
2015-10-21 22:06:25 -04:00
|
|
|
|
2017-03-18 19:43:32 +02:00
|
|
|
public synchronized void generate(Random aRandom, int aX, int aZ, World aWorld, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
|
2017-03-22 13:23:42 -07:00
|
|
|
int tempDimensionId = aWorld.provider.dimensionId;
|
|
|
|
if (tempDimensionId != -1 && tempDimensionId != 1 && !aChunkGenerator.getClass().getName().contains("galacticraft")) {
|
|
|
|
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();
|
2015-06-23 15:29:05 -07:00
|
|
|
}
|
2015-10-21 22:06:25 -04:00
|
|
|
|
|
|
|
public static class WorldGenContainer
|
|
|
|
implements Runnable {
|
|
|
|
public final Random mRandom;
|
2017-06-05 23:30:53 +02:00
|
|
|
public int mX;
|
|
|
|
public int mZ;
|
2015-10-21 22:06:25 -04:00
|
|
|
public final int mDimensionType;
|
|
|
|
public final World mWorld;
|
|
|
|
public final IChunkProvider mChunkGenerator;
|
|
|
|
public final IChunkProvider mChunkProvider;
|
|
|
|
public final String mBiome;
|
2017-06-05 23:30:53 +02:00
|
|
|
public static HashSet<ChunkCoordIntPair> mGenerated = new HashSet<>(2000);
|
2015-10-21 22:06:25 -04:00
|
|
|
|
|
|
|
public WorldGenContainer(Random aRandom, int aX, int aZ, int aDimensionType, World aWorld, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider, String aBiome) {
|
|
|
|
this.mRandom = aRandom;
|
|
|
|
this.mX = aX;
|
|
|
|
this.mZ = aZ;
|
|
|
|
this.mDimensionType = aDimensionType;
|
|
|
|
this.mWorld = aWorld;
|
|
|
|
this.mChunkGenerator = aChunkGenerator;
|
|
|
|
this.mChunkProvider = aChunkProvider;
|
|
|
|
this.mBiome = aBiome;
|
|
|
|
}
|
2017-06-05 23:30:53 +02:00
|
|
|
|
|
|
|
public boolean surroundingChunksLoaded(){
|
|
|
|
if(!mWorld.checkChunksExist(mX-16, 100, mZ-16, mX-16, 100, mZ-16)) return false;
|
|
|
|
if(!mWorld.checkChunksExist(mX, 100, mZ-16, mX , 100, mZ-16)) return false;
|
|
|
|
if(!mWorld.checkChunksExist(mX+16, 100, mZ-16, mX+16, 100, mZ-16)) return false;
|
|
|
|
if(!mWorld.checkChunksExist(mX+16, 100, mZ , mX+16, 100, mZ )) return false;
|
|
|
|
if(!mWorld.checkChunksExist(mX+16, 100, mZ+16, mX+16, 100, mZ+16)) return false;
|
|
|
|
if(!mWorld.checkChunksExist(mX , 100, mZ+16, mX , 100, mZ+16)) return false;
|
|
|
|
if(!mWorld.checkChunksExist(mX-16, 100, mZ+16, mX-16, 100, mZ+16)) return false;
|
|
|
|
if(!mWorld.checkChunksExist(mX-16, 100, mZ , mX-16, 100, mZ )) return false;
|
|
|
|
return true;
|
|
|
|
}
|
2015-10-21 22:06:25 -04:00
|
|
|
|
|
|
|
public void run() {
|
2017-06-05 23:30:53 +02:00
|
|
|
int sX = mX;
|
|
|
|
int sZ = mZ;
|
|
|
|
if((this.mX / 16 - 1) % 3 == 1) sX = mX - 16;
|
|
|
|
if((this.mX / 16 - 1) % 3 == 2) sX = mX + 16;
|
|
|
|
if((this.mZ / 16 - 1) % 3 == 1) sZ = mZ - 16;
|
|
|
|
if((this.mZ / 16 - 1) % 3 == 2) sZ = mZ + 16;
|
|
|
|
if (((sX / 16 - 1) % 3 == 0) && ((sZ / 16 - 1) % 3 == 0) && surroundingChunksLoaded()) {
|
|
|
|
ChunkCoordIntPair tPair = new ChunkCoordIntPair(sX, sZ);
|
|
|
|
if(!mGenerated.contains(tPair)){
|
|
|
|
mGenerated.add(tPair);
|
2015-10-21 22:06:25 -04:00
|
|
|
if ((GT_Worldgen_GT_Ore_Layer.sWeight > 0) && (GT_Worldgen_GT_Ore_Layer.sList.size() > 0)) {
|
|
|
|
boolean temp = true;
|
|
|
|
int tRandomWeight;
|
|
|
|
for (int i = 0; (i < 256) && (temp); i++) {
|
|
|
|
tRandomWeight = this.mRandom.nextInt(GT_Worldgen_GT_Ore_Layer.sWeight);
|
|
|
|
for (GT_Worldgen tWorldGen : GT_Worldgen_GT_Ore_Layer.sList) {
|
|
|
|
tRandomWeight -= ((GT_Worldgen_GT_Ore_Layer) tWorldGen).mWeight;
|
|
|
|
if (tRandomWeight <= 0) {
|
|
|
|
try {
|
2017-06-05 23:30:53 +02:00
|
|
|
if (tWorldGen.executeWorldgen(this.mWorld, this.mRandom, this.mBiome, this.mDimensionType, sX, sZ, this.mChunkGenerator, this.mChunkProvider)) {
|
2015-10-21 22:06:25 -04:00
|
|
|
temp = false;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
} catch (Throwable e) {
|
|
|
|
e.printStackTrace(GT_Log.err);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-06-23 15:29:05 -07:00
|
|
|
}
|
2015-10-21 22:06:25 -04:00
|
|
|
int i = 0;
|
2017-06-05 23:30:53 +02:00
|
|
|
for (int tX = sX - 16; i < 3; tX += 16) {
|
2015-10-21 22:06:25 -04:00
|
|
|
int j = 0;
|
2017-06-05 23:30:53 +02:00
|
|
|
for (int tZ = sZ - 16; j < 3; tZ += 16) {
|
2015-10-21 22:06:25 -04:00
|
|
|
String tBiome = this.mWorld.getBiomeGenForCoords(tX + 8, tZ + 8).biomeName;
|
2016-09-16 00:17:08 +01:00
|
|
|
try {
|
|
|
|
for (GT_Worldgen tWorldGen : GregTech_API.sWorldgenList) {
|
2015-10-21 22:06:25 -04:00
|
|
|
tWorldGen.executeWorldgen(this.mWorld, this.mRandom, this.mBiome, this.mDimensionType, tX, tZ, this.mChunkGenerator, this.mChunkProvider);
|
|
|
|
}
|
2017-03-18 19:43:32 +02:00
|
|
|
} catch (Throwable e) {
|
|
|
|
e.printStackTrace(GT_Log.err);
|
|
|
|
}
|
2015-10-21 22:06:25 -04:00
|
|
|
j++;
|
|
|
|
}
|
|
|
|
i++;
|
2015-06-23 15:29:05 -07:00
|
|
|
}
|
2017-06-05 23:30:53 +02:00
|
|
|
}
|
2015-06-23 15:29:05 -07:00
|
|
|
}
|
2015-10-21 22:06:25 -04:00
|
|
|
//Asteroid Worldgen
|
|
|
|
int tDimensionType = this.mWorld.provider.dimensionId;
|
2016-08-10 21:14:53 +01:00
|
|
|
String tDimensionName = this.mWorld.provider.getDimensionName();
|
2015-10-21 22:06:25 -04:00
|
|
|
Random aRandom = new Random();
|
2016-08-10 21:14:53 +01:00
|
|
|
if (((tDimensionType == 1) && endAsteroids && ((mEndAsteroidProbability <= 1) || (aRandom.nextInt(mEndAsteroidProbability) == 0))) || ((tDimensionName.equals("Asteroids")) && gcAsteroids && ((mGCAsteroidProbability <= 1) || (aRandom.nextInt(mGCAsteroidProbability) == 0)))) {
|
2017-03-31 21:19:04 +02:00
|
|
|
short primaryMeta = 0;
|
2015-10-21 22:06:25 -04:00
|
|
|
short secondaryMeta = 0;
|
|
|
|
short betweenMeta = 0;
|
|
|
|
short sporadicMeta = 0;
|
|
|
|
if ((GT_Worldgen_GT_Ore_Layer.sWeight > 0) && (GT_Worldgen_GT_Ore_Layer.sList.size() > 0)) {
|
|
|
|
boolean temp = true;
|
|
|
|
int tRandomWeight;
|
|
|
|
for (int i = 0; (i < 256) && (temp); i++) {
|
|
|
|
tRandomWeight = aRandom.nextInt(GT_Worldgen_GT_Ore_Layer.sWeight);
|
|
|
|
for (GT_Worldgen_GT_Ore_Layer tWorldGen : GT_Worldgen_GT_Ore_Layer.sList) {
|
|
|
|
tRandomWeight -= ((GT_Worldgen_GT_Ore_Layer) tWorldGen).mWeight;
|
|
|
|
if (tRandomWeight <= 0) {
|
|
|
|
try {
|
2016-07-29 18:54:45 +01:00
|
|
|
if ((tWorldGen.mEndAsteroid && tDimensionType == 1) || (tWorldGen.mAsteroid && tDimensionType == -30)) {
|
2015-10-21 22:06:25 -04:00
|
|
|
primaryMeta = tWorldGen.mPrimaryMeta;
|
|
|
|
secondaryMeta = tWorldGen.mSecondaryMeta;
|
|
|
|
betweenMeta = tWorldGen.mBetweenMeta;
|
|
|
|
sporadicMeta = tWorldGen.mSporadicMeta;
|
|
|
|
temp = false;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} catch (Throwable e) {
|
|
|
|
e.printStackTrace(GT_Log.err);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-03-31 21:27:50 +02:00
|
|
|
if(GT_Values.D1)System.out.println("do asteroid gen: "+this.mX+" "+this.mZ);
|
2015-10-21 22:06:25 -04:00
|
|
|
int tX = mX + aRandom.nextInt(16);
|
|
|
|
int tY = 50 + aRandom.nextInt(200 - 50);
|
|
|
|
int tZ = mZ + aRandom.nextInt(16);
|
|
|
|
if (tDimensionType == 1) {
|
|
|
|
mSize = aRandom.nextInt((int) (endMaxSize - endMinSize));
|
2016-08-10 21:14:53 +01:00
|
|
|
} else if (tDimensionName.equals("Asteroids")) {
|
2016-07-29 18:54:45 +01:00
|
|
|
mSize = aRandom.nextInt((int) (gcMaxSize - gcMinSize));
|
2015-10-21 22:06:25 -04:00
|
|
|
}
|
|
|
|
if ((mWorld.getBlock(tX, tY, tZ).isAir(mWorld, tX, tY, tZ))) {
|
|
|
|
float var6 = aRandom.nextFloat() * 3.141593F;
|
|
|
|
double var7 = tX + 8 + MathHelper.sin(var6) * mSize / 8.0F;
|
|
|
|
double var9 = tX + 8 - MathHelper.sin(var6) * mSize / 8.0F;
|
|
|
|
double var11 = tZ + 8 + MathHelper.cos(var6) * mSize / 8.0F;
|
|
|
|
double var13 = tZ + 8 - MathHelper.cos(var6) * mSize / 8.0F;
|
|
|
|
double var15 = tY + aRandom.nextInt(3) - 2;
|
|
|
|
double var17 = tY + aRandom.nextInt(3) - 2;
|
|
|
|
for (int var19 = 0; var19 <= mSize; var19++) {
|
|
|
|
double var20 = var7 + (var9 - var7) * var19 / mSize;
|
|
|
|
double var22 = var15 + (var17 - var15) * var19 / mSize;
|
|
|
|
double var24 = var11 + (var13 - var11) * var19 / mSize;
|
|
|
|
double var26 = aRandom.nextDouble() * mSize / 16.0D;
|
|
|
|
double var28 = (MathHelper.sin(var19 * 3.141593F / mSize) + 1.0F) * var26 + 1.0D;
|
|
|
|
double var30 = (MathHelper.sin(var19 * 3.141593F / mSize) + 1.0F) * var26 + 1.0D;
|
|
|
|
int tMinX = MathHelper.floor_double(var20 - var28 / 2.0D);
|
|
|
|
int tMinY = MathHelper.floor_double(var22 - var30 / 2.0D);
|
|
|
|
int tMinZ = MathHelper.floor_double(var24 - var28 / 2.0D);
|
|
|
|
int tMaxX = MathHelper.floor_double(var20 + var28 / 2.0D);
|
|
|
|
int tMaxY = MathHelper.floor_double(var22 + var30 / 2.0D);
|
|
|
|
int tMaxZ = MathHelper.floor_double(var24 + var28 / 2.0D);
|
|
|
|
for (int eX = tMinX; eX <= tMaxX; eX++) {
|
|
|
|
double var39 = (eX + 0.5D - var20) / (var28 / 2.0D);
|
|
|
|
if (var39 * var39 < 1.0D) {
|
|
|
|
for (int eY = tMinY; eY <= tMaxY; eY++) {
|
|
|
|
double var42 = (eY + 0.5D - var22) / (var30 / 2.0D);
|
|
|
|
if (var39 * var39 + var42 * var42 < 1.0D) {
|
|
|
|
for (int eZ = tMinZ; eZ <= tMaxZ; eZ++) {
|
|
|
|
double var45 = (eZ + 0.5D - var24) / (var28 / 2.0D);
|
|
|
|
if ((var39 * var39 + var42 * var42 + var45 * var45 < 1.0D) && (mWorld.getBlock(tX, tY, tZ).isAir(mWorld, tX, tY, tZ))) {
|
|
|
|
int ranOre = aRandom.nextInt(50);
|
|
|
|
if (ranOre < 3) {
|
2016-09-30 00:31:43 +02:00
|
|
|
GT_TileEntity_Ores.setOreBlock(mWorld, eX, eY, eZ, primaryMeta, false, true);
|
2015-10-21 22:06:25 -04:00
|
|
|
} else if (ranOre < 6) {
|
2016-09-30 00:31:43 +02:00
|
|
|
GT_TileEntity_Ores.setOreBlock(mWorld, eX, eY, eZ, secondaryMeta, false, true);
|
2015-10-21 22:06:25 -04:00
|
|
|
} else if (ranOre < 8) {
|
2016-09-30 00:31:43 +02:00
|
|
|
GT_TileEntity_Ores.setOreBlock(mWorld, eX, eY, eZ, betweenMeta, false, true);
|
2015-10-21 22:06:25 -04:00
|
|
|
} else if (ranOre < 10) {
|
2016-09-30 00:31:43 +02:00
|
|
|
GT_TileEntity_Ores.setOreBlock(mWorld, eX, eY, eZ, sporadicMeta, false, true);
|
2016-07-29 18:54:45 +01:00
|
|
|
} else {
|
2016-09-30 00:31:43 +02:00
|
|
|
if (tDimensionType == 1) {
|
|
|
|
mWorld.setBlock(eX, eY, eZ, Blocks.end_stone, 0, 2);
|
2016-08-10 21:14:53 +01:00
|
|
|
} else if (tDimensionName.equals("Asteroids")) {
|
2016-08-01 15:08:11 +01:00
|
|
|
//int asteroidType = aRandom.nextInt(20);
|
|
|
|
//if (asteroidType == 19) { //Rare Asteroid?
|
2016-09-16 00:17:08 +01:00
|
|
|
//mWorld.setBlock(eX, eY, eZ, GregTech_API.sBlockGranites, 8, 3);
|
2016-08-01 15:08:11 +01:00
|
|
|
//} else {
|
2016-09-16 00:17:08 +01:00
|
|
|
mWorld.setBlock(eX, eY, eZ, GregTech_API.sBlockGranites, 8, 3);
|
2016-08-01 15:08:11 +01:00
|
|
|
//}
|
2016-07-29 18:54:45 +01:00
|
|
|
}
|
2015-10-21 22:06:25 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-06-23 15:29:05 -07:00
|
|
|
}
|
2015-10-21 22:06:25 -04:00
|
|
|
|
|
|
|
|
|
|
|
Chunk tChunk = this.mWorld.getChunkFromBlockCoords(this.mX, this.mZ);
|
|
|
|
if (tChunk != null) {
|
|
|
|
tChunk.isModified = true;
|
2015-06-23 15:29:05 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-09-16 00:17:08 +01:00
|
|
|
}
|