001    package net.minecraftforge.common;
002    
003    import java.util.ArrayList;
004    import java.util.Hashtable;
005    import java.util.Map.Entry;
006    import java.util.logging.Level;
007    
008    import cpw.mods.fml.common.FMLCommonHandler;
009    
010    import net.minecraft.server.MinecraftServer;
011    import net.minecraft.src.*;
012    
013    public class DimensionManager
014    {
015        private static Hashtable<Integer, Class<? extends WorldProvider>> providers = new Hashtable<Integer, Class<? extends WorldProvider>>();
016        private static Hashtable<Integer, Boolean> spawnSettings = new Hashtable<Integer, Boolean>();
017        private static Hashtable<Integer, WorldServer> worlds = new Hashtable<Integer, WorldServer>();
018        private static boolean hasInit = false;
019        private static Hashtable<Integer, Integer> dimensions = new Hashtable<Integer, Integer>();
020    
021        public static boolean registerProviderType(int id, Class<? extends WorldProvider> provider, boolean keepLoaded)
022        {
023            if (providers.containsValue(id))
024            {
025                return false;
026            }
027            providers.put(id, provider);
028            spawnSettings.put(id, keepLoaded);
029            return true;
030        }
031    
032        public static void init()
033        {
034            if (hasInit)
035            {
036                return;
037            }
038            registerProviderType( 0, WorldProviderSurface.class, true);
039            registerProviderType(-1, WorldProviderHell.class,    true);
040            registerProviderType( 1, WorldProviderEnd.class,     false);
041            registerDimension( 0,  0);
042            registerDimension(-1, -1);
043            registerDimension( 1,  1);
044        }
045    
046        public static void registerDimension(int id, int providerType)
047        {
048            if (!providers.containsKey(providerType))
049            {
050                throw new IllegalArgumentException(String.format("Failed to register dimensiuon for id %d, provider type %d does not exist", id, providerType));
051            }
052            if (dimensions.containsKey(id))
053            {
054                throw new IllegalArgumentException(String.format("Failed to register dimensiuon for id %d, One is already registered", id));
055            }
056            dimensions.put(id, providerType);
057        }
058    
059        public static int getProviderType(int dim)
060        {
061            if (!dimensions.containsKey(dim))
062            {
063                throw new IllegalArgumentException(String.format("Could not get provider type for dimension %d, does not exist", dim));
064            }
065            return dimensions.get(dim);
066        }
067    
068        public static WorldProvider getProvider(int dim)
069        {
070            return getWorld(dim).provider;
071        }
072    
073        public static Integer[] getIDs()
074        {
075            return dimensions.keySet().toArray(new Integer[0]);
076        }
077    
078        public static void setWorld(int id, WorldServer world)
079        {
080            worlds.put(id, world);
081    
082            ArrayList<WorldServer> tmp = new ArrayList<WorldServer>();
083            tmp.add(worlds.get( 0));
084            tmp.add(worlds.get(-1));
085            tmp.add(worlds.get( 1));
086    
087            for (Entry<Integer, WorldServer> entry : worlds.entrySet())
088            {
089                int dim = entry.getKey();
090                if (dim >= -1 && dim <= 1)
091                {
092                    continue;
093                }
094                tmp.add(entry.getValue());
095            }
096    
097            MinecraftServer.getServer().worldServers = tmp.toArray(new WorldServer[0]);
098            MinecraftServer.getServer().worldTickTimes.put(id, new long[100]);
099        }
100    
101        public static WorldServer getWorld(int id)
102        {
103            return worlds.get(id);
104        }
105    
106        public static WorldServer[] getWorlds()
107        {
108            return worlds.values().toArray(new WorldServer[0]);
109        }
110    
111        public static boolean shouldLoadSpawn(int dim)
112        {
113            int id = getProviderType(dim);
114            return spawnSettings.contains(id) && spawnSettings.get(id);
115        }
116    
117        static
118        {
119            init();
120        }
121    
122        public static WorldProvider createProviderFor(int dim)
123        {
124            try
125            {
126                if (dimensions.containsKey(dim))
127                {
128                    WorldProvider provider = providers.get(getProviderType(dim)).newInstance();
129                    provider.setDimension(dim);
130                    return provider;
131                }
132                else
133                {
134                    return null;
135                }
136            } 
137            catch (Exception e)
138            {
139                FMLCommonHandler.instance().getFMLLogger().log(Level.SEVERE,String.format("An error occured trying to create an instance of WorldProvider %d (%s)",
140                        dim,
141                        providers.get(getProviderType(dim)).getSimpleName()),e);
142                throw new RuntimeException(e);
143            }
144        }
145    }