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()
.add("org/bukkit/Material")
.add("org/bukkit/entity/EntityType")
.add("org/bukkit/World$Environment")
.build();
public byte[] processClass(byte[] bytes) {

View File

@ -353,6 +353,11 @@ public abstract class MinecraftServerMixin extends RecursiveEventLoop<TickDelaye
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"))
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) {

View File

@ -6,6 +6,7 @@ import io.izzel.arclight.api.EnumHelper;
import io.izzel.arclight.api.Unsafe;
import io.izzel.arclight.common.bridge.bukkit.EntityTypeBridge;
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.util.ResourceLocationUtil;
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.potion.Effect;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.dimension.DimensionType;
import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.fml.CrashReportExtender;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.ForgeRegistry;
import net.minecraftforge.registries.IForgeRegistry;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.World;
import org.bukkit.craftbukkit.v.CraftCrashReport;
import org.bukkit.craftbukkit.v.enchantments.CraftEnchantment;
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<?>> 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<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<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<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() {
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<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() {
int origin = EntityType.values().length;
int i = origin;

View File

@ -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();

View File

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