24 public static bool IsBuiltIn(
string name) => name.StartsWith(
'$');
27 name = name.ToLower();
28 if (name.Contains(
"female")
29 || name.Contains(
"girl")
30 || name.Contains(
"woman")) {
33 if (name.Contains(
"male")
34 || name.Contains(
"boy")
35 || name.Contains(
"man")) {
50 if (name.Contains(
"Female")) {
51 if (name.Contains(
"1")) {
54 if (name.Contains(
"2")) {
57 if (name.Contains(
"3")) {
62 if (name.Contains(
"1")) {
65 if (name.Contains(
"2")) {
68 if (name.Contains(
"3")) {
79 if (!
string.IsNullOrEmpty(fileName)) {
86 return new DateTime(2000, 1, 1);
93 if (!
string.IsNullOrEmpty(fileName)) {
104 catch (Exception ex) {
105 Log.
Warning($
"Could not load character skin \"{name}\". Reason: {ex.Message}.");
107 if (texture2D ==
null) {
122 stream.Position = 0L;
124 stream.CopyTo(destination);
132 if (!
string.IsNullOrEmpty(fileName)) {
137 catch (Exception e) {
162 switch (playerClass) {
165 default:
throw new InvalidOperationException(
"Unknown player class.");
176 switch (playerClass) {
179 default:
throw new InvalidOperationException(
"Unknown player class.");
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})");
195 throw new InvalidOperationException($
"Character skin does not have power-of-two size (size={image.Width}x{image.Height})");
static Texture2D Load(LegacyImage image, int mipLevelsCount=1)
static void Warning(object message)
static bool IsPowerOf2(uint x)
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 string CharacterSkinsDirectoryName
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 bool IsBuiltIn(string name)
static Dictionary< PlayerClass, Model > m_outerClothingModels
static string GetDisplayName(string name)
static Model GetPlayerModel(PlayerClass playerClass)
static void UpdateCharacterSkinsList()
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