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