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); } }
private static void ThreadDispose(bool closeProcess) { try { Products.Products.DisposeProduct(); if (closeProcess) { Wow.ObjectManager.Pulsator.Shutdown(); Wow.Memory.WowMemory.AllowReHook = false; // Don't try to rehook before shutdown the bot. Wow.Memory.WowMemory.DisposeHooking(); Wow.Memory.WowProcess = new Process(); } try { Timer t = new Timer(2 * 1000); while (Logging.CountNumberInQueue > 0 && !t.IsReady) { Thread.Sleep(10); } } catch { } } catch (Exception e) { Logging.WriteError("nManager > Pulstator > ThreadDispose(): " + e); } _isDisposed = true; }
// For Defensive Buffs and Livesavers (always return after Casting) private bool Defensive() { Usefuls.SleepGlobalCooldown(); try { Memory.WowMemory.GameFrameLock(); // !!! WARNING - DONT SLEEP WHILE LOCKED - DO FINALLY(GameFrameUnLock()) !!! if (StunTimer.IsReady && (DefensiveTimer.IsReady || ObjectManager.Me.HealthPercent < 20)) { //Stun if (ObjectManager.Target.IsStunnable) { if (ObjectManager.Me.HealthPercent < MySettings.UseWarStompBelowPercentage && WarStomp.IsSpellUsable) { WarStomp.Cast(); StunTimer = new Timer(1000 * 2.5); return(true); } //TEMPLATE_STUN_SPELL if (ObjectManager.Me.HealthPercent < MySettings.UseTEMPLATESTUNSPELLBelowPercentage && TEMPLATESTUNSPELL.IsSpellUsable) { TEMPLATESTUNSPELL.Cast(); StunTimer = new Timer(1000 * TEMPLATE_STUN_TIME);// Time until the enemy will leave the Stun return(true); } } //Mitigate Damage if (ObjectManager.Me.HealthPercent < MySettings.UseStoneformBelowPercentage && Stoneform.IsSpellUsable) { Stoneform.Cast(); DefensiveTimer = new Timer(1000 * 8); return(true); } //TEMPLATE_DEFENSIVE_SPELL if (ObjectManager.Me.HealthPercent < MySettings.UseTEMPLATEDEFENSIVESPELLBelowPercentage && TEMPLATEDEFENSIVESPELL.IsSpellUsable) { TEMPLATEDEFENSIVESPELL.Cast(); DefensiveTimer = new Timer(1000 * TEMPLATE_DEFENSIVE_BUFF_TIME);// Time until the Buff ends return(true); } } //Mitigate Damage in Emergency Situations //TEMPLATE_EMERGENCY_DEFENSIVE_SPELL if (ObjectManager.Me.HealthPercent < MySettings.UseTEMPLATEEMERGENCYDEFENSIVESPELLBelowPercentage && TEMPLATEEMERGENCYDEFENSIVESPELL.IsSpellUsable) { TEMPLATEEMERGENCYDEFENSIVESPELL.Cast(); return(true); } return(false); } finally { Memory.WowMemory.GameFrameUnLock(); } }
public static void EquipFishingPoles(string fishingPoleName = "") { try { if (!ReCheckFishingPoleTimer.IsReady || IsEquipedFishingPoles()) { return; } Logging.WriteDebug("Parsing inventory to find a Fishing Pole to equip."); if (fishingPoleName != string.Empty) { ItemsManager.EquipItemByName(fishingPoleName); Thread.Sleep(500); Thread.Sleep(Usefuls.Latency); while (ObjectManager.ObjectManager.Me.IsCast) { Thread.Sleep(200); } } else { foreach (int i in ListFishingPoles) { if (ItemsManager.GetItemCount(i) > 0) { ItemsManager.EquipItemByName(ItemsManager.GetItemNameById(i)); Thread.Sleep(500); Thread.Sleep(Usefuls.Latency); while (ObjectManager.ObjectManager.Me.IsCast) { Thread.Sleep(200); } break; } } } ReCheckFishingPoleTimer = new Timer(1000 * 60 * 5); Logging.WriteDebug("Inventory parsed, prevent this function from being parsed for the next five minutes."); } catch (Exception e) { Logging.WriteError("Fishing > EquipFishingPoles(string fishingPoleName = \"\"): " + e); } }
// For the Ability Priority Logic private void Rotation() { Usefuls.SleepGlobalCooldown(); try { Memory.WowMemory.GameFrameLock(); // !!! WARNING - DONT SLEEP WHILE LOCKED - DO FINALLY(GameFrameUnLock()) !!! // Independant of Target Count if (MySettings.UseTEMPLATEOFFENSIVESPELL && TEMPLATEOFFENSIVESPELL.IsSpellUsable && TEMPLATEOFFENSIVESPELL.IsHostileDistanceGood && ObjectManager.Me.CLASS_RESOURCE > MySettings.UseTEMPLATEOFFENSIVESPELLAbovePercentage && // Resource Check TEMPLATEBUFF.HaveBuff && // Buff Check TEMPLATEDOT.TargetHaveBuff && // Buff Check (ObjectManager.Me.GetUnitInSpellRange(5f) > 1 || ObjectManager.Target.GetUnitInSpellRange(5f) > 1) && // Unit Count Check TEMPLATEOFFENSIVESPELLTimer.IsReady) // Timer Check { TEMPLATEOFFENSIVESPELL.Cast(); TEMPLATEOFFENSIVESPELLTimer = new Timer(1000 * 10); // for timings that don't depend on a buff return; } if (MySettings.UseTEMPLATEARTIFACTSPELL && TEMPLATEARTIFACTSPELL.IsSpellUsable && TEMPLATEARTIFACTSPELL.IsHostileDistanceGood) { TEMPLATEARTIFACTSPELL.Cast(); return; } //Single Target if (ObjectManager.Target.GetUnitInSpellRange(5f) == 1) { } //Multiple Targets else { } } finally { Memory.WowMemory.GameFrameUnLock(); } }
private void closeWow(string reason) { Logging.Write("Closing WoW because: " + reason); if (nManagerSetting.CurrentSetting.UseHearthstone) { Logging.Write("Loading Hearthstone informations"); if (ItemsManager.GetItemCount(6948) <= 0) { Logging.Write(Translate.Get(Translate.Id.HearthstoneNotFound)); } else { if (!ItemsManager.IsItemOnCooldown(6948) && ItemsManager.IsItemUsable(6948)) { Timer timerHearthstone = new Timer(1000 * 45); Tasks.MountTask.DismountMount(); MovementManager.StopMove(); MovementManager.StopMove(); timerHearthstone.Reset(); Logging.Write("Hearthstone available, using it."); while (!Usefuls.IsLoading && !timerHearthstone.IsReady) { ItemsManager.UseItem(ItemsManager.GetItemNameById(6948)); Thread.Sleep(1000); } } else { Logging.Write("Hearthstone found but on cooldown."); } } } Memory.WowProcess.KillWowProcess(); MessageBox.Show(reason, Translate.Get(Translate.Id.Stop_tnb_if), MessageBoxButtons.OK, MessageBoxIcon.Warning); Process.GetCurrentProcess().Kill(); }
public static void Dispose(bool closePocess = false) { try { lock (Locker) { Thread thread = new Thread(() => ThreadDispose(closePocess)) { Name = "Thread Dispose nManager." }; _isDisposed = false; thread.Start(); Timer t = new Timer(3 * 1000); while (!_isDisposed && !t.IsReady) { Thread.Sleep(10); } if (closePocess) { System.Diagnostics.Process.GetCurrentProcess().Kill(); } } } catch (Exception e) { try { if (closePocess) { System.Diagnostics.Process.GetCurrentProcess().Kill(); } } catch { } Logging.WriteError("nManager > Pulstator > Dispose(): " + e); } }
public static void DisposeProduct() { try { lock (Locker) { var thread = new Thread(ThreadDisposeProduct) { Name = "Thread Dispose Product." }; _isDisposed = false; thread.Start(); var t = new Timer(2 * 1000); while (!_isDisposed && !t.IsReady) { Thread.Sleep(10); } } } catch (Exception e) { Logging.WriteError("DisposeProduct(): " + e); } }
public override void Run() { MovementManager.StopMove(); MovementManager.StopMoveTo(); if (ObjectManager.Me.HaveBuff(ResurrectionSicknessId)) { Logging.Write("Resurrection Sickness detected, we will now wait its full duration to avoid dying in chain."); while (ObjectManager.Me.HaveBuff(ResurrectionSicknessId)) { Thread.Sleep(1000); // We don't need to return if we get in combat, we would die quickly anyway, and we will ressurect from our body this time. } return; } Logging.Write("The player has died. Starting the resurrection process."); #region Reincarnation if (ObjectManager.Me.WowClass == WoWClass.Shaman && _shamanReincarnation.KnownSpell && _shamanReincarnation.IsSpellUsable) { Thread.Sleep(3500); // Let our killers reset. Lua.RunMacroText("/click StaticPopup1Button2"); Thread.Sleep(1000); if (!ObjectManager.Me.IsDeadMe) { _failed = false; Logging.Write("The player have been resurrected using Shaman Reincarnation."); Statistics.Deaths++; return; } } #endregion #region Soulstone if (ObjectManager.Me.WowClass == WoWClass.Warlock && _warlockSoulstone.KnownSpell && _warlockSoulstone.HaveBuff || ObjectManager.Me.HaveBuff(6203)) { Thread.Sleep(3500); // Let our killers reset. Lua.RunMacroText("/click StaticPopup1Button2"); Thread.Sleep(1000); if (!ObjectManager.Me.IsDeadMe) { _failed = false; Logging.Write(ObjectManager.Me.WowClass == WoWClass.Warlock ? "The player have been resurrected using his Soulstone." : "The player have been resurrected using a Soulstone offered by a Warlock."); Statistics.Deaths++; return; } } #endregion Interact.Repop(); Thread.Sleep(1000); while (!ObjectManager.Me.PositionCorpse.IsValid && ObjectManager.Me.Health <= 0 && Products.Products.IsStarted && Usefuls.InGame) { Interact.Repop(); Thread.Sleep(1000); } Thread.Sleep(1000); #region Battleground resurrection if (Usefuls.IsInBattleground) { _battlegroundResurrect = new Timer(1000 * 35); while (Usefuls.IsLoading && Products.Products.IsStarted && Usefuls.InGame) { Thread.Sleep(100); } Thread.Sleep(4000); /*var factionBattlegroundSpiritHealer = * new WoWUnit( * ObjectManager.GetNearestWoWUnit( * ObjectManager.GetWoWUnitByName(ObjectManager.Me.PlayerFaction + * " Spirit Guide")).GetBaseAddress); * if (!factionBattlegroundSpiritHealer.IsValid) * { * Logging.Write("Faction Spirit Healer not found, teleport back to the cimetery."); * Interact.TeleportToSpiritHealer(); * Thread.Sleep(5000); * } * else * { * if (factionBattlegroundSpiritHealer.GetDistance > 25) * { * Interact.TeleportToSpiritHealer(); * Thread.Sleep(5000); * }*/ while (ObjectManager.Me.IsDeadMe) { if (_battlegroundResurrect.IsReady) { Interact.TeleportToSpiritHealer(); _battlegroundResurrect = new Timer(1000 * 35); Logging.Write("The player have not been resurrected by any Battleground Spirit Healer in a reasonable time, Teleport back to the cimetary."); Thread.Sleep(5000); } Thread.Sleep(1000); } _failed = false; Logging.Write("The player have been resurrected by the Battleground Spirit Healer."); Statistics.Deaths++; return; /*}*/ } #endregion #region Go To Corpse resurrection if (ObjectManager.Me.Level <= 10) { _forceSpiritHealer = true; Logging.Write("We have no penalty for using Spirit Healer, so let's use it."); } else if (ObjectManager.Me.PositionCorpse.IsValid && !nManagerSetting.CurrentSetting.UseSpiritHealer && !_forceSpiritHealer) { while (Usefuls.IsLoading && Products.Products.IsStarted && Usefuls.InGame) { Thread.Sleep(100); } Thread.Sleep(1000); Point tPointCorps; if (ObjectManager.Me.IsMounted || MountTask.OnFlyMount()) { MountTask.Takeoff(); tPointCorps = ObjectManager.Me.PositionCorpse; tPointCorps.Z = tPointCorps.Z + 15; LongMove.LongMoveByNewThread(tPointCorps); } else { tPointCorps = ObjectManager.Me.PositionCorpse; bool success; tPointCorps.Z = PathFinder.GetZPosition(tPointCorps); // make sure to get the right Z in case we died in the air/surface of water. List <Point> points = PathFinder.FindPath(tPointCorps, out success); if (!success) { _forceSpiritHealer = true; Logging.Write("There in no easy acces to the corpse, use Spirit Healer instead."); // todo: Check few positions "In Range", we don't necesserly need to get to our body. return; } if (points.Count > 1 || (points.Count <= 1 && !nManagerSetting.CurrentSetting.UseSpiritHealer)) { MovementManager.Go(points); } } while ((MovementManager.InMovement || LongMove.IsLongMove) && Products.Products.IsStarted && Usefuls.InGame && ObjectManager.Me.IsDeadMe) { if ((tPointCorps.DistanceTo(ObjectManager.Me.Position) < 25 && !_failed) || (Memory.WowMemory.Memory.ReadInt(Memory.WowProcess.WowModule + (uint)Addresses.Player.RetrieveCorpseWindow) > 0 && !_failed) || ObjectManager.Me.PositionCorpse.DistanceTo(ObjectManager.Me.Position) < 5) { LongMove.StopLongMove(); MovementManager.StopMove(); } Thread.Sleep(100); } if (Usefuls.IsFlying) { Tasks.MountTask.Land(); } if (Memory.WowMemory.Memory.ReadInt(Memory.WowProcess.WowModule + (uint)Addresses.Player.RetrieveCorpseWindow) <= 0) { _failed = true; } Point safeResPoint = Usefuls.GetSafeResPoint(); if (safeResPoint.IsValid && nManagerSetting.CurrentSetting.ActivateSafeResurrectionSystem) { MovementManager.StopMove(); bool success; List <Point> points = PathFinder.FindPath(safeResPoint, out success); if (!success) { return; } MovementManager.Go(points); Timer distanceTimer = null; while (safeResPoint.DistanceTo(ObjectManager.Me.Position) > 5) { if (!MovementManager.InMovement) { MovementManager.Go(points); } if (distanceTimer == null && tPointCorps.DistanceTo(ObjectManager.Me.Position) <= 39.0f) { distanceTimer = new Timer(10000); // start a 10sec timer when we are in range of our corpse. } if (distanceTimer != null && distanceTimer.IsReady) { break; // Sometimes we cannot join the desired destination because of a wall, or water level. } Thread.Sleep(1000); } MovementManager.StopMove(); while ((tPointCorps.DistanceTo(ObjectManager.Me.Position) <= 39.0f || Memory.WowMemory.Memory.ReadInt(Memory.WowProcess.WowModule + (uint)Addresses.Player.RetrieveCorpseWindow) > 0) && ObjectManager.Me.IsDeadMe && Products.Products.IsStarted && Usefuls.InGame) { Interact.RetrieveCorpse(); Thread.Sleep(1000); } } else { if (tPointCorps.DistanceTo(ObjectManager.Me.Position) <= 30.0f || Memory.WowMemory.Memory.ReadInt(Memory.WowProcess.WowModule + (uint)Addresses.Player.RetrieveCorpseWindow) > 0) { while ((tPointCorps.DistanceTo(ObjectManager.Me.Position) <= 30.0f || Memory.WowMemory.Memory.ReadInt(Memory.WowProcess.WowModule + (uint)Addresses.Player.RetrieveCorpseWindow) > 0) && ObjectManager.Me.IsDeadMe && Products.Products.IsStarted && Usefuls.InGame) { Interact.RetrieveCorpse(); Thread.Sleep(1000); } } } } if (!ObjectManager.Me.IsDeadMe) { _failed = false; Logging.Write("The player have been resurrected when retrieving his corpse."); Statistics.Deaths++; return; } #endregion GoToCorp #region Spirit Healer resurrection if (nManagerSetting.CurrentSetting.UseSpiritHealer || _forceSpiritHealer || ObjectManager.Me.HaveBuff(15007)) { Thread.Sleep(4000); WoWUnit objectSpiritHealer = new WoWUnit(ObjectManager.GetNearestWoWUnit(ObjectManager.GetWoWUnitSpiritHealer()).GetBaseAddress); int stuckTemps = 5; if (!objectSpiritHealer.IsValid) { Logging.Write("Spirit Healer not found, teleport back to the cimetery."); Interact.TeleportToSpiritHealer(); Thread.Sleep(5000); } else { if (objectSpiritHealer.GetDistance > 25) { Interact.TeleportToSpiritHealer(); Thread.Sleep(5000); } MovementManager.MoveTo(objectSpiritHealer.Position); while (objectSpiritHealer.GetDistance > 5 && Products.Products.IsStarted && stuckTemps >= 0 && Usefuls.InGame) { Thread.Sleep(300); if (!ObjectManager.Me.GetMove && objectSpiritHealer.GetDistance > 5) { MovementManager.MoveTo(objectSpiritHealer.Position); stuckTemps--; } } Interact.InteractWith(objectSpiritHealer.GetBaseAddress); Thread.Sleep(2000); Interact.SpiritHealerAccept(); Thread.Sleep(1000); if (!ObjectManager.Me.IsDeadMe) { _forceSpiritHealer = false; Logging.Write("The player have been resurrected by the Spirit Healer."); Statistics.Deaths++; } } } #endregion SpiritHealer }
public static void Pulse(IEnumerable <WoWUnit> woWUnits) { try { woWUnits = woWUnits.OrderBy(x => x.GetDistance); foreach (WoWUnit wowUnit in woWUnits) { try { if (Products.Products.IsStarted) { if (nManagerSetting.IsBlackListed(wowUnit.Guid)) { continue; } MovementManager.StopMove(); MovementManager.StopMove(); Thread.Sleep(250 + Usefuls.Latency); while (ObjectManager.ObjectManager.Me.IsCast) { Thread.Sleep(200); } if (!wowUnit.IsValid) { continue; } bool looted = false; if (wowUnit.IsLootable) { Logging.Write("Loot " + wowUnit.Name); } else if (wowUnit.IsSkinnable && nManagerSetting.CurrentSetting.ActivateBeastSkinning) { Logging.Write("Skin " + wowUnit.Name); } else { continue; } FarmingTask.CurUnit = wowUnit; // We have no item to loot at range, then go to mob if (!CombatClass.InMeleeRange(wowUnit) && (!nManagerSetting.CurrentSetting.UseLootARange || LootARangeId == 0 || ObjectManager.ObjectManager.Me.Position.DistanceTo(wowUnit.Position) > 40f || !ItemsManager.IsItemUsable(LootARangeId))) { bool success; List <Point> points = PathFinder.FindPath(wowUnit.Position, out success); if (points.Count <= 0) { points.Add(ObjectManager.ObjectManager.Me.Position); points.Add(wowUnit.Position); } if (!success) { if ((points.Count == 2 && wowUnit.GetDistance > 6) || points.Count != 2) { // we didn't find a valid path and the target is not that close, blacklisting. // Straightline wont help anyway. Logging.Write("No path to " + wowUnit.Name + ", blacklisting."); nManagerSetting.AddBlackList(wowUnit.Guid, 1000 * 60 * 5); } } MovementManager.Go(points); Timer timer = new Timer((int)(Math.DistanceListPoint(points) / 3 * 1000) + 3000); while (!ObjectManager.ObjectManager.Me.IsDeadMe && wowUnit.IsValid && Products.Products.IsStarted && ObjectManager.ObjectManager.GetNumberAttackPlayer() == 0 && !(ObjectManager.ObjectManager.Me.InCombat && !(ObjectManager.ObjectManager.Me.IsMounted && (nManagerSetting.CurrentSetting.IgnoreFightIfMounted || Usefuls.IsFlying))) && !timer.IsReady) { if (ObjectManager.ObjectManager.Me.Position.DistanceTo(wowUnit.Position) <= 4.0f) { MovementManager.StopMove(); MovementManager.StopMove(); MountTask.DismountMount(); Thread.Sleep(250); while (ObjectManager.ObjectManager.Me.GetMove) { Thread.Sleep(50); } break; } } } // Now loot if (wowUnit.IsLootable) { // Code for 109167 Findle's Loot-A-Range and 60854 Loot-A-Rang if (nManagerSetting.CurrentSetting.UseLootARange && !CombatClass.InMeleeRange(wowUnit) && ObjectManager.ObjectManager.Me.Position.DistanceTo(wowUnit.Position) <= 40f && LootARangeId != 0 && ItemsManager.IsItemUsable(LootARangeId)) { // Since these items have a CD of only 3 sec, it's worth waiting for the CD to recover while (ItemsManager.IsItemOnCooldown(LootARangeId)) { Thread.Sleep(250); } FarmingTask.CountThisLoot = true; FarmingTask.NodeOrUnit = false; ItemsManager.UseToy(LootARangeId); Thread.Sleep(1000 + Usefuls.Latency); while (ObjectManager.ObjectManager.Me.IsCast) { if (ObjectManager.ObjectManager.Me.InCombat && !(ObjectManager.ObjectManager.Me.IsMounted && (nManagerSetting.CurrentSetting.IgnoreFightIfMounted || Usefuls.IsFlying))) { return; } Thread.Sleep(150); } } else { FarmingTask.CountThisLoot = true; FarmingTask.NodeOrUnit = false; Interact.InteractWith(wowUnit.GetBaseAddress); if ((ObjectManager.ObjectManager.Me.InCombat && !(ObjectManager.ObjectManager.Me.IsMounted && (nManagerSetting.CurrentSetting.IgnoreFightIfMounted || Usefuls.IsFlying)))) { return; } Thread.Sleep(500 + Usefuls.Latency); } if (nManagerSetting.CurrentSetting.ActivateBeastSkinning && ObjectManager.ObjectManager.GetNumberAttackPlayer() > 0) { return; } Statistics.Loots++; if (nManagerSetting.CurrentSetting.ActivateBeastSkinning) { Thread.Sleep(475 + Usefuls.Latency); // let the client react to unit flag change looted = true; } else { WoWUnit unit = wowUnit; // we blacklist all unit around for a short time to be sure we loot then foreach (WoWUnit u in woWUnits.Where(u => u != unit).Where(u => u.Position.DistanceTo2D(unit.Position) <= 25f)) { nManagerSetting.AddBlackList(u.Guid, 475 + Usefuls.Latency); } nManagerSetting.AddBlackList(wowUnit.Guid, 475 + Usefuls.Latency); return; } } if ((looted || !wowUnit.IsLootable) && !wowUnit.IsSkinnable) { continue; } // From here we are sure the unit is skinnable // if this is the unit we just looted, we need to redo check for extra loot // if this is NOT the unit we just looted, then the check is already done at list building time if (nManagerSetting.CurrentSetting.ActivateBeastSkinning && ObjectManager.ObjectManager.GetNumberAttackPlayer() == 0) { if ((looted || !wowUnit.IsLootable)) { if (wowUnit.ExtraLootType.HasFlag(TypeFlag.HERB_LOOT) || wowUnit.Entry == 112052 || wowUnit.Entry == 113646) { int myHerbalismLevel = Skill.GetValue(SkillLine.Herbalism); if (myHerbalismLevel <= 0) { nManagerSetting.AddBlackList(wowUnit.Guid, 1000 * 60 * 5); continue; } } else if (wowUnit.ExtraLootType.HasFlag(TypeFlag.MINING_LOOT) || wowUnit.Entry == 104895 || wowUnit.Entry == 104877) { int myMiningLevel = Skill.GetValue(SkillLine.Mining); if (myMiningLevel <= 0) { nManagerSetting.AddBlackList(wowUnit.Guid, 1000 * 60 * 5); continue; } } else if (wowUnit.ExtraLootType.HasFlag(TypeFlag.ENGENEERING_LOOT)) { int myEngineeringLevel = Skill.GetValue(SkillLine.Engineering); if (myEngineeringLevel <= 0) { nManagerSetting.AddBlackList(wowUnit.Guid, 1000 * 60 * 5); continue; } } else { int mySkinningLevel = Skill.GetValue(SkillLine.Skinning); if (mySkinningLevel <= 0) { nManagerSetting.AddBlackList(wowUnit.Guid, 1000 * 60 * 5); continue; } } } // If we looted at range, we must go to creature to skin it if (!CombatClass.InMeleeRange(wowUnit)) { List <Point> points = PathFinder.FindPath(wowUnit.Position); if (points.Count <= 0) { points.Add(ObjectManager.ObjectManager.Me.Position); points.Add(wowUnit.Position); } MovementManager.Go(points); Timer timer = new Timer((int)(Math.DistanceListPoint(points) / 3 * 1000) + 3000); while (!ObjectManager.ObjectManager.Me.IsDeadMe && wowUnit.IsValid && Products.Products.IsStarted && ObjectManager.ObjectManager.GetNumberAttackPlayer() == 0 && !(ObjectManager.ObjectManager.Me.InCombat && !(ObjectManager.ObjectManager.Me.IsMounted && (nManagerSetting.CurrentSetting.IgnoreFightIfMounted || Usefuls.IsFlying))) && !timer.IsReady) { if (CombatClass.InMeleeRange(wowUnit)) { MovementManager.StopMove(); MovementManager.StopMove(); MountTask.DismountMount(); Thread.Sleep(250); while (ObjectManager.ObjectManager.Me.GetMove) { Thread.Sleep(50); } break; } } } Logging.Write("Skin " + wowUnit.Name); Interact.InteractWith(wowUnit.GetBaseAddress); Thread.Sleep(200 + Usefuls.Latency); while (ObjectManager.ObjectManager.Me.IsCast) { Thread.Sleep(100); } if ((ObjectManager.ObjectManager.Me.InCombat && !(ObjectManager.ObjectManager.Me.IsMounted && (nManagerSetting.CurrentSetting.IgnoreFightIfMounted || Usefuls.IsFlying)))) { return; } Thread.Sleep(400 + Usefuls.Latency); if (nManagerSetting.CurrentSetting.ActivateBeastSkinning && ObjectManager.ObjectManager.GetNumberAttackPlayer() > 0) { return; } Statistics.Farms++; nManagerSetting.AddBlackList(wowUnit.Guid, 1000 * 60 * 5); } } MovementManager.StopMove(); MovementManager.StopMove(); } catch { } } } catch (Exception ex) { Logging.WriteError("LootingTask > Pulse(IEnumerable<WoWUnit> woWUnits): " + ex); } }