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