package net.minecraft.world;
import java.util.Arrays;
import java.util.Random;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiCreateFlatWorld;
import net.minecraft.client.gui.GuiCreateWorld;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.biome.WorldChunkManager;
import net.minecraft.world.biome.WorldChunkManagerHell;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.gen.ChunkProviderFlat;
import net.minecraft.world.gen.ChunkProviderGenerate;
import net.minecraft.world.gen.FlatGeneratorInfo;
import net.minecraft.world.gen.layer.GenLayer;
import net.minecraft.world.gen.layer.GenLayerBiome;
import net.minecraft.world.gen.layer.GenLayerBiomeEdge;
import net.minecraft.world.gen.layer.GenLayerZoom;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class WorldType
{
/** List of world types. */
public static WorldType[] worldTypes = new WorldType[16];
/** Default world type. */
public static final WorldType DEFAULT = (new WorldType(0, "default", 1)).setVersioned();
/** Flat world type. */
public static final WorldType FLAT = new WorldType(1, "flat");
/** Large Biome world Type. */
public static final WorldType LARGE_BIOMES = new WorldType(2, "largeBiomes");
/** amplified world type */
public static final WorldType AMPLIFIED = (new WorldType(3, "amplified")).setNotificationData();
/** Default (1.1) world type. */
public static final WorldType DEFAULT_1_1 = (new WorldType(8, "default_1_1", 0)).setCanBeCreated(false);
/** ID for this world type. */
private final int worldTypeId;
private final String worldType;
/** The int version of the ChunkProvider that generated this world. */
private final int generatorVersion;
/** Whether this world type can be generated. Normally true; set to false for out-of-date generator versions. */
private boolean canBeCreated;
/** Whether this WorldType has a version or not. */
private boolean isWorldTypeVersioned;
private boolean hasNotificationData;
private static final String __OBFID = "CL_00000150";
private WorldType(int p_i1959_1_, String p_i1959_2_)
{
this(p_i1959_1_, p_i1959_2_, 0);
}
private WorldType(int id, String name, int version)
{
if (name.length() > 16) throw new IllegalArgumentException("World type names must not be longer then 16: " + name.length());
this.worldType = name;
this.generatorVersion = version;
this.canBeCreated = true;
this.worldTypeId = id;
worldTypes[id] = this;
}
public String getWorldTypeName()
{
return this.worldType;
}
/**
* Gets the translation key for the name of this world type.
*/
@SideOnly(Side.CLIENT)
public String getTranslateName()
{
return "generator." + this.worldType;
}
@SideOnly(Side.CLIENT)
public String func_151359_c()
{
return this.getTranslateName() + ".info";
}
/**
* Returns generatorVersion.
*/
public int getGeneratorVersion()
{
return this.generatorVersion;
}
public WorldType getWorldTypeForGeneratorVersion(int version)
{
return this == DEFAULT && version == 0 ? DEFAULT_1_1 : this;
}
/**
* Sets canBeCreated to the provided value, and returns this.
*/
private WorldType setCanBeCreated(boolean enable)
{
this.canBeCreated = enable;
return this;
}
/**
* Gets whether this WorldType can be used to generate a new world.
*/
@SideOnly(Side.CLIENT)
public boolean getCanBeCreated()
{
return this.canBeCreated;
}
/**
* Flags this world type as having an associated version.
*/
private WorldType setVersioned()
{
this.isWorldTypeVersioned = true;
return this;
}
/**
* Returns true if this world Type has a version associated with it.
*/
public boolean isVersioned()
{
return this.isWorldTypeVersioned;
}
public static WorldType parseWorldType(String type)
{
for (int i = 0; i < worldTypes.length; ++i)
{
if (worldTypes[i] != null && worldTypes[i].worldType.equalsIgnoreCase(type))
{
return worldTypes[i];
}
}
return null;
}
public int getWorldTypeID()
{
return this.worldTypeId;
}
/**
* returns true if selecting this worldtype from the customize menu should display the generator.[worldtype].info
* message
*/
@SideOnly(Side.CLIENT)
public boolean showWorldInfoNotice()
{
return this.hasNotificationData;
}
/**
* enables the display of generator.[worldtype].info message on the customize world menu
*/
private WorldType setNotificationData()
{
this.hasNotificationData = true;
return this;
}
public WorldChunkManager getChunkManager(World world)
{
if (this == FLAT)
{
FlatGeneratorInfo flatgeneratorinfo = FlatGeneratorInfo.createFlatGeneratorFromString(world.getWorldInfo().getGeneratorOptions());
return new WorldChunkManagerHell(BiomeGenBase.getBiome(flatgeneratorinfo.getBiome()), 0.5F);
}
else
{
return new WorldChunkManager(world);
}
}
public IChunkProvider getChunkGenerator(World world, String generatorOptions)
{
return (this == FLAT ? new ChunkProviderFlat(world, world.getSeed(), world.getWorldInfo().isMapFeaturesEnabled(), generatorOptions) : new ChunkProviderGenerate(world, world.getSeed(), world.getWorldInfo().isMapFeaturesEnabled()));
}
public int getMinimumSpawnHeight(World world)
{
return this == FLAT ? 4 : 64;
}
public double getHorizon(World world)
{
return this == FLAT ? 0.0D : 63.0D;
}
public boolean hasVoidParticles(boolean flag)
{
return this != FLAT && !flag;
}
public double voidFadeMagnitude()
{
return this == FLAT ? 1.0D : 0.03125D;
}
/* public BiomeGenBase[] getBiomesForWorldType() {
return biomesForWorldType;
}
public void addNewBiome(BiomeGenBase biome)
{
Set<BiomeGenBase> newBiomesForWorld = Sets.newLinkedHashSet(Arrays.asList(biomesForWorldType));
newBiomesForWorld.add(biome);
biomesForWorldType = newBiomesForWorld.toArray(new BiomeGenBase[0]);
}
public void removeBiome(BiomeGenBase biome)
{
Set<BiomeGenBase> newBiomesForWorld = Sets.newLinkedHashSet(Arrays.asList(biomesForWorldType));
newBiomesForWorld.remove(biome);
biomesForWorldType = newBiomesForWorld.toArray(new BiomeGenBase[0]);
}
*/
public boolean handleSlimeSpawnReduction(Random random, World world)
{
return this == FLAT ? random.nextInt(4) != 1 : false;
}
/*=================================================== FORGE START ======================================*/
private static int getNextID()
{
for (int x = 0; x < worldTypes.length; x++)
{
if (worldTypes[x] == null)
{
return x;
}
}
int oldLen = worldTypes.length;
worldTypes = Arrays.copyOf(worldTypes, oldLen + 16);
return oldLen;
}
/**
* Creates a new world type, the ID is hidden and should not be referenced by modders.
* It will automatically expand the underlying workdType array if there are no IDs left.
* @param name
*/
public WorldType(String name)
{
this(getNextID(), name);
}
/**
* Called when 'Create New World' button is pressed before starting game
*/
public void onGUICreateWorldPress() { }
/**
* Gets the spawn fuzz for players who join the world.
* Useful for void world types.
* @return Fuzz for entity initial spawn in blocks.
*/
public int getSpawnFuzz()
{
return net.minecraftforge.common.ForgeModContainer.defaultSpawnFuzz;
}
/**
* Called when the 'Customize' button is pressed on world creation GUI
* @param instance The minecraft instance
* @param guiCreateWorld the createworld GUI
*/
@SideOnly(Side.CLIENT)
public void onCustomizeButton(Minecraft instance, GuiCreateWorld guiCreateWorld)
{
if (this == FLAT)
{
instance.displayGuiScreen(new GuiCreateFlatWorld(guiCreateWorld, guiCreateWorld.field_146334_a));
}
}
/**
* Should world creation GUI show 'Customize' button for this world type?
* @return if this world type has customization parameters
*/
public boolean isCustomizable()
{
return this == FLAT;
}
/**
* Get the height to render the clouds for this world type
* @return The height to render clouds at
*/
public float getCloudHeight()
{
return 128.0F;
}
/**
* Creates the GenLayerBiome used for generating the world
*
* @param worldSeed The world seed
* @param parentLayer The parent layer to feed into any layer you return
* @return A GenLayer that will return ints representing the Biomes to be generated, see GenLayerBiome
*/
public GenLayer getBiomeLayer(long worldSeed, GenLayer parentLayer)
{
GenLayer ret = new GenLayerBiome(200L, parentLayer, this);
ret = GenLayerZoom.magnify(1000L, ret, 2);
ret = new GenLayerBiomeEdge(1000L, ret);
return ret;
}
}