public static void Land(bool useLuaToLand = false) { try { LongMove.LongMoveIsLanding = true; Logging.WriteNavigator("Landing in progress."); MovementManager.StopMove(); MovementsAction.Descend(true, false, useLuaToLand); Timer t = new Timer(60000); bool completeLanding = false; while (Usefuls.IsFlying && !t.IsReady) { float z0 = ObjectManager.ObjectManager.Me.Position.Z; Thread.Sleep(250); if (z0 == ObjectManager.ObjectManager.Me.Position.Z) { completeLanding = true; t.ForceReady(); } } if (Usefuls.IsFlying && !completeLanding) { Logging.WriteDebug("Still flying after 1min of landing."); } Thread.Sleep(150); MovementsAction.Descend(false, false, useLuaToLand); } finally { LongMove.LongMoveIsLanding = false; } }
public static void Run() { if (ObjectManager.Me.BreathPercentage >= 95) { return; } if (ObjectManager.Me.WowClass == WoWClass.Druid && DruidMountSpell.IsSpellUsable) { DruidMountSpell.Cast(); var timerRegen = new Timer(5000); while (ObjectManager.Me.BreathPercentage < 95 && !timerRegen.IsReady) { Thread.Sleep(50); } } else { Logging.WritePlugin("Trying to reach the surface...", Name); MovementManager.StopMove(); MovementsAction.Ascend(true); Timer timerSurface = new Timer(40000); while (ObjectManager.Me.BreathPercentage < 95 && !timerSurface.IsReady) { Thread.Sleep(50); } Thread.Sleep(150); MovementsAction.Ascend(false); } }
public static void Takeoff() { Thread.Sleep(200 + Usefuls.Latency); if (!OnFlyMount()) { return; } Logging.WriteNavigator("Take-off in progress."); MovementsAction.Ascend(true); Timer t = new Timer(950); while (!Usefuls.IsFlying && !t.IsReady) { Thread.Sleep(50); } Thread.Sleep(50); MovementsAction.Ascend(false); }
public override void Run() { if (!Products.IsStarted || ObjectManager.Me.IsDeadMe || ObjectManager.Me.InCombatBlizzard) { return; } if (!FisherbotSetting.CurrentSetting.FishSchool) { if (_firstRun && FishingTask.IsLaunched) { _firstRun = false; } // If we have a saved position and we don't fish, then go to position if (FisherbotSetting.CurrentSetting.FisherbotPosition.IsValid && (!FishingTask.IsLaunched || _beenFighting) && !_firstRun) { _beenFighting = false; if (ObjectManager.Me.Position.DistanceTo(FisherbotSetting.CurrentSetting.FisherbotPosition) > 5) { LongMove.LongMoveGo(FisherbotSetting.CurrentSetting.FisherbotPosition); } else if (ObjectManager.Me.Position.DistanceTo(FisherbotSetting.CurrentSetting.FisherbotPosition) > 1.5f) { MovementManager.MoveTo(FisherbotSetting.CurrentSetting.FisherbotPosition); } MovementManager.Face(FisherbotSetting.CurrentSetting.FisherbotRotation); } // If we don't fish or the timer is null, then start a new timer, save position and fish if (timer == null || !FishingTask.IsLaunched) { timer = new nManager.Helpful.Timer(10 * 60 * 1000 + 10 * 1000); FisherbotSetting.CurrentSetting.FisherbotPosition = ObjectManager.Me.Position; FisherbotSetting.CurrentSetting.FisherbotRotation = ObjectManager.Me.Rotation; Fishing.EquipFishingPoles(FisherbotSetting.CurrentSetting.FishingPoleName); FishingTask.LoopFish(0, FisherbotSetting.CurrentSetting.UseLure, FisherbotSetting.CurrentSetting.LureName, FisherbotSetting.CurrentSetting.FishingPoleName, false, FisherbotSetting.AutomaticallyUseDraenorSecondaryBait); } // If the timer ended, stop fishing, equip weapon, null the timer else if (timer.IsReady) { FishingTask.StopLoopFish(); ItemsManager.EquipItemByName(FisherbotSetting.CurrentSetting.WeaponName); if (!string.IsNullOrEmpty(FisherbotSetting.CurrentSetting.ShieldName)) { ItemsManager.EquipItemByName(FisherbotSetting.CurrentSetting.ShieldName); } timer = null; } // We are in timer, we fish, then save the position else { if (FishingTask._lastSuccessfullFishing > Environment.TickCount - 5000) { FisherbotSetting.CurrentSetting.FisherbotPosition = ObjectManager.Me.Position; FisherbotSetting.CurrentSetting.FisherbotRotation = ObjectManager.Me.Rotation; // We successfully fished in the last 5 seconds, let's record our position again. } if (FishingTask._lastSuccessfullFishing != 0 && FishingTask._lastSuccessfullFishing < Environment.TickCount - 25000) { // We did not catch a single thing in the last 25 seconds... FishingTask.StopLoopFish(); return; } // _lastSuccessfullFishing is fine or we never fished yet, let it load :) Thread.Sleep(500); } // No more while, we test what we need and return return; } // Nodes fishing code if (_node.IsValid) { FisherbotSetting.CurrentSetting.FisherbotPosition = Bot.Profile.Points[Math.NearestPointOfListPoints(Bot.Profile.Points, _node.Position)]; Logging.Write("Fish " + _node.Name + " > " + _node.Position); } if (FisherbotSetting.CurrentSetting.FishSchool) { Point whereToGo = Fishing.FindTheUltimatePoint(_node.Position); if (whereToGo.Type == "invalid") { Logging.Write("No valid point found"); nManagerSetting.AddBlackList(_node.Guid); return; } bool r; List <Point> points = PathFinder.FindPath(whereToGo, out r); if (points.Count <= 1 || points.Count >= 20) { points.Clear(); points.Add(ObjectManager.Me.Position); points.Add(whereToGo); } else { for (int i = 0; i < points.Count; i++) { if (points[i].Z < whereToGo.Z) { points[i].Z = whereToGo.Z; } } } Logging.Write("Going to point > " + whereToGo.X + " ; " + whereToGo.Y + " ; " + whereToGo.Z + " ; " + points[0].Type); MovementManager.Go(points); timer = new nManager.Helpful.Timer(((int)Math.DistanceListPoint(points) / 3 * 1000) + 4000); while ((_node.IsValid || !FisherbotSetting.CurrentSetting.FishSchool) && Products.IsStarted && !ObjectManager.Me.IsDeadMe && !ObjectManager.Me.InInevitableCombat && !timer.IsReady && MovementManager.InMovement) { if (ObjectManager.Me.Position.DistanceTo2D(whereToGo) <= 0.2f) { MovementManager.StopMove(); break; } Thread.Sleep(50); } if (timer.IsReady && _node.GetDistance2D > DistanceMax) { Logging.Write("Fishing failed - No nearby point found (distance near position = " + ObjectManager.Me.Position.DistanceTo2D( FisherbotSetting.CurrentSetting.FisherbotPosition).ToString(CultureInfo.InvariantCulture) + ")"); MovementManager.StopMove(); nManagerSetting.AddBlackList(_node.Guid); return; } } // Stop move MovementManager.StopMove(); MountTask.DismountMount(); // Face if (_node.IsValid) { MovementManager.Face(_node); } else { MovementManager.Face(FisherbotSetting.CurrentSetting.FisherbotRotation); } // Ce met a la bonne distance du banc de poisson if (_node.IsValid) { int nbIsSwimming = 0; timer = new nManager.Helpful.Timer(1000 * 8); while ((Usefuls.IsSwimming || _node.GetDistance > DistanceMax || _node.GetDistance < DistanceMin) && Products.IsStarted && !ObjectManager.Me.IsDeadMe && !ObjectManager.Me.InCombat && !timer.IsReady) { if (nbIsSwimming * 100 > TimeTryFindGoodPos) { FishingTask.StopLoopFish(); MovementsAction.MoveBackward(false); MovementsAction.MoveForward(false); Logging.Write("BlackList " + _node.Name); nManagerSetting.AddBlackList(_node.Guid); return; } FishingTask.StopLoopFish(); MovementManager.Face(_node); if (Usefuls.IsSwimming || _node.GetDistance < DistanceMin) { MovementsAction.MoveForward(false); MovementsAction.MoveBackward(true); } if (_node.GetDistance > DistanceMax) { MovementsAction.MoveBackward(false); MovementsAction.MoveForward(true); } nbIsSwimming++; Thread.Sleep(100); } MovementsAction.MoveBackward(false); MovementsAction.MoveForward(false); if (timer.IsReady) { Logging.Write("Fishing failed - Out of range" + timer.IsReady.ToString()); MovementManager.StopMove(); nManagerSetting.AddBlackList(_node.Guid); return; } } // Fish Fishing.EquipFishingPoles(FisherbotSetting.CurrentSetting.FishingPoleName); FishingTask.LoopFish(_node.Guid, FisherbotSetting.CurrentSetting.UseLure, FisherbotSetting.CurrentSetting.LureName, FisherbotSetting.CurrentSetting.FishingPoleName, FisherbotSetting.CurrentSetting.PrecisionMode, FisherbotSetting.AutomaticallyUseDraenorSecondaryBait); timer = new nManager.Helpful.Timer(2 * 60 * 1000); while ((_node.IsValid || !FisherbotSetting.CurrentSetting.FishSchool) && Products.IsStarted && !ObjectManager.Me.IsDeadMe && !ObjectManager.Me.InCombat && !timer.IsReady && FishingTask.IsLaunched) { if (ObjectManager.Me.Position.DistanceTo2D(FisherbotSetting.CurrentSetting.FisherbotPosition) > 3.5f && !FisherbotSetting.CurrentSetting.FishSchool) { break; } Thread.Sleep(300); } FishingTask.StopLoopFish(); ItemsManager.EquipItemByName(FisherbotSetting.CurrentSetting.WeaponName); if (!string.IsNullOrEmpty(FisherbotSetting.CurrentSetting.ShieldName)) { ItemsManager.EquipItemByName(FisherbotSetting.CurrentSetting.ShieldName); } }
public override void Run() { try { if (MovementManager.InMovement) { return; } // Get if this zone is last zone if (LastZone != digsitesZone.id) { _nbTryFarmInThisZone = 0; // Reset nb try farm if zone is not last zone } LastZone = digsitesZone.id; // Set lastzone // Solving Every X Min if (timerAutoSolving == null) { timerAutoSolving = new Timer(SolvingEveryXMin * 1000 * 60); } if (timerAutoSolving.IsReady && !ObjectManager.ObjectManager.Me.IsDeadMe && !ObjectManager.ObjectManager.Me.InCombat) { MovementManager.StopMove(); LongMove.StopLongMove(); if (Archaeology.SolveAllArtifact(UseKeystones) > 0) { if (CrateRestored) { Archaeology.CrateRestoredArtifact(); } } timerAutoSolving = new Timer(SolvingEveryXMin * 1000 * 60); } if (MovementManager.InMovement) { return; } // Loop farm in zone // We must check Me.IsIndoor because no archeology is indoor int nbStuck = 0; // Nb of stuck direct try { if (myState != LocState.LocalMove) { MountTask.DismountMount(); } ObjectManager.WoWGameObject t = ObjectManager.ObjectManager.GetNearestWoWGameObject( ObjectManager.ObjectManager.GetWoWGameObjectByEntry(Archaeology.ArchaeologyItemsFindList)); if (t.IsValid) // If found then loot { nbCastSurveyError = 0; _lastGreenPosition = new Point(); _AntiPingPong = false; _greenCount = 0; if (myState == LocState.Looting) { if (timerLooting != null && timerLooting.IsReady) { MovementsAction.Jump(); Thread.Sleep(1500); } else { return; } } bool ValidPath; List <Point> points = PathFinder.FindPath(t.Position, out ValidPath, false); if (!ValidPath) { points.Add(t.Position); } MovementManager.Go(points); if (nbLootAttempt > 2) { MovementManager.StopMove(); LongMove.StopLongMove(); if (Archaeology.SolveAllArtifact(UseKeystones) == 0) { nManagerSetting.AddBlackList(t.Guid); // bugged artifacts not lootable Logging.Write("Black-listing bugged artifact"); } else if (CrateRestored) { Archaeology.CrateRestoredArtifact(); } nbLootAttempt = 0; return; } Logging.Write("Loot " + t.Name); Timer timer = new Timer(1000 * Math.DistanceListPoint(points) / 3); while (MovementManager.InMovement && !timer.IsReady && t.GetDistance > 3.5f) { Thread.Sleep(100); if (ObjectManager.ObjectManager.Me.InInevitableCombat || ObjectManager.ObjectManager.Me.IsDeadMe) { return; } } MovementManager.StopMove(); // avoid a red wow error Thread.Sleep(150); Interact.InteractWith(t.GetBaseAddress); while (ObjectManager.ObjectManager.Me.IsCast) { Thread.Sleep(100); } if (ObjectManager.ObjectManager.Me.InCombat) { return; } Statistics.Farms++; nbLootAttempt++; myState = LocState.Looting; if (timerLooting == null) { timerLooting = new Timer(1000 * 5); } else { timerLooting.Reset(); } return; } if (_nbTryFarmInThisZone > MaxTryByDigsite) // If try > config try black list { nbLootAttempt = 0; BlackListDigsites.Add(digsitesZone.id); Logging.Write("Black List Digsite: " + digsitesZone.name); myState = LocState.LocalMove; nbCastSurveyError = 0; return; } bool moreMovementNeeded = false; if (qPOI != null && !qPOI.ValidPoint && qPOI.Center.DistanceTo2D(ObjectManager.ObjectManager.Me.Position) < 40.0f) { #pragma warning disable 168 // We call qPOI.MiddlePoint to make the WoWQuestPOIPoint instance compute the middle point, but I don't care were it is Point p = qPOI.MiddlePoint; // we are near enough to compute it #pragma warning restore 168 if (Usefuls.IsFlying) { moreMovementNeeded = true; MovementManager.StopMove(); } } // Go To Zone if (qPOI != null && (moreMovementNeeded || !qPOI.IsInside(ObjectManager.ObjectManager.Me.Position))) { if (MountTask.GetMountCapacity() == MountCapacity.Feet || MountTask.GetMountCapacity() == MountCapacity.Ground) { int LodestoneID = 117389; if (!_travelDisabled && ItemsManager.GetItemCount(LodestoneID) > 0 && Usefuls.RealContinentId == 1116 && qPOI.Center.DistanceTo2D(ObjectManager.ObjectManager.Me.Position) > 3000f) { ObjectManager.WoWItem item = ObjectManager.ObjectManager.GetWoWItemById(LodestoneID); if (item != null && item.IsValid && !ItemsManager.IsItemOnCooldown(LodestoneID) && ItemsManager.IsItemUsable(LodestoneID)) { Logging.Write("Using a Draenor Archaeologist's Lodestone"); Products.Products.InManualPause = true; // Prevent triggering "Player teleported" ItemsManager.UseItem(LodestoneID); Thread.Sleep(3000 + Usefuls.Latency); digsitesZone = new Digsite(); // Reset the choice made return; } } Logging.Write("Not inside, then go to Digsite " + digsitesZone.name); Point me = ObjectManager.ObjectManager.Me.Position; if (_travelLocation != null && _travelLocation.DistanceTo(me) > 0.1f) { if (Products.Products.TravelRegenerated && Products.Products.TravelFrom.IsValid) { _travelLocation = Products.Products.TravelFrom; Products.Products.TravelRegenerated = false; } } if ((_travelLocation == null || _travelLocation.DistanceTo(me) > 0.1f) && !_travelDisabled && !Usefuls.IsFlying) { MovementManager.StopMove(); Logging.Write("Calling travel system to go to digsite " + digsitesZone.name + " (" + digsitesZone.id + ")..."); Products.Products.TravelToContinentId = Usefuls.ContinentId; Products.Products.TravelTo = qPOI.Center; Products.Products.TravelFromContinentId = Usefuls.ContinentId; Products.Products.TravelFrom = me; // Pass the check for valid destination as a lambda Products.Products.TargetValidationFct = qPOI.IsInside; _travelLocation = Products.Products.TravelFrom; return; } if (_travelLocation.DistanceTo(me) <= 0.1f) { _travelDisabled = true; } List <Point> newPath; newPath = PathFinder.FindPath(qPOI.Center); MovementManager.Go(newPath); } else if (qPOI.ValidPoint) { if (moreMovementNeeded || !qPOI.IsInside(ObjectManager.ObjectManager.Me.Position)) { Point destination = new Point(qPOI.MiddlePoint); destination.Type = "flying"; if (moreMovementNeeded) { Logging.Write("Landing on the digsite"); } else { Logging.Write("Not inside, then go to Digsite " + digsitesZone.name + "; X: " + destination.X + "; Y: " + destination.Y + "; Z: " + (int)destination.Z); } MovementManager.Go(new List <Point>(new[] { destination })); // MoveTo Digsite } } else { // here we need to go to center, THEN compute middle point Point destination = qPOI.Center; destination.Z += 40.0f; destination.Type = "flying"; Logging.Write("Go to Digsite " + digsitesZone.name + "; X: " + destination.X + "; Y: " + destination.Y + "; Z: " + (int)destination.Z); MovementManager.Go(new List <Point>(new[] { destination })); // MoveTo Digsite } myState = LocState.LocalMove; return; } // Find loot with Survey nbLootAttempt = 0; t = ObjectManager.ObjectManager.GetNearestWoWGameObject( ObjectManager.ObjectManager.GetWoWGameObjectByDisplayId(Archaeology.SurveyList)); if (t.GetBaseAddress == 0 || myState == LocState.GoingNextPoint || // recast if we moved even if last is still spawned myState == LocState.Looting) // after we looted we need to recast survey spell, even if the previous one is still spawned { if (!Archaeology.DigsiteZoneIsAvailable(digsitesZone)) { return; } if (myState == LocState.LocalMove) { MountTask.DismountMount(); } surveySpell.Launch(); myState = LocState.Survey; if (ObjectManager.ObjectManager.Me.InCombat) { return; } Thread.Sleep(1750 + Usefuls.Latency); // let's wait a fair bit nbCastSurveyError++; if (nbCastSurveyError > 3) { if (ObjectManager.ObjectManager.Me.Position.DistanceTo2D(qPOI.MiddlePoint) < 5) { // This means we are in a wrong digsite List <Digsite> listDigsitesZone; if (!_inSecondDigSiteWithSameName) { listDigsitesZone = Archaeology.GetDigsitesZoneAvailable(t.Name); } else // very very rare case I had: back to the first digsite with same name after the 2nd one { listDigsitesZone = Archaeology.GetDigsitesZoneAvailable(); } foreach (Digsite dg in listDigsitesZone) { if (dg.name == t.Name) { digsitesZone = dg; } } WoWResearchSite OneSite; if (!_inSecondDigSiteWithSameName) { OneSite = WoWResearchSite.FromName(digsitesZone.name, true); } else { OneSite = WoWResearchSite.FromName(digsitesZone.name, false); } qPOI = WoWQuestPOIPoint.FromSetId(OneSite.Record.QuestIdPoint); _inSecondDigSiteWithSameName = !_inSecondDigSiteWithSameName; nbCastSurveyError = 0; return; } if (MountTask.GetMountCapacity() == MountCapacity.Feet || MountTask.GetMountCapacity() == MountCapacity.Ground) { Logging.Write("Too many errors, then go to Digsite " + digsitesZone.name); List <Point> newPath = PathFinder.FindPath(qPOI.Center); MovementManager.Go(newPath); } else { if (qPOI != null) { Point destination = qPOI.MiddlePoint; Logging.Write("Too many errors, then go to Digsite " + digsitesZone.name + "; X: " + destination.X + "; Y: " + destination.Y + "; Z: " + (int)destination.Z); MovementManager.Go(new List <Point>(new[] { destination })); // MoveTo Digsite } } nbCastSurveyError = 0; return; } _nbTryFarmInThisZone++; return; } if (myState == LocState.GoingNextPoint) { return; } nbCastSurveyError = 0; // Reset try cast survey if ((ObjectManager.ObjectManager.Me.InCombat && !(ObjectManager.ObjectManager.Me.IsMounted && (nManagerSetting.CurrentSetting.IgnoreFightIfMounted || Usefuls.IsFlying)))) { return; } Point p0; float angle; { Point p; float distance, distanceMin, distanceMax, decrement, increment; if (t.DisplayId == 10103) // Survey Tool (Red) 100 yard { distance = 90f; distanceMin = 20f; distanceMax = 210f; increment = 8f; decrement = 8f; _lastGreenPosition = new Point(); _AntiPingPong = false; _greenCount = 0; } else if (t.DisplayId == 10102) // Survey Tool (Yellow) 50 yard { distance = 46f; distanceMin = 20f; distanceMax = 60f; increment = 7f; decrement = 6.5f; _lastGreenPosition = new Point(); _AntiPingPong = false; _greenCount = 0; } else // Survey Tool (Green) 25 yard (t.DisplayId == 10101) { _greenCount++; increment = 4f; if (_greenCount >= 10) { _greenCount = 0; _lastGreenPosition = new Point(); Point destination = qPOI.MiddlePoint; _AntiPingPong = false; Logging.Write("Stuck, then go to Digsite " + digsitesZone.name + "; X: " + destination.X + "; Y: " + destination.Y + "; Z: " + (int)destination.Z); MountTask.Mount(true, true); MovementManager.Go(new List <Point>(new[] { destination })); // MoveTo Digsite return; } if (_AntiPingPong) { Logging.Write("Ping-pong detected, shortening the distance"); distance = 11f; distanceMin = 6f; distanceMax = 16f; decrement = 4f; } else { distance = 19f; distanceMin = 7f; distanceMax = 41f; decrement = 3f; } } { float d = distance; p0 = new Point(t.Position); angle = t.Orientation; p = Math.GetPosition2DOfAngleAndDistance(p0, angle, d); p.Z = PathFinder.GetZPosition(p, true); bool valid; PathFinder.FindPath(p, out valid); if (qPOI != null) { bool IamOutOfWater = IsPointOutOfWater(ObjectManager.ObjectManager.Me.Position); while (!valid || p.Z == 0 || !qPOI.IsInside(p) || !(!IamOutOfWater || IsPointOutOfWater(p))) { if (d + increment > distanceMax) { break; } d += increment; Point newone = Math.GetPosition2DOfAngleAndDistance(p0, angle, d); if (qPOI.IsInside(newone)) { p = new Point(newone); p.Z += d / 10.0f; // just so that GetZ don't find caves too easiely p.Z = PathFinder.GetZPosition(p, true); if (p.Z == 0) // if p == 0 we don't care about the path { valid = false; } else if (Math.DistanceListPoint(PathFinder.FindLocalPath(p, out valid)) > d * 4 && d > 30) { valid = false; } } // Since these direction are approximate, also search in a pi/5 angle if (!valid /* && t.DisplayId == 10103*/) { float angleplus = Math.FixAngle(angle + ((float)System.Math.PI / 10f)); newone = Math.GetPosition2DOfAngleAndDistance(p0, angleplus, d); p = new Point(newone); p.Z += d / 10.0f; // just so that GetZ don't find caves too easiely p.Z = PathFinder.GetZPosition(p, true); if (p.Z == 0) // if p == 0 we don't care about the path { valid = false; } else if (Math.DistanceListPoint(PathFinder.FindLocalPath(p, out valid)) > d * 4 && d > 30) { valid = false; } if (valid) { Logging.Write("Angles+ for distance " + d); } } if (!valid /* && t.DisplayId == 10103*/) { float angleminus = Math.FixAngle(angle - ((float)System.Math.PI / 10f)); newone = Math.GetPosition2DOfAngleAndDistance(p0, angleminus, d); p = new Point(newone); p.Z += d / 10.0f; // just so that GetZ don't find caves too easiely p.Z = PathFinder.GetZPosition(p, true); if (p.Z == 0) // if p == 0 we don't care about the path { valid = false; } else if (Math.DistanceListPoint(PathFinder.FindLocalPath(p, out valid)) > d * 4 && d > 30) { valid = false; } if (valid) { Logging.Write("Angles- for distance " + d); } } } if (!valid || p.Z == 0 || !qPOI.IsInside(p) || !(!IamOutOfWater || IsPointOutOfWater(p))) { d = distance; while (!valid || p.Z == 0 || !qPOI.IsInside(p) || !(!IamOutOfWater || IsPointOutOfWater(p))) { if (d - decrement < distanceMin) { break; } d -= decrement; Point newone = Math.GetPosition2DOfAngleAndDistance(p0, angle, d); if (qPOI.IsInside(newone)) { p = new Point(newone); p.Z += d / 10.0f; // just so that the the GetZ don't find caves too easiely p.Z = PathFinder.GetZPosition(p, true); if (p.Z == 0) // if p == 0 we don't care about the path { valid = false; } else if (Math.DistanceListPoint(PathFinder.FindLocalPath(p, out valid)) > d * 4 && d > 30) { valid = false; } } // Since these direction are approximate, also search in a pi/5 angle if (!valid /* && t.DisplayId == 10103*/) { float angleplus = Math.FixAngle(angle + ((float)System.Math.PI / 10f)); newone = Math.GetPosition2DOfAngleAndDistance(p0, angleplus, d); p = new Point(newone); p.Z += d / 10.0f; // just so that GetZ don't find caves too easiely p.Z = PathFinder.GetZPosition(p, true); if (p.Z == 0) // if p == 0 we don't care about the path { valid = false; } else if (Math.DistanceListPoint(PathFinder.FindLocalPath(p, out valid)) > d * 4 && d > 30) { valid = false; } if (valid) { Logging.Write("Angles+ for distance " + d); } } if (!valid /* && t.DisplayId == 10103*/) { float angleminus = Math.FixAngle(angle - ((float)System.Math.PI / 10f)); newone = Math.GetPosition2DOfAngleAndDistance(p0, angleminus, d); p = new Point(newone); p.Z += d / 10.0f; // just so that GetZ don't find caves too easiely p.Z = PathFinder.GetZPosition(p, true); if (p.Z == 0) // if p == 0 we don't care about the path { valid = false; } else if (Math.DistanceListPoint(PathFinder.FindLocalPath(p, out valid)) > d * 4 && d > 30) { valid = false; } if (valid) { Logging.Write("Angles- for distance " + d); } } } } } // check pingpong but not a second time if (_AntiPingPong) { _AntiPingPong = false; } else if (t.DisplayId == 10101 && _lastGreenPosition.IsValid && p.DistanceTo2D(_lastGreenPosition) <= 7f) { _AntiPingPong = true; } // then remmember the last Green Position if (t.DisplayId == 10101) { _lastGreenPosition = new Point(ObjectManager.ObjectManager.Me.Position); } if (_AntiPingPong) { myState = LocState.LocalMove; return; } Logging.Write("Distance " + d + " selected"); } myState = LocState.GoingNextPoint; // Find Path bool resultB; List <Point> points = PathFinder.FindLocalPath(p, out resultB, false); // If path not found find nearer if (points.Count <= 0) { Point pt = Math.GetPosition2DOfAngleAndDistance(p0, angle, 15); pt.Z = ObjectManager.ObjectManager.Me.Position.Z; points = PathFinder.FindLocalPath(pt, out resultB, false); if (points.Count > 0 && resultB) { p = new Point(pt); } } // Go to next position if ((!resultB && p.DistanceTo(ObjectManager.ObjectManager.Me.Position) > 10) || nbStuck >= 2) // Use fly mount { p.Z = PathFinder.GetZPosition(p); if (p.Z == 0) { p.Z = ObjectManager.ObjectManager.Me.Position.Z + 35; } else { p.Z = p.Z + 5.0f; } if ((ObjectManager.ObjectManager.Me.InCombat && !(ObjectManager.ObjectManager.Me.IsMounted && (nManagerSetting.CurrentSetting.IgnoreFightIfMounted || Usefuls.IsFlying)))) { return; } MountTask.Mount(true, true); LongMove.LongMoveByNewThread(p); Timer timer = new Timer(2000 * points[points.Count - 1].DistanceTo(ObjectManager.ObjectManager.Me.Position) / 3); while (LongMove.IsLongMove && !timer.IsReady && ObjectManager.ObjectManager.Me.Position.DistanceTo2D(p) > 0.5f) { if ((ObjectManager.ObjectManager.Me.InCombat && !(ObjectManager.ObjectManager.Me.IsMounted && (nManagerSetting.CurrentSetting.IgnoreFightIfMounted || Usefuls.IsFlying)))) { LongMove.StopLongMove(); return; } Thread.Sleep(100); } LongMove.StopLongMove(); while (MovementManager.IsUnStuck) { if (ObjectManager.ObjectManager.Me.IsDeadMe) { return; } Thread.Sleep(100); LongMove.StopLongMove(); } MovementManager.StopMove(); MountTask.DismountMount(); // ReSharper disable RedundantAssignment nbStuck = 0; // ReSharper restore RedundantAssignment } else // walk to next position { float d1 = Math.DistanceListPoint(points); float d2 = points[0].DistanceTo(points[points.Count - 1]); // here we will try to shortcut the path using a fly mount if (MountTask.GetMountCapacity() == MountCapacity.Fly && d1 > 80 && d1 > (d2 * 2)) { Point startpoint = new Point(ObjectManager.ObjectManager.Me.Position); Point endpoint = new Point(points[points.Count - 1]); float z1 = startpoint.Z; float z2 = endpoint.Z; float zref = System.Math.Max(z1, z2) + 6.0f; Point pref1 = new Point(startpoint); pref1.Z = zref; Point pref2 = new Point(endpoint); pref2.Z = zref; bool badres = TraceLine.TraceLineGo(startpoint, pref1) || TraceLine.TraceLineGo(pref1, pref2) || TraceLine.TraceLineGo(pref2, endpoint); if (!badres) { Logging.Write("Flying to shortcut the path"); MountTask.Mount(true, true); if (Usefuls.IsFlying) // Failsafe: in case we are indoor don't try { points = new List <Point>(); pref1.Z += 2f; pref2.Z += 2f; points.Add(pref1); points.Add(pref2); points.Add(endpoint); } } } if (d1 > nManagerSetting.CurrentSetting.MinimumDistanceToUseMount && !nManagerSetting.CurrentSetting.UseGroundMount) { MountTask.Mount(); } if (Usefuls.IsFlying) { for (int i = 0; i < points.Count; i++) { points[i].Type = "flying"; } } MovementManager.Go(points); float d = Math.DistanceListPoint(points) / 3; if (d > 200) { d = 200; } float tm_t = 1000 * d / 2 + 1500; if (Usefuls.IsSwimming) { tm_t /= 0.6f; } Timer timer = new Timer(tm_t); while (MovementManager.InMovement && !timer.IsReady && ObjectManager.ObjectManager.Me.Position.DistanceTo2D(p) > 0.5f) { if ((ObjectManager.ObjectManager.Me.InCombat && !(ObjectManager.ObjectManager.Me.IsMounted && (nManagerSetting.CurrentSetting.IgnoreFightIfMounted || Usefuls.IsFlying)))) { return; } Thread.Sleep(100); } // incremente nbstuck if player is stuck if (ObjectManager.ObjectManager.Me.Position.DistanceTo(t.Position) < 5 || (MovementManager.InMovement && !ObjectManager.ObjectManager.Me.InInevitableCombat && timer.IsReady)) { // ReSharper disable RedundantAssignment nbStuck++; } // ReSharper restore RedundantAssignment else { // ReSharper disable RedundantAssignment nbStuck = 0; } // ReSharper restore RedundantAssignment if (ObjectManager.ObjectManager.Me.InInevitableCombat) { return; } MovementManager.StopMove(); while (MovementManager.IsUnStuck) { if (ObjectManager.ObjectManager.Me.IsDeadMe) { return; } Thread.Sleep(100); MovementManager.StopMove(); } } } } catch { } } catch { } }
public override void Run() { List <Npc> listNPCs = new List <Npc>(); Npc mailBox = null; // Stop fisher if needed if (Products.Products.ProductName == "Fisherbot" && FishingTask.IsLaunched) { FishingTask.StopLoopFish(); // Then break the cast MovementsAction.MoveBackward(true); Thread.Sleep(50); MovementsAction.MoveBackward(false); } // If we need to send items. if (nManagerSetting.CurrentSetting.ActivateAutoMaillingFeature && !_suspendMailing && nManagerSetting.CurrentSetting.MaillingFeatureRecipient != string.Empty && Usefuls.GetContainerNumFreeSlots <= nManagerSetting.CurrentSetting.SendMailWhenLessThanXSlotLeft) { if (_useMollE) { MountTask.DismountMount(); ItemsManager.UseItem(ItemsManager.GetItemNameById(40768)); Thread.Sleep(2000); WoWGameObject portableMailbox = ObjectManager.ObjectManager.GetNearestWoWGameObject( ObjectManager.ObjectManager.GetWoWGameObjectById(191605)); if (portableMailbox.IsValid && portableMailbox.CreatedBy == ObjectManager.ObjectManager.Me.Guid) { mailBox = new Npc { Entry = portableMailbox.Entry, Position = portableMailbox.Position, Name = portableMailbox.Name, ContinentIdInt = Usefuls.ContinentId, Faction = ObjectManager.ObjectManager.Me.PlayerFaction.ToLower() == "horde" ? Npc.FactionType.Horde : Npc.FactionType.Alliance, SelectGossipOption = 0, Type = Npc.NpcType.Mailbox }; } } if (mailBox == null && NpcDB.GetNpcNearby(Npc.NpcType.Mailbox).Entry > 0) { mailBox = NpcDB.GetNpcNearby(Npc.NpcType.Mailbox); } listNPCs.Add(mailBox); } // If we need to repair. if (ObjectManager.ObjectManager.Me.GetDurability <= nManagerSetting.CurrentSetting.RepairWhenDurabilityIsUnderPercent && nManagerSetting.CurrentSetting.ActivateAutoRepairFeature) { if (_magicMountMammoth && MountTask.GetMountCapacity() >= MountCapacity.Ground && Skill.GetValue(SkillLine.Riding) > 0) { if (_travelersTundraMammoth.HaveBuff || _travelersTundraMammoth.IsSpellUsable) { if (!_travelersTundraMammoth.HaveBuff) { MountTask.DismountMount(); _travelersTundraMammoth.Launch(true, true, true); Thread.Sleep(2000); } if (ObjectManager.ObjectManager.Me.PlayerFaction.ToLower() == "horde") { WoWUnit drixBlackwrench = ObjectManager.ObjectManager.GetNearestWoWUnit( ObjectManager.ObjectManager.GetWoWUnitByEntry(32641)); if (drixBlackwrench.IsValid && drixBlackwrench.IsAlive) { Npc drixBlackwrenchNpc = new Npc { Entry = drixBlackwrench.Entry, Position = drixBlackwrench.Position, Name = drixBlackwrench.Name, ContinentIdInt = Usefuls.ContinentId, Faction = Npc.FactionType.Horde, SelectGossipOption = 0, Type = Npc.NpcType.Repair }; listNPCs.Add(drixBlackwrenchNpc); } } else { WoWUnit gnimo = ObjectManager.ObjectManager.GetNearestWoWUnit( ObjectManager.ObjectManager.GetWoWUnitByEntry(32639)); if (gnimo.IsValid && gnimo.IsAlive) { Npc gnimoNpc = new Npc { Entry = gnimo.Entry, Position = gnimo.Position, Name = gnimo.Name, ContinentIdInt = Usefuls.ContinentId, Faction = Npc.FactionType.Alliance, SelectGossipOption = 0, Type = Npc.NpcType.Repair }; listNPCs.Add(gnimoNpc); } } } } else if (_magicMountYak && MountTask.GetMountCapacity() >= MountCapacity.Ground && Skill.GetValue(SkillLine.Riding) > 0) { if (_grandExpeditionYak.HaveBuff || _grandExpeditionYak.IsSpellUsable) { if (!_grandExpeditionYak.HaveBuff) { MountTask.DismountMount(); _grandExpeditionYak.Launch(true, true, true); Thread.Sleep(2000); } WoWUnit cousinSlowhands = ObjectManager.ObjectManager.GetNearestWoWUnit( ObjectManager.ObjectManager.GetWoWUnitByEntry(62822)); if (cousinSlowhands.IsValid && cousinSlowhands.IsAlive) { Npc cousinSlowhandsNpc = new Npc { Entry = cousinSlowhands.Entry, Position = cousinSlowhands.Position, Name = cousinSlowhands.Name, ContinentIdInt = Usefuls.ContinentId, Faction = ObjectManager.ObjectManager.Me.PlayerFaction.ToLower() == "horde" ? Npc.FactionType.Horde : Npc.FactionType.Alliance, SelectGossipOption = 0, Type = Npc.NpcType.Repair }; listNPCs.Add(cousinSlowhandsNpc); } } } else if (_use74A) { Npc npcA = DoSpawnRobot("74A", Npc.NpcType.Repair); if (npcA != null) { listNPCs.Add(npcA); } } else if (_use110G) { Npc npcG = DoSpawnRobot("110G", Npc.NpcType.Repair); if (npcG != null) { listNPCs.Add(npcG); } } else if (_useJeeves) { Npc npcJeeves = DoSpawnRobot("Jeeves", Npc.NpcType.Repair); if (npcJeeves != null) { listNPCs.Add(npcJeeves); } } else { if (NpcDB.GetNpcNearby(Npc.NpcType.Repair).Entry > 0) { listNPCs.Add(NpcDB.GetNpcNearby(Npc.NpcType.Repair)); } } } // If we need to sell. if (NeedFoodSupplies() || NeedDrinkSupplies() || Usefuls.GetContainerNumFreeSlots <= nManagerSetting.CurrentSetting.SellItemsWhenLessThanXSlotLeft && nManagerSetting.CurrentSetting.ActivateAutoSellingFeature && !_suspendSelling) { if (_magicMountMammoth && MountTask.GetMountCapacity() >= MountCapacity.Ground && Skill.GetValue(SkillLine.Riding) > 0) { if (_travelersTundraMammoth.HaveBuff || _travelersTundraMammoth.IsSpellUsable) { if (!_travelersTundraMammoth.HaveBuff) { MountTask.DismountMount(); _travelersTundraMammoth.Launch(true, true, true); Thread.Sleep(2000); } if (ObjectManager.ObjectManager.Me.PlayerFaction.ToLower() == "horde") { WoWUnit mojodishu = ObjectManager.ObjectManager.GetNearestWoWUnit( ObjectManager.ObjectManager.GetWoWUnitByEntry(32642)); if (mojodishu.IsValid && mojodishu.IsAlive) { Npc mojodishuNpc = new Npc { Entry = mojodishu.Entry, Position = mojodishu.Position, Name = mojodishu.Name, ContinentIdInt = Usefuls.ContinentId, Faction = Npc.FactionType.Horde, SelectGossipOption = 0, Type = Npc.NpcType.Vendor }; listNPCs.Add(mojodishuNpc); } } else { WoWUnit hakmuddArgus = ObjectManager.ObjectManager.GetNearestWoWUnit( ObjectManager.ObjectManager.GetWoWUnitByEntry(32638)); if (hakmuddArgus.IsValid && hakmuddArgus.IsAlive) { Npc hakmuddArgusNpc = new Npc { Entry = hakmuddArgus.Entry, Position = hakmuddArgus.Position, Name = hakmuddArgus.Name, ContinentIdInt = Usefuls.ContinentId, Faction = Npc.FactionType.Alliance, SelectGossipOption = 0, Type = Npc.NpcType.Vendor }; listNPCs.Add(hakmuddArgusNpc); } } } } else if (_magicMountYak && MountTask.GetMountCapacity() >= MountCapacity.Ground && Skill.GetValue(SkillLine.Riding) > 0) { if (_grandExpeditionYak.HaveBuff || _grandExpeditionYak.IsSpellUsable) { if (!_grandExpeditionYak.HaveBuff) { MountTask.DismountMount(); _grandExpeditionYak.Launch(true, true, true); Thread.Sleep(2000); } WoWUnit cousinSlowhands = ObjectManager.ObjectManager.GetNearestWoWUnit( ObjectManager.ObjectManager.GetWoWUnitByEntry(62822)); if (cousinSlowhands.IsValid && cousinSlowhands.IsAlive) { Npc cousinSlowhandsNpc = new Npc { Entry = cousinSlowhands.Entry, Position = cousinSlowhands.Position, Name = cousinSlowhands.Name, ContinentIdInt = Usefuls.ContinentId, Faction = Npc.FactionType.Neutral, SelectGossipOption = 0, Type = Npc.NpcType.Vendor }; listNPCs.Add(cousinSlowhandsNpc); } } } else if (_use74A) { Npc npcA = DoSpawnRobot("74A", Npc.NpcType.Vendor); if (npcA != null) { listNPCs.Add(npcA); } } else if (_use110G) { Npc npcG = DoSpawnRobot("110G", Npc.NpcType.Vendor); if (npcG != null) { listNPCs.Add(npcG); } } else if (_useJeeves) { Npc npcJeeves = DoSpawnRobot("Jeeves", Npc.NpcType.Vendor); if (npcJeeves != null) { listNPCs.Add(npcJeeves); } } else { if (NpcDB.GetNpcNearby(Npc.NpcType.Vendor).Entry > 0) { listNPCs.Add(NpcDB.GetNpcNearby(Npc.NpcType.Vendor)); } } } #region Repairer, Seller/Buyer, MailBox if (listNPCs.Count > 0) { listNPCs.Sort(OnComparison); foreach (Npc npc in listNPCs) { Npc target = npc; bool doTravel = target.Position.DistanceTo(ObjectManager.ObjectManager.Me.Position) > 400 || target.ContinentIdInt != Usefuls.ContinentId; if (!doTravel && target.Position.DistanceTo(ObjectManager.ObjectManager.Me.Position) <= 400) { // Close NPC but no path ? bool success; PathFinder.FindPath(ObjectManager.ObjectManager.Me.Position, target.Position, Usefuls.ContinentNameMpq, out success); if (!success) { doTravel = true; } } //Start travel if (_travelLocation != null && _travelLocation.DistanceTo(ObjectManager.ObjectManager.Me.Position) > 0.1f) { if (Products.Products.TravelRegenerated && Products.Products.TravelFrom.IsValid) { _travelLocation = Products.Products.TravelFrom; Products.Products.TravelRegenerated = false; } } if (doTravel && (_travelLocation == null || _travelLocation.DistanceTo(ObjectManager.ObjectManager.Me.Position) > 0.1f) && !_travelDisabled && !Usefuls.IsFlying) { MovementManager.StopMove(); switch (npc.Type) { case Npc.NpcType.Repair: Logging.Write("Calling travel system to NpcRepair " + npc.Name + " (" + npc.Entry + ")..."); break; case Npc.NpcType.Vendor: Logging.Write("Calling travel system to NpcVendor " + npc.Name + " (" + npc.Entry + ")..."); break; case Npc.NpcType.Mailbox: Logging.Write("Calling travel system to Mailbox " + npc.Name + " (" + npc.Entry + ")..."); break; default: Logging.Write("Calling travel system for ToTown to " + npc.Name + " (" + npc.Entry + ")..."); break; } Products.Products.TravelToContinentId = target.ContinentIdInt; Products.Products.TravelTo = target.Position; Products.Products.TravelFromContinentId = Usefuls.ContinentId; Products.Products.TravelFrom = ObjectManager.ObjectManager.Me.Position; // Pass the check for valid destination as a lambda Products.Products.TargetValidationFct = Quest.IsNearQuestGiver; // compare me.Pos to dest.Pos _travelLocation = Products.Products.TravelFrom; return; } if (_travelLocation != null && _travelLocation.DistanceTo(ObjectManager.ObjectManager.Me.Position) <= 0.1f) { _travelDisabled = true; // don't forget to release travel once arrived. } //Start target finding based on Seller. uint baseAddress = MovementManager.FindTarget(ref target, 0, !ObjectManager.ObjectManager.Me.IsMounted); if (!target.ValidPath) { Logging.WriteDebug("No valid path/travel to Npc " + target.Name + ", removing him from NpcDB."); NpcDB.DelNpc(target); } if (MovementManager.InMovement) { return; } if (target.Position.DistanceTo(ObjectManager.ObjectManager.Me.Position) >= 5f) { return; } _travelDisabled = false; if (baseAddress == 0 && target.Position.DistanceTo(ObjectManager.ObjectManager.Me.Position) < 5f) { NpcDB.DelNpc(target); } else if (baseAddress > 0) { if (!_travelersTundraMammoth.HaveBuff) { DoProspectingInTown(target); DoMillingInTown(target); } Interact.InteractWith(baseAddress); Thread.Sleep(500); MovementManager.StopMove(); if (target.SelectGossipOption != 0) { Lua.LuaDoString("SelectGossipOption(" + target.SelectGossipOption + ")"); Thread.Sleep(500); } else if (target.Type == Npc.NpcType.Repair || target.Type == Npc.NpcType.Vendor) { if (!Gossip.SelectGossip(Gossip.GossipOption.Vendor)) { Logging.WriteError("Problem with NPC " + npc.Name + " Removing it for NpcDB"); NpcDB.DelNpc(npc); return; } } // NPC Repairer if (target.Type == Npc.NpcType.Repair) { Logging.Write("Repair items from " + target.Name + " (" + target.Entry + ")."); Vendor.RepairAllItems(); Thread.Sleep(1000); } // End NPC Repairer if (target.Type == Npc.NpcType.Vendor) { // NPC Buyer Logging.Write("Selling items to " + target.Name + " (" + target.Entry + ")."); List <WoWItemQuality> vQuality = new List <WoWItemQuality>(); if (nManagerSetting.CurrentSetting.SellGray) { vQuality.Add(WoWItemQuality.Poor); } if (nManagerSetting.CurrentSetting.SellWhite) { vQuality.Add(WoWItemQuality.Common); } if (nManagerSetting.CurrentSetting.SellGreen) { vQuality.Add(WoWItemQuality.Uncommon); } if (nManagerSetting.CurrentSetting.SellBlue) { vQuality.Add(WoWItemQuality.Rare); } if (nManagerSetting.CurrentSetting.SellPurple) { vQuality.Add(WoWItemQuality.Epic); } Vendor.SellItems(nManagerSetting.CurrentSetting.ForceToSellTheseItems, nManagerSetting.CurrentSetting.DontSellTheseItems, vQuality); Thread.Sleep(3000); if (Usefuls.GetContainerNumFreeSlots <= nManagerSetting.CurrentSetting.SellItemsWhenLessThanXSlotLeft) { _suspendSelling = true; } // End NPC Buyer // NPC Seller if (NeedFoodSupplies() || NeedDrinkSupplies()) { Logging.Write("Buying beverages and food from " + target.Name + " (" + target.Entry + ")."); } for (int i = 0; i < 10 && NeedFoodSupplies(); i++) { Vendor.BuyItem(nManagerSetting.CurrentSetting.FoodName, 1); } for (int i = 0; i < 10 && NeedDrinkSupplies(); i++) { Vendor.BuyItem(nManagerSetting.CurrentSetting.BeverageName, 1); } // End NPC Seller } if (target.Type == Npc.NpcType.Repair || target.Type == Npc.NpcType.Vendor) { Gossip.CloseGossip(); } // MailBox if (target.Type == Npc.NpcType.Mailbox) { List <WoWItemQuality> mQuality = new List <WoWItemQuality>(); if (nManagerSetting.CurrentSetting.MailGray) { mQuality.Add(WoWItemQuality.Poor); } if (nManagerSetting.CurrentSetting.MailWhite) { mQuality.Add(WoWItemQuality.Common); } if (nManagerSetting.CurrentSetting.MailGreen) { mQuality.Add(WoWItemQuality.Uncommon); } if (nManagerSetting.CurrentSetting.MailBlue) { mQuality.Add(WoWItemQuality.Rare); } if (nManagerSetting.CurrentSetting.MailPurple) { mQuality.Add(WoWItemQuality.Epic); } bool mailSendingCompleted = false; for (int i = 7; i > 0 && !mailSendingCompleted; i--) { Interact.InteractWith(baseAddress); Thread.Sleep(1000); Mail.SendMessage(nManagerSetting.CurrentSetting.MaillingFeatureRecipient, nManagerSetting.CurrentSetting.MaillingFeatureSubject, "", nManagerSetting.CurrentSetting.ForceToMailTheseItems, nManagerSetting.CurrentSetting.DontMailTheseItems, mQuality, out mailSendingCompleted); Thread.Sleep(500); } if (mailSendingCompleted) { Logging.Write("Sending items to the player " + nManagerSetting.CurrentSetting.MaillingFeatureRecipient + " using " + target.Name + " (" + target.Entry + ")."); } if (Usefuls.GetContainerNumFreeSlots <= nManagerSetting.CurrentSetting.SendMailWhenLessThanXSlotLeft) { _suspendMailing = true; } Lua.LuaDoString("CloseMail()"); } // End MailBox } // still on the road, but not in movement for some reasons } } #endregion Repairer, Seller/Buyer, MailBox }
public static void MountingFlyingMount(bool stopMove = true) { try { if (ObjectManager.ObjectManager.Me.IsMounted && (!OnFlyMount() && !ObjectManager.ObjectManager.Me.IsDeadMe)) { DismountMount(stopMove); } if (!ObjectManager.ObjectManager.Me.IsMounted) { if (stopMove) { MovementManager.StopMove(); } else { MovementManager.StopMoveTo(); } Thread.Sleep(100); if (Usefuls.IsSwimming) { Logging.WriteNavigator("Going out of water"); } while (Usefuls.IsSwimming) { MovementsAction.Ascend(true); Thread.Sleep(500); MovementsAction.Ascend(false); } if (Usefuls.IsOutdoors && !ObjectManager.ObjectManager.Me.HaveBuff(SpellManager.DruidMountId())) { if (stopMove) { MovementManager.StopMove(); } else { MovementManager.StopMoveTo(); } if (ObjectManager.ObjectManager.Me.InCombat) { return; } while (ObjectManager.ObjectManager.Me.GetMove) { Thread.Sleep(50 + Usefuls.Latency); // to stop moving/falling } Logging.Write("Mounting fly mount " + _spellFlyMount.NameInGame); SpellManager.CastSpellByNameLUA(_spellFlyMount.NameInGame); if (ObjectManager.ObjectManager.Me.InCombat) { return; } Thread.Sleep(500 + Usefuls.Latency); while (ObjectManager.ObjectManager.Me.IsCast) { Thread.Sleep(50); } if (ObjectManager.ObjectManager.Me.InCombat) { return; } Thread.Sleep(500); } if (!ObjectManager.ObjectManager.Me.IsMounted && Products.Products.IsStarted) { if (ObjectManager.ObjectManager.Me.InCombat) { return; } Thread.Sleep(500); if (ObjectManager.ObjectManager.Me.InCombat) { return; } if (!ObjectManager.ObjectManager.Me.IsMounted && Products.Products.IsStarted) { if (tryMounting >= 3) { Logging.Write("Mounting failed"); MovementManager.UnStuckFly(); } else { Timer t = new Timer(1000); // 1 sec while (!t.IsReady && !Usefuls.IsOutdoors) { if (ObjectManager.ObjectManager.Me.InCombat) { return; } Thread.Sleep(200); } tryMounting++; } } } if (ObjectManager.ObjectManager.Me.IsMounted) { tryMounting = 0; Thread.Sleep(100); if (OnFlyMount()) { Takeoff(); } } } } catch (Exception ex) { Logging.WriteError("MountTask > MountingFlyingMount(): " + ex); } }