diff --git a/Source/Game/AI/SmartScripts/SmartAIManager.cs b/Source/Game/AI/SmartScripts/SmartAIManager.cs index ac649e71f..0fea3bae4 100644 --- a/Source/Game/AI/SmartScripts/SmartAIManager.cs +++ b/Source/Game/AI/SmartScripts/SmartAIManager.cs @@ -824,9 +824,9 @@ namespace Game.AI SmartActions.SetHover => Marshal.SizeOf(typeof(SmartAction.SetHover)), SmartActions.SetHealthPct => Marshal.SizeOf(typeof(SmartAction.SetHealthPct)), SmartActions.CreateConversation => Marshal.SizeOf(typeof(SmartAction.Conversation)), - //SmartActions.SetImmunePc => Marshal.SizeOf(typeof(SmartAction.Raw)), - //SmartActions.SetImmuneNpc => Marshal.SizeOf(typeof(SmartAction.Raw)), - //SmartActions.SetUninteractible => Marshal.SizeOf(typeof(SmartAction.Raw)), + SmartActions.SetImmunePC => Marshal.SizeOf(typeof(SmartAction.SetImmunePC)), + SmartActions.SetImmuneNPC => Marshal.SizeOf(typeof(SmartAction.SetImmuneNPC)), + SmartActions.SetUninteractible => Marshal.SizeOf(typeof(SmartAction.SetUninteractible)), //SmartActions.ActivateGameobject => Marshal.SizeOf(typeof(SmartAction.Raw)), SmartActions.AddToStoredTargetList => Marshal.SizeOf(typeof(SmartAction.AddToStoredTargets)), SmartActions.BecomePersonalCloneForPlayer => Marshal.SizeOf(typeof(SmartAction.BecomePersonalClone)), @@ -1370,6 +1370,7 @@ namespace Game.AI case SmartEvents.FriendlyHealth: case SmartEvents.TargetHealthPct: case SmartEvents.IsBehindTarget: + case SmartEvents.TargetManaPct: Log.outWarn(LogFilter.Sql, $"SmartAIMgr: Deprecated event_type({e.GetEventType()}), {e}, it might be removed in the future, loaded for now."); break; default: @@ -2082,6 +2083,21 @@ namespace Game.AI TC_SAI_IS_BOOLEAN_VALID(e, e.Action.setHealthRegen.regenHealth); break; } + case SmartActions.SetImmunePC: + { + TC_SAI_IS_BOOLEAN_VALID(e, e.Action.setImmunePC.immunePC); + break; + } + case SmartActions.SetImmuneNPC: + { + TC_SAI_IS_BOOLEAN_VALID(e, e.Action.setImmuneNPC.immuneNPC); + break; + } + case SmartActions.SetUninteractible: + { + TC_SAI_IS_BOOLEAN_VALID(e, e.Action.setUninteractible.uninteractible); + break; + } case SmartActions.CreateConversation: { if (Global.ConversationDataStorage.GetConversationTemplate(e.Action.conversation.id) == null) @@ -2171,6 +2187,21 @@ namespace Game.AI return false; } + // Additional check for deprecated + switch (e.GetActionType()) + { + // Deprecated + case SmartActions.SetUnitFlag: + case SmartActions.RemoveUnitFlag: + case SmartActions.AddItem: + case SmartActions.AddDynamicFlag: + case SmartActions.RemoveDynamicFlag: + Log.outWarn(LogFilter.Sql, $"SmartAIMgr: Deprecated action_type: {e}, it might be removed in the future, loaded for now."); + break; + default: + break; + } + if (!CheckUnusedActionParams(e)) return false; @@ -3204,6 +3235,15 @@ namespace Game.AI [FieldOffset(4)] public SetHealthPct setHealthPct; + [FieldOffset(4)] + public SetImmunePC setImmunePC; + + [FieldOffset(4)] + public SetImmuneNPC setImmuneNPC; + + [FieldOffset(4)] + public SetUninteractible setUninteractible; + [FieldOffset(4)] public Conversation conversation; @@ -3748,6 +3788,18 @@ namespace Game.AI { public uint percent; } + public struct SetImmunePC + { + public uint immunePC; + } + public struct SetImmuneNPC + { + public uint immuneNPC; + } + public struct SetUninteractible + { + public uint uninteractible; + } public struct Conversation { public uint id; diff --git a/Source/Game/AI/SmartScripts/SmartScript.cs b/Source/Game/AI/SmartScripts/SmartScript.cs index 9a60ab8e2..f2aba031f 100644 --- a/Source/Game/AI/SmartScripts/SmartScript.cs +++ b/Source/Game/AI/SmartScripts/SmartScript.cs @@ -2458,6 +2458,48 @@ namespace Game.AI break; } + case SmartActions.SetImmunePC: + { + foreach (var target in targets) + { + if (IsUnit(target)) + { + if (e.Action.setImmunePC.immunePC != 0) + target.ToUnit().AddUnitFlag(UnitFlags.ImmuneToPc); + else + target.ToUnit().RemoveUnitFlag(UnitFlags.ImmuneToPc); + } + } + break; + } + case SmartActions.SetImmuneNPC: + { + foreach (var target in targets) + { + if (IsUnit(target)) + { + if (e.Action.setImmuneNPC.immuneNPC != 0) + target.ToUnit().AddUnitFlag(UnitFlags.ImmuneToNpc); + else + target.ToUnit().RemoveUnitFlag(UnitFlags.ImmuneToNpc); + } + } + break; + } + case SmartActions.SetUninteractible: + { + foreach (var target in targets) + { + if (IsUnit(target)) + { + if (e.Action.setUninteractible.uninteractible != 0) + target.ToUnit().AddUnitFlag(UnitFlags.Uninteractible); + else + target.ToUnit().RemoveUnitFlag(UnitFlags.Uninteractible); + } + } + break; + } case SmartActions.CreateConversation: { WorldObject baseObject = GetBaseObject();