diff --git a/src/main/java/org/moddingx/libx/impl/registration/RegistrationDispatcher.java b/src/main/java/org/moddingx/libx/impl/registration/RegistrationDispatcher.java index f05570e9..2cf737ca 100644 --- a/src/main/java/org/moddingx/libx/impl/registration/RegistrationDispatcher.java +++ b/src/main/java/org/moddingx/libx/impl/registration/RegistrationDispatcher.java @@ -1,5 +1,7 @@ package org.moddingx.libx.impl.registration; +import net.minecraft.core.MappedRegistry; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; @@ -89,7 +91,12 @@ public void register(@Nullable ResourceKey> registry, RegistrationContext ctx = new RegistrationContext(this.mod, rl, resourceKey); List failedConditions = this.conditions.stream().filter(condition -> !condition.shouldRegister(ctx, value)).toList(); - if (!failedConditions.isEmpty()) return; + if (!failedConditions.isEmpty()) { + if (registry != null) { + cleanupIntrusiveHolder(registry, value); + } + return; + } EntryCollectorImpl collector = new EntryCollectorImpl(this, id); @@ -144,6 +151,14 @@ private void registerClient(FMLClientSetupEvent event) { this.runRegistration(); this.registerables.forEach(reg -> reg.registerClient(event::enqueueWork)); } + + @SuppressWarnings("unchecked") + private static void cleanupIntrusiveHolder(ResourceKey> registryKey, T value) { + Registry registry = (Registry) BuiltInRegistries.REGISTRY.get(registryKey.location()); + if (registry instanceof MappedRegistry mappedRegistry && mappedRegistry.unregisteredIntrusiveHolders != null) { + mappedRegistry.unregisteredIntrusiveHolders.remove(value); + } + } private record NamedRegisterable(RegistrationContext ctx, Registerable value) { @@ -176,7 +191,7 @@ public List, Object>> values() { return Collections.unmodifiableList(this.values); } } - + // Safely reference the client only methods from registerable private static class RegisterableClientAdapter {