diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 44ea7207e..5f6833ba0 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -46,6 +46,7 @@ SmartAI::SmartAI(Creature* c) : CreatureAI(c) // spawn in run mode // Xinef: spawn in run mode and set mRun to run... this overrides SetWalk EVERYWHERE mRun = true; + mEvadeDisabled = false; mCanAutoAttack = true; mCanCombatMove = true; @@ -623,6 +624,12 @@ void SmartAI::EnterEvadeMode() if (!me->IsAlive() || me->IsInEvadeMode()) return; + if (mEvadeDisabled) + { + GetScript()->ProcessEventsFor(SMART_EVENT_EVADE); + return; + } + if (me->GetCharmerGUID().IsPlayer() || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_POSSESSED)) { me->AttackStop(); @@ -935,6 +942,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 85dca08a5..ea2d8fbe6 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.h +++ b/src/server/game/AI/SmartScripts/SmartAI.h @@ -173,6 +173,8 @@ public: void SetSwim(bool swim = true); + void SetEvadeDisabled(bool disable = true); + void SetInvincibilityHpLevel(uint32 level) { mInvincibilityHpLevel = level; } void sGossipHello(Player* player) override; @@ -223,6 +225,7 @@ private: uint32 GetWPCount() { return mWayPoints ? 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 7a2ce1bf4..f04a9690a 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -3267,6 +3267,14 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u } break; } + case SMART_ACTION_DISABLE_EVADE: + { + if (!IsSmart()) + break; + + CAST_AI(SmartAI, me->AI())->SetEvadeDisabled(e.action.disableEvade.disable != 0); + break; + } default: 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.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 91428c2d6..c672ceb39 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -585,7 +585,7 @@ enum SMART_ACTION SMART_ACTION_RISE_UP = 114, // distance SMART_ACTION_RANDOM_SOUND = 115, // SoundId1, SoundId2, SoundId3, SoundId4, onlySelf SMART_ACTION_SET_CORPSE_DELAY = 116, // TODO: NOT SUPPORTED YET - SMART_ACTION_DISABLE_EVADE = 117, // TODO: NOT SUPPORTED YET + SMART_ACTION_DISABLE_EVADE = 117, // 0/1 (1 = disabled, 0 = enabled) SMART_ACTION_GO_SET_GO_STATE = 118, // TODO: NOT SUPPORTED YET SMART_ACTION_SET_CAN_FLY = 119, // TODO: NOT SUPPORTED YET SMART_ACTION_REMOVE_AURAS_BY_TYPE = 120, // TODO: NOT SUPPORTED YET @@ -1274,6 +1274,11 @@ struct SmartAction uint32 isNegative; uint32 instanceTarget; } doAction; + + struct + { + uint32 disable; + } disableEvade; //! Note for any new future actions //! All parameters must have type uint32