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