Fix NPE loading fluids (#1017)

This commit is contained in:
IzzelAliz 2023-06-22 17:49:36 +08:00
parent 9a74e443cd
commit 381d0134a0
3 changed files with 36 additions and 2 deletions

View File

@ -1,8 +1,19 @@
package io.izzel.arclight.common.mixin.bukkit;
import com.google.common.collect.BiMap;
import org.bukkit.craftbukkit.v.util.CraftMagicNumbers;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(CraftMagicNumbers.class)
@Mixin(value = CraftMagicNumbers.class, remap = false)
public class CraftMagicNumbersMixin {
@Redirect(method = "<clinit>", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/BiMap;put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"))
private static <K, V> V arclight$skip(BiMap<K, V> instance, K k, V v) {
if (v == null) {
return null;
}
return instance.put(k, v);
}
}

View File

@ -38,6 +38,7 @@ import net.minecraft.world.item.crafting.CookingBookCategory;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.dimension.LevelStem;
import net.minecraft.world.level.material.Fluid;
import net.minecraftforge.fml.CrashReportCallables;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.ForgeRegistry;
@ -95,6 +96,7 @@ public class BukkitRegistry {
private static final Map<String, Art> ART_BY_NAME = Unsafe.getStatic(Art.class, "BY_NAME");
private static final Map<Integer, Art> ART_BY_ID = Unsafe.getStatic(Art.class, "BY_ID");
private static final BiMap<ResourceLocation, Statistic> STATS = HashBiMap.create(Unsafe.getStatic(CraftStatistic.class, "statistics"));
private static final BiMap<Fluid, org.bukkit.Fluid> FLUIDTYPE_FLUID = Unsafe.getStatic(CraftMagicNumbers.class, "FLUIDTYPE_FLUID");
public static void registerAll(DedicatedServer console) {
CrashReportCallables.registerCrashCallable("Arclight Release", ArclightVersion.current()::getReleaseName);
@ -110,6 +112,7 @@ public class BukkitRegistry {
loadSpawnCategory();
loadEndDragonPhase();
loadCookingBookCategory();
loadFluids();
try {
for (var field : org.bukkit.Registry.class.getFields()) {
if (Modifier.isStatic(field.getModifiers()) && field.get(null) instanceof org.bukkit.Registry.SimpleRegistry<?> registry) {
@ -120,6 +123,25 @@ public class BukkitRegistry {
}
}
private static void loadFluids() {
var id = org.bukkit.Fluid.values().length;
var newTypes = new ArrayList<org.bukkit.Fluid>();
Field keyField = Arrays.stream(org.bukkit.Fluid.class.getDeclaredFields()).filter(it -> it.getName().equals("key")).findAny().orElse(null);
long keyOffset = Unsafe.objectFieldOffset(keyField);
for (var fluidType : ForgeRegistries.FLUIDS) {
if (!FLUIDTYPE_FLUID.containsKey(fluidType)) {
var key = ForgeRegistries.FLUIDS.getKey(fluidType);
var name = ResourceLocationUtil.standardize(key);
var bukkit = EnumHelper.makeEnum(org.bukkit.Fluid.class, name, id++, List.of(), List.of());
Unsafe.putObject(bukkit, keyOffset, CraftNamespacedKey.fromMinecraft(key));
newTypes.add(bukkit);
FLUIDTYPE_FLUID.put(fluidType, bukkit);
ArclightMod.LOGGER.debug("Registered {} as fluid {}", key, bukkit);
}
}
EnumHelper.addEnums(org.bukkit.Fluid.class, newTypes);
}
private static void loadCookingBookCategory() {
var id = CookingBookCategory.values().length;
var newTypes = new ArrayList<org.bukkit.inventory.recipe.CookingBookCategory>();

View File

@ -21,7 +21,8 @@ public class EnumDefinalizer implements Implementer {
"org/bukkit/inventory/CreativeCategory",
"org/bukkit/entity/SpawnCategory",
"org/bukkit/entity/EnderDragon$Phase",
"org/bukkit/inventory/recipe/CookingBookCategory"
"org/bukkit/inventory/recipe/CookingBookCategory",
"org/bukkit/Fluid"
);
@Override