About this mod

Adds a "Mod Settings" app to the phone home screen.
Lets you browse installed mods & change their settings in-game.
Modify configurable options using toggles/input fields/keybinds & save.

In short terms: An in-game manager for your mod options!

Requirements
Permissions and credits
Changelogs
Donations
Mod Manager & Phone App
Manage & Configure Mods via Main Menu AND In-Game Phone!


Want an easier way to manage your mods without digging through folders?
Need a simple, unified interface accessible from both the Main Menu and in-game to toggle mods and configure their settings?

This mod provides the ultimate solution:
  • A NEW Main Menu Panel for enabling/disabling mods *before* you load your save.
  • The original in-game Phone App ("Settings") for configuring mod options while playing.


New Main Menu Panel Features:
  • Access via a convenient "Mods" button integrated into the Main Menu.
  • View Enabled & Disabled Mods: See your entire Mods folder contents (.dll & .dll.disabled).
  • Toggle Mods On/Off: Easily enable or disable mods with a click.
  • Mod Info Display: Shows Name/Author/Version for loaded mods or filename/disabled status.
  • Restart Reminder: A message appears if you toggle mods, reminding you to restart.
  • Config Tab: Placeholder for future main menu configuration options.

In-Game Phone App Features:
  • Access via the "Settings" app on the phone home screen (Renamed for better integration!).
  • Configure Settings: View and modify settings for compatible mods using simple Toggles (Bool), Input Fields (String/Int/Float), and KeyCode Buttons.
  • Multi-Category Support: Displays settings from multiple categories registered by a single mod.
  • In-Game Saving: Save changes directly to MelonPreferences via the "SAVE" button. (Note: Applying these saved settings may still require a game restart depending on the specific mod being configured - see Dynamic Updates below).
  • Dynamic Update Support: Allows mods to potentially apply setting changes instantly if they implement the provided event listener. Otherwise, a restart is needed after saving changes via the phone app.


Core Features (v1.7.2)
  • Dual Interface: Manage mods from the Main Menu, configure settings via the in-game Phone App.
  • Mod Enable/Disable: Toggle mods on/off easily from the main menu.
  • Settings Configuration: In-game UI for Bool, String, Int, Float, and KeyCode MelonPreferences (may require restart depending on mod).
  • Embedded Images: No more external PNG files needed! All UI graphics are built into the mod DLL. Just install the DLL!
  • Automatic Mod Detection: Lists mods/settings based on MelonPreferences.
  • Clean UI: Custom-built interfaces designed to be clear and functional.
  • Initialization Notification: See a notification when the mod loads successfully in-game.
  • Compatibility Fixes: Improved stability and reduced potential conflicts.


Requirements
  • Game Version: Schedule I (Supports both the default (IL2CPP) and the Alternate (Mono) branch).
  • MelonLoader: v0.7.0 or higher recommended. (Download Here)


Installation
  • Ensure you have met all the requirements listed above.
  • Download the latest version (v1.7.2+) from the Files tab.
  • Open the downloaded archive (.zip or .rar).
  • Go to your Schedule I game installation directory.
  • Place the ModManager&PhoneApp.dll file inside the Mods folder.
  • (Optional: Remove the old ModManagerIcon.png from UserData if present, it's no longer needed.)
  • Launch the game! Use the "Mods" button on the main menu or the "Settings" app on the phone.


Compatibility
  • Relies on other mods using the standard MelonPreferences system for the settings display.
  • Category Detection: Finds categories if their Identifier starts with the mod's name (e.g., MyModName, My Mod Name).
  • Mods using non-MelonPreferences config methods won't show settings in the phone app.
  • Reads Bool, String, Int, Float, and KeyCode types, displaying appropriate controls. Other types may appear as raw strings in input fields.
  • Dynamic Updates: Relies on other mods listening to the OnPreferencesSaved event (See developer section). If not implemented by the other mod, a restart is required after saving settings via the phone app.
  • Should be highly compatible. Issues encountered are likely due to how other mods interact with MelonPreferences or core game systems.


!!! Important for Mod Developers !!!
To integrate your mod's settings with the Phone App component and ensure compatibility:
  • REQUIRED ACTION - DLL Rename: The DLL for this manager is now named `ModManager&PhoneApp.dll`. If your mod references this manager (e.g., for the `OnPreferencesSaved` event), you MUST update your C# project's assembly reference to point to this new DLL name (found in v1.7.2+ downloads). Failure to update the reference will break your mod's compatibility.
  • Namespace: The C# namespace remains `ModManagerPhoneApp`. Add `using ModManagerPhoneApp;` if subscribing to events.
  • Use Standard MelonPreferences: Settings must be registered via `MelonPreferences.CreateCategory()` and `MelonPreferences_Category.CreateEntry<T>()`. Custom config files are not read.
  • Category Detection & Naming (Crucial): The phone app finds settings categories if their Identifier string starts with your mod's official `MelonInfo` name (both exact match and space-removed versions are checked). Use your mod name as a prefix for category identifiers (e.g., `MyCoolMod_MainSettings`).
    Example `MelonInfo`:
    [assembly: MelonInfo(typeof(MyCoolModNamespace.MyCoolModClass), "My Cool Mod", "1.2.3", "My Name")]

    Derived Prefixes: Based on the example above, the manager will look for category Identifiers starting with either "MyCoolMod" or "My Cool Mod".

    Good Identifier Examples (will be detected):
    var category1 = MelonPreferences.CreateCategory("MyCoolMod", "Primary Settings"); // Exact match (no spaces)
    var category2 = MelonPreferences.CreateCategory("MyCoolMod_Visuals", "Visual Options"); // Starts with no-space version
    var category3 = MelonPreferences.CreateCategory("My Cool Mod - Audio", "Audio Config"); // Starts with exact name version

    Bad Identifier Examples (will NOT be detected):
    var categoryBad1 = MelonPreferences.CreateCategory("Visuals", "Visual Options"); // Doesn't start with mod name
    var categoryBad2 = MelonPreferences.CreateCategory("MCM_Config", "My Config"); // Abbreviation doesn't match
    var categoryBad3 = MelonPreferences.CreateCategory("Audio", "Audio Config"); // Doesn't start with mod name
  • Category Display Order: Categories are sorted alphabetically by Identifier. Use numerical prefixes (e.g., `01_`, `02_`) in the Identifier to control display order.
    Example (Ensures Main -> Visuals -> Audio order):
    // Identifier controls sorting, DisplayName controls the header text shown in the UI:
    var catMain = MelonPreferences.CreateCategory("MyCoolMod_01_Main", "Main Settings");
    var catVisuals = MelonPreferences.CreateCategory("MyCoolMod_02_Visuals", "Visual Settings");
    var catAudio= MelonPreferences.CreateCategory("MyCoolMod_03_Audio","Audio Settings");
  • Setting DisplayName (Recommended): Use the optional `DisplayName` parameter in `CreateEntry<T>()` for user-friendly labels. If omitted, the internal Identifier is shown.
    Example:
    public static MelonPreferences_Entry<float> MovementSpeedPref;
    // ... Inside OnInitializeMelon or setup method ...
    MovementSpeedPref = category.CreateEntry<float>(
    "InternalMoveSpd", // Identifier (used internally, fallback label)
    1.0f, // Default Value
    "Player Movement Speed" // DisplayName (shown in UI)
    );
  • Supported Setting Types & UI Controls: Best experience for `bool` (Toggle), `string`/`int`/`float` (Input Field), and `UnityEngine.KeyCode` (Rebind Button). Other types default to text input.
  • Hiding Settings: Use the `IsHidden: true` parameter in `CreateEntry()` for internal preferences you don't want shown in the UI. Example: `CreateEntry("InternalCounter", 0, IsHidden: true)`
  • Dynamic Updates (Optional Event System): Allow settings to apply live.
    • Requires adding the updated project reference to `ModManager&PhoneApp.dll`.
    • Add `using ModManagerPhoneApp;`
    • Subscribe in `OnInitializeMelon` (use `try-catch`):
      try
      {
      ModManagerPhoneApp.ModSettingsEvents.OnPreferencesSaved += HandleSettingsUpdate;
      LoggerInstance.Msg("Successfully subscribed to Mod Manager save event.");
      }
      catch (Exception ex) // Catches TypeLoadException if DLL missing, or other errors
      {
      LoggerInstance.Warning($"Could not subscribe to Mod Manager event (Mod Manager may not be installed/compatible): {ex.Message}");
      }
    • Create the handler: `private void HandleSettingsUpdate()` (reload your settings from `.Value` here).
    • Unsubscribe in `OnDeinitializeMelon` (use `try-catch`):
      try
      {
      ModManagerPhoneApp.ModSettingsEvents.OnPreferencesSaved -= HandleSettingsUpdate;
      LoggerInstance.Msg("Unsubscribed from Mod Manager save event.");
      }
      catch { /* Ignore errors */ }


Known Issues / Limitations
  • Restart Required: Enabling/Disabling mods via the main menu ALWAYS requires a restart. Settings changes via the phone app MAY require a restart depending on whether the configured mod implements the dynamic update event listener.
  • Limited Control Types: Phone app primarily supports Bool, String/Int/Float, KeyCode. Others show as text input.
  • Main Menu Config: The "Config" tab on the main menu panel is currently a placeholder.


Development Status & Feedback
  • More features and refinements are planned! Feedback, suggestions, and bug reports welcome via Posts or Bugs tab.


Credits & Acknowledgements
  • Prowiler for creating this mod.
  • The helpful members of the Schedule One Modding Community.
  • The MelonLoader team.
  • TVGS for creating Schedule One!