diff --git a/Source/Framework/Constants/ConditionConst.cs b/Source/Framework/Constants/ConditionConst.cs index cf9f434f1..bf9475dec 100644 --- a/Source/Framework/Constants/ConditionConst.cs +++ b/Source/Framework/Constants/ConditionConst.cs @@ -75,6 +75,7 @@ namespace Framework.Constants BattlePetCount = 53, // SpecieId count ComparisonType true if player has `count` of battle pet species ScenarioStep = 54, // ScenarioStepId 0 0 true if player is at scenario with current step equal to ScenarioStepID SceneInProgress = 55, // SceneScriptPackageId 0 0 true if player is playing a scene with ScriptPackageId equal to given value + PlayerCondition = 56, // PlayerConditionId 0 0 true if player satisfies PlayerCondition Max } diff --git a/Source/Game/Conditions/Condition.cs b/Source/Game/Conditions/Condition.cs index b0a9ce8e5..270268174 100644 --- a/Source/Game/Conditions/Condition.cs +++ b/Source/Game/Conditions/Condition.cs @@ -438,6 +438,16 @@ namespace Game.Conditions condMeets = player.GetSceneMgr().GetActiveSceneCount(ConditionValue1) > 0; break; } + case ConditionTypes.PlayerCondition: + { + if (player != null) + { + PlayerConditionRecord playerCondition = CliDB.PlayerConditionStorage.LookupByKey(ConditionValue1); + if (playerCondition != null) + condMeets = ConditionManager.IsPlayerMeetingCondition(player, playerCondition); + } + break; + } default: break; } @@ -556,6 +566,9 @@ namespace Game.Conditions case ConditionTypes.SceneInProgress: mask |= GridMapTypeMask.Player; break; + case ConditionTypes.PlayerCondition: + mask |= GridMapTypeMask.Player; + break; default: Cypher.Assert(false, "Condition.GetSearcherTypeMaskForCondition - missing condition handling!"); break; diff --git a/Source/Game/Conditions/ConditionManager.cs b/Source/Game/Conditions/ConditionManager.cs index 591cd6be2..bc36d3f3e 100644 --- a/Source/Game/Conditions/ConditionManager.cs +++ b/Source/Game/Conditions/ConditionManager.cs @@ -1823,6 +1823,15 @@ namespace Game } break; } + case ConditionTypes.PlayerCondition: + { + if (!CliDB.PlayerConditionStorage.ContainsKey(cond.ConditionValue1)) + { + Log.outError(LogFilter.Sql, $"{cond.ToString(true)} has non existing PlayerConditionId in value1 ({cond.ConditionValue1}), skipped."); + return false; + } + break; + } default: Log.outError(LogFilter.Sql, $"{cond.ToString()} Invalid ConditionType in `condition` table, ignoring."); return false; @@ -3055,8 +3064,9 @@ namespace Game new ConditionTypeInfo("Object Entry or Guid", true, true, true), new ConditionTypeInfo("Object TypeMask", true, false, false), new ConditionTypeInfo("BattlePet Species Learned", true, true, true), - new ConditionTypeInfo("On Scenario Step", true, false, false), - new ConditionTypeInfo("Scene In Progress", true, false, false) + new ConditionTypeInfo("On Scenario Step", true, false, false), + new ConditionTypeInfo("Scene In Progress", true, false, false), + new ConditionTypeInfo("Player Condition", true, false, false) }; public struct ConditionTypeInfo