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().theWorldServer = 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 }