    001    package cpw.mods.fml.common.network;
    002
    003    import java.lang.annotation.ElementType;
    004    import java.lang.annotation.Retention;
    005    import java.lang.annotation.RetentionPolicy;
    006    import java.lang.annotation.Target;
    007
    008    import net.minecraft.src.Packet131MapData;
    009
    010    @Retention(RetentionPolicy.RUNTIME)
    011    @Target(ElementType.TYPE)
    012    public @interface NetworkMod
    013    {
    014        /**
    015         * Does this mod require the client side to be present when installed on a server?
    016         */
    017        boolean clientSideRequired() default false;
    018        /**
    019         * Does this mod require the server side to be present when installed on a client?
    020         */
    021        boolean serverSideRequired() default false;
    022        /**
    023         * A list of Packet250 network channels to register for this mod - these channels
    024         * will be universal and will require a universal packethandler to handle them
    025         */
    026        String[] channels() default {};
    027        /**
    028         * An optional range check for client to server communication version compatibility
    029         */
    030        String versionBounds() default "";
    031
    032        /**
    033         * A packet handler implementation for channels registered through this annotation
    034         * - this packet handler will be universal and handle both client and server
    035         * requests.
    036         */
    037        Class<? extends IPacketHandler> packetHandler() default NULL.class;
    038
    039        /**
    040         * A tiny packet handler implementation based on {@link Packet131MapData} for "small"
    041         * data packet loads.
    042         */
    043        Class<? extends ITinyPacketHandler> tinyPacketHandler() default NULL.class;
    044        /**
    045         * A connection handler implementation for this network mod
    046         */
    047        Class<? extends IConnectionHandler> connectionHandler() default NULL.class;
    048        /**
    049         * A packet handler and channels to register for the client side
    050         */
    051        SidedPacketHandler clientPacketHandlerSpec() default @SidedPacketHandler(channels = {}, packetHandler = NULL.class );
    052
    053        /**
    054         * A packet handler and channels to register for the server side
    055         */
    056        SidedPacketHandler serverPacketHandlerSpec() default @SidedPacketHandler(channels = {}, packetHandler = NULL.class );
    057
    058        /**
    059         * Special dummy class for handling stupid annotation default values
    060         * @author cpw
    061         *
    062         */
    063        static interface NULL extends IPacketHandler, IConnectionHandler, ITinyPacketHandler {};
    064
    065        /**
    066         * A marker for a method that will be offered the client's version string
    067         * if more sophisticated version rejection handling is required:
    068         * The method should accept a "String", a "NetworkManager" and return a boolean true
    069         * if the version can be accepted.
    070         * @author cpw
    071         *
    072         */
    073        @Retention(RetentionPolicy.RUNTIME)
    074        @Target(ElementType.METHOD)
    075        public @interface VersionCheckHandler { }
    076
    077        /**
    078         * Bundles together a packet handler and it's associated channels for the sided packet handlers
    079         * @author cpw
    080         *
    081         */
    082        public @interface SidedPacketHandler {
    083            String[] channels();
    084            Class<? extends IPacketHandler> packetHandler();
    085        }
    086
    087    }