001    package net.minecraft.world;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    
006    import java.util.Arrays;
007    import java.util.Random;
008    import java.util.Set;
009    
010    import com.google.common.collect.ObjectArrays;
011    import com.google.common.collect.Sets;
012    
013    import net.minecraft.world.*;
014    import net.minecraft.world.gen.*;
015    import net.minecraft.world.biome.*;
016    import net.minecraft.world.chunk.IChunkProvider;
017    
018    public class WorldType
019    {
020        public static final BiomeGenBase[] base11Biomes = new BiomeGenBase[] {BiomeGenBase.desert, BiomeGenBase.forest, BiomeGenBase.extremeHills, BiomeGenBase.swampland, BiomeGenBase.plains, BiomeGenBase.taiga};
021        public static final BiomeGenBase[] base12Biomes = ObjectArrays.concat(base11Biomes, BiomeGenBase.jungle);
022    
023        /** List of world types. */
024        public static final WorldType[] worldTypes = new WorldType[16];
025    
026        /** Default world type. */
027        public static final WorldType DEFAULT = (new WorldType(0, "default", 1)).setVersioned();
028    
029        /** Flat world type. */
030        public static final WorldType FLAT = new WorldType(1, "flat");
031    
032        /** Large Biome world Type. */
033        public static final WorldType LARGE_BIOMES = new WorldType(2, "largeBiomes");
034    
035        /** Default (1.1) world type. */
036        public static final WorldType DEFAULT_1_1 = (new WorldType(8, "default_1_1", 0)).setCanBeCreated(false);
037    
038        /** ID for this world type. */
039        private final int worldTypeId;
040    
041        /** 'default' or 'flat' */
042        private final String worldType;
043    
044        /** The int version of the ChunkProvider that generated this world. */
045        private final int generatorVersion;
046    
047        /**
048         * Whether this world type can be generated. Normally true; set to false for out-of-date generator versions.
049         */
050        private boolean canBeCreated;
051    
052        /** Whether this WorldType has a version or not. */
053        private boolean isWorldTypeVersioned;
054    
055        protected BiomeGenBase[] biomesForWorldType;
056    
057        public WorldType(int par1, String par2Str)
058        {
059            this(par1, par2Str, 0);
060        }
061    
062        public WorldType(int par1, String par2Str, int par3)
063        {
064            this.worldType = par2Str;
065            this.generatorVersion = par3;
066            this.canBeCreated = true;
067            this.worldTypeId = par1;
068            worldTypes[par1] = this;
069    
070            switch (par1)
071            {
072                case 8:
073                    biomesForWorldType = base11Biomes;
074                    break;
075                default:
076                    biomesForWorldType = base12Biomes;
077            }
078        }
079    
080        public String getWorldTypeName()
081        {
082            return this.worldType;
083        }
084    
085        @SideOnly(Side.CLIENT)
086    
087        /**
088         * Gets the translation key for the name of this world type.
089         */
090        public String getTranslateName()
091        {
092            return "generator." + this.worldType;
093        }
094    
095        /**
096         * Returns generatorVersion.
097         */
098        public int getGeneratorVersion()
099        {
100            return this.generatorVersion;
101        }
102    
103        public WorldType getWorldTypeForGeneratorVersion(int par1)
104        {
105            return this == DEFAULT && par1 == 0 ? DEFAULT_1_1 : this;
106        }
107    
108        /**
109         * Sets canBeCreated to the provided value, and returns this.
110         */
111        private WorldType setCanBeCreated(boolean par1)
112        {
113            this.canBeCreated = par1;
114            return this;
115        }
116    
117        @SideOnly(Side.CLIENT)
118    
119        /**
120         * Gets whether this WorldType can be used to generate a new world.
121         */
122        public boolean getCanBeCreated()
123        {
124            return this.canBeCreated;
125        }
126    
127        /**
128         * Flags this world type as having an associated version.
129         */
130        private WorldType setVersioned()
131        {
132            this.isWorldTypeVersioned = true;
133            return this;
134        }
135    
136        /**
137         * Returns true if this world Type has a version associated with it.
138         */
139        public boolean isVersioned()
140        {
141            return this.isWorldTypeVersioned;
142        }
143    
144        public static WorldType parseWorldType(String par0Str)
145        {
146            for (int var1 = 0; var1 < worldTypes.length; ++var1)
147            {
148                if (worldTypes[var1] != null && worldTypes[var1].worldType.equalsIgnoreCase(par0Str))
149                {
150                    return worldTypes[var1];
151                }
152            }
153    
154            return null;
155        }
156    
157        public int getWorldTypeID()
158        {
159            return this.worldTypeId;
160        }
161    
162        public WorldChunkManager getChunkManager(World world)
163        {
164            if (this == FLAT)
165            {
166                FlatGeneratorInfo var1 = FlatGeneratorInfo.createFlatGeneratorFromString(world.getWorldInfo().getGeneratorOptions());
167                return new WorldChunkManagerHell(BiomeGenBase.biomeList[var1.getBiome()], 0.5F, 0.5F);
168            }
169            else
170            {
171                return new WorldChunkManager(world);
172            }
173        }
174    
175        public IChunkProvider getChunkGenerator(World world, String generatorOptions)
176        {
177            return (this == FLAT ? new ChunkProviderFlat(world, world.getSeed(), world.getWorldInfo().isMapFeaturesEnabled(), generatorOptions) : new ChunkProviderGenerate(world, world.getSeed(), world.getWorldInfo().isMapFeaturesEnabled()));
178        }
179    
180        public int getMinimumSpawnHeight(World world)
181        {
182            return this == FLAT ? 4 : 64;
183        }
184    
185        public double getHorizon(World world)
186        {
187            return this == FLAT ? 0.0D : 63.0D;
188        }
189    
190        public boolean hasVoidParticles(boolean var1)
191        {
192            return this != FLAT && !var1;
193        }
194    
195        public double voidFadeMagnitude()
196        {
197            return this == FLAT ? 1.0D : 0.03125D;
198        }
199    
200        public BiomeGenBase[] getBiomesForWorldType() {
201            return biomesForWorldType;
202        }
203    
204        public void addNewBiome(BiomeGenBase biome)
205        {
206            Set<BiomeGenBase> newBiomesForWorld = Sets.newLinkedHashSet(Arrays.asList(biomesForWorldType));
207            newBiomesForWorld.add(biome);
208            biomesForWorldType = newBiomesForWorld.toArray(new BiomeGenBase[0]);
209        }
210    
211        public void removeBiome(BiomeGenBase biome)
212        {
213            Set<BiomeGenBase> newBiomesForWorld = Sets.newLinkedHashSet(Arrays.asList(biomesForWorldType));
214            newBiomesForWorld.remove(biome);
215            biomesForWorldType = newBiomesForWorld.toArray(new BiomeGenBase[0]);
216        }
217    
218        public boolean handleSlimeSpawnReduction(Random random, World world)
219        {
220            return this == FLAT ? random.nextInt(4) != 1 : false;
221        }
222    
223        /**
224         * Called when 'Create New World' button is pressed before starting game
225         */
226        public void onGUICreateWorldPress() { }
227    
228        /**
229         * Gets the spawn fuzz for players who join the world.
230         * Useful for void world types.
231         * @return Fuzz for entity initial spawn in blocks.
232         */
233        public int getSpawnFuzz()
234        {
235            return 20;
236        }
237    }