From 4b86a00d6e79694b901a315514eae800b361a156 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Mon, 23 Jan 2023 00:13:16 -0500 Subject: [PATCH] Core/SAI: Added missing target guid validations Port From (https://github.com/TrinityCore/TrinityCore/commit/fc65154fd31f91cd73260ac61cb1d0c510b256a2) --- Source/Game/AI/SmartScripts/SmartAIManager.cs | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/Source/Game/AI/SmartScripts/SmartAIManager.cs b/Source/Game/AI/SmartScripts/SmartAIManager.cs index c6f550b59..fa3a4d656 100644 --- a/Source/Game/AI/SmartScripts/SmartAIManager.cs +++ b/Source/Game/AI/SmartScripts/SmartAIManager.cs @@ -457,12 +457,38 @@ namespace Game.AI { if (e.Target.unitGUID.entry != 0 && !IsCreatureValid(e, e.Target.unitGUID.entry)) return false; + + ulong guid = e.Target.unitGUID.dbGuid; + CreatureData data = Global.ObjectMgr.GetCreatureData(guid); + if (data == null) + { + Log.outError(LogFilter.Sql, $"SmartAIMgr: {e} using invalid creature guid {guid} as target_param1, skipped."); + return false; + } + else if (e.Target.unitGUID.entry != 0 && e.Target.unitGUID.entry != data.Id) + { + Log.outError(LogFilter.Sql, $"SmartAIMgr: {e} using invalid creature entry {e.Target.unitGUID.entry} (expected {data.Id}) for guid {guid} as target_param1, skipped."); + return false; + } break; } case SmartTargets.GameobjectGuid: { if (e.Target.goGUID.entry != 0 && !IsGameObjectValid(e, e.Target.goGUID.entry)) return false; + + ulong guid = e.Target.goGUID.dbGuid; + GameObjectData data = Global.ObjectMgr.GetGameObjectData(guid); + if (data == null) + { + Log.outError(LogFilter.Sql, $"SmartAIMgr: {e} using invalid gameobject guid {guid} as target_param1, skipped."); + return false; + } + else if (e.Target.goGUID.entry != 0 && e.Target.goGUID.entry != data.Id) + { + Log.outError(LogFilter.Sql, $"SmartAIMgr: {e} using invalid gameobject entry {e.Target.goGUID.entry} (expected {data.Id}) for guid {guid} as target_param1, skipped."); + return false; + } break; } case SmartTargets.PlayerDistance: @@ -1449,6 +1475,32 @@ namespace Game.AI { if (!IsSpellValid(e, e.Action.crossCast.spell)) return false; + + SmartTargets targetType = (SmartTargets)e.Action.crossCast.targetType; + if (targetType == SmartTargets.CreatureGuid || targetType == SmartTargets.GameobjectGuid) + { + if (e.Action.crossCast.targetParam2 != 0) + { + if (targetType == SmartTargets.CreatureGuid && !IsCreatureValid(e, e.Action.crossCast.targetParam2)) + return false; + else if (targetType == SmartTargets.GameobjectGuid && !IsGameObjectValid(e, e.Action.crossCast.targetParam2)) + return false; + } + + ulong guid = e.Action.crossCast.targetParam1; + SpawnObjectType spawnType = targetType == SmartTargets.CreatureGuid ? SpawnObjectType.Creature : SpawnObjectType.GameObject; + var data = Global.ObjectMgr.GetSpawnData(spawnType, guid); + if (data == null) + { + Log.outError(LogFilter.Sql, $"SmartAIMgr: {e} specifies invalid CasterTargetType guid ({spawnType},{guid})"); + return false; + } + else if (e.Action.crossCast.targetParam2 != 0 && e.Action.crossCast.targetParam2 != data.Id) + { + Log.outError(LogFilter.Sql, $"SmartAIMgr: {e} specifies invalid entry {e.Action.crossCast.targetParam2} (expected {data.Id}) for CasterTargetType guid ({spawnType},{guid})"); + return false; + } + } break; } case SmartActions.InvokerCast: