Fix bukkit biome registry crash (#829)

This commit is contained in:
IzzelAliz 2022-12-08 16:24:50 +08:00
parent b8adaabac5
commit 9a6b8a73bf
No known key found for this signature in database
GPG Key ID: EE50E123A11D8338
5 changed files with 62 additions and 15 deletions

View File

@ -0,0 +1,6 @@
package io.izzel.arclight.common.bridge.bukkit;
public interface SimpleRegistryBridge {
void bridge$reload();
}

View File

@ -1,16 +1,10 @@
package io.izzel.arclight.common.mixin.bukkit;
import io.izzel.arclight.common.bridge.bukkit.MaterialBridge;
import io.izzel.arclight.common.mod.util.ResourceLocationUtil;
import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
import net.minecraftforge.registries.ForgeRegistries;
import org.bukkit.Material;
import org.bukkit.block.Biome;
import org.bukkit.block.BlockState;
import org.bukkit.craftbukkit.v.block.CraftBlock;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
@ -30,13 +24,4 @@ public abstract class CraftBlockMixin {
cir.setReturnValue(bridge.bridge$blockStateFactory().apply((CraftBlock) (Object) this));
}
}
/**
* @author IzzelAliz
* @reason
*/
@Overwrite
public static Biome biomeBaseToBiome(Registry<net.minecraft.world.level.biome.Biome> registry, Holder<net.minecraft.world.level.biome.Biome> base) {
return Biome.valueOf(ResourceLocationUtil.standardize(ForgeRegistries.BIOMES.getKey(base.value())));
}
}

View File

@ -0,0 +1,45 @@
package io.izzel.arclight.common.mixin.bukkit;
import com.google.common.collect.ImmutableMap;
import io.izzel.arclight.common.bridge.bukkit.SimpleRegistryBridge;
import org.bukkit.Keyed;
import org.bukkit.NamespacedKey;
import org.bukkit.Registry;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.Map;
import java.util.function.Predicate;
@Mixin(Registry.SimpleRegistry.class)
public class Registry_SimpleRegistryMixin<T extends Enum<T> & Keyed> implements SimpleRegistryBridge {
@Shadow @Final @Mutable private Map<NamespacedKey, T> map;
private Runnable arclight$reloadCallback;
@Inject(method = "<init>(Ljava/lang/Class;Ljava/util/function/Predicate;)V", at = @At("RETURN"))
private void arclight$init(Class<T> type, Predicate<T> predicate, CallbackInfo ci) {
this.arclight$reloadCallback = () -> {
ImmutableMap.Builder<NamespacedKey, T> builder = ImmutableMap.builder();
for (T entry : type.getEnumConstants()) {
if (predicate.test(entry)) {
builder.put(entry.getKey(), entry);
}
}
map = builder.build();
};
}
@Override
public void bridge$reload() {
this.arclight$reloadCallback.run();
}
}

View File

@ -10,6 +10,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.bukkit.SimpleRegistryBridge;
import io.izzel.arclight.common.mod.ArclightMod;
import io.izzel.arclight.common.mod.util.ResourceLocationUtil;
import io.izzel.arclight.common.mod.util.types.ArclightEnchantment;
@ -62,6 +63,7 @@ import org.bukkit.potion.PotionEffectType;
import org.bukkit.potion.PotionType;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@ -108,6 +110,14 @@ public class BukkitRegistry {
loadCreativeTab();
loadSpawnCategory();
loadEndDragonPhase();
try {
for (var field : org.bukkit.Registry.class.getFields()) {
if (Modifier.isStatic(field.getModifiers()) && field.get(null) instanceof org.bukkit.Registry.SimpleRegistry<?> registry) {
((SimpleRegistryBridge) (Object) registry).bridge$reload();
}
}
} catch (Throwable ignored) {
}
}
private static void loadEndDragonPhase() {

View File

@ -45,6 +45,7 @@
"PluginClassLoaderMixin",
"PotionEffectTypeMixin",
"RecipeIteratorMixin",
"Registry_SimpleRegistryMixin",
"WatchdogThreadMixin"
]
}