aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/AI/SmartScripts
diff options
context:
space:
mode:
authorGiacomo Pozzoni <giacomopoz@gmail.com>2021-11-07 19:17:12 +0100
committerGitHub <noreply@github.com>2021-11-07 20:17:12 +0200
commit0817be8f76dead48e2c0eeb7d5a7434a452f0dcf (patch)
tree0a49a89d1928ae1ec6023bf208017fc4a10826fe /src/server/game/AI/SmartScripts
parent8f4bf97b44ace657a288a3bc99afb56e0151d76a (diff)
Core/SAI: Add SMART_ACTION_ACTIVATE_GAMEOBJECT action (#27216)
Closes #27196
Diffstat (limited to 'src/server/game/AI/SmartScripts')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp11
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp14
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h8
3 files changed, 32 insertions, 1 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 7eae8e1d039..b24f7b76773 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -2381,6 +2381,17 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
}
break;
}
+ case SMART_ACTION_ACTIVATE_GAMEOBJECT:
+ {
+ for (WorldObject* target : targets)
+ {
+ if (GameObject* targetGo = target->ToGameObject())
+ {
+ targetGo->ActivateObject(GameObjectActions(e.action.activateGameObject.gameObjectAction));
+ }
+ }
+ break;
+ }
default:
TC_LOG_ERROR("sql.sql", "SmartScript::ProcessAction: Entry %d SourceType %u, Event %u, Unhandled Action type %u", 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 6f8299c22da..578b1f958fe 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -943,6 +943,7 @@ bool SmartAIMgr::CheckUnusedActionParams(SmartScriptHolder const& e)
case SMART_ACTION_SET_IMMUNE_PC: return sizeof(SmartAction::setImmunePC);
case SMART_ACTION_SET_IMMUNE_NPC: return sizeof(SmartAction::setImmuneNPC);
case SMART_ACTION_SET_UNINTERACTIBLE: return sizeof(SmartAction::setUninteractible);
+ case SMART_ACTION_ACTIVATE_GAMEOBJECT: return sizeof(SmartAction::activateGameObject);
default:
TC_LOG_WARN("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u is using an action with no unused params specified in SmartAIMgr::CheckUnusedActionParams(), please report this.",
e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType());
@@ -2123,6 +2124,19 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
TC_SAI_IS_BOOLEAN_VALID(e, e.action.setUninteractible.uninteractible);
break;
}
+ case SMART_ACTION_ACTIVATE_GAMEOBJECT:
+ {
+ if (!NotNULL(e, e.action.activateGameObject.gameObjectAction))
+ return false;
+
+ if (e.action.activateGameObject.gameObjectAction >= uint32(GameObjectActions::Max))
+ {
+ TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u has gameObjectAction parameter out of range (max allowed %u, current value %u), skipped.",
+ e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), uint32(GameObjectActions::Max), e.action.activateGameObject.gameObjectAction);
+ return false;
+ }
+ break;
+ }
case SMART_ACTION_FOLLOW:
case SMART_ACTION_SET_ORIENTATION:
case SMART_ACTION_STORE_TARGET_LIST:
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index d422377b628..7d3600f51a4 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -589,8 +589,9 @@ enum SMART_ACTION
SMART_ACTION_SET_IMMUNE_PC = 144, // 0/1
SMART_ACTION_SET_IMMUNE_NPC = 145, // 0/1
SMART_ACTION_SET_UNINTERACTIBLE = 146, // 0/1
+ SMART_ACTION_ACTIVATE_GAMEOBJECT = 147, // GameObjectActions
- SMART_ACTION_END = 147
+ SMART_ACTION_END = 148
};
enum class SmartActionSummonCreatureFlags
@@ -1197,6 +1198,11 @@ struct SmartAction
SAIBool uninteractible;
} setUninteractible;
+ struct
+ {
+ uint32 gameObjectAction;
+ } activateGameObject;
+
//! Note for any new future actions
//! All parameters must have type uint32