001package net.minecraft.world.gen.layer;
002
003import net.minecraft.world.WorldType;
004
005import net.minecraftforge.common.*;
006import net.minecraftforge.event.terraingen.*;
007
008public abstract class GenLayer
009{
010    /** seed from World#getWorldSeed that is used in the LCG prng */
011    private long worldGenSeed;
012
013    /** parent GenLayer that was provided via the constructor */
014    protected GenLayer parent;
015
016    /**
017     * final part of the LCG prng that uses the chunk X, Z coords along with the other two seeds to generate
018     * pseudorandom numbers
019     */
020    private long chunkSeed;
021
022    /** base seed to the LCG prng provided via the constructor */
023    private long baseSeed;
024
025    /**
026     * the first array item is a linked list of the bioms, the second is the zoom function, the third is the same as the
027     * first.
028     */
029    public static GenLayer[] initializeAllBiomeGenerators(long par0, WorldType par2WorldType)
030    {
031        GenLayerIsland genlayerisland = new GenLayerIsland(1L);
032        GenLayerFuzzyZoom genlayerfuzzyzoom = new GenLayerFuzzyZoom(2000L, genlayerisland);
033        GenLayerAddIsland genlayeraddisland = new GenLayerAddIsland(1L, genlayerfuzzyzoom);
034        GenLayerZoom genlayerzoom = new GenLayerZoom(2001L, genlayeraddisland);
035        genlayeraddisland = new GenLayerAddIsland(2L, genlayerzoom);
036        GenLayerAddSnow genlayeraddsnow = new GenLayerAddSnow(2L, genlayeraddisland);
037        genlayerzoom = new GenLayerZoom(2002L, genlayeraddsnow);
038        genlayeraddisland = new GenLayerAddIsland(3L, genlayerzoom);
039        genlayerzoom = new GenLayerZoom(2003L, genlayeraddisland);
040        genlayeraddisland = new GenLayerAddIsland(4L, genlayerzoom);
041        GenLayerAddMushroomIsland genlayeraddmushroomisland = new GenLayerAddMushroomIsland(5L, genlayeraddisland);
042        byte b0 = 4;
043
044        if (par2WorldType == WorldType.LARGE_BIOMES)
045        {
046            b0 = 6;
047        }
048        b0 = getModdedBiomeSize(par2WorldType, b0);
049
050        GenLayer genlayer = GenLayerZoom.func_75915_a(1000L, genlayeraddmushroomisland, 0);
051        GenLayerRiverInit genlayerriverinit = new GenLayerRiverInit(100L, genlayer);
052        genlayer = GenLayerZoom.func_75915_a(1000L, genlayerriverinit, b0 + 2);
053        GenLayerRiver genlayerriver = new GenLayerRiver(1L, genlayer);
054        GenLayerSmooth genlayersmooth = new GenLayerSmooth(1000L, genlayerriver);
055        GenLayer genlayer1 = GenLayerZoom.func_75915_a(1000L, genlayeraddmushroomisland, 0);
056        GenLayerBiome genlayerbiome = new GenLayerBiome(200L, genlayer1, par2WorldType);
057        genlayer1 = GenLayerZoom.func_75915_a(1000L, genlayerbiome, 2);
058        Object object = new GenLayerHills(1000L, genlayer1);
059
060        for (int j = 0; j < b0; ++j)
061        {
062            object = new GenLayerZoom((long)(1000 + j), (GenLayer)object);
063
064            if (j == 0)
065            {
066                object = new GenLayerAddIsland(3L, (GenLayer)object);
067            }
068
069            if (j == 1)
070            {
071                object = new GenLayerShore(1000L, (GenLayer)object);
072            }
073
074            if (j == 1)
075            {
076                object = new GenLayerSwampRivers(1000L, (GenLayer)object);
077            }
078        }
079
080        GenLayerSmooth genlayersmooth1 = new GenLayerSmooth(1000L, (GenLayer)object);
081        GenLayerRiverMix genlayerrivermix = new GenLayerRiverMix(100L, genlayersmooth1, genlayersmooth);
082        GenLayerVoronoiZoom genlayervoronoizoom = new GenLayerVoronoiZoom(10L, genlayerrivermix);
083        genlayerrivermix.initWorldGenSeed(par0);
084        genlayervoronoizoom.initWorldGenSeed(par0);
085        return new GenLayer[] {genlayerrivermix, genlayervoronoizoom, genlayerrivermix};
086    }
087
088    public GenLayer(long par1)
089    {
090        this.baseSeed = par1;
091        this.baseSeed *= this.baseSeed * 6364136223846793005L + 1442695040888963407L;
092        this.baseSeed += par1;
093        this.baseSeed *= this.baseSeed * 6364136223846793005L + 1442695040888963407L;
094        this.baseSeed += par1;
095        this.baseSeed *= this.baseSeed * 6364136223846793005L + 1442695040888963407L;
096        this.baseSeed += par1;
097    }
098
099    /**
100     * Initialize layer's local worldGenSeed based on its own baseSeed and the world's global seed (passed in as an
101     * argument).
102     */
103    public void initWorldGenSeed(long par1)
104    {
105        this.worldGenSeed = par1;
106
107        if (this.parent != null)
108        {
109            this.parent.initWorldGenSeed(par1);
110        }
111
112        this.worldGenSeed *= this.worldGenSeed * 6364136223846793005L + 1442695040888963407L;
113        this.worldGenSeed += this.baseSeed;
114        this.worldGenSeed *= this.worldGenSeed * 6364136223846793005L + 1442695040888963407L;
115        this.worldGenSeed += this.baseSeed;
116        this.worldGenSeed *= this.worldGenSeed * 6364136223846793005L + 1442695040888963407L;
117        this.worldGenSeed += this.baseSeed;
118    }
119
120    /**
121     * Initialize layer's current chunkSeed based on the local worldGenSeed and the (x,z) chunk coordinates.
122     */
123    public void initChunkSeed(long par1, long par3)
124    {
125        this.chunkSeed = this.worldGenSeed;
126        this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
127        this.chunkSeed += par1;
128        this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
129        this.chunkSeed += par3;
130        this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
131        this.chunkSeed += par1;
132        this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
133        this.chunkSeed += par3;
134    }
135
136    /**
137     * returns a LCG pseudo random number from [0, x). Args: int x
138     */
139    protected int nextInt(int par1)
140    {
141        int j = (int)((this.chunkSeed >> 24) % (long)par1);
142
143        if (j < 0)
144        {
145            j += par1;
146        }
147
148        this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
149        this.chunkSeed += this.worldGenSeed;
150        return j;
151    }
152
153    /**
154     * Returns a list of integer values generated by this layer. These may be interpreted as temperatures, rainfall
155     * amounts, or biomeList[] indices based on the particular GenLayer subclass.
156     */
157    public abstract int[] getInts(int i, int j, int k, int l);
158
159    public static byte getModdedBiomeSize(WorldType worldType, byte original)
160    {
161        WorldTypeEvent.BiomeSize event = new WorldTypeEvent.BiomeSize(worldType, original);
162        MinecraftForge.TERRAIN_GEN_BUS.post(event);
163        return event.newSize;
164    }
165}