# :-: 自動注冊
自動注冊將會是低版本開發者的福音,比如每次做一個新物品新方塊都要實例化注冊一次,這要是做了100個方塊物品什么的,一個一個注冊,這不得累死(一切為了偷懶!!),所以我自己搞了個一鍵全部注冊(目前僅支持Windows系統,這是教程唯一拿得出手的東西了),這次就把它分享了,以后做實體的時候會用到它。
1.12.2就有了全部注冊,寫1.12.2可以直接略過了(沒有興趣的也是)。
好的進入正題,在Mod主類旁邊創建一個新類regAll。
`src/main/java/net/xiaobang/bm/regAll.java`
~~~
package net.xiaobang.bm;
import cpw.mods.fml.common.registry.EntityRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class regAll {
private static int entityId = 0;
private static Object mod;
public regAll() {
}
public static void reg(String pos, String zc, Object mod, int trackingRange, int updateFrequency) {
regAll.mod = mod;
Class cl = mod.getClass();
try {
String str = new URL(cl.getResource("").getPath().split("!")[0]).getPath();
if (str.contains("file:/")) {
str = str.replace("file:/", "");
}
if (str.endsWith(".jar")) {
pos = cl.getPackage().getName().replaceAll("\\.", "/") + "/" + pos;
FileInputStream input = null;
try {
try {
input = new FileInputStream(str);
} catch (FileNotFoundException fileNotFoundException) {
fileNotFoundException.printStackTrace();
}
ZipInputStream zip = new ZipInputStream(new BufferedInputStream(input), StandardCharsets.UTF_8);
ZipEntry ze = null;
while (((ze = zip.getNextEntry()) != null)) {
if (ze.toString().contains(pos)) {
if (ze.toString() != pos) {
String[] ze2 = ze.toString().split("/");
for (int i = 0; i < ze2.length; i++) {
if (ze2[i].contains("class")) {
String ze3 = ze2[i].replace(".class", "");
try {
pos = pos.replaceAll("/", ".");
Class c = Class.forName(pos + ze3);
try {
if (zc.equalsIgnoreCase("Block")) {
Object obj = c.newInstance();
if (obj instanceof Block) {
registerblock((Block) obj, ze3);
}
} else if (zc.equalsIgnoreCase("Item")) {
Object obj = c.newInstance();
if (obj instanceof Item) {
registeritem((Item) obj, ze3);
}
} else if (zc.equalsIgnoreCase("Entity")) {
registerent(c, trackingRange, updateFrequency, ze3);
}
} catch (InstantiationException instantiationException) {
instantiationException.printStackTrace();
} catch (IllegalAccessException illegalAccessException) {
illegalAccessException.printStackTrace();
}
} catch (ClassNotFoundException classNotFoundException) {
classNotFoundException.printStackTrace();
}
}
}
}
}
}
} catch (IOException exception) {
exception.printStackTrace();
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
public static void registerblock(Block block, String name) {
GameRegistry.registerBlock(block, name);
}
public static void registeritem(Item item, String name) {
GameRegistry.registerItem(item, name);
}
public static void registerent(Class entityclass, int trackingRange, int updateFrequency, String entityName) {
EntityRegistry.registerModEntity(entityclass, entityName, entityId, mod, trackingRange, updateFrequency, true);
entityId++;
}
}
~~~
也許你看不懂,但不用管,抄它就完事了,注意這個東西只能用在編譯后的mod,不能是來自idea的
這里的構造函數的第一個參數pos是指你Mod中方塊們的位置,物品們的位置,實體們這些包的位置。
第二個參數zc是你要一次全部注冊的是要方塊,物品還是實體,如果為Block就注冊全部方塊,如果為Item就注冊全部物品,如果為Entity就注冊全部實體。
第三個參數mod是指你的mod的instance。
第四個參數和第五個參數,如果不是注冊實體的,可以隨便填
第四個參數是實體的trackingRange,指實體離玩家的距離更新,如果超過,就不更新(還沒學實體可以忽略)
第五個參數是實體的更新頻率,每幾個tick更新一次(20tick等于一秒)
使用例子:
使用的方法是:在CommonProxy文件中添加以下代碼:
`src/main/java/net/xiaobang/bm/common/CommonProxy.java`(部分)
~~~
public void preInit(FMLPreInitializationEvent event)
{
//new ItemLoader(event);
//new BlockLoader(event);這兩個已經不需要了,有更好的方法了
regAll.reg("bm","item/","Item",bm.instance,0,0);//一鍵注冊所有物品
regAll.reg("bm","block/","Block",bm.instance,0,0);//一鍵注冊所有方塊
}
//不要忘了導入regAll和主類哦
~~~
這下應該懂了吧,現在闊以把net.xiaobang.bm.loader包的文件全部刪除了,有了自動注冊,不需要這玩意。
(注意這玩意特別雞肋)