001 package net.minecraft.src;
002
003 import java.util.Map;
004
005 import com.google.common.collect.Maps;
006
007 import cpw.mods.fml.common.Side;
008 import cpw.mods.fml.common.asm.SideOnly;
009
010 public class WorldInfo
011 {
012 /** Holds the seed of the currently world. */
013 private long randomSeed;
014 private WorldType terrainType;
015 private String field_82576_c;
016
017 /** The spawn zone position X coordinate. */
018 private int spawnX;
019
020 /** The spawn zone position Y coordinate. */
021 private int spawnY;
022
023 /** The spawn zone position Z coordinate. */
024 private int spawnZ;
025 private long field_82575_g;
026
027 /** The current world time in ticks, ranging from 0 to 23999. */
028 private long worldTime;
029
030 /** The last time the player was in this world. */
031 private long lastTimePlayed;
032
033 /** The size of entire save of current world on the disk, isn't exactly. */
034 private long sizeOnDisk;
035 private NBTTagCompound playerTag;
036 private int dimension;
037
038 /** The name of the save defined at world creation. */
039 private String levelName;
040
041 /** Introduced in beta 1.3, is the save version for future control. */
042 private int saveVersion;
043
044 /** True if it's raining, false otherwise. */
045 private boolean raining;
046
047 /** Number of ticks until next rain. */
048 private int rainTime;
049
050 /** Is thunderbolts failing now? */
051 private boolean thundering;
052
053 /** Number of ticks untils next thunderbolt. */
054 private int thunderTime;
055
056 /** The Game Type. */
057 private EnumGameType theGameType;
058
059 /**
060 * Whether the map features (e.g. strongholds) generation is enabled or disabled.
061 */
062 private boolean mapFeaturesEnabled;
063
064 /** Hardcore mode flag */
065 private boolean hardcore;
066 private boolean allowCommands;
067 private boolean initialized;
068 private GameRules field_82577_x;
069 private Map<String,NBTBase> additionalProperties;
070
071 protected WorldInfo()
072 {
073 this.terrainType = WorldType.DEFAULT;
074 this.field_82576_c = "";
075 this.field_82577_x = new GameRules();
076 }
077
078 public WorldInfo(NBTTagCompound par1NBTTagCompound)
079 {
080 this.terrainType = WorldType.DEFAULT;
081 this.field_82576_c = "";
082 this.field_82577_x = new GameRules();
083 this.randomSeed = par1NBTTagCompound.getLong("RandomSeed");
084
085 if (par1NBTTagCompound.hasKey("generatorName"))
086 {
087 String var2 = par1NBTTagCompound.getString("generatorName");
088 this.terrainType = WorldType.parseWorldType(var2);
089
090 if (this.terrainType == null)
091 {
092 this.terrainType = WorldType.DEFAULT;
093 }
094 else if (this.terrainType.isVersioned())
095 {
096 int var3 = 0;
097
098 if (par1NBTTagCompound.hasKey("generatorVersion"))
099 {
100 var3 = par1NBTTagCompound.getInteger("generatorVersion");
101 }
102
103 this.terrainType = this.terrainType.getWorldTypeForGeneratorVersion(var3);
104 }
105
106 if (par1NBTTagCompound.hasKey("generatorOptions"))
107 {
108 this.field_82576_c = par1NBTTagCompound.getString("generatorOptions");
109 }
110 }
111
112 this.theGameType = EnumGameType.getByID(par1NBTTagCompound.getInteger("GameType"));
113
114 if (par1NBTTagCompound.hasKey("MapFeatures"))
115 {
116 this.mapFeaturesEnabled = par1NBTTagCompound.getBoolean("MapFeatures");
117 }
118 else
119 {
120 this.mapFeaturesEnabled = true;
121 }
122
123 this.spawnX = par1NBTTagCompound.getInteger("SpawnX");
124 this.spawnY = par1NBTTagCompound.getInteger("SpawnY");
125 this.spawnZ = par1NBTTagCompound.getInteger("SpawnZ");
126 this.field_82575_g = par1NBTTagCompound.getLong("Time");
127
128 if (par1NBTTagCompound.hasKey("DayTime"))
129 {
130 this.worldTime = par1NBTTagCompound.getLong("DayTime");
131 }
132 else
133 {
134 this.worldTime = this.field_82575_g;
135 }
136
137 this.lastTimePlayed = par1NBTTagCompound.getLong("LastPlayed");
138 this.sizeOnDisk = par1NBTTagCompound.getLong("SizeOnDisk");
139 this.levelName = par1NBTTagCompound.getString("LevelName");
140 this.saveVersion = par1NBTTagCompound.getInteger("version");
141 this.rainTime = par1NBTTagCompound.getInteger("rainTime");
142 this.raining = par1NBTTagCompound.getBoolean("raining");
143 this.thunderTime = par1NBTTagCompound.getInteger("thunderTime");
144 this.thundering = par1NBTTagCompound.getBoolean("thundering");
145 this.hardcore = par1NBTTagCompound.getBoolean("hardcore");
146
147 if (par1NBTTagCompound.hasKey("initialized"))
148 {
149 this.initialized = par1NBTTagCompound.getBoolean("initialized");
150 }
151 else
152 {
153 this.initialized = true;
154 }
155
156 if (par1NBTTagCompound.hasKey("allowCommands"))
157 {
158 this.allowCommands = par1NBTTagCompound.getBoolean("allowCommands");
159 }
160 else
161 {
162 this.allowCommands = this.theGameType == EnumGameType.CREATIVE;
163 }
164
165 if (par1NBTTagCompound.hasKey("Player"))
166 {
167 this.playerTag = par1NBTTagCompound.getCompoundTag("Player");
168 this.dimension = this.playerTag.getInteger("Dimension");
169 }
170
171 if (par1NBTTagCompound.hasKey("GameRules"))
172 {
173 this.field_82577_x.func_82768_a(par1NBTTagCompound.getCompoundTag("GameRules"));
174 }
175 }
176
177 public WorldInfo(WorldSettings par1WorldSettings, String par2Str)
178 {
179 this.terrainType = WorldType.DEFAULT;
180 this.field_82576_c = "";
181 this.field_82577_x = new GameRules();
182 this.randomSeed = par1WorldSettings.getSeed();
183 this.theGameType = par1WorldSettings.getGameType();
184 this.mapFeaturesEnabled = par1WorldSettings.isMapFeaturesEnabled();
185 this.levelName = par2Str;
186 this.hardcore = par1WorldSettings.getHardcoreEnabled();
187 this.terrainType = par1WorldSettings.getTerrainType();
188 this.field_82576_c = par1WorldSettings.func_82749_j();
189 this.allowCommands = par1WorldSettings.areCommandsAllowed();
190 this.initialized = false;
191 }
192
193 public WorldInfo(WorldInfo par1WorldInfo)
194 {
195 this.terrainType = WorldType.DEFAULT;
196 this.field_82576_c = "";
197 this.field_82577_x = new GameRules();
198 this.randomSeed = par1WorldInfo.randomSeed;
199 this.terrainType = par1WorldInfo.terrainType;
200 this.field_82576_c = par1WorldInfo.field_82576_c;
201 this.theGameType = par1WorldInfo.theGameType;
202 this.mapFeaturesEnabled = par1WorldInfo.mapFeaturesEnabled;
203 this.spawnX = par1WorldInfo.spawnX;
204 this.spawnY = par1WorldInfo.spawnY;
205 this.spawnZ = par1WorldInfo.spawnZ;
206 this.field_82575_g = par1WorldInfo.field_82575_g;
207 this.worldTime = par1WorldInfo.worldTime;
208 this.lastTimePlayed = par1WorldInfo.lastTimePlayed;
209 this.sizeOnDisk = par1WorldInfo.sizeOnDisk;
210 this.playerTag = par1WorldInfo.playerTag;
211 this.dimension = par1WorldInfo.dimension;
212 this.levelName = par1WorldInfo.levelName;
213 this.saveVersion = par1WorldInfo.saveVersion;
214 this.rainTime = par1WorldInfo.rainTime;
215 this.raining = par1WorldInfo.raining;
216 this.thunderTime = par1WorldInfo.thunderTime;
217 this.thundering = par1WorldInfo.thundering;
218 this.hardcore = par1WorldInfo.hardcore;
219 this.allowCommands = par1WorldInfo.allowCommands;
220 this.initialized = par1WorldInfo.initialized;
221 this.field_82577_x = par1WorldInfo.field_82577_x;
222 }
223
224 /**
225 * Gets the NBTTagCompound for the worldInfo
226 */
227 public NBTTagCompound getNBTTagCompound()
228 {
229 NBTTagCompound var1 = new NBTTagCompound();
230 this.updateTagCompound(var1, this.playerTag);
231 return var1;
232 }
233
234 /**
235 * Creates a new NBTTagCompound for the world, with the given NBTTag as the "Player"
236 */
237 public NBTTagCompound cloneNBTCompound(NBTTagCompound par1NBTTagCompound)
238 {
239 NBTTagCompound var2 = new NBTTagCompound();
240 this.updateTagCompound(var2, par1NBTTagCompound);
241 return var2;
242 }
243
244 private void updateTagCompound(NBTTagCompound par1NBTTagCompound, NBTTagCompound par2NBTTagCompound)
245 {
246 par1NBTTagCompound.setLong("RandomSeed", this.randomSeed);
247 par1NBTTagCompound.setString("generatorName", this.terrainType.getWorldTypeName());
248 par1NBTTagCompound.setInteger("generatorVersion", this.terrainType.getGeneratorVersion());
249 par1NBTTagCompound.setString("generatorOptions", this.field_82576_c);
250 par1NBTTagCompound.setInteger("GameType", this.theGameType.getID());
251 par1NBTTagCompound.setBoolean("MapFeatures", this.mapFeaturesEnabled);
252 par1NBTTagCompound.setInteger("SpawnX", this.spawnX);
253 par1NBTTagCompound.setInteger("SpawnY", this.spawnY);
254 par1NBTTagCompound.setInteger("SpawnZ", this.spawnZ);
255 par1NBTTagCompound.setLong("Time", this.field_82575_g);
256 par1NBTTagCompound.setLong("DayTime", this.worldTime);
257 par1NBTTagCompound.setLong("SizeOnDisk", this.sizeOnDisk);
258 par1NBTTagCompound.setLong("LastPlayed", System.currentTimeMillis());
259 par1NBTTagCompound.setString("LevelName", this.levelName);
260 par1NBTTagCompound.setInteger("version", this.saveVersion);
261 par1NBTTagCompound.setInteger("rainTime", this.rainTime);
262 par1NBTTagCompound.setBoolean("raining", this.raining);
263 par1NBTTagCompound.setInteger("thunderTime", this.thunderTime);
264 par1NBTTagCompound.setBoolean("thundering", this.thundering);
265 par1NBTTagCompound.setBoolean("hardcore", this.hardcore);
266 par1NBTTagCompound.setBoolean("allowCommands", this.allowCommands);
267 par1NBTTagCompound.setBoolean("initialized", this.initialized);
268 par1NBTTagCompound.setCompoundTag("GameRules", this.field_82577_x.func_82770_a());
269
270 if (par2NBTTagCompound != null)
271 {
272 par1NBTTagCompound.setCompoundTag("Player", par2NBTTagCompound);
273 }
274 }
275
276 /**
277 * Returns the seed of current world.
278 */
279 public long getSeed()
280 {
281 return this.randomSeed;
282 }
283
284 /**
285 * Returns the x spawn position
286 */
287 public int getSpawnX()
288 {
289 return this.spawnX;
290 }
291
292 /**
293 * Return the Y axis spawning point of the player.
294 */
295 public int getSpawnY()
296 {
297 return this.spawnY;
298 }
299
300 /**
301 * Returns the z spawn position
302 */
303 public int getSpawnZ()
304 {
305 return this.spawnZ;
306 }
307
308 public long func_82573_f()
309 {
310 return this.field_82575_g;
311 }
312
313 /**
314 * Get current world time
315 */
316 public long getWorldTime()
317 {
318 return this.worldTime;
319 }
320
321 @SideOnly(Side.CLIENT)
322 public long getSizeOnDisk()
323 {
324 return this.sizeOnDisk;
325 }
326
327 /**
328 * Returns the player's NBTTagCompound to be loaded
329 */
330 public NBTTagCompound getPlayerNBTTagCompound()
331 {
332 return this.playerTag;
333 }
334
335 public int getDimension()
336 {
337 return this.dimension;
338 }
339
340 @SideOnly(Side.CLIENT)
341
342 /**
343 * Set the x spawn position to the passed in value
344 */
345 public void setSpawnX(int par1)
346 {
347 this.spawnX = par1;
348 }
349
350 @SideOnly(Side.CLIENT)
351
352 /**
353 * Sets the y spawn position
354 */
355 public void setSpawnY(int par1)
356 {
357 this.spawnY = par1;
358 }
359
360 public void func_82572_b(long par1)
361 {
362 this.field_82575_g = par1;
363 }
364
365 @SideOnly(Side.CLIENT)
366
367 /**
368 * Set the z spawn position to the passed in value
369 */
370 public void setSpawnZ(int par1)
371 {
372 this.spawnZ = par1;
373 }
374
375 /**
376 * Set current world time
377 */
378 public void setWorldTime(long par1)
379 {
380 this.worldTime = par1;
381 }
382
383 /**
384 * Sets the spawn zone position. Args: x, y, z
385 */
386 public void setSpawnPosition(int par1, int par2, int par3)
387 {
388 this.spawnX = par1;
389 this.spawnY = par2;
390 this.spawnZ = par3;
391 }
392
393 /**
394 * Get current world name
395 */
396 public String getWorldName()
397 {
398 return this.levelName;
399 }
400
401 public void setWorldName(String par1Str)
402 {
403 this.levelName = par1Str;
404 }
405
406 /**
407 * Returns the save version of this world
408 */
409 public int getSaveVersion()
410 {
411 return this.saveVersion;
412 }
413
414 /**
415 * Sets the save version of the world
416 */
417 public void setSaveVersion(int par1)
418 {
419 this.saveVersion = par1;
420 }
421
422 @SideOnly(Side.CLIENT)
423
424 /**
425 * Return the last time the player was in this world.
426 */
427 public long getLastTimePlayed()
428 {
429 return this.lastTimePlayed;
430 }
431
432 /**
433 * Returns true if it is thundering, false otherwise.
434 */
435 public boolean isThundering()
436 {
437 return this.thundering;
438 }
439
440 /**
441 * Sets whether it is thundering or not.
442 */
443 public void setThundering(boolean par1)
444 {
445 this.thundering = par1;
446 }
447
448 /**
449 * Returns the number of ticks until next thunderbolt.
450 */
451 public int getThunderTime()
452 {
453 return this.thunderTime;
454 }
455
456 /**
457 * Defines the number of ticks until next thunderbolt.
458 */
459 public void setThunderTime(int par1)
460 {
461 this.thunderTime = par1;
462 }
463
464 /**
465 * Returns true if it is raining, false otherwise.
466 */
467 public boolean isRaining()
468 {
469 return this.raining;
470 }
471
472 /**
473 * Sets whether it is raining or not.
474 */
475 public void setRaining(boolean par1)
476 {
477 this.raining = par1;
478 }
479
480 /**
481 * Return the number of ticks until rain.
482 */
483 public int getRainTime()
484 {
485 return this.rainTime;
486 }
487
488 /**
489 * Sets the number of ticks until rain.
490 */
491 public void setRainTime(int par1)
492 {
493 this.rainTime = par1;
494 }
495
496 /**
497 * Gets the GameType.
498 */
499 public EnumGameType getGameType()
500 {
501 return this.theGameType;
502 }
503
504 /**
505 * Get whether the map features (e.g. strongholds) generation is enabled or disabled.
506 */
507 public boolean isMapFeaturesEnabled()
508 {
509 return this.mapFeaturesEnabled;
510 }
511
512 /**
513 * Sets the GameType.
514 */
515 public void setGameType(EnumGameType par1EnumGameType)
516 {
517 this.theGameType = par1EnumGameType;
518 }
519
520 /**
521 * Returns true if hardcore mode is enabled, otherwise false
522 */
523 public boolean isHardcoreModeEnabled()
524 {
525 return this.hardcore;
526 }
527
528 public WorldType getTerrainType()
529 {
530 return this.terrainType;
531 }
532
533 public void setTerrainType(WorldType par1WorldType)
534 {
535 this.terrainType = par1WorldType;
536 }
537
538 public String func_82571_y()
539 {
540 return this.field_82576_c;
541 }
542
543 /**
544 * Returns true if commands are allowed on this World.
545 */
546 public boolean areCommandsAllowed()
547 {
548 return this.allowCommands;
549 }
550
551 /**
552 * Returns true if the World is initialized.
553 */
554 public boolean isInitialized()
555 {
556 return this.initialized;
557 }
558
559 /**
560 * Sets the initialization status of the World.
561 */
562 public void setServerInitialized(boolean par1)
563 {
564 this.initialized = par1;
565 }
566
567 public GameRules func_82574_x()
568 {
569 return this.field_82577_x;
570 }
571
572 /**
573 * Allow access to additional mod specific world based properties
574 * Used by FML to store mod list associated with a world, and maybe an id map
575 * Used by Forge to store the dimensions available to a world
576 * @param additionalProperties
577 */
578 public void setAdditionalProperties(Map<String,NBTBase> additionalProperties)
579 {
580 // one time set for this
581 if (this.additionalProperties == null)
582 {
583 this.additionalProperties = additionalProperties;
584 }
585 }
586
587 public NBTBase getAdditionalProperty(String additionalProperty)
588 {
589 return this.additionalProperties!=null? this.additionalProperties.get(additionalProperty) : null;
590 }
591 }