001 package net.minecraft.src;
002
003 import java.util.List;
004 import java.util.Random;
005
006 public class ChunkProviderFlat implements IChunkProvider
007 {
008 private World worldObj;
009 private Random random;
010 private final boolean useStructures;
011 private MapGenVillage villageGen = new MapGenVillage(1);
012
013 public ChunkProviderFlat(World par1World, long par2, boolean par4)
014 {
015 this.worldObj = par1World;
016 this.useStructures = par4;
017 this.random = new Random(par2);
018 }
019
020 private void generate(byte[] par1ArrayOfByte)
021 {
022 int var2 = par1ArrayOfByte.length / 256;
023
024 for (int var3 = 0; var3 < 16; ++var3)
025 {
026 for (int var4 = 0; var4 < 16; ++var4)
027 {
028 for (int var5 = 0; var5 < var2; ++var5)
029 {
030 int var6 = 0;
031
032 if (var5 == 0)
033 {
034 var6 = Block.bedrock.blockID;
035 }
036 else if (var5 <= 2)
037 {
038 var6 = Block.dirt.blockID;
039 }
040 else if (var5 == 3)
041 {
042 var6 = Block.grass.blockID;
043 }
044
045 par1ArrayOfByte[var3 << 11 | var4 << 7 | var5] = (byte)var6;
046 }
047 }
048 }
049 }
050
051 /**
052 * loads or generates the chunk at the chunk location specified
053 */
054 public Chunk loadChunk(int par1, int par2)
055 {
056 return this.provideChunk(par1, par2);
057 }
058
059 /**
060 * Will return back a chunk, if it doesn't exist and its not a MP client it will generates all the blocks for the
061 * specified chunk from the map seed and chunk seed
062 */
063 public Chunk provideChunk(int par1, int par2)
064 {
065 byte[] var3 = new byte[32768];
066 this.generate(var3);
067 Chunk var4 = new Chunk(this.worldObj, var3, par1, par2);
068
069 if (this.useStructures)
070 {
071 this.villageGen.generate(this, this.worldObj, par1, par2, var3);
072 }
073
074 BiomeGenBase[] var5 = this.worldObj.getWorldChunkManager().loadBlockGeneratorData((BiomeGenBase[])null, par1 * 16, par2 * 16, 16, 16);
075 byte[] var6 = var4.getBiomeArray();
076
077 for (int var7 = 0; var7 < var6.length; ++var7)
078 {
079 var6[var7] = (byte)var5[var7].biomeID;
080 }
081
082 var4.generateSkylightMap();
083 return var4;
084 }
085
086 /**
087 * Checks to see if a chunk exists at x, y
088 */
089 public boolean chunkExists(int par1, int par2)
090 {
091 return true;
092 }
093
094 /**
095 * Populates chunk with ores etc etc
096 */
097 public void populate(IChunkProvider par1IChunkProvider, int par2, int par3)
098 {
099 this.random.setSeed(this.worldObj.getSeed());
100 long var4 = this.random.nextLong() / 2L * 2L + 1L;
101 long var6 = this.random.nextLong() / 2L * 2L + 1L;
102 this.random.setSeed((long)par2 * var4 + (long)par3 * var6 ^ this.worldObj.getSeed());
103
104 if (this.useStructures)
105 {
106 this.villageGen.generateStructuresInChunk(this.worldObj, this.random, par2, par3);
107 }
108 }
109
110 /**
111 * Two modes of operation: if passed true, save all Chunks in one go. If passed false, save up to two chunks.
112 * Return true if all chunks have been saved.
113 */
114 public boolean saveChunks(boolean par1, IProgressUpdate par2IProgressUpdate)
115 {
116 return true;
117 }
118
119 /**
120 * Unloads the 100 oldest chunks from memory, due to a bug with chunkSet.add() never being called it thinks the list
121 * is always empty and will not remove any chunks.
122 */
123 public boolean unload100OldestChunks()
124 {
125 return false;
126 }
127
128 /**
129 * Returns if the IChunkProvider supports saving.
130 */
131 public boolean canSave()
132 {
133 return true;
134 }
135
136 /**
137 * Converts the instance data to a readable string.
138 */
139 public String makeString()
140 {
141 return "FlatLevelSource";
142 }
143
144 /**
145 * Returns a list of creatures of the specified type that can spawn at the given location.
146 */
147 public List getPossibleCreatures(EnumCreatureType par1EnumCreatureType, int par2, int par3, int par4)
148 {
149 BiomeGenBase var5 = this.worldObj.getBiomeGenForCoords(par2, par4);
150 return var5 == null ? null : var5.getSpawnableList(par1EnumCreatureType);
151 }
152
153 /**
154 * Returns the location of the closest structure of the specified type. If not found returns null.
155 */
156 public ChunkPosition findClosestStructure(World par1World, String par2Str, int par3, int par4, int par5)
157 {
158 return null;
159 }
160
161 public int getLoadedChunkCount()
162 {
163 return 0;
164 }
165 }