private static void Postfix() { Mod.Debug("Player_OnAreaLoaded_Patch"); Settings.ClearCachedPerSave(); MultipleClasses.SyncAllGestaltState(); }
public static void MigrationOptions(float indent) { if (!Main.IsInGame) { return; } var hasMulticlassMigration = settings.multiclassSettings.Count > 0 && (settings.toggleAlwaysShowMigration || settings.perSave.multiclassSettings.Count == 0); var hasGestaltMigration = settings.excludeClassesFromCharLevelSets.Count > 0 && (settings.toggleAlwaysShowMigration || settings.perSave.excludeClassesFromCharLevelSets.Count == 0); var hasLevelAsLegendMigration = settings.perSave.charIsLegendaryHero.Count > 0 && (settings.toggleAlwaysShowMigration || settings.perSave.charIsLegendaryHero.Count == 0); var hasAvailableMigrations = hasMulticlassMigration || hasGestaltMigration || hasLevelAsLegendMigration; var migrationCount = settings.multiclassSettings.Count + settings.excludeClassesFromCharLevelSets.Count + settings.charIsLegendaryHero.Count; if (migrationCount > 0) { using (UI.HorizontalScope()) { UI.Space(indent); UI.Toggle("Show Migrations", ref settings.toggleAlwaysShowMigration); UI.Space(25); UI.Label("toggle this if you want show older ToyBox settings for ".green() + "Multi-class selections, Gestalt Flags and Allow Levels Past 20 ".cyan()); } } if (migrationCount > 0) { UI.Div(indent); if (hasAvailableMigrations) { using (UI.HorizontalScope()) { UI.Space(indent); using (UI.VerticalScope()) { UI.Label("the following options allow you to migrate previous settings that were stored in toybox to the new per setting save mechanism for ".green() + "Multi-class selections, Gestalt Flags and Allow Levels Past 20 ".cyan() + "\nNote:".orange() + "you may have configured this for a different save so use care in doing this migration".green()); if (hasMulticlassMigration) { using (UI.HorizontalScope()) { UI.Label("Multi-class settings", UI.Width(300)); UI.Space(25); UI.Label($"{settings.multiclassSettings.Count}".cyan()); UI.Space(25); UI.ActionButton("Migrate", () => { settings.perSave.multiclassSettings = settings.multiclassSettings; Settings.SavePerSaveSettings(); }); UI.Space(25); UI.DangerousActionButton("Remove", "this will remove your old multiclass settings from ToyBox settings but does not affect any other saves that have already migrated them", ref areYouSure1, () => settings.multiclassSettings.Clear()); } } if (hasGestaltMigration) { using (UI.HorizontalScope()) { UI.Label("Gestalt Flags", UI.Width(300)); UI.Space(25); UI.Label($"{settings.excludeClassesFromCharLevelSets.Count}".cyan()); UI.Space(25); UI.ActionButton("Migrate", () => { settings.perSave.excludeClassesFromCharLevelSets = settings.excludeClassesFromCharLevelSets; Settings.SavePerSaveSettings(); MultipleClasses.SyncAllGestaltState(); }); UI.Space(25); UI.DangerousActionButton("Remove", "this will remove your old gestalt flags from ToyBox settings but does not affect any other saves that have already migrated them", ref areYouSure2, () => settings.excludeClassesFromCharLevelSets.Clear()); } } if (hasLevelAsLegendMigration) { using (UI.HorizontalScope()) { UI.Label("Chars Able To Exceed Level 20", UI.Width(300)); UI.Space(25); UI.Label($"{settings.charIsLegendaryHero.Count}".cyan()); UI.Space(25); UI.ActionButton("Migrate", () => { settings.perSave.charIsLegendaryHero = settings.charIsLegendaryHero; Settings.SavePerSaveSettings(); }); UI.Space(25); UI.DangerousActionButton("Remove", "this will remove your old Allow Level Past 20 flags from ToyBox settings but does not affect any other saves that have already migrated them", ref areYouSure3, () => settings.charIsLegendaryHero.Clear()); } } } } UI.Div(indent); } } }
public void OnGUI(UnityModManager.ModEntry modEntry) { if (Core == null || !Core.Enabled) { return; } GUIStyle style = new GUIStyle(GUI.skin.button) { alignment = TextAnchor.MiddleLeft }; MultipleClasses.Enabled = GUIHelper.ToggleButton(MultipleClasses.Enabled, "Multiple Classes", style); if (MultipleClasses.Enabled) { string[] companionNames = default; HashSet <string> selectedMulticlassSet = default; GUILayout.Space(10); // selections using (new GUILayout.HorizontalScope()) { // character selections using (new GUILayout.VerticalScope(GUILayout.ExpandWidth(false))) { string playerName = default; string activeScene = Core.Mod.ActiveScene.name; if (activeScene != "MainMenu" && activeScene != "Start" && Core.Mod.Player != null) { playerName = Core.Mod.Player.MainCharacter.Value.CharacterName; companionNames = Core.Mod.Player.AllCharacters .Where(c => c.IsPlayerFaction && !c.IsMainCharacter && !c.Descriptor.IsPet) .Select(c => c.CharacterName) .ToArray(); } else { playerName = "[Player]"; companionNames = new string[0]; } int selectedCharacterIndex = _selectedCharacterType == SelectedCharacterType.MainCharacter ? 0 : _selectedCharacterType == SelectedCharacterType.CharGenCustom ? companionNames.Length + 1 : Array.FindIndex(companionNames, name => name == _selectedCharacterName) + 1; GUIHelper.SelectionGrid(ref selectedCharacterIndex, new[] { playerName }.Concat(companionNames).Concat(new[] { "[Custom]".Color(RGBA.silver) }).ToArray(), 1, null, GUILayout.ExpandWidth(false)); if (selectedCharacterIndex <= 0) { _selectedCharacterType = SelectedCharacterType.MainCharacter; selectedMulticlassSet = MultipleClasses.MainCharSet; } else if (selectedCharacterIndex > companionNames.Length) { _selectedCharacterType = SelectedCharacterType.CharGenCustom; selectedMulticlassSet = MultipleClasses.CharGenSet; } else { _selectedCharacterType = SelectedCharacterType.Companion; _selectedCharacterName = companionNames[selectedCharacterIndex - 1]; selectedMulticlassSet = MultipleClasses.DemandCompanionSet(_selectedCharacterName); } } // multiclass selections using (new GUILayout.VerticalScope(GUILayout.ExpandWidth(false))) { foreach (BlueprintCharacterClass characterClass in Core.Mod.CharacterClasses) { using (new GUILayout.HorizontalScope()) { // class bool selected = selectedMulticlassSet.Contains(characterClass.AssetGuid); GUIHelper.ToggleButton(ref selected, characterClass.Name, ref _classNameButtonWidth, () => selectedMulticlassSet.Add(characterClass.AssetGuid), () => selectedMulticlassSet.Remove(characterClass.AssetGuid), style); // archetypes if (selected && characterClass.Archetypes.Any()) { int originalArchetype; int selectedArchetype = originalArchetype = Array.FindIndex(characterClass.Archetypes, archetype => selectedMulticlassSet.Contains(archetype.AssetGuid)) + 1; GUIHelper.Toolbar(ref selectedArchetype, new string[] { characterClass.Name }.Concat(characterClass.Archetypes.Select(item => item.Name)).ToArray()); if (selectedArchetype != originalArchetype) { if (originalArchetype > 0) { selectedMulticlassSet.Remove(characterClass.Archetypes[originalArchetype - 1].AssetGuid); } if (selectedArchetype > 0) { selectedMulticlassSet.Add(characterClass.Archetypes[selectedArchetype - 1].AssetGuid); } } } else { GUILayout.FlexibleSpace(); } } } } if (_selectedCharacterType == SelectedCharacterType.Companion && selectedMulticlassSet.Count == 0) { MultipleClasses.CompanionSets.Remove(_selectedCharacterName); } } GUILayout.Space(10); // clear if (GUILayout.Button("Clear Settings For Unavailable Characters", style)) { foreach (string key in MultipleClasses.CompanionSets.Keys.Except(companionNames).ToList()) { MultipleClasses.CompanionSets.Remove(key); } } if (GUILayout.Button("Clear Settings For All Companions", style)) { MultipleClasses.CompanionSets.Clear(); } if (GUILayout.Button("Clear Settings For All Characters", style)) { MultipleClasses.MainCharSet.Clear(); MultipleClasses.CharGenSet.Clear(); MultipleClasses.CompanionSets.Clear(); } } }