Force role menu to be refreshed on gamemode change

This commit is contained in:
Atony committed 2026-08-16 21:56:48 -05:00
1 parent fb164a54e3
commit b83cb5cc29
3 files changed
+41 -8

No files matched your search

+19 -7
View File
@@ -109,16 +109,28 @@ public static class GameModeOption
internal static void Set(int val)
{
Value = val;
var previousMode = CustomGameModeManager.ActiveMode;
CustomGameModeManager.GetAndSetGameMode();
HudPatches.SetGameModeText(CustomGameModeManager.GetMode(Values.ElementAt(_lastValue).Key).ColoredName);
var gm = CustomGameModeManager.ActiveMode!;
ModdedOptionsManager.AddSettingsChangeMessage(
HudManager.Instance.Notifier,
GamemodeName,
gm.ColoredName,
new Color(0.7333f, 0.7333f, 0.7333f, 1),
gm.TmpIcon,
true);
if (gm != previousMode)
{
ModdedOptionsManager.AddSettingsChangeMessage(
HudManager.Instance.Notifier,
GamemodeName,
gm.ColoredName,
new Color(0.7333f, 0.7333f, 0.7333f, 1),
gm.TmpIcon,
true);
if (MenuState.Instance)
{
// should force reset roles for gamemodes properly
foreach (var roleMenu in MenuState.Instance.QueuedRoleMenuRefresh)
{
MenuState.Instance.QueuedRoleMenuRefresh[roleMenu.Key] = true;
}
}
}
// could make Values a dict of AbstractGameMode too
}
+2
View File
@@ -63,6 +63,8 @@ public class MenuState(IntPtr cppPtr) : MonoBehaviour(cppPtr)
[HideFromIl2Cpp]
internal Dictionary<int, bool> FinishedRoleMenus { get; } = [];
[HideFromIl2Cpp]
internal Dictionary<int, bool> QueuedRoleMenuRefresh { get; } = [];
public void Awake()
{
@@ -75,7 +75,24 @@ public static class RoleSettingMenuPatches
dividerImage.gameObject.SetActive(false);
}
if (MenuState.Instance.FinishedRoleMenus.TryGetValue(MenuState.Instance.CurrentModIdx, out var finished) && finished)
var queuedRefresh = false;
if (MenuState.Instance.QueuedRoleMenuRefresh.TryGetValue(MenuState.Instance.CurrentModIdx, out var queued) && queued)
{
queuedRefresh = true;
var roleOptionSettings = roleMenu.scrollBar.Inner.GetComponentsInChildren<RoleOptionSetting>(true);
var headers = roleMenu.scrollBar.Inner.GetComponentsInChildren<CategoryHeaderMasked>(true);
foreach (var child in roleOptionSettings)
{
Object.Destroy(child.gameObject);
}
foreach (var child in headers)
{
Object.Destroy(child.gameObject);
}
yield return new WaitForEndOfFrame();
MenuState.Instance.QueuedRoleMenuRefresh[MenuState.Instance.CurrentModIdx] = false;
}
if (!queuedRefresh && MenuState.Instance.FinishedRoleMenus.TryGetValue(MenuState.Instance.CurrentModIdx, out var finished) && finished)
{
var roleOptionSettings = roleMenu.scrollBar.Inner.GetComponentsInChildren<RoleOptionSetting>(true);
foreach (var r in roleOptionSettings)
@@ -308,6 +325,7 @@ public static class RoleSettingMenuPatches
RoleGroupHidden[group] = !groupHidden;
}
MenuState.Instance.QueuedRoleMenuRefresh[MenuState.Instance.CurrentModIdx] = false;
MenuState.Instance.FinishedRoleMenus[MenuState.Instance.CurrentModIdx] = false;
foreach (var child in roleMenu.RoleChancesSettings.transform)
@@ -327,6 +345,7 @@ public static class RoleSettingMenuPatches
}
}
}
MenuState.Instance.QueuedRoleMenuRefresh[MenuState.Instance.CurrentModIdx] = false;
MenuState.Instance.FinishedRoleMenus[MenuState.Instance.CurrentModIdx] = true;
}