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();
}