Register environments for Bukkit.
This commit is contained in:
parent
9d1be58b04
commit
4079a7f421
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -52,6 +52,7 @@ registry {
|
|||
potion = "注册了 {} 个新的药水效果"
|
||||
material = "注册了 {} 个材料,其中 {} 个方块 {} 个物品"
|
||||
entity-type = "注册了 {} 个新的生物类型"
|
||||
environment = "注册了 {} 个新的世界类型"
|
||||
meta-type {
|
||||
not-subclass = "{} 不是 {} 的子类"
|
||||
error = "{} 提供的 itemMetaType {} 无效: {}"
|
||||
|
|
Loading…
Reference in New Issue
Block a user