diff --git a/MinecraftUSkinEditor/Classes/Utils/SkinANIM.cs b/MinecraftUSkinEditor/Classes/Utils/SkinANIM.cs index 35ac2d8c..05e2abb4 100644 --- a/MinecraftUSkinEditor/Classes/Utils/SkinANIM.cs +++ b/MinecraftUSkinEditor/Classes/Utils/SkinANIM.cs @@ -2,9 +2,7 @@ using System.Collections; using System.Linq; using System.Text; -using System.Windows.Forms; using System.Text.RegularExpressions; -using System.Threading.Tasks; namespace PckStudio.Classes.Utils { @@ -52,35 +50,14 @@ namespace PckStudio.Classes.Utils DINNERBONE = 1 << 31, } - internal class SkinANIM + internal struct SkinANIM { - eANIM_EFFECTS _ANIM; - public bool isValid; - - public SkinANIM() - { - _ANIM = 0; - } + eANIM_EFFECTS _ANIM = 0; + static readonly Regex animRegex = new Regex(@"^0x[0-9a-f]{1,8}\b", RegexOptions.IgnoreCase); public SkinANIM(string anim) { - // Port of my ANIM Generator found at https://mattnl.com/lce/anim-generator - MattNL - if (anim.StartsWith("0x")) anim = anim.Substring(2); - isValid = anim.Length <= 8 && Regex.IsMatch(anim, @"\A\b[0-9a-fA-F]+\b\Z"); - if (isValid) - { - anim = anim.PadLeft(8, '0'); - string bits = String.Join("", anim.Select( - b => Convert.ToString(Convert.ToInt32(b.ToString(), 16), 2).PadLeft(4, '0') - ) - ); - int current_bit = 31; - foreach (char bit in bits) - { - SetANIMFlag((eANIM_EFFECTS)(1 << current_bit), bit == '1'); - current_bit--; - } - } + _ANIM = Parse(anim); } public SkinANIM(eANIM_EFFECTS anim) @@ -88,17 +65,23 @@ namespace PckStudio.Classes.Utils _ANIM = anim; } - public override string ToString() - { - // Thanks miku :D - MattNL - return "0x" + ((int)_ANIM).ToString("x08"); - } + public override string ToString() => "0x" + _ANIM.ToString("x"); + + public static bool IsValidANIM(string anim) => animRegex.IsMatch(anim); + + public static eANIM_EFFECTS Parse(string anim) + => IsValidANIM(anim) + ? (eANIM_EFFECTS)Convert.ToInt32(anim, 16) + : 0; + + public void SetANIM(int anim) => SetANIM((eANIM_EFFECTS)anim); + public void SetANIM(eANIM_EFFECTS anim) => _ANIM = anim; /// /// Sets the desired flag in the bitfield /// - /// ANIM Flag to be set - /// wether to enable the flag + /// ANIM Flag to set + /// Wether to enable the flag public void SetANIMFlag(eANIM_EFFECTS flag, bool state) { if (state) _ANIM |= flag; @@ -112,7 +95,7 @@ namespace PckStudio.Classes.Utils /// Bool wether its set or not public bool GetANIMFlag(eANIM_EFFECTS flag) { - return ((int)_ANIM & (int)flag) != 0; + return (_ANIM & flag) != 0; } } } diff --git a/MinecraftUSkinEditor/Forms/Utilities/Skins/ANIMEditor.cs b/MinecraftUSkinEditor/Forms/Utilities/Skins/ANIMEditor.cs index 73b4c424..8027ca9b 100644 --- a/MinecraftUSkinEditor/Forms/Utilities/Skins/ANIMEditor.cs +++ b/MinecraftUSkinEditor/Forms/Utilities/Skins/ANIMEditor.cs @@ -64,8 +64,8 @@ namespace PckStudio.Forms.Utilities.Skins public ANIMEditor(string ANIM) { InitializeComponent(); + if (!SkinANIM.IsValidANIM(ANIM)) Close(); anim = new SkinANIM(ANIM); - if (!anim.isValid) Close(); bobbingCheckBox.CheckedChanged += (sender, EventArgs) => { flagChanged(sender, EventArgs, eANIM_EFFECTS.HEAD_BOBBING_DISABLED); }; bodyCheckBox.CheckedChanged += (sender, EventArgs) => { flagChanged(sender, EventArgs, eANIM_EFFECTS.BODY_DISABLED); }; @@ -147,11 +147,10 @@ namespace PckStudio.Forms.Utilities.Skins private void importButton_Click(object sender, EventArgs e) { - SkinANIM check = new SkinANIM(":3"); string new_value = ""; bool first = true; - while (!check.isValid) + while (!SkinANIM.IsValidANIM(new_value)) { if (!first) MessageBox.Show("The following value \"" + new_value + "\" is not valid. Please try again."); RenamePrompt diag = new RenamePrompt(new_value); @@ -160,12 +159,11 @@ namespace PckStudio.Forms.Utilities.Skins if (diag.ShowDialog() == DialogResult.OK) { new_value = diag.NewText; - check = new SkinANIM(new_value); } else return; first = false; } - anim = check; + anim = new SkinANIM(new_value); processCheckBoxes(); }