public static ActorCommonData GetTarget() { ActorCommonData acdTarget = null; var queryMonster = ActorCommonDataHelper.EnumerateMonsters().Where(x => x.x0D0_WorldPosX > 0 && x.x188_Hitpoints > 00001 && x.x190_TeamId == 10 && x.x184_ActorType == Enigma.D3.Enums.ActorType.Monster && !x.x004_Name.Contains("sandWasp")); var queryMonsterQuality = queryMonster .Where(x => x.x0B8_MonsterQuality > Enigma.D3.Enums.MonsterQuality.Normal) .OrderBy(x => x.x0B8_MonsterQuality); if (queryMonsterQuality.Any()) { var acd = queryMonsterQuality.First(); WindowHook.SetD3WindowText(string.Format("Target {0} x098_MonsterSnoId:{1}", acd.x004_Name, acd.x098_MonsterSnoId)); return(acd); } var queryMonsterLeft = queryMonster .OrderBy(x => x.x188_Hitpoints); if (queryMonsterLeft.Any()) { var acd = queryMonsterLeft.First(); WindowHook.SetD3WindowText(string.Format("Target {0} x098_MonsterSnoId:{1}", acd.x004_Name, acd.x184_ActorType == Enigma.D3.Enums.ActorType.Monster)); return(acd); } WindowHook.SetD3WindowText("Target NULL"); return(acdTarget); }
//private static bool IsValidMonster(ActorCommonData acd) //{ // return acd.x188_Hitpoints > 0.00001 && // seems to be lower limit for what D3 considers dead // (acd.x194_Flags_Is_Trail_Proxy_Etc & 1) == 0 && // this removes most weird actors // acd.x190_TeamId == 10; // = hostile //} public void GetAllMonsters() { var engine = Engine.Create(); var acds = new ActorCommonData[0]; var pt = System.Diagnostics.Stopwatch.StartNew(); for (int i = 0; i < 1000; i++) { acds = ActorCommonDataHelper.EnumerateMonsters().ToArray(); } pt.Stop(); Console.WriteLine("Getting all monster ACDs 1000 times took " + pt.Elapsed.TotalMilliseconds.ToString("0.00") + "ms"); Console.WriteLine("Max update frequency: " + (1000d / (pt.Elapsed.TotalMilliseconds / 1000)).ToString("0") + "Hz"); Console.WriteLine("Number of ACDs: " + ActorCommonDataHelper.Enumerate(a => true).Count()); Console.ReadLine(); }