-
-
Notifications
You must be signed in to change notification settings - Fork 35
Description
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
- Install connector on a SpongeNeo server
- Add some fabric mod such as betterend
- 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: Sinytra/Connector#1911
Cause
ResourceManagerHelperImpl#sort(List) 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.
But I havn't test too much, and it semms caused some tag problem and I have to fix it.