111 lines
3.3 KiB
C#
111 lines
3.3 KiB
C#
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();
|
|
}
|
|
}
|
|
} |