aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp32
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp10
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h19
3 files changed, 60 insertions, 1 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 4cf1360c938..a36d05709c1 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -2433,6 +2433,38 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
ENSURE_AI(SmartAI, me->AI())->SetEvadeDisabled(e.action.disableEvade.disable != 0);
break;
}
+ case SMART_ACTION_PLAY_ANIMKIT:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ break;
+
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
+ {
+ if (IsCreature(*itr))
+ {
+ if (e.action.animKit.type == 0)
+ (*itr)->ToCreature()->PlayOneShotAnimKitId(e.action.animKit.animKit);
+ else if (e.action.animKit.type == 1)
+ (*itr)->ToCreature()->SetAIAnimKitId(e.action.animKit.animKit);
+ else if (e.action.animKit.type == 2)
+ (*itr)->ToCreature()->SetMeleeAnimKitId(e.action.animKit.animKit);
+ else if (e.action.animKit.type == 3)
+ (*itr)->ToCreature()->SetMovementAnimKitId(e.action.animKit.animKit);
+ else
+ {
+ TC_LOG_ERROR("sql.sql", "SmartScript: Invalid type for SMART_ACTION_PLAY_ANIMKIT, skipping");
+ break;
+ }
+
+ TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_PLAY_ANIMKIT: target: %s (%s), AnimKit: %u, Type: %u",
+ (*itr)->GetName().c_str(), (*itr)->GetGUID().ToString().c_str(), e.action.animKit.animKit, e.action.animKit.type);
+ }
+ }
+
+ delete targets;
+ break;
+ }
default:
TC_LOG_ERROR("sql.sql", "SmartScript::ProcessAction: Entry " SI64FMTD " 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 81b4a909e17..c99d1131dbf 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -809,6 +809,16 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
if (!IsEmoteValid(e, e.action.emote.emote))
return false;
break;
+ case SMART_ACTION_PLAY_ANIMKIT:
+ if (!IsAnimKitValid(e, e.action.animKit.animKit))
+ return false;
+
+ if (e.action.animKit.type > 3)
+ {
+ TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry " SI64FMTD " SourceType %u Event %u Action %u uses invalid AnimKit type %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.animKit.type);
+ return false;
+ }
+ break;
case SMART_ACTION_FAIL_QUEST:
case SMART_ACTION_OFFER_QUEST:
if (!e.action.quest.quest || !IsQuestValid(e, e.action.quest.quest))
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index e8c623bf113..d9c679e73e1 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -558,8 +558,9 @@ enum SMART_ACTION
SMART_ACTION_RANDOM_SOUND = 115, // soundId1, soundId2, soundId3, soundId4, soundId5, onlySelf
SMART_ACTION_SET_CORPSE_DELAY = 116, // timer
SMART_ACTION_DISABLE_EVADE = 117, // 0/1 (1 = disabled, 0 = enabled)
+ SMART_ACTION_PLAY_ANIMKIT = 128, // id, type (0 = oneShot, 1 = aiAnim, 2 = meleeAnim, 3 = movementAnim)
- SMART_ACTION_END = 118
+ SMART_ACTION_END = 129
};
struct SmartAction
@@ -1074,6 +1075,12 @@ struct SmartAction
uint32 disable;
} disableEvade;
+ struct
+ {
+ uint32 animKit;
+ uint32 type;
+ } animKit;
+
//! Note for any new future actions
//! All parameters must have type uint32
@@ -1683,6 +1690,16 @@ class TC_GAME_API SmartAIMgr
return true;
}
+ bool IsAnimKitValid(SmartScriptHolder const& e, uint32 entry)
+ {
+ if (!sAnimKitStore.LookupEntry(entry))
+ {
+ TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry " SI64FMTD " SourceType %u Event %u Action %u uses non-existent AnimKit entry %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), entry);
+ return false;
+ }
+ return true;
+ }
+
bool IsTextValid(SmartScriptHolder const& e, uint32 id);
// Helpers