private static void RefreshSetKiting(ref Vector3 vKitePointAvoid, bool NeedToKite) { using (new PerformanceLogger("RefreshDiaObjectCache.Kiting")) { bool TryToKite = false; List <TrinityCacheObject> kiteMonsterList = new List <TrinityCacheObject>(); if (CurrentTarget != null && CurrentTarget.IsUnit) { switch (CombatBase.KiteMode) { case KiteMode.Never: break; case KiteMode.Elites: kiteMonsterList = (from m in ObjectCache where m.IsUnit && m.RadiusDistance > 0 && m.RadiusDistance <= CombatBase.KiteDistance && m.IsBossOrEliteRareUnique select m).ToList(); break; case KiteMode.Bosses: kiteMonsterList = (from m in ObjectCache where m.IsUnit && m.RadiusDistance > 0 && m.RadiusDistance <= CombatBase.KiteDistance && m.IsBoss select m).ToList(); break; case KiteMode.Always: kiteMonsterList = (from m in ObjectCache where m.IsUnit && m.Weight > 0 && m.RadiusDistance > 0 && m.RadiusDistance <= CombatBase.KiteDistance && (m.IsBossOrEliteRareUnique || ((m.HitPointsPct >= .15 || m.MonsterSize != MonsterSize.Swarm) && !m.IsBossOrEliteRareUnique)) select m).ToList(); break; } } if (kiteMonsterList.Any()) { TryToKite = true; vKitePointAvoid = Player.Position; } if (CombatBase.KiteDistance > 0 && kiteMonsterList.Count() > 0 && IsWizardShouldKite()) { TryToKite = true; vKitePointAvoid = Player.Position; } // Avoid Death if (Settings.Combat.Misc.AvoidDeath && Player.CurrentHealthPct <= CombatBase.EmergencyHealthPotionLimit && // health is lower than potion limit !SNOPowerUseTimer(SNOPower.DrinkHealthPotion) && // we can't use a potion anymore TargetUtil.AnyMobsInRange(90f, false)) { Logger.LogNormal("Attempting to avoid death!"); NeedToKite = true; kiteMonsterList = (from m in ObjectCache where m.IsUnit select m).ToList(); } // Note that if treasure goblin level is set to kamikaze, even avoidance moves are disabled to reach the goblin! bool shouldKamikazeTreasureGoblins = (!AnyTreasureGoblinsPresent || Settings.Combat.Misc.GoblinPriority <= GoblinPriority.Prioritize); double msCancelledEmergency = DateTime.UtcNow.Subtract(timeCancelledEmergencyMove).TotalMilliseconds; bool shouldEmergencyMove = msCancelledEmergency >= cancelledEmergencyMoveForMilliseconds && NeedToKite; double msCancelledKite = DateTime.UtcNow.Subtract(timeCancelledKiteMove).TotalMilliseconds; bool shouldKite = msCancelledKite >= cancelledKiteMoveForMilliseconds && TryToKite; if (shouldKamikazeTreasureGoblins && (shouldEmergencyMove || shouldKite)) { Vector3 vAnySafePoint = NavHelper.FindSafeZone(false, 1, vKitePointAvoid, true, kiteMonsterList, shouldEmergencyMove); if (LastKitePosition == null) { LastKitePosition = new KitePosition() { PositionFoundTime = DateTime.UtcNow, Position = vAnySafePoint, Distance = vAnySafePoint.Distance(Player.Position) }; } if (vAnySafePoint != Vector3.Zero && vAnySafePoint.Distance(Player.Position) >= 1) { if ((DateTime.UtcNow.Subtract(LastKitePosition.PositionFoundTime).TotalMilliseconds > 3000 && LastKitePosition.Position == vAnySafePoint) || (CurrentTarget != null && DateTime.UtcNow.Subtract(lastGlobalCooldownUse).TotalMilliseconds > 1500 && TryToKite)) { timeCancelledKiteMove = DateTime.UtcNow; cancelledKiteMoveForMilliseconds = 1500; Logger.Log(TrinityLogLevel.Debug, LogCategory.UserInformation, "Kite movement failed, cancelling for {0:0}ms", cancelledKiteMoveForMilliseconds); return; } else { LastKitePosition = new KitePosition() { PositionFoundTime = DateTime.UtcNow, Position = vAnySafePoint, Distance = vAnySafePoint.Distance(Player.Position) }; } if (Settings.Advanced.LogCategories.HasFlag(LogCategory.Movement)) { Logger.Log(TrinityLogLevel.Verbose, LogCategory.Movement, "Kiting to: {0} Distance: {1:0} Direction: {2:0}, Health%={3:0.00}, KiteDistance: {4:0}, Nearby Monsters: {5:0} NeedToKite: {6} TryToKite: {7}", vAnySafePoint, vAnySafePoint.Distance(Player.Position), MathUtil.GetHeading(MathUtil.FindDirectionDegree(Me.Position, vAnySafePoint)), Player.CurrentHealthPct, CombatBase.KiteDistance, kiteMonsterList.Count(), NeedToKite, TryToKite); } CurrentTarget = new TrinityCacheObject() { Position = vAnySafePoint, Type = TrinityObjectType.Avoidance, Weight = 90000, Distance = Vector3.Distance(Player.Position, vAnySafePoint), Radius = 2f, InternalName = "KitePoint" }; } } else if (!shouldEmergencyMove && NeedToKite) { Logger.Log(TrinityLogLevel.Debug, LogCategory.UserInformation, "Emergency movement cancelled for {0:0}ms", DateTime.UtcNow.Subtract(timeCancelledEmergencyMove).TotalMilliseconds - cancelledKiteMoveForMilliseconds); } else if (!shouldKite && TryToKite) { Logger.Log(TrinityLogLevel.Debug, LogCategory.UserInformation, "Kite movement cancelled for {0:0}ms", DateTime.UtcNow.Subtract(timeCancelledKiteMove).TotalMilliseconds - cancelledKiteMoveForMilliseconds); } } }
private static void RefreshSetKiting(ref Vector3 vKitePointAvoid, bool NeedToKite, ref bool TryToKite) { using (new PerformanceLogger("RefreshDiaObjectCache.Kiting")) { TryToKite = false; var monsterList = from m in GilesObjectCache where m.Type == GObjectType.Unit && m.Weight > 0 && m.RadiusDistance <= PlayerKiteDistance && (m.IsBossOrEliteRareUnique || ((m.HitPointsPct >= .15 || m.MonsterStyle != MonsterSize.Swarm) && !m.IsBossOrEliteRareUnique) ) select m; if (CurrentTarget != null && CurrentTarget.Type == GObjectType.Unit && PlayerKiteDistance > 0 && CurrentTarget.RadiusDistance <= PlayerKiteDistance) { TryToKite = true; vKitePointAvoid = PlayerStatus.CurrentPosition; } if (monsterList.Count() > 0 && (PlayerStatus.ActorClass != ActorClass.Wizard || IsWizardShouldKite())) { TryToKite = true; vKitePointAvoid = PlayerStatus.CurrentPosition; } // Note that if treasure goblin level is set to kamikaze, even avoidance moves are disabled to reach the goblin! bool shouldKamikazeTreasureGoblins = (!AnyTreasureGoblinsPresent || Settings.Combat.Misc.GoblinPriority <= GoblinPriority.Prioritize); double msCancelledEmergency = DateTime.Now.Subtract(timeCancelledEmergencyMove).TotalMilliseconds; bool shouldEmergencyMove = msCancelledEmergency >= cancelledEmergencyMoveForMilliseconds && NeedToKite; double msCancelledKite = DateTime.Now.Subtract(timeCancelledKiteMove).TotalMilliseconds; bool shouldKite = msCancelledKite >= cancelledKiteMoveForMilliseconds && TryToKite; if (shouldKamikazeTreasureGoblins && (shouldEmergencyMove || shouldKite)) { Vector3 vAnySafePoint = NavHelper.FindSafeZone(false, 1, vKitePointAvoid, true, monsterList); if (LastKitePosition == null) { LastKitePosition = new KitePosition() { PositionFoundTime = DateTime.Now, Position = vAnySafePoint, Distance = vAnySafePoint.Distance(PlayerStatus.CurrentPosition) }; } if (vAnySafePoint != Vector3.Zero && vAnySafePoint.Distance(PlayerStatus.CurrentPosition) >= 1) { if ((DateTime.Now.Subtract(LastKitePosition.PositionFoundTime).TotalMilliseconds > 3000 && LastKitePosition.Position == vAnySafePoint) || (CurrentTarget != null && DateTime.Now.Subtract(lastGlobalCooldownUse).TotalMilliseconds > 1500 && TryToKite)) { timeCancelledKiteMove = DateTime.Now; cancelledKiteMoveForMilliseconds = 1500; DbHelper.Log(TrinityLogLevel.Verbose, LogCategory.Movement, "Kite movement failed, cancelling for {0:0}ms", cancelledKiteMoveForMilliseconds); return; } else { LastKitePosition = new KitePosition() { PositionFoundTime = DateTime.Now, Position = vAnySafePoint, Distance = vAnySafePoint.Distance(PlayerStatus.CurrentPosition) }; } if (Settings.Advanced.LogCategories.HasFlag(LogCategory.Movement)) { DbHelper.Log(TrinityLogLevel.Verbose, LogCategory.Movement, "Kiting to: {0} Distance: {1:0} Direction: {2:0}, Health%={3:0.00}, KiteDistance: {4:0}, Nearby Monsters: {5:0} NeedToKite: {6} TryToKite: {7}", vAnySafePoint, vAnySafePoint.Distance(PlayerStatus.CurrentPosition), MathUtil.GetHeading(MathUtil.FindDirectionDegree(Me.Position, vAnySafePoint)), PlayerStatus.CurrentHealthPct, PlayerKiteDistance, monsterList.Count(), NeedToKite, TryToKite); } CurrentTarget = new GilesObject() { Position = vAnySafePoint, Type = GObjectType.Avoidance, Weight = 90000, CentreDistance = Vector3.Distance(PlayerStatus.CurrentPosition, vAnySafePoint), RadiusDistance = Vector3.Distance(PlayerStatus.CurrentPosition, vAnySafePoint), InternalName = "KitePoint" }; //timeCancelledKiteMove = DateTime.Now; //cancelledKiteMoveForMilliseconds = 100; // Try forcing a target update with each kiting //bForceTargetUpdate = true; } //else //{ // // Didn't find any kiting we could reach, so don't look for any more kite spots for at least 1.5 seconds // timeCancelledKiteMove = DateTime.Now; // cancelledKiteMoveForMilliseconds = 500; //} } else if (!shouldEmergencyMove && NeedToKite) { DbHelper.Log(TrinityLogLevel.Verbose, LogCategory.Movement, "Emergency movement cancelled for {0:0}ms", DateTime.Now.Subtract(timeCancelledEmergencyMove).TotalMilliseconds - cancelledKiteMoveForMilliseconds); } else if (!shouldKite && TryToKite) { DbHelper.Log(TrinityLogLevel.Verbose, LogCategory.Movement, "Kite movement cancelled for {0:0}ms", DateTime.Now.Subtract(timeCancelledKiteMove).TotalMilliseconds - cancelledKiteMoveForMilliseconds); } } }
private static void RefreshSetKiting(ref Vector3 vKitePointAvoid, bool NeedToKite) { using (new PerformanceLogger("RefreshDiaObjectCache.Kiting")) { bool TryToKite = false; List<TrinityCacheObject> kiteMonsterList = new List<TrinityCacheObject>(); if (CurrentTarget != null && CurrentTarget.IsUnit) { switch (CombatBase.KiteMode) { case KiteMode.Never: break; case KiteMode.Elites: kiteMonsterList = (from m in ObjectCache where m.IsUnit && m.RadiusDistance > 0 && m.RadiusDistance <= CombatBase.KiteDistance && m.IsBossOrEliteRareUnique select m).ToList(); break; case KiteMode.Bosses: kiteMonsterList = (from m in ObjectCache where m.IsUnit && m.RadiusDistance > 0 && m.RadiusDistance <= CombatBase.KiteDistance && m.IsBoss select m).ToList(); break; case KiteMode.Always: kiteMonsterList = (from m in ObjectCache where m.IsUnit && m.Weight > 0 && m.RadiusDistance > 0 && m.RadiusDistance <= CombatBase.KiteDistance && (m.IsBossOrEliteRareUnique || ((m.HitPointsPct >= .15 || m.MonsterSize != MonsterSize.Swarm) && !m.IsBossOrEliteRareUnique)) select m).ToList(); break; } } if (kiteMonsterList.Any()) { TryToKite = true; vKitePointAvoid = Player.Position; } if (CombatBase.KiteDistance > 0 && kiteMonsterList.Count() > 0 && IsWizardShouldKite()) { TryToKite = true; vKitePointAvoid = Player.Position; } // Avoid Death if (Settings.Combat.Misc.AvoidDeath && Player.CurrentHealthPct <= CombatBase.EmergencyHealthPotionLimit && // health is lower than potion limit !SNOPowerUseTimer(SNOPower.DrinkHealthPotion) && // we can't use a potion anymore TargetUtil.AnyMobsInRange(90f, false)) { Logger.LogNormal("Attempting to avoid death!"); NeedToKite = true; kiteMonsterList = (from m in ObjectCache where m.IsUnit select m).ToList(); } // Note that if treasure goblin level is set to kamikaze, even avoidance moves are disabled to reach the goblin! bool shouldKamikazeTreasureGoblins = (!AnyTreasureGoblinsPresent || Settings.Combat.Misc.GoblinPriority <= GoblinPriority.Prioritize); double msCancelledEmergency = DateTime.UtcNow.Subtract(timeCancelledEmergencyMove).TotalMilliseconds; bool shouldEmergencyMove = msCancelledEmergency >= cancelledEmergencyMoveForMilliseconds && NeedToKite; double msCancelledKite = DateTime.UtcNow.Subtract(timeCancelledKiteMove).TotalMilliseconds; bool shouldKite = msCancelledKite >= cancelledKiteMoveForMilliseconds && TryToKite; if (shouldKamikazeTreasureGoblins && (shouldEmergencyMove || shouldKite)) { Vector3 vAnySafePoint = NavHelper.FindSafeZone(false, 1, vKitePointAvoid, true, kiteMonsterList, shouldEmergencyMove); if (LastKitePosition == null) { LastKitePosition = new KitePosition() { PositionFoundTime = DateTime.UtcNow, Position = vAnySafePoint, Distance = vAnySafePoint.Distance(Player.Position) }; } if (vAnySafePoint != Vector3.Zero && vAnySafePoint.Distance(Player.Position) >= 1) { if ((DateTime.UtcNow.Subtract(LastKitePosition.PositionFoundTime).TotalMilliseconds > 3000 && LastKitePosition.Position == vAnySafePoint) || (CurrentTarget != null && DateTime.UtcNow.Subtract(lastGlobalCooldownUse).TotalMilliseconds > 1500 && TryToKite)) { timeCancelledKiteMove = DateTime.UtcNow; cancelledKiteMoveForMilliseconds = 1500; Logger.Log(TrinityLogLevel.Debug, LogCategory.UserInformation, "Kite movement failed, cancelling for {0:0}ms", cancelledKiteMoveForMilliseconds); return; } else { LastKitePosition = new KitePosition() { PositionFoundTime = DateTime.UtcNow, Position = vAnySafePoint, Distance = vAnySafePoint.Distance(Player.Position) }; } if (Settings.Advanced.LogCategories.HasFlag(LogCategory.Movement)) { Logger.Log(TrinityLogLevel.Verbose, LogCategory.Movement, "Kiting to: {0} Distance: {1:0} Direction: {2:0}, Health%={3:0.00}, KiteDistance: {4:0}, Nearby Monsters: {5:0} NeedToKite: {6} TryToKite: {7}", vAnySafePoint, vAnySafePoint.Distance(Player.Position), MathUtil.GetHeading(MathUtil.FindDirectionDegree(Me.Position, vAnySafePoint)), Player.CurrentHealthPct, CombatBase.KiteDistance, kiteMonsterList.Count(), NeedToKite, TryToKite); } CurrentTarget = new TrinityCacheObject() { Position = vAnySafePoint, Type = TrinityObjectType.Avoidance, Weight = 90000, Distance = Vector3.Distance(Player.Position, vAnySafePoint), Radius = 2f, InternalName = "KitePoint" }; } } else if (!shouldEmergencyMove && NeedToKite) { Logger.Log(TrinityLogLevel.Debug, LogCategory.UserInformation, "Emergency movement cancelled for {0:0}ms", DateTime.UtcNow.Subtract(timeCancelledEmergencyMove).TotalMilliseconds - cancelledKiteMoveForMilliseconds); } else if (!shouldKite && TryToKite) { Logger.Log(TrinityLogLevel.Debug, LogCategory.UserInformation, "Kite movement cancelled for {0:0}ms", DateTime.UtcNow.Subtract(timeCancelledKiteMove).TotalMilliseconds - cancelledKiteMoveForMilliseconds); } } }