From 9a6b8a73bf6b857a7ac9b3d8beac769be47261b8 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Thu, 8 Dec 2022 16:24:50 +0800 Subject: [PATCH] Fix bukkit biome registry crash (#829) --- .../bridge/bukkit/SimpleRegistryBridge.java | 6 +++ .../common/mixin/bukkit/CraftBlockMixin.java | 15 ------- .../bukkit/Registry_SimpleRegistryMixin.java | 45 +++++++++++++++++++ .../common/mod/server/BukkitRegistry.java | 10 +++++ .../resources/mixins.arclight.bukkit.json | 1 + 5 files changed, 62 insertions(+), 15 deletions(-) create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/bridge/bukkit/SimpleRegistryBridge.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/Registry_SimpleRegistryMixin.java diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/bukkit/SimpleRegistryBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/bukkit/SimpleRegistryBridge.java new file mode 100644 index 00000000..48d163c3 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/bukkit/SimpleRegistryBridge.java @@ -0,0 +1,6 @@ +package io.izzel.arclight.common.bridge.bukkit; + +public interface SimpleRegistryBridge { + + void bridge$reload(); +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftBlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftBlockMixin.java index e4bcc79d..b3a325a3 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftBlockMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftBlockMixin.java @@ -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 registry, Holder base) { - return Biome.valueOf(ResourceLocationUtil.standardize(ForgeRegistries.BIOMES.getKey(base.value()))); - } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/Registry_SimpleRegistryMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/Registry_SimpleRegistryMixin.java new file mode 100644 index 00000000..39b84ad7 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/Registry_SimpleRegistryMixin.java @@ -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 & Keyed> implements SimpleRegistryBridge { + + @Shadow @Final @Mutable private Map map; + + private Runnable arclight$reloadCallback; + + @Inject(method = "(Ljava/lang/Class;Ljava/util/function/Predicate;)V", at = @At("RETURN")) + private void arclight$init(Class type, Predicate predicate, CallbackInfo ci) { + this.arclight$reloadCallback = () -> { + ImmutableMap.Builder 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(); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java index 3244164b..4e9ca859 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java @@ -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() { diff --git a/arclight-common/src/main/resources/mixins.arclight.bukkit.json b/arclight-common/src/main/resources/mixins.arclight.bukkit.json index ace18243..a2431d5c 100644 --- a/arclight-common/src/main/resources/mixins.arclight.bukkit.json +++ b/arclight-common/src/main/resources/mixins.arclight.bukkit.json @@ -45,6 +45,7 @@ "PluginClassLoaderMixin", "PotionEffectTypeMixin", "RecipeIteratorMixin", + "Registry_SimpleRegistryMixin", "WatchdogThreadMixin" ] } \ No newline at end of file