diff --git a/Source/Framework/Constants/SmartAIConst.cs b/Source/Framework/Constants/SmartAIConst.cs index 3fbb58574..be7c27610 100644 --- a/Source/Framework/Constants/SmartAIConst.cs +++ b/Source/Framework/Constants/SmartAIConst.cs @@ -391,6 +391,10 @@ namespace Framework.Constants DoAction = 151, CompleteQuest = 152, // QuestId. Regular quests with objectives can't be completed with this action (only quests with QUEST_FLAGS_COMPLETION_EVENT, QUEST_FLAGS_COMPLETION_AREA_TRIGGER or QUEST_FLAGS_TRACKING_EVENT) CreditQuestObjectiveTalkTo = 153, + EnterVehicle = 155, // seat id + BoardPassenger = 156, // seat id + ExitVehicle = 157, + End } diff --git a/Source/Game/AI/SmartScripts/SmartAIManager.cs b/Source/Game/AI/SmartScripts/SmartAIManager.cs index 5fb076d67..42a695b1e 100644 --- a/Source/Game/AI/SmartScripts/SmartAIManager.cs +++ b/Source/Game/AI/SmartScripts/SmartAIManager.cs @@ -821,6 +821,9 @@ namespace Game.AI SmartActions.DoAction => Marshal.SizeOf(typeof(SmartAction.DoAction)), SmartActions.CompleteQuest => Marshal.SizeOf(typeof(SmartAction.Quest)), SmartActions.CreditQuestObjectiveTalkTo => 0, + SmartActions.EnterVehicle => Marshal.SizeOf(typeof(SmartAction.EnterVehicle)), + SmartActions.BoardPassenger => Marshal.SizeOf(typeof(SmartAction.EnterVehicle)), + SmartActions.ExitVehicle => 0, _ => Marshal.SizeOf(typeof(SmartAction.Raw)), }; @@ -2178,6 +2181,7 @@ namespace Game.AI case SmartActions.SpawnSpawngroup: case SmartActions.AddToStoredTargetList: case SmartActions.DoAction: + case SmartActions.ExitVehicle: break; case SmartActions.BecomePersonalCloneForPlayer: { @@ -2220,6 +2224,16 @@ namespace Game.AI } break; } + case SmartActions.EnterVehicle: + case SmartActions.BoardPassenger: + { + if (e.Action.enterVehicle.seatId >= SharedConst.MaxVehicleSeats) + { + Log.outError(LogFilter.Sql, $"SmartAIMgr: {e} uses incorrect seat id (out of range 0 - {SharedConst.MaxVehicleSeats - 1}), skipped."); + return false; + } + break; + } // No longer supported case SmartActions.CallAreaexploredoreventhappens: case SmartActions.CallGroupeventhappens: @@ -3262,6 +3276,9 @@ namespace Game.AI [FieldOffset(4)] public DoAction doAction; + [FieldOffset(4)] + public EnterVehicle enterVehicle; + [FieldOffset(4)] public Raw raw; @@ -3816,6 +3833,10 @@ namespace Game.AI { public uint actionId; } + public struct EnterVehicle + { + public uint seatId; + } public struct Raw { public uint param1; diff --git a/Source/Game/AI/SmartScripts/SmartScript.cs b/Source/Game/AI/SmartScripts/SmartScript.cs index f70e24627..d11bd2bdd 100644 --- a/Source/Game/AI/SmartScripts/SmartScript.cs +++ b/Source/Game/AI/SmartScripts/SmartScript.cs @@ -2664,6 +2664,50 @@ namespace Game.AI } break; } + case SmartActions.EnterVehicle: + { + if (_me == null) + break; + + foreach (WorldObject target in targets) + { + Unit unitTarget = target.ToUnit(); + if (unitTarget != null) + { + _me.EnterVehicle(unitTarget, (sbyte)e.Action.enterVehicle.seatId); + break; + } + } + break; + } + case SmartActions.BoardPassenger: + { + if (_me == null) + break; + + foreach (WorldObject target in targets) + { + Unit unitTarget = target.ToUnit(); + if (unitTarget != null) + { + unitTarget.EnterVehicle(_me, (sbyte)e.Action.enterVehicle.seatId); + break; + } + } + break; + } + case SmartActions.ExitVehicle: + { + foreach (WorldObject target in targets) + { + Unit unitTarget = target.ToUnit(); + if (unitTarget != null) + { + unitTarget.ExitVehicle(); + } + } + break; + } default: Log.outError(LogFilter.Sql, "SmartScript.ProcessAction: Entry {0} SourceType {1}, Event {2}, Unhandled Action type {3}", e.EntryOrGuid, e.GetScriptType(), e.EventId, e.GetActionType()); break;