When enabled (with the parent feature on), sorters are also hidden,
leaving only belts and their cargo visible. Hidden sorters also become
click-through so clicks reach the belts beneath them.
- RenderingPatch: gate InserterRenderer.Render and the RaycastLogic
inserter exemption on a new HideSorters flag
- FactoryPatch/UXAssist/FactoryConfigProvider: new
DoNotRenderEntitiesHideSorters config wired to the flag
- UIConfigWindow/I18NKeys: indented sub-checkbox + EN/zh label
- README/CHANGELOG: document the sub-option; bump to 1.5.9
- Rename ImmediateBuildPatch to FactoryBuildPatches
- Rename AutoConstructButton to AutoConstructPatch
- AutoConstructButtonEnabled now toggles the Harmony patch instead of only refreshing UI visibility
- Preserve AutoConstructEnabled state when the button option is toggled
ModFeatureRegistry is a static class with shared collections accumulating
features from all mods. Dependent mods (CheatEnabler, UniverseGenTweaks)
each independently called InitAll/StartAll/OnInputUpdateAll/OnUpdateAll/
UninitAll, re-running lifecycle for ALL accumulated features including
other mods' — per-frame Update ran 2-3x (breaking CheatEnabler key toggles
to net no-ops), Init/Start/Uninit ran 2-3x (double RegisterExporter causing
save corruption, double SettingChanged subscriptions, double keybind
registration).
Fix:
- Init now runs eagerly at Discover/Register time (Awake-phase), preserving
the original timing that keybind registration depends on (game's
UIOptionWindow._OnCreate copies keybinds only after all plugins load)
- InitAll removed entirely
- StartAll/UninitAll/OnInputUpdateAll/OnUpdateAll made internal so only
UXAssist (host, same assembly, no InternalsVisibleTo) can drive them
- Start deferred to UXAssist.Start (after all dependents' Awake complete;
BepInEx runs all Awakes before any Start)
- Per-feature Started idempotency + per-frame Time.frameCount guards as
defense-in-depth
- Dependent mods reduced to Discover-only in Awake
Document the Init/Start timing contract on IModFeature and
ModFeatureAttribute so future mods can rely on it.