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        /** ID for this world type. */
034        private final int worldTypeId;
035    
036        /** 'default' or 'flat' */
037        private final String worldType;
038    
039        /** The int version of the ChunkProvider that generated this world. */
040        private final int generatorVersion;
041    
042        /**
043         * Whether this world type can be generated. Normally true; set to false for out-of-date generator versions.
044         */
045        private boolean canBeCreated;
046    
047        /** Whether this WorldType has a version or not. */
048        private boolean isWorldTypeVersioned;
049    
050        protected BiomeGenBase[] biomesForWorldType;
051    
052        public WorldType(int par1, String par2Str)
053        {
054            this(par1, par2Str, 0);
055        }
056    
057        public WorldType(int par1, String par2Str, int par3)
058        {
059            this.worldType = par2Str;
060            this.generatorVersion = par3;
061            this.canBeCreated = true;
062            this.worldTypeId = par1;
063            worldTypes[par1] = this;
064            switch (par1)
065            {
066            case 8:
067                biomesForWorldType = base11Biomes;
068                break;
069            default:
070                biomesForWorldType = base12Biomes;
071            }
072        }
073    
074        public String getWorldTypeName()
075        {
076            return this.worldType;
077        }
078    
079        @SideOnly(Side.CLIENT)
080    
081        /**
082         * Gets the translation key for the name of this world type.
083         */
084        public String getTranslateName()
085        {
086            return "generator." + this.worldType;
087        }
088    
089        /**
090         * Returns generatorVersion.
091         */
092        public int getGeneratorVersion()
093        {
094            return this.generatorVersion;
095        }
096    
097        public WorldType getWorldTypeForGeneratorVersion(int par1)
098        {
099            return this == DEFAULT && par1 == 0 ? DEFAULT_1_1 : this;
100        }
101    
102        /**
103         * Sets canBeCreated to the provided value, and returns this.
104         */
105        private WorldType setCanBeCreated(boolean par1)
106        {
107            this.canBeCreated = par1;
108            return this;
109        }
110    
111        @SideOnly(Side.CLIENT)
112    
113        /**
114         * Gets whether this WorldType can be used to generate a new world.
115         */
116        public boolean getCanBeCreated()
117        {
118            return this.canBeCreated;
119        }
120    
121        /**
122         * Flags this world type as having an associated version.
123         */
124        private WorldType setVersioned()
125        {
126            this.isWorldTypeVersioned = true;
127            return this;
128        }
129    
130        /**
131         * Returns true if this world Type has a version associated with it.
132         */
133        public boolean isVersioned()
134        {
135            return this.isWorldTypeVersioned;
136        }
137    
138        public static WorldType parseWorldType(String par0Str)
139        {
140            WorldType[] var1 = worldTypes;
141            int var2 = var1.length;
142    
143            for (int var3 = 0; var3 < var2; ++var3)
144            {
145                WorldType var4 = var1[var3];
146    
147                if (var4 != null && var4.worldType.equalsIgnoreCase(par0Str))
148                {
149                    return var4;
150                }
151            }
152    
153            return null;
154        }
155    
156        @SideOnly(Side.CLIENT)
157        public int func_82747_f()
158        {
159            return this.worldTypeId;
160        }
161    
162        public WorldChunkManager getChunkManager(World world)
163        {
164            if (this == FLAT)
165            {
166                FlatGeneratorInfo var1 = FlatGeneratorInfo.func_82651_a(world.getWorldInfo().func_82571_y());
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    }