public static void InteractTarget(ref Npc npc, uint baseAddress) { MovementManager.StopMove(); WoWGameObject targetIsGameObject = ObjectManager.ObjectManager.GetNearestWoWGameObject(ObjectManager.ObjectManager.GetWoWGameObjectByEntry(npc.Entry), npc.Position); Interact.InteractWith(baseAddress); if (targetIsGameObject.IsValid) { Thread.Sleep(3100); return; } Thread.Sleep(Usefuls.Latency + 500); if (ObjectManager.ObjectManager.Target.GetBaseAddress == 0 || ObjectManager.ObjectManager.Target.GetBaseAddress != baseAddress) { Logging.WriteDebug("Using LUA to target " + npc.Name); Lua.LuaDoString("TargetUnit(\"" + npc.Name + "\")"); Thread.Sleep(Usefuls.Latency + 500); Interact.InteractWith(ObjectManager.ObjectManager.Target.GetBaseAddress); Thread.Sleep(Usefuls.Latency + 500); } }
public static void TagMonstersArround(Spell spellToUses, float range, List <int> entry = null) { Usefuls.SleepGlobalCooldown(); foreach (WoWUnit u in ObjectManager.ObjectManager.GetObjectWoWUnit60Yards()) { if (!u.IsAlive || u.InCombat || (entry != null && !entry.Contains(u.Entry)) || UnitRelation.GetReaction(ObjectManager.ObjectManager.Me.Faction, u.Faction) <= Reaction.Hostile) { continue; } if (!u.IsInRange(range)) { continue; } if (ObjectManager.ObjectManager.Me.Target != u.Guid) { Interact.InteractWith(u.GetBaseAddress, true); Thread.Sleep(100); spellToUses.Cast(true); return; } } }
public static UInt128 StartFightDamageDealer(UInt128 guid = default(UInt128)) { WoWUnit targetNpc = null; try { if (ObjectManager.ObjectManager.Me.IsMounted) { return(0); } if (guid == 0) { targetNpc = new WoWUnit(ObjectManager.ObjectManager.GetNearestWoWUnit(ObjectManager.ObjectManager.GetHostileUnitAttackingPlayer()).GetBaseAddress); } else { targetNpc = new WoWUnit(ObjectManager.ObjectManager.GetObjectByGuid(guid).GetBaseAddress); } if (!targetNpc.Attackable) { nManagerSetting.AddBlackList(targetNpc.Guid, 20000); // blacklist 20 sec return(0); } InFight = true; if (!ObjectManager.ObjectManager.Me.IsCast) { if (CombatClass.InRange(targetNpc) && CombatClass.GetRange <= 5) // Initiate auto attack on melees + target. { Interact.InteractWith(targetNpc.GetBaseAddress); } ObjectManager.ObjectManager.Me.Target = targetNpc.Guid; } Thread.Sleep(100); Point positionStartTarget = targetNpc.Position; figthStart: // If pos start is far, we will Loop to it anyway. if (targetNpc.Position.DistanceTo(positionStartTarget) > CombatClass.GetRange + 5f) { return(0); } if (!targetNpc.Attackable) { nManagerSetting.AddBlackList(targetNpc.Guid, 20000); // blacklist 20 sec return(0); } if (Usefuls.IsInBattleground && !Battleground.IsFinishBattleground()) { List <WoWUnit> tLUnit = ObjectManager.ObjectManager.GetHostileUnitAttackingPlayer(); if (tLUnit.Count > 0) { if (ObjectManager.ObjectManager.GetNearestWoWUnit(tLUnit).GetDistance < targetNpc.GetDistance && ObjectManager.ObjectManager.GetNearestWoWUnit(tLUnit).SummonedBy == 0) { return(0); } } } Thread.Sleep(200); if (CombatClass.InRange(targetNpc) && CombatClass.GetRange > 5 && ObjectManager.ObjectManager.Me.GetMove && !ObjectManager.ObjectManager.Me.IsCast) { Logging.Write("Your class recquires you to stop moving in order to cast spell, as this product is passive, we wont try to force stop."); } if ((ObjectManager.ObjectManager.Me.Target != targetNpc.Guid) && !targetNpc.IsDead && !ObjectManager.ObjectManager.Me.IsCast) { ObjectManager.ObjectManager.Me.Target = targetNpc.Guid; if (CombatClass.GetRange <= 5) // Initiate auto attack on melees + target. { Interact.InteractWith(targetNpc.GetBaseAddress); } } // If target died after only 0.2sec of fight, let's find a new target. if (targetNpc.IsDead || !targetNpc.IsValid) { targetNpc = new WoWUnit(ObjectManager.ObjectManager.GetNearestWoWUnit(ObjectManager.ObjectManager.GetHostileUnitAttackingPlayer()).GetBaseAddress); if (!ObjectManager.ObjectManager.Me.IsCast && ObjectManager.ObjectManager.Me.Target != targetNpc.Guid) { Interact.InteractWith(targetNpc.GetBaseAddress); } if (nManagerSetting.CurrentSetting.ActivateAutoFacingDamageDealer) { MovementManager.Face(targetNpc, false); } } while (!ObjectManager.ObjectManager.Me.IsDeadMe && !targetNpc.IsDead && targetNpc.IsValid && InFight && targetNpc.Attackable) { // check for IsTransport if we are specifically inside a taxi, but allow fighting in ships etc. // I guess transport Id become the creature Id in that case ? So check if transport id is actually a unit and not a gameobject or a continentid ? // Target Pos Verif if (!targetNpc.Position.IsValid) { return(targetNpc.Guid); } // Target mob if not target if (ObjectManager.ObjectManager.Me.Target != targetNpc.Guid && !targetNpc.IsDead && !ObjectManager.ObjectManager.Me.IsCast) { // Player has switched the target. if (ObjectManager.ObjectManager.Me.Target == 0) { return(0); // if player have no target anymore, don't do anything. } if (CombatClass.GetRange <= 5) // Initiate auto attack on melees. { Interact.InteractWith(ObjectManager.ObjectManager.Target.GetBaseAddress); } // Switch Target targetNpc = new WoWUnit(ObjectManager.ObjectManager.Target.GetBaseAddress); goto figthStart; } if (nManagerSetting.CurrentSetting.ActivateAutoFacingDamageDealer) { MovementManager.Face(targetNpc, false); } // If we are not facing anymore, it's because of player moves in 99% of the case, so wait for the next player move to apply the facing. Thread.Sleep(50); } } catch (Exception exception) { Logging.WriteError("StartFightDamageDealer(UInt128 guid = 0, bool inBg = false): " + exception); } if (targetNpc != null) { return(targetNpc.Guid); } return(0); }
public static UInt128 StartFight(UInt128 guid = default(UInt128)) { MovementManager.StopMove(); WoWUnit targetNpc = null; try { if (guid == 0) { targetNpc = new WoWUnit( ObjectManager.ObjectManager.GetNearestWoWUnit( ObjectManager.ObjectManager.GetHostileUnitAttackingPlayer()).GetBaseAddress); } else { targetNpc = new WoWUnit(ObjectManager.ObjectManager.GetObjectByGuid(guid).GetBaseAddress); } if (!targetNpc.Attackable) { nManagerSetting.AddBlackList(targetNpc.Guid, 20000); // blacklist 20 sec } if (ObjectManager.ObjectManager.Me.IsMounted && (CombatClass.InAggroRange(targetNpc) || CombatClass.InRange(targetNpc))) { MountTask.DismountMount(); } InFight = true; if (!ObjectManager.ObjectManager.Me.IsCast) { Interact.InteractWith(targetNpc.GetBaseAddress); } Thread.Sleep(100); if (ObjectManager.ObjectManager.Me.GetMove && !ObjectManager.ObjectManager.Me.IsCast) { MovementManager.StopMoveTo(); } Point positionStartTarget = targetNpc.Position; int timer = 0; figthStart: // If pos start is very different if (targetNpc.Position.DistanceTo(positionStartTarget) > 50) { return(0); } if (!targetNpc.Attackable) { nManagerSetting.AddBlackList(targetNpc.Guid, 20000); // blacklist 20 sec // Some become unattackable instead of being dead. // Some will evade. } if (Usefuls.IsInBattleground && !Battleground.IsFinishBattleground()) { List <WoWUnit> tLUnit = ObjectManager.ObjectManager.GetHostileUnitAttackingPlayer(); if (tLUnit.Count > 0) { if (ObjectManager.ObjectManager.GetNearestWoWUnit(tLUnit).GetDistance < targetNpc.GetDistance && ObjectManager.ObjectManager.GetNearestWoWUnit(tLUnit).SummonedBy == 0) { return(0); } } } if ((ObjectManager.ObjectManager.Me.InCombat && !CombatClass.InRange(targetNpc)) || TraceLine.TraceLineGo(targetNpc.Position)) // If obstacle or not in range { bool resultSucces; List <Point> points = PathFinder.FindPath(targetNpc.Position, out resultSucces); if (!resultSucces && !Usefuls.IsFlying && MountTask.GetMountCapacity() >= MountCapacity.Fly) { MountTask.Mount(true, true); } // TODO: Code a FindTarget that includes CombatClass.GetRange here or we will often do wierd thing with casters. MovementManager.Go(points); timer = Others.Times + (int)(Math.DistanceListPoint(points) / 3 * 1000) + 15000; while (!ObjectManager.ObjectManager.Me.IsDeadMe && !targetNpc.IsDead && targetNpc.Attackable && !targetNpc.IsLootable && targetNpc.Health > 0 && targetNpc.IsValid && MovementManager.InMovement && InFight && Usefuls.InGame && (TraceLine.TraceLineGo(targetNpc.Position) || !CombatClass.InAggroRange(targetNpc)) ) { // Mob already in fight if (targetNpc.Type != Enums.WoWObjectType.Player && !(targetNpc.IsTargetingMe || targetNpc.Target == 0 || ((WoWUnit)ObjectManager.ObjectManager.GetObjectByGuid(targetNpc.Target)). SummonedBy == ObjectManager.ObjectManager.Me.Guid || targetNpc.Target == ObjectManager.ObjectManager.Pet.Guid)) { return(targetNpc.Guid); } // Timer if (Others.Times > timer && TraceLine.TraceLineGo(targetNpc.Position)) { return(targetNpc.Guid); } // Target Pos Verif if (!targetNpc.Position.IsValid) { return(targetNpc.Guid); } // If pos start is very different if (targetNpc.Position.DistanceTo(positionStartTarget) > 50) { return(0); } // Return if player/pet is attacked by another unit if (ObjectManager.ObjectManager.GetNumberAttackPlayer() > 0 && !targetNpc.IsTargetingMe && !(targetNpc.Target == ObjectManager.ObjectManager.Pet.Guid && targetNpc.Target > 0)) { return(0); } Thread.Sleep(50); } } timer = Others.Times + (int)(ObjectManager.ObjectManager.Me.Position.DistanceTo(targetNpc.Position) / 3 * 1000) + 5000; if (MovementManager.InMovement) { MovementManager.StopMove(); } if (!ObjectManager.ObjectManager.Me.IsCast && ObjectManager.ObjectManager.Me.Target != targetNpc.Guid) { Interact.InteractWith(targetNpc.GetBaseAddress); } InFight = true; Thread.Sleep(200); if (CombatClass.InAggroRange(targetNpc)) { if (ObjectManager.ObjectManager.Me.GetMove && !ObjectManager.ObjectManager.Me.IsCast) { MovementManager.StopMoveTo(); } if (!ObjectManager.ObjectManager.Me.GetMove && ObjectManager.ObjectManager.Me.IsMounted) { MountTask.DismountMount(); } } // If target died after only 0.2sec of fight, let's find a new target. if (targetNpc.IsDead || !targetNpc.IsValid || targetNpc.Attackable) { WoWUnit newTargetNpc = new WoWUnit(ObjectManager.ObjectManager.GetNearestWoWUnit(ObjectManager.ObjectManager.GetHostileUnitAttackingPlayer()).GetBaseAddress); if (newTargetNpc.IsValid && !ObjectManager.ObjectManager.Me.IsCast && ObjectManager.ObjectManager.Me.Target != newTargetNpc.Guid) { targetNpc = newTargetNpc; Interact.InteractWith(targetNpc.GetBaseAddress); // Face the new target MovementManager.Face(targetNpc); } } while (!ObjectManager.ObjectManager.Me.IsDeadMe && !targetNpc.IsDead && targetNpc.Attackable && targetNpc.IsValid && InFight && targetNpc.IsValid && !ObjectManager.ObjectManager.Me.InTransport) { // Return if player attacked and this target not attack player if (targetNpc.Type != Enums.WoWObjectType.Player && !targetNpc.IsTargetingMe && !(targetNpc.Target == ObjectManager.ObjectManager.Pet.Guid && targetNpc.Target > 0) && ObjectManager.ObjectManager.GetNumberAttackPlayer() > 0) { return(0); } // Cancel fight if the mob was tapped by another player if (targetNpc.IsTapped) { return(0); } // Target Pos Verif if (!targetNpc.Position.IsValid) { InFight = false; return(targetNpc.Guid); } // Target mob if not target if (ObjectManager.ObjectManager.Me.Target != targetNpc.Guid && !targetNpc.IsDead && !ObjectManager.ObjectManager.Me.IsCast) { Interact.InteractWith(targetNpc.GetBaseAddress); } // Move to target if out of range if (!ObjectManager.ObjectManager.Me.IsCast && ((!ObjectManager.ObjectManager.Me.InCombat && !CombatClass.InAggroRange(targetNpc)) || ((ObjectManager.ObjectManager.Me.InCombat && !CombatClass.InRange(targetNpc))))) { int rJump = Others.Random(1, 20); MovementManager.MoveTo(targetNpc); if (rJump == 5) { MovementsAction.Jump(); } } // Create path if the mob is out of sight or out of range if ((!CombatClass.InRange(targetNpc) && !ObjectManager.ObjectManager.Me.IsCast) || TraceLine.TraceLineGo(targetNpc.Position)) { goto figthStart; } // Stop move if in range if (CombatClass.InRange(targetNpc) && ObjectManager.ObjectManager.Me.GetMove && !ObjectManager.ObjectManager.Me.IsCast) { MovementManager.StopMoveTo(); } if (ObjectManager.ObjectManager.Me.IsMounted) { MountTask.DismountMount(); Interact.InteractWith(targetNpc.GetBaseAddress); } // Face player to mob MovementManager.Face(targetNpc); // If obstacle between us and the target after this timer expires then stop the fight and blacklist if (Others.Times > timer && TraceLine.TraceLineGo(targetNpc.Position) && targetNpc.HealthPercent > 90) { InFight = false; return(targetNpc.Guid); } Thread.Sleep(75 + Usefuls.Latency); // If timer expires and still not in fight, then stop the fight and blacklist if (Others.Times > timer && !ObjectManager.ObjectManager.Me.InCombat && !targetNpc.IsDead) { InFight = false; return(targetNpc.Guid); } } MovementManager.StopMoveTo(); InFight = false; } catch (Exception exception) { Logging.WriteError("StartFight(UInt128 guid = 0, bool inBg = false): " + exception); InFight = false; } try { if (targetNpc != null) { return(targetNpc.Guid); } } catch { return(0); } return(0); }
public static void QuestTurnIn(ref Npc npc, string questName, int questId, bool ignoreBlacklist = false, bool forceTravel = false) { if (npc.ForceTravel) { forceTravel = true; } Point me = ObjectManager.ObjectManager.Me.Position; WoWUnit mNpc = ObjectManager.ObjectManager.GetNearestWoWUnit(ObjectManager.ObjectManager.GetWoWUnitByEntry(npc.Entry, true), false, ignoreBlacklist, true); if (mNpc.IsValid && mNpc.CanTurnIn) { npc.Position = mNpc.Position; } WoWGameObject mObj = ObjectManager.ObjectManager.GetNearestWoWGameObject(ObjectManager.ObjectManager.GetWoWGameObjectByEntry(npc.Entry), ignoreBlacklist); if (mObj.IsValid && mObj.CanTurnIn) { npc.Position = mObj.Position; } bool bypassTravel = false; if (me.DistanceTo(npc.Position) <= 800f) { PathFinder.FindPath(npc.Position, out bypassTravel); } if (Usefuls.IsFlying && npc.ContinentIdInt == Usefuls.ContinentId) { bypassTravel = true; } else if (Usefuls.IsFlying) { MountTask.DismountMount(); } 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 (!bypassTravel && (_travelLocation == null || _travelLocation.DistanceTo(me) > 0.1f) && !_travelDisabled) { MovementManager.StopMove(); Logging.Write("Calling travel system for TurnInQuest " + questName + "(" + questId + ") from " + npc.Name + " (" + npc.Entry + ")..."); Products.Products.TravelToContinentId = npc.ContinentIdInt; Products.Products.TravelTo = npc.Position; Products.Products.TravelFromContinentId = Usefuls.ContinentId; Products.Products.TravelFrom = me; Products.Products.ForceTravel = forceTravel; // Pass the check for valid destination as a lambda Products.Products.TargetValidationFct = IsNearQuestGiver; _travelLocation = Products.Products.TravelFrom; return; } if (_travelLocation != null && _travelLocation.DistanceTo(me) <= 0.1f) { _travelDisabled = true; } //Start target finding based on QuestGiver. uint baseAddress = MovementManager.FindTarget(ref npc, 4.5f, true, true, 0f, ignoreBlacklist); if (MovementManager.InMovement) { return; } if (baseAddress > 0) { var tmpNpc = ObjectManager.ObjectManager.GetObjectByGuid(npc.Guid); if (tmpNpc is WoWUnit) { var unitTest = tmpNpc as WoWUnit; if (unitTest.IsValid && unitTest.GetDistance < 20f && !unitTest.CanTurnIn) { _travelDisabled = false; // reset travel nManagerSetting.AddBlackList(unitTest.Guid, 30000); Logging.Write("Npc QuestGiver " + unitTest.Name + " (" + unitTest.Entry + ", distance: " + unitTest.GetDistance + ") cannot TurnIn any quest right now. Blacklisting it for 30 seconds."); return; } } } _travelDisabled = false; // reset travel ItemInfo equip = null; //End target finding based on QuestGiver. if (mObj.IsValid && mObj.GetDistance <= 4.5f || npc.Position.DistanceTo2D(ObjectManager.ObjectManager.Me.Position) < 4.5f && npc.Position.DistanceZ(ObjectManager.ObjectManager.Me.Position) < 6f || npc.Position.DistanceTo(ObjectManager.ObjectManager.Me.Position) < 4.5f) { if (baseAddress <= 0) { npc.Ignore(120000); return; } if (Usefuls.IsFlying) { MountTask.Land(); } InteractTarget(ref npc, baseAddress); Logging.Write("QuestTurnIn " + questName + " (" + questId + ") to " + npc.Name + " (" + npc.Entry + ")"); int id = GetQuestID(); if (GetNumGossipActiveQuests() == 0 && id == questId) { if (Others.IsFrameVisible("QuestFrameCompleteButton") && !Others.IsFrameVisible("QuestFrameCompleteQuestButton")) { Lua.RunMacroText("/click QuestFrameCompleteButton"); Thread.Sleep(300); } equip = CompleteQuest(); Thread.Sleep(Usefuls.Latency + 500); } if (!GetLogQuestId().Contains(questId)) // It's no more in the quest log, then we did turn in it sucessfuly { id = GetQuestID(); FinishedQuestSet.Add(questId); CloseWindow(); AbandonnedId = id; } else { bool systemWorks = GetGossipActiveQuestsWorks(); if (systemWorks) // 2 quest gossip systems = 2 different codes :( { for (int i = 1; i <= GetNumGossipActiveQuests(); i++) { SelectGossipActiveQuest(i); Thread.Sleep(Usefuls.Latency + 500); id = GetQuestID(); if (id == 0) { systemWorks = false; break; } if (id == questId) { if (Others.IsFrameVisible("QuestFrameCompleteButton") && !Others.IsFrameVisible("QuestFrameCompleteQuestButton")) { Lua.RunMacroText("/click QuestFrameCompleteButton"); Thread.Sleep(300); } equip = CompleteQuest(); Thread.Sleep(Usefuls.Latency + 500); // here it can be the next quest id presented automatically when the current one is turned in id = GetQuestID(); CloseWindow(); if (GetLogQuestId().Contains(questId)) { equip = null; Logging.WriteError("Could not turn-in quest " + questId + ": \"" + questName + "\""); break; } FinishedQuestSet.Add(questId); AbandonnedId = id; break; } CloseWindow(); Thread.Sleep(Usefuls.Latency + 500); Interact.InteractWith(baseAddress); Thread.Sleep(Usefuls.Latency + 500); } } if (!systemWorks) { int gossipid = 1; while (GetActiveTitle(gossipid) != "") { SelectActiveQuest(gossipid); Thread.Sleep(Usefuls.Latency + 500); id = GetQuestID(); if (id == questId) { if (Others.IsFrameVisible("QuestFrameCompleteButton") && !Others.IsFrameVisible("QuestFrameCompleteQuestButton")) { Lua.RunMacroText("/click QuestFrameCompleteButton"); Thread.Sleep(300); } equip = CompleteQuest(); Thread.Sleep(Usefuls.Latency + 500); CloseWindow(); if (GetLogQuestId().Contains(questId)) { equip = null; Logging.WriteError("Could not turn-in quest " + questId + ": \"" + questName + "\""); break; } FinishedQuestSet.Add(questId); break; } CloseWindow(); Thread.Sleep(Usefuls.Latency + 500); Interact.InteractWith(baseAddress); Thread.Sleep(Usefuls.Latency + 500); gossipid++; } } } } Thread.Sleep(Usefuls.Latency); if (equip != null) { ItemSelection.EquipItem(equip); Thread.Sleep(Usefuls.Latency + 500); } CloseWindow(); if (!GetLogQuestId().Contains(questId)) { FinishedQuestSet.Add(questId); } }
public static void QuestPickUp(ref Npc npc, string questName, int questId, out bool cancelPickUp, bool ignoreBlacklist = false, bool forceTravel = false) { if (npc.ForceTravel) { forceTravel = true; } cancelPickUp = false; if (AbandonnedId == questId) // should happen only when we do a different quest requirement for optimization { AbandonnedId = 0; return; } if (AbandonnedId != 0) { AbandonQuest(AbandonnedId); } AbandonnedId = 0; Point me = ObjectManager.ObjectManager.Me.Position; WoWUnit mNpc = ObjectManager.ObjectManager.GetNearestWoWUnit(ObjectManager.ObjectManager.GetWoWUnitByEntry(npc.Entry, true), false, ignoreBlacklist, true); // We have the NPC in memory and he is closer than the QuesterDB entry. (some Npc moves) if (mNpc.IsValid && mNpc.HasQuests) { npc.Position = mNpc.Position; } WoWGameObject mObj = ObjectManager.ObjectManager.GetNearestWoWGameObject(ObjectManager.ObjectManager.GetWoWGameObjectByEntry(npc.Entry), ignoreBlacklist); if (mObj.IsValid && mObj.HasQuests) { npc.Position = mObj.Position; } bool bypassTravel = false; if (me.DistanceTo(npc.Position) <= 800f) { PathFinder.FindPath(npc.Position, out bypassTravel); } if (Usefuls.IsFlying && npc.ContinentIdInt == Usefuls.ContinentId) { bypassTravel = true; } else if (Usefuls.IsFlying) { MountTask.DismountMount(); } 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 (!bypassTravel && (_travelLocation == null || _travelLocation.DistanceTo(me) > 0.1f) && !_travelDisabled) { MovementManager.StopMove(); Logging.Write("Calling travel system for PickUpQuest " + questName + "(" + questId + ") from " + npc.Name + " (" + npc.Entry + ")..."); Products.Products.TravelToContinentId = npc.ContinentIdInt; Products.Products.TravelTo = npc.Position; Products.Products.TravelFromContinentId = Usefuls.ContinentId; Products.Products.TravelFrom = me; Products.Products.ForceTravel = forceTravel; // Pass the check for valid destination as a lambda Products.Products.TargetValidationFct = IsNearQuestGiver; _travelLocation = Products.Products.TravelFrom; return; } if (_travelLocation != null && _travelLocation.DistanceTo(me) <= 0.1f) { _travelDisabled = true; } //Start target finding based on QuestGiver. uint baseAddress = MovementManager.FindTarget(ref npc, 4.5f, true, true, 0f, ignoreBlacklist); // can pick up quest on dead NPC. if (MovementManager.InMovement) { return; } _travelDisabled = false; // reset travel if (baseAddress > 0) { var tmpNpc = ObjectManager.ObjectManager.GetObjectByGuid(npc.Guid); if (tmpNpc is WoWUnit) { var unitTest = tmpNpc as WoWUnit; if (unitTest.IsValid && unitTest.GetDistance < 20f && !unitTest.HasQuests) { _travelDisabled = false; // reset travel nManagerSetting.AddBlackList(unitTest.Guid, 30000); Logging.Write("Npc QuestGiver " + unitTest.Name + " (" + unitTest.Entry + ", distance: " + unitTest.GetDistance + ") does not have any available quest for the moment. Blacklisting it for 30 seconds."); cancelPickUp = true; return; } } } //End target finding based on QuestGiver. if (mObj.IsValid && mObj.GetDistance <= 4.5f || npc.Position.DistanceTo2D(ObjectManager.ObjectManager.Me.Position) <= 4.5f && npc.Position.DistanceZ(ObjectManager.ObjectManager.Me.Position) < 6f || npc.Position.DistanceTo(ObjectManager.ObjectManager.Me.Position) <= 4.5f) { if (baseAddress <= 0) { cancelPickUp = true; // We are there but no NPC waiting for us. // This code is there for Mimesis and I'm not currently working on Quester, so I'm not going to "return;" there as quester will be even more lost. npc.Ignore(120000); return; } if (Usefuls.IsFlying) { MountTask.Land(); } InteractTarget(ref npc, baseAddress); Logging.Write("PickUpQuest " + questName + " (" + questId + ") from " + npc.Name + " (" + npc.Entry + ")"); int id = GetQuestID(); if (GetNumGossipAvailableQuests() == 0 && id == questId) { AcceptQuest(); Thread.Sleep(Usefuls.Latency + 500); } if (GetLogQuestId().Contains(questId)) { CloseWindow(); } else { bool systemWorks = GetGossipAvailableQuestsWorks(); if (systemWorks) // 2 quest gossip systems = 2 different codes :( { for (int i = 1; i <= GetNumGossipAvailableQuests(); i++) { SelectGossipAvailableQuest(i); Thread.Sleep(Usefuls.Latency + 500); id = GetQuestID(); if (id == 0) { systemWorks = false; break; } if (id == questId) { AcceptQuest(); Thread.Sleep(Usefuls.Latency + 500); id = GetQuestID(); CloseWindow(); if (id != questId) { AbandonQuest(id); } break; } CloseWindow(); Thread.Sleep(Usefuls.Latency + 500); AbandonQuest(id); Interact.InteractWith(baseAddress); Thread.Sleep(Usefuls.Latency + 500); } } if (!systemWorks) { int gossipid = 1; while (GetAvailableTitle(gossipid) != "") { SelectAvailableQuest(gossipid); Thread.Sleep(Usefuls.Latency + 500); id = GetQuestID(); if (id == questId) { AcceptQuest(); Thread.Sleep(Usefuls.Latency + 500); id = GetQuestID(); CloseWindow(); if (id != questId) { AbandonQuest(id); } break; } CloseWindow(); Thread.Sleep(Usefuls.Latency + 500); AbandonQuest(id); Interact.InteractWith(baseAddress); Thread.Sleep(Usefuls.Latency + 500); gossipid++; } } } KilledMobsToCount.Clear(); Thread.Sleep(Usefuls.Latency); } CloseWindow(); }