aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBandyscTC <b.andysc+tc@gmail.com>2025-07-24 09:25:13 +0100
committerGitHub <noreply@github.com>2025-07-24 10:25:13 +0200
commit9477209f10bd33611251f38633f28dc5f16103f5 (patch)
tree34ac112c1345f580b1144f9aa546469f59f75ef4
parent8a00ab156149f34718c198085830978cd8e91cea (diff)
Core/SAI: Add actions ENTER_VEHICLE, BOARD_PASSENGER and EXIT_VEHICLE (#31141)
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp41
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp14
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h10
3 files changed, 64 insertions, 1 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 12243ac4aff..759f566d904 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -2603,6 +2603,47 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
Cell::VisitGridObjects(GetBaseObject(), worker, float(e.action.destroyConversation.range));
break;
}
+ case SMART_ACTION_ENTER_VEHICLE:
+ {
+ if (!me)
+ break;
+
+ for (WorldObject* target : targets)
+ {
+ if (Unit* unitTarget = target->ToUnit())
+ {
+ me->EnterVehicle(unitTarget, (uint8)e.action.enterVehicle.seatId);
+ break;
+ }
+ }
+ break;
+ }
+ case SMART_ACTION_BOARD_PASSENGER:
+ {
+ if (!me)
+ break;
+
+ for (WorldObject* target : targets)
+ {
+ if (Unit* unitTarget = target->ToUnit())
+ {
+ unitTarget->EnterVehicle(me, (uint8)e.action.enterVehicle.seatId);
+ break;
+ }
+ }
+ break;
+ }
+ case SMART_ACTION_EXIT_VEHICLE:
+ {
+ for (WorldObject* target : targets)
+ {
+ if (Unit* unitTarget = target->ToUnit())
+ {
+ unitTarget->ExitVehicle();
+ }
+ }
+ break;
+ }
default:
TC_LOG_ERROR("sql.sql", "SmartScript::ProcessAction: Entry {} SourceType {}, Event {}, Unhandled Action type {}", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType());
break;
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index 471740a625e..3c69ddd193f 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -1030,6 +1030,9 @@ bool SmartAIMgr::CheckUnusedActionParams(SmartScriptHolder const& e)
case SMART_ACTION_COMPLETE_QUEST: return sizeof(SmartAction::quest);
case SMART_ACTION_CREDIT_QUEST_OBJECTIVE_TALK_TO: return NO_PARAMS;
case SMART_ACTION_DESTROY_CONVERSATION: return sizeof(SmartAction::destroyConversation);
+ case SMART_ACTION_ENTER_VEHICLE: return sizeof(SmartAction::enterVehicle);
+ case SMART_ACTION_BOARD_PASSENGER: return sizeof(SmartAction::enterVehicle);
+ case SMART_ACTION_EXIT_VEHICLE: return NO_PARAMS;
default:
TC_LOG_WARN("sql.sql", "SmartAIMgr: Entry {} SourceType {} Event {} Action {} is using an action with no unused params specified in SmartAIMgr::CheckUnusedActionParams(), please report this.",
e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType());
@@ -2427,6 +2430,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_ACTION_DESPAWN_SPAWNGROUP:
case SMART_ACTION_ADD_TO_STORED_TARGET_LIST:
case SMART_ACTION_DO_ACTION:
+ case SMART_ACTION_EXIT_VEHICLE:
break;
case SMART_ACTION_BECOME_PERSONAL_CLONE_FOR_PLAYER:
{
@@ -2479,6 +2483,16 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
TC_SAI_IS_BOOLEAN_VALID(e, e.action.destroyConversation.isPrivate);
break;
}
+ case SMART_ACTION_ENTER_VEHICLE:
+ case SMART_ACTION_BOARD_PASSENGER:
+ {
+ if (e.action.enterVehicle.seatId >= MAX_VEHICLE_SEATS)
+ {
+ TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry {} SourceType {} Event {} Action {} uses incorrect seat id (out of range 0 - {}), skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), MAX_VEHICLE_SEATS - 1);
+ return false;
+ }
+ break;
+ }
// Unused
case SMART_ACTION_CALL_AREAEXPLOREDOREVENTHAPPENS:
case SMART_ACTION_CALL_GROUPEVENTHAPPENS:
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index 577e2b23389..97dabdf1997 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -608,7 +608,10 @@ enum SMART_ACTION
SMART_ACTION_COMPLETE_QUEST = 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)
SMART_ACTION_CREDIT_QUEST_OBJECTIVE_TALK_TO = 153,
SMART_ACTION_DESTROY_CONVERSATION = 154, // conversation_template.id, isPrivate, range
- SMART_ACTION_END = 155
+ SMART_ACTION_ENTER_VEHICLE = 155, // seat id
+ SMART_ACTION_BOARD_PASSENGER = 156, // seat id
+ SMART_ACTION_EXIT_VEHICLE = 157,
+ SMART_ACTION_END = 158
};
enum class SmartActionSummonCreatureFlags
@@ -1245,6 +1248,11 @@ struct SmartAction
struct
{
+ uint32 seatId;
+ } enterVehicle;
+
+ struct
+ {
uint32 id;
SAIBool isPrivate;
uint32 range;