forked from sruon/ffxivlib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
PartyMember.cs
126 lines (96 loc) · 4.01 KB
/
PartyMember.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace ffxivlib
{
public class PartyMember : BaseObject<PartyMember.PARTYMEMBERINFO>
{
#region Constructor
public PartyMember(PARTYMEMBERINFO structure, IntPtr address)
: base(structure, address)
{
Initialize();
}
#endregion
#region Properties
public int PlayerID { get; set; }
public string Name { get; set; }
public JOB Job { get; set; }
public byte Level { get; set; }
public int CurrentHP { get; set; }
public int MaxHP { get; set; }
public int CurrentMP { get; set; }
public int MaxMP { get; set; }
public short CurrentTP { get; set; }
public short CurrentGP { get; set; }
public short MaxGP { get; set; }
public Buff.BUFFINFO[] _Buffs { get; set; }
public float X { get; set; }
public float Z { get; set; }
public float Y { get; set; }
#endregion
#region Extra properties
public List<Buff> Buffs
{
get
{
var BuffList = new List<Buff>();
foreach (Buff.BUFFINFO buff in _Buffs)
{
BuffList.Add(new Buff(buff, IntPtr.Zero));
}
return BuffList;
}
}
#endregion
#region Unmanaged structure
[StructLayout(LayoutKind.Explicit, Pack = 1)]
public struct PARTYMEMBERINFO
{
[MarshalAs(UnmanagedType.R4)] [FieldOffset(0x0)] public float X;
[MarshalAs(UnmanagedType.R4)] [FieldOffset(0x4)] public float Z;
[MarshalAs(UnmanagedType.R4)] [FieldOffset(0x8)] public float Y;
[MarshalAs(UnmanagedType.I4)] [FieldOffset(0x18)] public int PlayerID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] [FieldOffset(0x20)] public string Name;
[MarshalAs(UnmanagedType.I1)] [FieldOffset(0x61)] public JOB Job;
[MarshalAs(UnmanagedType.I1)] [FieldOffset(0x63)] public byte Level;
[MarshalAs(UnmanagedType.I4)] [FieldOffset(0x68)] public int CurrentHP;
[MarshalAs(UnmanagedType.I4)] [FieldOffset(0x6C)] public int MaxHP;
[MarshalAs(UnmanagedType.I2)] [FieldOffset(0x70)] public short CurrentMP;
[MarshalAs(UnmanagedType.I2)] [FieldOffset(0x72)] public short MaxMP;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)] [FieldOffset(0x80)] public Buff.BUFFINFO[] _Buffs;
[MarshalAs(UnmanagedType.I1)] [FieldOffset(0x39F)] public byte Padding;
};
#endregion
}
public partial class FFXIVLIB
{
#region Public methods
/// <summary>
/// Deprecated, use getPartyMemberById
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public PartyMember GetPartyMemberInfo(int id)
{
return GetPartyMemberById(id);
}
/// <summary>
/// This function retrieves a PartyMember by its id in the PartyMember array
/// The result might be empty, there is no sanity check at the time
/// </summary>
/// <param name="id">Position in the PartyMember Array, use Constants.PARTY_MEMBER_ARRAY_SIZE as your max (exclusive)</param>
/// <returns>PartyMember object</returns>
/// <exception cref="System.IndexOutOfRangeException">Out of range</exception>
public PartyMember GetPartyMemberById(int id)
{
if (id >= Constants.PARTY_MEMBER_ARRAY_SIZE)
throw new IndexOutOfRangeException();
IntPtr pointer = _mr.ResolvePointerPath(Constants.PARTYPTR);
pointer = IntPtr.Add(pointer, Marshal.SizeOf(typeof (PartyMember.PARTYMEMBERINFO))*id);
var p = new PartyMember(_mr.CreateStructFromAddress<PartyMember.PARTYMEMBERINFO>(pointer), pointer);
return p;
}
#endregion
}
}