Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
CharacterSkinsManager.cs
浏览该文件的文档.
1using Engine;
3using Engine.Media;
5
6namespace Game {
7 public static class CharacterSkinsManager {
8 public static List<string> m_characterSkinNames = [];
9
10 public static Dictionary<PlayerClass, Model> m_playerModels = [];
11
12 public static Dictionary<PlayerClass, Model> m_outerClothingModels = [];
13
14 public static ReadOnlyList<string> CharacterSkinsNames => new(m_characterSkinNames);
15
17
18 public static event Action<string> CharacterSkinDeleted;
19
23
24 public static bool IsBuiltIn(string name) => name.StartsWith('$');
25
26 public static PlayerClass? GetPlayerClass(string name) {
27 name = name.ToLower();
28 if (name.Contains("female")
29 || name.Contains("girl")
30 || name.Contains("woman")) {
31 return PlayerClass.Female;
32 }
33 if (name.Contains("male")
34 || name.Contains("boy")
35 || name.Contains("man")) {
36 return PlayerClass.Male;
37 }
38 return null;
39 }
40
41 public static string GetFileName(string name) {
42 if (IsBuiltIn(name)) {
43 return null;
44 }
46 }
47
48 public static string GetDisplayName(string name) {
49 if (IsBuiltIn(name)) {
50 if (name.Contains("Female")) {
51 if (name.Contains("1")) {
52 return "Doris";
53 }
54 if (name.Contains("2")) {
55 return "Mabel";
56 }
57 if (name.Contains("3")) {
58 return "Ada";
59 }
60 return "Shirley";
61 }
62 if (name.Contains("1")) {
63 return "Walter";
64 }
65 if (name.Contains("2")) {
66 return "Basil";
67 }
68 if (name.Contains("3")) {
69 return "Geoffrey";
70 }
71 return "Zachary";
72 }
74 }
75
76 public static DateTime GetCreationDate(string name) {
77 try {
78 string fileName = GetFileName(name);
79 if (!string.IsNullOrEmpty(fileName)) {
80 return Storage.GetFileLastWriteTime(fileName);
81 }
82 }
83 catch {
84 // ignored
85 }
86 return new DateTime(2000, 1, 1);
87 }
88
89 public static Texture2D LoadTexture(string name) {
90 Texture2D texture2D = null;
91 try {
92 string fileName = GetFileName(name);
93 if (!string.IsNullOrEmpty(fileName)) {
94 using (Stream stream = Storage.OpenFile(fileName, OpenFileMode.Read)) {
96 stream.Position = 0L;
97 texture2D = Texture2D.Load(stream);
98 }
99 }
100 else {
101 texture2D = ContentManager.Get<Texture2D>($"Textures/Creatures/Human{name.Substring(1).Replace(" ", "")}");
102 }
103 }
104 catch (Exception ex) {
105 Log.Warning($"Could not load character skin \"{name}\". Reason: {ex.Message}.");
106 }
107 if (texture2D == null) {
108 texture2D = ContentManager.Get<Texture2D>("Textures/Creatures/HumanMale1");
109 }
110 return texture2D;
111 }
112
113 public static string ImportCharacterSkin(string name, Stream stream) {
115 if (ex != null) {
116 throw ex;
117 }
118 if (Storage.GetExtension(name) != ".scskin") {
119 name += ".scskin";
120 }
121 ValidateCharacterSkin(stream);
122 stream.Position = 0L;
123 using (Stream destination = Storage.OpenFile(GetFileName(name), OpenFileMode.Create)) {
124 stream.CopyTo(destination);
125 return name;
126 }
127 }
128
129 public static void DeleteCharacterSkin(string name) {
130 try {
131 string fileName = GetFileName(name);
132 if (!string.IsNullOrEmpty(fileName)) {
133 Storage.DeleteFile(fileName);
134 CharacterSkinDeleted?.Invoke(name);
135 }
136 }
137 catch (Exception e) {
138 ExceptionManager.ReportExceptionToUser($"Unable to delete character skin \"{name}\"", e);
139 }
140 }
141
142 public static void UpdateCharacterSkinsList() {
143 m_characterSkinNames.Clear();
144 m_characterSkinNames.Add("$Male1");
145 m_characterSkinNames.Add("$Male2");
146 m_characterSkinNames.Add("$Male3");
147 m_characterSkinNames.Add("$Male4");
148 m_characterSkinNames.Add("$Female1");
149 m_characterSkinNames.Add("$Female2");
150 m_characterSkinNames.Add("$Female3");
151 m_characterSkinNames.Add("$Female4");
152 foreach (string item in Storage.ListFileNames(CharacterSkinsDirectoryName)) {
153 if (Storage.GetExtension(item).ToLower() == ".scskin") {
154 m_characterSkinNames.Add(item);
155 }
156 }
157 }
158
159 public static Model GetPlayerModel(PlayerClass playerClass) {
160 if (!m_playerModels.TryGetValue(playerClass, out Model value)) {
161 ValuesDictionary valuesDictionary;
162 switch (playerClass) {
163 case PlayerClass.Male: valuesDictionary = DatabaseManager.FindEntityValuesDictionary("MalePlayer", true); break;
164 case PlayerClass.Female: valuesDictionary = DatabaseManager.FindEntityValuesDictionary("FemalePlayer", true); break;
165 default: throw new InvalidOperationException("Unknown player class.");
166 }
167 value = ContentManager.Get<Model>(valuesDictionary.GetValue<ValuesDictionary>("HumanModel").GetValue<string>("ModelName"));
168 m_playerModels.Add(playerClass, value);
169 }
170 return value;
171 }
172
173 public static Model GetOuterClothingModel(PlayerClass playerClass) {
174 if (!m_outerClothingModels.TryGetValue(playerClass, out Model value)) {
175 ValuesDictionary valuesDictionary;
176 switch (playerClass) {
177 case PlayerClass.Male: valuesDictionary = DatabaseManager.FindEntityValuesDictionary("MalePlayer", true); break;
178 case PlayerClass.Female: valuesDictionary = DatabaseManager.FindEntityValuesDictionary("FemalePlayer", true); break;
179 default: throw new InvalidOperationException("Unknown player class.");
180 }
181 value = ContentManager.Get<Model>(valuesDictionary.GetValue<ValuesDictionary>("OuterClothingModel").GetValue<string>("ModelName"));
182 m_outerClothingModels.Add(playerClass, value);
183 }
184 return value;
185 }
186
187 public static void ValidateCharacterSkin(Stream stream) {
188 Image image = Image.Load(stream);
189 if (image.Width > 65536
190 || image.Height > 65536) {
191 throw new InvalidOperationException($"Character skin is larger than 65536x65536 pixels (size={image.Width}x{image.Height})");
192 }
193 if (!MathUtils.IsPowerOf2(image.Width)
194 || !MathUtils.IsPowerOf2(image.Height)) {
195 throw new InvalidOperationException($"Character skin does not have power-of-two size (size={image.Width}x{image.Height})");
196 }
197 }
198 }
199}
static Texture2D Load(LegacyImage image, int mipLevelsCount=1)
static void Warning(object message)
定义 Log.cs:68
static bool IsPowerOf2(uint x)
static Image Load(Stream stream, ImageFileFormat format)
static void CreateDirectory(string path)
static IEnumerable< string > ListFileNames(string path)
static Stream OpenFile(string path, OpenFileMode openFileMode)
static string GetExtension(string path)
static DateTime GetFileLastWriteTime(string path)
static string GetFileNameWithoutExtension(string path)
static void DeleteFile(string path)
static string CombinePaths(params string[] paths)
static List< string > m_characterSkinNames
static string GetFileName(string name)
static Model GetOuterClothingModel(PlayerClass playerClass)
static Texture2D LoadTexture(string name)
static void ValidateCharacterSkin(Stream stream)
static ReadOnlyList< string > CharacterSkinsNames
static Dictionary< PlayerClass, Model > m_playerModels
static ? PlayerClass GetPlayerClass(string name)
static DateTime GetCreationDate(string name)
static void DeleteCharacterSkin(string name)
static string ImportCharacterSkin(string name, Stream stream)
static Action< string > CharacterSkinDeleted
static Dictionary< PlayerClass, Model > m_outerClothingModels
static string GetDisplayName(string name)
static Model GetPlayerModel(PlayerClass playerClass)
static object Get(Type type, string name)
static ValuesDictionary FindEntityValuesDictionary(string entityTemplateName, bool throwIfNotFound)
static void ReportExceptionToUser(string additionalMessage, Exception e)
static Exception VerifyExternalContentName(string name)
static string CharacterSkinsDirectoryName