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; package io.izzel.arclight.common.mixin.bukkit;
import io.izzel.arclight.common.bridge.bukkit.MaterialBridge; 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.Material;
import org.bukkit.block.Biome;
import org.bukkit.block.BlockState; import org.bukkit.block.BlockState;
import org.bukkit.craftbukkit.v.block.CraftBlock; import org.bukkit.craftbukkit.v.block.CraftBlock;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
@ -30,13 +24,4 @@ public abstract class CraftBlockMixin {
cir.setReturnValue(bridge.bridge$blockStateFactory().apply((CraftBlock) (Object) this)); 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.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.bukkit.SimpleRegistryBridge;
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.types.ArclightEnchantment; import io.izzel.arclight.common.mod.util.types.ArclightEnchantment;
@ -62,6 +63,7 @@ import org.bukkit.potion.PotionEffectType;
import org.bukkit.potion.PotionType; import org.bukkit.potion.PotionType;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
@ -108,6 +110,14 @@ public class BukkitRegistry {
loadCreativeTab(); loadCreativeTab();
loadSpawnCategory(); loadSpawnCategory();
loadEndDragonPhase(); 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() { private static void loadEndDragonPhase() {

View File

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