Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
GameManager.cs
浏览该文件的文档.
1using System.Xml.Linq;
2using Engine;
5using XmlUtilities;
6
7namespace Game {
8 public static class GameManager {
9 public static WorldInfo m_worldInfo;
10
11 public static Project m_project;
12
14
15 public static ManualResetEvent m_saveCompleted = new(true);
16
17 public static Project Project => m_project;
18
20
21 public static List<Func<bool>> SyncDispatcher = [];
22
23 public static event Action<Project> ProjectDisposed;
24
25 public const string fName = "GameManager";
26
31
32 public static void LoadProject(WorldInfo worldInfo, ContainerWidget gamesWidget) {
36 BlocksManager.LoadBlocksStaticly = string.IsNullOrEmpty(worldInfo.APIVersion);
37 using (Stream stream = Storage.OpenFile(Storage.CombinePaths(worldInfo.DirectoryName, "Project.xml"), OpenFileMode.Read)) {
38 ValuesDictionary valuesDictionary = new();
39 ValuesDictionary valuesDictionary2 = new();
40 valuesDictionary.SetValue("GameInfo", valuesDictionary2);
41 valuesDictionary2.SetValue("WorldDirectoryName", worldInfo.DirectoryName);
42 ValuesDictionary valuesDictionary3 = new();
43 valuesDictionary.SetValue("Views", valuesDictionary3);
44 valuesDictionary3.SetValue("GamesWidget", gamesWidget);
45 XElement projectNode = XmlUtils.LoadXmlFromStream(stream, null, true);
47 "ProjectXmlLoad",
48 loader => {
49#pragma warning disable CS0618
50 loader.ProjectXmlLoad(projectNode);
51#pragma warning restore CS0618
52 loader.ProjectXmlLoad(projectNode, worldInfo, gamesWidget);
53 return false;
54 }
55 );
56 Project.OnProjectLoad += delegate(Project project) {
58 "OnProjectLoaded",
59 loader => {
60 loader.OnProjectLoaded(project);
61 return false;
62 }
63 );
64 };
65 Project.EntityAdded += (_, arg) => {
67 "OnEntityAdd",
68 loader => {
69 loader.OnEntityAdd(arg.Entity);
70 return false;
71 }
72 );
73 };
74 Project.EntityRemoved += (_, arg) => {
76 "OnEntityRemove",
77 loader => {
78 loader.OnEntityRemove(arg.Entity);
79 return false;
80 }
81 );
82 };
83 Entity.EntityComponentsInitialized += (entity, componentList) => {
85 "EntityComponentsInitialized",
86 loader => {
87 loader.EntityComponentsInitialized(entity, componentList);
88 return false;
89 }
90 );
91 };
94 "ProjectBeforeSubsystemsAndEntitiesLoad",
95 loader => {
96 loader.ProjectBeforeSubsystemsAndEntitiesLoad(project);
97 return false;
98 }
99 );
100 };
101 ProjectData projectData = new(DatabaseManager.GameDatabase, projectNode, valuesDictionary, true);
102 m_project = new Project(DatabaseManager.GameDatabase, projectData);
103 m_subsystemUpdate = m_project.FindSubsystem<SubsystemUpdate>(true);
104 }
105 m_worldInfo = worldInfo;
108 LanguageControl.Get("GameMode", worldInfo.WorldSettings.GameMode.ToString()),
109 LanguageControl.Get("StartingPositionMode", worldInfo.WorldSettings.StartingPositionMode.ToString()),
110 worldInfo.WorldSettings.Name,
112 LanguageControl.Get("ResolutionMode", SettingsManager.ResolutionMode.ToString())
113 );
114 GC.Collect();
115 }
116
117 public static void SaveProject(bool waitForCompletion, bool showErrorDialog) {
118 if (m_project != null) {
119 double realTime = Time.RealTime;
120 ProjectData projectData = m_project.Save();
121 m_saveCompleted.WaitOne();
122 m_saveCompleted.Reset();
123 SubsystemGameInfo subsystemGameInfo = m_project.FindSubsystem<SubsystemGameInfo>(true);
124 Task.Run(() => InternalSaveProject(projectData, subsystemGameInfo.DirectoryName, showErrorDialog));
125 if (waitForCompletion) {
126 m_saveCompleted.WaitOne();
127 }
128 Log.Verbose(string.Format(LanguageControl.Get(fName, "4"), Math.Round((Time.RealTime - realTime) * 1000.0)));
129 }
130 }
131
132 public static void InternalSaveProject(ProjectData projectData, string directoryName, bool showErrorDialog) {
133 try {
134 string projectFileName = Storage.CombinePaths(directoryName, "Project.xml");
135 WorldsManager.MakeQuickWorldBackup(directoryName);
136 XElement xElement = new("Project");
138 "ProjectXmlSave",
139 loader => {
140 loader.ProjectXmlSave(xElement);
141 return false;
142 }
143 );
144 projectData.Save(xElement);
147 Storage.CreateDirectory(directoryName);
149 "OnProjectXmlSaved",
150 loader => {
151 loader.OnProjectXmlSaved(xElement);
152 return false;
153 }
154 );
155 using (Stream stream = Storage.OpenFile(projectFileName, OpenFileMode.Create)) {
156 XmlUtils.SaveXmlToStream(xElement, stream, null, true);
157 }
158 }
159 catch (Exception ex) {
160 if (showErrorDialog) {
162 delegate {
164 null,
165 new MessageDialog(
167 $"{ex.Message}\n{LanguageControl.Get(fName, "3")}",
169 null,
170 null
171 )
172 );
173 }
174 );
175 }
176 Log.Error($"{LanguageControl.Get(fName, "2")}\n{ex}");
177 }
178 finally {
179 m_saveCompleted.Set();
180 }
181 }
182
183 public static void UpdateProject() {
184 if (SyncDispatcher.Count > 0
185 && SyncDispatcher[0].Invoke()) {
186 SyncDispatcher.RemoveAt(0);
187 }
188 if (m_project != null) {
189 m_subsystemUpdate.Update();
190 }
191 }
192
193 public static void DisposeProject() {
194 if (m_project != null) {
195 ProjectDisposed?.Invoke(m_project);
196 m_project.Dispose();
197 m_project = null;
198 m_subsystemUpdate = null;
199 m_worldInfo = null;
201 "OnProjectDisposed",
202 loader => {
203 loader.OnProjectDisposed();
204 return false;
205 }
206 );
207 GC.Collect();
208 }
209 }
210 }
211}
static void Dispatch(Action action, bool waitUntilCompleted=false)
static void Error(object message)
定义 Log.cs:80
static void Information(object message)
定义 Log.cs:56
static void Verbose(object message)
定义 Log.cs:44
static void CreateDirectory(string path)
static Stream OpenFile(string path, OpenFileMode openFileMode)
static string CombinePaths(params string[] paths)
static double RealTime
定义 Time.cs:38
static GameDatabase GameDatabase
static void ShowDialog(ContainerWidget parentWidget, Dialog dialog)
static void RepairAndUpgradeWorld(WorldInfo worldInfo)
static List< Func< bool > > SyncDispatcher
static SubsystemUpdate m_subsystemUpdate
static void LoadProject(WorldInfo worldInfo, ContainerWidget gamesWidget)
static void SaveProject(bool waitForCompletion, bool showErrorDialog)
static Action< Project > ProjectDisposed
static ManualResetEvent m_saveCompleted
static WorldInfo WorldInfo
static void InternalSaveProject(ProjectData projectData, string directoryName, bool showErrorDialog)
static Project m_project
static WorldInfo m_worldInfo
static void UpdateProject()
static void DisposeProject()
static Project Project
static string Get(string className, int key)
获取在当前语言类名键对应的字符串
static ResolutionMode ResolutionMode
static void UpgradeWorld(string directoryName)
WorldSettings WorldSettings
StartingPositionMode StartingPositionMode
static void MakeQuickWorldBackup(string directoryName)
static void RepairWorldIfNeeded(string directoryName)
Entity(Project project, ValuesDictionary valuesDictionary, int id) static Action< Entity, List< KeyValuePair< int, Component > > > EntityComponentsInitialized
void Save(XElement projectNode)
static EventHandler< EntityAddRemoveEventArgs > EntityAdded
static Action< Project > BeforeSubsystemsAndEntitiesLoad
static Action< Project > OnProjectLoad
static EventHandler< EntityAddRemoveEventArgs > EntityRemoved
static void HookAction(string HookName, Func< ModLoader, bool > action)
执行Hook
static string APIVersionString
static void SetAttributeValue(XElement node, string attributeName, object value)
static XElement LoadXmlFromStream(Stream stream, Encoding encoding, bool throwOnError)
static void SaveXmlToStream(XElement node, Stream stream, Encoding encoding, bool throwOnError)