Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
ManageContentScreen.cs
浏览该文件的文档.
1using System.Globalization;
2using System.Xml.Linq;
3using Engine;
5using Game;
6
7public class ManageContentScreen : Screen {
8 public class ListItem {
10
11 public bool IsBuiltIn;
12
13 public string Name;
14
15 public string DisplayName;
16
17 public DateTime CreationTime;
18
19 public int UseCount;
20 public bool IsClick;
22
24 }
25
26 public static string fName = "ManageContentScreen";
27
29
31
33
35
37
39
41
42 public bool changeed = false;
43
45
47 XElement node = ContentManager.Get<XElement>("Screens/ManageContentScreen");
48 LoadContents(this, node);
49 m_contentList = Children.Find<ListPanelWidget>("ContentList");
50 m_deleteButton = Children.Find<ButtonWidget>("DeleteButton");
51 m_uploadButton = Children.Find<ButtonWidget>("UploadButton");
52 m_changeFilterButton = Children.Find<ButtonWidget>("ChangeFilter");
53 m_filterLabel = Children.Find<LabelWidget>("Filter");
54 m_contentList.ItemWidgetFactory = delegate(object obj) {
55 ListItem listItem = (ListItem)obj;
56 ContainerWidget containerWidget;
57 switch (listItem.Type) {
58 case ExternalContentType.BlocksTexture: {
59 XElement node2 = ContentManager.Get<XElement>("Widgets/BlocksTextureItem");
60 containerWidget = (ContainerWidget)LoadWidget(this, node2, null);
61 RectangleWidget rectangleWidget = containerWidget.Children.Find<RectangleWidget>("BlocksTextureItem.Icon");
62 LabelWidget labelWidget = containerWidget.Children.Find<LabelWidget>("BlocksTextureItem.Text");
63 LabelWidget labelWidget2 = containerWidget.Children.Find<LabelWidget>("BlocksTextureItem.Details");
64 Texture2D texture = m_blocksTexturesCache.GetTexture(listItem.Name);
66 rectangleWidget.Subtexture = new Subtexture(texture, Vector2.Zero, Vector2.One);
67 labelWidget.Text = listItem.DisplayName;
68 labelWidget2.Text = string.Format(LanguageControl.Get(fName, 1), texture.Width, texture.Height);
69 if (!listItem.IsBuiltIn) {
70 labelWidget2.Text += $" | {listItem.CreationTime.ToLocalTime():dd MMM yyyy HH:mm}";
71 if (listItem.UseCount > 0) {
72 labelWidget2.Text += string.Format(LanguageControl.Get(fName, 2), listItem.UseCount);
73 }
74 }
75 break;
76 }
77 case ExternalContentType.FurniturePack: {
78 XElement node3 = ContentManager.Get<XElement>("Widgets/FurniturePackItem");
79 containerWidget = (ContainerWidget)LoadWidget(this, node3, null);
80 LabelWidget labelWidget3 = containerWidget.Children.Find<LabelWidget>("FurniturePackItem.Text");
81 LabelWidget labelWidget4 = containerWidget.Children.Find<LabelWidget>("FurniturePackItem.Details");
82 labelWidget3.Text = listItem.DisplayName;
83 try {
84 List<FurnitureDesign> designs = FurniturePacksManager.LoadFurniturePack(null, listItem.Name);
85 labelWidget4.Text = string.Format(LanguageControl.Get(fName, 3), FurnitureDesign.ListChains(designs).Count);
86 if (string.IsNullOrEmpty(listItem.Name)) {
87 return containerWidget;
88 }
89 labelWidget4.Text += $" | {listItem.CreationTime.ToLocalTime():dd MMM yyyy HH:mm}";
90 return containerWidget;
91 }
92 catch (Exception ex) {
93 labelWidget4.Text = labelWidget4.Text + LanguageControl.Error + ex.Message;
94 return containerWidget;
95 }
96 }
97 case ExternalContentType.CharacterSkin: {
98 XElement node4 = ContentManager.Get<XElement>("Widgets/CharacterSkinItem");
99 containerWidget = (ContainerWidget)LoadWidget(this, node4, null);
100 PlayerModelWidget playerModelWidget = containerWidget.Children.Find<PlayerModelWidget>("CharacterSkinItem.Model");
101 LabelWidget labelWidget5 = containerWidget.Children.Find<LabelWidget>("CharacterSkinItem.Text");
102 LabelWidget labelWidget6 = containerWidget.Children.Find<LabelWidget>("CharacterSkinItem.Details");
103 Texture2D texture2 = m_characterSkinsCache.GetTexture(listItem.Name);
104 playerModelWidget.PlayerClass = PlayerClass.Male;
105 playerModelWidget.CharacterSkinTexture = texture2;
106 labelWidget5.Text = listItem.DisplayName;
107 labelWidget6.Text = string.Format(LanguageControl.Get(fName, 4), texture2.Width, texture2.Height);
108 if (!listItem.IsBuiltIn) {
109 labelWidget6.Text += $" | {listItem.CreationTime.ToLocalTime():dd MMM yyyy HH:mm}";
110 if (listItem.UseCount > 0) {
111 labelWidget6.Text += string.Format(LanguageControl.Get(fName, 2), listItem.UseCount);
112 }
113 }
114 break;
115 }
116 case ExternalContentType.Mod: {
117 XElement node2 = ContentManager.Get<XElement>("Widgets/BlocksTextureItem");
118 containerWidget = (ContainerWidget)LoadWidget(this, node2, null);
119 RectangleWidget rectangleWidget = containerWidget.Children.Find<RectangleWidget>("BlocksTextureItem.Icon");
120 LabelWidget labelWidget = containerWidget.Children.Find<LabelWidget>("BlocksTextureItem.Text");
121 LabelWidget labelWidget2 = containerWidget.Children.Find<LabelWidget>("BlocksTextureItem.Details");
122 rectangleWidget.Subtexture = listItem.Texture == null
123 ? ContentManager.Get<Subtexture>("Textures/Atlas/WorldIcon")
124 : new Subtexture(listItem.Texture, Vector2.Zero, Vector2.One);
125 rectangleWidget.TextureLinearFilter = true;
126 labelWidget.Text = listItem.DisplayName;
127 labelWidget2.Text = listItem.Name;
128 if (!listItem.IsBuiltIn) {
129 labelWidget2.Text += $" | {listItem.CreationTime.ToLocalTime():dd MMM yyyy HH:mm}";
130 if (listItem.UseCount > 0) {
131 labelWidget2.Text += string.Format(LanguageControl.Get(fName, 2), listItem.UseCount);
132 }
133 }
134 break;
135 }
136 default: throw new InvalidOperationException(LanguageControl.Get(fName, 10));
137 }
138 return containerWidget;
139 };
140 m_contentList.ItemClicked += obj => {
141 ListItem listItem = (ListItem)obj;
142 if (listItem.Type == ExternalContentType.Mod
143 && listItem.IsClick) {
144 MessageDialog messageDialog = new(
145 listItem.ModEntity.modInfo.Name,
149 _ => {
151 listItem.IsClick = false;
152 }
153 );
154 DialogsManager.ShowDialog(this, messageDialog);
155 }
156 else {
157 listItem.IsClick = true;
158 }
159 };
160 }
161
162 public override void Enter(object[] parameters) {
163 UpdateList();
164 }
165
166 public override void Leave() {
167 m_blocksTexturesCache.Clear();
168 m_characterSkinsCache.Clear();
169 }
170
171 public override void Update() {
172 ListItem selectedItem = (ListItem)m_contentList.SelectedItem;
173 m_deleteButton.Text = LanguageControl.Get("ModsManageContentScreen", 9);
174 if (selectedItem != null) {
175 m_deleteButton.IsEnabled = !selectedItem.IsBuiltIn;
176 m_uploadButton.IsEnabled = !selectedItem.IsBuiltIn;
177 if (selectedItem.Type == ExternalContentType.Mod) {
178 m_deleteButton.Text = LanguageControl.Get("ModsManageContentScreen", 42);
179 //m_deleteButton.Text = ModsManager.DisabledMods.Contains(selectedItem.ModEntity.modInfo) ? LanguageControl.Enable : LanguageControl.Disable;
180 m_deleteButton.IsEnabled = !(selectedItem.ModEntity is SurvivalCraftModEntity || selectedItem.ModEntity is FastDebugModEntity);
181 }
182 }
183 else {
184 m_deleteButton.IsEnabled = false;
185 m_uploadButton.IsEnabled = false;
186 }
187 m_filterLabel.Text = GetFilterDisplayName(m_filter);
188 if (m_deleteButton.IsClicked) {
189 string smallMessage = selectedItem.UseCount <= 0
190 ? string.Format(LanguageControl.Get(fName, 5), selectedItem.DisplayName)
191 : string.Format(LanguageControl.Get(fName, 6), selectedItem.DisplayName, selectedItem.UseCount);
192 if (selectedItem.Type == ExternalContentType.Mod) {
193 ScreensManager.SwitchScreen("ModsManageContent", true);
194 //smallMessage = (ModsManager.DisabledMods.Contains(selectedItem.ModEntity.modInfo) ? LanguageControl.Enable : LanguageControl.Disable) + $"[{selectedItem.ModEntity.modInfo.Name}]?";
195 }
196 else {
198 null,
199 new MessageDialog(
201 smallMessage,
204 delegate(MessageDialogButton button) {
205 if (button == MessageDialogButton.Button1) {
206 ExternalContentManager.DeleteExternalContent(selectedItem.Type, selectedItem.Name);
207 //if (selectedItem.Type == ExternalContentType.Mod)
208 //{
209 // changeed = true;
210 // if (ModsManager.DisabledMods.Contains(selectedItem.ModEntity.modInfo))
211 // {
212 // ModsManager.DisabledMods.Remove(selectedItem.ModEntity.modInfo);
213 // ModsManager.ModList.Add(selectedItem.ModEntity);
214 // }
215 // else
216 // {
217 // ModsManager.DisabledMods.Add(selectedItem.ModEntity.modInfo);
218 // ModsManager.ModList.Remove(selectedItem.ModEntity);
219 // }
220 //}
221 //else
222 //{
223 // ExternalContentManager.DeleteExternalContent(selectedItem.Type, selectedItem.Name);
224 //}
225 UpdateList();
226 }
227 }
228 )
229 );
230 }
231 }
232 if (m_uploadButton.IsClicked) {
233 ExternalContentManager.ShowUploadUi(selectedItem.Type, selectedItem.Name);
234 }
235 if (m_changeFilterButton.IsClicked) {
236 List<ExternalContentType> list = [
238 ];
240 null,
243 list,
244 60f,
246 delegate(object item) {
247 if ((ExternalContentType)item != m_filter) {
249 UpdateList();
250 }
251 }
252 )
253 );
254 }
255 if (Input.Back
256 || Input.Cancel
257 || Children.Find<ButtonWidget>("TopBar.Back").IsClicked) {
258 if (changeed) {
260 this,
261 new MessageDialog(
266 btn => {
267 DialogsManager.HideAllDialogs();
268 if (btn == MessageDialogButton.Button1) {
269 ModsManager.Reboot();
270 }
271 else {
272 ScreensManager.SwitchScreen("Content");
273 }
274 }
275 )
276 );
277 }
278 else {
279 ScreensManager.SwitchScreen("Content");
280 }
281 }
282 }
283
284 public virtual void UpdateList() {
286 List<ListItem> list = [];
287 if (m_filter == ExternalContentType.BlocksTexture
288 || m_filter == ExternalContentType.Unknown) {
290 foreach (string name2 in BlocksTexturesManager.BlockTexturesNames) {
291 list.Add(
292 new ListItem {
293 Name = name2,
294 IsBuiltIn = BlocksTexturesManager.IsBuiltIn(name2),
295 Type = ExternalContentType.BlocksTexture,
296 DisplayName = BlocksTexturesManager.GetDisplayName(name2),
297 CreationTime = BlocksTexturesManager.GetCreationDate(name2),
298 UseCount = WorldsManager.WorldInfos.Count(wi => wi.WorldSettings.BlocksTextureName == name2)
299 }
300 );
301 }
302 }
303 if (m_filter == ExternalContentType.CharacterSkin
304 || m_filter == ExternalContentType.Unknown) {
306 foreach (string name in CharacterSkinsManager.CharacterSkinsNames) {
307 list.Add(
308 new ListItem {
309 Name = name,
310 IsBuiltIn = CharacterSkinsManager.IsBuiltIn(name),
311 Type = ExternalContentType.CharacterSkin,
312 DisplayName = CharacterSkinsManager.GetDisplayName(name),
313 CreationTime = CharacterSkinsManager.GetCreationDate(name),
314 UseCount = WorldsManager.WorldInfos.Count(wi => wi.PlayerInfos.Any(pi => pi.CharacterSkinName == name))
315 }
316 );
317 }
318 }
319 if (m_filter == ExternalContentType.FurniturePack
320 || m_filter == ExternalContentType.Unknown) {
322 foreach (string furniturePackName in FurniturePacksManager.FurniturePackNames) {
323 list.Add(
324 new ListItem {
325 Name = furniturePackName,
326 IsBuiltIn = false,
327 Type = ExternalContentType.FurniturePack,
328 DisplayName = FurniturePacksManager.GetDisplayName(furniturePackName),
329 CreationTime = FurniturePacksManager.GetCreationDate(furniturePackName)
330 }
331 );
332 }
333 }
334 /*if (m_filter == ExternalContentType.Mod
335 || m_filter == ExternalContentType.Unknown) {
336 foreach (ModEntity modEntity in ModsManager.ModListAll) {
337 string author = string.IsNullOrEmpty(modEntity.modInfo.Author) ? "无" : modEntity.modInfo.Author;
338 list.Add(
339 new ListItem {
340 Name = $"[模组]{modEntity.modInfo.Description}<{author}>",
341 IsBuiltIn = false,
342 Type = ExternalContentType.Mod,
343 DisplayName = $"{modEntity.modInfo.Name} 版本:{modEntity.modInfo.Version}",
344 CreationTime = DateTime.Now,
345 Texture = modEntity.Icon,
346 ModEntity = modEntity
347 }
348 );
349 }
350 }*/
351 list.Sort(
352 delegate(ListItem o1, ListItem o2) {
353 if (o1.IsBuiltIn
354 && !o2.IsBuiltIn) {
355 return -1;
356 }
357 if (o2.IsBuiltIn
358 && !o1.IsBuiltIn) {
359 return 1;
360 }
361 if (string.IsNullOrEmpty(o1.Name)
362 && !string.IsNullOrEmpty(o2.Name)) {
363 return -1;
364 }
365 return !string.IsNullOrEmpty(o1.Name) && string.IsNullOrEmpty(o2.Name)
366 ? 1
367 : string.Compare(o1.DisplayName, o2.DisplayName, CultureInfo.InvariantCulture, CompareOptions.None);
368 }
369 );
370 m_contentList.ClearItems();
371 foreach (ListItem item in list) {
372 m_contentList.AddItem(item);
373 }
374 }
375
379}
static DateTime GetCreationDate(string name)
static ReadOnlyList< string > BlockTexturesNames
static string GetDisplayName(string name)
static ReadOnlyList< string > CharacterSkinsNames
static DateTime GetCreationDate(string name)
static string GetDisplayName(string name)
readonly WidgetsList Children
static object Get(Type type, string name)
static void ShowDialog(ContainerWidget parentWidget, Dialog dialog)
static void ShowUploadUi(ExternalContentType type, string name)
static void DeleteExternalContent(ExternalContentType type, string name)
static string GetEntryTypeDescription(ExternalContentType type)
static List< List< FurnitureDesign > > ListChains(IEnumerable< FurnitureDesign > designs)
static DateTime GetCreationDate(string name)
static ReadOnlyList< string > FurniturePackNames
static string GetDisplayName(string name)
static List< FurnitureDesign > LoadFurniturePack(SubsystemTerrain subsystemTerrain, string name)
static string Get(string className, int key)
获取在当前语言类名键对应的字符串
string Description
static void SwitchScreen(string name, params object[] parameters)
virtual string Name
static Widget LoadWidget(object eventsTarget, XElement node, ContainerWidget parentWidget)
virtual void LoadContents(object eventsTarget, XElement node)
Widget Find(string name, Type type, bool throwIfNotFound=true)
static void UpdateWorldsList()
static ReadOnlyList< WorldInfo > WorldInfos
static string GetFilterDisplayName(ExternalContentType filter)
override void Enter(object[] parameters)
CharacterSkinsCache m_characterSkinsCache
BlocksTexturesCache m_blocksTexturesCache
static readonly Vector2 Zero
static readonly Vector2 One