diff options
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartAI.cpp | 12 | ||||
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartAI.h | 3 | ||||
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 8 | ||||
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 1 | ||||
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 8 |
5 files changed, 31 insertions, 1 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index e2ed859890c..b372593a90c 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -42,6 +42,7 @@ SmartAI::SmartAI(Creature* c) : CreatureAI(c) // spawn in run mode me->SetWalk(false); mRun = false; + mEvadeDisabled = false; mLastOOCPos = me->GetPosition(); @@ -415,6 +416,12 @@ void SmartAI::EnterEvadeMode(EvadeReason /*why*/) if (!me->IsAlive() || me->IsInEvadeMode()) return; + if (mEvadeDisabled) + { + GetScript()->ProcessEventsFor(SMART_EVENT_EVADE); + return; + } + me->RemoveAurasOnEvade(); me->AddUnitState(UNIT_STATE_EVADE); @@ -693,6 +700,11 @@ void SmartAI::SetSwim(bool swim) me->SetSwim(swim); } +void SmartAI::SetEvadeDisabled(bool disable) +{ + mEvadeDisabled = disable; +} + void SmartAI::sGossipHello(Player* player) { GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_HELLO, player); diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h index 9abc6826f12..792ba587950 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.h +++ b/src/server/game/AI/SmartScripts/SmartAI.h @@ -172,6 +172,8 @@ class TC_GAME_API SmartAI : public CreatureAI void SetSwim(bool swim = true); + void SetEvadeDisabled(bool disable = true); + void SetInvincibilityHpLevel(uint32 level) { mInvincibilityHpLevel = level; } void sGossipHello(Player* player) override; @@ -217,6 +219,7 @@ class TC_GAME_API SmartAI : public CreatureAI uint32 GetWPCount() const { return mWayPoints ? uint32(mWayPoints->size()) : 0; } bool mCanRepeatPath; bool mRun; + bool mEvadeDisabled; bool mCanAutoAttack; bool mCanCombatMove; bool mForcedPaused; diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index ebfac226efb..1900c303849 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -2388,6 +2388,14 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u delete targets; break; } + case SMART_ACTION_DISABLE_EVADE: + { + if (!IsSmart()) + break; + + ENSURE_AI(SmartAI, me->AI())->SetEvadeDisabled(e.action.disableEvade.disable != 0); + 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 6553a2d99a4..429f4b78531 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -1280,6 +1280,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_ACTION_SUMMON_CREATURE_GROUP: case SMART_ACTION_MOVE_OFFSET: case SMART_ACTION_SET_CORPSE_DELAY: + case SMART_ACTION_DISABLE_EVADE: break; default: TC_LOG_ERROR("sql.sql", "SmartAIMgr: Not handled action_type(%u), event_type(%u), Entry " SI64FMTD " SourceType %u Event %u, skipped.", e.GetActionType(), e.GetEventType(), e.entryOrGuid, e.GetScriptType(), e.event_id); diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index b45be8a9fbc..84dc6b5c27c 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -552,8 +552,9 @@ enum SMART_ACTION SMART_ACTION_MOVE_OFFSET = 114, 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_END = 117 + SMART_ACTION_END = 118 }; struct SmartAction @@ -1049,6 +1050,11 @@ struct SmartAction uint32 timer; } corpseDelay; + struct + { + uint32 disable; + } disableEvade; + //! Note for any new future actions //! All parameters must have type uint32 |
