diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/asm/SwitchTableFixer.java b/arclight-common/src/main/java/io/izzel/arclight/common/asm/SwitchTableFixer.java index 64b7c2a0..447d36d0 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/asm/SwitchTableFixer.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/asm/SwitchTableFixer.java @@ -29,6 +29,7 @@ public class SwitchTableFixer implements Implementer { private static final Set ENUMS = ImmutableSet.builder() .add("org/bukkit/Material") .add("org/bukkit/entity/EntityType") + .add("org/bukkit/World$Environment") .build(); public byte[] processClass(byte[] bytes) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java index 670771c0..fac78759 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java @@ -353,6 +353,11 @@ public abstract class MinecraftServerMixin extends RecursiveEventLoop> MAT_CTOR = ImmutableList.of(int.class); private static final List> ENTITY_CTOR = ImmutableList.of(String.class, Class.class, int.class); + private static final List> ENV_CTOR = ImmutableList.of(int.class); private static final Map BY_NAME = getStatic(Material.class, "BY_NAME"); private static final Map BLOCK_MATERIAL = getStatic(CraftMagicNumbers.class, "BLOCK_MATERIAL"); private static final Map ITEM_MATERIAL = getStatic(CraftMagicNumbers.class, "ITEM_MATERIAL"); private static final Map MATERIAL_ITEM = getStatic(CraftMagicNumbers.class, "MATERIAL_ITEM"); private static final Map MATERIAL_BLOCK = getStatic(CraftMagicNumbers.class, "MATERIAL_BLOCK"); private static final Map ENTITY_NAME_MAP = getStatic(EntityType.class, "NAME_MAP"); + private static final Map ENVIRONMENT_MAP = getStatic(World.Environment.class, "lookup"); public static void registerAll() { CrashReportExtender.registerCrashCallable("Arclight", () -> new CraftCrashReport().call().toString()); @@ -56,6 +62,24 @@ public class BukkitRegistry { loadEntities(); } + public static void registerEnvironments() { + int i = World.Environment.values().length; + List newTypes = new ArrayList<>(); + for (DimensionType dimensionType : DimensionManager.getRegistry()) { + DimensionType actual = ((DimensionTypeBridge) dimensionType).bridge$getType(); + World.Environment environment = World.Environment.getEnvironment(actual.getId()); + if (environment == null) { + String name = ResourceLocationUtil.standardize(actual.getRegistryName()); + environment = EnumHelper.makeEnum(World.Environment.class, name, i++, ENV_CTOR, ImmutableList.of(actual.getId())); + newTypes.add(environment); + ENVIRONMENT_MAP.put(actual.getId(), environment); + ArclightMod.LOGGER.debug("Registered {} as entity {}", actual.getRegistryName(), environment); + } + } + EnumHelper.addEnums(World.Environment.class, newTypes); + ArclightMod.LOGGER.info("registry.environment", newTypes.size()); + } + private static void loadEntities() { int origin = EntityType.values().length; int i = origin; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRepo.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRepo.java index a3d1cadb..2a434fef 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRepo.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRepo.java @@ -7,6 +7,7 @@ import org.objectweb.asm.tree.ClassNode; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.net.URLClassLoader; import java.net.URLConnection; public class ClassLoaderRepo implements ClassRepo { @@ -19,7 +20,9 @@ public class ClassLoaderRepo implements ClassRepo { @Override public ClassNode findClass(String internalName) { - URL url = classLoader.getResource(internalName + ".class"); + URL url = classLoader instanceof URLClassLoader + ? ((URLClassLoader) classLoader).findResource(internalName + ".class") // search local + : classLoader.getResource(internalName + ".class"); if (url == null) return null; try { URLConnection connection = url.openConnection(); diff --git a/i18n-config/src/main/resources/META-INF/i18n/zh_cn.conf b/i18n-config/src/main/resources/META-INF/i18n/zh_cn.conf index f5462c0d..d3d21f67 100644 --- a/i18n-config/src/main/resources/META-INF/i18n/zh_cn.conf +++ b/i18n-config/src/main/resources/META-INF/i18n/zh_cn.conf @@ -52,6 +52,7 @@ registry { potion = "注册了 {} 个新的药水效果" material = "注册了 {} 个材料,其中 {} 个方块 {} 个物品" entity-type = "注册了 {} 个新的生物类型" + environment = "注册了 {} 个新的世界类型" meta-type { not-subclass = "{} 不是 {} 的子类" error = "{} 提供的 itemMetaType {} 无效: {}"