-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGenericModConfigMenuIntegration.cs
More file actions
172 lines (155 loc) · 7.75 KB
/
Copy pathGenericModConfigMenuIntegration.cs
File metadata and controls
172 lines (155 loc) · 7.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
using System;
using StardewModdingAPI;
namespace MultiRingInfiniteForging
{
public static class GenericModConfigMenuIntegration
{
public static void Register(IMod mod, ModConfig config, Action save)
{
var api = mod.Helper.ModRegistry.GetApi<IGenericModConfigMenuApi>(
"spacechase0.GenericModConfigMenu");
if (api == null) return;
// Unregister first so re-loads (e.g. via SMAPI reload commands) don't error.
try { api.Unregister(mod.ModManifest); } catch { /* ignore */ }
api.Register(
mod: mod.ModManifest,
reset: () => ResetToDefaults(config),
save: save
);
api.AddSectionTitle(mod.ModManifest, () => ModEntry.T("config.section.title.ring"));
api.AddNumberOption(
mod: mod.ModManifest,
getValue: () => config.ExtraRingSlots,
setValue: v =>
{
config.ExtraRingSlots = v;
RingSlotManager.EnsureSize();
InventoryPagePatches.RebuildForActiveMenu();
},
name: () => ModEntry.T("config.extraRingSlots.name"),
tooltip: () => ModEntry.T("config.extraRingSlots.description"),
min: 0,
max: 36,
interval: 1
);
api.AddSectionTitle(mod.ModManifest, () => ModEntry.T("config.section.title.forge"));
api.AddBoolOption(
mod: mod.ModManifest,
getValue: () => config.InfiniteCombining,
setValue: v => config.InfiniteCombining = v,
name: () => ModEntry.T("config.infiniteCombining.name"),
tooltip: () => ModEntry.T("config.infiniteCombining.description")
);
api.AddBoolOption(
mod: mod.ModManifest,
getValue: () => config.AddCombinedDuplicateRingCap,
setValue: v => config.AddCombinedDuplicateRingCap = v,
name: () => ModEntry.T("config.AddCombinedDuplicateRingCap.name"),
tooltip: () => ModEntry.T("config.AddCombinedDuplicateRingCap.description")
);
string[] forgingPresets = { "-1", "0", "3", "6", "10", "15", "30", "60", "100", "250", "500", "999" };
api.AddTextOption(
mod: mod.ModManifest,
getValue: () =>
{
int v = config.WeaponForgingCap;
foreach (var p in forgingPresets)
if (int.TryParse(p, out int n) && n == v)
return p;
return v.ToString();
},
setValue: v =>
{
if (int.TryParse(v, out int n))
config.WeaponForgingCap = n;
},
name: () => ModEntry.T("config.WeaponForgingCap.name"),
tooltip: () => ModEntry.T("config.WeaponForgingCap.description"),
allowedValues: forgingPresets,
formatAllowedValue: v => v switch
{
"-1" => ModEntry.T("config.WeaponForgingCap.valueUnlimited"),
"0" => ModEntry.T("config.WeaponForgingCap.valueNone"),
"3" => ModEntry.T("config.WeaponForgingCap.valueDefault"),
_ => v
}
);
api.AddBoolOption(
mod: mod.ModManifest,
getValue: () => config.RemoveDiamondForgesCap,
setValue: v => config.RemoveDiamondForgesCap = v,
name: () => ModEntry.T("config.RemoveDiamondForgesCap.name"),
tooltip: () => ModEntry.T("config.RemoveDiamondForgesCap.description")
);
api.AddBoolOption(
mod: mod.ModManifest,
getValue: () => config.MultipleEnchantments,
setValue: v => config.MultipleEnchantments = v,
name: () => ModEntry.T("config.multipleEnchantments.name"),
tooltip: () => ModEntry.T("config.multipleEnchantments.description")
);
api.AddBoolOption(
mod: mod.ModManifest,
getValue: () => config.DragonToothStacking,
setValue: v => config.DragonToothStacking = v,
name: () => ModEntry.T("config.DragonToothStacking.name"),
tooltip: () => ModEntry.T("config.DragonToothStacking.description")
);
api.AddBoolOption(
mod: mod.ModManifest,
getValue: () => config.AlwaysMaxDragonToothStat,
setValue: v => config.AlwaysMaxDragonToothStat = v,
name: () => ModEntry.T("config.AlwaysMaxDragonToothStat.name"),
tooltip: () => ModEntry.T("config.AlwaysMaxDragonToothStat.description")
);
api.AddBoolOption(
mod: mod.ModManifest,
getValue: () => config.ForgeMenuChoiceIntegration,
setValue: v => config.ForgeMenuChoiceIntegration = v,
name: () => ModEntry.T("config.ForgeMenuChoiceIntegration.name"),
tooltip: () => ModEntry.T("config.ForgeMenuChoiceIntegration.description")
);
api.AddSectionTitle(mod.ModManifest, () => ModEntry.T("config.section.title.verbose.logging"));
api.AddBoolOption(
mod: mod.ModManifest,
getValue: () => config.VerboseLogging,
setValue: v => config.VerboseLogging = v,
name: () => ModEntry.T("config.verbose.logging.name"),
tooltip: () => ModEntry.T("config.verbose.logging.description")
);
api.AddBoolOption(
mod: mod.ModManifest,
getValue: () => config.VerboseTickSnapshot,
setValue: v => config.VerboseTickSnapshot = v,
name: () => ModEntry.T("config.VerboseTickSnapshot.name"),
tooltip: () => ModEntry.T("config.VerboseTickSnapshot.description")
);
// After your existing AddNumberOption / AddBoolOption calls:
api.AddSectionTitle(mod.ModManifest, () => ModEntry.T("config.section.title.uninstall"));
api.AddParagraph(mod.ModManifest, () => ModEntry.T("config.uninstall.safety.paragraph"));
api.AddBoolOption(
mod: mod.ModManifest,
getValue: () => false,
setValue: v =>
{
if (v) RingSlotManager.DrainAllToPlayer();
},
name: () => ModEntry.T("config.uninstall.safety.button"),
tooltip: () => ModEntry.T("config.uninstall.safety.button.tooltip"));
}
/// <summary>Reset every config field to its <see cref="ModConfig"/> default by
/// copying from a fresh instance. Defaults then live in exactly one place (the
/// ModConfig property initializers), so GMCM's "Reset to Default" can't silently
/// drift from them. Previously each default was re-hardcoded in the reset lambda,
/// and a missed update there reverted DragonToothStacking on reset.</summary>
private static void ResetToDefaults(ModConfig config)
{
var defaults = new ModConfig();
foreach (var prop in typeof(ModConfig).GetProperties())
{
if (prop.CanRead && prop.CanWrite)
prop.SetValue(config, prop.GetValue(defaults));
}
}
}
}