# :-: 自动注册
自动注册将会是低版本开发者的福音,比如每次做一个新物品新方块都要实例化注册一次,这要是做了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包的文件全部删除了,有了自动注册,不需要这玩意。
(注意这玩意特别鸡肋)
