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    }