Register environments for Bukkit.

This commit is contained in:
IzzelAliz 2020-07-17 20:56:04 +08:00
parent 9d1be58b04
commit 4079a7f421
5 changed files with 35 additions and 1 deletions

View File

@ -29,6 +29,7 @@ public class SwitchTableFixer implements Implementer {
private static final Set<String> ENUMS = ImmutableSet.<String>builder() private static final Set<String> ENUMS = ImmutableSet.<String>builder()
.add("org/bukkit/Material") .add("org/bukkit/Material")
.add("org/bukkit/entity/EntityType") .add("org/bukkit/entity/EntityType")
.add("org/bukkit/World$Environment")
.build(); .build();
public byte[] processClass(byte[] bytes) { public byte[] processClass(byte[] bytes) {

View File

@ -353,6 +353,11 @@ public abstract class MinecraftServerMixin extends RecursiveEventLoop<TickDelaye
if (this.forceTicks) cir.setReturnValue(true); if (this.forceTicks) cir.setReturnValue(true);
} }
@Inject(method = "loadWorlds", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraftforge/common/DimensionManager;fireRegister()V", remap = false))
private void arclight$registerEnv(SaveHandler saveHandlerIn, WorldInfo info, WorldSettings worldSettingsIn, IChunkStatusListener chunkStatusListenerIn, CallbackInfo ci) {
BukkitRegistry.registerEnvironments();
}
@Inject(method = "loadWorlds", locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/server/MinecraftServer;func_213204_a(Lnet/minecraft/world/storage/DimensionSavedDataManager;)V")) @Inject(method = "loadWorlds", locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/server/MinecraftServer;func_213204_a(Lnet/minecraft/world/storage/DimensionSavedDataManager;)V"))
private void arclight$worldInit(SaveHandler p_213194_1_, WorldInfo info, WorldSettings p_213194_3_, IChunkStatusListener p_213194_4_, CallbackInfo ci, ServerWorld serverWorld) { private void arclight$worldInit(SaveHandler p_213194_1_, WorldInfo info, WorldSettings p_213194_3_, IChunkStatusListener p_213194_4_, CallbackInfo ci, ServerWorld serverWorld) {
if (((CraftServer) Bukkit.getServer()).scoreboardManager == null) { if (((CraftServer) Bukkit.getServer()).scoreboardManager == null) {

View File

@ -6,6 +6,7 @@ import io.izzel.arclight.api.EnumHelper;
import io.izzel.arclight.api.Unsafe; import io.izzel.arclight.api.Unsafe;
import io.izzel.arclight.common.bridge.bukkit.EntityTypeBridge; import io.izzel.arclight.common.bridge.bukkit.EntityTypeBridge;
import io.izzel.arclight.common.bridge.bukkit.MaterialBridge; import io.izzel.arclight.common.bridge.bukkit.MaterialBridge;
import io.izzel.arclight.common.bridge.world.dimension.DimensionTypeBridge;
import io.izzel.arclight.common.mod.ArclightMod; import io.izzel.arclight.common.mod.ArclightMod;
import io.izzel.arclight.common.mod.util.ResourceLocationUtil; import io.izzel.arclight.common.mod.util.ResourceLocationUtil;
import io.izzel.arclight.common.mod.util.potion.ArclightPotionEffect; import io.izzel.arclight.common.mod.util.potion.ArclightPotionEffect;
@ -16,12 +17,15 @@ import net.minecraft.block.Block;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.potion.Effect; import net.minecraft.potion.Effect;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.world.dimension.DimensionType;
import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.fml.CrashReportExtender; import net.minecraftforge.fml.CrashReportExtender;
import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.ForgeRegistry; import net.minecraftforge.registries.ForgeRegistry;
import net.minecraftforge.registries.IForgeRegistry; import net.minecraftforge.registries.IForgeRegistry;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.bukkit.World;
import org.bukkit.craftbukkit.v.CraftCrashReport; import org.bukkit.craftbukkit.v.CraftCrashReport;
import org.bukkit.craftbukkit.v.enchantments.CraftEnchantment; import org.bukkit.craftbukkit.v.enchantments.CraftEnchantment;
import org.bukkit.craftbukkit.v.util.CraftMagicNumbers; import org.bukkit.craftbukkit.v.util.CraftMagicNumbers;
@ -41,12 +45,14 @@ public class BukkitRegistry {
private static final List<Class<?>> MAT_CTOR = ImmutableList.of(int.class); private static final List<Class<?>> MAT_CTOR = ImmutableList.of(int.class);
private static final List<Class<?>> ENTITY_CTOR = ImmutableList.of(String.class, Class.class, int.class); private static final List<Class<?>> ENTITY_CTOR = ImmutableList.of(String.class, Class.class, int.class);
private static final List<Class<?>> ENV_CTOR = ImmutableList.of(int.class);
private static final Map<String, Material> BY_NAME = getStatic(Material.class, "BY_NAME"); private static final Map<String, Material> BY_NAME = getStatic(Material.class, "BY_NAME");
private static final Map<Block, Material> BLOCK_MATERIAL = getStatic(CraftMagicNumbers.class, "BLOCK_MATERIAL"); private static final Map<Block, Material> BLOCK_MATERIAL = getStatic(CraftMagicNumbers.class, "BLOCK_MATERIAL");
private static final Map<Item, Material> ITEM_MATERIAL = getStatic(CraftMagicNumbers.class, "ITEM_MATERIAL"); private static final Map<Item, Material> ITEM_MATERIAL = getStatic(CraftMagicNumbers.class, "ITEM_MATERIAL");
private static final Map<Material, Item> MATERIAL_ITEM = getStatic(CraftMagicNumbers.class, "MATERIAL_ITEM"); private static final Map<Material, Item> MATERIAL_ITEM = getStatic(CraftMagicNumbers.class, "MATERIAL_ITEM");
private static final Map<Material, Block> MATERIAL_BLOCK = getStatic(CraftMagicNumbers.class, "MATERIAL_BLOCK"); private static final Map<Material, Block> MATERIAL_BLOCK = getStatic(CraftMagicNumbers.class, "MATERIAL_BLOCK");
private static final Map<String, EntityType> ENTITY_NAME_MAP = getStatic(EntityType.class, "NAME_MAP"); private static final Map<String, EntityType> ENTITY_NAME_MAP = getStatic(EntityType.class, "NAME_MAP");
private static final Map<Integer, World.Environment> ENVIRONMENT_MAP = getStatic(World.Environment.class, "lookup");
public static void registerAll() { public static void registerAll() {
CrashReportExtender.registerCrashCallable("Arclight", () -> new CraftCrashReport().call().toString()); CrashReportExtender.registerCrashCallable("Arclight", () -> new CraftCrashReport().call().toString());
@ -56,6 +62,24 @@ public class BukkitRegistry {
loadEntities(); loadEntities();
} }
public static void registerEnvironments() {
int i = World.Environment.values().length;
List<World.Environment> 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() { private static void loadEntities() {
int origin = EntityType.values().length; int origin = EntityType.values().length;
int i = origin; int i = origin;

View File

@ -7,6 +7,7 @@ import org.objectweb.asm.tree.ClassNode;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLConnection; import java.net.URLConnection;
public class ClassLoaderRepo implements ClassRepo { public class ClassLoaderRepo implements ClassRepo {
@ -19,7 +20,9 @@ public class ClassLoaderRepo implements ClassRepo {
@Override @Override
public ClassNode findClass(String internalName) { 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; if (url == null) return null;
try { try {
URLConnection connection = url.openConnection(); URLConnection connection = url.openConnection();

View File

@ -52,6 +52,7 @@ registry {
potion = "注册了 {} 个新的药水效果" potion = "注册了 {} 个新的药水效果"
material = "注册了 {} 个材料,其中 {} 个方块 {} 个物品" material = "注册了 {} 个材料,其中 {} 个方块 {} 个物品"
entity-type = "注册了 {} 个新的生物类型" entity-type = "注册了 {} 个新的生物类型"
environment = "注册了 {} 个新的世界类型"
meta-type { meta-type {
not-subclass = "{} 不是 {} 的子类" not-subclass = "{} 不是 {} 的子类"
error = "{} 提供的 itemMetaType {} 无效: {}" error = "{} 提供的 itemMetaType {} 无效: {}"