001 /*
002 * The FML Forge Mod Loader suite. Copyright (C) 2012 cpw
003 *
004 * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free
005 * Software Foundation; either version 2.1 of the License, or any later version.
006 *
007 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
008 * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
009 *
010 * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51
011 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
012 */
013 package cpw.mods.fml.server;
014
015 import java.util.List;
016
017 import com.google.common.collect.ImmutableList;
018 import com.google.common.collect.MapDifference;
019
020 import net.minecraft.entity.Entity;
021 import net.minecraft.network.INetworkManager;
022 import net.minecraft.network.packet.NetHandler;
023 import net.minecraft.network.packet.Packet;
024 import net.minecraft.network.packet.Packet131MapData;
025 import net.minecraft.server.MinecraftServer;
026 import net.minecraft.world.World;
027 import cpw.mods.fml.common.FMLCommonHandler;
028 import cpw.mods.fml.common.IFMLSidedHandler;
029 import cpw.mods.fml.common.Loader;
030 import cpw.mods.fml.common.ObfuscationReflectionHelper;
031 import cpw.mods.fml.common.network.EntitySpawnAdjustmentPacket;
032 import cpw.mods.fml.common.network.EntitySpawnPacket;
033 import cpw.mods.fml.common.network.ModMissingPacket;
034 import cpw.mods.fml.common.registry.EntityRegistry.EntityRegistration;
035 import cpw.mods.fml.common.registry.GameData;
036 import cpw.mods.fml.common.registry.GameRegistry;
037 import cpw.mods.fml.common.registry.ItemData;
038 import cpw.mods.fml.common.registry.LanguageRegistry;
039 import cpw.mods.fml.relauncher.Side;
040
041 /**
042 * Handles primary communication from hooked code into the system
043 *
044 * The FML entry point is {@link #beginServerLoading(MinecraftServer)} called from
045 * {@link net.minecraft.shared.DedicatedServer}
046 *
047 * Obfuscated code should focus on this class and other members of the "server"
048 * (or "client") code
049 *
050 * The actual mod loading is handled at arms length by {@link Loader}
051 *
052 * It is expected that a similar class will exist for each target environment:
053 * Bukkit and Client side.
054 *
055 * It should not be directly modified.
056 *
057 * @author cpw
058 *
059 */
060 public class FMLServerHandler implements IFMLSidedHandler
061 {
062 /**
063 * The singleton
064 */
065 private static final FMLServerHandler INSTANCE = new FMLServerHandler();
066
067 /**
068 * A reference to the server itself
069 */
070 private MinecraftServer server;
071
072 private FMLServerHandler()
073 {
074 FMLCommonHandler.instance().beginLoading(this);
075 }
076 /**
077 * Called to start the whole game off from
078 * {@link MinecraftServer#startServer}
079 *
080 * @param minecraftServer
081 */
082 public void beginServerLoading(MinecraftServer minecraftServer)
083 {
084 server = minecraftServer;
085 ObfuscationReflectionHelper.detectObfuscation(World.class);
086 Loader.instance().loadMods();
087 }
088
089 /**
090 * Called a bit later on during server initialization to finish loading mods
091 */
092 public void finishServerLoading()
093 {
094 Loader.instance().initializeMods();
095 LanguageRegistry.reloadLanguageTable();
096 GameData.initializeServerGate(1);
097 }
098
099 @Override
100 public void haltGame(String message, Throwable exception)
101 {
102 throw new RuntimeException(message, exception);
103 }
104
105 /**
106 * Get the server instance
107 */
108 public MinecraftServer getServer()
109 {
110 return server;
111 }
112
113 /**
114 * @return the instance
115 */
116 public static FMLServerHandler instance()
117 {
118 return INSTANCE;
119 }
120
121 /* (non-Javadoc)
122 * @see cpw.mods.fml.common.IFMLSidedHandler#getAdditionalBrandingInformation()
123 */
124 @Override
125 public List<String> getAdditionalBrandingInformation()
126 {
127 return ImmutableList.<String>of();
128 }
129
130 /* (non-Javadoc)
131 * @see cpw.mods.fml.common.IFMLSidedHandler#getSide()
132 */
133 @Override
134 public Side getSide()
135 {
136 return Side.SERVER;
137 }
138
139 @Override
140 public void showGuiScreen(Object clientGuiElement)
141 {
142
143 }
144
145 @Override
146 public Entity spawnEntityIntoClientWorld(EntityRegistration er, EntitySpawnPacket packet)
147 {
148 // NOOP
149 return null;
150 }
151
152 @Override
153 public void adjustEntityLocationOnClient(EntitySpawnAdjustmentPacket entitySpawnAdjustmentPacket)
154 {
155 // NOOP
156 }
157 @Override
158 public void sendPacket(Packet packet)
159 {
160 throw new RuntimeException("You cannot send a bare packet without a target on the server!");
161 }
162 @Override
163 public void displayMissingMods(ModMissingPacket modMissingPacket)
164 {
165 // NOOP on server
166 }
167 @Override
168 public void handleTinyPacket(NetHandler handler, Packet131MapData mapData)
169 {
170 // NOOP on server
171 }
172 @Override
173 public void setClientCompatibilityLevel(byte compatibilityLevel)
174 {
175 // NOOP on server
176 }
177 @Override
178 public byte getClientCompatibilityLevel()
179 {
180 return 0;
181 }
182
183 @Override
184 public boolean shouldServerShouldBeKilledQuietly()
185 {
186 return false;
187 }
188 @Override
189 public void disconnectIDMismatch(MapDifference<Integer, ItemData> s, NetHandler handler, INetworkManager mgr)
190 {
191
192 }
193 }