public static void ResetEverythingNewGame() { hashUseOnceID = new HashSet <int>(); dictUseOnceID = new Dictionary <int, int>(); iMaxDeathsAllowed = 0; iDeathsThisRun = 0; _hashsetItemStatsLookedAt = new HashSet <string>(); _hashsetItemPicksLookedAt = new HashSet <string>(); _hashsetItemFollowersIgnored = new HashSet <string>(); TownRun._dictItemStashAttempted = new Dictionary <int, int>(); hashRGUIDBlacklist60 = new HashSet <int>(); hashRGUIDBlacklist90 = new HashSet <int>(); hashRGUIDBlacklist15 = new HashSet <int>(); vBacktrackList = new SortedList <int, Vector3>(); iTotalBacktracks = 0; HasMappedPlayerAbilities = false; PlayerMover.iTotalAntiStuckAttempts = 1; PlayerMover.vSafeMovementLocation = Vector3.Zero; PlayerMover.vOldPosition = Vector3.Zero; PlayerMover.iTimesReachedStuckPoint = 0; PlayerMover.TimeLastRecordedPosition = DateTime.Today; PlayerMover.LastGeneratedStuckPosition = DateTime.Today; PlayerMover.iTimesReachedMaxUnstucks = 0; PlayerMover.iCancelUnstuckerForSeconds = 0; PlayerMover._lastCancelledUnstucker = DateTime.Today; NavHelper.UsedStuckSpots = new List <GridPoint>(); // Reset all the caches dictGilesObjectTypeCache = new Dictionary <int, GObjectType>(); dictGilesMonsterAffixCache = new Dictionary <int, MonsterAffixes>(); dictGilesMaxHealthCache = new Dictionary <int, double>(); dictGilesLastHealthCache = new Dictionary <int, double>(); dictGilesLastHealthChecked = new Dictionary <int, int>(); dictGilesBurrowedCache = new Dictionary <int, bool>(); dictGilesActorSNOCache = new Dictionary <int, int>(); dictGilesACDGUIDCache = new Dictionary <int, int>(); dictGilesInternalNameCache = new Dictionary <int, string>(); dictGilesGameBalanceIDCache = new Dictionary <int, int>(); dictGilesDynamicIDCache = new Dictionary <int, int>(); dictGilesVectorCache = new Dictionary <int, Vector3>(); dictGilesGoldAmountCache = new Dictionary <int, int>(); dictGilesQualityCache = new Dictionary <int, ItemQuality>(); dictGilesPickupItem = new Dictionary <int, bool>(); dictSummonedByID = new Dictionary <int, int>(); dictTotalInteractionAttempts = new Dictionary <int, int>(); listProfilesLoaded = new List <string>(); CurrentProfile = ""; FirstProfile = ""; NavHelper.UpdateSearchGridProvider(); GoldInactivity.ResetCheckGold(); global::GilesTrinity.XmlTags.TrinityLoadOnce.UsedProfiles = new List <string>(); GenericCache.ClearCache(); GenericBlacklist.ClearBlacklist(); }
// Pause Button private static void buttonPause_Click(object sender, RoutedEventArgs e) { if (bMainBotPaused) { btnPauseBot.Content = "Pause Bot"; bMainBotPaused = false; HasMappedPlayerAbilities = false; IsAlreadyMoving = false; lastMovementCommand = DateTime.Today; } else { BotMain.PauseWhile(BotIsPaused); btnPauseBot.Content = "Unpause Bot"; bMainBotPaused = true; } GoldInactivity.ResetCheckGold(); }
/// <summary> /// Find fresh targets, start main BehaviorTree if needed, cast any buffs needed etc. /// </summary> /// <param name="ret"></param> /// <returns></returns> internal static bool CheckHasTarget(object ret) { using (new PerformanceLogger("Trinity.CheckHasTarget")) { // If we aren't in the game or a world is loading, don't do anything yet if (!ZetaDia.IsInGame || !ZetaDia.Me.IsValid || ZetaDia.IsLoadingWorld) { return(false); } if (ZetaDia.Me.IsDead) { GoldInactivity.ResetCheckGold(); } else if (GoldInactivity.GoldInactive()) { BotMain.PauseWhile(GoldInactivity.GoldInactiveLeaveGame); return(false); } if (lastWorldId != PlayerStatus.WorldID) { ISearchAreaProvider mgp = Navigator.SearchGridProvider; } if (!HotbarRefreshTimer.IsRunning) { HotbarRefreshTimer.Start(); } if (!HasMappedPlayerAbilities || HotbarRefreshTimer.ElapsedMilliseconds > 10000 || ShouldRefreshHotbarAbilities) { // Update the cached player's cache ActorClass tempClass = ActorClass.Invalid; try { tempClass = PlayerStatus.ActorClass; } catch { DbHelper.Log(TrinityLogLevel.Verbose, LogCategory.GlobalHandler, "Safely handled exception trying to get character class."); } GilesPlayerCache.RefreshHotbar(); dictAbilityRepeatDelay = new Dictionary <SNOPower, int>(dictAbilityRepeatDefaults); if (ZetaDia.CPlayer.PassiveSkills.Contains(SNOPower.Wizard_Passive_CriticalMass) && PlayerStatus.ActorClass == ActorClass.Wizard) { dictAbilityRepeatDelay[SNOPower.Wizard_FrostNova] = 25; dictAbilityRepeatDelay[SNOPower.Wizard_ExplosiveBlast] = 25; dictAbilityRepeatDelay[SNOPower.Wizard_DiamondSkin] = 100; dictAbilityRepeatDelay[SNOPower.Wizard_SlowTime] = 6000; dictAbilityRepeatDelay[SNOPower.Wizard_WaveOfForce] = 1500; dictAbilityRepeatDelay[SNOPower.Wizard_MirrorImage] = 1500; dictAbilityRepeatDelay[SNOPower.Wizard_Archon_ArcaneBlast] = 1500; dictAbilityRepeatDelay[SNOPower.Wizard_Teleport] = 2700; dictAbilityRepeatDelay[SNOPower.Wizard_Archon_SlowTime] = 1500; dictAbilityRepeatDelay[SNOPower.Wizard_Archon_Teleport] = 2700; } if (PlayerStatus.ActorClass == ActorClass.WitchDoctor && ZetaDia.CPlayer.PassiveSkills.Contains(SNOPower.Witchdoctor_Passive_GraveInjustice)) { dictAbilityRepeatDelay[SNOPower.Witchdoctor_SoulHarvest] = 1000; dictAbilityRepeatDelay[SNOPower.Witchdoctor_SpiritWalk] = 1000; dictAbilityRepeatDelay[SNOPower.Witchdoctor_Horrify] = 1000; dictAbilityRepeatDelay[SNOPower.Witchdoctor_Gargantuan] = 20000; dictAbilityRepeatDelay[SNOPower.Witchdoctor_SummonZombieDog] = 20000; dictAbilityRepeatDelay[SNOPower.Witchdoctor_GraspOfTheDead] = 500; dictAbilityRepeatDelay[SNOPower.Witchdoctor_SpiritBarrage] = 2000; dictAbilityRepeatDelay[SNOPower.Witchdoctor_Locust_Swarm] = 2000; dictAbilityRepeatDelay[SNOPower.Witchdoctor_Haunt] = 2000; dictAbilityRepeatDelay[SNOPower.Witchdoctor_Hex] = 3000; dictAbilityRepeatDelay[SNOPower.Witchdoctor_MassConfusion] = 15000; dictAbilityRepeatDelay[SNOPower.Witchdoctor_FetishArmy] = 20000; dictAbilityRepeatDelay[SNOPower.Witchdoctor_BigBadVoodoo] = 20000; } if (PlayerStatus.ActorClass == ActorClass.Barbarian && ZetaDia.CPlayer.PassiveSkills.Contains(SNOPower.Barbarian_Passive_BoonOfBulKathos)) { dictAbilityRepeatDelay[SNOPower.Barbarian_Earthquake] = 90500; dictAbilityRepeatDelay[SNOPower.Barbarian_CallOfTheAncients] = 90500; dictAbilityRepeatDelay[SNOPower.Barbarian_WrathOfTheBerserker] = 90500; } // Pick an appropriate health set etc. based on class switch (PlayerStatus.ActorClass) { case ActorClass.Barbarian: // What health % should we use a potion, or look for a globe PlayerEmergencyHealthPotionLimit = Settings.Combat.Barbarian.PotionLevel; PlayerEmergencyHealthGlobeLimit = Settings.Combat.Barbarian.HealthGlobeLevel; PlayerKiteDistance = Settings.Combat.Barbarian.KiteLimit; break; case ActorClass.Monk: // What health % should we use a potion, or look for a globe PlayerEmergencyHealthPotionLimit = Settings.Combat.Monk.PotionLevel; PlayerEmergencyHealthGlobeLimit = Settings.Combat.Monk.HealthGlobeLevel; // Monks never kite :) PlayerKiteDistance = 0; break; case ActorClass.Wizard: // What health % should we use a potion, or look for a globe PlayerEmergencyHealthPotionLimit = Settings.Combat.Wizard.PotionLevel; PlayerEmergencyHealthGlobeLimit = Settings.Combat.Wizard.HealthGlobeLevel; PlayerKiteDistance = Settings.Combat.Wizard.KiteLimit; break; case ActorClass.WitchDoctor: // What health % should we use a potion, or look for a globe PlayerEmergencyHealthPotionLimit = Settings.Combat.WitchDoctor.PotionLevel; PlayerEmergencyHealthGlobeLimit = Settings.Combat.WitchDoctor.HealthGlobeLevel; PlayerKiteDistance = Settings.Combat.WitchDoctor.KiteLimit; break; case ActorClass.DemonHunter: // What health % should we use a potion, or look for a globe PlayerEmergencyHealthPotionLimit = Settings.Combat.DemonHunter.PotionLevel; PlayerEmergencyHealthGlobeLimit = Settings.Combat.DemonHunter.HealthGlobeLevel; PlayerKiteDistance = Settings.Combat.DemonHunter.KiteLimit; break; } } // Clear target current and reset key variables used during the target-handling function //CurrentTarget = null; bDontMoveMeIAmDoingShit = false; TimesBlockedMoving = 0; IsAlreadyMoving = false; lastMovementCommand = DateTime.Today; IsWaitingForPower = false; IsWaitingAfterPower = false; IsWaitingForPotion = false; wasRootedLastTick = false; ClearBlacklists(); using (new PerformanceLogger("CheckHasTarget.RefreshCache")) { // Refresh Cache if needed bool CacheWasRefreshed = RefreshDiaObjectCache(); } // We have a target, start the target handler! if (CurrentTarget != null) { IsWholeNewTarget = true; bDontMoveMeIAmDoingShit = true; ShouldPickNewAbilities = true; return(true); } //Monk_MaintainTempestRush(); // Pop a potion when necessary if (PlayerStatus.CurrentHealthPct <= PlayerEmergencyHealthPotionLimit) { if (!PlayerStatus.IsIncapacitated && GilesUseTimer(SNOPower.DrinkHealthPotion)) { ACDItem thisBestPotion = ZetaDia.Me.Inventory.Backpack.Where(i => i.IsPotion).OrderByDescending(p => p.HitpointsGranted).ThenBy(p => p.ItemStackQuantity).FirstOrDefault(); if (thisBestPotion != null) { WaitWhileAnimating(4, true); ZetaDia.Me.Inventory.UseItem((thisBestPotion.DynamicId)); } dictAbilityLastUse[SNOPower.DrinkHealthPotion] = DateTime.Now; WaitWhileAnimating(3, true); } } sStatusText = "[Trinity] No more targets - DemonBuddy/profile management is now in control"; if (Settings.Advanced.DebugInStatusBar && bResetStatusText) { bResetStatusText = false; BotMain.StatusText = sStatusText; } // Nothing to do... do we have some maintenance we can do instead, like out of combat buffing? if (DateTime.Now.Subtract(lastMaintenanceCheck).TotalMilliseconds > 150) { lastMaintenanceCheck = DateTime.Now; // Out of combat buffing etc. but only if we don't want to return to town etc. ACDAnimationInfo myAnimationState = ZetaDia.Me.CommonData.AnimationInfo; if (!PlayerStatus.IsInTown && !IsReadyToTownRun && !ForceVendorRunASAP && myAnimationState != null && myAnimationState.State != AnimationState.Attacking && myAnimationState.State != AnimationState.Casting && myAnimationState.State != AnimationState.Channeling) { bDontSpamOutofCombat = false; powerBuff = AbilitySelector(false, true, false); if (powerBuff.SNOPower != SNOPower.None) { WaitWhileAnimating(4, true); DbHelper.Log(TrinityLogLevel.Verbose, LogCategory.Behavior, "Using OOC Buff: {0}", powerBuff.SNOPower.ToString()); if (powerBuff.WaitTicksBeforeUse > 0) { BotMain.PauseFor(new TimeSpan(0, 0, 0, 0, (int)powerBuff.WaitBeforeUseDelay)); } ZetaDia.Me.UsePower(powerBuff.SNOPower, powerBuff.TargetPosition, powerBuff.TargetDynamicWorldId, powerBuff.TargetRActorGUID); LastPowerUsed = powerBuff.SNOPower; dictAbilityLastUse[powerBuff.SNOPower] = DateTime.Now; if (powerBuff.WaitTicksAfterUse > 0) { BotMain.PauseFor(new TimeSpan(0, 0, 0, 0, (int)powerBuff.WaitAfterUseDelay)); } WaitWhileAnimating(3, true); } } else if (myAnimationState != null) { // Check if we are portalling to town, if so increase our kill radius temporarily switch (myAnimationState.Current) { case SNOAnim.barbarian_male_HTH_Recall_Channel_01: case SNOAnim.Barbarian_Female_HTH_Recall_Channel_01: case SNOAnim.Monk_Male_recall_channel: case SNOAnim.Monk_Female_recall_channel: case SNOAnim.WitchDoctor_Male_recall_channel: case SNOAnim.WitchDoctor_Female_recall_channel: case SNOAnim.Wizard_Male_HTH_recall_channel: case SNOAnim.Wizard_Female_HTH_recall_channel: case SNOAnim.Demonhunter_Male_HTH_recall_channel: case SNOAnim.Demonhunter_Female_HTH_recall_channel: iKeepKillRadiusExtendedFor = 20; timeKeepKillRadiusExtendedUntil = DateTime.Now.AddSeconds(iKeepKillRadiusExtendedFor); break; } } } CurrentTarget = null; if ((GilesTrinity.ForceVendorRunASAP || GilesTrinity.IsReadyToTownRun) && TownRun.TownRunTimerRunning()) { DbHelper.Log(TrinityLogLevel.Normal, LogCategory.UserInformation, "Waiting for town run timer", true); return(true); } // Ok let DemonBuddy do stuff this loop, since we're done for the moment //DbHelper.Log(TrinityLogLevel.Verbose, LogCategory.GlobalHandler, sStatusText); return(false); } }
/// <summary> /// This is wired up by Plugin.OnEnabled, and called when the bot is started /// </summary> /// <param name="bot"></param> private static void TrinityBotStart(IBot bot) { // Recording of all the XML's in use this run try { string sThisProfile = Zeta.CommonBot.Settings.GlobalSettings.Instance.LastProfile; if (sThisProfile != CurrentProfile) { listProfilesLoaded.Add(sThisProfile); CurrentProfile = sThisProfile; if (FirstProfile == "") { FirstProfile = sThisProfile; } } } catch { } // Update actors if possible (if already in-game) if (ZetaDia.IsInGame && !ZetaDia.IsLoadingWorld && ZetaDia.Actors != null) { ZetaDia.Actors.Update(); NavHelper.UpdateSearchGridProvider(true); } HasMappedPlayerAbilities = false; if (!bMaintainStatTracking) { ItemStatsWhenStartedBot = DateTime.Now; ItemStatsLastPostedReport = DateTime.Now; bMaintainStatTracking = true; } else { DbHelper.Log(TrinityLogLevel.Normal, LogCategory.UserInformation, "Note: Maintaining item stats from previous run. To reset stats fully, please restart DB."); } UsedProfileManager.RefreshProfileBlacklists(); ReplaceTreeHooks(); PlayerMover.TimeLastRecordedPosition = DateTime.Now; PlayerMover.timeLastRestartedGame = DateTime.Now; GoldInactivity.ResetCheckGold(); if (Zeta.CommonBot.Settings.CharacterSettings.Instance.KillRadius < 20) { DbHelper.Log(TrinityLogLevel.Normal, LogCategory.UserInformation, "WARNING: Low Kill Radius detected, currently set to: {0} (you can change this through Demonbuddy bot settings)", Zeta.CommonBot.Settings.CharacterSettings.Instance.KillRadius); } if (Zeta.CommonBot.Settings.CharacterSettings.Instance.LootRadius < 50) { DbHelper.Log(TrinityLogLevel.Normal, LogCategory.UserInformation, "WARNING: Low Gold Loot Radius detected, currently set to: {0} (you can change this through Demonbuddy bot settings)", Zeta.CommonBot.Settings.CharacterSettings.Instance.LootRadius); } if (StashRule == null) { StashRule = new ItemRules.Interpreter(); } StashRule.readConfiguration(); }