public static Composite TownRunWrapper(Composite original) { return (new Sequence( original, new Action(delegate { if (!BrainBehavior.IsVendoring) { Logger.Log("TownRun complete"); Trinity.IsReadyToTownRun = false; Trinity.ForceVendorRunASAP = false; TownRunCheckTimer.Reset(); SendEmailNotification(); SendMobileNotifications(); } return RunStatus.Success; }) )); }
/// <summary> /// TownRunCheckOverlord - determine if we should do a town-run or not /// </summary> /// <param name="ret"></param> /// <returns></returns> internal static bool TownRunCanRun(object ret) { try { using (new PerformanceLogger("TownRunOverlord")) { if (ZetaDia.Me == null || !ZetaDia.Me.IsValid) { return(false); } Trinity.IsReadyToTownRun = false; if (Trinity.Player.IsDead) { return(false); } var a5hubMaxRangePoint = new Vector3(441.0972f, 519.0328f, 7.718145f); var a5waypoint = new Vector3(556.9158f, 524.3738f, 2.796464f); var a5hubRange = a5waypoint.Distance2D(a5hubMaxRangePoint); if (Trinity.Player.LevelAreaId == 270011 && Trinity.Player.Position.Distance2D(a5waypoint) >= a5hubRange) { return(false); } // Check if we should be forcing a town-run if (!Trinity.Player.IsInTown && Trinity.ForceVendorRunASAP || BrainBehavior.IsVendoring) { if (!LastTownRunCheckResult) { if (BrainBehavior.IsVendoring) { Logger.Log(TrinityLogLevel.Info, LogCategory.UserInformation, "Looks like we are being asked to force a town-run by a profile/plugin/new DB feature, now doing so."); } } SetPreTownRunPosition(); Trinity.IsReadyToTownRun = true; } // Time safety switch for more advanced town-run checking to prevent CPU spam if (DateTime.UtcNow.Subtract(LastCheckBackpackDurability).TotalSeconds > 6) { LastCheckBackpackDurability = DateTime.UtcNow; // Check for no space in backpack Vector2 validLocation = TrinityItemManager.FindValidBackpackLocation(true); if (validLocation.X < 0 || validLocation.Y < 0) { Logger.Log(TrinityLogLevel.Info, LogCategory.UserInformation, "No more space to pickup a 2-slot item, now running town-run routine. (TownRun)"); if (!LastTownRunCheckResult) { LastTownRunCheckResult = true; } Trinity.IsReadyToTownRun = true; Trinity.ForceVendorRunASAP = true; // Record the first position when we run out of bag space, so we can return later SetPreTownRunPosition(); } if (ZetaDia.Me.IsValid) { var equippedItems = ZetaDia.Me.Inventory.Equipped.Where(i => i.DurabilityCurrent != i.DurabilityMax).ToList(); if (equippedItems.Any()) { double min = equippedItems.Min(i => i.DurabilityPercent); float threshold = Trinity.Player.IsInTown ? 0.50f : Zeta.Bot.Settings.CharacterSettings.Instance.RepairWhenDurabilityBelow; bool needsRepair = min <= threshold; if (needsRepair) { Logger.Log(TrinityLogLevel.Info, LogCategory.UserInformation, "Items may need repair, now running town-run routine."); Trinity.IsReadyToTownRun = true; Trinity.ForceVendorRunASAP = true; SetPreTownRunPosition(); } } } } if (ErrorDialog.IsVisible) { Trinity.IsReadyToTownRun = false; } LastTownRunCheckResult = Trinity.IsReadyToTownRun; // Clear blacklists to triple check any potential targets if (Trinity.IsReadyToTownRun) { Trinity.Blacklist3Seconds = new HashSet <int>(); Trinity.Blacklist15Seconds = new HashSet <int>(); Trinity.Blacklist60Seconds = new HashSet <int>(); Trinity.Blacklist90Seconds = new HashSet <int>(); } // Fix for A1 new game with bags full if (Trinity.Player.LevelAreaId == 19947 && ZetaDia.CurrentQuest.QuestSNO == 87700 && (ZetaDia.CurrentQuest.StepId == -1 || ZetaDia.CurrentQuest.StepId == 42)) { Logger.Log(TrinityLogLevel.Verbose, LogCategory.UserInformation, "Can't townrun with the current quest!"); Trinity.IsReadyToTownRun = false; } if (Trinity.IsReadyToTownRun && !(BrainBehavior.IsVendoring || Trinity.Player.IsInTown)) { string cantUseTPreason; if (!ZetaDia.Me.CanUseTownPortal(out cantUseTPreason) && !ZetaDia.IsInTown) { Logger.Log(TrinityLogLevel.Verbose, LogCategory.UserInformation, "It appears we need to town run but can't: {0}", cantUseTPreason); Trinity.IsReadyToTownRun = false; } } if (Trinity.IsReadyToTownRun && DataDictionary.BossLevelAreaIDs.Contains(Trinity.Player.LevelAreaId)) { Logger.Log(TrinityLogLevel.Debug, LogCategory.GlobalHandler, "Unable to Town Portal - Boss Area!"); return(false); } if (Trinity.IsReadyToTownRun && ZetaDia.IsInTown && DbProvider.DeathHandler.EquipmentNeedsEmergencyRepair()) { Logger.Log(TrinityLogLevel.Debug, LogCategory.GlobalHandler, "EquipmentNeedsEmergencyRepair!"); return(true); } if (Trinity.IsReadyToTownRun && Trinity.CurrentTarget != null) { TownRunCheckTimer.Restart(); Logger.Log(TrinityLogLevel.Debug, LogCategory.GlobalHandler, "Restarting TownRunCheckTimer, we have a target!"); return(false); } if (Trinity.IsReadyToTownRun && DataDictionary.NeverTownPortalLevelAreaIds.Contains(Trinity.Player.LevelAreaId)) { Logger.Log(TrinityLogLevel.Debug, LogCategory.GlobalHandler, "Unable to Town Portal in this area!"); return(false); } if (Trinity.IsReadyToTownRun && (TownRunTimerFinished() || BrainBehavior.IsVendoring)) { //Logger.Log(TrinityLogLevel.Verbose, LogCategory.UserInformation, "Town run timer finished {0} or in town {1} or is vendoring {2} (TownRun)", // TownRunTimerFinished(), Trinity.Player.IsInTown, BrainBehavior.IsVendoring); Trinity.IsReadyToTownRun = false; return(true); } if (Trinity.IsReadyToTownRun && !TownRunCheckTimer.IsRunning) { Logger.Log(TrinityLogLevel.Verbose, LogCategory.UserInformation, "Starting town run timer"); TownRunCheckTimer.Start(); _loggedAnythingThisStash = false; _loggedJunkThisStash = false; } return(false); } } catch (Exception ex) { Logger.LogError("Error Getting TownRun {0}", ex.Message); return(false); } }