diff --git a/Source/Framework/Constants/ConditionConst.cs b/Source/Framework/Constants/ConditionConst.cs index e2c3a45c2..98d2e3727 100644 --- a/Source/Framework/Constants/ConditionConst.cs +++ b/Source/Framework/Constants/ConditionConst.cs @@ -63,6 +63,7 @@ namespace Framework.Constants 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 PrivateObject = 57, // 0 0 0 true if entity is private object + StringId = 58, Max } diff --git a/Source/Game/Conditions/Condition.cs b/Source/Game/Conditions/Condition.cs index c078f8f3f..e155fd9a4 100644 --- a/Source/Game/Conditions/Condition.cs +++ b/Source/Game/Conditions/Condition.cs @@ -458,6 +458,19 @@ namespace Game.Conditions condMeets = !obj.GetPrivateObjectOwner().IsEmpty(); break; } + case ConditionTypes.StringId: + { + Creature creature = obj.ToCreature(); + if (creature != null) + condMeets = creature.HasStringId(ConditionStringValue1); + else + { + GameObject go = obj.ToGameObject(); + if (go != null) + condMeets = go.HasStringId(ConditionStringValue1); + } + break; + } default: break; } @@ -653,6 +666,7 @@ namespace Game.Conditions public uint ConditionValue1; public uint ConditionValue2; public uint ConditionValue3; + public string ConditionStringValue1; public uint ErrorType; public uint ErrorTextId; public uint ReferenceId; diff --git a/Source/Game/Conditions/ConditionManager.cs b/Source/Game/Conditions/ConditionManager.cs index d13aae2f0..07e30c71b 100644 --- a/Source/Game/Conditions/ConditionManager.cs +++ b/Source/Game/Conditions/ConditionManager.cs @@ -353,10 +353,11 @@ namespace Game cond.ConditionValue1 = result.Read(7); cond.ConditionValue2 = result.Read(8); cond.ConditionValue3 = result.Read(9); - cond.NegativeCondition = result.Read(10) != 0; - cond.ErrorType = result.Read(11); - cond.ErrorTextId = result.Read(12); - cond.ScriptId = Global.ObjectMgr.GetScriptId(result.Read(13)); + cond.ConditionStringValue1 = result.Read(10); + cond.NegativeCondition = result.Read(11); + cond.ErrorType = result.Read(12); + cond.ErrorTextId = result.Read(13); + cond.ScriptId = Global.ObjectMgr.GetScriptId(result.Read(14)); if (iConditionTypeOrReference >= 0) cond.ConditionType = (ConditionTypes)iConditionTypeOrReference; @@ -1764,13 +1765,20 @@ namespace Game LogUselessConditionValue(cond, 2, cond.ConditionValue2); if (cond.ConditionValue3 != 0 && !StaticConditionTypeData[(int)cond.ConditionType].HasConditionValue3) LogUselessConditionValue(cond, 3, cond.ConditionValue3); + if (!cond.ConditionStringValue1.IsEmpty() && !StaticConditionTypeData[(int)cond.ConditionType].HasConditionStringValue1) + LogUselessConditionValue(cond, 1, cond.ConditionStringValue1); return true; } void LogUselessConditionValue(Condition cond, byte index, uint value) { - Log.outError(LogFilter.Sql, "{0} has useless data in ConditionValue{1} ({2})!", cond.ToString(true), index, value); + Log.outError(LogFilter.Sql, $"{cond.ToString(true)} has useless data in ConditionValue{index} ({value})!"); + } + + void LogUselessConditionValue(Condition cond, byte index, string value) + { + Log.outError(LogFilter.Sql, $"{cond.ToString(true)} has useless data in ConditionStringValue{index} ({value})!"); } void Clean() @@ -2943,63 +2951,64 @@ namespace Game public ConditionTypeInfo[] StaticConditionTypeData = { - new ConditionTypeInfo("None", false,false, false), - new ConditionTypeInfo("Aura", true, true, true ), - new ConditionTypeInfo("Item Stored", true, true, true ), - new ConditionTypeInfo("Item Equipped", true, false, false), - new ConditionTypeInfo("Zone", true, false, false), - new ConditionTypeInfo("Reputation", true, true, false), - new ConditionTypeInfo("Team", true, false, false), - new ConditionTypeInfo("Skill", true, true, false), - new ConditionTypeInfo("Quest Rewarded", true, false, false), - new ConditionTypeInfo("Quest Taken", true, false, false), - new ConditionTypeInfo("Drunken", true, false, false), - new ConditionTypeInfo("WorldState", true, true, false), - new ConditionTypeInfo("Active Event", true, false, false), - new ConditionTypeInfo("Instance Info", true, true, true ), - new ConditionTypeInfo("Quest None", true, false, false), - new ConditionTypeInfo("Class", true, false, false), - new ConditionTypeInfo("Race", true, false, false), - new ConditionTypeInfo("Achievement", true, false, false), - new ConditionTypeInfo("Title", true, false, false), - new ConditionTypeInfo("SpawnMask", true, false, false), - new ConditionTypeInfo("Gender", true, false, false), - new ConditionTypeInfo("Unit State", true, false, false), - new ConditionTypeInfo("Map", true, false, false), - new ConditionTypeInfo("Area", true, false, false), - new ConditionTypeInfo("CreatureType", true, false, false), - new ConditionTypeInfo("Spell Known", true, false, false), - new ConditionTypeInfo("Phase", true, false, false), - new ConditionTypeInfo("Level", true, true, false), - new ConditionTypeInfo("Quest Completed", true, false, false), - new ConditionTypeInfo("Near Creature", true, true, true), - new ConditionTypeInfo("Near GameObject", true, true, false), - new ConditionTypeInfo("Object Entry or Guid", true, true, true ), - new ConditionTypeInfo("Object TypeMask", true, false, false), - new ConditionTypeInfo("Relation", true, true, false), - new ConditionTypeInfo("Reaction", true, true, false), - new ConditionTypeInfo("Distance", true, true, true ), - new ConditionTypeInfo("Alive", false,false, false), - new ConditionTypeInfo("Health Value", true, true, false), - new ConditionTypeInfo("Health Pct", true, true, false), - new ConditionTypeInfo("Realm Achievement", true, false, false), - new ConditionTypeInfo("In Water", false,false, false), - new ConditionTypeInfo("Terrain Swap", true, false, false), - new ConditionTypeInfo("Sit/stand state", true, true, false), - new ConditionTypeInfo("Daily Quest Completed",true, false, false), - new ConditionTypeInfo("Charmed", false,false, false), - new ConditionTypeInfo("Pet type", true, false, false), - new ConditionTypeInfo("On Taxi", false,false, false), - new ConditionTypeInfo("Quest state mask", true, true, false), - new ConditionTypeInfo("Quest objective progress", true, false, true), - new ConditionTypeInfo("Map Difficulty", true, false, false), - new ConditionTypeInfo("Is Gamemaster", true, false, false), - 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("Player Condition", true, false, false) + new ConditionTypeInfo("None", false, false, false, false), + new ConditionTypeInfo("Aura", true, true, true, false), + new ConditionTypeInfo("Item Stored", true, true, true, false), + new ConditionTypeInfo("Item Equipped", true, false, false, false), + new ConditionTypeInfo("Zone", true, false, false, false), + new ConditionTypeInfo("Reputation", true, true, false, false), + new ConditionTypeInfo("Team", true, false, false, false), + new ConditionTypeInfo("Skill", true, true, false, false), + new ConditionTypeInfo("Quest Rewarded", true, false, false, false), + new ConditionTypeInfo("Quest Taken", true, false, false, false), + new ConditionTypeInfo("Drunken", true, false, false, false), + new ConditionTypeInfo("WorldState", true, true, false, false), + new ConditionTypeInfo("Active Event", true, false, false, false), + new ConditionTypeInfo("Instance Info", true, true, true, false), + new ConditionTypeInfo("Quest None", true, false, false, false), + new ConditionTypeInfo("Class", true, false, false, false), + new ConditionTypeInfo("Race", true, false, false, false), + new ConditionTypeInfo("Achievement", true, false, false, false), + new ConditionTypeInfo("Title", true, false, false, false), + new ConditionTypeInfo("SpawnMask", true, false, false, false), + new ConditionTypeInfo("Gender", true, false, false, false), + new ConditionTypeInfo("Unit State", true, false, false, false), + new ConditionTypeInfo("Map", true, false, false, false), + new ConditionTypeInfo("Area", true, false, false, false), + new ConditionTypeInfo("CreatureType", true, false, false, false), + new ConditionTypeInfo("Spell Known", true, false, false, false), + new ConditionTypeInfo("Phase", true, false, false, false), + new ConditionTypeInfo("Level", true, true, false, false), + new ConditionTypeInfo("Quest Completed", true, false, false, false), + new ConditionTypeInfo("Near Creature", true, true, true, false), + new ConditionTypeInfo("Near GameObject", true, true, false, false), + new ConditionTypeInfo("Object Entry or Guid", true, true, true, false), + new ConditionTypeInfo("Object TypeMask", true, false, false, false), + new ConditionTypeInfo("Relation", true, true, false, false), + new ConditionTypeInfo("Reaction", true, true, false, false), + new ConditionTypeInfo("Distance", true, true, true, false), + new ConditionTypeInfo("Alive", false, false, false, false), + new ConditionTypeInfo("Health Value", true, true, false, false), + new ConditionTypeInfo("Health Pct", true, true, false, false), + new ConditionTypeInfo("Realm Achievement", true, false, false, false), + new ConditionTypeInfo("In Water", false, false, false, false), + new ConditionTypeInfo("Terrain Swap", true, false, false, false), + new ConditionTypeInfo("Sit/stand state", true, true, false, false), + new ConditionTypeInfo("Daily Quest Completed",true, false, false, false), + new ConditionTypeInfo("Charmed", false, false, false, false), + new ConditionTypeInfo("Pet type", true, false, false, false), + new ConditionTypeInfo("On Taxi", false, false, false, false), + new ConditionTypeInfo("Quest state mask", true, true, false, false), + new ConditionTypeInfo("Quest objective progress", true, false, true, false), + new ConditionTypeInfo("Map Difficulty", true, false, false, false), + new ConditionTypeInfo("Is Gamemaster", true, false, false, false), + new ConditionTypeInfo("Object Entry or Guid", true, true, true, false), + new ConditionTypeInfo("Object TypeMask", true, false, false, false), + new ConditionTypeInfo("BattlePet Species Learned", true, true, true, false), + new ConditionTypeInfo("On Scenario Step", true, false, false, false), + new ConditionTypeInfo("Scene In Progress", true, false, false, false), + new ConditionTypeInfo("Player Condition", true, false, false, false), + new ConditionTypeInfo("String ID", true, false, false, true) }; public struct ConditionTypeInfo @@ -3016,6 +3025,7 @@ namespace Game public bool HasConditionValue1; public bool HasConditionValue2; public bool HasConditionValue3; + public bool HasConditionStringValue1; } }