    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 net.minecraft.server.MinecraftServer;
    018    import net.minecraft.src.Entity;
    019    import net.minecraft.src.NetClientHandler;
    020    import net.minecraft.src.NetHandler;
    021    import net.minecraft.src.Packet;
    022    import net.minecraft.src.Packet131MapData;
    023    import net.minecraft.src.World;
    024    import cpw.mods.fml.common.FMLCommonHandler;
    025    import cpw.mods.fml.common.IFMLSidedHandler;
    026    import cpw.mods.fml.common.Loader;
    027    import cpw.mods.fml.common.ObfuscationReflectionHelper;
    028    import cpw.mods.fml.common.Side;
    029    import cpw.mods.fml.common.network.EntitySpawnAdjustmentPacket;
    030    import cpw.mods.fml.common.network.EntitySpawnPacket;
    031    import cpw.mods.fml.common.network.ModMissingPacket;
    032    import cpw.mods.fml.common.registry.EntityRegistry.EntityRegistration;
    033    import cpw.mods.fml.common.registry.LanguageRegistry;
    034
    035    /**
    036     * Handles primary communication from hooked code into the system
    037     *
    038     * The FML entry point is {@link #beginServerLoading(MinecraftServer)} called from
    039     * {@link DedicatedServer}
    040     *
    041     * Obfuscated code should focus on this class and other members of the "server"
    042     * (or "client") code
    043     *
    044     * The actual mod loading is handled at arms length by {@link Loader}
    045     *
    046     * It is expected that a similar class will exist for each target environment:
    047     * Bukkit and Client side.
    048     *
    049     * It should not be directly modified.
    050     *
    051     * @author cpw
    052     *
    053     */
    054    public class FMLServerHandler implements IFMLSidedHandler
    055    {
    056        /**
    057         * The singleton
    058         */
    059        private static final FMLServerHandler INSTANCE = new FMLServerHandler();
    060
    061        /**
    062         * A reference to the server itself
    063         */
    064        private MinecraftServer server;
    065
    066        private FMLServerHandler()
    067        {
    068            FMLCommonHandler.instance().beginLoading(this);
    069        }
    070        /**
    071         * Called to start the whole game off from
    072         * {@link MinecraftServer#startServer}
    073         *
    074         * @param minecraftServer
    075         */
    076        public void beginServerLoading(MinecraftServer minecraftServer)
    077        {
    078            server = minecraftServer;
    079            ObfuscationReflectionHelper.detectObfuscation(World.class);
    080            Loader.instance().loadMods();
    081        }
    082
    083        /**
    084         * Called a bit later on during server initialization to finish loading mods
    085         */
    086        public void finishServerLoading()
    087        {
    088            Loader.instance().initializeMods();
    089            LanguageRegistry.reloadLanguageTable();
    090        }
    091
    092        @Override
    093        public void haltGame(String message, Throwable exception)
    094        {
    095            throw new RuntimeException(message, exception);
    096        }
    097
    098        /**
    099         * Get the server instance
    100         */
    101        public MinecraftServer getServer()
    102        {
    103            return server;
    104        }
    105
    106        /**
    107         * @return the instance
    108         */
    109        public static FMLServerHandler instance()
    110        {
    111            return INSTANCE;
    112        }
    113
    114        /* (non-Javadoc)
    115         * @see cpw.mods.fml.common.IFMLSidedHandler#getAdditionalBrandingInformation()
    116         */
    117        @Override
    118        public List<String> getAdditionalBrandingInformation()
    119        {
    120            return null;
    121        }
    122
    123        /* (non-Javadoc)
    124         * @see cpw.mods.fml.common.IFMLSidedHandler#getSide()
    125         */
    126        @Override
    127        public Side getSide()
    128        {
    129            return Side.SERVER;
    130        }
    131
    132        @Override
    133        public void showGuiScreen(Object clientGuiElement)
    134        {
    135
    136        }
    137
    138        @Override
    139        public Entity spawnEntityIntoClientWorld(EntityRegistration er, EntitySpawnPacket packet)
    140        {
    141            // NOOP
    142            return null;
    143        }
    144
    145        @Override
    146        public void adjustEntityLocationOnClient(EntitySpawnAdjustmentPacket entitySpawnAdjustmentPacket)
    147        {
    148            // NOOP
    149        }
    150        @Override
    151        public void sendPacket(Packet packet)
    152        {
    153            throw new RuntimeException("You cannot send a bare packet without a target on the server!");
    154        }
    155        @Override
    156        public void displayMissingMods(ModMissingPacket modMissingPacket)
    157        {
    158            // NOOP on server
    159        }
    160        @Override
    161        public void handleTinyPacket(NetHandler handler, Packet131MapData mapData)
    162        {
    163            // NOOP on server
    164        }
    165        @Override
    166        public void setClientCompatibilityLevel(byte compatibilityLevel)
    167        {
    168            // NOOP on server
    169        }
    170        @Override
    171        public byte getClientCompatibilityLevel()
    172        {
    173            return 0;
    174        }
    175    }