Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
ModSettingsManager.cs
浏览该文件的文档.
1using System.Text;
2using System.Xml.Linq;
3using Engine;
5using XmlUtilities;
6
7namespace Game {
8 public static class ModSettingsManager {
12 public static Dictionary<string, XElement> ModSettingsCache { get; private set; } = new();
13
17 public static Dictionary<string, ValuesDictionary> ModKeyboardMapSettings { get; private set; } = new();
18
22 public static Dictionary<string, ValuesDictionary> ModGamepadMapSettings { get; private set; } = new();
23
27 public static Dictionary<string, ValuesDictionary> ModCameraManageSettings { get; private set; } = new();
28
29 public const string fName = "ModSettingsManager";
30
31 public static Dictionary<string, object> CombinedKeyboardMappingSettings {
32 get { //合并模组设置和原版设置
33 Dictionary<string, object> dictionary = new();
34 foreach (KeyValuePair<string, object> item in SettingsManager.KeyboardMappingSettings) {
35 dictionary.TryAdd(item.Key, item.Value);
36 }
37 foreach (ValuesDictionary item in ModKeyboardMapSettings.Values) {
38 foreach (KeyValuePair<string, object> item2 in item) {
39 dictionary.TryAdd(item2.Key, item2.Value);
40 }
41 }
42 return dictionary;
43 }
44 }
45 public static Dictionary<string, object> CombinedGamepadMappingSettings {
46 get { //合并模组设置和原版设置
47 Dictionary<string, object> dictionary = new();
48 foreach (KeyValuePair<string, object> item in SettingsManager.GamepadMappingSettings) {
49 dictionary.TryAdd(item.Key, item.Value);
50 }
51 foreach (ValuesDictionary item in ModGamepadMapSettings.Values) {
52 foreach (KeyValuePair<string, object> item2 in item) {
53 dictionary.TryAdd(item2.Key, item2.Value);
54 }
55 }
56 return dictionary;
57 }
58 }
59
60 public static Dictionary<string, int> CombinedCameraManageSettings {
61 get {
62 Dictionary<string, int> dictionary = new();
63 foreach (KeyValuePair<string, object> item in SettingsManager.CameraManageSettings) {
64 dictionary.TryAdd(item.Key, Convert.ToInt32(item.Value));
65 }
66 foreach (ValuesDictionary item in ModCameraManageSettings.Values) {
67 foreach (KeyValuePair<string, object> item2 in item) {
68 dictionary.TryAdd(item2.Key, Convert.ToInt32(item2.Value));
69 }
70 }
71 return dictionary;
72 }
73 }
74
75 public static void LoadModSettings() {
77 return;
78 }
79
80 //读取设置并且加入到ModSettings表内
81 try {
82 using (Stream stream = Storage.OpenFile(ModsManager.ModsSettingsPath, OpenFileMode.Read)) {
83 XElement element = XElement.Load(stream);
84 foreach (XElement modXElement in element.Elements("Mod")) {
85 string packageName = XmlUtils.GetAttributeValue<string>(modXElement, "PackageName");
86 ModSettingsCache[packageName] = modXElement;
87 }
88 }
89 }
90 catch (Exception e) {
91 if (!LanguageControl.TryGet(out string str, fName, "1")) {
92 str = "Error serializing mod settings file:";
93 }
94 Log.Warning($"{str} {e.Message}");
95 return;
96 }
97
98 //遍历每个模组,加载设置项,如果设置项已加载,就从ModSettingsCache中删除
99 try {
100 foreach (ModEntity modEntity in ModsManager.ModList) {
101 string packageName = modEntity.modInfo.PackageName;
102 ValuesDictionary modKeyboardSettings = [];
103 ValuesDictionary modGamepadSettings = [];
104 ValuesDictionary modCameraSettings = [];
105 IEnumerable<KeyValuePair<string, object>> keysToAdd = modEntity.Loader?.GetKeyboardMappings() ?? []; //初始化模组默认键位设置
106 IEnumerable<KeyValuePair<string, object>> gamepadKeysToAdd = modEntity.Loader?.GetGamepadMappings() ?? []; //初始化模组默认键位设置
107 IEnumerable<KeyValuePair<string, int>> camerasToAdd = modEntity.Loader?.GetCameraList() ?? []; //初始化模组默认相机设置
108 foreach (KeyValuePair<string, object> item1 in keysToAdd) {
109 modKeyboardSettings.Add(item1.Key, item1.Value);
110 }
111 foreach (KeyValuePair<string, object> item1 in gamepadKeysToAdd) {
112 modGamepadSettings.Add(item1.Key, item1.Value);
113 }
114 foreach (KeyValuePair<string, int> item2 in camerasToAdd) {
115 modCameraSettings.Add(item2.Key, item2.Value);
116 }
117 if (ModSettingsCache.TryGetValue(packageName, out XElement setting)) {
118 modEntity.LoadSettings(setting);
119 if (setting != null) { //加载模组保存的键位映射、相机设置
120 XElement keyboardMapping = setting.Element("KeyboardMapping");
121 if (keyboardMapping != null) {
122 modKeyboardSettings.ApplyOverrides(keyboardMapping, true);
123 }
124 XElement gamepadMapping = setting.Element("GamepadMapping");
125 if (gamepadMapping != null) {
126 modGamepadSettings.ApplyOverrides(gamepadMapping);
127 }
128 XElement cameraList = setting.Element("CameraList");
129 if (cameraList != null) {
130 modCameraSettings.ApplyOverrides(cameraList, true);
131 }
132 }
133 }
134 ModKeyboardMapSettings[packageName] = modKeyboardSettings;
135 ModGamepadMapSettings[packageName] = modGamepadSettings;
136 ModCameraManageSettings[packageName] = modCameraSettings;
137 }
138 if (!LanguageControl.TryGet(out string info, fName, "2")) {
139 info = "Loaded mod settings";
140 }
141 Log.Information(info);
142 }
143 catch (Exception e) {
144 if (!LanguageControl.TryGet(out string str, fName, "3")) {
145 str = "Error loading mod settings:";
146 }
147 Log.Warning($"{str} {e}");
148 }
149 }
150
151 public static void SaveModSettings() {
152 foreach (ModEntity modEntity in ModsManager.ModList) {
153 string packageName = modEntity.modInfo.PackageName;
154 XElement settingsElement = new("Mod");
155 XmlUtils.SetAttributeValue(settingsElement, "PackageName", packageName);
156 try {
157 modEntity.SaveSettings(settingsElement);
158 }
159 catch (Exception e) {
160 if (!LanguageControl.TryGet(out string str, fName, "4")) {
161 str = "Error saving the mod settings of [{0}]:";
162 }
163 Log.Warning($"{string.Format(str, packageName)} {e}");
164 }
165 //保存模组的键盘鼠标键位映射设置
166 XElement keyboardMapping = new("KeyboardMapping");
167 if (ModKeyboardMapSettings.TryGetValue(packageName, out ValuesDictionary modKeyboardSettings)
168 && modKeyboardSettings.Count > 0) {
169 modKeyboardSettings.Save(keyboardMapping);
170 settingsElement.Add(keyboardMapping);
171 }
172 //保存模组的手柄键位映射设置
173 XElement gamepadMapping = new("GamepadMapping");
174 if (ModGamepadMapSettings.TryGetValue(packageName, out ValuesDictionary modGamepadSettings)
175 && modGamepadSettings.Count > 0) {
176 modGamepadSettings.Save(gamepadMapping);
177 settingsElement.Add(gamepadMapping);
178 }
179 //保存模组的相机设置
180 XElement cameraList = new("CameraList");
181 if (ModCameraManageSettings.TryGetValue(packageName, out ValuesDictionary modCameraSettings)
182 && modCameraSettings.Count > 0) {
183 modCameraSettings.Save(cameraList);
184 settingsElement.Add(cameraList);
185 }
186 //模组保存了设置
187 if (settingsElement.Elements().Any()
188 || settingsElement.Attributes().Count() > 1) {
189 ModSettingsCache[packageName] = settingsElement;
190 }
191 }
192 XElement xElement = new("ModSettings");
193 foreach (KeyValuePair<string, XElement> settingElement in ModSettingsCache) {
194 xElement.Add(settingElement.Value);
195 }
196 try {
197 using (Stream stream = Storage.OpenFile(ModsManager.ModsSettingsPath, OpenFileMode.Create)) {
198 XmlUtils.SaveXmlToStream(xElement, stream, Encoding.UTF8, true);
199 }
200 }
201 catch (Exception e) {
202 if (!LanguageControl.TryGet(out string str, fName, "5")) {
203 str = "Error saving mod settings file:";
204 }
205 Log.Warning($"{str} {e.Message}");
206 }
207 if (!LanguageControl.TryGet(out string info, fName, "6")) {
208 info = "Saved mod settings";
209 }
210 Log.Information(info);
211 }
212
213 public static void ResetModsKeyboardMappingSettings() {
214 foreach (ModEntity modEntity in ModsManager.ModList) {
215 string packageName = modEntity.modInfo.PackageName;
216 if (ModKeyboardMapSettings.TryGetValue(packageName, out ValuesDictionary keyboardSettings)) {
217 keyboardSettings.Clear();
218 IEnumerable<KeyValuePair<string, object>> keysToAdd = modEntity.Loader?.GetKeyboardMappings() ?? [];
219 foreach (KeyValuePair<string, object> item1 in keysToAdd) {
220 keyboardSettings.Add(item1.Key, item1.Value);
221 }
222 }
223 }
225 }
226
227 public static void ResetModsGamepadMappingSettings() {
228 foreach (ModEntity modEntity in ModsManager.ModList) {
229 string packageName = modEntity.modInfo.PackageName;
230 if (ModGamepadMapSettings.TryGetValue(packageName, out ValuesDictionary gamepadSettings)) {
231 gamepadSettings.Clear();
232 IEnumerable<KeyValuePair<string, object>> keysToAdd = modEntity.Loader?.GetGamepadMappings() ?? [];
233 foreach (KeyValuePair<string, object> item1 in keysToAdd) {
234 gamepadSettings.Add(item1.Key, item1.Value);
235 }
236 }
237 }
239 }
240
241 public static void ResetModsCameraManageSettings() {
242 foreach (ModEntity modEntity in ModsManager.ModList) {
243 string packageName = modEntity.modInfo.PackageName;
244 if (ModCameraManageSettings.TryGetValue(packageName, out ValuesDictionary cameraSettings)) {
245 cameraSettings.Clear();
246 IEnumerable<KeyValuePair<string, int>> camerasToAdd = modEntity.Loader?.GetCameraList() ?? [];
247 foreach (KeyValuePair<string, int> item1 in camerasToAdd) {
248 cameraSettings.Add(item1.Key, item1.Value);
249 }
250 }
251 }
253 }
254 }
255}
static void Information(object message)
定义 Log.cs:56
static void Warning(object message)
定义 Log.cs:68
static Stream OpenFile(string path, OpenFileMode openFileMode)
static bool FileExists(string path)
static bool TryGet(out string result, params string[] keys)
static string Get(string className, int key)
获取在当前语言类名键对应的字符串
virtual void LoadSettings(XElement xElement)
加载设置
virtual void SaveSettings(XElement xElement)
保存设置
string PackageName
virtual IEnumerable< KeyValuePair< string, object > > GetGamepadMappings()
用于添加新的手柄按键映射,在重置按键设置时也会使用这里的设置作为默认值。 使用yield return可返回多个键值对。键:映射名;值:按键(Key)或鼠标按钮(MouseButton)
virtual IEnumerable< KeyValuePair< string, int > > GetCameraList()
用于添加新的摄像机顺序,在重置摄像机列表时也会使用这里的设置作为默认值。 使用yield return可返回多个键值对。键:摄像机类名;值:顺序
virtual IEnumerable< KeyValuePair< string, object > > GetKeyboardMappings()
用于添加新的键盘鼠标按键映射,在重置按键设置时也会使用这里的设置作为默认值。 使用yield return可返回多个键值对。键:映射名;值:按键(Key)或鼠标按钮(MouseButton)
static Dictionary< string, object > CombinedGamepadMappingSettings
static Dictionary< string, XElement > ModSettingsCache
储存每一个没有使用到的Mod设置的键值对,键:Mod的包名,值:Mod的设置信息XElement
static Dictionary< string, ValuesDictionary > ModGamepadMapSettings
储存每个模组的手柄键位映射设置,键:模组包名,值:模组的键位映射设置
static Dictionary< string, object > CombinedKeyboardMappingSettings
static Dictionary< string, int > CombinedCameraManageSettings
static Dictionary< string, ValuesDictionary > ModCameraManageSettings
储存每个模组的相机设置,键:模组包名,值:模组的相机设置
static Dictionary< string, ValuesDictionary > ModKeyboardMapSettings
储存每个模组的键盘鼠标键位映射设置,键:模组包名,值:模组的键位映射设置
static ValuesDictionary GamepadMappingSettings
static ValuesDictionary CameraManageSettings
static ValuesDictionary KeyboardMappingSettings
static string ModsSettingsPath
static List< ModEntity > ModList
所有已启用的模组
static void SetAttributeValue(XElement node, string attributeName, object value)
static object GetAttributeValue(XElement node, string attributeName, Type type)
static void SaveXmlToStream(XElement node, Stream stream, Encoding encoding, bool throwOnError)