private static void ApproachMob(KeyValuePair <int, EliteAPI.EntityEntry> mob, int distanceTolerance, EliteAPI eliteApi) { if (IsWithinRange(mob, distanceTolerance)) { return; } while (true) { // Get updated mob information. mob = FindEntity(mob.Key, eliteApi); // Stop when within melee distance. if (IsWithinRange(mob, MeleeDistance)) { break; } // Switch to first person view. SetViewMode(ViewMode.FirstPerson, eliteApi); // Get updated player information. EliteAPI.XiEntity player = FindPlayer(eliteApi); // Make the player look at the target. FaceHeading(mob, player, eliteApi); // Start moving the player towards the target. StartRunning(eliteApi); Thread.Sleep(100); } StopRunning(eliteApi); }
public void Move(EliteAPI.XiEntity Target) { if (Target == null) { return; } if (Moving) { float dX = lastX - api.Player.X; float dY = lastY - api.Player.Y; float dZ = lastZ - api.Player.Z; double distance = Math.Sqrt(dX * dX + dY * dY + dZ * dZ); if (distance < .1) { Stuck = true; } } float tX = Target.X - api.Player.X; float tY = Target.Y - api.Player.Y; float tZ = Target.Z - api.Player.Z; api.AutoFollow.SetAutoFollowCoords(tX, tY, tZ); api.AutoFollow.IsAutoFollowing = true; lastX = api.Player.X; lastY = api.Player.Y; lastZ = api.Player.Z; HomeStuck = false; Moving = true; }
public static EliteAPI.XiEntity Box(EliteAPI api) { TargetInfo TargetInfo = new TargetInfo(api); for (var x = 0; x < 2048; x++) { EliteAPI.XiEntity entity = api.Entity.GetEntity(x); if (entity.WarpPointer == 0 || entity.HealthPercent == 0 || entity.TargetID <= 0) { continue; } if (entity.Distance < 10 && entity.Name == "Sturdy Pyxis") { pyxis = entity.Face + " " + entity.Render0000; } if (entity.Distance < 10 && entity.Name == "Sturdy Pyxis" && (!grayList.ContainsKey(entity.TargetID) || grayList[entity.TargetID] < DateTime.Now)) { if (entity.Face == 965 && Properties.Settings.Default.blue) { return(entity); } if (entity.Face == 968 && Properties.Settings.Default.red) { return(entity); } } } return(null); }
public static void PlayerFound(EliteAPI.XiEntity entity, int numPlayers) { Player.isAlone = false; bool closerPC = Updates.nearestPC.distance == 0 || entity.Distance < Updates.nearestPC.distance || entity.Name == Updates.nearestPC.name; if (closerPC) { Updates.nearestPC.name = entity.Name; Updates.nearestPC.distance = entity.Distance; } }
/// <summary> /// Npc名からIndexを取得する /// </summary> /// <param name="iNpcName">NpcName</param> /// <returns>NpcIndex</returns> private int findNpcIndexFromName(string iNpcName) { List <string> regStr = new List <string>(); for (int i = 0; i < Constants.MAX_LOOP_COUNT; i++) { for (int j = 0; j < 2048; j++) { EliteAPI.XiEntity ent = api.Entity.GetEntity(j); if (!string.IsNullOrEmpty(ent.Name) && MiscTools.GetRegexString(ent.Name, iNpcName, out regStr)) { return(j); } } Thread.Sleep(settings.BaseWait); } return(-1); }
public static void TpTarget(EliteAPI api) { EliteAPI.TargetInfo t = api.Target.GetTargetInfo(); string targetName = t.TargetName; if (targetName.Length == 0) { Chat.SendEcho(api, "Target not selected."); return; } EliteAPI.XiEntity e = api.Entity.GetEntity((int)t.TargetIndex); Structs.WarpPoint wp = new Structs.WarpPoint(); Structs.Position p = new Structs.Position(); p.X = e.X; p.Y = e.Z; p.Z = e.Y; wp.pos = p; wp.zone = api.Player.ZoneId; Chat.SendEcho(api, "Approaching " + targetName + "."); Player.Warp(api, wp); }
public static void Search(EliteAPI api, EliteAPI.XiEntity entity) { string target = Player.Search.target.ToLower(); Console.WriteLine(entity.Name); //Found target if (entity.Name.ToLower().Contains(target)) { Player.Search.isSearching = false; Player.Search.status = Structs.Search.success; Chat.SendEcho(api, Chat.Search.success); EliteAPI.TargetInfo t = api.Target.GetTargetInfo(); if (t.TargetIndex != entity.TargetID) { //Not targeted, so set target! api.Target.SetTarget(Convert.ToInt32(entity.TargetID)); } return; } }
public static NpcType GetNpcType(EliteAPI.XiEntity entity) { if (entity.WarpPointer == 0) { return(NpcType.InanimateObject); } if (IsOfType(entity.SpawnFlags, (int)NpcType.Mob)) { return(NpcType.Mob); } if (IsOfType(entity.SpawnFlags, (int)NpcType.NPC)) { return(NpcType.NPC); } if (IsOfType(entity.SpawnFlags, (int)NpcType.PC)) { return(NpcType.PC); } if (IsOfType(entity.SpawnFlags, (int)NpcType.Self)) { return(NpcType.Self); } return(NpcType.InanimateObject); }
static void SlaveNavDoWork() { Queue <point> followqueue = new Queue <point>(); bool zoneAttempt = false; while (1 == 1) { if (slave == null || master == null) { continue; } PlayerInfo PlayerInfo = new PlayerInfo(slave); TargetInfo TargetInfo = new TargetInfo(slave); Movement Movement = new Movement(slave); Recast Recast = new Recast(slave); System.Threading.Thread.Sleep(100); if (slave.Player.Status == 0) { if (Box(slave) != null && CheckItem(slave, "Forbidden Key")) { if (TargetInfo.ID != Box(slave).TargetID) { TargetInfo.SetTarget((int)Box(slave).TargetID); continue; } else if (TargetInfo.Distance > 3) { Movement.Move(Box(slave)); continue; } else { Movement.Stop(); slave.ThirdParty.SendString("item \"Forbidden Key\" <t>"); if (!grayList.ContainsKey(Box(slave).TargetID)) { grayList.Add(Box(slave).TargetID, DateTime.Now.AddSeconds(20)); } else { grayList[Box(slave).TargetID] = DateTime.Now.AddSeconds(20); } Thread.Sleep(1500); continue; } } } switch (master.Player.Status) { case 85: case 0: case 4: case 33: if (master.Player.ZoneId != slave.Player.ZoneId && Properties.Settings.Default.follow) { if (!zoneAttempt) { slave.ThirdParty.KeyDown(EliteMMO.API.Keys.W); Thread.Sleep(1000); slave.ThirdParty.KeyUp(EliteMMO.API.Keys.W); zoneAttempt = true; } } else { zoneAttempt = false; } if (slave.Player.Status == 1 && Properties.Settings.Default.attack) { slave.ThirdParty.SendString("/attackoff"); continue; } if (master.Player.Status == 85 && slave.Player.Status != 85 && Properties.Settings.Default.mount) { slave.ThirdParty.SendString("/mount " + Properties.Settings.Default.mountname); continue; } if (master.Player.Status != 85 && slave.Player.Status == 85 && Properties.Settings.Default.mount) { slave.ThirdParty.SendString("/dismount"); continue; } followqueue.Enqueue(new point(master.Player.X, master.Player.Y, master.Player.Z, master.Player.ZoneId)); if (Properties.Settings.Default.follow) { if (followqueue.Count > 15) { point approach = followqueue.Dequeue(); float dX = approach.x - slave.Player.X; float dY = approach.y - slave.Player.Y; float dZ = approach.z - slave.Player.Z; float distance = (float)Math.Abs(Math.Sqrt(dX * dX + dY * dY + dZ * dZ)); if (distance > .3 && approach.zoneID == slave.Player.ZoneId && !PlayerInfo.Casting) { slave.AutoFollow.SetAutoFollowCoords(dX, dY, dZ); slave.AutoFollow.IsAutoFollowing = true; } else { if (approach.zoneID == slave.Player.ZoneId) { slave.AutoFollow.IsAutoFollowing = false; } } } else { slave.AutoFollow.IsAutoFollowing = false; } } else { if (followqueue.Count > 15) { followqueue.Dequeue(); } } if (!PlayerInfo.HasBuff(71) && new PlayerInfo(master).HasBuff(71)) { if (Properties.Settings.Default.spectral) { slave.ThirdParty.SendString("/ja \"Spectral Jig\" <me>"); Thread.Sleep(1000); } if (Properties.Settings.Default.whm) { slave.ThirdParty.SendString("/ma \"Sneak\" <me>"); Thread.Sleep(6000); } } if (!PlayerInfo.HasBuff(69) && new PlayerInfo(master).HasBuff(69)) { if (Properties.Settings.Default.spectral) { slave.ThirdParty.SendString("/ja \"Spectral Jig\" <me>"); Thread.Sleep(1000); } if (Properties.Settings.Default.whm) { slave.ThirdParty.SendString("/ma \"Invisible\" <me>"); Thread.Sleep(6000); } } if (!new PlayerInfo(master).HasBuff(69) && PlayerInfo.HasBuff(69) && Properties.Settings.Default.cancel) { if (Windower(slave) == "Windower") { slave.ThirdParty.SendString("//cancel 69"); } if (Windower(slave) == "Ashita") { slave.ThirdParty.SendString("/cancel Invisible"); } } if (!new PlayerInfo(master).HasBuff(71) && PlayerInfo.HasBuff(71) && Properties.Settings.Default.cancel) { if (Windower(slave) == "Windower") { slave.ThirdParty.SendString("//cancel 71"); } if (Windower(slave) == "Ashita") { slave.ThirdParty.SendString("/cancel Sneak"); } } break; case 1: if (slave.Target.GetTargetInfo().TargetIndex != master.Target.GetTargetInfo().TargetIndex&& Properties.Settings.Default.attack) { slave.Target.SetTarget((int)master.Target.GetTargetInfo().TargetIndex); continue; } if (slave.Player.Status == 0 && Properties.Settings.Default.attack) { slave.ThirdParty.SendString("/attack <t>"); continue; } List <EliteAPI.XiEntity> Entity = new List <EliteAPI.XiEntity>(); for (var x = 0; x < 2048; x++) { EliteAPI.XiEntity entity = slave.Entity.GetEntity(x); if (entity.HealthPercent == 0 || entity.TargetID <= 0) { continue; } var vertdiff = Math.Abs((PlayerInfo.Y - entity.Y)); if (vertdiff >= 2) { continue; } if (entity.Distance < 5) { Entity.Add(entity); } } EliteAPI.XiEntity target = slave.Entity.GetEntity((int)master.Target.GetTargetInfo().TargetIndex); float tX = target.X - slave.Player.X; float tY = target.Y - slave.Player.Y; float tZ = target.Z - slave.Player.Z; if (Properties.Settings.Default.attack) { if (target.Distance > 2 && !PlayerInfo.Casting && !Entity.Any(a => a.Name == "Moogle")) { slave.AutoFollow.SetAutoFollowCoords(tX, tY, tZ); slave.AutoFollow.IsAutoFollowing = true; continue; } else { slave.AutoFollow.IsAutoFollowing = false; } if (!TargetInfo.IsFacingTarget(PlayerInfo.X, PlayerInfo.Z, PlayerInfo.H, TargetInfo.X, TargetInfo.Z) && TargetInfo.HPP > 1 && !PlayerInfo.Casting) { TargetInfo.FaceTarget(TargetInfo.X, TargetInfo.Z); } } break; } } }
/// <summary> /// キャラクターの方向を指定したNPCに設定する /// </summary> /// <param name="iNpcIndex">NpcIndex</param> private void faceTo(int iNpcIndex) { EliteAPI.XiEntity ent = api.Entity.GetEntity(iNpcIndex); faceTo(ent.X, ent.Z); }
/// <summary> /// メイン処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void mainThread() { try { setMessage("開始しました", MessageKind.Execute); //開始前チェック処理 if (api.Player.HasKeyItem(2214) || //ケイザックFB設営物資 api.Player.HasKeyItem(2215) || //エヌティエルFB設営物資 api.Player.HasKeyItem(2216) || //モリマーFB設営物資 api.Player.HasKeyItem(2403) || //マリアミFB設営物資 api.Player.HasKeyItem(2404) || //ヨルシアFB設営物資 api.Player.HasKeyItem(2463)) //カミールFB設営物資 { stop(false, "FB設営物資を持っている", MessageKind.Critical); return; } for (int l = 0; l < Constants.MAX_LOOP_COUNT; l++) { //COU NPCチェック EliteAPI.XiEntity entCouNpc = api.Entity.GetEntity(Constants.NPC_INDEX_COU); if (entCouNpc.Distance > 5.0f) { stop(false, "COUのカウンター近くで実行してください", MessageKind.Critical); return; } //メニューを閉じる closeMenu(); //COUカウンター ワークスコール受領 setMessage("ワークスコール受領中", MessageKind.Execute); faceTo(Constants.NPC_INDEX_COU); talkToNpcWaitDialogOpen(Constants.NPC_INDEX_COU); waitDialogTitle(Constants.DIALOG_QUESTION_COU1); //どうしますか?(チケット:([0-9]*)枚) if (remainTicket <= settings.LimitTicket) { stop(false, string.Format("チケットが{0}枚以下になったので停止", settings.LimitTicket), MessageKind.Normal); return; } setDialogIndex(0, 3); waitDialogTitle(Constants.DIALOG_QUESTION_COU2); //種類を選んでください。 setDialogIndex(2, 3); waitDialogTitle(Constants.DIALOG_QUESTION_COU3); //どのワークスコールを受けますか? if (settings.MenuIndexWorksCall >= 0) { setDialogIndex((ushort)settings.MenuIndexWorksCall, 3); } else { setMessage("行き先を選択", MessageKind.Warning); SystemSounds.Asterisk.Play(); settings.MenuIndexWorksCall = getSelectedDialogIndex(); setNumericUpDown(txtMenuIndexWorksCall, settings.MenuIndexWorksCall); setMessage("ワークスコール受領中", MessageKind.Execute); } waitDialogTitle(Constants.DIALOG_QUESTION_COU4); //何枚使用しますか?(チケット:([0-9]*)枚) ushort indexTicket = 0; if (remainTicket >= settings.TicketUseEach) { indexTicket = (ushort)(settings.TicketUseEach - 1); } else { indexTicket = (ushort)(remainTicket - 1); } setDialogIndex(indexTicket, 3); waitDialogTitle(Constants.DIALOG_QUESTION_COU5); //([0-9]*)枚でよろしいですね? setDialogIndex(0, 3); //COUからWaypointまで移動 setMessage("Waypointまで移動中", MessageKind.Execute); moveCouToWaypoint(WayDirectionKind.CouToWaypoint); //Waypoint setMessage("ワープ先選択中", MessageKind.Execute); faceTo(Constants.NPC_INDEX_COU_WAYPOINT); talkToNpcWaitDialogOpen(Constants.NPC_INDEX_COU_WAYPOINT); //エリア waitDialogTitle(Constants.DIALOG_QUESTION_WAYPOINT1); //ワープ先を選択(所有ポイント:([0-9]*)cp) if (remainCp <= settings.LimitCp) { stop(false, string.Format("Cpが{0}以下になったので停止", settings.LimitCp), MessageKind.Normal); return; } if (settings.MenuIndexArea >= 0) { setDialogIndex((ushort)settings.MenuIndexArea, 3); } else { setMessage("エリアを選択してください", MessageKind.Warning); SystemSounds.Asterisk.Play(); settings.MenuIndexArea = getSelectedDialogIndex(); setNumericUpDown(txtMenuIndexArea, settings.MenuIndexArea); setMessage("ワープ先選択中", MessageKind.Execute); Thread.Sleep(settings.BaseWait); } //ビバック waitDialogTitle(Constants.DIALOG_QUESTION_WAYPOINT1); //ワープ先を選択(所有ポイント:([0-9]*)cp) if (settings.MenuIndexBivouac >= 0) { setDialogIndex((ushort)settings.MenuIndexBivouac, 3); } else { setMessage("ビバックを選択してください", MessageKind.Warning); SystemSounds.Asterisk.Play(); settings.MenuIndexBivouac = getSelectedDialogIndex(); setNumericUpDown(txtMenuIndexBivouac, settings.MenuIndexBivouac); setMessage("ワープ先選択中", MessageKind.Execute); } //ワープ中 setMessage("ワープ待機中", MessageKind.Execute); waitZoneing(); //Administratorへ物資を渡す setMessage("近くのAdministratorを検索", MessageKind.Execute); int adminIndex = findNpcIndexFromName("Bivouac#([0-9]*) Administrator"); if (adminIndex >= 0) { EliteAPI.XiEntity adminEntity = api.Entity.GetEntity(adminIndex); setMessage("Waypointまで移動中", MessageKind.Execute); //moveTo(adminEntity.X, adminEntity.Z, (float)(0.5f + (1.5f * rnd.NextDouble()))); //moveTo(adminEntity.X, adminEntity.Z, (float)(4.0f + (1.0f * rnd.NextDouble()))); moveTo(adminEntity.X, adminEntity.Z, 5.5f); setMessage("Administratorへ物資を渡し中", MessageKind.Execute); if (!settings.Kamihr3) { faceTo(adminEntity.X, adminEntity.Z); } talkToNpcWaitTalkFinish(adminIndex); } else { stop(false, "Administratorが見つからない", MessageKind.Critical); return; } //AdministratorからWaypointまで移動 setMessage("近くのWaypointを検索", MessageKind.Execute); int waypointIndex = findNpcIndexFromName("Waypoint"); if (waypointIndex >= 0) { EliteAPI.XiEntity waypointEntity = api.Entity.GetEntity(waypointIndex); setMessage("Waypointまで移動中", MessageKind.Execute); //moveTo(waypointEntity.X, waypointEntity.Z, (float)(0.5f + (1.5f * rnd.NextDouble()))); moveTo(waypointEntity.X, waypointEntity.Z, (float)(4.0f + (1.0f * rnd.NextDouble()))); Thread.Sleep(500); if (!settings.Kamihr3) { faceTo(waypointEntity.X, waypointEntity.Z); } } else { stop(false, "Waypointが見つからない", MessageKind.Critical); return; } //Waypoint setMessage("ワープ先選択中", MessageKind.Execute); talkToNpcWaitDialogOpen(waypointIndex); //エリア waitDialogTitle(Constants.DIALOG_QUESTION_WAYPOINT1); //ワープ先を選択(所有ポイント:([0-9]*)cp) setDialogIndex(2, 3); //ビバック waitDialogTitle(Constants.DIALOG_QUESTION_WAYPOINT1); //ワープ先を選択(所有ポイント:([0-9]*)cp) setDialogIndex(1, 3); //ワープ中 setMessage("ワープ待機中", MessageKind.Execute); waitZoneing(); //WaypointからCOUまで移動 setMessage("COUカウンターまで移動中", MessageKind.Execute); moveCouToWaypoint(WayDirectionKind.WaypointToCou); //COUカウンター ワークスコール報告 setMessage("ワークスコール報告中", MessageKind.Execute); faceTo(Constants.NPC_INDEX_COU); talkToNpcWaitDialogOpen(Constants.NPC_INDEX_COU); waitDialogTitle(Constants.DIALOG_QUESTION_COU1); //どうしますか?(チケット:([0-9]*)枚) setDialogIndex(0, 3); waitDialogTitle(Constants.DIALOG_QUESTION_COU2); //種類を選んでください。 setDialogIndex(0, 3); waitDialogTitle(Constants.DIALOG_QUESTION_COU6); //どのワークスコールを報告しますか? setDialogIndex(0, 3); while (api.Menu.IsMenuOpen) { Thread.Sleep(settings.BaseWait); } } } catch (ThreadAbortException e) { Console.WriteLine("スレッド停止"); } finally { //暴走防止 api.ThirdParty.KeyUp((byte)KeyCode.NP_Number8); } }
public static bool IsInSpellCastingRange(this EliteAPI.XiEntity entity) { return(entity.Distance is < 21 and > 0); }
/// <summary> /// Make the player face the given target. /// </summary> /// <param name="target"></param> /// <param name="player"></param> /// <param name="eliteApi"></param> private static void FaceHeading(KeyValuePair <int, EliteAPI.EntityEntry> target, EliteAPI.XiEntity player, EliteAPI eliteApi) { byte angle = (byte)(Math.Atan((target.Value.Z - player.Z) / (target.Value.X - player.X)) * -(128.0f / Math.PI)); if (player.X > target.Value.X) { angle += 128; } double radian = (float)angle / 255 * 2 * Math.PI; eliteApi.Entity.SetEntityHPosition(eliteApi.Entity.LocalPlayerIndex, (float)radian); }