ForgifiedFabricAPI icon indicating copy to clipboard operation
ForgifiedFabricAPI copied to clipboard

Incompatibility between Connector and SpongeNeo due to RecipeManager missing in ResourceManagerHelperImpl#sort listeners

Open Sam-Chai opened this issue 4 months ago • 0 comments

Minecraft version

1.21.1

Describe the bug

When running Connector (2.0.0-beta.8) together with SpongeNeo on Forge 1.21.1 using Forgified Fabric API, the server fails resource reloads because ResourceManagerHelperImpl#getWrapperLookup cannot find a RecipeManager in the reload listeners list. This happens because SpongeNeo’s reload listener handling changes the order and contents of the listener list before Connector/FAPI processing, so the vanilla RecipeManager is no longer present when FAPI sorts listeners.

Steps to reproduce

  1. Install connector on a SpongeNeo server
  2. Add some fabric mod such as betterend
  3. Then crashed cause the No RecipeManager found in listeners!

...

Logs

https://gist.github.com/Sam-Chai/308356f2317c3ff77194950dd3956b4f

Additional context

From the begining I found that it seems like connector caused this problem. But when I check the crash-report, I notice that this crash from the FFAPI. The issue from connector: https://github.com/Sinytra/Connector/issues/1911

Cause ResourceManagerHelperImpl#sort(List<PreparableReloadListener>) assumes the provided list always contains a RecipeManager instance (vanilla behavior). SpongeNeo modifies the reload process so that the RecipeManager is not in the list when FAPI’s sort runs. This triggers the IllegalStateException.

Proposed Fix Add a compatibility patch in Connector that, when SpongeNeo is detected, ensures a RecipeManager is present in the listeners list before FAPI attempts to resolve dependencies.

Suggested Implementation A minimal Mixin to ResourceManagerHelperImpl#sort(List) with remap=false, inserting the vanilla RecipeManager from the running server if missing:

@Inject(method = "sort(Ljava/util/List;)V", at = @At("HEAD"))
    private void connector$ensureRecipeManagerPresent(List<PreparableReloadListener> listeners, CallbackInfo ci) {
        if (!FMLEnvironment.dist.isDedicatedServer() || !ModList.get().isLoaded("spongeneo")) return;

        for (PreparableReloadListener l : listeners) if (l instanceof RecipeManager) return;

        MinecraftServer server = ServerLifecycleHooks.getCurrentServer();
        if (server == null) return;

        ReloadableServerResources res = server.getServerResources().managers();
        if (res == null) return;

        RecipeManager rm = res.getRecipeManager();
        if (rm == null) return;

        listeners.add(0, rm);
    }

This ensures that:

  • It only runs on a dedicated server.
  • It only triggers when SpongeNeo is loaded.
  • It does nothing if a RecipeManager is already in the list.
  • It adds the RecipeManager at the start of the list to preserve vanilla/FAPI expectations.

Result: I fixed that. Connector and FFAPI with betterend running on a SpongeNeo server.

Image

But I havn't test too much, and it semms caused some tag problem and I have to fix it.

Sam-Chai avatar Aug 13 '25 03:08 Sam-Chai