using System; using System.Runtime.InteropServices; using BrewMonster.Scripts.Task; namespace PerfectWorld.Scripts.Task { [Serializable] [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct AWARD_ITEMS_CAND { public uint m_ulAwardItems; public uint m_ulAwardCmnItems; public uint m_ulAwardTskItems; [MarshalAs(UnmanagedType.ByValArray, SizeConst = TaskInterfaceConstants.MAX_ITEM_AWARD)] public ITEM_WANTED[] m_AwardItems; [MarshalAs(UnmanagedType.U1)] public bool m_bRandChoose; public int MarshalBasicData(byte[] pData) { int offset = 0; pData[offset] = m_bRandChoose ? (byte)1 : (byte)0; offset++; pData[offset] = (byte)m_ulAwardItems; offset++; int sz = Marshal.SizeOf(typeof(ITEM_WANTED)) * (int)m_ulAwardItems; if (sz > 0) { // Copy ITEM_WANTED array data for (int i = 0; i < m_ulAwardItems; i++) { // Would need to implement proper marshaling here // For now, just increase offset by appropriate size offset += Marshal.SizeOf(typeof(ITEM_WANTED)); } } return offset; } public int UnmarshalBasicData(byte[] pData) { int offset = 0; m_bRandChoose = pData[offset] != 0; offset++; m_ulAwardItems = pData[offset]; offset++; if (m_ulAwardItems > 0) { m_AwardItems = new ITEM_WANTED[m_ulAwardItems]; // Copy ITEM_WANTED array data for (uint i = 0; i < m_ulAwardItems; i++) { // Would need to implement proper unmarshaling here // For now, just increase offset by appropriate size offset += Marshal.SizeOf(typeof(ITEM_WANTED)); if (m_AwardItems[i].m_bCommonItem) m_ulAwardCmnItems++; else m_ulAwardTskItems++; } } return offset; } public static bool operator ==(AWARD_ITEMS_CAND a, AWARD_ITEMS_CAND b) { if (a.m_ulAwardItems != b.m_ulAwardItems) return false; for (uint i = 0; i < a.m_ulAwardItems; ++i) { if (!(a.m_AwardItems[i].Equals(b.m_AwardItems[i]))) return false; } return (a.m_ulAwardCmnItems == b.m_ulAwardCmnItems && a.m_ulAwardTskItems == b.m_ulAwardTskItems && a.m_bRandChoose == b.m_bRandChoose); } public static bool operator !=(AWARD_ITEMS_CAND a, AWARD_ITEMS_CAND b) { return !(a == b); } public override bool Equals(object obj) { if (obj is AWARD_ITEMS_CAND) return this == (AWARD_ITEMS_CAND)obj; return false; } public override int GetHashCode() { return m_ulAwardItems.GetHashCode() ^ m_ulAwardCmnItems.GetHashCode() ^ m_ulAwardTskItems.GetHashCode() ^ m_bRandChoose.GetHashCode(); } } }