diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 32 | ||||
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 10 | ||||
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 19 |
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 |
