// get unit from the global unit list private D2Unit UnitByTypeAndGuid(D2UnitType type, int guid) { if (memory.Units114 != null) { // 1.14 // for 1.14d see around game.463940 int size = Marshal.SizeOf(typeof(D2GameUnitList)); var addr = (IntPtr)memory.Units114 + (int)type * size; var list = reader.Read <D2GameUnitList>(addr); DataPointer unitAddress = list[guid & 0x7F]; return(UnitByGuid(unitAddress, guid)); } if (memory.Units113 != null) { // 1.13 // for 1.13d see function D2Client.dll+89CE0 // for 1.13c see function around D2Client.QueryInterface+FB14 var unitAddrPointer = (IntPtr)memory.Units113 + (int)(guid & 0x7F) * 4; var addr = reader.ReadAddress32(unitAddrPointer); return(UnitByGuid(addr, guid)); } return(null); }
private IEnumerable <D2Unit> IterateUnits(D2UnitType type) { if (memory.Units114 != null) { // 1.14 // for 1.14d see around game.463940 int size = Marshal.SizeOf(typeof(D2GameUnitList)); var addr = (IntPtr)memory.Units114 + (int)type * size; var list = reader.Read <D2GameUnitList>(addr); foreach (var unitAddr in list.Units) { if (unitAddr.IsNull) { continue; } var unit = reader.Read <D2Unit>(unitAddr); while (unit != null) { if (unit.eType != type) { break; } yield return(unit); if (unit.pPrevUnit.IsNull) { break; } unit = reader.Read <D2Unit>(unit.pPrevUnit); } ; } } if (memory.Units113 != null) { // 1.13 // for 1.13d see function D2Client.dll+89CE0 // for 1.13c see function around D2Client.QueryInterface+FB14 for (var guid = 0; guid <= 0x7F; guid++) { var unitAddrPointer = (IntPtr)memory.Units113 + (int)(guid & 0x7F) * 4; var unitAddr = reader.ReadAddress32(unitAddrPointer); if ((long)unitAddr == 0) { continue; } var unit = reader.Read <D2Unit>(unitAddr); while (unit != null) { if (unit.eType != type) { break; } yield return(unit); if (unit.pPrevUnit.IsNull) { break; } unit = reader.Read <D2Unit>(unit.pPrevUnit); } ; } } }
// 1.14d: see game.552F60 // get unit from the game unit list private D2Unit UnitByTypeAndGuid(D2Game game, D2UnitType type, int guid) { DataPointer unitAddress = game.UnitLists[(int)type][guid & 0x7F]; return(UnitByGuid(unitAddress, guid)); }