internal byte[] GetBytes(RaceMD str) { int size = Marshal.SizeOf(str); byte[] arr = new byte[size]; IntPtr ptr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(str, ptr, true); Marshal.Copy(ptr, arr, 0, size); Marshal.FreeHGlobal(ptr); return(arr); }
private byte[] Serialize(Race rec) { RaceMD raceMD = default; raceMD.RaceId = (ushort)rec.ID; raceMD.RaceName = rec.Name; raceMD.MinimumStrength = (byte)rec.MinimumStrength; raceMD.MaximumStrength = (byte)rec.MaximumStrength; raceMD.MinimumIntellect = (byte)rec.MinimumAgility; raceMD.MaximumIntellect = (byte)rec.MaximumIntellect; raceMD.MinimumWillpower = (byte)rec.MinimumWillpower; raceMD.MaximumWillpower = (byte)rec.MaximumWillpower; raceMD.MinimumAgility = (byte)rec.MinimumAgility; raceMD.MaximumAgility = (byte)rec.MaximumAgility; raceMD.MinimumHealth = (byte)rec.MinimumHealth; raceMD.MaximumHealth = (byte)rec.MaximumHealth; raceMD.MinimumCharm = (byte)rec.MinimumCharm; raceMD.MaximumCharm = (byte)rec.MaximumCharm; raceMD.HitpointModifierPerLevel = (byte)rec.HitpointModifierPerLevel; raceMD.ExperiencePercentage = (byte)rec.ExperiencePercentage; raceMD.AbilityKeys = new byte[Common.MAX_BYTES_FOR_ABILITIES]; raceMD.AbilityValues = new byte[Common.MAX_BYTES_FOR_ABILITIES]; int i = 0; foreach (KeyValuePair <Race.AbilitiesAndModifiers, short> kvp in rec.AbilitiesAndMods) { Race.AbilitiesAndModifiers ability = kvp.Key; short abilityMod = kvp.Value; byte[] k = BitConverter.GetBytes((short)ability); byte[] v = BitConverter.GetBytes(abilityMod); raceMD.AbilityKeys[i] = k[1]; raceMD.AbilityKeys[i + 1] = k[0]; raceMD.AbilityValues[i] = v[1]; raceMD.AbilityValues[i + 1] = v[0]; i += 2; } byte[] unusedByte = { 0x01 }; // Always 0x01 byte[] raceIdAsCharacters = Encoding.ASCII.GetBytes(raceMD.RaceId.ToString()); byte[] padding = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 }; byte length = UshortToByteArray((ushort)(unusedByte.Length + raceIdAsCharacters.Length + padding.Length + Marshal.SizeOf(raceMD)))[1]; var raceHeaderParts = new List <byte[]>(4) { new byte[] { length }, unusedByte, raceIdAsCharacters, padding }; byte[] raceHeader = raceHeaderParts.SelectMany(t => t).ToArray(); byte[] raceRecord = GetBytes(raceMD); return(CombineArrays(raceHeader, raceRecord)); }