001 /* 002 * The FML Forge Mod Loader suite. 003 * Copyright (C) 2012 cpw 004 * 005 * 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 006 * Software Foundation; either version 2.1 of the License, or any later version. 007 * 008 * 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 009 * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 010 * 011 * 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 012 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 013 */ 014 package cpw.mods.fml.common; 015 016 import java.lang.annotation.ElementType; 017 import java.lang.annotation.Retention; 018 import java.lang.annotation.RetentionPolicy; 019 import java.lang.annotation.Target; 020 021 import net.minecraft.item.ItemBlock; 022 023 import cpw.mods.fml.common.event.FMLInterModComms; 024 import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage; 025 026 /** 027 * The new mod style in FML 1.3 028 * 029 * @author cpw 030 * 031 */ 032 @Retention(RetentionPolicy.RUNTIME) 033 @Target(ElementType.TYPE) 034 public @interface Mod 035 { 036 /** 037 * The unique mod identifier for this mod 038 */ 039 String modid(); 040 /** 041 * A user friendly name for the mod 042 */ 043 String name() default ""; 044 /** 045 * A version string for this mod 046 */ 047 String version() default ""; 048 /** 049 * A simple dependency string for this mod (see modloader's "priorities" string specification) 050 */ 051 String dependencies() default ""; 052 /** 053 * Whether to use the mcmod.info metadata by default for this mod. 054 * If true, settings in the mcmod.info file will override settings in these annotations. 055 */ 056 boolean useMetadata() default false; 057 058 /** 059 * The acceptable range of minecraft versions that this mod will load and run in 060 * The default ("empty string") indicates that only the current minecraft version is acceptable. 061 * FML will refuse to run with an error if the minecraft version is not in this range across all mods. 062 * @return A version range as specified by the maven version range specification or the empty string 063 */ 064 String acceptedMinecraftVersions() default ""; 065 /** 066 * An optional bukkit plugin that will be injected into the bukkit plugin framework if 067 * this mod is loaded into the FML framework and the bukkit coremod is present. 068 * Instances of the bukkit plugin can be obtained via the {@link BukkitPluginRef} annotation on fields. 069 * @return The name of the plugin to load for this mod 070 */ 071 String bukkitPlugin() default ""; 072 /** 073 * Mods that this mod will <strong>not</strong> load with. 074 * An optional comma separated string of (+|-)(*|modid[@value]) which specify mods that 075 * this mod will refuse to load with, resulting in the game failing to start. 076 * Entries can be prefixed with a + for a positive exclusion assertion, or - for a negative exclusion 077 * assertion. Asterisk is the wildcard and represents <strong>all</strong> mods. 078 * 079 * The <strong>only</strong> mods that cannot be excluded are FML and MCP, trivially. 080 * Other special values: 081 * <ul> 082 * <li>+f indicates that the mod will accept a minecraft forge environment.</li> 083 * <li>-* indicates that the mod will not accept any other mods.</li> 084 * </ul> 085 * 086 * Some examples: 087 * <ul> 088 * <li><em>-*,+f,+IronChest</em>: Will run only in a minecraft forge environment with the mod IronChests. 089 * The -* forces all mods to be excluded, then the +f and +IronChest add into the "allowed list".</li> 090 * <li><em>+f,-IC2</em>: Will run in a minecraft forge environment but will <strong>not</strong> run if 091 * IndustrialCraft 2 (IC2) is loaded alongside.</li> 092 * <li><em>-*</em>: Will not run if <strong>any</strong> othe mod is loaded except MCP/FML itself.</li> 093 * </ul> 094 * 095 * If a mod is present on the excluded list, the game will stop and show an error screen. If the 096 * class containing the {@link Mod} annotation has a "getCustomErrorException" method, it will be 097 * called to retrieve a custom error message for display in this case. If two mods have a declared 098 * exclusion which is matched, the screen that is shown is indeterminate. 099 * 100 * @return A string listing modids to exclude from loading with this mod. 101 */ 102 String modExclusionList() default ""; 103 /** 104 * Specifying this field allows for a mod to expect a signed jar with a fingerprint matching this value. 105 * The fingerprint should be SHA-1 encoded, lowercase with ':' removed. An empty value indicates that 106 * the mod is not expecting to be signed. 107 * 108 * Any incorrectness of the fingerprint, be it missing or wrong, will result in the {@link FingerprintWarning} 109 * method firing <i>prior to any other event on the mod</i>. 110 * 111 * @return A certificate fingerprint that is expected for this mod. 112 */ 113 String certificateFingerprint() default ""; 114 /** 115 * Mark the designated method as to be called at if there is something wrong with the certificate fingerprint of 116 * the mod's jar, or it is missing, or otherwise a problem. 117 * @author cpw 118 * 119 */ 120 @Retention(RetentionPolicy.RUNTIME) 121 @Target(ElementType.METHOD) 122 public @interface FingerprintWarning {} 123 /** 124 * Mark the designated method as being called at the "pre-initialization" phase 125 * @author cpw 126 * 127 */ 128 @Retention(RetentionPolicy.RUNTIME) 129 @Target(ElementType.METHOD) 130 public @interface PreInit {} 131 /** 132 * Mark the designated method as being called at the "initialization" phase 133 * @author cpw 134 * 135 */ 136 @Retention(RetentionPolicy.RUNTIME) 137 @Target(ElementType.METHOD) 138 public @interface Init {} 139 /** 140 * Mark the designated method as being called at the "post-initialization" phase 141 * @author cpw 142 * 143 */ 144 @Retention(RetentionPolicy.RUNTIME) 145 @Target(ElementType.METHOD) 146 public @interface PostInit {} 147 /** 148 * Mark the designated method as being called at the "server-starting" phase 149 * @author cpw 150 * 151 */ 152 @Retention(RetentionPolicy.RUNTIME) 153 @Target(ElementType.METHOD) 154 public @interface ServerStarting {} 155 /** 156 * Mark the designated method as being called at the "server-started" phase 157 * @author cpw 158 * 159 */ 160 @Retention(RetentionPolicy.RUNTIME) 161 @Target(ElementType.METHOD) 162 public @interface ServerStarted {} 163 /** 164 * Mark the designated method as being called at the "server-stopping" phase 165 * @author cpw 166 * 167 */ 168 @Retention(RetentionPolicy.RUNTIME) 169 @Target(ElementType.METHOD) 170 public @interface ServerStopping {} 171 /** 172 * Mark the designated method as being called at the "server-stopped" phase 173 * @author cpw 174 * 175 */ 176 @Retention(RetentionPolicy.RUNTIME) 177 @Target(ElementType.METHOD) 178 public @interface ServerStopped {} 179 /** 180 * Mark the designated method as the receiver for {@link FMLInterModComms} messages 181 * Called between {@link Init} and {@link PostInit} 182 * @author cpw 183 * 184 */ 185 @Retention(RetentionPolicy.RUNTIME) 186 @Target(ElementType.METHOD) 187 public @interface IMCCallback {} 188 /** 189 * Populate the annotated field with the mod instance. 190 * @author cpw 191 * 192 */ 193 @Retention(RetentionPolicy.RUNTIME) 194 @Target(ElementType.FIELD) 195 public @interface Instance { 196 /** 197 * The mod object to inject into this field 198 */ 199 String value() default ""; 200 } 201 /** 202 * Populate the annotated field with the mod's metadata. 203 * @author cpw 204 * 205 */ 206 @Retention(RetentionPolicy.RUNTIME) 207 @Target(ElementType.FIELD) 208 public @interface Metadata { 209 /** 210 * The mod id specifying the metadata to load here 211 */ 212 String value() default ""; 213 } 214 /** 215 * Populate the annotated field with an instance of the Block as specified 216 * @author cpw 217 * 218 */ 219 @Retention(RetentionPolicy.RUNTIME) 220 @Target(ElementType.FIELD) 221 public @interface Block { 222 /** 223 * The block's name 224 */ 225 String name(); 226 /** 227 * The associated ItemBlock subtype for the item (can be null for an ItemBlock) 228 */ 229 Class<?> itemTypeClass() default ItemBlock.class; 230 } 231 /** 232 * Populate the annotated field with an Item 233 * @author cpw 234 * 235 */ 236 @Retention(RetentionPolicy.RUNTIME) 237 @Target(ElementType.FIELD) 238 public @interface Item { 239 /** 240 * The name of the item 241 */ 242 String name(); 243 /** 244 * The type of the item 245 */ 246 String typeClass(); 247 } 248 }