AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
# :-: 自动注册 自动注册将会是低版本开发者的福音,比如每次做一个新物品新方块都要实例化注册一次,这要是做了100个方块物品什么的,一个一个注册,这不得累死(一切为了偷懒!!),所以我自己搞了个一键全部注册(目前仅支持Windows系统,这是教程唯一拿得出手的东西了)![](https://i.vgy.me/T5VWim.jpg),这次就把它分享了,以后做实体的时候会用到它。 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的![](https://i.vgy.me/zAiIe4.png) 这里的构造函数的第一个参数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和主类哦 ~~~ 这下应该懂了吧![](https://i.vgy.me/26Gkm0.png),现在阔以把net.xiaobang.bm.loader包的文件全部删除了,有了自动注册,不需要这玩意。 (注意这玩意特别鸡肋)