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 }