diff --git a/Source/Framework/Constants/SharedConst.cs b/Source/Framework/Constants/SharedConst.cs
index 72ccaf81a..7f1f36408 100644
--- a/Source/Framework/Constants/SharedConst.cs
+++ b/Source/Framework/Constants/SharedConst.cs
@@ -933,11 +933,11 @@ namespace Framework.Constants
public enum DifficultyFlags : ushort
{
- Heroic = 0x01,
+ HeroicStyleLockouts = 0x01,
Default = 0x02,
CanSelect = 0x04, // Player can select this difficulty in dropdown menu
- ChallengeMode = 0x08,
-
+ //ChallengeMode = 0x08, // deprecated since Legion expansion
+ LfgOnly = 0x10,
Legacy = 0x20,
DisplayHeroic = 0x40, // Controls icon displayed on minimap when inside the instance
DisplayMythic = 0x80 // Controls icon displayed on minimap when inside the instance
diff --git a/Source/Game/AI/ScriptedAI/ScriptedAI.cs b/Source/Game/AI/ScriptedAI/ScriptedAI.cs
index e9156cde6..69ed8b31c 100644
--- a/Source/Game/AI/ScriptedAI/ScriptedAI.cs
+++ b/Source/Game/AI/ScriptedAI/ScriptedAI.cs
@@ -16,12 +16,10 @@ namespace Game.AI
{
Difficulty _difficulty;
bool _isCombatMovementAllowed;
- bool _isHeroic;
public ScriptedAI(Creature creature) : base(creature)
{
_isCombatMovementAllowed = true;
- _isHeroic = me.GetMap().IsHeroic();
_difficulty = me.GetMap().GetDifficultyID();
}
@@ -109,7 +107,7 @@ namespace Game.AI
///
public void AddThreat(Unit victim, float amount, Unit who = null)
{
- if (victim == null)
+ if (victim == null)
return;
if (who == null)
@@ -126,7 +124,7 @@ namespace Game.AI
///
public void ModifyThreatByPercent(Unit victim, int pct, Unit who = null)
{
- if (victim == null)
+ if (victim == null)
return;
if (who == null)
@@ -142,7 +140,7 @@ namespace Game.AI
///
public void ResetThreat(Unit victim, Unit who)
{
- if (victim == null)
+ if (victim == null)
return;
if (who == null)
@@ -171,7 +169,7 @@ namespace Game.AI
///
public float GetThreat(Unit victim, Unit who = null)
{
- if (victim == null)
+ if (victim == null)
return 0.0f;
if (who == null)
@@ -306,10 +304,10 @@ namespace Game.AI
break;
}
}
-
+
if (!hasPower)
continue;
-
+
//Check if the spell meets our range requirements
if (rangeMin != 0 && me.GetSpellMinRangeForTarget(target, tempSpell) < rangeMin)
continue;
@@ -449,23 +447,52 @@ namespace Game.AI
{
return source.FindNearestCreatureWithOptions(maxSearchRange, options);
}
-
+
public static GameObject GetClosestGameObjectWithEntry(WorldObject source, uint entry, float maxSearchRange, bool spawnedOnly = true)
{
return source.FindNearestGameObject(entry, maxSearchRange, spawnedOnly);
}
public bool HealthBelowPct(int pct) { return me.HealthBelowPct(pct); }
+
public bool HealthAbovePct(int pct) { return me.HealthAbovePct(pct); }
- public bool IsCombatMovementAllowed() { return _isCombatMovementAllowed; }
+ public bool IsLFR()
+ {
+ return me.GetMap().IsLFR();
+ }
- // return true for heroic mode. i.e.
- // - for dungeon in mode 10-heroic,
- // - for raid in mode 10-Heroic
- // - for raid in mode 25-heroic
- // DO NOT USE to check raid in mode 25-normal.
- public bool IsHeroic() { return _isHeroic; }
+ public bool IsNormal()
+ {
+ return me.GetMap().IsNormal();
+ }
+
+ public bool IsHeroic()
+ {
+ return me.GetMap().IsHeroic();
+ }
+
+ public bool IsMythic()
+ {
+ return me.GetMap().IsMythic();
+ }
+
+ public bool IsMythicPlus()
+ {
+ return me.GetMap().IsMythicPlus();
+ }
+
+ public bool IsHeroicOrHigher()
+ {
+ return me.GetMap().IsHeroicOrHigher();
+ }
+
+ public bool IsTimewalking()
+ {
+ return me.GetMap().IsTimewalking();
+ }
+
+ public bool IsCombatMovementAllowed() { return _isCombatMovementAllowed; }
// return the dungeon or raid difficulty
public Difficulty GetDifficulty() { return _difficulty; }
diff --git a/Source/Game/Maps/Map.cs b/Source/Game/Maps/Map.cs
index 84b6a487b..827756824 100644
--- a/Source/Game/Maps/Map.cs
+++ b/Source/Game/Maps/Map.cs
@@ -3264,20 +3264,62 @@ namespace Game.Maps
return i_mapRecord != null && i_mapRecord.IsRaid();
}
+ public bool IsLFR() => i_spawnMode switch
+ {
+ Difficulty.LFR or Difficulty.LFRNew or Difficulty.LFR15thAnniversary => true,
+ _ => false
+ };
+
+ public bool IsNormal() => i_spawnMode switch
+ {
+ Difficulty.Normal or Difficulty.Raid10N or Difficulty.Raid25N or Difficulty.NormalRaid or Difficulty.NormalIsland or Difficulty.NormalWarfront => true,
+ _ => false
+ };
+
public bool IsHeroic()
{
DifficultyRecord difficulty = CliDB.DifficultyStorage.LookupByKey(i_spawnMode);
+ if (difficulty != null && difficulty.Flags.HasFlag(DifficultyFlags.DisplayHeroic))
+ return true;
+
+ // compatibility purposes of old difficulties
+ return i_spawnMode switch
+ {
+ Difficulty.Raid10HC or Difficulty.Raid25HC or Difficulty.Heroic or Difficulty.Scenario3ManHC => true,
+ _ => false
+ };
+ }
+
+ public bool IsMythic()
+ {
+ var difficulty = CliDB.DifficultyStorage.LookupByKey(i_spawnMode);
if (difficulty != null)
- return difficulty.Flags.HasAnyFlag(DifficultyFlags.Heroic);
+ return difficulty.Flags.HasFlag(DifficultyFlags.DisplayMythic);
+
return false;
}
+ public bool IsMythicPlus()
+ {
+ return IsDungeon() && i_spawnMode == Difficulty.MythicKeystone;
+ }
+
+ public bool IsHeroicOrHigher()
+ {
+ return IsHeroic() || IsMythic() || IsMythicPlus();
+ }
+
public bool Is25ManRaid()
{
// since 25man difficulties are 1 and 3, we can check them like that
return IsRaid() && (i_spawnMode == Difficulty.Raid25N || i_spawnMode == Difficulty.Raid25HC);
}
+ public bool IsTimewalking()
+ {
+ return (IsDungeon() && i_spawnMode == Difficulty.Timewalking) || (IsRaid() && i_spawnMode == Difficulty.TimewalkingRaid);
+ }
+
public bool IsBattleground()
{
return i_mapRecord != null && i_mapRecord.IsBattleground();