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