package net.minecraft.world.gen.layer;
import java.util.concurrent.Callable;
import net.minecraft.crash.CrashReport;
import net.minecraft.crash.CrashReportCategory;
import net.minecraft.util.ReportedException;
import net.minecraft.world.WorldType;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraftforge.common.*;
import net.minecraftforge.event.terraingen.*;
public abstract class GenLayer
{
/** seed from World#getWorldSeed that is used in the LCG prng */
private long worldGenSeed;
/** parent GenLayer that was provided via the constructor */
protected GenLayer parent;
/**
* final part of the LCG prng that uses the chunk X, Z coords along with the other two seeds to generate
* pseudorandom numbers
*/
private long chunkSeed;
/** base seed to the LCG prng provided via the constructor */
protected long baseSeed;
private static final String __OBFID = "CL_00000559";
/**
* the first array item is a linked list of the bioms, the second is the zoom function, the third is the same as the
* first.
*/
public static GenLayer[] initializeAllBiomeGenerators(long p_75901_0_, WorldType p_75901_2_)
{
boolean flag = false;
GenLayerIsland genlayerisland = new GenLayerIsland(1L);
GenLayerFuzzyZoom genlayerfuzzyzoom = new GenLayerFuzzyZoom(2000L, genlayerisland);
GenLayerAddIsland genlayeraddisland = new GenLayerAddIsland(1L, genlayerfuzzyzoom);
GenLayerZoom genlayerzoom = new GenLayerZoom(2001L, genlayeraddisland);
genlayeraddisland = new GenLayerAddIsland(2L, genlayerzoom);
genlayeraddisland = new GenLayerAddIsland(50L, genlayeraddisland);
genlayeraddisland = new GenLayerAddIsland(70L, genlayeraddisland);
GenLayerRemoveTooMuchOcean genlayerremovetoomuchocean = new GenLayerRemoveTooMuchOcean(2L, genlayeraddisland);
GenLayerAddSnow genlayeraddsnow = new GenLayerAddSnow(2L, genlayerremovetoomuchocean);
genlayeraddisland = new GenLayerAddIsland(3L, genlayeraddsnow);
GenLayerEdge genlayeredge = new GenLayerEdge(2L, genlayeraddisland, GenLayerEdge.Mode.COOL_WARM);
genlayeredge = new GenLayerEdge(2L, genlayeredge, GenLayerEdge.Mode.HEAT_ICE);
genlayeredge = new GenLayerEdge(3L, genlayeredge, GenLayerEdge.Mode.SPECIAL);
genlayerzoom = new GenLayerZoom(2002L, genlayeredge);
genlayerzoom = new GenLayerZoom(2003L, genlayerzoom);
genlayeraddisland = new GenLayerAddIsland(4L, genlayerzoom);
GenLayerAddMushroomIsland genlayeraddmushroomisland = new GenLayerAddMushroomIsland(5L, genlayeraddisland);
GenLayerDeepOcean genlayerdeepocean = new GenLayerDeepOcean(4L, genlayeraddmushroomisland);
GenLayer genlayer2 = GenLayerZoom.magnify(1000L, genlayerdeepocean, 0);
byte b0 = 4;
if (p_75901_2_ == WorldType.LARGE_BIOMES)
{
b0 = 6;
}
if (flag)
{
b0 = 4;
}
b0 = getModdedBiomeSize(p_75901_2_, b0);
GenLayer genlayer = GenLayerZoom.magnify(1000L, genlayer2, 0);
GenLayerRiverInit genlayerriverinit = new GenLayerRiverInit(100L, genlayer);
Object object = p_75901_2_.getBiomeLayer(p_75901_0_, genlayer2);
GenLayer genlayer1 = GenLayerZoom.magnify(1000L, genlayerriverinit, 2);
GenLayerHills genlayerhills = new GenLayerHills(1000L, (GenLayer)object, genlayer1);
genlayer = GenLayerZoom.magnify(1000L, genlayerriverinit, 2);
genlayer = GenLayerZoom.magnify(1000L, genlayer, b0);
GenLayerRiver genlayerriver = new GenLayerRiver(1L, genlayer);
GenLayerSmooth genlayersmooth = new GenLayerSmooth(1000L, genlayerriver);
object = new GenLayerRareBiome(1001L, genlayerhills);
for (int j = 0; j < b0; ++j)
{
object = new GenLayerZoom((long)(1000 + j), (GenLayer)object);
if (j == 0)
{
object = new GenLayerAddIsland(3L, (GenLayer)object);
}
if (j == 1)
{
object = new GenLayerShore(1000L, (GenLayer)object);
}
}
GenLayerSmooth genlayersmooth1 = new GenLayerSmooth(1000L, (GenLayer)object);
GenLayerRiverMix genlayerrivermix = new GenLayerRiverMix(100L, genlayersmooth1, genlayersmooth);
GenLayerVoronoiZoom genlayervoronoizoom = new GenLayerVoronoiZoom(10L, genlayerrivermix);
genlayerrivermix.initWorldGenSeed(p_75901_0_);
genlayervoronoizoom.initWorldGenSeed(p_75901_0_);
return new GenLayer[] {genlayerrivermix, genlayervoronoizoom, genlayerrivermix};
}
public GenLayer(long p_i2125_1_)
{
this.baseSeed = p_i2125_1_;
this.baseSeed *= this.baseSeed * 6364136223846793005L + 1442695040888963407L;
this.baseSeed += p_i2125_1_;
this.baseSeed *= this.baseSeed * 6364136223846793005L + 1442695040888963407L;
this.baseSeed += p_i2125_1_;
this.baseSeed *= this.baseSeed * 6364136223846793005L + 1442695040888963407L;
this.baseSeed += p_i2125_1_;
}
/**
* Initialize layer's local worldGenSeed based on its own baseSeed and the world's global seed (passed in as an
* argument).
*/
public void initWorldGenSeed(long p_75905_1_)
{
this.worldGenSeed = p_75905_1_;
if (this.parent != null)
{
this.parent.initWorldGenSeed(p_75905_1_);
}
this.worldGenSeed *= this.worldGenSeed * 6364136223846793005L + 1442695040888963407L;
this.worldGenSeed += this.baseSeed;
this.worldGenSeed *= this.worldGenSeed * 6364136223846793005L + 1442695040888963407L;
this.worldGenSeed += this.baseSeed;
this.worldGenSeed *= this.worldGenSeed * 6364136223846793005L + 1442695040888963407L;
this.worldGenSeed += this.baseSeed;
}
/**
* Initialize layer's current chunkSeed based on the local worldGenSeed and the (x,z) chunk coordinates.
*/
public void initChunkSeed(long p_75903_1_, long p_75903_3_)
{
this.chunkSeed = this.worldGenSeed;
this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
this.chunkSeed += p_75903_1_;
this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
this.chunkSeed += p_75903_3_;
this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
this.chunkSeed += p_75903_1_;
this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
this.chunkSeed += p_75903_3_;
}
/**
* returns a LCG pseudo random number from [0, x). Args: int x
*/
protected int nextInt(int p_75902_1_)
{
int j = (int)((this.chunkSeed >> 24) % (long)p_75902_1_);
if (j < 0)
{
j += p_75902_1_;
}
this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
this.chunkSeed += this.worldGenSeed;
return j;
}
/**
* Returns a list of integer values generated by this layer. These may be interpreted as temperatures, rainfall
* amounts, or biomeList[] indices based on the particular GenLayer subclass.
*
* @param areaX The x-position of the area
* @param areaY The y-position of the area
* @param areaWidth The width of the area
* @param areaHeight The height of the area
*/
public abstract int[] getInts(int areaX, int areaY, int areaWidth, int areaHeight);
protected static boolean biomesEqualOrMesaPlateau(final int biomeIDA, final int biomeIDB)
{
if (biomeIDA == biomeIDB)
{
return true;
}
else if (biomeIDA != BiomeGenBase.mesaPlateau_F.biomeID && biomeIDA != BiomeGenBase.mesaPlateau.biomeID)
{
try
{
return BiomeGenBase.getBiome(biomeIDA) != null && BiomeGenBase.getBiome(biomeIDB) != null ? BiomeGenBase.getBiome(biomeIDA).isEqualTo(BiomeGenBase.getBiome(biomeIDB)) : false;
}
catch (Throwable throwable)
{
CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Comparing biomes");
CrashReportCategory crashreportcategory = crashreport.makeCategory("Biomes being compared");
crashreportcategory.addCrashSection("Biome A ID", Integer.valueOf(biomeIDA));
crashreportcategory.addCrashSection("Biome B ID", Integer.valueOf(biomeIDB));
crashreportcategory.addCrashSectionCallable("Biome A", new Callable()
{
private static final String __OBFID = "CL_00000560";
public String call()
{
return String.valueOf(BiomeGenBase.getBiome(biomeIDA));
}
});
crashreportcategory.addCrashSectionCallable("Biome B", new Callable()
{
private static final String __OBFID = "CL_00000561";
public String call()
{
return String.valueOf(BiomeGenBase.getBiome(biomeIDB));
}
});
throw new ReportedException(crashreport);
}
}
else
{
return biomeIDB == BiomeGenBase.mesaPlateau_F.biomeID || biomeIDB == BiomeGenBase.mesaPlateau.biomeID;
}
}
/**
* returns true if the biomeId is one of the various ocean biomes.
*/
protected static boolean isBiomeOceanic(int p_151618_0_)
{
return BiomeManager.oceanBiomes.contains(BiomeGenBase.getBiome(p_151618_0_));
}
/**
* selects a random integer from a set of provided integers
*/
protected int selectRandom(int ... p_151619_1_)
{
return p_151619_1_[this.nextInt(p_151619_1_.length)];
}
/**
* returns the most frequently occurring number of the set, or a random number from those provided
*/
protected int selectModeOrRandom(int p_151617_1_, int p_151617_2_, int p_151617_3_, int p_151617_4_)
{
return p_151617_2_ == p_151617_3_ && p_151617_3_ == p_151617_4_ ? p_151617_2_ : (p_151617_1_ == p_151617_2_ && p_151617_1_ == p_151617_3_ ? p_151617_1_ : (p_151617_1_ == p_151617_2_ && p_151617_1_ == p_151617_4_ ? p_151617_1_ : (p_151617_1_ == p_151617_3_ && p_151617_1_ == p_151617_4_ ? p_151617_1_ : (p_151617_1_ == p_151617_2_ && p_151617_3_ != p_151617_4_ ? p_151617_1_ : (p_151617_1_ == p_151617_3_ && p_151617_2_ != p_151617_4_ ? p_151617_1_ : (p_151617_1_ == p_151617_4_ && p_151617_2_ != p_151617_3_ ? p_151617_1_ : (p_151617_2_ == p_151617_3_ && p_151617_1_ != p_151617_4_ ? p_151617_2_ : (p_151617_2_ == p_151617_4_ && p_151617_1_ != p_151617_3_ ? p_151617_2_ : (p_151617_3_ == p_151617_4_ && p_151617_1_ != p_151617_2_ ? p_151617_3_ : this.selectRandom(new int[] {p_151617_1_, p_151617_2_, p_151617_3_, p_151617_4_}))))))))));
}
/* ======================================== FORGE START =====================================*/
protected long nextLong(long par1)
{
long j = (this.chunkSeed >> 24) % par1;
if (j < 0)
{
j += par1;
}
this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
this.chunkSeed += this.worldGenSeed;
return j;
}
public static byte getModdedBiomeSize(WorldType worldType, byte original)
{
WorldTypeEvent.BiomeSize event = new WorldTypeEvent.BiomeSize(worldType, original);
MinecraftForge.TERRAIN_GEN_BUS.post(event);
return event.newSize;
}
/* ========================================= FORGE END ======================================*/
}