AxibugEmuOnline/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/IAxiStatus.cs

223 lines
7.6 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
public class AxiEssgssStatusData
{
public Dictionary<string, byte[]> MemberData = new Dictionary<string, byte[]>();
public Dictionary<string, AxiEssgssStatusData_2DArray> Array2DMemberData = new Dictionary<string, AxiEssgssStatusData_2DArray>();
public Dictionary<string, AxiEssgssStatusData> ClassData = new Dictionary<string, AxiEssgssStatusData>();
}
[Serializable]
public class AxiEssgssStatusData_2DArray
{
public int rows;
public int cols;
public byte[] array1D;
public AxiEssgssStatusData_2DArray(byte[,] data2D)
{
rows = data2D.GetLength(0);
cols = data2D.GetLength(1);
array1D = data2D.FlattenByteArray2D();
}
public byte[,] Get2DArrayBytesData()
{
return array1D.CreateByteArray2D(rows, cols);
}
}
public static class AxiEssgssStatusDataExtention
{
public static byte[] ToByteArray(this AxiEssgssStatusData data)
{
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, data);
return ms.ToArray();
}
}
public static AxiEssgssStatusData ToAxiEssgssStatusData(this byte[] byteArray)
{
using (MemoryStream ms = new MemoryStream(byteArray))
{
BinaryFormatter formatter = new BinaryFormatter();
return (AxiEssgssStatusData)formatter.Deserialize(ms);
}
}
}
public interface IAxiStatus
{
public void LoadAxiStatus(AxiEssgssStatusData data);
public AxiEssgssStatusData SaveAxiStatus();
}
internal static class AxiStatus
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊbyte[]
public static byte[] ToByteArray<TEnum>(this TEnum[] enumArray) where TEnum : struct, Enum
{
if (!typeof(TEnum).IsEnum) throw new ArgumentException("TEnum must be an enumerated type");
// <20><>ȡö<C8A1>ٵĻ<D9B5><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>Int32<33><32>
Type enumUnderlyingType = Enum.GetUnderlyingType(typeof(TEnum));
if (enumUnderlyingType != typeof(byte)) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊbyte<74><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>byte<74><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>int<6E><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊbyte<74><65><EFBFBD>
// <20><>Ҫע<D2AA><EFBFBD><E2A3AC><EFBFBD><EFBFBD><EFBFBD>ܻᵼ<DCBB><E1B5BC><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>ʧ<EFBFBD><CAA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>byte<74>ķ<EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD>
// һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD>int[]<5D><><EFBFBD><EFBFBD>Ϊ<EFBFBD>м<EFBFBD><D0BC><EFBFBD>ʾ<EFBFBD><CABE>
// <20><>Ϊ<EFBFBD>˼<EFBFBD><CBBC><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>԰<EFBFBD>ȫ<EFBFBD><C8AB>ת<EFBFBD><D7AA>Ϊbyte<74><65>
// <20><><EFBFBD><EFBFBD><E6A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>int<6E><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB3A3><EFBFBD><EFBFBD>ö<EFBFBD>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD>ֱ<EFBFBD><D6B1>ת<EFBFBD><D7AA>ÿ<EFBFBD><C3BF>ö<EFBFBD><C3B6>ֵΪint<6E><74>
// Ȼ<><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>԰<EFBFBD>ȫ<EFBFBD><C8AB>ת<EFBFBD><D7AA>Ϊbyte<74><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>׳<EFBFBD><D7B3><EFBFBD><ECB3A3>
return enumArray.Select(e =>
{
int intValue = Convert.ToInt32(e);
if (intValue < byte.MinValue || intValue > byte.MaxValue)
throw new OverflowException($"Enum value {e} ({intValue}) is out of range for byte.");
return (byte)intValue;
}).ToArray();
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD>byte<74><65><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>ת<EFBFBD><D7AA>
return Array.ConvertAll(enumArray, e => Convert.ToByte(e));
}
}
// <20><>byte[]ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public static TEnum[] ToEnumArray<TEnum>(this byte[] byteArray) where TEnum : struct, Enum
{
if (!typeof(TEnum).IsEnum) throw new ArgumentException("TEnum must be an enumerated type");
// ֱ<><D6B1>ת<EFBFBD><D7AA>ÿ<EFBFBD><C3BF>byteΪö<CEAA><C3B6>ֵ
return Array.ConvertAll(byteArray, b => (TEnum)Enum.ToObject(typeof(TEnum), b));
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>ת<EFBFBD><D7AA>Ϊbyte[]<5D><>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>̫<EFBFBD><CCAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>һ<EFBFBD><D2BB><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǻ<EFBFBD><C7BB><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public static byte[] ToByteArray<TEnum>(this TEnum enumValue) where TEnum : struct, Enum
{
if (!typeof(TEnum).IsEnum) throw new ArgumentException("TEnum must be an enumerated type");
// <20><>ȡö<C8A1>ٵĻ<D9B5><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Type enumUnderlyingType = Enum.GetUnderlyingType(typeof(TEnum));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊbyte<74><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>԰<EFBFBD>ȫ<EFBFBD><C8AB>ת<EFBFBD><D7AA>Ϊbyte<74><65><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>ö<EFBFBD>ٵĻ<D9B5><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>int<6E><74>
if (enumUnderlyingType == typeof(byte))
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD>byte<74><65><EFBFBD><EFBFBD>ֱ<EFBFBD>ӷ<EFBFBD><D3B7>ذ<EFBFBD><D8B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
return new[] { Convert.ToByte(enumValue) };
}
else if (enumUnderlyingType == typeof(int)) // <20><EFBFBD><EEB3A3><EFBFBD><EFBFBD>ö<EFBFBD>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
// <20><>ö<EFBFBD><C3B6>ֵת<D6B5><D7AA>Ϊint<6E><74>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>԰<EFBFBD>ȫ<EFBFBD><C8AB>ת<EFBFBD><D7AA>Ϊbyte
int intValue = Convert.ToInt32(enumValue);
if (intValue < byte.MinValue || intValue > byte.MaxValue)
throw new OverflowException($"Enum value {enumValue} ({intValue}) is out of range for byte.");
// <20><><EFBFBD>ذ<EFBFBD><D8B0><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
return new[] { (byte)intValue };
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>byte<74><65>int<6E><74><EFBFBD><EFBFBD><EFBFBD>׳<EFBFBD><D7B3><EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD>
throw new NotSupportedException($"The underlying type of the enum {typeof(TEnum).Name} is not supported.");
}
}
// <20><>byte[]ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ö<EFBFBD>٣<EFBFBD><D9A3><EFBFBD><EFBFBD><EFBFBD>byte[]ֻ<><D6BB>һ<EFBFBD><D2BB><EFBFBD>ֽڣ<D6BD>
public static TEnum ToEnum<TEnum>(this byte[] byteArray) where TEnum : struct, Enum
{
if (byteArray == null || byteArray.Length != 1)
throw new ArgumentException("The byte array must contain exactly one byte.");
// ֱ<>Ӵ<EFBFBD><D3B4>ֽ<EFBFBD>ת<EFBFBD><D7AA>Ϊö<CEAA><C3B6>ֵ
return (TEnum)Enum.ToObject(typeof(TEnum), byteArray[0]);
}
// ushort[] ת byte[]
public static byte[] ToByteArray(this ushort[] ushortArray)
{
byte[] byteArray = new byte[ushortArray.Length * 2];
Buffer.BlockCopy(ushortArray, 0, byteArray, 0, byteArray.Length);
return byteArray;
}
// byte[] ת ushort[]
public static ushort[] ToUShortArray(this byte[] byteArray)
{
if (byteArray.Length % 2 != 0)
throw new ArgumentException("byte<74><65><EFBFBD><EFBFBD>ȱ<EFBFBD><C8B1><EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD><C5BC>");
ushort[] ushortArray = new ushort[byteArray.Length / 2];
Buffer.BlockCopy(byteArray, 0, ushortArray, 0, byteArray.Length);
return ushortArray;
}
public static byte[] ToByteArray(this bool[] boolArr)
{
byte[] byteArray = new byte[boolArr.Length];
for (int i = 0; i < byteArray.Length; i++)
{
byteArray[i] = (byte)(boolArr[i] ? 1 : 0);
}
return byteArray;
}
public static bool[] ToBoolArray(this byte[] byteArray)
{
bool[] boolArr = new bool[byteArray.Length];
for (int i = 0; i < byteArray.Length; i++)
{
boolArr[i] = byteArray[i] == 0 ? false : true;
}
return boolArr;
}
public static byte[] FlattenByteArray2D(this byte[,] array2D)
{
int rows = array2D.GetLength(0);
int cols = array2D.GetLength(1);
byte[] array1D = new byte[rows * cols];
int index = 0;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
array1D[index++] = array2D[i, j];
}
}
return array1D;
}
public static byte[,] CreateByteArray2D(this byte[] array1D, int rows, int cols)
{
if (array1D.Length != rows * cols)
{
throw new ArgumentException("The length of the 1D array does not match the specified dimensions for the 2D array.");
}
byte[,] array2D = new byte[rows, cols];
int index = 0;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
array2D[i, j] = array1D[index++];
}
}
return array2D;
}
}