    001    package net.minecraft.src;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.SideOnly;
    005    import java.util.ArrayList;
    006    import java.util.Arrays;
    007    import java.util.List;
    008    import java.util.Random;
    009    import static net.minecraft.src.BiomeGenBase.*;
    010
    011    public class WorldChunkManager
    012    {
    013        public static ArrayList<BiomeGenBase> allowedBiomes = new ArrayList<BiomeGenBase>(Arrays.asList(forest, plains, taiga, taigaHills, forestHills, jungle. jungleHills));
    014        private GenLayer genBiomes;
    015
    016        /** A GenLayer containing the indices into BiomeGenBase.biomeList[] */
    017        private GenLayer biomeIndexLayer;
    018
    019        /** The BiomeCache object for this world. */
    020        private BiomeCache biomeCache;
    021
    022        /** A list of biomes that the player can spawn in. */
    023        private List biomesToSpawnIn;
    024
    025        protected WorldChunkManager()
    026        {
    027            this.biomeCache = new BiomeCache(this);
    028            this.biomesToSpawnIn = new ArrayList();
    029            this.biomesToSpawnIn.addAll(allowedBiomes);
    030        }
    031
    032        public WorldChunkManager(long par1, WorldType par3WorldType)
    033        {
    034            this();
    035            GenLayer[] var4 = GenLayer.initializeAllBiomeGenerators(par1, par3WorldType);
    036            this.genBiomes = var4[0];
    037            this.biomeIndexLayer = var4[1];
    038        }
    039
    040        public WorldChunkManager(World par1World)
    041        {
    042            this(par1World.getSeed(), par1World.getWorldInfo().getTerrainType());
    043        }
    044
    045        /**
    046         * Gets the list of valid biomes for the player to spawn in.
    047         */
    048        public List getBiomesToSpawnIn()
    049        {
    050            return this.biomesToSpawnIn;
    051        }
    052
    053        /**
    054         * Returns the BiomeGenBase related to the x, z position on the world.
    055         */
    056        public BiomeGenBase getBiomeGenAt(int par1, int par2)
    057        {
    058            return this.biomeCache.getBiomeGenAt(par1, par2);
    059        }
    060
    061        /**
    062         * Returns a list of rainfall values for the specified blocks. Args: listToReuse, x, z, width, length.
    063         */
    064        public float[] getRainfall(float[] par1ArrayOfFloat, int par2, int par3, int par4, int par5)
    065        {
    066            IntCache.resetIntCache();
    067
    068            if (par1ArrayOfFloat == null || par1ArrayOfFloat.length < par4 * par5)
    069            {
    070                par1ArrayOfFloat = new float[par4 * par5];
    071            }
    072
    073            int[] var6 = this.biomeIndexLayer.getInts(par2, par3, par4, par5);
    074
    075            for (int var7 = 0; var7 < par4 * par5; ++var7)
    076            {
    077                float var8 = (float)BiomeGenBase.biomeList[var6[var7]].getIntRainfall() / 65536.0F;
    078
    079                if (var8 > 1.0F)
    080                {
    081                    var8 = 1.0F;
    082                }
    083
    084                par1ArrayOfFloat[var7] = var8;
    085            }
    086
    087            return par1ArrayOfFloat;
    088        }
    089
    090        @SideOnly(Side.CLIENT)
    091
    092        /**
    093         * Return an adjusted version of a given temperature based on the y height
    094         */
    095        public float getTemperatureAtHeight(float par1, int par2)
    096        {
    097            return par1;
    098        }
    099
    100        /**
    101         * Returns a list of temperatures to use for the specified blocks.  Args: listToReuse, x, y, width, length
    102         */
    103        public float[] getTemperatures(float[] par1ArrayOfFloat, int par2, int par3, int par4, int par5)
    104        {
    105            IntCache.resetIntCache();
    106
    107            if (par1ArrayOfFloat == null || par1ArrayOfFloat.length < par4 * par5)
    108            {
    109                par1ArrayOfFloat = new float[par4 * par5];
    110            }
    111
    112            int[] var6 = this.biomeIndexLayer.getInts(par2, par3, par4, par5);
    113
    114            for (int var7 = 0; var7 < par4 * par5; ++var7)
    115            {
    116                float var8 = (float)BiomeGenBase.biomeList[var6[var7]].getIntTemperature() / 65536.0F;
    117
    118                if (var8 > 1.0F)
    119                {
    120                    var8 = 1.0F;
    121                }
    122
    123                par1ArrayOfFloat[var7] = var8;
    124            }
    125
    126            return par1ArrayOfFloat;
    127        }
    128
    129        /**
    130         * Returns an array of biomes for the location input.
    131         */
    132        public BiomeGenBase[] getBiomesForGeneration(BiomeGenBase[] par1ArrayOfBiomeGenBase, int par2, int par3, int par4, int par5)
    133        {
    134            IntCache.resetIntCache();
    135
    136            if (par1ArrayOfBiomeGenBase == null || par1ArrayOfBiomeGenBase.length < par4 * par5)
    137            {
    138                par1ArrayOfBiomeGenBase = new BiomeGenBase[par4 * par5];
    139            }
    140
    141            int[] var6 = this.genBiomes.getInts(par2, par3, par4, par5);
    142
    143            for (int var7 = 0; var7 < par4 * par5; ++var7)
    144            {
    145                par1ArrayOfBiomeGenBase[var7] = BiomeGenBase.biomeList[var6[var7]];
    146            }
    147
    148            return par1ArrayOfBiomeGenBase;
    149        }
    150
    151        /**
    152         * Returns biomes to use for the blocks and loads the other data like temperature and humidity onto the
    153         * WorldChunkManager Args: oldBiomeList, x, z, width, depth
    154         */
    155        public BiomeGenBase[] loadBlockGeneratorData(BiomeGenBase[] par1ArrayOfBiomeGenBase, int par2, int par3, int par4, int par5)
    156        {
    157            return this.getBiomeGenAt(par1ArrayOfBiomeGenBase, par2, par3, par4, par5, true);
    158        }
    159
    160        /**
    161         * Return a list of biomes for the specified blocks. Args: listToReuse, x, y, width, length, cacheFlag (if false,
    162         * don't check biomeCache to avoid infinite loop in BiomeCacheBlock)
    163         */
    164        public BiomeGenBase[] getBiomeGenAt(BiomeGenBase[] par1ArrayOfBiomeGenBase, int par2, int par3, int par4, int par5, boolean par6)
    165        {
    166            IntCache.resetIntCache();
    167
    168            if (par1ArrayOfBiomeGenBase == null || par1ArrayOfBiomeGenBase.length < par4 * par5)
    169            {
    170                par1ArrayOfBiomeGenBase = new BiomeGenBase[par4 * par5];
    171            }
    172
    173            if (par6 && par4 == 16 && par5 == 16 && (par2 & 15) == 0 && (par3 & 15) == 0)
    174            {
    175                BiomeGenBase[] var9 = this.biomeCache.getCachedBiomes(par2, par3);
    176                System.arraycopy(var9, 0, par1ArrayOfBiomeGenBase, 0, par4 * par5);
    177                return par1ArrayOfBiomeGenBase;
    178            }
    179            else
    180            {
    181                int[] var7 = this.biomeIndexLayer.getInts(par2, par3, par4, par5);
    182
    183                for (int var8 = 0; var8 < par4 * par5; ++var8)
    184                {
    185                    par1ArrayOfBiomeGenBase[var8] = BiomeGenBase.biomeList[var7[var8]];
    186                }
    187
    188                return par1ArrayOfBiomeGenBase;
    189            }
    190        }
    191
    192        /**
    193         * checks given Chunk's Biomes against List of allowed ones
    194         */
    195        public boolean areBiomesViable(int par1, int par2, int par3, List par4List)
    196        {
    197            IntCache.resetIntCache();
    198            int var5 = par1 - par3 >> 2;
    199            int var6 = par2 - par3 >> 2;
    200            int var7 = par1 + par3 >> 2;
    201            int var8 = par2 + par3 >> 2;
    202            int var9 = var7 - var5 + 1;
    203            int var10 = var8 - var6 + 1;
    204            int[] var11 = this.genBiomes.getInts(var5, var6, var9, var10);
    205
    206            for (int var12 = 0; var12 < var9 * var10; ++var12)
    207            {
    208                BiomeGenBase var13 = BiomeGenBase.biomeList[var11[var12]];
    209
    210                if (!par4List.contains(var13))
    211                {
    212                    return false;
    213                }
    214            }
    215
    216            return true;
    217        }
    218
    219        /**
    220         * Finds a valid position within a range, that is in one of the listed biomes. Searches {par1,par2} +-par3 blocks.
    221         * Strongly favors positive y positions.
    222         */
    223        public ChunkPosition findBiomePosition(int par1, int par2, int par3, List par4List, Random par5Random)
    224        {
    225            IntCache.resetIntCache();
    226            int var6 = par1 - par3 >> 2;
    227            int var7 = par2 - par3 >> 2;
    228            int var8 = par1 + par3 >> 2;
    229            int var9 = par2 + par3 >> 2;
    230            int var10 = var8 - var6 + 1;
    231            int var11 = var9 - var7 + 1;
    232            int[] var12 = this.genBiomes.getInts(var6, var7, var10, var11);
    233            ChunkPosition var13 = null;
    234            int var14 = 0;
    235
    236            for (int var15 = 0; var15 < var10 * var11; ++var15) //Vanilla Bug-Fix, AIOOB -1 when cant find biome
    237            {
    238                int var16 = var6 + var15 % var10 << 2;
    239                int var17 = var7 + var15 / var10 << 2;
    240                BiomeGenBase var18 = BiomeGenBase.biomeList[var12[var15]];
    241
    242                if (par4List.contains(var18) && (var13 == null || par5Random.nextInt(var14 + 1) == 0))
    243                {
    244                    var13 = new ChunkPosition(var16, 0, var17);
    245                    ++var14;
    246                }
    247            }
    248
    249            return var13;
    250        }
    251
    252        /**
    253         * Calls the WorldChunkManager's biomeCache.cleanupCache()
    254         */
    255        public void cleanupCache()
    256        {
    257            this.biomeCache.cleanupCache();
    258        }
    259    }