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 }